diff options
Diffstat (limited to 'arch/arm/mach-omap2/dpll3xxx.c')
-rw-r--r-- | arch/arm/mach-omap2/dpll3xxx.c | 48 |
1 files changed, 28 insertions, 20 deletions
diff --git a/arch/arm/mach-omap2/dpll3xxx.c b/arch/arm/mach-omap2/dpll3xxx.c index f48043dbac8a..02e74c1e62cf 100644 --- a/arch/arm/mach-omap2/dpll3xxx.c +++ b/arch/arm/mach-omap2/dpll3xxx.c | |||
@@ -63,8 +63,10 @@ static int _omap3_wait_dpll_status(struct clk *clk, u8 state) | |||
63 | const struct dpll_data *dd; | 63 | const struct dpll_data *dd; |
64 | int i = 0; | 64 | int i = 0; |
65 | int ret = -EINVAL; | 65 | int ret = -EINVAL; |
66 | const char *clk_name; | ||
66 | 67 | ||
67 | dd = clk->dpll_data; | 68 | dd = clk->dpll_data; |
69 | clk_name = __clk_get_name(clk); | ||
68 | 70 | ||
69 | state <<= __ffs(dd->idlest_mask); | 71 | state <<= __ffs(dd->idlest_mask); |
70 | 72 | ||
@@ -76,10 +78,10 @@ static int _omap3_wait_dpll_status(struct clk *clk, u8 state) | |||
76 | 78 | ||
77 | if (i == MAX_DPLL_WAIT_TRIES) { | 79 | if (i == MAX_DPLL_WAIT_TRIES) { |
78 | printk(KERN_ERR "clock: %s failed transition to '%s'\n", | 80 | printk(KERN_ERR "clock: %s failed transition to '%s'\n", |
79 | clk->name, (state) ? "locked" : "bypassed"); | 81 | clk_name, (state) ? "locked" : "bypassed"); |
80 | } else { | 82 | } else { |
81 | pr_debug("clock: %s transition to '%s' in %d loops\n", | 83 | pr_debug("clock: %s transition to '%s' in %d loops\n", |
82 | clk->name, (state) ? "locked" : "bypassed", i); | 84 | clk_name, (state) ? "locked" : "bypassed", i); |
83 | 85 | ||
84 | ret = 0; | 86 | ret = 0; |
85 | } | 87 | } |
@@ -93,7 +95,7 @@ static u16 _omap3_dpll_compute_freqsel(struct clk *clk, u8 n) | |||
93 | unsigned long fint; | 95 | unsigned long fint; |
94 | u16 f = 0; | 96 | u16 f = 0; |
95 | 97 | ||
96 | fint = clk->dpll_data->clk_ref->rate / n; | 98 | fint = __clk_get_rate(clk->dpll_data->clk_ref) / n; |
97 | 99 | ||
98 | pr_debug("clock: fint is %lu\n", fint); | 100 | pr_debug("clock: fint is %lu\n", fint); |
99 | 101 | ||
@@ -140,7 +142,7 @@ static int _omap3_noncore_dpll_lock(struct clk *clk) | |||
140 | u8 state = 1; | 142 | u8 state = 1; |
141 | int r = 0; | 143 | int r = 0; |
142 | 144 | ||
143 | pr_debug("clock: locking DPLL %s\n", clk->name); | 145 | pr_debug("clock: locking DPLL %s\n", __clk_get_name(clk)); |
144 | 146 | ||
145 | dd = clk->dpll_data; | 147 | dd = clk->dpll_data; |
146 | state <<= __ffs(dd->idlest_mask); | 148 | state <<= __ffs(dd->idlest_mask); |
@@ -187,7 +189,7 @@ static int _omap3_noncore_dpll_bypass(struct clk *clk) | |||
187 | return -EINVAL; | 189 | return -EINVAL; |
188 | 190 | ||
189 | pr_debug("clock: configuring DPLL %s for low-power bypass\n", | 191 | pr_debug("clock: configuring DPLL %s for low-power bypass\n", |
190 | clk->name); | 192 | __clk_get_name(clk)); |
191 | 193 | ||
192 | ai = omap3_dpll_autoidle_read(clk); | 194 | ai = omap3_dpll_autoidle_read(clk); |
193 | 195 | ||
@@ -217,7 +219,7 @@ static int _omap3_noncore_dpll_stop(struct clk *clk) | |||
217 | if (!(clk->dpll_data->modes & (1 << DPLL_LOW_POWER_STOP))) | 219 | if (!(clk->dpll_data->modes & (1 << DPLL_LOW_POWER_STOP))) |
218 | return -EINVAL; | 220 | return -EINVAL; |
219 | 221 | ||
220 | pr_debug("clock: stopping DPLL %s\n", clk->name); | 222 | pr_debug("clock: stopping DPLL %s\n", __clk_get_name(clk)); |
221 | 223 | ||
222 | ai = omap3_dpll_autoidle_read(clk); | 224 | ai = omap3_dpll_autoidle_read(clk); |
223 | 225 | ||
@@ -245,7 +247,7 @@ static void _lookup_dco(struct clk *clk, u8 *dco, u16 m, u8 n) | |||
245 | { | 247 | { |
246 | unsigned long fint, clkinp; /* watch out for overflow */ | 248 | unsigned long fint, clkinp; /* watch out for overflow */ |
247 | 249 | ||
248 | clkinp = clk->parent->rate; | 250 | clkinp = __clk_get_rate(__clk_get_parent(clk)); |
249 | fint = (clkinp / n) * m; | 251 | fint = (clkinp / n) * m; |
250 | 252 | ||
251 | if (fint < 1000000000) | 253 | if (fint < 1000000000) |
@@ -271,7 +273,7 @@ static void _lookup_sddiv(struct clk *clk, u8 *sd_div, u16 m, u8 n) | |||
271 | unsigned long clkinp, sd; /* watch out for overflow */ | 273 | unsigned long clkinp, sd; /* watch out for overflow */ |
272 | int mod1, mod2; | 274 | int mod1, mod2; |
273 | 275 | ||
274 | clkinp = clk->parent->rate; | 276 | clkinp = __clk_get_rate(__clk_get_parent(clk)); |
275 | 277 | ||
276 | /* | 278 | /* |
277 | * target sigma-delta to near 250MHz | 279 | * target sigma-delta to near 250MHz |
@@ -380,16 +382,19 @@ int omap3_noncore_dpll_enable(struct clk *clk) | |||
380 | { | 382 | { |
381 | int r; | 383 | int r; |
382 | struct dpll_data *dd; | 384 | struct dpll_data *dd; |
385 | struct clk *parent; | ||
383 | 386 | ||
384 | dd = clk->dpll_data; | 387 | dd = clk->dpll_data; |
385 | if (!dd) | 388 | if (!dd) |
386 | return -EINVAL; | 389 | return -EINVAL; |
387 | 390 | ||
388 | if (clk->rate == dd->clk_bypass->rate) { | 391 | parent = __clk_get_parent(clk); |
389 | WARN_ON(clk->parent != dd->clk_bypass); | 392 | |
393 | if (__clk_get_rate(clk) == __clk_get_rate(dd->clk_bypass)) { | ||
394 | WARN_ON(parent != dd->clk_bypass); | ||
390 | r = _omap3_noncore_dpll_bypass(clk); | 395 | r = _omap3_noncore_dpll_bypass(clk); |
391 | } else { | 396 | } else { |
392 | WARN_ON(clk->parent != dd->clk_ref); | 397 | WARN_ON(parent != dd->clk_ref); |
393 | r = _omap3_noncore_dpll_lock(clk); | 398 | r = _omap3_noncore_dpll_lock(clk); |
394 | } | 399 | } |
395 | /* | 400 | /* |
@@ -432,7 +437,7 @@ void omap3_noncore_dpll_disable(struct clk *clk) | |||
432 | int omap3_noncore_dpll_set_rate(struct clk *clk, unsigned long rate) | 437 | int omap3_noncore_dpll_set_rate(struct clk *clk, unsigned long rate) |
433 | { | 438 | { |
434 | struct clk *new_parent = NULL; | 439 | struct clk *new_parent = NULL; |
435 | unsigned long hw_rate; | 440 | unsigned long hw_rate, bypass_rate; |
436 | u16 freqsel = 0; | 441 | u16 freqsel = 0; |
437 | struct dpll_data *dd; | 442 | struct dpll_data *dd; |
438 | int ret; | 443 | int ret; |
@@ -456,7 +461,8 @@ int omap3_noncore_dpll_set_rate(struct clk *clk, unsigned long rate) | |||
456 | omap2_clk_enable(dd->clk_bypass); | 461 | omap2_clk_enable(dd->clk_bypass); |
457 | omap2_clk_enable(dd->clk_ref); | 462 | omap2_clk_enable(dd->clk_ref); |
458 | 463 | ||
459 | if (dd->clk_bypass->rate == rate && | 464 | bypass_rate = __clk_get_rate(dd->clk_bypass); |
465 | if (bypass_rate == rate && | ||
460 | (clk->dpll_data->modes & (1 << DPLL_LOW_POWER_BYPASS))) { | 466 | (clk->dpll_data->modes & (1 << DPLL_LOW_POWER_BYPASS))) { |
461 | pr_debug("clock: %s: set rate: entering bypass.\n", clk->name); | 467 | pr_debug("clock: %s: set rate: entering bypass.\n", clk->name); |
462 | 468 | ||
@@ -479,7 +485,7 @@ int omap3_noncore_dpll_set_rate(struct clk *clk, unsigned long rate) | |||
479 | } | 485 | } |
480 | 486 | ||
481 | pr_debug("clock: %s: set rate: locking rate to %lu.\n", | 487 | pr_debug("clock: %s: set rate: locking rate to %lu.\n", |
482 | clk->name, rate); | 488 | __clk_get_name(clk), rate); |
483 | 489 | ||
484 | ret = omap3_noncore_dpll_program(clk, dd->last_rounded_m, | 490 | ret = omap3_noncore_dpll_program(clk, dd->last_rounded_m, |
485 | dd->last_rounded_n, freqsel); | 491 | dd->last_rounded_n, freqsel); |
@@ -557,7 +563,7 @@ void omap3_dpll_allow_idle(struct clk *clk) | |||
557 | 563 | ||
558 | if (!dd->autoidle_reg) { | 564 | if (!dd->autoidle_reg) { |
559 | pr_debug("clock: DPLL %s: autoidle not supported\n", | 565 | pr_debug("clock: DPLL %s: autoidle not supported\n", |
560 | clk->name); | 566 | __clk_get_name(clk)); |
561 | return; | 567 | return; |
562 | } | 568 | } |
563 | 569 | ||
@@ -591,7 +597,7 @@ void omap3_dpll_deny_idle(struct clk *clk) | |||
591 | 597 | ||
592 | if (!dd->autoidle_reg) { | 598 | if (!dd->autoidle_reg) { |
593 | pr_debug("clock: DPLL %s: autoidle not supported\n", | 599 | pr_debug("clock: DPLL %s: autoidle not supported\n", |
594 | clk->name); | 600 | __clk_get_name(clk)); |
595 | return; | 601 | return; |
596 | } | 602 | } |
597 | 603 | ||
@@ -617,11 +623,12 @@ unsigned long omap3_clkoutx2_recalc(struct clk *clk) | |||
617 | unsigned long rate; | 623 | unsigned long rate; |
618 | u32 v; | 624 | u32 v; |
619 | struct clk *pclk; | 625 | struct clk *pclk; |
626 | unsigned long parent_rate; | ||
620 | 627 | ||
621 | /* Walk up the parents of clk, looking for a DPLL */ | 628 | /* Walk up the parents of clk, looking for a DPLL */ |
622 | pclk = clk->parent; | 629 | pclk = __clk_get_parent(clk); |
623 | while (pclk && !pclk->dpll_data) | 630 | while (pclk && !pclk->dpll_data) |
624 | pclk = pclk->parent; | 631 | pclk = __clk_get_parent(pclk); |
625 | 632 | ||
626 | /* clk does not have a DPLL as a parent? */ | 633 | /* clk does not have a DPLL as a parent? */ |
627 | WARN_ON(!pclk); | 634 | WARN_ON(!pclk); |
@@ -630,12 +637,13 @@ unsigned long omap3_clkoutx2_recalc(struct clk *clk) | |||
630 | 637 | ||
631 | WARN_ON(!dd->enable_mask); | 638 | WARN_ON(!dd->enable_mask); |
632 | 639 | ||
640 | parent_rate = __clk_get_rate(__clk_get_parent(clk)); | ||
633 | v = __raw_readl(dd->control_reg) & dd->enable_mask; | 641 | v = __raw_readl(dd->control_reg) & dd->enable_mask; |
634 | v >>= __ffs(dd->enable_mask); | 642 | v >>= __ffs(dd->enable_mask); |
635 | if ((v != OMAP3XXX_EN_DPLL_LOCKED) || (dd->flags & DPLL_J_TYPE)) | 643 | if ((v != OMAP3XXX_EN_DPLL_LOCKED) || (dd->flags & DPLL_J_TYPE)) |
636 | rate = clk->parent->rate; | 644 | rate = parent_rate; |
637 | else | 645 | else |
638 | rate = clk->parent->rate * 2; | 646 | rate = parent_rate * 2; |
639 | return rate; | 647 | return rate; |
640 | } | 648 | } |
641 | 649 | ||