diff options
| -rw-r--r-- | drivers/clk/clk-scmi.c | 22 | 
1 files changed, 19 insertions, 3 deletions
| 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;  } | 
