Re: [PATCH 01/11] ARM: omap: clk: add clk_prepare and clk_unprepare

2012-06-24 Thread Rajendra Nayak

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

2012-06-22 Thread Pankaj Jangra
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

2012-06-22 Thread Rajendra Nayak
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