Skip to content

Commit 50dbe1f

Browse files
Fabrice Gasnierjic23
authored andcommitted
iio: adc: stm32: fix common clock rate
ADC clock input is provided to internal prescaler (that decreases its frequency). It's then used as reference clock for conversions. - Fix common clock rate used then by stm32-adc sub-devices. Take common prescaler into account. Currently, rate is used to set "boost" mode. It may unnecessarily be set. This impacts power consumption. - Fix ADC max clock rate on STM32H7 (fADC from datasheet). Currently, prescaler may be set too low. This can result in ADC reference clock used for conversion to exceed max allowed clock frequency. Fixes: 95e339b ("iio: adc: stm32: add support for STM32H7") Signed-off-by: Fabrice Gasnier <[email protected]> Signed-off-by: Jonathan Cameron <[email protected]>
1 parent ff3aa88 commit 50dbe1f

File tree

1 file changed

+5
-5
lines changed

1 file changed

+5
-5
lines changed

drivers/iio/adc/stm32-adc-core.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@
6464
#define STM32H7_CKMODE_MASK GENMASK(17, 16)
6565

6666
/* STM32 H7 maximum analog clock rate (from datasheet) */
67-
#define STM32H7_ADC_MAX_CLK_RATE 72000000
67+
#define STM32H7_ADC_MAX_CLK_RATE 36000000
6868

6969
/**
7070
* stm32_adc_common_regs - stm32 common registers, compatible dependent data
@@ -148,14 +148,14 @@ static int stm32f4_adc_clk_sel(struct platform_device *pdev,
148148
return -EINVAL;
149149
}
150150

151-
priv->common.rate = rate;
151+
priv->common.rate = rate / stm32f4_pclk_div[i];
152152
val = readl_relaxed(priv->common.base + STM32F4_ADC_CCR);
153153
val &= ~STM32F4_ADC_ADCPRE_MASK;
154154
val |= i << STM32F4_ADC_ADCPRE_SHIFT;
155155
writel_relaxed(val, priv->common.base + STM32F4_ADC_CCR);
156156

157157
dev_dbg(&pdev->dev, "Using analog clock source at %ld kHz\n",
158-
rate / (stm32f4_pclk_div[i] * 1000));
158+
priv->common.rate / 1000);
159159

160160
return 0;
161161
}
@@ -250,7 +250,7 @@ static int stm32h7_adc_clk_sel(struct platform_device *pdev,
250250

251251
out:
252252
/* rate used later by each ADC instance to control BOOST mode */
253-
priv->common.rate = rate;
253+
priv->common.rate = rate / div;
254254

255255
/* Set common clock mode and prescaler */
256256
val = readl_relaxed(priv->common.base + STM32H7_ADC_CCR);
@@ -260,7 +260,7 @@ static int stm32h7_adc_clk_sel(struct platform_device *pdev,
260260
writel_relaxed(val, priv->common.base + STM32H7_ADC_CCR);
261261

262262
dev_dbg(&pdev->dev, "Using %s clock/%d source at %ld kHz\n",
263-
ckmode ? "bus" : "adc", div, rate / (div * 1000));
263+
ckmode ? "bus" : "adc", div, priv->common.rate / 1000);
264264

265265
return 0;
266266
}

0 commit comments

Comments
 (0)