ARM: OMAP4: PM: Add init api for DPLL nodes
An api at init for all dpll nodes seem to be needed to reparent the dpll clk node to its bypass clk in case the dpll is in bypass. If not done this causes sequencing issues at init during propogate_rate. Signed-off-by: Rajendra Nayak <rnayak@ti.com> Signed-off-by: Paul Walmsley <paul@pwsan.com> Cc: Benoit Cousson <b-cousson@ti.com>
This commit is contained in:
parent
16975a79c8
commit
911bd7395c
3 changed files with 41 additions and 1 deletions
|
@ -70,9 +70,41 @@
|
||||||
u8 cpu_mask;
|
u8 cpu_mask;
|
||||||
|
|
||||||
/*-------------------------------------------------------------------------
|
/*-------------------------------------------------------------------------
|
||||||
* OMAP2/3 specific clock functions
|
* OMAP2/3/4 specific clock functions
|
||||||
*-------------------------------------------------------------------------*/
|
*-------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
void omap2_init_dpll_parent(struct clk *clk)
|
||||||
|
{
|
||||||
|
u32 v;
|
||||||
|
struct dpll_data *dd;
|
||||||
|
|
||||||
|
dd = clk->dpll_data;
|
||||||
|
if (!dd)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* Return bypass rate if DPLL is bypassed */
|
||||||
|
v = __raw_readl(dd->control_reg);
|
||||||
|
v &= dd->enable_mask;
|
||||||
|
v >>= __ffs(dd->enable_mask);
|
||||||
|
|
||||||
|
/* Reparent in case the dpll is in bypass */
|
||||||
|
if (cpu_is_omap24xx()) {
|
||||||
|
if (v == OMAP2XXX_EN_DPLL_LPBYPASS ||
|
||||||
|
v == OMAP2XXX_EN_DPLL_FRBYPASS)
|
||||||
|
clk_reparent(clk, dd->clk_bypass);
|
||||||
|
} else if (cpu_is_omap34xx()) {
|
||||||
|
if (v == OMAP3XXX_EN_DPLL_LPBYPASS ||
|
||||||
|
v == OMAP3XXX_EN_DPLL_FRBYPASS)
|
||||||
|
clk_reparent(clk, dd->clk_bypass);
|
||||||
|
} else if (cpu_is_omap44xx()) {
|
||||||
|
if (v == OMAP4XXX_EN_DPLL_LPBYPASS ||
|
||||||
|
v == OMAP4XXX_EN_DPLL_FRBYPASS ||
|
||||||
|
v == OMAP4XXX_EN_DPLL_MNBYPASS)
|
||||||
|
clk_reparent(clk, dd->clk_bypass);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* _omap2xxx_clk_commit - commit clock parent/rate changes in hardware
|
* _omap2xxx_clk_commit - commit clock parent/rate changes in hardware
|
||||||
* @clk: struct clk *
|
* @clk: struct clk *
|
||||||
|
|
|
@ -82,6 +82,7 @@ unsigned long omap2_fixed_divisor_recalc(struct clk *clk);
|
||||||
long omap2_clksel_round_rate(struct clk *clk, unsigned long target_rate);
|
long omap2_clksel_round_rate(struct clk *clk, unsigned long target_rate);
|
||||||
int omap2_clksel_set_rate(struct clk *clk, unsigned long rate);
|
int omap2_clksel_set_rate(struct clk *clk, unsigned long rate);
|
||||||
u32 omap2_get_dpll_rate(struct clk *clk);
|
u32 omap2_get_dpll_rate(struct clk *clk);
|
||||||
|
void omap2_init_dpll_parent(struct clk *clk);
|
||||||
int omap2_wait_clock_ready(void __iomem *reg, u32 cval, const char *name);
|
int omap2_wait_clock_ready(void __iomem *reg, u32 cval, const char *name);
|
||||||
void omap2_clk_prepare_for_reboot(void);
|
void omap2_clk_prepare_for_reboot(void);
|
||||||
int omap2_dflt_clk_enable(struct clk *clk);
|
int omap2_dflt_clk_enable(struct clk *clk);
|
||||||
|
|
|
@ -278,6 +278,7 @@ static struct clk dpll_abe_ck = {
|
||||||
.name = "dpll_abe_ck",
|
.name = "dpll_abe_ck",
|
||||||
.parent = &abe_dpll_refclk_mux_ck,
|
.parent = &abe_dpll_refclk_mux_ck,
|
||||||
.dpll_data = &dpll_abe_dd,
|
.dpll_data = &dpll_abe_dd,
|
||||||
|
.init = &omap2_init_dpll_parent,
|
||||||
.ops = &clkops_noncore_dpll_ops,
|
.ops = &clkops_noncore_dpll_ops,
|
||||||
.recalc = &omap3_dpll_recalc,
|
.recalc = &omap3_dpll_recalc,
|
||||||
.round_rate = &omap2_dpll_round_rate,
|
.round_rate = &omap2_dpll_round_rate,
|
||||||
|
@ -439,6 +440,7 @@ static struct clk dpll_core_ck = {
|
||||||
.name = "dpll_core_ck",
|
.name = "dpll_core_ck",
|
||||||
.parent = &dpll_sys_ref_clk,
|
.parent = &dpll_sys_ref_clk,
|
||||||
.dpll_data = &dpll_core_dd,
|
.dpll_data = &dpll_core_dd,
|
||||||
|
.init = &omap2_init_dpll_parent,
|
||||||
.ops = &clkops_null,
|
.ops = &clkops_null,
|
||||||
.recalc = &omap3_dpll_recalc,
|
.recalc = &omap3_dpll_recalc,
|
||||||
.flags = CLOCK_IN_OMAP4430,
|
.flags = CLOCK_IN_OMAP4430,
|
||||||
|
@ -665,6 +667,7 @@ static struct clk dpll_iva_ck = {
|
||||||
.name = "dpll_iva_ck",
|
.name = "dpll_iva_ck",
|
||||||
.parent = &dpll_sys_ref_clk,
|
.parent = &dpll_sys_ref_clk,
|
||||||
.dpll_data = &dpll_iva_dd,
|
.dpll_data = &dpll_iva_dd,
|
||||||
|
.init = &omap2_init_dpll_parent,
|
||||||
.ops = &clkops_noncore_dpll_ops,
|
.ops = &clkops_noncore_dpll_ops,
|
||||||
.recalc = &omap3_dpll_recalc,
|
.recalc = &omap3_dpll_recalc,
|
||||||
.round_rate = &omap2_dpll_round_rate,
|
.round_rate = &omap2_dpll_round_rate,
|
||||||
|
@ -727,6 +730,7 @@ static struct clk dpll_mpu_ck = {
|
||||||
.name = "dpll_mpu_ck",
|
.name = "dpll_mpu_ck",
|
||||||
.parent = &dpll_sys_ref_clk,
|
.parent = &dpll_sys_ref_clk,
|
||||||
.dpll_data = &dpll_mpu_dd,
|
.dpll_data = &dpll_mpu_dd,
|
||||||
|
.init = &omap2_init_dpll_parent,
|
||||||
.ops = &clkops_noncore_dpll_ops,
|
.ops = &clkops_noncore_dpll_ops,
|
||||||
.recalc = &omap3_dpll_recalc,
|
.recalc = &omap3_dpll_recalc,
|
||||||
.round_rate = &omap2_dpll_round_rate,
|
.round_rate = &omap2_dpll_round_rate,
|
||||||
|
@ -802,6 +806,7 @@ static struct clk dpll_per_ck = {
|
||||||
.name = "dpll_per_ck",
|
.name = "dpll_per_ck",
|
||||||
.parent = &dpll_sys_ref_clk,
|
.parent = &dpll_sys_ref_clk,
|
||||||
.dpll_data = &dpll_per_dd,
|
.dpll_data = &dpll_per_dd,
|
||||||
|
.init = &omap2_init_dpll_parent,
|
||||||
.ops = &clkops_noncore_dpll_ops,
|
.ops = &clkops_noncore_dpll_ops,
|
||||||
.recalc = &omap3_dpll_recalc,
|
.recalc = &omap3_dpll_recalc,
|
||||||
.round_rate = &omap2_dpll_round_rate,
|
.round_rate = &omap2_dpll_round_rate,
|
||||||
|
@ -924,6 +929,7 @@ static struct clk dpll_unipro_ck = {
|
||||||
.name = "dpll_unipro_ck",
|
.name = "dpll_unipro_ck",
|
||||||
.parent = &dpll_sys_ref_clk,
|
.parent = &dpll_sys_ref_clk,
|
||||||
.dpll_data = &dpll_unipro_dd,
|
.dpll_data = &dpll_unipro_dd,
|
||||||
|
.init = &omap2_init_dpll_parent,
|
||||||
.ops = &clkops_noncore_dpll_ops,
|
.ops = &clkops_noncore_dpll_ops,
|
||||||
.recalc = &omap3_dpll_recalc,
|
.recalc = &omap3_dpll_recalc,
|
||||||
.round_rate = &omap2_dpll_round_rate,
|
.round_rate = &omap2_dpll_round_rate,
|
||||||
|
@ -981,6 +987,7 @@ static struct clk dpll_usb_ck = {
|
||||||
.name = "dpll_usb_ck",
|
.name = "dpll_usb_ck",
|
||||||
.parent = &dpll_sys_ref_clk,
|
.parent = &dpll_sys_ref_clk,
|
||||||
.dpll_data = &dpll_usb_dd,
|
.dpll_data = &dpll_usb_dd,
|
||||||
|
.init = &omap2_init_dpll_parent,
|
||||||
.ops = &clkops_noncore_dpll_ops,
|
.ops = &clkops_noncore_dpll_ops,
|
||||||
.recalc = &omap3_dpll_recalc,
|
.recalc = &omap3_dpll_recalc,
|
||||||
.round_rate = &omap2_dpll_round_rate,
|
.round_rate = &omap2_dpll_round_rate,
|
||||||
|
|
Loading…
Reference in a new issue