Skip to content

Commit a9b01fd

Browse files
sudeep-hollagregkh
authored andcommitted
clk: scmi: Fix min and max rate when registering clocks with discrete rates
[ Upstream commit fcd2e0d ] 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/20200709081705.46084-2-sudeep.holla@arm.com Fixes: 6d6a1d8 ("clk: add support for clocks provided by SCMI") Reviewed-by: Stephen Boyd <sboyd@kernel.org> Reported-and-tested-by: Dien Pham <dien.pham.ry@renesas.com> Signed-off-by: Sudeep Holla <sudeep.holla@arm.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
1 parent 605614e commit a9b01fd

1 file changed

Lines changed: 19 additions & 3 deletions

File tree

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)