diff options
Diffstat (limited to 'drivers/clk/stm32/clk-stm32-core.c')
| -rw-r--r-- | drivers/clk/stm32/clk-stm32-core.c | 33 | 
1 files changed, 22 insertions, 11 deletions
diff --git a/drivers/clk/stm32/clk-stm32-core.c b/drivers/clk/stm32/clk-stm32-core.c index 45a279e73779..d5aa09e9fce4 100644 --- a/drivers/clk/stm32/clk-stm32-core.c +++ b/drivers/clk/stm32/clk-stm32-core.c @@ -275,6 +275,7 @@ static int clk_stm32_mux_set_parent(struct clk_hw *hw, u8 index)  }  const struct clk_ops clk_stm32_mux_ops = { +	.determine_rate	= __clk_mux_determine_rate,  	.get_parent	= clk_stm32_mux_get_parent,  	.set_parent	= clk_stm32_mux_set_parent,  }; @@ -425,15 +426,15 @@ static unsigned long clk_stm32_composite_recalc_rate(struct clk_hw *hw,  				      composite->div_id, parent_rate);  } -static long clk_stm32_composite_round_rate(struct clk_hw *hw, unsigned long rate, -					   unsigned long *prate) +static int clk_stm32_composite_determine_rate(struct clk_hw *hw, +					      struct clk_rate_request *req)  {  	struct clk_stm32_composite *composite = to_clk_stm32_composite(hw); -  	const struct stm32_div_cfg *divider; +	unsigned long rate;  	if (composite->div_id == NO_STM32_DIV) -		return rate; +		return 0;  	divider = &composite->clock_data->dividers[composite->div_id]; @@ -444,14 +445,24 @@ static long clk_stm32_composite_round_rate(struct clk_hw *hw, unsigned long rate  		val =  readl(composite->base + divider->offset) >> divider->shift;  		val &= clk_div_mask(divider->width); -		return divider_ro_round_rate(hw, rate, prate, divider->table, -				divider->width, divider->flags, -				val); +		rate = divider_ro_round_rate(hw, req->rate, &req->best_parent_rate, +					     divider->table, divider->width, divider->flags, +					     val); +		if (rate < 0) +			return rate; + +		req->rate = rate; +		return 0;  	} -	return divider_round_rate_parent(hw, clk_hw_get_parent(hw), -					 rate, prate, divider->table, -					 divider->width, divider->flags); +	rate = divider_round_rate_parent(hw, clk_hw_get_parent(hw), +					 req->rate, &req->best_parent_rate, +					 divider->table, divider->width, divider->flags); +	if (rate < 0) +		return rate; + +	req->rate = rate; +	return 0;  }  static u8 clk_stm32_composite_get_parent(struct clk_hw *hw) @@ -601,7 +612,7 @@ static void clk_stm32_composite_disable_unused(struct clk_hw *hw)  const struct clk_ops clk_stm32_composite_ops = {  	.set_rate	= clk_stm32_composite_set_rate,  	.recalc_rate	= clk_stm32_composite_recalc_rate, -	.round_rate	= clk_stm32_composite_round_rate, +	.determine_rate	= clk_stm32_composite_determine_rate,  	.get_parent	= clk_stm32_composite_get_parent,  	.set_parent	= clk_stm32_composite_set_parent,  	.enable		= clk_stm32_composite_gate_enable,  | 
