diff options
Diffstat (limited to 'drivers/iio/adc/stm32-adc-core.c')
| -rw-r--r-- | drivers/iio/adc/stm32-adc-core.c | 21 | 
1 files changed, 20 insertions, 1 deletions
| diff --git a/drivers/iio/adc/stm32-adc-core.c b/drivers/iio/adc/stm32-adc-core.c index a83199b212a4..9d1ad6e38e85 100644 --- a/drivers/iio/adc/stm32-adc-core.c +++ b/drivers/iio/adc/stm32-adc-core.c @@ -200,7 +200,7 @@ static int stm32h7_adc_clk_sel(struct platform_device *pdev,  {  	u32 ckmode, presc, val;  	unsigned long rate; -	int i, div; +	int i, div, duty;  	/* stm32h7 bus clock is common for all ADC instances (mandatory) */  	if (!priv->bclk) { @@ -224,6 +224,11 @@ static int stm32h7_adc_clk_sel(struct platform_device *pdev,  			return -EINVAL;  		} +		/* If duty is an error, kindly use at least /2 divider */ +		duty = clk_get_scaled_duty_cycle(priv->aclk, 100); +		if (duty < 0) +			dev_warn(&pdev->dev, "adc clock duty: %d\n", duty); +  		for (i = 0; i < ARRAY_SIZE(stm32h7_adc_ckmodes_spec); i++) {  			ckmode = stm32h7_adc_ckmodes_spec[i].ckmode;  			presc = stm32h7_adc_ckmodes_spec[i].presc; @@ -232,6 +237,13 @@ static int stm32h7_adc_clk_sel(struct platform_device *pdev,  			if (ckmode)  				continue; +			/* +			 * For proper operation, clock duty cycle range is 49% +			 * to 51%. Apply at least /2 prescaler otherwise. +			 */ +			if (div == 1 && (duty < 49 || duty > 51)) +				continue; +  			if ((rate / div) <= priv->max_clk_rate)  				goto out;  		} @@ -244,6 +256,10 @@ static int stm32h7_adc_clk_sel(struct platform_device *pdev,  		return -EINVAL;  	} +	duty = clk_get_scaled_duty_cycle(priv->bclk, 100); +	if (duty < 0) +		dev_warn(&pdev->dev, "bus clock duty: %d\n", duty); +  	for (i = 0; i < ARRAY_SIZE(stm32h7_adc_ckmodes_spec); i++) {  		ckmode = stm32h7_adc_ckmodes_spec[i].ckmode;  		presc = stm32h7_adc_ckmodes_spec[i].presc; @@ -252,6 +268,9 @@ static int stm32h7_adc_clk_sel(struct platform_device *pdev,  		if (!ckmode)  			continue; +		if (div == 1 && (duty < 49 || duty > 51)) +			continue; +  		if ((rate / div) <= priv->max_clk_rate)  			goto out;  	} | 
