diff options
Diffstat (limited to 'drivers/pwm/pwm-stm32-lp.c')
| -rw-r--r-- | drivers/pwm/pwm-stm32-lp.c | 8 | 
1 files changed, 7 insertions, 1 deletions
diff --git a/drivers/pwm/pwm-stm32-lp.c b/drivers/pwm/pwm-stm32-lp.c index 2211a642066d..67fca62524dc 100644 --- a/drivers/pwm/pwm-stm32-lp.c +++ b/drivers/pwm/pwm-stm32-lp.c @@ -32,7 +32,7 @@ static inline struct stm32_pwm_lp *to_stm32_pwm_lp(struct pwm_chip *chip)  #define STM32_LPTIM_MAX_PRESCALER	128  static int stm32_pwm_lp_apply(struct pwm_chip *chip, struct pwm_device *pwm, -			      struct pwm_state *state) +			      const struct pwm_state *state)  {  	struct stm32_pwm_lp *priv = to_stm32_pwm_lp(chip);  	unsigned long long prd, div, dty; @@ -59,6 +59,12 @@ static int stm32_pwm_lp_apply(struct pwm_chip *chip, struct pwm_device *pwm,  	/* Calculate the period and prescaler value */  	div = (unsigned long long)clk_get_rate(priv->clk) * state->period;  	do_div(div, NSEC_PER_SEC); +	if (!div) { +		/* Clock is too slow to achieve requested period. */ +		dev_dbg(priv->chip.dev, "Can't reach %u ns\n",	state->period); +		return -EINVAL; +	} +  	prd = div;  	while (div > STM32_LPTIM_MAX_ARR) {  		presc++;  |