1
0
Fork 0

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>
hifive-unleashed-5.1
Stephen Boyd 2015-07-30 17:20:57 -07:00 committed by Michael Turquette
parent 2f508a955a
commit aef28cb6b3
2 changed files with 17 additions and 21 deletions

View File

@ -27,7 +27,6 @@
static int mmp_clk_gate_enable(struct clk_hw *hw) static int mmp_clk_gate_enable(struct clk_hw *hw)
{ {
struct mmp_clk_gate *gate = to_clk_mmp_gate(hw); struct mmp_clk_gate *gate = to_clk_mmp_gate(hw);
struct clk *clk = hw->clk;
unsigned long flags = 0; unsigned long flags = 0;
unsigned long rate; unsigned long rate;
u32 tmp; u32 tmp;
@ -44,7 +43,7 @@ static int mmp_clk_gate_enable(struct clk_hw *hw)
spin_unlock_irqrestore(gate->lock, flags); spin_unlock_irqrestore(gate->lock, flags);
if (gate->flags & MMP_CLK_GATE_NEED_DELAY) { if (gate->flags & MMP_CLK_GATE_NEED_DELAY) {
rate = __clk_get_rate(clk); rate = clk_hw_get_rate(hw);
/* Need delay 2 cycles. */ /* Need delay 2 cycles. */
udelay(2000000/rate); udelay(2000000/rate);
} }

View File

@ -113,15 +113,15 @@ static void _filter_clk_table(struct mmp_clk_mix *mix,
{ {
int i; int i;
struct mmp_clk_mix_clk_table *item; struct mmp_clk_mix_clk_table *item;
struct clk *parent, *clk; struct clk_hw *parent, *hw;
unsigned long parent_rate; unsigned long parent_rate;
clk = mix->hw.clk; hw = &mix->hw;
for (i = 0; i < table_size; i++) { for (i = 0; i < table_size; i++) {
item = &table[i]; item = &table[i];
parent = clk_get_parent_by_index(clk, item->parent_index); parent = clk_hw_get_parent_by_index(hw, item->parent_index);
parent_rate = __clk_get_rate(parent); parent_rate = clk_hw_get_rate(parent);
if (parent_rate % item->rate) { if (parent_rate % item->rate) {
item->valid = 0; item->valid = 0;
} else { } else {
@ -181,7 +181,7 @@ static int _set_rate(struct mmp_clk_mix *mix, u32 mux_val, u32 div_val,
if (timeout == 0) { if (timeout == 0) {
pr_err("%s:%s cannot do frequency change\n", pr_err("%s:%s cannot do frequency change\n",
__func__, __clk_get_name(mix->hw.clk)); __func__, clk_hw_get_name(&mix->hw));
ret = -EBUSY; ret = -EBUSY;
goto error; goto error;
} }
@ -206,16 +206,14 @@ static int mmp_clk_mix_determine_rate(struct clk_hw *hw,
{ {
struct mmp_clk_mix *mix = to_clk_mix(hw); struct mmp_clk_mix *mix = to_clk_mix(hw);
struct mmp_clk_mix_clk_table *item; struct mmp_clk_mix_clk_table *item;
struct clk *parent, *parent_best, *mix_clk; struct clk_hw *parent, *parent_best;
unsigned long parent_rate, mix_rate, mix_rate_best, parent_rate_best; unsigned long parent_rate, mix_rate, mix_rate_best, parent_rate_best;
unsigned long gap, gap_best; unsigned long gap, gap_best;
u32 div_val_max; u32 div_val_max;
unsigned int div; unsigned int div;
int i, j; int i, j;
mix_clk = hw->clk;
parent = NULL;
mix_rate_best = 0; mix_rate_best = 0;
parent_rate_best = 0; parent_rate_best = 0;
gap_best = ULONG_MAX; gap_best = ULONG_MAX;
@ -226,9 +224,9 @@ static int mmp_clk_mix_determine_rate(struct clk_hw *hw,
item = &mix->table[i]; item = &mix->table[i];
if (item->valid == 0) if (item->valid == 0)
continue; continue;
parent = clk_get_parent_by_index(mix_clk, parent = clk_hw_get_parent_by_index(hw,
item->parent_index); item->parent_index);
parent_rate = __clk_get_rate(parent); parent_rate = clk_hw_get_rate(parent);
mix_rate = parent_rate / item->divisor; mix_rate = parent_rate / item->divisor;
gap = abs(mix_rate - req->rate); gap = abs(mix_rate - req->rate);
if (parent_best == NULL || gap < gap_best) { if (parent_best == NULL || gap < gap_best) {
@ -242,8 +240,8 @@ static int mmp_clk_mix_determine_rate(struct clk_hw *hw,
} }
} else { } else {
for (i = 0; i < clk_hw_get_num_parents(hw); i++) { for (i = 0; i < clk_hw_get_num_parents(hw); i++) {
parent = clk_get_parent_by_index(mix_clk, i); parent = clk_hw_get_parent_by_index(hw, i);
parent_rate = __clk_get_rate(parent); parent_rate = clk_hw_get_rate(parent);
div_val_max = _get_maxdiv(mix); div_val_max = _get_maxdiv(mix);
for (j = 0; j < div_val_max; j++) { for (j = 0; j < div_val_max; j++) {
div = _get_div(mix, j); div = _get_div(mix, j);
@ -266,7 +264,7 @@ found:
return -EINVAL; return -EINVAL;
req->best_parent_rate = parent_rate_best; req->best_parent_rate = parent_rate_best;
req->best_parent_hw = __clk_get_hw(parent_best); req->best_parent_hw = parent_best;
req->rate = mix_rate_best; req->rate = mix_rate_best;
return 0; return 0;
@ -382,20 +380,19 @@ static int mmp_clk_set_rate(struct clk_hw *hw, unsigned long rate,
struct mmp_clk_mix_clk_table *item; struct mmp_clk_mix_clk_table *item;
unsigned long parent_rate; unsigned long parent_rate;
unsigned int best_divisor; unsigned int best_divisor;
struct clk *mix_clk, *parent; struct clk_hw *parent;
int i; int i;
best_divisor = best_parent_rate / rate; best_divisor = best_parent_rate / rate;
mix_clk = hw->clk;
if (mix->table) { if (mix->table) {
for (i = 0; i < mix->table_size; i++) { for (i = 0; i < mix->table_size; i++) {
item = &mix->table[i]; item = &mix->table[i];
if (item->valid == 0) if (item->valid == 0)
continue; continue;
parent = clk_get_parent_by_index(mix_clk, parent = clk_hw_get_parent_by_index(hw,
item->parent_index); item->parent_index);
parent_rate = __clk_get_rate(parent); parent_rate = clk_hw_get_rate(parent);
if (parent_rate == best_parent_rate if (parent_rate == best_parent_rate
&& item->divisor == best_divisor) && item->divisor == best_divisor)
break; break;
@ -409,8 +406,8 @@ static int mmp_clk_set_rate(struct clk_hw *hw, unsigned long rate,
return -EINVAL; return -EINVAL;
} else { } else {
for (i = 0; i < clk_hw_get_num_parents(hw); i++) { for (i = 0; i < clk_hw_get_num_parents(hw); i++) {
parent = clk_get_parent_by_index(mix_clk, i); parent = clk_hw_get_parent_by_index(hw, i);
parent_rate = __clk_get_rate(parent); parent_rate = clk_hw_get_rate(parent);
if (parent_rate == best_parent_rate) if (parent_rate == best_parent_rate)
break; break;
} }