[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <d3119268-2716-c5e6-5ed8-28495f597fb0@ti.com>
Date: Thu, 4 Oct 2018 17:40:06 +0300
From: Tero Kristo <t-kristo@...com>
To: Andreas Kemnade <andreas@...nade.info>, <mturquette@...libre.com>,
<sboyd@...nel.org>, <linux-omap@...r.kernel.org>,
<linux-clk@...r.kernel.org>, <linux-kernel@...r.kernel.org>,
<paul@...an.com>, <tony@...mide.com>,
<letux-kernel@...nphoenux.org>
Subject: Re: [PATCH RFC 1/2] clk: ti: add a usecount for autoidle
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@...nade.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
Powered by blists - more mailing lists