Skip to content

Commit 2e1a7b0

Browse files
Tero KristoPaul Walmsley
authored andcommitted
ARM: OMAP3+: DPLL: use determine_rate() and set_rate_and_parent()
Currently, DPLLs are hiding the gory details of switching parent within set_rate, which confuses the common clock code and is wrong. Fixed by applying the new determine_rate() and set_rate_and_parent() functionality to any clock-ops previously using the broken approach. This patch also removes the broken legacy code. Signed-off-by: Tero Kristo <t-kristo@ti.com> Signed-off-by: Paul Walmsley <paul@pwsan.com>
1 parent e3ab601 commit 2e1a7b0

File tree

3 files changed

+25
-92
lines changed

3 files changed

+25
-92
lines changed

arch/arm/mach-omap2/cclock3xxx_data.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,9 @@ static const struct clk_ops dpll1_ck_ops = {
257257
.get_parent = &omap2_init_dpll_parent,
258258
.recalc_rate = &omap3_dpll_recalc,
259259
.set_rate = &omap3_noncore_dpll_set_rate,
260+
.set_parent = &omap3_noncore_dpll_set_parent,
261+
.set_rate_and_parent = &omap3_noncore_dpll_set_rate_and_parent,
262+
.determine_rate = &omap3_noncore_dpll_determine_rate,
260263
.round_rate = &omap2_dpll_round_rate,
261264
};
262265

@@ -367,6 +370,9 @@ static const struct clk_ops dpll4_ck_ops = {
367370
.get_parent = &omap2_init_dpll_parent,
368371
.recalc_rate = &omap3_dpll_recalc,
369372
.set_rate = &omap3_dpll4_set_rate,
373+
.set_parent = &omap3_noncore_dpll_set_parent,
374+
.set_rate_and_parent = &omap3_dpll4_set_rate_and_parent,
375+
.determine_rate = &omap3_noncore_dpll_determine_rate,
370376
.round_rate = &omap2_dpll_round_rate,
371377
};
372378

arch/arm/mach-omap2/dpll3xxx.c

Lines changed: 4 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -459,93 +459,6 @@ void omap3_noncore_dpll_disable(struct clk_hw *hw)
459459

460460
/* Non-CORE DPLL rate set code */
461461

462-
/**
463-
* omap3_noncore_dpll_set_rate - set non-core DPLL rate
464-
* @clk: struct clk * of DPLL to set
465-
* @rate: rounded target rate
466-
*
467-
* Set the DPLL CLKOUT to the target rate. If the DPLL can enter
468-
* low-power bypass, and the target rate is the bypass source clock
469-
* rate, then configure the DPLL for bypass. Otherwise, round the
470-
* target rate if it hasn't been done already, then program and lock
471-
* the DPLL. Returns -EINVAL upon error, or 0 upon success.
472-
*/
473-
int omap3_noncore_dpll_set_rate(struct clk_hw *hw, unsigned long rate,
474-
unsigned long parent_rate)
475-
{
476-
struct clk_hw_omap *clk = to_clk_hw_omap(hw);
477-
struct clk *new_parent = NULL;
478-
unsigned long rrate;
479-
u16 freqsel = 0;
480-
struct dpll_data *dd;
481-
int ret;
482-
483-
if (!hw || !rate)
484-
return -EINVAL;
485-
486-
dd = clk->dpll_data;
487-
if (!dd)
488-
return -EINVAL;
489-
490-
if (__clk_get_rate(dd->clk_bypass) == rate &&
491-
(dd->modes & (1 << DPLL_LOW_POWER_BYPASS))) {
492-
pr_debug("%s: %s: set rate: entering bypass.\n",
493-
__func__, __clk_get_name(hw->clk));
494-
495-
__clk_prepare(dd->clk_bypass);
496-
clk_enable(dd->clk_bypass);
497-
ret = _omap3_noncore_dpll_bypass(clk);
498-
if (!ret)
499-
new_parent = dd->clk_bypass;
500-
clk_disable(dd->clk_bypass);
501-
__clk_unprepare(dd->clk_bypass);
502-
} else {
503-
__clk_prepare(dd->clk_ref);
504-
clk_enable(dd->clk_ref);
505-
506-
/* XXX this check is probably pointless in the CCF context */
507-
if (dd->last_rounded_rate != rate) {
508-
rrate = __clk_round_rate(hw->clk, rate);
509-
if (rrate != rate) {
510-
pr_warn("%s: %s: final rate %lu does not match desired rate %lu\n",
511-
__func__, __clk_get_name(hw->clk),
512-
rrate, rate);
513-
rate = rrate;
514-
}
515-
}
516-
517-
if (dd->last_rounded_rate == 0)
518-
return -EINVAL;
519-
520-
/* Freqsel is available only on OMAP343X devices */
521-
if (ti_clk_features.flags & TI_CLK_DPLL_HAS_FREQSEL) {
522-
freqsel = _omap3_dpll_compute_freqsel(clk,
523-
dd->last_rounded_n);
524-
WARN_ON(!freqsel);
525-
}
526-
527-
pr_debug("%s: %s: set rate: locking rate to %lu.\n",
528-
__func__, __clk_get_name(hw->clk), rate);
529-
530-
ret = omap3_noncore_dpll_program(clk, freqsel);
531-
if (!ret)
532-
new_parent = dd->clk_ref;
533-
clk_disable(dd->clk_ref);
534-
__clk_unprepare(dd->clk_ref);
535-
}
536-
/*
537-
* FIXME - this is all wrong. common code handles reparenting and
538-
* migrating prepare/enable counts. dplls should be a multiplexer
539-
* clock and this should be a set_parent operation so that all of that
540-
* stuff is inherited for free
541-
*/
542-
543-
if (!ret && clk_get_parent(hw->clk) != new_parent)
544-
__clk_reparent(hw->clk, new_parent);
545-
546-
return 0;
547-
}
548-
549462
/**
550463
* omap3_noncore_dpll_determine_rate - determine rate for a DPLL
551464
* @hw: pointer to the clock to determine rate for
@@ -611,7 +524,7 @@ int omap3_noncore_dpll_set_parent(struct clk_hw *hw, u8 index)
611524
}
612525

613526
/**
614-
* omap3_noncore_dpll_set_rate_new - set rate for a DPLL clock
527+
* omap3_noncore_dpll_set_rate - set rate for a DPLL clock
615528
* @hw: pointer to the clock to set parent for
616529
* @rate: target rate for the clock
617530
* @parent_rate: rate of the parent clock
@@ -621,9 +534,8 @@ int omap3_noncore_dpll_set_parent(struct clk_hw *hw, u8 index)
621534
* changed) and proceeds with the rate change operation. Returns 0
622535
* with success, negative error value otherwise.
623536
*/
624-
static int omap3_noncore_dpll_set_rate_new(struct clk_hw *hw,
625-
unsigned long rate,
626-
unsigned long parent_rate)
537+
int omap3_noncore_dpll_set_rate(struct clk_hw *hw, unsigned long rate,
538+
unsigned long parent_rate)
627539
{
628540
struct clk_hw_omap *clk = to_clk_hw_omap(hw);
629541
struct dpll_data *dd;
@@ -688,7 +600,7 @@ int omap3_noncore_dpll_set_rate_and_parent(struct clk_hw *hw,
688600
if (index)
689601
ret = omap3_noncore_dpll_set_parent(hw, index);
690602
else
691-
ret = omap3_noncore_dpll_set_rate_new(hw, rate, parent_rate);
603+
ret = omap3_noncore_dpll_set_rate(hw, rate, parent_rate);
692604

693605
return ret;
694606
}

drivers/clk/ti/dpll.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@ static const struct clk_ops dpll_m4xen_ck_ops = {
3333
.recalc_rate = &omap4_dpll_regm4xen_recalc,
3434
.round_rate = &omap4_dpll_regm4xen_round_rate,
3535
.set_rate = &omap3_noncore_dpll_set_rate,
36+
.set_parent = &omap3_noncore_dpll_set_parent,
37+
.set_rate_and_parent = &omap3_noncore_dpll_set_rate_and_parent,
38+
.determine_rate = &omap4_dpll_regm4xen_determine_rate,
3639
.get_parent = &omap2_init_dpll_parent,
3740
};
3841
#else
@@ -53,6 +56,9 @@ static const struct clk_ops dpll_ck_ops = {
5356
.recalc_rate = &omap3_dpll_recalc,
5457
.round_rate = &omap2_dpll_round_rate,
5558
.set_rate = &omap3_noncore_dpll_set_rate,
59+
.set_parent = &omap3_noncore_dpll_set_parent,
60+
.set_rate_and_parent = &omap3_noncore_dpll_set_rate_and_parent,
61+
.determine_rate = &omap3_noncore_dpll_determine_rate,
5662
.get_parent = &omap2_init_dpll_parent,
5763
};
5864

@@ -61,6 +67,9 @@ static const struct clk_ops dpll_no_gate_ck_ops = {
6167
.get_parent = &omap2_init_dpll_parent,
6268
.round_rate = &omap2_dpll_round_rate,
6369
.set_rate = &omap3_noncore_dpll_set_rate,
70+
.set_parent = &omap3_noncore_dpll_set_parent,
71+
.set_rate_and_parent = &omap3_noncore_dpll_set_rate_and_parent,
72+
.determine_rate = &omap3_noncore_dpll_determine_rate,
6473
};
6574
#else
6675
static const struct clk_ops dpll_core_ck_ops = {};
@@ -97,6 +106,9 @@ static const struct clk_ops omap3_dpll_ck_ops = {
97106
.get_parent = &omap2_init_dpll_parent,
98107
.recalc_rate = &omap3_dpll_recalc,
99108
.set_rate = &omap3_noncore_dpll_set_rate,
109+
.set_parent = &omap3_noncore_dpll_set_parent,
110+
.set_rate_and_parent = &omap3_noncore_dpll_set_rate_and_parent,
111+
.determine_rate = &omap3_noncore_dpll_determine_rate,
100112
.round_rate = &omap2_dpll_round_rate,
101113
};
102114

@@ -106,6 +118,9 @@ static const struct clk_ops omap3_dpll_per_ck_ops = {
106118
.get_parent = &omap2_init_dpll_parent,
107119
.recalc_rate = &omap3_dpll_recalc,
108120
.set_rate = &omap3_dpll4_set_rate,
121+
.set_parent = &omap3_noncore_dpll_set_parent,
122+
.set_rate_and_parent = &omap3_dpll4_set_rate_and_parent,
123+
.determine_rate = &omap3_noncore_dpll_determine_rate,
109124
.round_rate = &omap2_dpll_round_rate,
110125
};
111126
#endif

0 commit comments

Comments
 (0)