@@ -26,14 +26,15 @@ static long clk_factor_round_rate(struct clk_hw *hw, unsigned long drate,
2626{
2727 struct mmp_clk_factor * factor = to_clk_factor (hw );
2828 u64 rate = 0 , prev_rate ;
29+ struct u32_fract * d ;
2930 int i ;
3031
3132 for (i = 0 ; i < factor -> ftbl_cnt ; i ++ ) {
32- prev_rate = rate ;
33- rate = * prate ;
34- rate *= factor -> ftbl [i ].den ;
35- do_div (rate , factor -> ftbl [i ].num * factor -> masks -> factor );
33+ d = & factor -> ftbl [i ];
3634
35+ prev_rate = rate ;
36+ rate = (u64 )(* prate ) * d -> denominator ;
37+ do_div (rate , d -> numerator * factor -> masks -> factor );
3738 if (rate > drate )
3839 break ;
3940 }
@@ -52,23 +53,22 @@ static unsigned long clk_factor_recalc_rate(struct clk_hw *hw,
5253{
5354 struct mmp_clk_factor * factor = to_clk_factor (hw );
5455 struct mmp_clk_factor_masks * masks = factor -> masks ;
55- unsigned int val , num , den ;
56+ struct u32_fract d ;
57+ unsigned int val ;
5658 u64 rate ;
5759
5860 val = readl_relaxed (factor -> base );
5961
6062 /* calculate numerator */
61- num = (val >> masks -> num_shift ) & masks -> num_mask ;
63+ d . numerator = (val >> masks -> num_shift ) & masks -> num_mask ;
6264
6365 /* calculate denominator */
64- den = (val >> masks -> den_shift ) & masks -> den_mask ;
65-
66- if (!den )
66+ d .denominator = (val >> masks -> den_shift ) & masks -> den_mask ;
67+ if (!d .denominator )
6768 return 0 ;
6869
69- rate = parent_rate ;
70- rate *= den ;
71- do_div (rate , num * factor -> masks -> factor );
70+ rate = (u64 )parent_rate * d .denominator ;
71+ do_div (rate , d .numerator * factor -> masks -> factor );
7272
7373 return rate ;
7474}
@@ -82,29 +82,29 @@ static int clk_factor_set_rate(struct clk_hw *hw, unsigned long drate,
8282 int i ;
8383 unsigned long val ;
8484 unsigned long flags = 0 ;
85+ struct u32_fract * d ;
8586 u64 rate = 0 ;
8687
8788 for (i = 0 ; i < factor -> ftbl_cnt ; i ++ ) {
88- rate = prate ;
89- rate *= factor -> ftbl [i ].den ;
90- do_div (rate , factor -> ftbl [i ].num * factor -> masks -> factor );
89+ d = & factor -> ftbl [i ];
9190
91+ rate = (u64 )prate * d -> denominator ;
92+ do_div (rate , d -> numerator * factor -> masks -> factor );
9293 if (rate > drate )
9394 break ;
9495 }
95- if (i > 0 )
96- i -- ;
96+ d = i ? & factor -> ftbl [i - 1 ] : & factor -> ftbl [0 ];
9797
9898 if (factor -> lock )
9999 spin_lock_irqsave (factor -> lock , flags );
100100
101101 val = readl_relaxed (factor -> base );
102102
103103 val &= ~(masks -> num_mask << masks -> num_shift );
104- val |= (factor -> ftbl [ i ]. num & masks -> num_mask ) << masks -> num_shift ;
104+ val |= (d -> numerator & masks -> num_mask ) << masks -> num_shift ;
105105
106106 val &= ~(masks -> den_mask << masks -> den_shift );
107- val |= (factor -> ftbl [ i ]. den & masks -> den_mask ) << masks -> den_shift ;
107+ val |= (d -> denominator & masks -> den_mask ) << masks -> den_shift ;
108108
109109 writel_relaxed (val , factor -> base );
110110
@@ -118,7 +118,8 @@ static int clk_factor_init(struct clk_hw *hw)
118118{
119119 struct mmp_clk_factor * factor = to_clk_factor (hw );
120120 struct mmp_clk_factor_masks * masks = factor -> masks ;
121- u32 val , num , den ;
121+ struct u32_fract d ;
122+ u32 val ;
122123 int i ;
123124 unsigned long flags = 0 ;
124125
@@ -128,23 +129,22 @@ static int clk_factor_init(struct clk_hw *hw)
128129 val = readl (factor -> base );
129130
130131 /* calculate numerator */
131- num = (val >> masks -> num_shift ) & masks -> num_mask ;
132+ d . numerator = (val >> masks -> num_shift ) & masks -> num_mask ;
132133
133134 /* calculate denominator */
134- den = (val >> masks -> den_shift ) & masks -> den_mask ;
135+ d . denominator = (val >> masks -> den_shift ) & masks -> den_mask ;
135136
136137 for (i = 0 ; i < factor -> ftbl_cnt ; i ++ )
137- if (den == factor -> ftbl [i ].den && num == factor -> ftbl [i ].num )
138+ if (d .denominator == factor -> ftbl [i ].denominator &&
139+ d .numerator == factor -> ftbl [i ].numerator )
138140 break ;
139141
140142 if (i >= factor -> ftbl_cnt ) {
141143 val &= ~(masks -> num_mask << masks -> num_shift );
142- val |= (factor -> ftbl [0 ].num & masks -> num_mask ) <<
143- masks -> num_shift ;
144+ val |= (factor -> ftbl [0 ].numerator & masks -> num_mask ) << masks -> num_shift ;
144145
145146 val &= ~(masks -> den_mask << masks -> den_shift );
146- val |= (factor -> ftbl [0 ].den & masks -> den_mask ) <<
147- masks -> den_shift ;
147+ val |= (factor -> ftbl [0 ].denominator & masks -> den_mask ) << masks -> den_shift ;
148148 }
149149
150150 if (!(val & masks -> enable_mask ) || i >= factor -> ftbl_cnt ) {
@@ -168,8 +168,7 @@ static const struct clk_ops clk_factor_ops = {
168168struct clk * mmp_clk_register_factor (const char * name , const char * parent_name ,
169169 unsigned long flags , void __iomem * base ,
170170 struct mmp_clk_factor_masks * masks ,
171- struct mmp_clk_factor_tbl * ftbl ,
172- unsigned int ftbl_cnt , spinlock_t * lock )
171+ struct u32_fract * ftbl , unsigned int ftbl_cnt , spinlock_t * lock )
173172{
174173 struct mmp_clk_factor * factor ;
175174 struct clk_init_data init ;
0 commit comments