All of lore.kernel.org
 help / color / mirror / Atom feed
From: Peter Ujfalusi <peter.ujfalusi@ti.com>
To: Tony Lindgren <tony@atomide.com>,
	Michael Turquette <mturquette@baylibre.com>,
	Stephen Boyd <sboyd@codeaurora.org>
Cc: <linux-clk@vger.kernel.org>, <linux-omap@vger.kernel.org>,
	Brian Hutchinson <b.hutchman@gmail.com>,
	Felipe Balbi <balbi@ti.com>,
	Grygorii Strashko <grygorii.strashko@ti.com>,
	Nishanth Menon <nm@ti.com>,
	Russell King - ARM Linux <linux@arm.linux.org.uk>,
	Thomas Gleixner <tglx@linutronix.de>,
	Sekhar Nori <nsekhar@ti.com>
Subject: Re: [PATCH] clk: ti: Fix FAPLL udelay in clk_enable with clk_prepare
Date: Wed, 23 Sep 2015 09:12:59 +0300	[thread overview]
Message-ID: <560242EB.5070001@ti.com> (raw)
In-Reply-To: <1442956985-32642-1-git-send-email-tony@atomide.com>

Tony,

On 09/23/2015 12:23 AM, Tony Lindgren wrote:
> As recently pointed out (again) by Thomas and Russell, we must not
> wait in in clk_enable. The wait for PLL to lock needs to happen
> in clk_prepare instead.
> 
> It seems this is a common copy paste error with the PLL drivers,
> and similar fixes should be applied to other PLL drivers after
> testing.

One thing to note:
because of how the hwmod code works, at boot time we prepare all clocks for
the devices and in runtime the hwmod only uses clk_enable/disable, it will
never unprepare the clock(s). This will means that these clocks will be
enabled all the time and will never turned off.

-- 
Péter

> Cc: Brian Hutchinson <b.hutchman@gmail.com>
> Cc: Felipe Balbi <balbi@ti.com>
> Cc: Grygorii Strashko <grygorii.strashko@ti.com>
> Cc: Nishanth Menon <nm@ti.com>
> Cc: Russell King - ARM Linux <linux@arm.linux.org.uk>
> Cc: Thomas Gleixner <tglx@linutronix.de>
> Cc: Sekhar Nori <nsekhar@ti.com>
> Signed-off-by: Tony Lindgren <tony@atomide.com>
> ---
>  drivers/clk/ti/fapll.c | 18 +++++++++---------
>  1 file changed, 9 insertions(+), 9 deletions(-)
> 
> diff --git a/drivers/clk/ti/fapll.c b/drivers/clk/ti/fapll.c
> index f4b2e98..e1db74a 100644
> --- a/drivers/clk/ti/fapll.c
> +++ b/drivers/clk/ti/fapll.c
> @@ -37,7 +37,7 @@
>  #define FAPLL_PWD_OFFSET	4
>  
>  #define MAX_FAPLL_OUTPUTS	7
> -#define FAPLL_MAX_RETRIES	1000
> +#define FAPLL_MAX_RETRIES	5
>  
>  #define to_fapll(_hw)		container_of(_hw, struct fapll_data, hw)
>  #define to_synth(_hw)		container_of(_hw, struct fapll_synth, hw)
> @@ -126,7 +126,7 @@ static int ti_fapll_wait_lock(struct fapll_data *fd)
>  		if (retries-- <= 0)
>  			break;
>  
> -		udelay(1);
> +		usleep_range(200, 300);
>  	}
>  
>  	pr_err("%s failed to lock\n", fd->name);
> @@ -134,7 +134,7 @@ static int ti_fapll_wait_lock(struct fapll_data *fd)
>  	return -ETIMEDOUT;
>  }
>  
> -static int ti_fapll_enable(struct clk_hw *hw)
> +static int ti_fapll_prepare(struct clk_hw *hw)
>  {
>  	struct fapll_data *fd = to_fapll(hw);
>  	u32 v = readl_relaxed(fd->base);
> @@ -146,7 +146,7 @@ static int ti_fapll_enable(struct clk_hw *hw)
>  	return 0;
>  }
>  
> -static void ti_fapll_disable(struct clk_hw *hw)
> +static void ti_fapll_unprepare(struct clk_hw *hw)
>  {
>  	struct fapll_data *fd = to_fapll(hw);
>  	u32 v = readl_relaxed(fd->base);
> @@ -155,7 +155,7 @@ static void ti_fapll_disable(struct clk_hw *hw)
>  	writel_relaxed(v, fd->base);
>  }
>  
> -static int ti_fapll_is_enabled(struct clk_hw *hw)
> +static int ti_fapll_is_prepared(struct clk_hw *hw)
>  {
>  	struct fapll_data *fd = to_fapll(hw);
>  	u32 v = readl_relaxed(fd->base);
> @@ -261,7 +261,7 @@ static int ti_fapll_set_rate(struct clk_hw *hw, unsigned long rate,
>  	v |= pre_div_p << FAPLL_MAIN_DIV_P_SHIFT;
>  	v |= mult_n << FAPLL_MAIN_MULT_N_SHIFT;
>  	writel_relaxed(v, fd->base);
> -	if (ti_fapll_is_enabled(hw))
> +	if (ti_fapll_is_prepared(hw))
>  		ti_fapll_wait_lock(fd);
>  	ti_fapll_clear_bypass(fd);
>  
> @@ -269,9 +269,9 @@ static int ti_fapll_set_rate(struct clk_hw *hw, unsigned long rate,
>  }
>  
>  static struct clk_ops ti_fapll_ops = {
> -	.enable = ti_fapll_enable,
> -	.disable = ti_fapll_disable,
> -	.is_enabled = ti_fapll_is_enabled,
> +	.prepare = ti_fapll_prepare,
> +	.unprepare = ti_fapll_unprepare,
> +	.is_prepared = ti_fapll_is_prepared,
>  	.recalc_rate = ti_fapll_recalc_rate,
>  	.get_parent = ti_fapll_get_parent,
>  	.round_rate = ti_fapll_round_rate,
> 

WARNING: multiple messages have this Message-ID (diff)
From: Peter Ujfalusi <peter.ujfalusi@ti.com>
To: Tony Lindgren <tony@atomide.com>,
	Michael Turquette <mturquette@baylibre.com>,
	Stephen Boyd <sboyd@codeaurora.org>
Cc: linux-clk@vger.kernel.org, linux-omap@vger.kernel.org,
	Brian Hutchinson <b.hutchman@gmail.com>,
	Felipe Balbi <balbi@ti.com>,
	Grygorii Strashko <grygorii.strashko@ti.com>,
	Nishanth Menon <nm@ti.com>,
	Russell King - ARM Linux <linux@arm.linux.org.uk>,
	Thomas Gleixner <tglx@linutronix.de>,
	Sekhar Nori <nsekhar@ti.com>
Subject: Re: [PATCH] clk: ti: Fix FAPLL udelay in clk_enable with clk_prepare
Date: Wed, 23 Sep 2015 09:12:59 +0300	[thread overview]
Message-ID: <560242EB.5070001@ti.com> (raw)
In-Reply-To: <1442956985-32642-1-git-send-email-tony@atomide.com>

Tony,

On 09/23/2015 12:23 AM, Tony Lindgren wrote:
> As recently pointed out (again) by Thomas and Russell, we must not
> wait in in clk_enable. The wait for PLL to lock needs to happen
> in clk_prepare instead.
> 
> It seems this is a common copy paste error with the PLL drivers,
> and similar fixes should be applied to other PLL drivers after
> testing.

One thing to note:
because of how the hwmod code works, at boot time we prepare all clocks for
the devices and in runtime the hwmod only uses clk_enable/disable, it will
never unprepare the clock(s). This will means that these clocks will be
enabled all the time and will never turned off.

-- 
Péter

> Cc: Brian Hutchinson <b.hutchman@gmail.com>
> Cc: Felipe Balbi <balbi@ti.com>
> Cc: Grygorii Strashko <grygorii.strashko@ti.com>
> Cc: Nishanth Menon <nm@ti.com>
> Cc: Russell King - ARM Linux <linux@arm.linux.org.uk>
> Cc: Thomas Gleixner <tglx@linutronix.de>
> Cc: Sekhar Nori <nsekhar@ti.com>
> Signed-off-by: Tony Lindgren <tony@atomide.com>
> ---
>  drivers/clk/ti/fapll.c | 18 +++++++++---------
>  1 file changed, 9 insertions(+), 9 deletions(-)
> 
> diff --git a/drivers/clk/ti/fapll.c b/drivers/clk/ti/fapll.c
> index f4b2e98..e1db74a 100644
> --- a/drivers/clk/ti/fapll.c
> +++ b/drivers/clk/ti/fapll.c
> @@ -37,7 +37,7 @@
>  #define FAPLL_PWD_OFFSET	4
>  
>  #define MAX_FAPLL_OUTPUTS	7
> -#define FAPLL_MAX_RETRIES	1000
> +#define FAPLL_MAX_RETRIES	5
>  
>  #define to_fapll(_hw)		container_of(_hw, struct fapll_data, hw)
>  #define to_synth(_hw)		container_of(_hw, struct fapll_synth, hw)
> @@ -126,7 +126,7 @@ static int ti_fapll_wait_lock(struct fapll_data *fd)
>  		if (retries-- <= 0)
>  			break;
>  
> -		udelay(1);
> +		usleep_range(200, 300);
>  	}
>  
>  	pr_err("%s failed to lock\n", fd->name);
> @@ -134,7 +134,7 @@ static int ti_fapll_wait_lock(struct fapll_data *fd)
>  	return -ETIMEDOUT;
>  }
>  
> -static int ti_fapll_enable(struct clk_hw *hw)
> +static int ti_fapll_prepare(struct clk_hw *hw)
>  {
>  	struct fapll_data *fd = to_fapll(hw);
>  	u32 v = readl_relaxed(fd->base);
> @@ -146,7 +146,7 @@ static int ti_fapll_enable(struct clk_hw *hw)
>  	return 0;
>  }
>  
> -static void ti_fapll_disable(struct clk_hw *hw)
> +static void ti_fapll_unprepare(struct clk_hw *hw)
>  {
>  	struct fapll_data *fd = to_fapll(hw);
>  	u32 v = readl_relaxed(fd->base);
> @@ -155,7 +155,7 @@ static void ti_fapll_disable(struct clk_hw *hw)
>  	writel_relaxed(v, fd->base);
>  }
>  
> -static int ti_fapll_is_enabled(struct clk_hw *hw)
> +static int ti_fapll_is_prepared(struct clk_hw *hw)
>  {
>  	struct fapll_data *fd = to_fapll(hw);
>  	u32 v = readl_relaxed(fd->base);
> @@ -261,7 +261,7 @@ static int ti_fapll_set_rate(struct clk_hw *hw, unsigned long rate,
>  	v |= pre_div_p << FAPLL_MAIN_DIV_P_SHIFT;
>  	v |= mult_n << FAPLL_MAIN_MULT_N_SHIFT;
>  	writel_relaxed(v, fd->base);
> -	if (ti_fapll_is_enabled(hw))
> +	if (ti_fapll_is_prepared(hw))
>  		ti_fapll_wait_lock(fd);
>  	ti_fapll_clear_bypass(fd);
>  
> @@ -269,9 +269,9 @@ static int ti_fapll_set_rate(struct clk_hw *hw, unsigned long rate,
>  }
>  
>  static struct clk_ops ti_fapll_ops = {
> -	.enable = ti_fapll_enable,
> -	.disable = ti_fapll_disable,
> -	.is_enabled = ti_fapll_is_enabled,
> +	.prepare = ti_fapll_prepare,
> +	.unprepare = ti_fapll_unprepare,
> +	.is_prepared = ti_fapll_is_prepared,
>  	.recalc_rate = ti_fapll_recalc_rate,
>  	.get_parent = ti_fapll_get_parent,
>  	.round_rate = ti_fapll_round_rate,
> 



  parent reply	other threads:[~2015-09-23  6:12 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-09-22 21:23 [PATCH] clk: ti: Fix FAPLL udelay in clk_enable with clk_prepare Tony Lindgren
2015-09-22 21:26 ` Russell King - ARM Linux
2015-09-23  6:12 ` Peter Ujfalusi [this message]
2015-09-23  6:12   ` Peter Ujfalusi
2015-09-23 15:38   ` Tony Lindgren

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=560242EB.5070001@ti.com \
    --to=peter.ujfalusi@ti.com \
    --cc=b.hutchman@gmail.com \
    --cc=balbi@ti.com \
    --cc=grygorii.strashko@ti.com \
    --cc=linux-clk@vger.kernel.org \
    --cc=linux-omap@vger.kernel.org \
    --cc=linux@arm.linux.org.uk \
    --cc=mturquette@baylibre.com \
    --cc=nm@ti.com \
    --cc=nsekhar@ti.com \
    --cc=sboyd@codeaurora.org \
    --cc=tglx@linutronix.de \
    --cc=tony@atomide.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.