Commit 5dcc3b97 authored by Rajendra Nayak's avatar Rajendra Nayak Committed by Paul Walmsley

ARM: OMAP2+: clock: Remove all direct dereferencing of struct clk

While we move to Common Clk Framework (CCF), direct deferencing of struct
clk wouldn't be possible anymore. Hence get rid of all such instances
in the current clock code and use macros/helpers similar to the ones that
are provided by CCF.

While here also concatenate some strings split across multiple lines
which seem to be needed anyway.
Signed-off-by: default avatarRajendra Nayak <rnayak@ti.com>
[paul@pwsan.com: simplified some compound expressions; reformatted some
 messages]
Signed-off-by: default avatarPaul Walmsley <paul@pwsan.com>
Cc: Mike Turquette <mturquette@linaro.org>
parent 6ea74cb9
...@@ -59,7 +59,7 @@ static int omap2_clk_apll_enable(struct clk *clk, u32 status_mask) ...@@ -59,7 +59,7 @@ static int omap2_clk_apll_enable(struct clk *clk, u32 status_mask)
omap2_cm_write_mod_reg(cval, PLL_MOD, CM_CLKEN); omap2_cm_write_mod_reg(cval, PLL_MOD, CM_CLKEN);
omap2_cm_wait_idlest(cm_idlest_pll, status_mask, omap2_cm_wait_idlest(cm_idlest_pll, status_mask,
OMAP24XX_CM_IDLEST_VAL, clk->name); OMAP24XX_CM_IDLEST_VAL, __clk_get_name(clk));
/* /*
* REVISIT: Should we return an error code if omap2_wait_clock_ready() * REVISIT: Should we return an error code if omap2_wait_clock_ready()
......
...@@ -68,14 +68,15 @@ unsigned long omap2_table_mpu_recalc(struct clk *clk) ...@@ -68,14 +68,15 @@ unsigned long omap2_table_mpu_recalc(struct clk *clk)
long omap2_round_to_table_rate(struct clk *clk, unsigned long rate) long omap2_round_to_table_rate(struct clk *clk, unsigned long rate)
{ {
const struct prcm_config *ptr; const struct prcm_config *ptr;
long highest_rate; long highest_rate, sys_clk_rate;
highest_rate = -EINVAL; highest_rate = -EINVAL;
sys_clk_rate = __clk_get_rate(sclk);
for (ptr = rate_table; ptr->mpu_speed; ptr++) { for (ptr = rate_table; ptr->mpu_speed; ptr++) {
if (!(ptr->flags & cpu_mask)) if (!(ptr->flags & cpu_mask))
continue; continue;
if (ptr->xtal_speed != sclk->rate) if (ptr->xtal_speed != sys_clk_rate)
continue; continue;
highest_rate = ptr->mpu_speed; highest_rate = ptr->mpu_speed;
...@@ -94,12 +95,15 @@ int omap2_select_table_rate(struct clk *clk, unsigned long rate) ...@@ -94,12 +95,15 @@ int omap2_select_table_rate(struct clk *clk, unsigned long rate)
const struct prcm_config *prcm; const struct prcm_config *prcm;
unsigned long found_speed = 0; unsigned long found_speed = 0;
unsigned long flags; unsigned long flags;
long sys_clk_rate;
sys_clk_rate = __clk_get_rate(sclk);
for (prcm = rate_table; prcm->mpu_speed; prcm++) { for (prcm = rate_table; prcm->mpu_speed; prcm++) {
if (!(prcm->flags & cpu_mask)) if (!(prcm->flags & cpu_mask))
continue; continue;
if (prcm->xtal_speed != sclk->rate) if (prcm->xtal_speed != sys_clk_rate)
continue; continue;
if (prcm->mpu_speed <= rate) { if (prcm->mpu_speed <= rate) {
......
...@@ -56,6 +56,7 @@ int omap3_core_dpll_m2_set_rate(struct clk *clk, unsigned long rate) ...@@ -56,6 +56,7 @@ int omap3_core_dpll_m2_set_rate(struct clk *clk, unsigned long rate)
struct omap_sdrc_params *sdrc_cs0; struct omap_sdrc_params *sdrc_cs0;
struct omap_sdrc_params *sdrc_cs1; struct omap_sdrc_params *sdrc_cs1;
int ret; int ret;
unsigned long clkrate;
if (!clk || !rate) if (!clk || !rate)
return -EINVAL; return -EINVAL;
...@@ -64,11 +65,12 @@ int omap3_core_dpll_m2_set_rate(struct clk *clk, unsigned long rate) ...@@ -64,11 +65,12 @@ int omap3_core_dpll_m2_set_rate(struct clk *clk, unsigned long rate)
if (validrate != rate) if (validrate != rate)
return -EINVAL; return -EINVAL;
sdrcrate = sdrc_ick_p->rate; sdrcrate = __clk_get_rate(sdrc_ick_p);
if (rate > clk->rate) clkrate = __clk_get_rate(clk);
sdrcrate <<= ((rate / clk->rate) >> 1); if (rate > clkrate)
sdrcrate <<= ((rate / clkrate) >> 1);
else else
sdrcrate >>= ((clk->rate / rate) >> 1); sdrcrate >>= ((clkrate / rate) >> 1);
ret = omap2_sdrc_get_params(sdrcrate, &sdrc_cs0, &sdrc_cs1); ret = omap2_sdrc_get_params(sdrcrate, &sdrc_cs0, &sdrc_cs1);
if (ret) if (ret)
...@@ -82,7 +84,7 @@ int omap3_core_dpll_m2_set_rate(struct clk *clk, unsigned long rate) ...@@ -82,7 +84,7 @@ int omap3_core_dpll_m2_set_rate(struct clk *clk, unsigned long rate)
/* /*
* XXX This only needs to be done when the CPU frequency changes * XXX This only needs to be done when the CPU frequency changes
*/ */
_mpurate = arm_fck_p->rate / CYCLES_PER_MHZ; _mpurate = __clk_get_rate(arm_fck_p) / CYCLES_PER_MHZ;
c = (_mpurate << SDRC_MPURATE_SCALE) >> SDRC_MPURATE_BASE_SHIFT; c = (_mpurate << SDRC_MPURATE_SCALE) >> SDRC_MPURATE_BASE_SHIFT;
c += 1; /* for safety */ c += 1; /* for safety */
c *= SDRC_MPURATE_LOOPS; c *= SDRC_MPURATE_LOOPS;
...@@ -90,8 +92,8 @@ int omap3_core_dpll_m2_set_rate(struct clk *clk, unsigned long rate) ...@@ -90,8 +92,8 @@ int omap3_core_dpll_m2_set_rate(struct clk *clk, unsigned long rate)
if (c == 0) if (c == 0)
c = 1; c = 1;
pr_debug("clock: changing CORE DPLL rate from %lu to %lu\n", clk->rate, pr_debug("clock: changing CORE DPLL rate from %lu to %lu\n",
validrate); clkrate, validrate);
pr_debug("clock: SDRC CS0 timing params used:" pr_debug("clock: SDRC CS0 timing params used:"
" RFR %08x CTRLA %08x CTRLB %08x MR %08x\n", " RFR %08x CTRLA %08x CTRLB %08x MR %08x\n",
sdrc_cs0->rfr_ctrl, sdrc_cs0->actim_ctrla, sdrc_cs0->rfr_ctrl, sdrc_cs0->actim_ctrla,
...@@ -104,14 +106,14 @@ int omap3_core_dpll_m2_set_rate(struct clk *clk, unsigned long rate) ...@@ -104,14 +106,14 @@ int omap3_core_dpll_m2_set_rate(struct clk *clk, unsigned long rate)
if (sdrc_cs1) if (sdrc_cs1)
omap3_configure_core_dpll( omap3_configure_core_dpll(
new_div, unlock_dll, c, rate > clk->rate, new_div, unlock_dll, c, rate > clkrate,
sdrc_cs0->rfr_ctrl, sdrc_cs0->actim_ctrla, sdrc_cs0->rfr_ctrl, sdrc_cs0->actim_ctrla,
sdrc_cs0->actim_ctrlb, sdrc_cs0->mr, sdrc_cs0->actim_ctrlb, sdrc_cs0->mr,
sdrc_cs1->rfr_ctrl, sdrc_cs1->actim_ctrla, sdrc_cs1->rfr_ctrl, sdrc_cs1->actim_ctrla,
sdrc_cs1->actim_ctrlb, sdrc_cs1->mr); sdrc_cs1->actim_ctrlb, sdrc_cs1->mr);
else else
omap3_configure_core_dpll( omap3_configure_core_dpll(
new_div, unlock_dll, c, rate > clk->rate, new_div, unlock_dll, c, rate > clkrate,
sdrc_cs0->rfr_ctrl, sdrc_cs0->actim_ctrla, sdrc_cs0->rfr_ctrl, sdrc_cs0->actim_ctrla,
sdrc_cs0->actim_ctrlb, sdrc_cs0->mr, sdrc_cs0->actim_ctrlb, sdrc_cs0->mr,
0, 0, 0, 0); 0, 0, 0, 0);
......
...@@ -71,8 +71,8 @@ static const struct clksel *_get_clksel_by_parent(struct clk *clk, ...@@ -71,8 +71,8 @@ static const struct clksel *_get_clksel_by_parent(struct clk *clk,
if (!clks->parent) { if (!clks->parent) {
/* This indicates a data problem */ /* This indicates a data problem */
WARN(1, "clock: Could not find parent clock %s in clksel array " WARN(1, "clock: %s: could not find parent clock %s in clksel array\n",
"of clock %s\n", src_clk->name, clk->name); __clk_get_name(clk), __clk_get_name(src_clk));
return NULL; return NULL;
} }
...@@ -126,8 +126,9 @@ static u8 _get_div_and_fieldval(struct clk *src_clk, struct clk *clk, ...@@ -126,8 +126,9 @@ static u8 _get_div_and_fieldval(struct clk *src_clk, struct clk *clk,
if (max_div == 0) { if (max_div == 0) {
/* This indicates an error in the clksel data */ /* This indicates an error in the clksel data */
WARN(1, "clock: Could not find divisor for clock %s parent %s" WARN(1, "clock: %s: could not find divisor for parent %s\n",
"\n", clk->name, src_clk->parent->name); __clk_get_name(clk),
__clk_get_name(__clk_get_parent(src_clk)));
return 0; return 0;
} }
...@@ -176,8 +177,10 @@ static u32 _clksel_to_divisor(struct clk *clk, u32 field_val) ...@@ -176,8 +177,10 @@ static u32 _clksel_to_divisor(struct clk *clk, u32 field_val)
{ {
const struct clksel *clks; const struct clksel *clks;
const struct clksel_rate *clkr; const struct clksel_rate *clkr;
struct clk *parent;
clks = _get_clksel_by_parent(clk, clk->parent); parent = __clk_get_parent(clk);
clks = _get_clksel_by_parent(clk, parent);
if (!clks) if (!clks)
return 0; return 0;
...@@ -191,8 +194,8 @@ static u32 _clksel_to_divisor(struct clk *clk, u32 field_val) ...@@ -191,8 +194,8 @@ static u32 _clksel_to_divisor(struct clk *clk, u32 field_val)
if (!clkr->div) { if (!clkr->div) {
/* This indicates a data error */ /* This indicates a data error */
WARN(1, "clock: Could not find fieldval %d for clock %s parent " WARN(1, "clock: %s: could not find fieldval %d for parent %s\n",
"%s\n", field_val, clk->name, clk->parent->name); __clk_get_name(clk), field_val, __clk_get_name(parent));
return 0; return 0;
} }
...@@ -213,11 +216,13 @@ static u32 _divisor_to_clksel(struct clk *clk, u32 div) ...@@ -213,11 +216,13 @@ static u32 _divisor_to_clksel(struct clk *clk, u32 div)
{ {
const struct clksel *clks; const struct clksel *clks;
const struct clksel_rate *clkr; const struct clksel_rate *clkr;
struct clk *parent;
/* should never happen */ /* should never happen */
WARN_ON(div == 0); WARN_ON(div == 0);
clks = _get_clksel_by_parent(clk, clk->parent); parent = __clk_get_parent(clk);
clks = _get_clksel_by_parent(clk, parent);
if (!clks) if (!clks)
return ~0; return ~0;
...@@ -230,8 +235,8 @@ static u32 _divisor_to_clksel(struct clk *clk, u32 div) ...@@ -230,8 +235,8 @@ static u32 _divisor_to_clksel(struct clk *clk, u32 div)
} }
if (!clkr->div) { if (!clkr->div) {
pr_err("clock: Could not find divisor %d for clock %s parent " pr_err("clock: %s: could not find divisor %d for parent %s\n",
"%s\n", div, clk->name, clk->parent->name); __clk_get_name(clk), div, __clk_get_name(parent));
return ~0; return ~0;
} }
...@@ -281,16 +286,23 @@ u32 omap2_clksel_round_rate_div(struct clk *clk, unsigned long target_rate, ...@@ -281,16 +286,23 @@ u32 omap2_clksel_round_rate_div(struct clk *clk, unsigned long target_rate,
const struct clksel *clks; const struct clksel *clks;
const struct clksel_rate *clkr; const struct clksel_rate *clkr;
u32 last_div = 0; u32 last_div = 0;
struct clk *parent;
unsigned long parent_rate;
const char *clk_name;
parent = __clk_get_parent(clk);
parent_rate = __clk_get_rate(parent);
clk_name = __clk_get_name(clk);
if (!clk->clksel || !clk->clksel_mask) if (!clk->clksel || !clk->clksel_mask)
return ~0; return ~0;
pr_debug("clock: clksel_round_rate_div: %s target_rate %ld\n", pr_debug("clock: clksel_round_rate_div: %s target_rate %ld\n",
clk->name, target_rate); clk_name, target_rate);
*new_div = 1; *new_div = 1;
clks = _get_clksel_by_parent(clk, clk->parent); clks = _get_clksel_by_parent(clk, parent);
if (!clks) if (!clks)
return ~0; return ~0;
...@@ -300,30 +312,29 @@ u32 omap2_clksel_round_rate_div(struct clk *clk, unsigned long target_rate, ...@@ -300,30 +312,29 @@ u32 omap2_clksel_round_rate_div(struct clk *clk, unsigned long target_rate,
/* Sanity check */ /* Sanity check */
if (clkr->div <= last_div) if (clkr->div <= last_div)
pr_err("clock: clksel_rate table not sorted " pr_err("clock: %s: clksel_rate table not sorted\n",
"for clock %s", clk->name); clk_name);
last_div = clkr->div; last_div = clkr->div;
test_rate = clk->parent->rate / clkr->div; test_rate = parent_rate / clkr->div;
if (test_rate <= target_rate) if (test_rate <= target_rate)
break; /* found it */ break; /* found it */
} }
if (!clkr->div) { if (!clkr->div) {
pr_err("clock: Could not find divisor for target " pr_err("clock: %s: could not find divisor for target rate %ld for parent %s\n",
"rate %ld for clock %s parent %s\n", target_rate, clk_name, target_rate, __clk_get_name(parent));
clk->name, clk->parent->name);
return ~0; return ~0;
} }
*new_div = clkr->div; *new_div = clkr->div;
pr_debug("clock: new_div = %d, new_rate = %ld\n", *new_div, pr_debug("clock: new_div = %d, new_rate = %ld\n", *new_div,
(clk->parent->rate / clkr->div)); (parent_rate / clkr->div));
return clk->parent->rate / clkr->div; return parent_rate / clkr->div;
} }
/* /*
...@@ -345,10 +356,15 @@ void omap2_init_clksel_parent(struct clk *clk) ...@@ -345,10 +356,15 @@ void omap2_init_clksel_parent(struct clk *clk)
const struct clksel *clks; const struct clksel *clks;
const struct clksel_rate *clkr; const struct clksel_rate *clkr;
u32 r, found = 0; u32 r, found = 0;
struct clk *parent;
const char *clk_name;
if (!clk->clksel || !clk->clksel_mask) if (!clk->clksel || !clk->clksel_mask)
return; return;
parent = __clk_get_parent(clk);
clk_name = __clk_get_name(clk);
r = __raw_readl(clk->clksel_reg) & clk->clksel_mask; r = __raw_readl(clk->clksel_reg) & clk->clksel_mask;
r >>= __ffs(clk->clksel_mask); r >>= __ffs(clk->clksel_mask);
...@@ -358,12 +374,14 @@ void omap2_init_clksel_parent(struct clk *clk) ...@@ -358,12 +374,14 @@ void omap2_init_clksel_parent(struct clk *clk)
continue; continue;
if (clkr->val == r) { if (clkr->val == r) {
if (clk->parent != clks->parent) { if (parent != clks->parent) {
pr_debug("clock: inited %s parent " pr_debug("clock: inited %s parent "
"to %s (was %s)\n", "to %s (was %s)\n",
clk->name, clks->parent->name, clk_name,
((clk->parent) ? __clk_get_name(clks->parent),
clk->parent->name : "NULL")); ((parent) ?
__clk_get_name(parent) :
"NULL"));
clk_reparent(clk, clks->parent); clk_reparent(clk, clks->parent);
}; };
found = 1; found = 1;
...@@ -373,7 +391,7 @@ void omap2_init_clksel_parent(struct clk *clk) ...@@ -373,7 +391,7 @@ void omap2_init_clksel_parent(struct clk *clk)
/* This indicates a data error */ /* This indicates a data error */
WARN(!found, "clock: %s: init parent: could not find regval %0x\n", WARN(!found, "clock: %s: init parent: could not find regval %0x\n",
clk->name, r); clk_name, r);
return; return;
} }
...@@ -391,15 +409,17 @@ unsigned long omap2_clksel_recalc(struct clk *clk) ...@@ -391,15 +409,17 @@ unsigned long omap2_clksel_recalc(struct clk *clk)
{ {
unsigned long rate; unsigned long rate;
u32 div = 0; u32 div = 0;
struct clk *parent;
div = _read_divisor(clk); div = _read_divisor(clk);
if (div == 0) if (div == 0)
return clk->rate; return __clk_get_rate(clk);
rate = clk->parent->rate / div; parent = __clk_get_parent(clk);
rate = __clk_get_rate(parent) / div;
pr_debug("clock: %s: recalc'd rate is %ld (div %d)\n", clk->name, pr_debug("clock: %s: recalc'd rate is %ld (div %d)\n",
rate, div); __clk_get_name(clk), rate, div);
return rate; return rate;
} }
...@@ -454,9 +474,10 @@ int omap2_clksel_set_rate(struct clk *clk, unsigned long rate) ...@@ -454,9 +474,10 @@ int omap2_clksel_set_rate(struct clk *clk, unsigned long rate)
_write_clksel_reg(clk, field_val); _write_clksel_reg(clk, field_val);
clk->rate = clk->parent->rate / new_div; clk->rate = __clk_get_rate(__clk_get_parent(clk)) / new_div;
pr_debug("clock: %s: set rate to %ld\n", clk->name, clk->rate); pr_debug("clock: %s: set rate to %ld\n", __clk_get_name(clk),
__clk_get_rate(clk));
return 0; return 0;
} }
...@@ -498,13 +519,15 @@ int omap2_clksel_set_parent(struct clk *clk, struct clk *new_parent) ...@@ -498,13 +519,15 @@ int omap2_clksel_set_parent(struct clk *clk, struct clk *new_parent)
clk_reparent(clk, new_parent); clk_reparent(clk, new_parent);
/* CLKSEL clocks follow their parents' rates, divided by a divisor */ /* CLKSEL clocks follow their parents' rates, divided by a divisor */
clk->rate = new_parent->rate; clk->rate = __clk_get_rate(new_parent);
if (parent_div > 0) if (parent_div > 0)
clk->rate /= parent_div; __clk_get_rate(clk) /= parent_div;
pr_debug("clock: %s: set parent to %s (new rate %ld)\n", pr_debug("clock: %s: set parent to %s (new rate %ld)\n",
clk->name, clk->parent->name, clk->rate); __clk_get_name(clk),
__clk_get_name(__clk_get_parent(clk)),
__clk_get_rate(clk));
return 0; return 0;
} }
...@@ -87,7 +87,7 @@ static int _dpll_test_fint(struct clk *clk, u8 n) ...@@ -87,7 +87,7 @@ static int _dpll_test_fint(struct clk *clk, u8 n)
dd = clk->dpll_data; dd = clk->dpll_data;
/* DPLL divider must result in a valid jitter correction val */ /* DPLL divider must result in a valid jitter correction val */
fint = clk->parent->rate / n; fint = __clk_get_rate(__clk_get_parent(clk)) / n;
if (cpu_is_omap24xx()) { if (cpu_is_omap24xx()) {
/* Should not be called for OMAP2, so warn if it is called */ /* Should not be called for OMAP2, so warn if it is called */
...@@ -252,16 +252,16 @@ u32 omap2_get_dpll_rate(struct clk *clk) ...@@ -252,16 +252,16 @@ u32 omap2_get_dpll_rate(struct clk *clk)
if (cpu_is_omap24xx()) { if (cpu_is_omap24xx()) {
if (v == OMAP2XXX_EN_DPLL_LPBYPASS || if (v == OMAP2XXX_EN_DPLL_LPBYPASS ||
v == OMAP2XXX_EN_DPLL_FRBYPASS) v == OMAP2XXX_EN_DPLL_FRBYPASS)
return dd->clk_bypass->rate; return __clk_get_rate(dd->clk_bypass);
} else if (cpu_is_omap34xx()) { } else if (cpu_is_omap34xx()) {
if (v == OMAP3XXX_EN_DPLL_LPBYPASS || if (v == OMAP3XXX_EN_DPLL_LPBYPASS ||
v == OMAP3XXX_EN_DPLL_FRBYPASS) v == OMAP3XXX_EN_DPLL_FRBYPASS)
return dd->clk_bypass->rate; return __clk_get_rate(dd->clk_bypass);
} else if (soc_is_am33xx() || cpu_is_omap44xx()) { } else if (soc_is_am33xx() || cpu_is_omap44xx()) {
if (v == OMAP4XXX_EN_DPLL_LPBYPASS || if (v == OMAP4XXX_EN_DPLL_LPBYPASS ||
v == OMAP4XXX_EN_DPLL_FRBYPASS || v == OMAP4XXX_EN_DPLL_FRBYPASS ||
v == OMAP4XXX_EN_DPLL_MNBYPASS) v == OMAP4XXX_EN_DPLL_MNBYPASS)
return dd->clk_bypass->rate; return __clk_get_rate(dd->clk_bypass);
} }
v = __raw_readl(dd->mult_div1_reg); v = __raw_readl(dd->mult_div1_reg);
...@@ -270,7 +270,7 @@ u32 omap2_get_dpll_rate(struct clk *clk) ...@@ -270,7 +270,7 @@ u32 omap2_get_dpll_rate(struct clk *clk)
dpll_div = v & dd->div1_mask; dpll_div = v & dd->div1_mask;
dpll_div >>= __ffs(dd->div1_mask); dpll_div >>= __ffs(dd->div1_mask);
dpll_clk = (long long)dd->clk_ref->rate * dpll_mult; dpll_clk = (long long) __clk_get_rate(dd->clk_ref) * dpll_mult;
do_div(dpll_clk, dpll_div + 1); do_div(dpll_clk, dpll_div + 1);
return dpll_clk; return dpll_clk;
...@@ -296,16 +296,20 @@ long omap2_dpll_round_rate(struct clk *clk, unsigned long target_rate) ...@@ -296,16 +296,20 @@ long omap2_dpll_round_rate(struct clk *clk, unsigned long target_rate)
unsigned long scaled_rt_rp; unsigned long scaled_rt_rp;
unsigned long new_rate = 0; unsigned long new_rate = 0;
struct dpll_data *dd; struct dpll_data *dd;
unsigned long ref_rate;
const char *clk_name;
if (!clk || !clk->dpll_data) if (!clk || !clk->dpll_data)
return ~0; return ~0;
dd = clk->dpll_data; dd = clk->dpll_data;
ref_rate = __clk_get_rate(dd->clk_ref);
clk_name = __clk_get_name(clk);
pr_debug("clock: %s: starting DPLL round_rate, target rate %ld\n", pr_debug("clock: %s: starting DPLL round_rate, target rate %ld\n",
clk->name, target_rate); clk_name, target_rate);
scaled_rt_rp = target_rate / (dd->clk_ref->rate / DPLL_SCALE_FACTOR); scaled_rt_rp = target_rate / (ref_rate / DPLL_SCALE_FACTOR);
scaled_max_m = dd->max_multiplier * DPLL_SCALE_FACTOR; scaled_max_m = dd->max_multiplier * DPLL_SCALE_FACTOR;
dd->last_rounded_rate = 0; dd->last_rounded_rate = 0;
...@@ -332,14 +336,14 @@ long omap2_dpll_round_rate(struct clk *clk, unsigned long target_rate) ...@@ -332,14 +336,14 @@ long omap2_dpll_round_rate(struct clk *clk, unsigned long target_rate)
break; break;
r = _dpll_test_mult(&m, n, &new_rate, target_rate, r = _dpll_test_mult(&m, n, &new_rate, target_rate,
dd->clk_ref->rate); ref_rate);
/* m can't be set low enough for this n - try with a larger n */ /* m can't be set low enough for this n - try with a larger n */
if (r == DPLL_MULT_UNDERFLOW) if (r == DPLL_MULT_UNDERFLOW)
continue; continue;
pr_debug("clock: %s: m = %d: n = %d: new_rate = %ld\n", pr_debug("clock: %s: m = %d: n = %d: new_rate = %ld\n",
clk->name, m, n, new_rate); clk_name, m, n, new_rate);
if (target_rate == new_rate) { if (target_rate == new_rate) {
dd->last_rounded_m = m; dd->last_rounded_m = m;
...@@ -350,8 +354,8 @@ long omap2_dpll_round_rate(struct clk *clk, unsigned long target_rate) ...@@ -350,8 +354,8 @@ long omap2_dpll_round_rate(struct clk *clk, unsigned long target_rate)
} }
if (target_rate != new_rate) { if (target_rate != new_rate) {
pr_debug("clock: %s: cannot round to rate %ld\n", clk->name, pr_debug("clock: %s: cannot round to rate %ld\n",
target_rate); clk_name, target_rate);
return ~0; return ~0;
} }
......
...@@ -78,7 +78,7 @@ static void _omap2_module_wait_ready(struct clk *clk) ...@@ -78,7 +78,7 @@ static void _omap2_module_wait_ready(struct clk *clk)
clk->ops->find_idlest(clk, &idlest_reg, &idlest_bit, &idlest_val); clk->ops->find_idlest(clk, &idlest_reg, &idlest_bit, &idlest_val);
omap2_cm_wait_idlest(idlest_reg, (1 << idlest_bit), idlest_val, omap2_cm_wait_idlest(idlest_reg, (1 << idlest_bit), idlest_val,
clk->name); __clk_get_name(clk));
} }
/* Public functions */ /* Public functions */
...@@ -94,18 +94,21 @@ static void _omap2_module_wait_ready(struct clk *clk) ...@@ -94,18 +94,21 @@ static void _omap2_module_wait_ready(struct clk *clk)
void omap2_init_clk_clkdm(struct clk *clk) void omap2_init_clk_clkdm(struct clk *clk)
{ {
struct clockdomain *clkdm; struct clockdomain *clkdm;
const char *clk_name;
if (!clk->clkdm_name) if (!clk->clkdm_name)
return; return;
clk_name = __clk_get_name(clk);
clkdm = clkdm_lookup(clk->clkdm_name); clkdm = clkdm_lookup(clk->clkdm_name);
if (clkdm) { if (clkdm) {
pr_debug("clock: associated clk %s to clkdm %s\n", pr_debug("clock: associated clk %s to clkdm %s\n",
clk->name, clk->clkdm_name); clk_name, clk->clkdm_name);
clk->clkdm = clkdm; clk->clkdm = clkdm;
} else { } else {
pr_debug("clock: could not associate clk %s to " pr_debug("clock: could not associate clk %s to clkdm %s\n",
"clkdm %s\n", clk->name, clk->clkdm_name); clk_name, clk->clkdm_name);
} }
} }
......
...@@ -63,8 +63,10 @@ static int _omap3_wait_dpll_status(struct clk *clk, u8 state) ...@@ -63,8 +63,10 @@ static int _omap3_wait_dpll_status(struct clk *clk, u8 state)
const struct dpll_data *dd; const struct dpll_data *dd;
int i = 0; int i = 0;
int ret = -EINVAL; int ret = -EINVAL;
const char *clk_name;
dd = clk->dpll_data; dd = clk->dpll_data;
clk_name = __clk_get_name(clk);
state <<= __ffs(dd->idlest_mask); state <<= __ffs(dd->idlest_mask);
...@@ -76,10 +78,10 @@ static int _omap3_wait_dpll_status(struct clk *clk, u8 state) ...@@ -76,10 +78,10 @@ static int _omap3_wait_dpll_status(struct clk *clk, u8 state)
if (i == MAX_DPLL_WAIT_TRIES) { if (i == MAX_DPLL_WAIT_TRIES) {
printk(KERN_ERR "clock: %s failed transition to '%s'\n", printk(KERN_ERR "clock: %s failed transition to '%s'\n",
clk->name, (state) ? "locked" : "bypassed"); clk_name, (state) ? "locked" : "bypassed");
} else { } else {
pr_debug("clock: %s transition to '%s' in %d loops\n", pr_debug("clock: %s transition to '%s' in %d loops\n",
clk->name, (state) ? "locked" : "bypassed", i); clk_name, (state) ? "locked" : "bypassed", i);
ret = 0; ret = 0;
} }
...@@ -93,7 +95,7 @@ static u16 _omap3_dpll_compute_freqsel(struct clk *clk, u8 n) ...@@ -93,7 +95,7 @@ static u16 _omap3_dpll_compute_freqsel(struct clk *clk, u8 n)
unsigned long fint; unsigned long fint;
u16 f = 0; u16 f = 0;
fint = clk->dpll_data->clk_ref->rate / n; fint = __clk_get_rate(clk->dpll_data->clk_ref) / n;
pr_debug("clock: fint is %lu\n", fint); pr_debug("clock: fint is %lu\n", fint);
...@@ -140,7 +142,7 @@ static int _omap3_noncore_dpll_lock(struct clk *clk) ...@@ -140,7 +142,7 @@ static int _omap3_noncore_dpll_lock(struct clk *clk)
u8 state = 1; u8 state = 1;
int r = 0; int r = 0;
pr_debug("clock: locking DPLL %s\n", clk->name); pr_debug("clock: locking DPLL %s\n", __clk_get_name(clk));
dd = clk->dpll_data; dd = clk->dpll_data;
state <<= __ffs(dd->idlest_mask); state <<= __ffs(dd->idlest_mask);
...@@ -187,7 +189,7 @@ static int _omap3_noncore_dpll_bypass(struct clk *clk) ...@@ -187,7 +189,7 @@ static int _omap3_noncore_dpll_bypass(struct clk *clk)
return -EINVAL; return -EINVAL;
pr_debug("clock: configuring DPLL %s for low-power bypass\n", pr_debug("clock: configuring DPLL %s for low-power bypass\n",
clk->name); __clk_get_name(clk));
ai = omap3_dpll_autoidle_read(clk); ai = omap3_dpll_autoidle_read(clk);
...@@ -217,7 +219,7 @@ static int _omap3_noncore_dpll_stop(struct clk *clk) ...@@ -217,7 +219,7 @@ static int _omap3_noncore_dpll_stop(struct clk *clk)
if (!(clk->dpll_data->modes & (1 << DPLL_LOW_POWER_STOP))) if (!(clk->dpll_data->modes & (1 << DPLL_LOW_POWER_STOP)))
return -EINVAL; return -EINVAL;
pr_debug("clock: stopping DPLL %s\n", clk->name); pr_debug("clock: stopping DPLL %s\n", __clk_get_name(clk));
ai = omap3_dpll_autoidle_read(clk); ai = omap3_dpll_autoidle_read(clk);
...@@ -245,7 +247,7 @@ static void _lookup_dco(struct clk *clk, u8 *dco, u16 m, u8 n) ...@@ -245,7 +247,7 @@ static void _lookup_dco(struct clk *clk, u8 *dco, u16 m, u8 n)
{ {
unsigned long fint, clkinp; /* watch out for overflow */ unsigned long fint, clkinp; /* watch out for overflow */
clkinp = clk->parent->rate; clkinp = __clk_get_rate(__clk_get_parent(clk));
fint = (clkinp / n) * m; fint = (clkinp / n) * m;
if (fint < 1000000000) if (fint < 1000000000)
...@@ -271,7 +273,7 @@ static void _lookup_sddiv(struct clk *clk, u8 *sd_div, u16 m, u8 n) ...@@ -271,7 +273,7 @@ static void _lookup_sddiv(struct clk *clk, u8 *sd_div, u16 m, u8 n)
unsigned long clkinp, sd; /* watch out for overflow */ unsigned long clkinp, sd; /* watch out for overflow */
int mod1, mod2; int mod1, mod2;
clkinp = clk->parent->rate; clkinp = __clk_get_rate(__clk_get_parent(clk));
/* /*
* target sigma-delta to near 250MHz * target sigma-delta to near 250MHz
...@@ -380,16 +382,19 @@ int omap3_noncore_dpll_enable(struct clk *clk) ...@@ -380,16 +382,19 @@ int omap3_noncore_dpll_enable(struct clk *clk)
{ {
int r; int r;
struct dpll_data *dd; struct dpll_data *dd;
struct clk *parent;
dd = clk->dpll_data; dd = clk->dpll_data;
if (!dd) if (!dd)
return -EINVAL; return -EINVAL;
if (clk->rate == dd->clk_bypass->rate) { parent = __clk_get_parent(clk);
WARN_ON(clk->parent != dd->clk_bypass);
if (__clk_get_rate(clk) == __clk_get_rate(dd->clk_bypass)) {
WARN_ON(parent != dd->clk_bypass);
r = _omap3_noncore_dpll_bypass(clk); r = _omap3_noncore_dpll_bypass(clk);
} else { } else {
WARN_ON(clk->parent != dd->clk_ref); WARN_ON(parent != dd->clk_ref);
r = _omap3_noncore_dpll_lock(clk); r = _omap3_noncore_dpll_lock(clk);
} }
/* /*
...@@ -432,7 +437,7 @@ void omap3_noncore_dpll_disable(struct clk *clk) ...@@ -432,7 +437,7 @@ void omap3_noncore_dpll_disable(struct clk *clk)
int omap3_noncore_dpll_set_rate(struct clk *clk, unsigned long rate) int omap3_noncore_dpll_set_rate(struct clk *clk, unsigned long rate)
{ {
struct clk *new_parent = NULL; struct clk *new_parent = NULL;
unsigned long hw_rate; unsigned long hw_rate, bypass_rate;
u16 freqsel = 0; u16 freqsel = 0;
struct dpll_data *dd; struct dpll_data *dd;
int ret; int ret;
...@@ -456,7 +461,8 @@ int omap3_noncore_dpll_set_rate(struct clk *clk, unsigned long rate) ...@@ -456,7 +461,8 @@ int omap3_noncore_dpll_set_rate(struct clk *clk, unsigned long rate)
omap2_clk_enable(dd->clk_bypass); omap2_clk_enable(dd->clk_bypass);
omap2_clk_enable(dd->clk_ref); omap2_clk_enable(dd->clk_ref);
if (dd->clk_bypass->rate == rate && bypass_rate = __clk_get_rate(dd->clk_bypass);
if (bypass_rate == rate &&
(clk->dpll_data->modes & (1 << DPLL_LOW_POWER_BYPASS))) { (clk->dpll_data->modes & (1 << DPLL_LOW_POWER_BYPASS))) {
pr_debug("clock: %s: set rate: entering bypass.\n", clk->name); pr_debug("clock: %s: set rate: entering bypass.\n", clk->name);
...@@ -479,7 +485,7 @@ int omap3_noncore_dpll_set_rate(struct clk *clk, unsigned long rate) ...@@ -479,7 +485,7 @@ int omap3_noncore_dpll_set_rate(struct clk *clk, unsigned long rate)
} }
pr_debug("clock: %s: set rate: locking rate to %lu.\n", pr_debug("clock: %s: set rate: locking rate to %lu.\n",
clk->name, rate); __clk_get_name(clk), rate);
ret = omap3_noncore_dpll_program(clk, dd->last_rounded_m, ret = omap3_noncore_dpll_program(clk, dd->last_rounded_m,
dd->last_rounded_n, freqsel); dd->last_rounded_n, freqsel);
...@@ -557,7 +563,7 @@ void omap3_dpll_allow_idle(struct clk *clk) ...@@ -557,7 +563,7 @@ void omap3_dpll_allow_idle(struct clk *clk)
if (!dd->autoidle_reg) { if (!dd->autoidle_reg) {
pr_debug("clock: DPLL %s: autoidle not supported\n", pr_debug("clock: DPLL %s: autoidle not supported\n",
clk->name); __clk_get_name(clk));
return; return;
} }
...@@ -591,7 +597,7 @@ void omap3_dpll_deny_idle(struct clk *clk) ...@@ -591,7 +597,7 @@ void omap3_dpll_deny_idle(struct clk *clk)
if (!dd->autoidle_reg) { if (!dd->autoidle_reg) {
pr_debug("clock: DPLL %s: autoidle not supported\n", pr_debug("clock: DPLL %s: autoidle not supported\n",
clk->name); __clk_get_name(clk));
return; return;
} }
...@@ -617,11 +623,12 @@ unsigned long omap3_clkoutx2_recalc(struct clk *clk) ...@@ -617,11 +623,12 @@ unsigned long omap3_clkoutx2_recalc(struct clk *clk)
unsigned long rate; unsigned long rate;
u32 v; u32 v;
struct clk *pclk; struct clk *pclk;
unsigned long parent_rate;
/* Walk up the parents of clk, looking for a DPLL */ /* Walk up the parents of clk, looking for a DPLL */
pclk = clk->parent; pclk = __clk_get_parent(clk);
while (pclk && !pclk->dpll_data) while (pclk && !pclk->dpll_data)
pclk = pclk->parent; pclk = __clk_get_parent(pclk);
/* clk does not have a DPLL as a parent? */ /* clk does not have a DPLL as a parent? */
WARN_ON(!pclk); WARN_ON(!pclk);
...@@ -630,12 +637,13 @@ unsigned long omap3_clkoutx2_recalc(struct clk *clk) ...@@ -630,12 +637,13 @@ unsigned long omap3_clkoutx2_recalc(struct clk *clk)
WARN_ON(!dd->enable_mask); WARN_ON(!dd->enable_mask);
parent_rate = __clk_get_rate(__clk_get_parent(clk));
v = __raw_readl(dd->control_reg) & dd->enable_mask; v = __raw_readl(dd->control_reg) & dd->enable_mask;
v >>= __ffs(dd->enable_mask); v >>= __ffs(dd->enable_mask);
if ((v != OMAP3XXX_EN_DPLL_LOCKED) || (dd->flags & DPLL_J_TYPE)) if ((v != OMAP3XXX_EN_DPLL_LOCKED) || (dd->flags & DPLL_J_TYPE))
rate = clk->parent->rate; rate = parent_rate;
else else
rate = clk->parent->rate * 2; rate = parent_rate * 2;
return rate; return rate;
} }
......
...@@ -697,7 +697,7 @@ static int _init_main_clk(struct omap_hwmod *oh) ...@@ -697,7 +697,7 @@ static int _init_main_clk(struct omap_hwmod *oh)
if (!oh->_clk->clkdm) if (!oh->_clk->clkdm)
pr_warning("omap_hwmod: %s: missing clockdomain for %s.\n", pr_warning("omap_hwmod: %s: missing clockdomain for %s.\n",
oh->main_clk, oh->_clk->name); oh->name, oh->main_clk);
return ret; return ret;
} }
...@@ -854,7 +854,7 @@ static void _enable_optional_clocks(struct omap_hwmod *oh) ...@@ -854,7 +854,7 @@ static void _enable_optional_clocks(struct omap_hwmod *oh)
for (i = oh->opt_clks_cnt, oc = oh->opt_clks; i > 0; i--, oc++) for (i = oh->opt_clks_cnt, oc = oh->opt_clks; i > 0; i--, oc++)
if (oc->_clk) { if (oc->_clk) {
pr_debug("omap_hwmod: enable %s:%s\n", oc->role, pr_debug("omap_hwmod: enable %s:%s\n", oc->role,
oc->_clk->name); __clk_get_name(oc->_clk));
clk_enable(oc->_clk); clk_enable(oc->_clk);
} }
} }
...@@ -869,7 +869,7 @@ static void _disable_optional_clocks(struct omap_hwmod *oh) ...@@ -869,7 +869,7 @@ static void _disable_optional_clocks(struct omap_hwmod *oh)
for (i = oh->opt_clks_cnt, oc = oh->opt_clks; i > 0; i--, oc++) for (i = oh->opt_clks_cnt, oc = oh->opt_clks; i > 0; i--, oc++)
if (oc->_clk) { if (oc->_clk) {
pr_debug("omap_hwmod: disable %s:%s\n", oc->role, pr_debug("omap_hwmod: disable %s:%s\n", oc->role,
oc->_clk->name); __clk_get_name(oc->_clk));
clk_disable(oc->_clk); clk_disable(oc->_clk);
} }
} }
......
...@@ -188,7 +188,7 @@ static int __init omap2_set_init_voltage(char *vdd_name, char *clk_name, ...@@ -188,7 +188,7 @@ static int __init omap2_set_init_voltage(char *vdd_name, char *clk_name,
goto exit; goto exit;
} }
freq = clk->rate; freq = clk_get_rate(clk);
clk_put(clk); clk_put(clk);
rcu_read_lock(); rcu_read_lock();
......
...@@ -19,6 +19,11 @@ struct module; ...@@ -19,6 +19,11 @@ struct module;
struct clk; struct clk;
struct clockdomain; struct clockdomain;
/* Temporary, needed during the common clock framework conversion */
#define __clk_get_name(clk) (clk->name)
#define __clk_get_parent(clk) (clk->parent)
#define __clk_get_rate(clk) (clk->rate)
/** /**
* struct clkops - some clock function pointers * struct clkops - some clock function pointers
* @enable: fn ptr that enables the current clock in hardware * @enable: fn ptr that enables the current clock in hardware
......
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