* [PATCH v1 0/3] stm32mp13: Add ADC support and USB power delivery check
@ 2025-10-09 15:25 Patrice Chotard
2025-10-09 15:25 ` [PATCH v1 1/3] adc: stm32mp13: add support of adc to stm32mp13 Patrice Chotard
` (2 more replies)
0 siblings, 3 replies; 8+ messages in thread
From: Patrice Chotard @ 2025-10-09 15:25 UTC (permalink / raw)
To: u-boot
Cc: Patrice CHOTARD, Patrick DELAUNAY, U-Boot STM32, Cheick Traore,
Marek Vasut, Olivier Moysan, Tom Rini
Add power delivery check for stm32mp135f-dk board as already done
for stm32mp15x-dk boards :
- Add STM32MP13 support in STM32 ADC drivers.
- Enable ADC flag in stm3mp13_defconfig.
- Add st,adc_usb_pd property in stm32mp135-dk-u-boot.
Olivier Moysan (1):
adc: stm32mp13: add support of adc to stm32mp13
Patrice Chotard (2):
configs: stm32: Enable ADC support for stm32mp13_defconfig
ARM: dts: Add st,adc_usb_pd property for stm32mp135-dk-u-boot
arch/arm/dts/stm32mp135f-dk-u-boot.dtsi | 1 +
configs/stm32mp13_defconfig | 2 +
drivers/adc/stm32-adc-core.c | 1 +
drivers/adc/stm32-adc.c | 79 +++++++++++++++++++++----
4 files changed, 73 insertions(+), 10 deletions(-)
--
2.43.0
base-commit: 0eaa4b337336dbbe93395d1f2ccc18937eaafea2
branch: upstream_add_STM32MP13_ADC_support
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v1 1/3] adc: stm32mp13: add support of adc to stm32mp13
2025-10-09 15:25 [PATCH v1 0/3] stm32mp13: Add ADC support and USB power delivery check Patrice Chotard
@ 2025-10-09 15:25 ` Patrice Chotard
2025-11-13 17:59 ` Patrick DELAUNAY
2025-10-09 15:25 ` [PATCH v1 2/3] configs: stm32: Enable ADC support for stm32mp13_defconfig Patrice Chotard
2025-10-09 15:26 ` [PATCH v1 3/3] ARM: dts: Add st, adc_usb_pd property for stm32mp135-dk-u-boot Patrice Chotard
2 siblings, 1 reply; 8+ messages in thread
From: Patrice Chotard @ 2025-10-09 15:25 UTC (permalink / raw)
To: u-boot
Cc: Patrice CHOTARD, Patrick DELAUNAY, U-Boot STM32, Olivier Moysan,
Tom Rini
From: Olivier Moysan <olivier.moysan@foss.st.com>
Add support of STM32 ADCs to STM32MP13x. This patch introduces
stm32_adc_regspec structure, as this is already done in kernel
driver, to manage smartly the differences in register set
between STMP32MP15 and STM32MP13 ADCs.
Signed-off-by: Olivier Moysan <olivier.moysan@foss.st.com>
Signed-off-by: Patrice Chotard <patrice.chotard@foss.st.com>
---
drivers/adc/stm32-adc-core.c | 1 +
drivers/adc/stm32-adc.c | 79 +++++++++++++++++++++++++++++++-----
2 files changed, 70 insertions(+), 10 deletions(-)
diff --git a/drivers/adc/stm32-adc-core.c b/drivers/adc/stm32-adc-core.c
index af340b8b273..3446e34fa46 100644
--- a/drivers/adc/stm32-adc-core.c
+++ b/drivers/adc/stm32-adc-core.c
@@ -200,6 +200,7 @@ err_aclk_disable:
static const struct udevice_id stm32_adc_core_ids[] = {
{ .compatible = "st,stm32h7-adc-core" },
{ .compatible = "st,stm32mp1-adc-core" },
+ { .compatible = "st,stm32mp13-adc-core" },
{}
};
diff --git a/drivers/adc/stm32-adc.c b/drivers/adc/stm32-adc.c
index d50f00f1233..808c3c610f8 100644
--- a/drivers/adc/stm32-adc.c
+++ b/drivers/adc/stm32-adc.c
@@ -49,16 +49,35 @@
/* STM32H7_ADC_SQR1 - bit fields */
#define STM32H7_SQ1_SHIFT 6
+/* STM32H7_ADC_DIFSEL - bit fields */
+#define STM32H7_DIFSEL_SHIFT 0
+#define STM32H7_DIFSEL_MASK GENMASK(19, 0)
+
/* BOOST bit must be set on STM32H7 when ADC clock is above 20MHz */
#define STM32H7_BOOST_CLKRATE 20000000UL
+/* STM32MP13 - Registers for each ADC instance */
+#define STM32MP13_ADC_DIFSEL 0xB0
+
+/* STM32MP13_ADC_CFGR specific bit fields */
+#define STM32MP13_DMAEN BIT(0)
+#define STM32MP13_DMACFG BIT(1)
+
+/* STM32MP13_ADC_DIFSEL - bit fields */
+#define STM32MP13_DIFSEL_SHIFT 0
+#define STM32MP13_DIFSEL_MASK GENMASK(18, 0)
+
#define STM32_ADC_CH_MAX 20 /* max number of channels */
#define STM32_ADC_TIMEOUT_US 100000
struct stm32_adc_cfg {
+ const struct stm32_adc_regspec *regs;
unsigned int max_channels;
unsigned int num_bits;
bool has_vregready;
+ bool has_boostmode;
+ bool has_linearcal;
+ bool has_presel;
};
struct stm32_adc {
@@ -67,11 +86,30 @@ struct stm32_adc {
const struct stm32_adc_cfg *cfg;
};
+struct stm32_adc_regs {
+ int reg;
+ int mask;
+ int shift;
+};
+
+struct stm32_adc_regspec {
+ const struct stm32_adc_regs difsel;
+};
+
+static const struct stm32_adc_regspec stm32h7_adc_regspec = {
+ .difsel = { STM32H7_ADC_DIFSEL, STM32H7_DIFSEL_MASK },
+};
+
+static const struct stm32_adc_regspec stm32mp13_adc_regspec = {
+ .difsel = { STM32MP13_ADC_DIFSEL, STM32MP13_DIFSEL_MASK },
+};
static void stm32_adc_enter_pwr_down(struct udevice *dev)
{
struct stm32_adc *adc = dev_get_priv(dev);
- clrbits_le32(adc->regs + STM32H7_ADC_CR, STM32H7_BOOST);
+ if (adc->cfg->has_boostmode)
+ clrbits_le32(adc->regs + STM32H7_ADC_CR, STM32H7_BOOST);
+
/* Setting DEEPPWD disables ADC vreg and clears ADVREGEN */
setbits_le32(adc->regs + STM32H7_ADC_CR, STM32H7_DEEPPWD);
}
@@ -90,8 +128,7 @@ static int stm32_adc_exit_pwr_down(struct udevice *dev)
/* Exit deep power down, then enable ADC voltage regulator */
clrbits_le32(adc->regs + STM32H7_ADC_CR, STM32H7_DEEPPWD);
setbits_le32(adc->regs + STM32H7_ADC_CR, STM32H7_ADVREGEN);
-
- if (common->rate > STM32H7_BOOST_CLKRATE)
+ if (adc->cfg->has_boostmode && common->rate > STM32H7_BOOST_CLKRATE)
setbits_le32(adc->regs + STM32H7_ADC_CR, STM32H7_BOOST);
/* Wait for startup time */
@@ -134,7 +171,7 @@ static int stm32_adc_start_channel(struct udevice *dev, int channel)
return ret;
/* Only use single ended channels */
- writel(0, adc->regs + STM32H7_ADC_DIFSEL);
+ clrbits_le32(adc->regs + adc->cfg->regs->difsel.reg, adc->cfg->regs->difsel.mask);
/* Enable ADC, Poll for ADRDY to be set (after adc startup time) */
setbits_le32(adc->regs + STM32H7_ADC_CR, STM32H7_ADEN);
@@ -147,7 +184,8 @@ static int stm32_adc_start_channel(struct udevice *dev, int channel)
}
/* Preselect channels */
- writel(uc_pdata->channel_mask, adc->regs + STM32H7_ADC_PCSEL);
+ if (adc->cfg->has_presel)
+ writel(uc_pdata->channel_mask, adc->regs + STM32H7_ADC_PCSEL);
/* Set sampling time to max value by default */
writel(0xffffffff, adc->regs + STM32H7_ADC_SMPR1);
@@ -156,9 +194,11 @@ static int stm32_adc_start_channel(struct udevice *dev, int channel)
/* Program regular sequence: chan in SQ1 & len = 0 for one channel */
writel(channel << STM32H7_SQ1_SHIFT, adc->regs + STM32H7_ADC_SQR1);
- /* Trigger detection disabled (conversion can be launched in SW) */
- clrbits_le32(adc->regs + STM32H7_ADC_CFGR, STM32H7_EXTEN |
- STM32H7_DMNGT);
+ /*
+ * Trigger detection disabled (conversion can be launched in SW)
+ * STM32H7_DMNGT is equivalent to STM32MP13_DMAEN & STM32MP13_DMACFG
+ */
+ clrbits_le32(adc->regs + STM32H7_ADC_CFGR, STM32H7_EXTEN | STM32H7_DMNGT);
adc->active_channel = channel;
return 0;
@@ -206,7 +246,7 @@ static int stm32_adc_selfcalib(struct udevice *dev)
{
struct stm32_adc *adc = dev_get_priv(dev);
int ret;
- u32 val;
+ u32 val, mask;
/*
* Select calibration mode:
@@ -231,7 +271,10 @@ static int stm32_adc_selfcalib(struct udevice *dev)
* - Linearity calibration (needs to be done only once for single/diff)
* will run simultaneously with offset calibration.
*/
- setbits_le32(adc->regs + STM32H7_ADC_CR, STM32H7_ADCALDIF | STM32H7_ADCALLIN);
+ mask = STM32H7_ADCALDIF;
+ if (adc->cfg->has_linearcal)
+ mask |= STM32H7_ADCALLIN;
+ setbits_le32(adc->regs + STM32H7_ADC_CR, mask);
/* Start calibration, then wait for completion */
setbits_le32(adc->regs + STM32H7_ADC_CR, STM32H7_ADCAL);
@@ -394,14 +437,28 @@ static const struct adc_ops stm32_adc_ops = {
};
static const struct stm32_adc_cfg stm32h7_adc_cfg = {
+ .regs = &stm32h7_adc_regspec,
.num_bits = 16,
.max_channels = STM32_ADC_CH_MAX,
+ .has_boostmode = true,
+ .has_linearcal = true,
+ .has_presel = true,
};
static const struct stm32_adc_cfg stm32mp1_adc_cfg = {
+ .regs = &stm32h7_adc_regspec,
.num_bits = 16,
.max_channels = STM32_ADC_CH_MAX,
.has_vregready = true,
+ .has_boostmode = true,
+ .has_linearcal = true,
+ .has_presel = true,
+};
+
+static const struct stm32_adc_cfg stm32mp13_adc_cfg = {
+ .regs = &stm32mp13_adc_regspec,
+ .num_bits = 12,
+ .max_channels = STM32_ADC_CH_MAX - 1,
};
static const struct udevice_id stm32_adc_ids[] = {
@@ -409,6 +466,8 @@ static const struct udevice_id stm32_adc_ids[] = {
.data = (ulong)&stm32h7_adc_cfg },
{ .compatible = "st,stm32mp1-adc",
.data = (ulong)&stm32mp1_adc_cfg },
+ { .compatible = "st,stm32mp13-adc",
+ .data = (ulong)&stm32mp13_adc_cfg },
{}
};
--
2.43.0
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH v1 2/3] configs: stm32: Enable ADC support for stm32mp13_defconfig
2025-10-09 15:25 [PATCH v1 0/3] stm32mp13: Add ADC support and USB power delivery check Patrice Chotard
2025-10-09 15:25 ` [PATCH v1 1/3] adc: stm32mp13: add support of adc to stm32mp13 Patrice Chotard
@ 2025-10-09 15:25 ` Patrice Chotard
2025-11-13 18:00 ` Patrick DELAUNAY
2025-10-09 15:26 ` [PATCH v1 3/3] ARM: dts: Add st, adc_usb_pd property for stm32mp135-dk-u-boot Patrice Chotard
2 siblings, 1 reply; 8+ messages in thread
From: Patrice Chotard @ 2025-10-09 15:25 UTC (permalink / raw)
To: u-boot
Cc: Patrice CHOTARD, Patrick DELAUNAY, U-Boot STM32, Cheick Traore,
Marek Vasut, Tom Rini
Enable STM_ADC and CM_ADC for stm32mp13_defconfig
Signed-off-by: Patrice Chotard <patrice.chotard@foss.st.com>
---
configs/stm32mp13_defconfig | 2 ++
1 file changed, 2 insertions(+)
diff --git a/configs/stm32mp13_defconfig b/configs/stm32mp13_defconfig
index 3283e910219..8ef465ac222 100644
--- a/configs/stm32mp13_defconfig
+++ b/configs/stm32mp13_defconfig
@@ -29,6 +29,7 @@ CONFIG_CMD_NVEDIT_EFI=y
CONFIG_CMD_MEMINFO=y
CONFIG_CMD_MEMTEST=y
CONFIG_CMD_UNZIP=y
+CONFIG_CMD_ADC=y
CONFIG_CMD_CLK=y
CONFIG_CMD_FUSE=y
CONFIG_CMD_GPIO=y
@@ -56,6 +57,7 @@ CONFIG_ENV_REDUNDANT=y
CONFIG_ENV_RELOC_GD_ENV_ADDR=y
CONFIG_ENV_MMC_DEVICE_INDEX=-1
CONFIG_ENV_MMC_USE_DT=y
+CONFIG_STM32_ADC=y
CONFIG_SYS_64BIT_LBA=y
CONFIG_BUTTON=y
CONFIG_BUTTON_GPIO=y
--
2.43.0
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH v1 3/3] ARM: dts: Add st, adc_usb_pd property for stm32mp135-dk-u-boot
2025-10-09 15:25 [PATCH v1 0/3] stm32mp13: Add ADC support and USB power delivery check Patrice Chotard
2025-10-09 15:25 ` [PATCH v1 1/3] adc: stm32mp13: add support of adc to stm32mp13 Patrice Chotard
2025-10-09 15:25 ` [PATCH v1 2/3] configs: stm32: Enable ADC support for stm32mp13_defconfig Patrice Chotard
@ 2025-10-09 15:26 ` Patrice Chotard
2025-11-13 18:01 ` [PATCH v1 3/3] ARM: dts: Add st,adc_usb_pd " Patrick DELAUNAY
2 siblings, 1 reply; 8+ messages in thread
From: Patrice Chotard @ 2025-10-09 15:26 UTC (permalink / raw)
To: u-boot; +Cc: Patrice CHOTARD, Patrick DELAUNAY, U-Boot STM32, Tom Rini
Add st,adc_usb_pd property in /config node for stm32mp135-dk-u-boot.
This needed to check board USB power delivery.
Signed-off-by: Patrice Chotard <patrice.chotard@foss.st.com>
---
arch/arm/dts/stm32mp135f-dk-u-boot.dtsi | 1 +
1 file changed, 1 insertion(+)
diff --git a/arch/arm/dts/stm32mp135f-dk-u-boot.dtsi b/arch/arm/dts/stm32mp135f-dk-u-boot.dtsi
index f004e9840a2..326a8f8736e 100644
--- a/arch/arm/dts/stm32mp135f-dk-u-boot.dtsi
+++ b/arch/arm/dts/stm32mp135f-dk-u-boot.dtsi
@@ -14,6 +14,7 @@
u-boot,boot-led = "led-blue";
u-boot,error-led = "led-red";
u-boot,mmc-env-partition = "u-boot-env";
+ st,adc_usb_pd = <&adc1 6>, <&adc1 12>;
};
gpio-keys {
--
2.43.0
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH v1 1/3] adc: stm32mp13: add support of adc to stm32mp13
2025-10-09 15:25 ` [PATCH v1 1/3] adc: stm32mp13: add support of adc to stm32mp13 Patrice Chotard
@ 2025-11-13 17:59 ` Patrick DELAUNAY
2025-11-14 16:05 ` Patrice CHOTARD
0 siblings, 1 reply; 8+ messages in thread
From: Patrick DELAUNAY @ 2025-11-13 17:59 UTC (permalink / raw)
To: Patrice Chotard, u-boot; +Cc: U-Boot STM32, Olivier Moysan, Tom Rini
Hi,
On 10/9/25 17:25, Patrice Chotard wrote:
> From: Olivier Moysan <olivier.moysan@foss.st.com>
>
> Add support of STM32 ADCs to STM32MP13x. This patch introduces
> stm32_adc_regspec structure, as this is already done in kernel
> driver, to manage smartly the differences in register set
> between STMP32MP15 and STM32MP13 ADCs.
>
> Signed-off-by: Olivier Moysan <olivier.moysan@foss.st.com>
> Signed-off-by: Patrice Chotard <patrice.chotard@foss.st.com>
> ---
>
> drivers/adc/stm32-adc-core.c | 1 +
> drivers/adc/stm32-adc.c | 79 +++++++++++++++++++++++++++++++-----
> 2 files changed, 70 insertions(+), 10 deletions(-)
>
> diff --git a/drivers/adc/stm32-adc-core.c b/drivers/adc/stm32-adc-core.c
> index af340b8b273..3446e34fa46 100644
> --- a/drivers/adc/stm32-adc-core.c
> +++ b/drivers/adc/stm32-adc-core.c
> @@ -200,6 +200,7 @@ err_aclk_disable:
> static const struct udevice_id stm32_adc_core_ids[] = {
> { .compatible = "st,stm32h7-adc-core" },
> { .compatible = "st,stm32mp1-adc-core" },
> + { .compatible = "st,stm32mp13-adc-core" },
> {}
> };
>
> diff --git a/drivers/adc/stm32-adc.c b/drivers/adc/stm32-adc.c
> index d50f00f1233..808c3c610f8 100644
> --- a/drivers/adc/stm32-adc.c
> +++ b/drivers/adc/stm32-adc.c
> @@ -49,16 +49,35 @@
> /* STM32H7_ADC_SQR1 - bit fields */
> #define STM32H7_SQ1_SHIFT 6
>
> +/* STM32H7_ADC_DIFSEL - bit fields */
> +#define STM32H7_DIFSEL_SHIFT 0
> +#define STM32H7_DIFSEL_MASK GENMASK(19, 0)
> +
> /* BOOST bit must be set on STM32H7 when ADC clock is above 20MHz */
> #define STM32H7_BOOST_CLKRATE 20000000UL
>
> +/* STM32MP13 - Registers for each ADC instance */
> +#define STM32MP13_ADC_DIFSEL 0xB0
> +
> +/* STM32MP13_ADC_CFGR specific bit fields */
> +#define STM32MP13_DMAEN BIT(0)
> +#define STM32MP13_DMACFG BIT(1)
> +
> +/* STM32MP13_ADC_DIFSEL - bit fields */
> +#define STM32MP13_DIFSEL_SHIFT 0
> +#define STM32MP13_DIFSEL_MASK GENMASK(18, 0)
> +
> #define STM32_ADC_CH_MAX 20 /* max number of channels */
> #define STM32_ADC_TIMEOUT_US 100000
>
> struct stm32_adc_cfg {
> + const struct stm32_adc_regspec *regs;
minor replace tab by space before "*regs"
and it is strange to use "struct stm32_adc_regspec" before to define it
that can cause some warning with compiler ?
> unsigned int max_channels;
> unsigned int num_bits;
> bool has_vregready;
> + bool has_boostmode;
> + bool has_linearcal;
> + bool has_presel;
> };
>
> struct stm32_adc {
> @@ -67,11 +86,30 @@ struct stm32_adc {
> const struct stm32_adc_cfg *cfg;
> };
>
> +struct stm32_adc_regs {
> + int reg;
> + int mask;
> + int shift;
> +};
> +
> +struct stm32_adc_regspec {
> + const struct stm32_adc_regs difsel;
> +};
> +
> +static const struct stm32_adc_regspec stm32h7_adc_regspec = {
> + .difsel = { STM32H7_ADC_DIFSEL, STM32H7_DIFSEL_MASK },
> +};
> +
> +static const struct stm32_adc_regspec stm32mp13_adc_regspec = {
> + .difsel = { STM32MP13_ADC_DIFSEL, STM32MP13_DIFSEL_MASK },
> +};
minor all this block can move before "struct stm32_adc_cfg" (when used)
> static void stm32_adc_enter_pwr_down(struct udevice *dev)
> {
> struct stm32_adc *adc = dev_get_priv(dev);
>
> - clrbits_le32(adc->regs + STM32H7_ADC_CR, STM32H7_BOOST);
> + if (adc->cfg->has_boostmode)
> + clrbits_le32(adc->regs + STM32H7_ADC_CR, STM32H7_BOOST);
> +
> /* Setting DEEPPWD disables ADC vreg and clears ADVREGEN */
> setbits_le32(adc->regs + STM32H7_ADC_CR, STM32H7_DEEPPWD);
> }
> @@ -90,8 +128,7 @@ static int stm32_adc_exit_pwr_down(struct udevice *dev)
> /* Exit deep power down, then enable ADC voltage regulator */
> clrbits_le32(adc->regs + STM32H7_ADC_CR, STM32H7_DEEPPWD);
> setbits_le32(adc->regs + STM32H7_ADC_CR, STM32H7_ADVREGEN);
> -
> - if (common->rate > STM32H7_BOOST_CLKRATE)
> + if (adc->cfg->has_boostmode && common->rate > STM32H7_BOOST_CLKRATE)
> setbits_le32(adc->regs + STM32H7_ADC_CR, STM32H7_BOOST);
>
> /* Wait for startup time */
> @@ -134,7 +171,7 @@ static int stm32_adc_start_channel(struct udevice *dev, int channel)
> return ret;
>
> /* Only use single ended channels */
> - writel(0, adc->regs + STM32H7_ADC_DIFSEL);
> + clrbits_le32(adc->regs + adc->cfg->regs->difsel.reg, adc->cfg->regs->difsel.mask);
>
> /* Enable ADC, Poll for ADRDY to be set (after adc startup time) */
> setbits_le32(adc->regs + STM32H7_ADC_CR, STM32H7_ADEN);
> @@ -147,7 +184,8 @@ static int stm32_adc_start_channel(struct udevice *dev, int channel)
> }
>
> /* Preselect channels */
> - writel(uc_pdata->channel_mask, adc->regs + STM32H7_ADC_PCSEL);
> + if (adc->cfg->has_presel)
> + writel(uc_pdata->channel_mask, adc->regs + STM32H7_ADC_PCSEL);
>
> /* Set sampling time to max value by default */
> writel(0xffffffff, adc->regs + STM32H7_ADC_SMPR1);
> @@ -156,9 +194,11 @@ static int stm32_adc_start_channel(struct udevice *dev, int channel)
> /* Program regular sequence: chan in SQ1 & len = 0 for one channel */
> writel(channel << STM32H7_SQ1_SHIFT, adc->regs + STM32H7_ADC_SQR1);
>
> - /* Trigger detection disabled (conversion can be launched in SW) */
> - clrbits_le32(adc->regs + STM32H7_ADC_CFGR, STM32H7_EXTEN |
> - STM32H7_DMNGT);
> + /*
> + * Trigger detection disabled (conversion can be launched in SW)
> + * STM32H7_DMNGT is equivalent to STM32MP13_DMAEN & STM32MP13_DMACFG
> + */
> + clrbits_le32(adc->regs + STM32H7_ADC_CFGR, STM32H7_EXTEN | STM32H7_DMNGT);
> adc->active_channel = channel;
>
> return 0;
> @@ -206,7 +246,7 @@ static int stm32_adc_selfcalib(struct udevice *dev)
> {
> struct stm32_adc *adc = dev_get_priv(dev);
> int ret;
> - u32 val;
> + u32 val, mask;
>
> /*
> * Select calibration mode:
> @@ -231,7 +271,10 @@ static int stm32_adc_selfcalib(struct udevice *dev)
> * - Linearity calibration (needs to be done only once for single/diff)
> * will run simultaneously with offset calibration.
> */
> - setbits_le32(adc->regs + STM32H7_ADC_CR, STM32H7_ADCALDIF | STM32H7_ADCALLIN);
> + mask = STM32H7_ADCALDIF;
> + if (adc->cfg->has_linearcal)
> + mask |= STM32H7_ADCALLIN;
> + setbits_le32(adc->regs + STM32H7_ADC_CR, mask);
>
> /* Start calibration, then wait for completion */
> setbits_le32(adc->regs + STM32H7_ADC_CR, STM32H7_ADCAL);
> @@ -394,14 +437,28 @@ static const struct adc_ops stm32_adc_ops = {
> };
>
> static const struct stm32_adc_cfg stm32h7_adc_cfg = {
> + .regs = &stm32h7_adc_regspec,
> .num_bits = 16,
> .max_channels = STM32_ADC_CH_MAX,
> + .has_boostmode = true,
> + .has_linearcal = true,
> + .has_presel = true,
> };
>
> static const struct stm32_adc_cfg stm32mp1_adc_cfg = {
> + .regs = &stm32h7_adc_regspec,
> .num_bits = 16,
> .max_channels = STM32_ADC_CH_MAX,
> .has_vregready = true,
> + .has_boostmode = true,
> + .has_linearcal = true,
> + .has_presel = true,
> +};
> +
> +static const struct stm32_adc_cfg stm32mp13_adc_cfg = {
> + .regs = &stm32mp13_adc_regspec,
> + .num_bits = 12,
> + .max_channels = STM32_ADC_CH_MAX - 1,
> };
>
> static const struct udevice_id stm32_adc_ids[] = {
> @@ -409,6 +466,8 @@ static const struct udevice_id stm32_adc_ids[] = {
> .data = (ulong)&stm32h7_adc_cfg },
> { .compatible = "st,stm32mp1-adc",
> .data = (ulong)&stm32mp1_adc_cfg },
> + { .compatible = "st,stm32mp13-adc",
> + .data = (ulong)&stm32mp13_adc_cfg },
> {}
> };
>
only minor remarks
Reviewed-by: Patrick Delaunay <patrick.delaunay@foss.st.com>
Thanks
Patrick
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v1 2/3] configs: stm32: Enable ADC support for stm32mp13_defconfig
2025-10-09 15:25 ` [PATCH v1 2/3] configs: stm32: Enable ADC support for stm32mp13_defconfig Patrice Chotard
@ 2025-11-13 18:00 ` Patrick DELAUNAY
0 siblings, 0 replies; 8+ messages in thread
From: Patrick DELAUNAY @ 2025-11-13 18:00 UTC (permalink / raw)
To: Patrice Chotard, u-boot
Cc: U-Boot STM32, Cheick Traore, Marek Vasut, Tom Rini
Hi,
On 10/9/25 17:25, Patrice Chotard wrote:
> Enable STM_ADC and CM_ADC for stm32mp13_defconfig
>
> Signed-off-by: Patrice Chotard <patrice.chotard@foss.st.com>
> ---
>
> configs/stm32mp13_defconfig | 2 ++
> 1 file changed, 2 insertions(+)
>
> diff --git a/configs/stm32mp13_defconfig b/configs/stm32mp13_defconfig
> index 3283e910219..8ef465ac222 100644
> --- a/configs/stm32mp13_defconfig
> +++ b/configs/stm32mp13_defconfig
> @@ -29,6 +29,7 @@ CONFIG_CMD_NVEDIT_EFI=y
> CONFIG_CMD_MEMINFO=y
> CONFIG_CMD_MEMTEST=y
> CONFIG_CMD_UNZIP=y
> +CONFIG_CMD_ADC=y
> CONFIG_CMD_CLK=y
> CONFIG_CMD_FUSE=y
> CONFIG_CMD_GPIO=y
> @@ -56,6 +57,7 @@ CONFIG_ENV_REDUNDANT=y
> CONFIG_ENV_RELOC_GD_ENV_ADDR=y
> CONFIG_ENV_MMC_DEVICE_INDEX=-1
> CONFIG_ENV_MMC_USE_DT=y
> +CONFIG_STM32_ADC=y
> CONFIG_SYS_64BIT_LBA=y
> CONFIG_BUTTON=y
> CONFIG_BUTTON_GPIO=y
Reviewed-by: Patrick Delaunay <patrick.delaunay@foss.st.com>
Thanks
Patrick
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v1 3/3] ARM: dts: Add st,adc_usb_pd property for stm32mp135-dk-u-boot
2025-10-09 15:26 ` [PATCH v1 3/3] ARM: dts: Add st, adc_usb_pd property for stm32mp135-dk-u-boot Patrice Chotard
@ 2025-11-13 18:01 ` Patrick DELAUNAY
0 siblings, 0 replies; 8+ messages in thread
From: Patrick DELAUNAY @ 2025-11-13 18:01 UTC (permalink / raw)
To: Patrice Chotard, u-boot; +Cc: U-Boot STM32, Tom Rini
Hi,
On 10/9/25 17:26, Patrice Chotard wrote:
> Add st,adc_usb_pd property in /config node for stm32mp135-dk-u-boot.
> This needed to check board USB power delivery.
>
> Signed-off-by: Patrice Chotard <patrice.chotard@foss.st.com>
>
> ---
>
> arch/arm/dts/stm32mp135f-dk-u-boot.dtsi | 1 +
> 1 file changed, 1 insertion(+)
>
> diff --git a/arch/arm/dts/stm32mp135f-dk-u-boot.dtsi b/arch/arm/dts/stm32mp135f-dk-u-boot.dtsi
> index f004e9840a2..326a8f8736e 100644
> --- a/arch/arm/dts/stm32mp135f-dk-u-boot.dtsi
> +++ b/arch/arm/dts/stm32mp135f-dk-u-boot.dtsi
> @@ -14,6 +14,7 @@
> u-boot,boot-led = "led-blue";
> u-boot,error-led = "led-red";
> u-boot,mmc-env-partition = "u-boot-env";
> + st,adc_usb_pd = <&adc1 6>, <&adc1 12>;
> };
>
> gpio-keys {
Reviewed-by: Patrick Delaunay <patrick.delaunay@foss.st.com>
Thanks
Patrick
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v1 1/3] adc: stm32mp13: add support of adc to stm32mp13
2025-11-13 17:59 ` Patrick DELAUNAY
@ 2025-11-14 16:05 ` Patrice CHOTARD
0 siblings, 0 replies; 8+ messages in thread
From: Patrice CHOTARD @ 2025-11-14 16:05 UTC (permalink / raw)
To: Patrick DELAUNAY, u-boot; +Cc: U-Boot STM32, Olivier Moysan, Tom Rini
On 11/13/25 18:59, Patrick DELAUNAY wrote:
> Hi,
>
> On 10/9/25 17:25, Patrice Chotard wrote:
>> From: Olivier Moysan <olivier.moysan@foss.st.com>
>>
>> Add support of STM32 ADCs to STM32MP13x. This patch introduces
>> stm32_adc_regspec structure, as this is already done in kernel
>> driver, to manage smartly the differences in register set
>> between STMP32MP15 and STM32MP13 ADCs.
>>
>> Signed-off-by: Olivier Moysan <olivier.moysan@foss.st.com>
>> Signed-off-by: Patrice Chotard <patrice.chotard@foss.st.com>
>> ---
>>
>> drivers/adc/stm32-adc-core.c | 1 +
>> drivers/adc/stm32-adc.c | 79 +++++++++++++++++++++++++++++++-----
>> 2 files changed, 70 insertions(+), 10 deletions(-)
>>
>> diff --git a/drivers/adc/stm32-adc-core.c b/drivers/adc/stm32-adc-core.c
>> index af340b8b273..3446e34fa46 100644
>> --- a/drivers/adc/stm32-adc-core.c
>> +++ b/drivers/adc/stm32-adc-core.c
>> @@ -200,6 +200,7 @@ err_aclk_disable:
>> static const struct udevice_id stm32_adc_core_ids[] = {
>> { .compatible = "st,stm32h7-adc-core" },
>> { .compatible = "st,stm32mp1-adc-core" },
>> + { .compatible = "st,stm32mp13-adc-core" },
>> {}
>> };
>> diff --git a/drivers/adc/stm32-adc.c b/drivers/adc/stm32-adc.c
>> index d50f00f1233..808c3c610f8 100644
>> --- a/drivers/adc/stm32-adc.c
>> +++ b/drivers/adc/stm32-adc.c
>> @@ -49,16 +49,35 @@
>> /* STM32H7_ADC_SQR1 - bit fields */
>> #define STM32H7_SQ1_SHIFT 6
>> +/* STM32H7_ADC_DIFSEL - bit fields */
>> +#define STM32H7_DIFSEL_SHIFT 0
>> +#define STM32H7_DIFSEL_MASK GENMASK(19, 0)
>> +
>> /* BOOST bit must be set on STM32H7 when ADC clock is above 20MHz */
>> #define STM32H7_BOOST_CLKRATE 20000000UL
>> +/* STM32MP13 - Registers for each ADC instance */
>> +#define STM32MP13_ADC_DIFSEL 0xB0
>> +
>> +/* STM32MP13_ADC_CFGR specific bit fields */
>> +#define STM32MP13_DMAEN BIT(0)
>> +#define STM32MP13_DMACFG BIT(1)
>> +
>> +/* STM32MP13_ADC_DIFSEL - bit fields */
>> +#define STM32MP13_DIFSEL_SHIFT 0
>> +#define STM32MP13_DIFSEL_MASK GENMASK(18, 0)
>> +
>> #define STM32_ADC_CH_MAX 20 /* max number of channels */
>> #define STM32_ADC_TIMEOUT_US 100000
>> struct stm32_adc_cfg {
>> + const struct stm32_adc_regspec *regs;
>
> minor replace tab by space before "*regs"
ok
>
> and it is strange to use "struct stm32_adc_regspec" before to define it
> that can cause some warning with compiler ?
no compilation warning was raised by the compiler, but ok, will move
"struct stm32_adc_cfg" below struct stm32_adc_regspec declaration
>
>> unsigned int max_channels;
>> unsigned int num_bits;
>> bool has_vregready;
>> + bool has_boostmode;
>> + bool has_linearcal;
>> + bool has_presel;
>> };
>> struct stm32_adc {
>> @@ -67,11 +86,30 @@ struct stm32_adc {
>> const struct stm32_adc_cfg *cfg;
>> };
>> +struct stm32_adc_regs {
>> + int reg;
>> + int mask;
>> + int shift;
>> +};
>> +
>> +struct stm32_adc_regspec {
>> + const struct stm32_adc_regs difsel;
>> +};
>> +
>> +static const struct stm32_adc_regspec stm32h7_adc_regspec = {
>> + .difsel = { STM32H7_ADC_DIFSEL, STM32H7_DIFSEL_MASK },
>> +};
>> +
>> +static const struct stm32_adc_regspec stm32mp13_adc_regspec = {
>> + .difsel = { STM32MP13_ADC_DIFSEL, STM32MP13_DIFSEL_MASK },
>> +};
>
> minor all this block can move before "struct stm32_adc_cfg" (when used)
ok
>
>
>> static void stm32_adc_enter_pwr_down(struct udevice *dev)
>> {
>> struct stm32_adc *adc = dev_get_priv(dev);
>> - clrbits_le32(adc->regs + STM32H7_ADC_CR, STM32H7_BOOST);
>> + if (adc->cfg->has_boostmode)
>> + clrbits_le32(adc->regs + STM32H7_ADC_CR, STM32H7_BOOST);
>> +
>> /* Setting DEEPPWD disables ADC vreg and clears ADVREGEN */
>> setbits_le32(adc->regs + STM32H7_ADC_CR, STM32H7_DEEPPWD);
>> }
>> @@ -90,8 +128,7 @@ static int stm32_adc_exit_pwr_down(struct udevice *dev)
>> /* Exit deep power down, then enable ADC voltage regulator */
>> clrbits_le32(adc->regs + STM32H7_ADC_CR, STM32H7_DEEPPWD);
>> setbits_le32(adc->regs + STM32H7_ADC_CR, STM32H7_ADVREGEN);
>> -
>> - if (common->rate > STM32H7_BOOST_CLKRATE)
>> + if (adc->cfg->has_boostmode && common->rate > STM32H7_BOOST_CLKRATE)
>> setbits_le32(adc->regs + STM32H7_ADC_CR, STM32H7_BOOST);
>> /* Wait for startup time */
>> @@ -134,7 +171,7 @@ static int stm32_adc_start_channel(struct udevice *dev, int channel)
>> return ret;
>> /* Only use single ended channels */
>> - writel(0, adc->regs + STM32H7_ADC_DIFSEL);
>> + clrbits_le32(adc->regs + adc->cfg->regs->difsel.reg, adc->cfg->regs->difsel.mask);
>> /* Enable ADC, Poll for ADRDY to be set (after adc startup time) */
>> setbits_le32(adc->regs + STM32H7_ADC_CR, STM32H7_ADEN);
>> @@ -147,7 +184,8 @@ static int stm32_adc_start_channel(struct udevice *dev, int channel)
>> }
>> /* Preselect channels */
>> - writel(uc_pdata->channel_mask, adc->regs + STM32H7_ADC_PCSEL);
>> + if (adc->cfg->has_presel)
>> + writel(uc_pdata->channel_mask, adc->regs + STM32H7_ADC_PCSEL);
>> /* Set sampling time to max value by default */
>> writel(0xffffffff, adc->regs + STM32H7_ADC_SMPR1);
>> @@ -156,9 +194,11 @@ static int stm32_adc_start_channel(struct udevice *dev, int channel)
>> /* Program regular sequence: chan in SQ1 & len = 0 for one channel */
>> writel(channel << STM32H7_SQ1_SHIFT, adc->regs + STM32H7_ADC_SQR1);
>> - /* Trigger detection disabled (conversion can be launched in SW) */
>> - clrbits_le32(adc->regs + STM32H7_ADC_CFGR, STM32H7_EXTEN |
>> - STM32H7_DMNGT);
>> + /*
>> + * Trigger detection disabled (conversion can be launched in SW)
>> + * STM32H7_DMNGT is equivalent to STM32MP13_DMAEN & STM32MP13_DMACFG
>> + */
>> + clrbits_le32(adc->regs + STM32H7_ADC_CFGR, STM32H7_EXTEN | STM32H7_DMNGT);
>> adc->active_channel = channel;
>> return 0;
>> @@ -206,7 +246,7 @@ static int stm32_adc_selfcalib(struct udevice *dev)
>> {
>> struct stm32_adc *adc = dev_get_priv(dev);
>> int ret;
>> - u32 val;
>> + u32 val, mask;
>> /*
>> * Select calibration mode:
>> @@ -231,7 +271,10 @@ static int stm32_adc_selfcalib(struct udevice *dev)
>> * - Linearity calibration (needs to be done only once for single/diff)
>> * will run simultaneously with offset calibration.
>> */
>> - setbits_le32(adc->regs + STM32H7_ADC_CR, STM32H7_ADCALDIF | STM32H7_ADCALLIN);
>> + mask = STM32H7_ADCALDIF;
>> + if (adc->cfg->has_linearcal)
>> + mask |= STM32H7_ADCALLIN;
>> + setbits_le32(adc->regs + STM32H7_ADC_CR, mask);
>> /* Start calibration, then wait for completion */
>> setbits_le32(adc->regs + STM32H7_ADC_CR, STM32H7_ADCAL);
>> @@ -394,14 +437,28 @@ static const struct adc_ops stm32_adc_ops = {
>> };
>> static const struct stm32_adc_cfg stm32h7_adc_cfg = {
>> + .regs = &stm32h7_adc_regspec,
>> .num_bits = 16,
>> .max_channels = STM32_ADC_CH_MAX,
>> + .has_boostmode = true,
>> + .has_linearcal = true,
>> + .has_presel = true,
>> };
>> static const struct stm32_adc_cfg stm32mp1_adc_cfg = {
>> + .regs = &stm32h7_adc_regspec,
>> .num_bits = 16,
>> .max_channels = STM32_ADC_CH_MAX,
>> .has_vregready = true,
>> + .has_boostmode = true,
>> + .has_linearcal = true,
>> + .has_presel = true,
>> +};
>> +
>> +static const struct stm32_adc_cfg stm32mp13_adc_cfg = {
>> + .regs = &stm32mp13_adc_regspec,
>> + .num_bits = 12,
>> + .max_channels = STM32_ADC_CH_MAX - 1,
>> };
>> static const struct udevice_id stm32_adc_ids[] = {
>> @@ -409,6 +466,8 @@ static const struct udevice_id stm32_adc_ids[] = {
>> .data = (ulong)&stm32h7_adc_cfg },
>> { .compatible = "st,stm32mp1-adc",
>> .data = (ulong)&stm32mp1_adc_cfg },
>> + { .compatible = "st,stm32mp13-adc",
>> + .data = (ulong)&stm32mp13_adc_cfg },
>> {}
>> };
>>
>
>
> only minor remarks
>
>
> Reviewed-by: Patrick Delaunay <patrick.delaunay@foss.st.com>
>
> Thanks
> Patrick
>
>
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2025-11-14 16:05 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-10-09 15:25 [PATCH v1 0/3] stm32mp13: Add ADC support and USB power delivery check Patrice Chotard
2025-10-09 15:25 ` [PATCH v1 1/3] adc: stm32mp13: add support of adc to stm32mp13 Patrice Chotard
2025-11-13 17:59 ` Patrick DELAUNAY
2025-11-14 16:05 ` Patrice CHOTARD
2025-10-09 15:25 ` [PATCH v1 2/3] configs: stm32: Enable ADC support for stm32mp13_defconfig Patrice Chotard
2025-11-13 18:00 ` Patrick DELAUNAY
2025-10-09 15:26 ` [PATCH v1 3/3] ARM: dts: Add st, adc_usb_pd property for stm32mp135-dk-u-boot Patrice Chotard
2025-11-13 18:01 ` [PATCH v1 3/3] ARM: dts: Add st,adc_usb_pd " Patrick DELAUNAY
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox