forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-05-10 37f49e37ab4cb5d0bc4c60eb5c6d4dd57db767bb
kernel/drivers/clk/mmp/clk-frac.c
....@@ -28,13 +28,15 @@
2828 unsigned long *prate)
2929 {
3030 struct mmp_clk_factor *factor = to_clk_factor(hw);
31
- unsigned long rate = 0, prev_rate;
31
+ u64 rate = 0, prev_rate;
3232 int i;
3333
3434 for (i = 0; i < factor->ftbl_cnt; i++) {
3535 prev_rate = rate;
36
- rate = (((*prate / 10000) * factor->ftbl[i].den) /
37
- (factor->ftbl[i].num * factor->masks->factor)) * 10000;
36
+ rate = *prate;
37
+ rate *= factor->ftbl[i].den;
38
+ do_div(rate, factor->ftbl[i].num * factor->masks->factor);
39
+
3840 if (rate > drate)
3941 break;
4042 }
....@@ -54,6 +56,7 @@
5456 struct mmp_clk_factor *factor = to_clk_factor(hw);
5557 struct mmp_clk_factor_masks *masks = factor->masks;
5658 unsigned int val, num, den;
59
+ u64 rate;
5760
5861 val = readl_relaxed(factor->base);
5962
....@@ -66,8 +69,11 @@
6669 if (!den)
6770 return 0;
6871
69
- return (((parent_rate / 10000) * den) /
70
- (num * factor->masks->factor)) * 10000;
72
+ rate = parent_rate;
73
+ rate *= den;
74
+ do_div(rate, num * factor->masks->factor);
75
+
76
+ return rate;
7177 }
7278
7379 /* Configures new clock rate*/
....@@ -78,13 +84,14 @@
7884 struct mmp_clk_factor_masks *masks = factor->masks;
7985 int i;
8086 unsigned long val;
81
- unsigned long prev_rate, rate = 0;
8287 unsigned long flags = 0;
88
+ u64 rate = 0;
8389
8490 for (i = 0; i < factor->ftbl_cnt; i++) {
85
- prev_rate = rate;
86
- rate = (((prate / 10000) * factor->ftbl[i].den) /
87
- (factor->ftbl[i].num * factor->masks->factor)) * 10000;
91
+ rate = prate;
92
+ rate *= factor->ftbl[i].den;
93
+ do_div(rate, factor->ftbl[i].num * factor->masks->factor);
94
+
8895 if (rate > drate)
8996 break;
9097 }
....@@ -110,7 +117,7 @@
110117 return 0;
111118 }
112119
113
-static void clk_factor_init(struct clk_hw *hw)
120
+static int clk_factor_init(struct clk_hw *hw)
114121 {
115122 struct mmp_clk_factor *factor = to_clk_factor(hw);
116123 struct mmp_clk_factor_masks *masks = factor->masks;
....@@ -141,12 +148,17 @@
141148 val &= ~(masks->den_mask << masks->den_shift);
142149 val |= (factor->ftbl[0].den & masks->den_mask) <<
143150 masks->den_shift;
151
+ }
144152
153
+ if (!(val & masks->enable_mask) || i >= factor->ftbl_cnt) {
154
+ val |= masks->enable_mask;
145155 writel(val, factor->base);
146156 }
147157
148158 if (factor->lock)
149159 spin_unlock_irqrestore(factor->lock, flags);
160
+
161
+ return 0;
150162 }
151163
152164 static const struct clk_ops clk_factor_ops = {
....@@ -163,7 +175,7 @@
163175 unsigned int ftbl_cnt, spinlock_t *lock)
164176 {
165177 struct mmp_clk_factor *factor;
166
- struct clk_init_data init = {};
178
+ struct clk_init_data init;
167179 struct clk *clk;
168180
169181 if (!masks) {