Hi Sudeep,

Thanks for your patch.

>-----Original Message-----
>From: Sudeep Holla <sudeep.ho...@arm.com> 
>Sent: Thursday, July 9, 2020 3:17 PM
>To: linux-arm-ker...@lists.infradead.org; linux-...@vger.kernel.org; Stephen 
>Boyd <sb...@kernel.org>
>Cc: Sudeep Holla <sudeep.ho...@arm.com>; linux-kernel@vger.kernel.org; Michael 
>Turquette <mturque...@baylibre.com>; Dien Pham <dien.pham...@renesas.com>
>Subject: [PATCH v2 2/2] clk: scmi: Fix min and max rate when registering 
>clocks with discrete rates
>
>Currently we are not initializing the scmi clock with discrete rates 
>correctly. We fetch the min_rate and max_rate value only for clocks with 
>ranges and ignore the ones with discrete rates. This will lead to wrong 
>initialization of rate range when clock supports discrete rate.
>
>Fix this by using the first and the last rate in the sorted list of the 
>discrete clock rates while registering the clock.
>
>Link: https://lore.kernel.org/r/20200708110725.18017-2-sudeep.ho...@arm.com
>Fixes: 6d6a1d82eaef7 ("clk: add support for clocks provided by SCMI")
>Reported-by: Dien Pham <dien.pham...@renesas.com>
>Signed-off-by: Sudeep Holla <sudeep.ho...@arm.com>
>---
> drivers/clk/clk-scmi.c | 22 +++++++++++++++++++---
> 1 file changed, 19 insertions(+), 3 deletions(-)
>
>Hi Stephen,
>
>If you are fine, I can take this via ARM SoC along with the change in firmware 
>driver. However it is also fine if you want to merge this independently as 
>there is no strict dependency. Let me know either way.
>
>v1[1]->v2:
>       - Fixed the missing ; which was sent by mistake.

I tested the patch,
I is ok and can fix my issue.

>Regards,
>Sudeep
>
>[1] https://lore.kernel.org/r/20200708110725.18017-2-sudeep.ho...@arm.com
>
>diff --git a/drivers/clk/clk-scmi.c b/drivers/clk/clk-scmi.c index 
>c491f5de0f3f..c754dfbb73fd 100644
>--- a/drivers/clk/clk-scmi.c
>+++ b/drivers/clk/clk-scmi.c
>@@ -103,6 +103,8 @@ static const struct clk_ops scmi_clk_ops = {  static int 
>scmi_clk_ops_init(struct device *dev, struct scmi_clk *sclk)  {
>       int ret;
>+      unsigned long min_rate, max_rate;
>+
>       struct clk_init_data init = {
>               .flags = CLK_GET_RATE_NOCACHE,
>               .num_parents = 0,
>@@ -112,9 +114,23 @@ static int scmi_clk_ops_init(struct device *dev, struct 
>scmi_clk *sclk)
> 
>       sclk->hw.init = &init;
>       ret = devm_clk_hw_register(dev, &sclk->hw);
>-      if (!ret)
>-              clk_hw_set_rate_range(&sclk->hw, sclk->info->range.min_rate,
>-                                    sclk->info->range.max_rate);
>+      if (ret)
>+              return ret;
>+
>+      if (sclk->info->rate_discrete) {
>+              int num_rates = sclk->info->list.num_rates;
>+
>+              if (num_rates <= 0)
>+                      return -EINVAL;
>+
>+              min_rate = sclk->info->list.rates[0];
>+              max_rate = sclk->info->list.rates[num_rates - 1];
>+      } else {
>+              min_rate = sclk->info->range.min_rate;
>+              max_rate = sclk->info->range.max_rate;
>+      }
>+
>+      clk_hw_set_rate_range(&sclk->hw, min_rate, max_rate);
>       return ret;
> }
> 
>--
>2.17.1

Best regard,
DIEN Pham

Reply via email to