lkml.org 
[lkml]   [2018]   [Oct]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
SubjectRe: [PATCH RFC 1/2] clk: ti: add a usecount for autoidle
From
Date
On 04/10/18 08:51, Andreas Kemnade wrote:
> We have the scenario that first autoidle is disabled for all clocks,
> then it is disabled for selected ones and then enabled for all. So
> we should have some counting here, also according to the
> comment in _setup_iclk_autoidle()
>
> Signed-off-by: Andreas Kemnade <andreas@kemnade.info>
> ---
> drivers/clk/ti/autoidle.c | 20 ++++++++++++--------
> include/linux/clk/ti.h | 1 +
> 2 files changed, 13 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/clk/ti/autoidle.c b/drivers/clk/ti/autoidle.c
> index 7bb9afbe4058..be2ce42e4f33 100644
> --- a/drivers/clk/ti/autoidle.c
> +++ b/drivers/clk/ti/autoidle.c
> @@ -48,8 +48,11 @@ int omap2_clk_deny_idle(struct clk *clk)
> struct clk_hw_omap *c;
>
> c = to_clk_hw_omap(__clk_get_hw(clk));
> - if (c->ops && c->ops->deny_idle)
> - c->ops->deny_idle(c);
> + if (c->ops && c->ops->deny_idle) {
> + c->autoidle_count--;
> + if (c->autoidle_count == -1)
> + c->ops->deny_idle(c);

This code is racy as you have no locking in place. Please fix.

Also, this should be verified that it doesn't cause any PM regressions,
I hope you have done that?

-Tero

> + }
> return 0;
> }
>
> @@ -64,8 +67,11 @@ int omap2_clk_allow_idle(struct clk *clk)
> struct clk_hw_omap *c;
>
> c = to_clk_hw_omap(__clk_get_hw(clk));
> - if (c->ops && c->ops->allow_idle)
> - c->ops->allow_idle(c);
> + if (c->ops && c->ops->allow_idle) {
> + c->autoidle_count++;
> + if (c->autoidle_count == 0)
> + c->ops->allow_idle(c);
> + }
> return 0;
> }
>
> @@ -201,8 +207,7 @@ int omap2_clk_enable_autoidle_all(void)
> struct clk_hw_omap *c;
>
> list_for_each_entry(c, &clk_hw_omap_clocks, node)
> - if (c->ops && c->ops->allow_idle)
> - c->ops->allow_idle(c);
> + omap2_clk_allow_idle(c->hw.clk);
>
> _clk_generic_allow_autoidle_all();
>
> @@ -223,8 +228,7 @@ int omap2_clk_disable_autoidle_all(void)
> struct clk_hw_omap *c;
>
> list_for_each_entry(c, &clk_hw_omap_clocks, node)
> - if (c->ops && c->ops->deny_idle)
> - c->ops->deny_idle(c);
> + omap2_clk_deny_idle(c->hw.clk);
>
> _clk_generic_deny_autoidle_all();
>
> diff --git a/include/linux/clk/ti.h b/include/linux/clk/ti.h
> index a8faa38b1ed6..c460355419c0 100644
> --- a/include/linux/clk/ti.h
> +++ b/include/linux/clk/ti.h
> @@ -159,6 +159,7 @@ struct clk_hw_omap {
> const char *clkdm_name;
> struct clockdomain *clkdm;
> const struct clk_hw_omap_ops *ops;
> + int autoidle_count;
> };
>
> /*
>

--
Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki. Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki

\
 
 \ /
  Last update: 2018-10-04 16:41    [W:0.072 / U:0.264 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site