Commit 646cafc6 authored by Tomeu Vizoso's avatar Tomeu Vizoso Committed by Michael Turquette

clk: Change clk_ops->determine_rate to return a clk_hw as the best parent

This is in preparation for clock providers to not have to deal with struct clk.
Signed-off-by: default avatarTomeu Vizoso <tomeu.vizoso@collabora.com>
Reviewed-by: default avatarStephen Boyd <sboyd@codeaurora.org>
Signed-off-by: default avatarMichael Turquette <mturquette@linaro.org>
parent 61c7cddf
...@@ -74,7 +74,7 @@ the operations defined in clk.h: ...@@ -74,7 +74,7 @@ the operations defined in clk.h:
long (*determine_rate)(struct clk_hw *hw, long (*determine_rate)(struct clk_hw *hw,
unsigned long rate, unsigned long rate,
unsigned long *best_parent_rate, unsigned long *best_parent_rate,
struct clk **best_parent_clk); struct clk_hw **best_parent_clk);
int (*set_parent)(struct clk_hw *hw, u8 index); int (*set_parent)(struct clk_hw *hw, u8 index);
u8 (*get_parent)(struct clk_hw *hw); u8 (*get_parent)(struct clk_hw *hw);
int (*set_rate)(struct clk_hw *hw, int (*set_rate)(struct clk_hw *hw,
......
...@@ -375,7 +375,7 @@ static long alchemy_calc_div(unsigned long rate, unsigned long prate, ...@@ -375,7 +375,7 @@ static long alchemy_calc_div(unsigned long rate, unsigned long prate,
static long alchemy_clk_fgcs_detr(struct clk_hw *hw, unsigned long rate, static long alchemy_clk_fgcs_detr(struct clk_hw *hw, unsigned long rate,
unsigned long *best_parent_rate, unsigned long *best_parent_rate,
struct clk **best_parent_clk, struct clk_hw **best_parent_clk,
int scale, int maxdiv) int scale, int maxdiv)
{ {
struct clk *pc, *bpc, *free; struct clk *pc, *bpc, *free;
...@@ -454,7 +454,7 @@ static long alchemy_clk_fgcs_detr(struct clk_hw *hw, unsigned long rate, ...@@ -454,7 +454,7 @@ static long alchemy_clk_fgcs_detr(struct clk_hw *hw, unsigned long rate,
} }
*best_parent_rate = bpr; *best_parent_rate = bpr;
*best_parent_clk = bpc; *best_parent_clk = __clk_get_hw(bpc);
return br; return br;
} }
...@@ -548,7 +548,7 @@ static unsigned long alchemy_clk_fgv1_recalc(struct clk_hw *hw, ...@@ -548,7 +548,7 @@ static unsigned long alchemy_clk_fgv1_recalc(struct clk_hw *hw,
static long alchemy_clk_fgv1_detr(struct clk_hw *hw, unsigned long rate, static long alchemy_clk_fgv1_detr(struct clk_hw *hw, unsigned long rate,
unsigned long *best_parent_rate, unsigned long *best_parent_rate,
struct clk **best_parent_clk) struct clk_hw **best_parent_clk)
{ {
return alchemy_clk_fgcs_detr(hw, rate, best_parent_rate, return alchemy_clk_fgcs_detr(hw, rate, best_parent_rate,
best_parent_clk, 2, 512); best_parent_clk, 2, 512);
...@@ -680,7 +680,7 @@ static unsigned long alchemy_clk_fgv2_recalc(struct clk_hw *hw, ...@@ -680,7 +680,7 @@ static unsigned long alchemy_clk_fgv2_recalc(struct clk_hw *hw,
static long alchemy_clk_fgv2_detr(struct clk_hw *hw, unsigned long rate, static long alchemy_clk_fgv2_detr(struct clk_hw *hw, unsigned long rate,
unsigned long *best_parent_rate, unsigned long *best_parent_rate,
struct clk **best_parent_clk) struct clk_hw **best_parent_clk)
{ {
struct alchemy_fgcs_clk *c = to_fgcs_clk(hw); struct alchemy_fgcs_clk *c = to_fgcs_clk(hw);
int scale, maxdiv; int scale, maxdiv;
...@@ -899,7 +899,7 @@ static int alchemy_clk_csrc_setr(struct clk_hw *hw, unsigned long rate, ...@@ -899,7 +899,7 @@ static int alchemy_clk_csrc_setr(struct clk_hw *hw, unsigned long rate,
static long alchemy_clk_csrc_detr(struct clk_hw *hw, unsigned long rate, static long alchemy_clk_csrc_detr(struct clk_hw *hw, unsigned long rate,
unsigned long *best_parent_rate, unsigned long *best_parent_rate,
struct clk **best_parent_clk) struct clk_hw **best_parent_clk)
{ {
struct alchemy_fgcs_clk *c = to_fgcs_clk(hw); struct alchemy_fgcs_clk *c = to_fgcs_clk(hw);
int scale = c->dt[2] == 3 ? 1 : 2; /* au1300 check */ int scale = c->dt[2] == 3 ? 1 : 2; /* au1300 check */
......
...@@ -57,7 +57,7 @@ static unsigned long clk_programmable_recalc_rate(struct clk_hw *hw, ...@@ -57,7 +57,7 @@ static unsigned long clk_programmable_recalc_rate(struct clk_hw *hw,
static long clk_programmable_determine_rate(struct clk_hw *hw, static long clk_programmable_determine_rate(struct clk_hw *hw,
unsigned long rate, unsigned long rate,
unsigned long *best_parent_rate, unsigned long *best_parent_rate,
struct clk **best_parent_clk) struct clk_hw **best_parent_hw)
{ {
struct clk *parent = NULL; struct clk *parent = NULL;
long best_rate = -EINVAL; long best_rate = -EINVAL;
...@@ -84,7 +84,7 @@ static long clk_programmable_determine_rate(struct clk_hw *hw, ...@@ -84,7 +84,7 @@ static long clk_programmable_determine_rate(struct clk_hw *hw,
if (best_rate < 0 || (rate - tmp_rate) < (rate - best_rate)) { if (best_rate < 0 || (rate - tmp_rate) < (rate - best_rate)) {
best_rate = tmp_rate; best_rate = tmp_rate;
*best_parent_rate = parent_rate; *best_parent_rate = parent_rate;
*best_parent_clk = parent; *best_parent_hw = __clk_get_hw(parent);
} }
if (!best_rate) if (!best_rate)
......
...@@ -1032,7 +1032,7 @@ static long kona_peri_clk_round_rate(struct clk_hw *hw, unsigned long rate, ...@@ -1032,7 +1032,7 @@ static long kona_peri_clk_round_rate(struct clk_hw *hw, unsigned long rate,
} }
static long kona_peri_clk_determine_rate(struct clk_hw *hw, unsigned long rate, static long kona_peri_clk_determine_rate(struct clk_hw *hw, unsigned long rate,
unsigned long *best_parent_rate, struct clk **best_parent) unsigned long *best_parent_rate, struct clk_hw **best_parent)
{ {
struct kona_clk *bcm_clk = to_kona_clk(hw); struct kona_clk *bcm_clk = to_kona_clk(hw);
struct clk *clk = hw->clk; struct clk *clk = hw->clk;
...@@ -1075,7 +1075,7 @@ static long kona_peri_clk_determine_rate(struct clk_hw *hw, unsigned long rate, ...@@ -1075,7 +1075,7 @@ static long kona_peri_clk_determine_rate(struct clk_hw *hw, unsigned long rate,
if (delta < best_delta) { if (delta < best_delta) {
best_delta = delta; best_delta = delta;
best_rate = other_rate; best_rate = other_rate;
*best_parent = parent; *best_parent = __clk_get_hw(parent);
*best_parent_rate = parent_rate; *best_parent_rate = parent_rate;
} }
} }
......
...@@ -57,7 +57,7 @@ static unsigned long clk_composite_recalc_rate(struct clk_hw *hw, ...@@ -57,7 +57,7 @@ static unsigned long clk_composite_recalc_rate(struct clk_hw *hw,
static long clk_composite_determine_rate(struct clk_hw *hw, unsigned long rate, static long clk_composite_determine_rate(struct clk_hw *hw, unsigned long rate,
unsigned long *best_parent_rate, unsigned long *best_parent_rate,
struct clk **best_parent_p) struct clk_hw **best_parent_p)
{ {
struct clk_composite *composite = to_clk_composite(hw); struct clk_composite *composite = to_clk_composite(hw);
const struct clk_ops *rate_ops = composite->rate_ops; const struct clk_ops *rate_ops = composite->rate_ops;
...@@ -80,8 +80,9 @@ static long clk_composite_determine_rate(struct clk_hw *hw, unsigned long rate, ...@@ -80,8 +80,9 @@ static long clk_composite_determine_rate(struct clk_hw *hw, unsigned long rate,
*best_parent_p = NULL; *best_parent_p = NULL;
if (__clk_get_flags(hw->clk) & CLK_SET_RATE_NO_REPARENT) { if (__clk_get_flags(hw->clk) & CLK_SET_RATE_NO_REPARENT) {
*best_parent_p = clk_get_parent(mux_hw->clk); parent = clk_get_parent(mux_hw->clk);
*best_parent_rate = __clk_get_rate(*best_parent_p); *best_parent_p = __clk_get_hw(parent);
*best_parent_rate = __clk_get_rate(parent);
return rate_ops->round_rate(rate_hw, rate, return rate_ops->round_rate(rate_hw, rate,
best_parent_rate); best_parent_rate);
...@@ -103,7 +104,7 @@ static long clk_composite_determine_rate(struct clk_hw *hw, unsigned long rate, ...@@ -103,7 +104,7 @@ static long clk_composite_determine_rate(struct clk_hw *hw, unsigned long rate,
if (!rate_diff || !*best_parent_p if (!rate_diff || !*best_parent_p
|| best_rate_diff > rate_diff) { || best_rate_diff > rate_diff) {
*best_parent_p = parent; *best_parent_p = __clk_get_hw(parent);
*best_parent_rate = parent_rate; *best_parent_rate = parent_rate;
best_rate_diff = rate_diff; best_rate_diff = rate_diff;
best_rate = tmp_rate; best_rate = tmp_rate;
......
...@@ -702,7 +702,7 @@ struct clk *__clk_lookup(const char *name) ...@@ -702,7 +702,7 @@ struct clk *__clk_lookup(const char *name)
*/ */
long __clk_mux_determine_rate(struct clk_hw *hw, unsigned long rate, long __clk_mux_determine_rate(struct clk_hw *hw, unsigned long rate,
unsigned long *best_parent_rate, unsigned long *best_parent_rate,
struct clk **best_parent_p) struct clk_hw **best_parent_p)
{ {
struct clk *clk = hw->clk, *parent, *best_parent = NULL; struct clk *clk = hw->clk, *parent, *best_parent = NULL;
int i, num_parents; int i, num_parents;
...@@ -738,7 +738,7 @@ long __clk_mux_determine_rate(struct clk_hw *hw, unsigned long rate, ...@@ -738,7 +738,7 @@ long __clk_mux_determine_rate(struct clk_hw *hw, unsigned long rate,
out: out:
if (best_parent) if (best_parent)
*best_parent_p = best_parent; *best_parent_p = best_parent->hw;
*best_parent_rate = best; *best_parent_rate = best;
return best; return best;
...@@ -946,6 +946,7 @@ unsigned long __clk_round_rate(struct clk *clk, unsigned long rate) ...@@ -946,6 +946,7 @@ unsigned long __clk_round_rate(struct clk *clk, unsigned long rate)
{ {
unsigned long parent_rate = 0; unsigned long parent_rate = 0;
struct clk *parent; struct clk *parent;
struct clk_hw *parent_hw;
if (!clk) if (!clk)
return 0; return 0;
...@@ -954,10 +955,11 @@ unsigned long __clk_round_rate(struct clk *clk, unsigned long rate) ...@@ -954,10 +955,11 @@ unsigned long __clk_round_rate(struct clk *clk, unsigned long rate)
if (parent) if (parent)
parent_rate = parent->rate; parent_rate = parent->rate;
if (clk->ops->determine_rate) if (clk->ops->determine_rate) {
parent_hw = parent ? parent->hw : NULL;
return clk->ops->determine_rate(clk->hw, rate, &parent_rate, return clk->ops->determine_rate(clk->hw, rate, &parent_rate,
&parent); &parent_hw);
else if (clk->ops->round_rate) } else if (clk->ops->round_rate)
return clk->ops->round_rate(clk->hw, rate, &parent_rate); return clk->ops->round_rate(clk->hw, rate, &parent_rate);
else if (clk->flags & CLK_SET_RATE_PARENT) else if (clk->flags & CLK_SET_RATE_PARENT)
return __clk_round_rate(clk->parent, rate); return __clk_round_rate(clk->parent, rate);
...@@ -1345,6 +1347,7 @@ static struct clk *clk_calc_new_rates(struct clk *clk, unsigned long rate) ...@@ -1345,6 +1347,7 @@ static struct clk *clk_calc_new_rates(struct clk *clk, unsigned long rate)
{ {
struct clk *top = clk; struct clk *top = clk;
struct clk *old_parent, *parent; struct clk *old_parent, *parent;
struct clk_hw *parent_hw;
unsigned long best_parent_rate = 0; unsigned long best_parent_rate = 0;
unsigned long new_rate; unsigned long new_rate;
int p_index = 0; int p_index = 0;
...@@ -1360,9 +1363,11 @@ static struct clk *clk_calc_new_rates(struct clk *clk, unsigned long rate) ...@@ -1360,9 +1363,11 @@ static struct clk *clk_calc_new_rates(struct clk *clk, unsigned long rate)
/* find the closest rate and parent clk/rate */ /* find the closest rate and parent clk/rate */
if (clk->ops->determine_rate) { if (clk->ops->determine_rate) {
parent_hw = parent ? parent->hw : NULL;
new_rate = clk->ops->determine_rate(clk->hw, rate, new_rate = clk->ops->determine_rate(clk->hw, rate,
&best_parent_rate, &best_parent_rate,
&parent); &parent_hw);
parent = parent_hw->clk;
} else if (clk->ops->round_rate) { } else if (clk->ops->round_rate) {
new_rate = clk->ops->round_rate(clk->hw, rate, new_rate = clk->ops->round_rate(clk->hw, rate,
&best_parent_rate); &best_parent_rate);
......
...@@ -296,7 +296,7 @@ static unsigned long mmc_clk_recalc_rate(struct clk_hw *hw, ...@@ -296,7 +296,7 @@ static unsigned long mmc_clk_recalc_rate(struct clk_hw *hw,
static long mmc_clk_determine_rate(struct clk_hw *hw, unsigned long rate, static long mmc_clk_determine_rate(struct clk_hw *hw, unsigned long rate,
unsigned long *best_parent_rate, unsigned long *best_parent_rate,
struct clk **best_parent_p) struct clk_hw **best_parent_p)
{ {
struct clk_mmc *mclk = to_mmc(hw); struct clk_mmc *mclk = to_mmc(hw);
unsigned long best = 0; unsigned long best = 0;
......
...@@ -203,7 +203,7 @@ error: ...@@ -203,7 +203,7 @@ error:
static long mmp_clk_mix_determine_rate(struct clk_hw *hw, unsigned long rate, static long mmp_clk_mix_determine_rate(struct clk_hw *hw, unsigned long rate,
unsigned long *best_parent_rate, unsigned long *best_parent_rate,
struct clk **best_parent_clk) struct clk_hw **best_parent_clk)
{ {
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;
...@@ -264,7 +264,7 @@ static long mmp_clk_mix_determine_rate(struct clk_hw *hw, unsigned long rate, ...@@ -264,7 +264,7 @@ static long mmp_clk_mix_determine_rate(struct clk_hw *hw, unsigned long rate,
found: found:
*best_parent_rate = parent_rate_best; *best_parent_rate = parent_rate_best;
*best_parent_clk = parent_best; *best_parent_clk = __clk_get_hw(parent_best);
return mix_rate_best; return mix_rate_best;
} }
......
...@@ -141,7 +141,7 @@ struct pll_freq_tbl *find_freq(const struct pll_freq_tbl *f, unsigned long rate) ...@@ -141,7 +141,7 @@ struct pll_freq_tbl *find_freq(const struct pll_freq_tbl *f, unsigned long rate)
static long static long
clk_pll_determine_rate(struct clk_hw *hw, unsigned long rate, clk_pll_determine_rate(struct clk_hw *hw, unsigned long rate,
unsigned long *p_rate, struct clk **p) unsigned long *p_rate, struct clk_hw **p)
{ {
struct clk_pll *pll = to_clk_pll(hw); struct clk_pll *pll = to_clk_pll(hw);
const struct pll_freq_tbl *f; const struct pll_freq_tbl *f;
......
...@@ -368,16 +368,17 @@ clk_dyn_rcg_recalc_rate(struct clk_hw *hw, unsigned long parent_rate) ...@@ -368,16 +368,17 @@ clk_dyn_rcg_recalc_rate(struct clk_hw *hw, unsigned long parent_rate)
static long _freq_tbl_determine_rate(struct clk_hw *hw, static long _freq_tbl_determine_rate(struct clk_hw *hw,
const struct freq_tbl *f, unsigned long rate, const struct freq_tbl *f, unsigned long rate,
unsigned long *p_rate, struct clk **p) unsigned long *p_rate, struct clk_hw **p_hw)
{ {
unsigned long clk_flags; unsigned long clk_flags;
struct clk *p;
f = qcom_find_freq(f, rate); f = qcom_find_freq(f, rate);
if (!f) if (!f)
return -EINVAL; return -EINVAL;
clk_flags = __clk_get_flags(hw->clk); clk_flags = __clk_get_flags(hw->clk);
*p = clk_get_parent_by_index(hw->clk, f->src); p = clk_get_parent_by_index(hw->clk, f->src);
if (clk_flags & CLK_SET_RATE_PARENT) { if (clk_flags & CLK_SET_RATE_PARENT) {
rate = rate * f->pre_div; rate = rate * f->pre_div;
if (f->n) { if (f->n) {
...@@ -387,15 +388,16 @@ static long _freq_tbl_determine_rate(struct clk_hw *hw, ...@@ -387,15 +388,16 @@ static long _freq_tbl_determine_rate(struct clk_hw *hw,
rate = tmp; rate = tmp;
} }
} else { } else {
rate = __clk_get_rate(*p); rate = __clk_get_rate(p);
} }
*p_hw = __clk_get_hw(p);
*p_rate = rate; *p_rate = rate;
return f->freq; return f->freq;
} }
static long clk_rcg_determine_rate(struct clk_hw *hw, unsigned long rate, static long clk_rcg_determine_rate(struct clk_hw *hw, unsigned long rate,
unsigned long *p_rate, struct clk **p) unsigned long *p_rate, struct clk_hw **p)
{ {
struct clk_rcg *rcg = to_clk_rcg(hw); struct clk_rcg *rcg = to_clk_rcg(hw);
...@@ -403,7 +405,7 @@ static long clk_rcg_determine_rate(struct clk_hw *hw, unsigned long rate, ...@@ -403,7 +405,7 @@ static long clk_rcg_determine_rate(struct clk_hw *hw, unsigned long rate,
} }
static long clk_dyn_rcg_determine_rate(struct clk_hw *hw, unsigned long rate, static long clk_dyn_rcg_determine_rate(struct clk_hw *hw, unsigned long rate,
unsigned long *p_rate, struct clk **p) unsigned long *p_rate, struct clk_hw **p)
{ {
struct clk_dyn_rcg *rcg = to_clk_dyn_rcg(hw); struct clk_dyn_rcg *rcg = to_clk_dyn_rcg(hw);
...@@ -411,13 +413,15 @@ static long clk_dyn_rcg_determine_rate(struct clk_hw *hw, unsigned long rate, ...@@ -411,13 +413,15 @@ static long clk_dyn_rcg_determine_rate(struct clk_hw *hw, unsigned long rate,
} }
static long clk_rcg_bypass_determine_rate(struct clk_hw *hw, unsigned long rate, static long clk_rcg_bypass_determine_rate(struct clk_hw *hw, unsigned long rate,
unsigned long *p_rate, struct clk **p) unsigned long *p_rate, struct clk_hw **p_hw)
{ {
struct clk_rcg *rcg = to_clk_rcg(hw); struct clk_rcg *rcg = to_clk_rcg(hw);
const struct freq_tbl *f = rcg->freq_tbl; const struct freq_tbl *f = rcg->freq_tbl;
struct clk *p;
*p = clk_get_parent_by_index(hw->clk, f->src); p = clk_get_parent_by_index(hw->clk, f->src);
*p_rate = __clk_round_rate(*p, rate); *p_hw = __clk_get_hw(p);
*p_rate = __clk_round_rate(p, rate);
return *p_rate; return *p_rate;
} }
......
...@@ -175,16 +175,17 @@ clk_rcg2_recalc_rate(struct clk_hw *hw, unsigned long parent_rate) ...@@ -175,16 +175,17 @@ clk_rcg2_recalc_rate(struct clk_hw *hw, unsigned long parent_rate)
static long _freq_tbl_determine_rate(struct clk_hw *hw, static long _freq_tbl_determine_rate(struct clk_hw *hw,
const struct freq_tbl *f, unsigned long rate, const struct freq_tbl *f, unsigned long rate,
unsigned long *p_rate, struct clk **p) unsigned long *p_rate, struct clk_hw **p_hw)
{ {
unsigned long clk_flags; unsigned long clk_flags;
struct clk *p;
f = qcom_find_freq(f, rate); f = qcom_find_freq(f, rate);
if (!f) if (!f)
return -EINVAL; return -EINVAL;
clk_flags = __clk_get_flags(hw->clk); clk_flags = __clk_get_flags(hw->clk);
*p = clk_get_parent_by_index(hw->clk, f->src); p = clk_get_parent_by_index(hw->clk, f->src);
if (clk_flags & CLK_SET_RATE_PARENT) { if (clk_flags & CLK_SET_RATE_PARENT) {
if (f->pre_div) { if (f->pre_div) {
rate /= 2; rate /= 2;
...@@ -198,15 +199,16 @@ static long _freq_tbl_determine_rate(struct clk_hw *hw, ...@@ -198,15 +199,16 @@ static long _freq_tbl_determine_rate(struct clk_hw *hw,
rate = tmp; rate = tmp;
} }
} else { } else {
rate = __clk_get_rate(*p); rate = __clk_get_rate(p);
} }
*p_hw = __clk_get_hw(p);
*p_rate = rate; *p_rate = rate;
return f->freq; return f->freq;
} }
static long clk_rcg2_determine_rate(struct clk_hw *hw, unsigned long rate, static long clk_rcg2_determine_rate(struct clk_hw *hw, unsigned long rate,
unsigned long *p_rate, struct clk **p) unsigned long *p_rate, struct clk_hw **p)
{ {
struct clk_rcg2 *rcg = to_clk_rcg2(hw); struct clk_rcg2 *rcg = to_clk_rcg2(hw);
...@@ -359,7 +361,7 @@ static int clk_edp_pixel_set_rate_and_parent(struct clk_hw *hw, ...@@ -359,7 +361,7 @@ static int clk_edp_pixel_set_rate_and_parent(struct clk_hw *hw,
} }
static long clk_edp_pixel_determine_rate(struct clk_hw *hw, unsigned long rate, static long clk_edp_pixel_determine_rate(struct clk_hw *hw, unsigned long rate,
unsigned long *p_rate, struct clk **p) unsigned long *p_rate, struct clk_hw **p)
{ {
struct clk_rcg2 *rcg = to_clk_rcg2(hw); struct clk_rcg2 *rcg = to_clk_rcg2(hw);
const struct freq_tbl *f = rcg->freq_tbl; const struct freq_tbl *f = rcg->freq_tbl;
...@@ -371,7 +373,7 @@ static long clk_edp_pixel_determine_rate(struct clk_hw *hw, unsigned long rate, ...@@ -371,7 +373,7 @@ static long clk_edp_pixel_determine_rate(struct clk_hw *hw, unsigned long rate,
u32 hid_div; u32 hid_div;
/* Force the correct parent */ /* Force the correct parent */
*p = clk_get_parent_by_index(hw->clk, f->src); *p = __clk_get_hw(clk_get_parent_by_index(hw->clk, f->src));
if (src_rate == 810000000) if (src_rate == 810000000)
frac = frac_table_810m; frac = frac_table_810m;
...@@ -410,18 +412,20 @@ const struct clk_ops clk_edp_pixel_ops = { ...@@ -410,18 +412,20 @@ const struct clk_ops clk_edp_pixel_ops = {
EXPORT_SYMBOL_GPL(clk_edp_pixel_ops); EXPORT_SYMBOL_GPL(clk_edp_pixel_ops);
static long clk_byte_determine_rate(struct clk_hw *hw, unsigned long rate, static long clk_byte_determine_rate(struct clk_hw *hw, unsigned long rate,
unsigned long *p_rate, struct clk **p) unsigned long *p_rate, struct clk_hw **p_hw)
{ {
struct clk_rcg2 *rcg = to_clk_rcg2(hw); struct clk_rcg2 *rcg = to_clk_rcg2(hw);
const struct freq_tbl *f = rcg->freq_tbl; const struct freq_tbl *f = rcg->freq_tbl;
unsigned long parent_rate, div; unsigned long parent_rate, div;
u32 mask = BIT(rcg->hid_width) - 1; u32 mask = BIT(rcg->hid_width) - 1;
struct clk *p;
if (rate == 0) if (rate == 0)
return -EINVAL; return -EINVAL;
*p = clk_get_parent_by_index(hw->clk, f->src); p = clk_get_parent_by_index(hw->clk, f->src);
*p_rate = parent_rate = __clk_round_rate(*p, rate); *p_hw = __clk_get_hw(p);
*p_rate = parent_rate = __clk_round_rate(p, rate);
div = DIV_ROUND_UP((2 * parent_rate), rate) - 1; div = DIV_ROUND_UP((2 * parent_rate), rate) - 1;
div = min_t(u32, div, mask); div = min_t(u32, div, mask);
...@@ -472,14 +476,16 @@ static const struct frac_entry frac_table_pixel[] = { ...@@ -472,14 +476,16 @@ static const struct frac_entry frac_table_pixel[] = {
}; };
static long clk_pixel_determine_rate(struct clk_hw *hw, unsigned long rate, static long clk_pixel_determine_rate(struct clk_hw *hw, unsigned long rate,
unsigned long *p_rate, struct clk **p) unsigned long *p_rate, struct clk_hw **p)
{ {
struct clk_rcg2 *rcg = to_clk_rcg2(hw); struct clk_rcg2 *rcg = to_clk_rcg2(hw);
unsigned long request, src_rate; unsigned long request, src_rate;
int delta = 100000; int delta = 100000;
const struct freq_tbl *f = rcg->freq_tbl; const struct freq_tbl *f = rcg->freq_tbl;
const struct frac_entry *frac = frac_table_pixel; const struct frac_entry *frac = frac_table_pixel;
struct clk *parent = *p = clk_get_parent_by_index(hw->clk, f->src); struct clk *parent = clk_get_parent_by_index(hw->clk, f->src);
*p = __clk_get_hw(parent);
for (; frac->num; frac++) { for (; frac->num; frac++) {
request = (rate * frac->den) / frac->num; request = (rate * frac->den) / frac->num;
......
...@@ -81,7 +81,7 @@ static long clk_factors_round_rate(struct clk_hw *hw, unsigned long rate, ...@@ -81,7 +81,7 @@ static long clk_factors_round_rate(struct clk_hw *hw, unsigned long rate,
static long clk_factors_determine_rate(struct clk_hw *hw, unsigned long rate, static long clk_factors_determine_rate(struct clk_hw *hw, unsigned long rate,
unsigned long *best_parent_rate, unsigned long *best_parent_rate,
struct clk **best_parent_p) struct clk_hw **best_parent_p)
{ {
struct clk *clk = hw->clk, *parent, *best_parent = NULL; struct clk *clk = hw->clk, *parent, *best_parent = NULL;
int i, num_parents; int i, num_parents;
...@@ -108,7 +108,7 @@ static long clk_factors_determine_rate(struct clk_hw *hw, unsigned long rate, ...@@ -108,7 +108,7 @@ static long clk_factors_determine_rate(struct clk_hw *hw, unsigned long rate,
} }
if (best_parent) if (best_parent)
*best_parent_p = best_parent; *best_parent_p = __clk_get_hw(best_parent);
*best_parent_rate = best; *best_parent_rate = best;
return best_child_rate; return best_child_rate;
......
...@@ -46,7 +46,7 @@ static unsigned long ar100_recalc_rate(struct clk_hw *hw, ...@@ -46,7 +46,7 @@ static unsigned long ar100_recalc_rate(struct clk_hw *hw,
static long ar100_determine_rate(struct clk_hw *hw, unsigned long rate, static long ar100_determine_rate(struct clk_hw *hw, unsigned long rate,
unsigned long *best_parent_rate, unsigned long *best_parent_rate,
struct clk **best_parent_clk) struct clk_hw **best_parent_clk)
{ {
int nparents = __clk_get_num_parents(hw->clk); int nparents = __clk_get_num_parents(hw->clk);
long best_rate = -EINVAL; long best_rate = -EINVAL;
...@@ -100,7 +100,7 @@ static long ar100_determine_rate(struct clk_hw *hw, unsigned long rate, ...@@ -100,7 +100,7 @@ static long ar100_determine_rate(struct clk_hw *hw, unsigned long rate,
tmp_rate = (parent_rate >> shift) / div; tmp_rate = (parent_rate >> shift) / div;
if (!*best_parent_clk || tmp_rate > best_rate) { if (!*best_parent_clk || tmp_rate > best_rate) {
*best_parent_clk = parent; *best_parent_clk = __clk_get_hw(parent);
*best_parent_rate = parent_rate; *best_parent_rate = parent_rate;
best_rate = tmp_rate; best_rate = tmp_rate;
} }
......
...@@ -176,7 +176,7 @@ struct clk_ops { ...@@ -176,7 +176,7 @@ struct clk_ops {
unsigned long *parent_rate); unsigned long *parent_rate);
long (*determine_rate)(struct clk_hw *hw, unsigned long rate, long (*determine_rate)(struct clk_hw *hw, unsigned long rate,
unsigned long *best_parent_rate, unsigned long *best_parent_rate,
struct clk **best_parent_clk); struct clk_hw **best_parent_hw);
int (*set_parent)(struct clk_hw *hw, u8 index); int (*set_parent)(struct clk_hw *hw, u8 index);
u8 (*get_parent)(struct clk_hw *hw); u8 (*get_parent)(struct clk_hw *hw);
int (*set_rate)(struct clk_hw *hw, unsigned long rate, int (*set_rate)(struct clk_hw *hw, unsigned long rate,
...@@ -551,7 +551,7 @@ bool __clk_is_enabled(struct clk *clk); ...@@ -551,7 +551,7 @@ bool __clk_is_enabled(struct clk *clk);
struct clk *__clk_lookup(const char *name); struct clk *__clk_lookup(const char *name);
long __clk_mux_determine_rate(struct clk_hw *hw, unsigned long rate, long __clk_mux_determine_rate(struct clk_hw *hw, unsigned long rate,
unsigned long *best_parent_rate, unsigned long *best_parent_rate,
struct clk **best_parent_p); struct clk_hw **best_parent_p);
/* /*
* FIXME clock api without lock protection * FIXME clock api without lock protection
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment