aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStephen Boyd <sboyd@codeaurora.org>2015-07-30 20:20:57 -0400
committerMichael Turquette <mturquette@baylibre.com>2015-08-24 19:48:49 -0400
commitaef28cb6b3b22fb5a6718650340d2efcfe10dd20 (patch)
tree09cb717f6ac8b7f1b48612ea5ba5aa40f907e141
parent2f508a955a671e095d5c8a629de1c8c32bc420c2 (diff)
clk: mmp: Convert to clk_hw based provider APIs
We're removing struct clk from the clk provider API, so switch this code to using the clk_hw based provider APIs. Cc: Chao Xie <chao.xie@marvell.com> Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
-rw-r--r--drivers/clk/mmp/clk-gate.c3
-rw-r--r--drivers/clk/mmp/clk-mix.c35
2 files changed, 17 insertions, 21 deletions
diff --git a/drivers/clk/mmp/clk-gate.c b/drivers/clk/mmp/clk-gate.c
index adbd9d64ded2..d20cd3431ac2 100644
--- a/drivers/clk/mmp/clk-gate.c
+++ b/drivers/clk/mmp/clk-gate.c
@@ -27,7 +27,6 @@
27static int mmp_clk_gate_enable(struct clk_hw *hw) 27static int mmp_clk_gate_enable(struct clk_hw *hw)
28{ 28{
29 struct mmp_clk_gate *gate = to_clk_mmp_gate(hw); 29 struct mmp_clk_gate *gate = to_clk_mmp_gate(hw);
30 struct clk *clk = hw->clk;
31 unsigned long flags = 0; 30 unsigned long flags = 0;
32 unsigned long rate; 31 unsigned long rate;
33 u32 tmp; 32 u32 tmp;
@@ -44,7 +43,7 @@ static int mmp_clk_gate_enable(struct clk_hw *hw)
44 spin_unlock_irqrestore(gate->lock, flags); 43 spin_unlock_irqrestore(gate->lock, flags);
45 44
46 if (gate->flags & MMP_CLK_GATE_NEED_DELAY) { 45 if (gate->flags & MMP_CLK_GATE_NEED_DELAY) {
47 rate = __clk_get_rate(clk); 46 rate = clk_hw_get_rate(hw);
48 /* Need delay 2 cycles. */ 47 /* Need delay 2 cycles. */
49 udelay(2000000/rate); 48 udelay(2000000/rate);
50 } 49 }
diff --git a/drivers/clk/mmp/clk-mix.c b/drivers/clk/mmp/clk-mix.c
index 264882180bd3..c554833cffc5 100644
--- a/drivers/clk/mmp/clk-mix.c
+++ b/drivers/clk/mmp/clk-mix.c
@@ -113,15 +113,15 @@ static void _filter_clk_table(struct mmp_clk_mix *mix,
113{ 113{
114 int i; 114 int i;
115 struct mmp_clk_mix_clk_table *item; 115 struct mmp_clk_mix_clk_table *item;
116 struct clk *parent, *clk; 116 struct clk_hw *parent, *hw;
117 unsigned long parent_rate; 117 unsigned long parent_rate;
118 118
119 clk = mix->hw.clk; 119 hw = &mix->hw;
120 120
121 for (i = 0; i < table_size; i++) { 121 for (i = 0; i < table_size; i++) {
122 item = &table[i]; 122 item = &table[i];
123 parent = clk_get_parent_by_index(clk, item->parent_index); 123 parent = clk_hw_get_parent_by_index(hw, item->parent_index);
124 parent_rate = __clk_get_rate(parent); 124 parent_rate = clk_hw_get_rate(parent);
125 if (parent_rate % item->rate) { 125 if (parent_rate % item->rate) {
126 item->valid = 0; 126 item->valid = 0;
127 } else { 127 } else {
@@ -181,7 +181,7 @@ static int _set_rate(struct mmp_clk_mix *mix, u32 mux_val, u32 div_val,
181 181
182 if (timeout == 0) { 182 if (timeout == 0) {
183 pr_err("%s:%s cannot do frequency change\n", 183 pr_err("%s:%s cannot do frequency change\n",
184 __func__, __clk_get_name(mix->hw.clk)); 184 __func__, clk_hw_get_name(&mix->hw));
185 ret = -EBUSY; 185 ret = -EBUSY;
186 goto error; 186 goto error;
187 } 187 }
@@ -206,16 +206,14 @@ static int mmp_clk_mix_determine_rate(struct clk_hw *hw,
206{ 206{
207 struct mmp_clk_mix *mix = to_clk_mix(hw); 207 struct mmp_clk_mix *mix = to_clk_mix(hw);
208 struct mmp_clk_mix_clk_table *item; 208 struct mmp_clk_mix_clk_table *item;
209 struct clk *parent, *parent_best, *mix_clk; 209 struct clk_hw *parent, *parent_best;
210 unsigned long parent_rate, mix_rate, mix_rate_best, parent_rate_best; 210 unsigned long parent_rate, mix_rate, mix_rate_best, parent_rate_best;
211 unsigned long gap, gap_best; 211 unsigned long gap, gap_best;
212 u32 div_val_max; 212 u32 div_val_max;
213 unsigned int div; 213 unsigned int div;
214 int i, j; 214 int i, j;
215 215
216 mix_clk = hw->clk;
217 216
218 parent = NULL;
219 mix_rate_best = 0; 217 mix_rate_best = 0;
220 parent_rate_best = 0; 218 parent_rate_best = 0;
221 gap_best = ULONG_MAX; 219 gap_best = ULONG_MAX;
@@ -226,9 +224,9 @@ static int mmp_clk_mix_determine_rate(struct clk_hw *hw,
226 item = &mix->table[i]; 224 item = &mix->table[i];
227 if (item->valid == 0) 225 if (item->valid == 0)
228 continue; 226 continue;
229 parent = clk_get_parent_by_index(mix_clk, 227 parent = clk_hw_get_parent_by_index(hw,
230 item->parent_index); 228 item->parent_index);
231 parent_rate = __clk_get_rate(parent); 229 parent_rate = clk_hw_get_rate(parent);
232 mix_rate = parent_rate / item->divisor; 230 mix_rate = parent_rate / item->divisor;
233 gap = abs(mix_rate - req->rate); 231 gap = abs(mix_rate - req->rate);
234 if (parent_best == NULL || gap < gap_best) { 232 if (parent_best == NULL || gap < gap_best) {
@@ -242,8 +240,8 @@ static int mmp_clk_mix_determine_rate(struct clk_hw *hw,
242 } 240 }
243 } else { 241 } else {
244 for (i = 0; i < clk_hw_get_num_parents(hw); i++) { 242 for (i = 0; i < clk_hw_get_num_parents(hw); i++) {
245 parent = clk_get_parent_by_index(mix_clk, i); 243 parent = clk_hw_get_parent_by_index(hw, i);
246 parent_rate = __clk_get_rate(parent); 244 parent_rate = clk_hw_get_rate(parent);
247 div_val_max = _get_maxdiv(mix); 245 div_val_max = _get_maxdiv(mix);
248 for (j = 0; j < div_val_max; j++) { 246 for (j = 0; j < div_val_max; j++) {
249 div = _get_div(mix, j); 247 div = _get_div(mix, j);
@@ -266,7 +264,7 @@ found:
266 return -EINVAL; 264 return -EINVAL;
267 265
268 req->best_parent_rate = parent_rate_best; 266 req->best_parent_rate = parent_rate_best;
269 req->best_parent_hw = __clk_get_hw(parent_best); 267 req->best_parent_hw = parent_best;
270 req->rate = mix_rate_best; 268 req->rate = mix_rate_best;
271 269
272 return 0; 270 return 0;
@@ -382,20 +380,19 @@ static int mmp_clk_set_rate(struct clk_hw *hw, unsigned long rate,
382 struct mmp_clk_mix_clk_table *item; 380 struct mmp_clk_mix_clk_table *item;
383 unsigned long parent_rate; 381 unsigned long parent_rate;
384 unsigned int best_divisor; 382 unsigned int best_divisor;
385 struct clk *mix_clk, *parent; 383 struct clk_hw *parent;
386 int i; 384 int i;
387 385
388 best_divisor = best_parent_rate / rate; 386 best_divisor = best_parent_rate / rate;
389 387
390 mix_clk = hw->clk;
391 if (mix->table) { 388 if (mix->table) {
392 for (i = 0; i < mix->table_size; i++) { 389 for (i = 0; i < mix->table_size; i++) {
393 item = &mix->table[i]; 390 item = &mix->table[i];
394 if (item->valid == 0) 391 if (item->valid == 0)
395 continue; 392 continue;
396 parent = clk_get_parent_by_index(mix_clk, 393 parent = clk_hw_get_parent_by_index(hw,
397 item->parent_index); 394 item->parent_index);
398 parent_rate = __clk_get_rate(parent); 395 parent_rate = clk_hw_get_rate(parent);
399 if (parent_rate == best_parent_rate 396 if (parent_rate == best_parent_rate
400 && item->divisor == best_divisor) 397 && item->divisor == best_divisor)
401 break; 398 break;
@@ -409,8 +406,8 @@ static int mmp_clk_set_rate(struct clk_hw *hw, unsigned long rate,
409 return -EINVAL; 406 return -EINVAL;
410 } else { 407 } else {
411 for (i = 0; i < clk_hw_get_num_parents(hw); i++) { 408 for (i = 0; i < clk_hw_get_num_parents(hw); i++) {
412 parent = clk_get_parent_by_index(mix_clk, i); 409 parent = clk_hw_get_parent_by_index(hw, i);
413 parent_rate = __clk_get_rate(parent); 410 parent_rate = clk_hw_get_rate(parent);
414 if (parent_rate == best_parent_rate) 411 if (parent_rate == best_parent_rate)
415 break; 412 break;
416 } 413 }