U-Boot Archive on lore.kernel.org
 help / color / mirror / Atom feed
* [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