@@ -26,14 +26,15 @@ static long clk_factor_round_rate(struct clk_hw *hw, unsigned long drate,
26
26
{
27
27
struct mmp_clk_factor * factor = to_clk_factor (hw );
28
28
u64 rate = 0 , prev_rate ;
29
+ struct u32_fract * d ;
29
30
int i ;
30
31
31
32
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 ];
36
34
35
+ prev_rate = rate ;
36
+ rate = (u64 )(* prate ) * d -> denominator ;
37
+ do_div (rate , d -> numerator * factor -> masks -> factor );
37
38
if (rate > drate )
38
39
break ;
39
40
}
@@ -52,23 +53,22 @@ static unsigned long clk_factor_recalc_rate(struct clk_hw *hw,
52
53
{
53
54
struct mmp_clk_factor * factor = to_clk_factor (hw );
54
55
struct mmp_clk_factor_masks * masks = factor -> masks ;
55
- unsigned int val , num , den ;
56
+ struct u32_fract d ;
57
+ unsigned int val ;
56
58
u64 rate ;
57
59
58
60
val = readl_relaxed (factor -> base );
59
61
60
62
/* calculate numerator */
61
- num = (val >> masks -> num_shift ) & masks -> num_mask ;
63
+ d . numerator = (val >> masks -> num_shift ) & masks -> num_mask ;
62
64
63
65
/* 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 )
67
68
return 0 ;
68
69
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 );
72
72
73
73
return rate ;
74
74
}
@@ -82,29 +82,29 @@ static int clk_factor_set_rate(struct clk_hw *hw, unsigned long drate,
82
82
int i ;
83
83
unsigned long val ;
84
84
unsigned long flags = 0 ;
85
+ struct u32_fract * d ;
85
86
u64 rate = 0 ;
86
87
87
88
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 ];
91
90
91
+ rate = (u64 )prate * d -> denominator ;
92
+ do_div (rate , d -> numerator * factor -> masks -> factor );
92
93
if (rate > drate )
93
94
break ;
94
95
}
95
- if (i > 0 )
96
- i -- ;
96
+ d = i ? & factor -> ftbl [i - 1 ] : & factor -> ftbl [0 ];
97
97
98
98
if (factor -> lock )
99
99
spin_lock_irqsave (factor -> lock , flags );
100
100
101
101
val = readl_relaxed (factor -> base );
102
102
103
103
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 ;
105
105
106
106
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 ;
108
108
109
109
writel_relaxed (val , factor -> base );
110
110
@@ -118,7 +118,8 @@ static int clk_factor_init(struct clk_hw *hw)
118
118
{
119
119
struct mmp_clk_factor * factor = to_clk_factor (hw );
120
120
struct mmp_clk_factor_masks * masks = factor -> masks ;
121
- u32 val , num , den ;
121
+ struct u32_fract d ;
122
+ u32 val ;
122
123
int i ;
123
124
unsigned long flags = 0 ;
124
125
@@ -128,23 +129,22 @@ static int clk_factor_init(struct clk_hw *hw)
128
129
val = readl (factor -> base );
129
130
130
131
/* calculate numerator */
131
- num = (val >> masks -> num_shift ) & masks -> num_mask ;
132
+ d . numerator = (val >> masks -> num_shift ) & masks -> num_mask ;
132
133
133
134
/* calculate denominator */
134
- den = (val >> masks -> den_shift ) & masks -> den_mask ;
135
+ d . denominator = (val >> masks -> den_shift ) & masks -> den_mask ;
135
136
136
137
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 )
138
140
break ;
139
141
140
142
if (i >= factor -> ftbl_cnt ) {
141
143
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 ;
144
145
145
146
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 ;
148
148
}
149
149
150
150
if (!(val & masks -> enable_mask ) || i >= factor -> ftbl_cnt ) {
@@ -168,8 +168,7 @@ static const struct clk_ops clk_factor_ops = {
168
168
struct clk * mmp_clk_register_factor (const char * name , const char * parent_name ,
169
169
unsigned long flags , void __iomem * base ,
170
170
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 )
173
172
{
174
173
struct mmp_clk_factor * factor ;
175
174
struct clk_init_data init ;
0 commit comments