Re: [PATCH 01/11] ARM: omap: clk: add clk_prepare and clk_unprepare
On Friday 22 June 2012 11:12 PM, Pankaj Jangra wrote: diff --git a/arch/arm/mach-omap2/display.c b/arch/arm/mach-omap2/display.c > index 5fb47a1..e5f8e48 100644 > --- a/arch/arm/mach-omap2/display.c > +++ b/arch/arm/mach-omap2/display.c > @@ -471,7 +471,7 @@ int omap_dss_reset(struct omap_hwmod *oh) > > for (i = oh->opt_clks_cnt, oc = oh->opt_clks; i> 0; i--, oc++) > if (oc->_clk) > - clk_enable(oc->_clk); > + clk_prepare_enable(oc->_clk); > > dispc_disable_outputs(); > > @@ -498,7 +498,7 @@ int omap_dss_reset(struct omap_hwmod *oh) > > for (i = oh->opt_clks_cnt, oc = oh->opt_clks; i> 0; i--, oc++) > if (oc->_clk) > - clk_disable(oc->_clk); > + clk_disable_unprepare(oc->_clk); > Just a doubt. Isn't it the same clocks you are preparing in omap_hwmod.c ? Yes, but different users can and should prepare and enable clocks independently, and hence the framework does usecounting to keep track. > r = (c == MAX_MODULE_SOFTRESET_WAIT) ? -ETIMEDOUT : 0; > d> diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c > index bf86f7e..2746bce 100644 > --- a/arch/arm/mach-omap2/omap_hwmod.c > +++ b/arch/arm/mach-omap2/omap_hwmod.c > @@ -608,6 +608,7 @@ static int _init_main_clk(struct omap_hwmod *oh) > oh->name, oh->main_clk); > return -EINVAL; > } > + clk_prepare(oh->_clk); > > if (!oh->_clk->clkdm) > pr_warning("omap_hwmod: %s: missing clockdomain for %s.\n", > @@ -644,6 +645,7 @@ static int _init_interface_clks(struct omap_hwmod *oh) > oh->name, os->clk); > ret = -EINVAL; > } > + clk_prepare(os->_clk); > os->_clk = c; You should do clk_prepare() after os->_clk = c statement. Otherwise you are operating on a uninitialized structure pointer. yes, that was really stupid of me :(. Thanks for catching this. > } > > @@ -671,6 +673,7 @@ static int _init_opt_clks(struct omap_hwmod *oh) > oh->name, oc->clk); > ret = -EINVAL; > } > + clk_prepare(oc->_clk); Same here. You are preparing the uninitialized clk structure. Thanks, will fix. -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH 01/11] ARM: omap: clk: add clk_prepare and clk_unprepare
Hi, On Fri, Jun 22, 2012 at 7:18 PM, Rajendra Nayak wrote: > As part of Common Clk Framework (CCF) the clk_enable() operation > was split into a clk_prepare() which could sleep, and a clk_enable() > which should never sleep. Similarly the clk_disable() was > split into clk_disable() and clk_unprepare(). This was > needed to handle complex cases where in a clk gate/ungate > would require a slow and a fast part to be implemented. > None of the clocks below seem to be in the 'complex' clocks > category and are just simple clocks which are enabled/disabled > through simple register writes. > Most of the instances also seem to be called in non-atomic > context which means its safe to move all of those from > using a clk_enable() to clk_prepare_enable() and clk_disable() to > clk_disable_unprepare(). > For a few others where there is a possibility they get called from > an interrupt or atomic context, there is an additonal clk_prepare() > done immediately following a clk_get() and a clk_unprepare() > immediately preceding the clk_put(). > This is in preparation of OMAP moving to CCF. > > Based on initial changes from Mike turquette. > > Signed-off-by: Rajendra Nayak > --- > arch/arm/mach-omap2/board-apollon.c | 4 ++-- > arch/arm/mach-omap2/board-h4.c | 6 +++--- > arch/arm/mach-omap2/board-omap4panda.c | 2 +- > arch/arm/mach-omap2/clock3xxx.c | 8 > arch/arm/mach-omap2/display.c | 4 ++-- > arch/arm/mach-omap2/gpmc.c | 2 +- > arch/arm/mach-omap2/omap_hwmod.c | 3 +++ > arch/arm/mach-omap2/omap_phy_internal.c | 3 +++ > arch/arm/mach-omap2/pm24xx.c | 2 ++ > arch/arm/mach-omap2/usb-fs.c | 4 ++-- > 10 files changed, 23 insertions(+), 15 deletions(-) > > } > > diff --git a/arch/arm/mach-omap2/display.c b/arch/arm/mach-omap2/display.c > index 5fb47a1..e5f8e48 100644 > --- a/arch/arm/mach-omap2/display.c > +++ b/arch/arm/mach-omap2/display.c > @@ -471,7 +471,7 @@ int omap_dss_reset(struct omap_hwmod *oh) > > for (i = oh->opt_clks_cnt, oc = oh->opt_clks; i > 0; i--, oc++) > if (oc->_clk) > - clk_enable(oc->_clk); > + clk_prepare_enable(oc->_clk); > > dispc_disable_outputs(); > > @@ -498,7 +498,7 @@ int omap_dss_reset(struct omap_hwmod *oh) > > for (i = oh->opt_clks_cnt, oc = oh->opt_clks; i > 0; i--, oc++) > if (oc->_clk) > - clk_disable(oc->_clk); > + clk_disable_unprepare(oc->_clk); > Just a doubt. Isn't it the same clocks you are preparing in omap_hwmod.c ? > r = (c == MAX_MODULE_SOFTRESET_WAIT) ? -ETIMEDOUT : 0; > d> diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c > index bf86f7e..2746bce 100644 > --- a/arch/arm/mach-omap2/omap_hwmod.c > +++ b/arch/arm/mach-omap2/omap_hwmod.c > @@ -608,6 +608,7 @@ static int _init_main_clk(struct omap_hwmod *oh) > oh->name, oh->main_clk); > return -EINVAL; > } > + clk_prepare(oh->_clk); > > if (!oh->_clk->clkdm) > pr_warning("omap_hwmod: %s: missing clockdomain for %s.\n", > @@ -644,6 +645,7 @@ static int _init_interface_clks(struct omap_hwmod *oh) > oh->name, os->clk); > ret = -EINVAL; > } > + clk_prepare(os->_clk); > os->_clk = c; You should do clk_prepare() after os->_clk = c statement. Otherwise you are operating on a uninitialized structure pointer. > } > > @@ -671,6 +673,7 @@ static int _init_opt_clks(struct omap_hwmod *oh) > oh->name, oc->clk); > ret = -EINVAL; > } > + clk_prepare(oc->_clk); Same here. You are preparing the uninitialized clk structure. > oc->_clk = c; > } > d -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH 01/11] ARM: omap: clk: add clk_prepare and clk_unprepare
As part of Common Clk Framework (CCF) the clk_enable() operation was split into a clk_prepare() which could sleep, and a clk_enable() which should never sleep. Similarly the clk_disable() was split into clk_disable() and clk_unprepare(). This was needed to handle complex cases where in a clk gate/ungate would require a slow and a fast part to be implemented. None of the clocks below seem to be in the 'complex' clocks category and are just simple clocks which are enabled/disabled through simple register writes. Most of the instances also seem to be called in non-atomic context which means its safe to move all of those from using a clk_enable() to clk_prepare_enable() and clk_disable() to clk_disable_unprepare(). For a few others where there is a possibility they get called from an interrupt or atomic context, there is an additonal clk_prepare() done immediately following a clk_get() and a clk_unprepare() immediately preceding the clk_put(). This is in preparation of OMAP moving to CCF. Based on initial changes from Mike turquette. Signed-off-by: Rajendra Nayak --- arch/arm/mach-omap2/board-apollon.c |4 ++-- arch/arm/mach-omap2/board-h4.c |6 +++--- arch/arm/mach-omap2/board-omap4panda.c |2 +- arch/arm/mach-omap2/clock3xxx.c |8 arch/arm/mach-omap2/display.c |4 ++-- arch/arm/mach-omap2/gpmc.c |2 +- arch/arm/mach-omap2/omap_hwmod.c|3 +++ arch/arm/mach-omap2/omap_phy_internal.c |3 +++ arch/arm/mach-omap2/pm24xx.c|2 ++ arch/arm/mach-omap2/usb-fs.c|4 ++-- 10 files changed, 23 insertions(+), 15 deletions(-) diff --git a/arch/arm/mach-omap2/board-apollon.c b/arch/arm/mach-omap2/board-apollon.c index 502c31e..1d8c693 100644 --- a/arch/arm/mach-omap2/board-apollon.c +++ b/arch/arm/mach-omap2/board-apollon.c @@ -205,7 +205,7 @@ static inline void __init apollon_init_smc91x(void) return; } - clk_enable(gpmc_fck); + clk_prepare_enable(gpmc_fck); rate = clk_get_rate(gpmc_fck); eth_cs = APOLLON_ETH_CS; @@ -249,7 +249,7 @@ static inline void __init apollon_init_smc91x(void) gpmc_cs_free(APOLLON_ETH_CS); } out: - clk_disable(gpmc_fck); + clk_disable_unprepare(gpmc_fck); clk_put(gpmc_fck); } diff --git a/arch/arm/mach-omap2/board-h4.c b/arch/arm/mach-omap2/board-h4.c index 876becf..a273af0 100644 --- a/arch/arm/mach-omap2/board-h4.c +++ b/arch/arm/mach-omap2/board-h4.c @@ -267,9 +267,9 @@ static inline void __init h4_init_debug(void) return; } - clk_enable(gpmc_fck); + clk_prepare_enable(gpmc_fck); rate = clk_get_rate(gpmc_fck); - clk_disable(gpmc_fck); + clk_disable_unprepare(gpmc_fck); clk_put(gpmc_fck); if (is_gpmc_muxed()) @@ -313,7 +313,7 @@ static inline void __init h4_init_debug(void) gpmc_cs_free(eth_cs); out: - clk_disable(gpmc_fck); + clk_disable_unprepare(gpmc_fck); clk_put(gpmc_fck); } diff --git a/arch/arm/mach-omap2/board-omap4panda.c b/arch/arm/mach-omap2/board-omap4panda.c index 982fb26..f0ea558 100644 --- a/arch/arm/mach-omap2/board-omap4panda.c +++ b/arch/arm/mach-omap2/board-omap4panda.c @@ -172,7 +172,7 @@ static void __init omap4_ehci_init(void) return; } clk_set_rate(phy_ref_clk, 1920); - clk_enable(phy_ref_clk); + clk_prepare_enable(phy_ref_clk); /* disable the power to the usb hub prior to init and reset phy+hub */ ret = gpio_request_array(panda_ehci_gpios, diff --git a/arch/arm/mach-omap2/clock3xxx.c b/arch/arm/mach-omap2/clock3xxx.c index 794d827..4c1591a 100644 --- a/arch/arm/mach-omap2/clock3xxx.c +++ b/arch/arm/mach-omap2/clock3xxx.c @@ -64,15 +64,15 @@ void __init omap3_clk_lock_dpll5(void) dpll5_clk = clk_get(NULL, "dpll5_ck"); clk_set_rate(dpll5_clk, DPLL5_FREQ_FOR_USBHOST); - clk_enable(dpll5_clk); + clk_prepare_enable(dpll5_clk); /* Program dpll5_m2_clk divider for no division */ dpll5_m2_clk = clk_get(NULL, "dpll5_m2_ck"); - clk_enable(dpll5_m2_clk); + clk_prepare_enable(dpll5_m2_clk); clk_set_rate(dpll5_m2_clk, DPLL5_FREQ_FOR_USBHOST); - clk_disable(dpll5_m2_clk); - clk_disable(dpll5_clk); + clk_disable_unprepare(dpll5_m2_clk); + clk_disable_unprepare(dpll5_clk); return; } diff --git a/arch/arm/mach-omap2/display.c b/arch/arm/mach-omap2/display.c index 5fb47a1..e5f8e48 100644 --- a/arch/arm/mach-omap2/display.c +++ b/arch/arm/mach-omap2/display.c @@ -471,7 +471,7 @@ int omap_dss_reset(struct omap_hwmod *oh) for (i = oh->opt_clks_cnt, oc = oh->opt_clks; i > 0; i--, oc++) if (oc->_clk) - clk_enable(oc->_clk); + clk_prepare_enable(oc->_clk); dispc_disable_outputs(); @@ -498,7 +498,7 @@ i