Skip to content

Commit fcd2e0d

Browse files
committed
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/[email protected] Fixes: 6d6a1d8 ("clk: add support for clocks provided by SCMI") Reviewed-by: Stephen Boyd <[email protected]> Reported-and-tested-by: Dien Pham <[email protected]> Signed-off-by: Sudeep Holla <[email protected]>
1 parent dccec73 commit fcd2e0d

File tree

1 file changed

+19
-3
lines changed

1 file changed

+19
-3
lines changed

drivers/clk/clk-scmi.c

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,8 @@ static const struct clk_ops scmi_clk_ops = {
103103
static int scmi_clk_ops_init(struct device *dev, struct scmi_clk *sclk)
104104
{
105105
int ret;
106+
unsigned long min_rate, max_rate;
107+
106108
struct clk_init_data init = {
107109
.flags = CLK_GET_RATE_NOCACHE,
108110
.num_parents = 0,
@@ -112,9 +114,23 @@ static int scmi_clk_ops_init(struct device *dev, struct scmi_clk *sclk)
112114

113115
sclk->hw.init = &init;
114116
ret = devm_clk_hw_register(dev, &sclk->hw);
115-
if (!ret)
116-
clk_hw_set_rate_range(&sclk->hw, sclk->info->range.min_rate,
117-
sclk->info->range.max_rate);
117+
if (ret)
118+
return ret;
119+
120+
if (sclk->info->rate_discrete) {
121+
int num_rates = sclk->info->list.num_rates;
122+
123+
if (num_rates <= 0)
124+
return -EINVAL;
125+
126+
min_rate = sclk->info->list.rates[0];
127+
max_rate = sclk->info->list.rates[num_rates - 1];
128+
} else {
129+
min_rate = sclk->info->range.min_rate;
130+
max_rate = sclk->info->range.max_rate;
131+
}
132+
133+
clk_hw_set_rate_range(&sclk->hw, min_rate, max_rate);
118134
return ret;
119135
}
120136

0 commit comments

Comments
 (0)