[PATCH v1 4/4] arm: boards: protonic-stm32mp: free shift register GPIOs after use

Oleksij Rempel o.rempel at pengutronix.de
Mon Mar 31 05:30:32 PDT 2025


The GPIOs used to access the external shift register (PL_N, CP, Q7) are
shared with other functionality - including the LED heartbeat driver.

After the board code completes reading the shift register during early
boot, the GPIOs are no longer needed for that purpose. Free them
immediately to avoid resource conflicts and allow reuse (e.g., for
LEDs or other drivers).

This change applies to both STM32MP1 and STM32MP13 board code.

Signed-off-by: Oleksij Rempel <o.rempel at pengutronix.de>
---
 arch/arm/boards/protonic-stm32mp1/board.c  | 8 ++++++++
 arch/arm/boards/protonic-stm32mp13/board.c | 8 ++++++++
 2 files changed, 16 insertions(+)

diff --git a/arch/arm/boards/protonic-stm32mp1/board.c b/arch/arm/boards/protonic-stm32mp1/board.c
index 4c8ad9e53388..9116876ad59f 100644
--- a/arch/arm/boards/protonic-stm32mp1/board.c
+++ b/arch/arm/boards/protonic-stm32mp1/board.c
@@ -230,6 +230,13 @@ static void prt_stm32_read_shift_reg(struct device *dev)
 	gpio_set_value(PRT_STM32_GPIO_HWID_CP, 1);
 }
 
+static void prt_stm32_put_gpios(void)
+{
+	gpio_free(PRT_STM32_GPIO_HWID_PL_N);
+	gpio_free(PRT_STM32_GPIO_HWID_CP);
+	gpio_free(PRT_STM32_GPIO_HWID_Q7);
+}
+
 static int prt_stm32_probe(struct device *dev)
 {
 	const struct prt_stm32_machine_data *dcfg;
@@ -247,6 +254,7 @@ static int prt_stm32_probe(struct device *dev)
 	if (!(dcfg->flags & PRT_STM32_NO_SHIFT_REG)) {
 		prt_stm32_init_shift_reg(dev);
 		prt_stm32_read_shift_reg(dev);
+		prt_stm32_put_gpios();
 	}
 
 	for (i = 0; i < ARRAY_SIZE(prt_stm32_boot_devs); i++) {
diff --git a/arch/arm/boards/protonic-stm32mp13/board.c b/arch/arm/boards/protonic-stm32mp13/board.c
index 4268db2b384c..fe251b9e7764 100644
--- a/arch/arm/boards/protonic-stm32mp13/board.c
+++ b/arch/arm/boards/protonic-stm32mp13/board.c
@@ -214,6 +214,13 @@ static void prt_stm32_read_shift_reg(struct device *dev)
 	gpio_set_value(PRT_STM32_GPIO_HWID_CP, 1);
 }
 
+static void prt_stm32_put_gpios(void)
+{
+	gpio_free(PRT_STM32_GPIO_HWID_PL_N);
+	gpio_free(PRT_STM32_GPIO_HWID_CP);
+	gpio_free(PRT_STM32_GPIO_HWID_Q7);
+}
+
 static int prt_stm32_probe(struct device *dev)
 {
 	const struct prt_stm32_machine_data *dcfg;
@@ -229,6 +236,7 @@ static int prt_stm32_probe(struct device *dev)
 	prt_stm32_read_serial(dev);
 	prt_stm32_init_shift_reg(dev);
 	prt_stm32_read_shift_reg(dev);
+	prt_stm32_put_gpios();
 
 	for (i = 0; i < ARRAY_SIZE(prt_stm32_boot_devs); i++) {
 		const struct prt_stm32_boot_dev *bd = &prt_stm32_boot_devs[i];
-- 
2.39.5




More information about the barebox mailing list