Re: [PATCH v4] opp: Use clk_get_optional() to avoid leaving opp_table->clk as an error pointer

Viresh Kumar <[email protected]>
Newsgroups org.kernel.vger.linux-pm,org.kernel.vger.linux-kernel
Message-ID <jyddvc6eki2l3jebtcvux36wujd2veb2wellsb6o2xsbuypeco@7bvs6piwrraq>
On 27-07-26, 22:33, Praveen Talari wrote:
> Suggested-by: Sebastian Reichel <[email protected]>
> Reviewed-by: Sebastian Reichel <[email protected]>
> Signed-off-by: Praveen Talari <[email protected]>
> ---

You added ^^ and ..

> Changes in v4:
> - Rebased on
>   https://git.kernel.org/pub/scm/linux/kernel/git/vireshk/pm.git/log/?h=cpufreq/arm/linux-next
> - Removed ret variable.
> - Link to v3:
>   https://lore.kernel.org/all/[email protected]
> 
> Changes in v3:
> - Added OPP framework maintainers
> - Link to v2:
>   https://patch.msgid.link/[email protected]
> 
> Changes in v2:
> - Switched from guarding clk_round_rate() against error pointers to
>   fixing the root cause in OPP core: use clk_get_optional() instead
>   of clk_get() in _update_opp_table_clk(), so opp_table->clk is left
>   as NULL (not ERR_PTR(-ENOENT)) when a device has no Linux clock,
>   per Sebastian Reichel's review suggestion.
> - Dropped the drivers/clk/clk.c change entirely.
> - Link to v1:
>   https://patch.msgid.link/[email protected]
> 
> To: [email protected]
> To: Viresh Kumar <[email protected]>
> To: Nishanth Menon <[email protected]>
> To: Stephen Boyd <[email protected]>
> Cc: [email protected]
> Cc: [email protected]
> Cc: [email protected]
> ---

and this ^^

Only one line with `---` is enough and you can add non-commit part
after that.

>  drivers/opp/core.c | 54 ++++++++++++++++++++++++------------------------------
>  1 file changed, 24 insertions(+), 30 deletions(-)
> 
> diff --git a/drivers/opp/core.c b/drivers/opp/core.c
> index ab0b0a2f85a1..f2b2ffdb410d 100644
> --- a/drivers/opp/core.c
> +++ b/drivers/opp/core.c
> @@ -1582,8 +1582,6 @@ static struct opp_table *_update_opp_table_clk(struct device *dev,
>  					       struct opp_table *opp_table,
>  					       bool getclk)
>  {
> -	int ret;
> -
>  	/*
>  	 * Return early if we don't need to get clk or we have already done it
>  	 * earlier.
> @@ -1592,39 +1590,35 @@ static struct opp_table *_update_opp_table_clk(struct device *dev,
>  	    opp_table->clks)
>  		return opp_table;
>  
> -	/* Find clk for the device */
> -	opp_table->clk = clk_get(dev, NULL);
> +	/*
> +	 * There are few platforms which don't want the OPP core to manage
> +	 * device's clock settings. In such cases neither the platform
> +	 * provides the clks explicitly to us, nor the DT contains a valid
> +	 * clk entry. The OPP nodes in DT may still contain "opp-hz" property
> +	 * though, which we need to parse and allow the platform to find an
> +	 * OPP based on freq later on.
> +	 *
> +	 * This is a simple solution to take care of such corner cases, i.e.
> +	 * make the clk_count 1, which lets us allocate space for frequency
> +	 * in opp->rates and also parse the entries in DT. Use
> +	 * clk_get_optional() instead of clk_get() so opp_table->clk stays
> +	 * NULL for such devices, instead of holding an ERR_PTR(-ENOENT) that
> +	 * consumers must remember to special-case.
> +	 */
> +	opp_table->clk = clk_get_optional(dev, NULL);
>  
> -	ret = PTR_ERR_OR_ZERO(opp_table->clk);
> -	if (!ret) {
> -		opp_table->config_clks = _opp_config_clk_single;
> -		opp_table->clk_count = 1;
> -		return opp_table;
> +	if (IS_ERR(opp_table->clk)) {
> +		dev_pm_opp_put_opp_table(opp_table);
> +		dev_err_probe(dev, PTR_ERR(opp_table->clk), "Couldn't find clock\n");
> +		return ERR_CAST(opp_table->clk);
>  	}
>  
> -	if (ret == -ENOENT) {
> -		/*
> -		 * There are few platforms which don't want the OPP core to
> -		 * manage device's clock settings. In such cases neither the
> -		 * platform provides the clks explicitly to us, nor the DT
> -		 * contains a valid clk entry. The OPP nodes in DT may still
> -		 * contain "opp-hz" property though, which we need to parse and
> -		 * allow the platform to find an OPP based on freq later on.
> -		 *
> -		 * This is a simple solution to take care of such corner cases,
> -		 * i.e. make the clk_count 1, which lets us allocate space for
> -		 * frequency in opp->rates and also parse the entries in DT.
> -		 */
> -		opp_table->clk_count = 1;
> -
> -		dev_dbg(dev, "%s: Couldn't find clock: %d\n", __func__, ret);
> -		return opp_table;
> -	}
> +	if (opp_table->clk)
> +		opp_table->config_clks = _opp_config_clk_single;
>  
> -	dev_pm_opp_put_opp_table(opp_table);
> -	dev_err_probe(dev, ret, "Couldn't find clock\n");
> +	opp_table->clk_count = 1;
>  
> -	return ERR_PTR(ret);
> +	return opp_table;
>  }

Applied. Thanks.

-- 
viresh
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.