All of lore.kernel.org
 help / color / mirror / Atom feed
From: sboyd@codeaurora.org (Stephen Boyd)
To: linus-amlogic@lists.infradead.org
Subject: [PATCH v3 03/10] clk: rework calls to round and determine rate callbacks
Date: Tue, 11 Jul 2017 18:49:17 -0700	[thread overview]
Message-ID: <20170712014917.GT22780@codeaurora.org> (raw)
In-Reply-To: <20170612194438.12298-4-jbrunet@baylibre.com>

On 06/12, Jerome Brunet wrote:
> Rework the way the callbacks round_rate and determine_rate are called. The
> goal is to do this at a single point and make it easier to add conditions
> before calling them.

This should also say that now we check the rate returned by
determine_rate ops against the min/max rates so that we don't
exceed the limits?

> 
> This rework is done to ease the integration of "protected" clock
> functionality.
> 
> Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
> ---
>  drivers/clk/clk.c | 78 +++++++++++++++++++++++++++++++------------------------
>  1 file changed, 44 insertions(+), 34 deletions(-)
> 
> diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c
> index dceaf0ff23db..8cc4672414be 100644
> --- a/drivers/clk/clk.c
> +++ b/drivers/clk/clk.c
> @@ -833,16 +833,34 @@ static int clk_disable_unused(void)
>  }
>  late_initcall_sync(clk_disable_unused);
>  
> -static int clk_core_round_rate_nolock(struct clk_core *core,
> -				      struct clk_rate_request *req)
> +static int clk_core_determine_round(struct clk_core *core,
> +				    struct clk_rate_request *req)
>  {
> -	struct clk_core *parent;
>  	long rate;
>  
> -	lockdep_assert_held(&prepare_lock);

Best to leave this in place for clk_core_determine_round().

> +	if (core->ops->determine_rate) {
> +		return core->ops->determine_rate(core->hw, req);
> +	} else if (core->ops->round_rate) {
> +		rate = core->ops->round_rate(core->hw, req->rate,
> +					     &req->best_parent_rate);
> +		if (rate < 0)
> +			return rate;
>  
> -	if (!core)
> -		return 0;
> +		req->rate = rate;
> +	} else {
> +		return -EINVAL;
> +	}
> +
> +	return 0;
> +}
> +
> +static void clk_core_init_rate_req(struct clk_core *core,

Can core be const?

> +				   struct clk_rate_request *req)
> +{
> +	struct clk_core *parent;
> +
> +	if (WARN_ON(!core || !req))
> +		return;
>  
>  	parent = core->parent;
>  	if (parent) {
> @@ -852,22 +870,24 @@ static int clk_core_round_rate_nolock(struct clk_core *core,
>  		req->best_parent_hw = NULL;
>  		req->best_parent_rate = 0;
>  	}
> +}
>  
> -	if (core->ops->determine_rate) {
> -		return core->ops->determine_rate(core->hw, req);
> -	} else if (core->ops->round_rate) {
> -		rate = core->ops->round_rate(core->hw, req->rate,
> -					     &req->best_parent_rate);
> -		if (rate < 0)
> -			return rate;
> +static int clk_core_round_rate_nolock(struct clk_core *core,
> +				      struct clk_rate_request *req)
> +{
> +	lockdep_assert_held(&prepare_lock);
>  
> -		req->rate = rate;
> -	} else if (core->flags & CLK_SET_RATE_PARENT) {
> -		return clk_core_round_rate_nolock(parent, req);
> -	} else {
> -		req->rate = core->rate;
> -	}
> +	if (!core)
> +		return 0;
> +
> +	clk_core_init_rate_req(core, req);
> +
> +	if (core->ops->determine_rate || core->ops->round_rate)
> +		return clk_core_determine_round(core, req);
> +	else if (core->flags & CLK_SET_RATE_PARENT)
> +		return clk_core_round_rate_nolock(core->parent, req);
>  
> +	req->rate = core->rate;
>  	return 0;
>  }
>  
> @@ -1356,36 +1376,26 @@ static struct clk_core *clk_calc_new_rates(struct clk_core *core,
>  	clk_core_get_boundaries(core, &min_rate, &max_rate);
>  
>  	/* find the closest rate and parent clk/rate */
> -	if (core->ops->determine_rate) {
> +	if (core->ops->determine_rate || core->ops->round_rate) {

This is the second time we check this, maybe another function for
clk_core_can_round(core) is in order?

>  		struct clk_rate_request req;
>  
>  		req.rate = rate;
>  		req.min_rate = min_rate;
>  		req.max_rate = max_rate;
> -		if (parent) {
> -			req.best_parent_hw = parent->hw;
> -			req.best_parent_rate = parent->rate;
> -		} else {
> -			req.best_parent_hw = NULL;
> -			req.best_parent_rate = 0;
> -		}
>  
> -		ret = core->ops->determine_rate(core->hw, &req);
> +		clk_core_init_rate_req(core, &req);
> +
> +		ret = clk_core_determine_round(core, &req);
>  		if (ret < 0)
>  			return NULL;
>  
>  		best_parent_rate = req.best_parent_rate;
>  		new_rate = req.rate;
>  		parent = req.best_parent_hw ? req.best_parent_hw->core : NULL;
> -	} else if (core->ops->round_rate) {
> -		ret = core->ops->round_rate(core->hw, rate,
> -					    &best_parent_rate);
> -		if (ret < 0)
> -			return NULL;
>  
> -		new_rate = ret;
>  		if (new_rate < min_rate || new_rate > max_rate)
>  			return NULL;
> +

Nitpick: Kill this newline.

-- 
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
a Linux Foundation Collaborative Project

WARNING: multiple messages have this Message-ID (diff)
From: Stephen Boyd <sboyd@codeaurora.org>
To: Jerome Brunet <jbrunet@baylibre.com>
Cc: Michael Turquette <mturquette@baylibre.com>,
	linux-clk@vger.kernel.org, Kevin Hilman <khilman@baylibre.com>,
	linux-amlogic@lists.infradead.org,
	Russell King <linux@armlinux.org.uk>,
	Linus Walleij <linus.walleij@linaro.org>,
	Boris Brezillon <boris.brezillon@free-electrons.com>
Subject: Re: [PATCH v3 03/10] clk: rework calls to round and determine rate callbacks
Date: Tue, 11 Jul 2017 18:49:17 -0700	[thread overview]
Message-ID: <20170712014917.GT22780@codeaurora.org> (raw)
In-Reply-To: <20170612194438.12298-4-jbrunet@baylibre.com>

On 06/12, Jerome Brunet wrote:
> Rework the way the callbacks round_rate and determine_rate are called. The
> goal is to do this at a single point and make it easier to add conditions
> before calling them.

This should also say that now we check the rate returned by
determine_rate ops against the min/max rates so that we don't
exceed the limits?

> 
> This rework is done to ease the integration of "protected" clock
> functionality.
> 
> Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
> ---
>  drivers/clk/clk.c | 78 +++++++++++++++++++++++++++++++------------------------
>  1 file changed, 44 insertions(+), 34 deletions(-)
> 
> diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c
> index dceaf0ff23db..8cc4672414be 100644
> --- a/drivers/clk/clk.c
> +++ b/drivers/clk/clk.c
> @@ -833,16 +833,34 @@ static int clk_disable_unused(void)
>  }
>  late_initcall_sync(clk_disable_unused);
>  
> -static int clk_core_round_rate_nolock(struct clk_core *core,
> -				      struct clk_rate_request *req)
> +static int clk_core_determine_round(struct clk_core *core,
> +				    struct clk_rate_request *req)
>  {
> -	struct clk_core *parent;
>  	long rate;
>  
> -	lockdep_assert_held(&prepare_lock);

Best to leave this in place for clk_core_determine_round().

> +	if (core->ops->determine_rate) {
> +		return core->ops->determine_rate(core->hw, req);
> +	} else if (core->ops->round_rate) {
> +		rate = core->ops->round_rate(core->hw, req->rate,
> +					     &req->best_parent_rate);
> +		if (rate < 0)
> +			return rate;
>  
> -	if (!core)
> -		return 0;
> +		req->rate = rate;
> +	} else {
> +		return -EINVAL;
> +	}
> +
> +	return 0;
> +}
> +
> +static void clk_core_init_rate_req(struct clk_core *core,

Can core be const?

> +				   struct clk_rate_request *req)
> +{
> +	struct clk_core *parent;
> +
> +	if (WARN_ON(!core || !req))
> +		return;
>  
>  	parent = core->parent;
>  	if (parent) {
> @@ -852,22 +870,24 @@ static int clk_core_round_rate_nolock(struct clk_core *core,
>  		req->best_parent_hw = NULL;
>  		req->best_parent_rate = 0;
>  	}
> +}
>  
> -	if (core->ops->determine_rate) {
> -		return core->ops->determine_rate(core->hw, req);
> -	} else if (core->ops->round_rate) {
> -		rate = core->ops->round_rate(core->hw, req->rate,
> -					     &req->best_parent_rate);
> -		if (rate < 0)
> -			return rate;
> +static int clk_core_round_rate_nolock(struct clk_core *core,
> +				      struct clk_rate_request *req)
> +{
> +	lockdep_assert_held(&prepare_lock);
>  
> -		req->rate = rate;
> -	} else if (core->flags & CLK_SET_RATE_PARENT) {
> -		return clk_core_round_rate_nolock(parent, req);
> -	} else {
> -		req->rate = core->rate;
> -	}
> +	if (!core)
> +		return 0;
> +
> +	clk_core_init_rate_req(core, req);
> +
> +	if (core->ops->determine_rate || core->ops->round_rate)
> +		return clk_core_determine_round(core, req);
> +	else if (core->flags & CLK_SET_RATE_PARENT)
> +		return clk_core_round_rate_nolock(core->parent, req);
>  
> +	req->rate = core->rate;
>  	return 0;
>  }
>  
> @@ -1356,36 +1376,26 @@ static struct clk_core *clk_calc_new_rates(struct clk_core *core,
>  	clk_core_get_boundaries(core, &min_rate, &max_rate);
>  
>  	/* find the closest rate and parent clk/rate */
> -	if (core->ops->determine_rate) {
> +	if (core->ops->determine_rate || core->ops->round_rate) {

This is the second time we check this, maybe another function for
clk_core_can_round(core) is in order?

>  		struct clk_rate_request req;
>  
>  		req.rate = rate;
>  		req.min_rate = min_rate;
>  		req.max_rate = max_rate;
> -		if (parent) {
> -			req.best_parent_hw = parent->hw;
> -			req.best_parent_rate = parent->rate;
> -		} else {
> -			req.best_parent_hw = NULL;
> -			req.best_parent_rate = 0;
> -		}
>  
> -		ret = core->ops->determine_rate(core->hw, &req);
> +		clk_core_init_rate_req(core, &req);
> +
> +		ret = clk_core_determine_round(core, &req);
>  		if (ret < 0)
>  			return NULL;
>  
>  		best_parent_rate = req.best_parent_rate;
>  		new_rate = req.rate;
>  		parent = req.best_parent_hw ? req.best_parent_hw->core : NULL;
> -	} else if (core->ops->round_rate) {
> -		ret = core->ops->round_rate(core->hw, rate,
> -					    &best_parent_rate);
> -		if (ret < 0)
> -			return NULL;
>  
> -		new_rate = ret;
>  		if (new_rate < min_rate || new_rate > max_rate)
>  			return NULL;
> +

Nitpick: Kill this newline.

-- 
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
a Linux Foundation Collaborative Project

  reply	other threads:[~2017-07-12  1:49 UTC|newest]

Thread overview: 102+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-06-12 19:44 [PATCH v3 00/10] clk: implement clock rate protection mechanism Jerome Brunet
2017-06-12 19:44 ` Jerome Brunet
2017-06-12 19:44 ` [PATCH v3 01/10] clk: take the prepare lock out of clk_core_set_parent Jerome Brunet
2017-06-12 19:44   ` Jerome Brunet
2017-07-12  1:21   ` Stephen Boyd
2017-07-12  1:21     ` Stephen Boyd
2017-06-12 19:44 ` [PATCH v3 02/10] clk: add clk_core_set_phase_nolock function Jerome Brunet
2017-06-12 19:44   ` Jerome Brunet
2017-07-12  1:22   ` Stephen Boyd
2017-07-12  1:22     ` Stephen Boyd
2017-06-12 19:44 ` [PATCH v3 03/10] clk: rework calls to round and determine rate callbacks Jerome Brunet
2017-06-12 19:44   ` Jerome Brunet
2017-07-12  1:49   ` Stephen Boyd [this message]
2017-07-12  1:49     ` Stephen Boyd
2017-06-12 19:44 ` [PATCH v3 04/10] clk: use round rate to bail out early in set_rate Jerome Brunet
2017-06-12 19:44   ` Jerome Brunet
2017-07-12  2:00   ` Stephen Boyd
2017-07-12  2:00     ` Stephen Boyd
2017-07-26 17:13     ` Jerome Brunet
2017-07-26 17:13       ` Jerome Brunet
2017-08-04  0:32       ` Stephen Boyd
2017-08-04  0:32         ` Stephen Boyd
2017-06-12 19:44 ` [PATCH v3 05/10] clk: add support for clock protection Jerome Brunet
2017-06-12 19:44   ` Jerome Brunet
2017-07-26  0:12   ` Stephen Boyd
2017-07-26  0:12     ` Stephen Boyd
2017-07-26 17:18     ` Jerome Brunet
2017-07-26 17:18       ` Jerome Brunet
2017-08-04  0:18       ` Stephen Boyd
2017-08-04  0:18         ` Stephen Boyd
2017-08-08 22:37         ` Michael Turquette
2017-08-08 22:37           ` Michael Turquette
2017-08-09  2:19           ` Stephen Boyd
2017-08-09  2:19             ` Stephen Boyd
2017-08-09 11:45             ` Russell King - ARM Linux
2017-08-09 11:45               ` Russell King - ARM Linux
2017-08-09 13:34               ` Jerome Brunet
2017-08-09 13:34                 ` Jerome Brunet
2017-08-09 13:40                 ` Russell King - ARM Linux
2017-08-09 13:40                   ` Russell King - ARM Linux
2017-08-09 13:45                   ` Jerome Brunet
2017-08-09 13:45                     ` Jerome Brunet
2017-08-10 16:48                   ` Michael Turquette
2017-08-10 16:48                     ` Michael Turquette
2017-08-10 16:46               ` Michael Turquette
2017-08-10 16:46                 ` Michael Turquette
2017-08-09 13:07             ` Jerome Brunet
2017-08-09 13:07               ` Jerome Brunet
2017-08-09 12:18           ` Jerome Brunet
2017-08-09 12:18             ` Jerome Brunet
2017-08-10 16:54             ` Michael Turquette
2017-08-10 16:54               ` Michael Turquette
2017-06-12 19:44 ` [PATCH v3 06/10] clk: add clk_set_rate_protect Jerome Brunet
2017-06-12 19:44   ` Jerome Brunet
2017-07-26  0:59   ` Stephen Boyd
2017-07-26  0:59     ` Stephen Boyd
2017-06-12 19:44 ` [PATCH v3 07/10] clk: rollback set_rate_range changes on failure Jerome Brunet
2017-06-12 19:44   ` Jerome Brunet
2017-07-12  2:02   ` Stephen Boyd
2017-07-12  2:02     ` Stephen Boyd
2017-07-26 17:22     ` Jerome Brunet
2017-07-26 17:22       ` Jerome Brunet
2017-06-12 19:44 ` [PATCH v3 08/10] clk: cosmetic changes to clk_summary debugfs entry Jerome Brunet
2017-06-12 19:44   ` Jerome Brunet
2017-07-12  2:02   ` Stephen Boyd
2017-07-12  2:02     ` Stephen Boyd
2017-06-12 19:44 ` [PATCH v3 09/10] clk: fix incorrect usage of ENOSYS Jerome Brunet
2017-06-12 19:44   ` Jerome Brunet
2017-07-12  2:03   ` Stephen Boyd
2017-07-12  2:03     ` Stephen Boyd
2017-06-12 19:44 ` [PATCH v3 10/10] clk: fix CLK_SET_RATE_GATE with clock rate protection Jerome Brunet
2017-06-12 19:44   ` Jerome Brunet
2017-06-20  9:07 ` [PATCH v3 00/10] clk: implement clock rate protection mechanism Linus Walleij
2017-06-20  9:07   ` Linus Walleij
2017-06-20 10:50   ` Jerome Brunet
2017-06-20 10:50     ` Jerome Brunet
2017-06-20 11:54     ` Linus Walleij
2017-06-20 11:54       ` Linus Walleij
2017-06-20 12:32       ` Jerome Brunet
2017-06-20 12:32         ` Jerome Brunet
2017-06-20 12:47         ` Boris Brezillon
2017-06-20 12:47           ` Boris Brezillon
2017-06-22  7:07           ` Quentin Schulz
2017-06-22  7:07             ` Quentin Schulz
2017-06-22 10:09             ` Jerome Brunet
2017-06-22 10:09               ` Jerome Brunet
2017-06-20 15:29         ` Linus Walleij
2017-06-20 15:29           ` Linus Walleij
2017-06-21 13:15         ` Jerome Brunet
2017-06-21 13:15           ` Jerome Brunet
2017-07-12  1:16           ` Stephen Boyd
2017-07-12  1:16             ` Stephen Boyd
2017-07-26 17:05             ` Jerome Brunet
2017-07-26 17:05               ` Jerome Brunet
2017-07-27 22:44               ` Stephen Boyd
2017-07-27 22:44                 ` Stephen Boyd
2017-08-08 22:40                 ` Michael Turquette
2017-08-08 22:40                   ` Michael Turquette
2017-08-09 12:14                   ` Jerome Brunet
2017-08-09 12:14                     ` Jerome Brunet
2017-07-11 21:04 ` Jerome Brunet
2017-07-11 21:04   ` Jerome Brunet

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=20170712014917.GT22780@codeaurora.org \
    --to=sboyd@codeaurora.org \
    --cc=linus-amlogic@lists.infradead.org \
    /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.