mail archive of the barebox mailing list
 help / color / mirror / Atom feed
* [PATCH 0/9] ARM: boards: protonic-mecsbc: Generalization
@ 2026-03-04 11:00 Robin van der Gracht
  2026-03-04 11:00 ` [PATCH 1/9] ARM: boards: Rename protonic-mecsbc to protonic-rk356x Robin van der Gracht
                   ` (8 more replies)
  0 siblings, 9 replies; 10+ messages in thread
From: Robin van der Gracht @ 2026-03-04 11:00 UTC (permalink / raw)
  To: barebox; +Cc: Robin van der Gracht

From: Robin van der Gracht <robin.van.der.gracht@protonic.nl>

Hello,
This patch series makes changes to the existing protonic-mecsbc
board support. These changes pave the way for supporting multiple
simular products with the same board support code. We'll be adding
products with a RK3562 chipset to the mecsbc board code. 
For that we'll change the board name to be more generic: protonic-rk356x

Regards,
Robin

David Jander (1):
  ARM: boards: protonic-rk356x: Fix crash with different boards

Robin van der Gracht (8):
  ARM: boards: Rename protonic-mecsbc to protonic-rk356x
  ARM: boards: protonic-rk356x: Remove VIN measurement
  ARM: boards: protonic-rk356x: Use devicetree alias for saradc
  ARM: boards: protonic-rk356x: Configure ADC and channels in model data
  ARM: boards: protonic-rk356x: Move mecsbc code to model init function
  ARM: boards: protonic-rk356x: Use rockchip_bbu_mmc_register
  ARM: boards: protonic-rk356x: Move bbu setup to device late init
  ARM: boards: protonic-rk356x: Read board serial and MAC address from
    eMMC

 Documentation/boards/rk35xx.rst               |   2 +-
 arch/arm/boards/Makefile                      |   2 +-
 arch/arm/boards/protonic-mecsbc/board.c       | 180 -----------
 .../Makefile                                  |   0
 arch/arm/boards/protonic-rk356x/board.c       | 297 ++++++++++++++++++
 .../lowlevel.c                                |   0
 arch/arm/configs/rockchip_v8_defconfig        |   2 +-
 arch/arm/dts/Makefile                         |   2 +-
 arch/arm/dts/rk3568-mecsbc.dts                |   1 +
 arch/arm/mach-rockchip/Kconfig                |   6 +-
 images/Makefile.rockchip                      |   2 +-
 11 files changed, 306 insertions(+), 188 deletions(-)
 delete mode 100644 arch/arm/boards/protonic-mecsbc/board.c
 rename arch/arm/boards/{protonic-mecsbc => protonic-rk356x}/Makefile (100%)
 create mode 100644 arch/arm/boards/protonic-rk356x/board.c
 rename arch/arm/boards/{protonic-mecsbc => protonic-rk356x}/lowlevel.c (100%)

-- 
2.43.0



^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH 1/9] ARM: boards: Rename protonic-mecsbc to protonic-rk356x
  2026-03-04 11:00 [PATCH 0/9] ARM: boards: protonic-mecsbc: Generalization Robin van der Gracht
@ 2026-03-04 11:00 ` Robin van der Gracht
  2026-03-04 11:00 ` [PATCH 2/9] ARM: boards: protonic-rk356x: Remove VIN measurement Robin van der Gracht
                   ` (7 subsequent siblings)
  8 siblings, 0 replies; 10+ messages in thread
From: Robin van der Gracht @ 2026-03-04 11:00 UTC (permalink / raw)
  To: barebox; +Cc: Robin van der Gracht

A more generic name which allows us to add more boards in the future.

Signed-off-by: Robin van der Gracht <robin.van.der.gracht@protonic.nl>
---
 Documentation/boards/rk35xx.rst               |  2 +-
 arch/arm/boards/Makefile                      |  2 +-
 .../Makefile                                  |  0
 .../board.c                                   | 70 +++++++++----------
 .../lowlevel.c                                |  0
 arch/arm/configs/rockchip_v8_defconfig        |  2 +-
 arch/arm/dts/Makefile                         |  2 +-
 arch/arm/mach-rockchip/Kconfig                |  6 +-
 images/Makefile.rockchip                      |  2 +-
 9 files changed, 43 insertions(+), 43 deletions(-)
 rename arch/arm/boards/{protonic-mecsbc => protonic-rk356x}/Makefile (100%)
 rename arch/arm/boards/{protonic-mecsbc => protonic-rk356x}/board.c (61%)
 rename arch/arm/boards/{protonic-mecsbc => protonic-rk356x}/lowlevel.c (100%)

diff --git a/Documentation/boards/rk35xx.rst b/Documentation/boards/rk35xx.rst
index 0a016909f0..fe74e10870 100644
--- a/Documentation/boards/rk35xx.rst
+++ b/Documentation/boards/rk35xx.rst
@@ -15,7 +15,7 @@ Supported Boards
 - Radxa ROCK5 (RK3588)
 - Radxa CM3 (RK3566) IO Board
 - QNAP TS-433 NAS
-- Protonic MECSBC
+- Protonic RK356x
 - Protonic PRTPUK
 
 .. toctree::
diff --git a/arch/arm/boards/Makefile b/arch/arm/boards/Makefile
index 0b090d43fd..4806ef2ccf 100644
--- a/arch/arm/boards/Makefile
+++ b/arch/arm/boards/Makefile
@@ -94,8 +94,8 @@ obj-$(CONFIG_MACH_PM9G45)			+= pm9g45/
 obj-$(CONFIG_MACH_POLYHEX_DEBIX)		+= polyhex-debix/
 obj-$(CONFIG_MACH_PROTONIC_IMX6)		+= protonic-imx6/
 obj-$(CONFIG_MACH_PROTONIC_IMX8M)		+= protonic-imx8m/
-obj-$(CONFIG_MACH_PROTONIC_MECSBC)		+= protonic-mecsbc/
 obj-$(CONFIG_MACH_PROTONIC_PRTPUK)		+= protonic-prtpuk/
+obj-$(CONFIG_MACH_PROTONIC_RK356X)		+= protonic-rk356x/
 obj-$(CONFIG_MACH_PROTONIC_STM32MP1)		+= protonic-stm32mp1/
 obj-$(CONFIG_MACH_PROTONIC_STM32MP13)		+= protonic-stm32mp13/
 obj-$(CONFIG_MACH_QIL_A9260)			+= qil-a926x/
diff --git a/arch/arm/boards/protonic-mecsbc/Makefile b/arch/arm/boards/protonic-rk356x/Makefile
similarity index 100%
rename from arch/arm/boards/protonic-mecsbc/Makefile
rename to arch/arm/boards/protonic-rk356x/Makefile
diff --git a/arch/arm/boards/protonic-mecsbc/board.c b/arch/arm/boards/protonic-rk356x/board.c
similarity index 61%
rename from arch/arm/boards/protonic-mecsbc/board.c
rename to arch/arm/boards/protonic-rk356x/board.c
index 56f7ca393a..51d08b6705 100644
--- a/arch/arm/boards/protonic-mecsbc/board.c
+++ b/arch/arm/boards/protonic-rk356x/board.c
@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0-only
 
-#define pr_fmt(fmt) "MECSBC: " fmt
+#define pr_fmt(fmt) "Protonic RK356x: " fmt
 
 #include <bootsource.h>
 #include <common.h>
@@ -13,17 +13,17 @@
 #include <aiodev.h>
 #include <globalvar.h>
 
-struct mecsbc_model {
+struct prt_rk356x_model {
 	const char *name;
 	const char *shortname;
 };
 
-struct mecsbc_priv {
+struct prt_rk356x_priv {
 	int hw_id;
 	int hw_rev;
 };
 
-static struct mecsbc_priv mecsbc_data;
+static struct prt_rk356x_priv prt_priv;
 
 static int saradc_get_value(const char *chan)
 {
@@ -38,56 +38,56 @@ static int saradc_get_value(const char *chan)
 	return voltage;
 }
 
-static int mecsbc_get_vin_mv(void)
+static int prt_rk356x_get_vin_mv(void)
 {
 	return saradc_get_value("aiodev0.in_value2_mV") * 22;
 }
 
-static bool mecsbc_get_usb_boot(void)
+static bool prt_rk356x_get_usb_boot(void)
 {
 	return saradc_get_value("aiodev0.in_value0_mV") < 74;
 }
 
-static int mecsbc_adc_id_values[] = {
+static int prt_rk356x_adc_id_values[] = {
 	1800, 1662, 1521, 1354, 1214, 1059, 900, 742, 335, 589, 278, 137, 0
 };
 
-static int mecsbc_get_adc_id(const char *chan)
+static int prt_rk356x_get_adc_id(const char *chan)
 {
 	int val;
 	unsigned int t;
 
 	val = saradc_get_value(chan) + 74;
 
-	for (t = 0; t < ARRAY_SIZE(mecsbc_adc_id_values); t++) {
-		if (val > mecsbc_adc_id_values[t])
+	for (t = 0; t < ARRAY_SIZE(prt_rk356x_adc_id_values); t++) {
+		if (val > prt_rk356x_adc_id_values[t])
 			return t;
 	}
 
 	return t;
 }
 
-static void mecsbc_process_adc(struct device *dev)
+static void prt_rk356x_process_adc(struct device *dev)
 {
-	mecsbc_data.hw_id = mecsbc_get_adc_id("aiodev0.in_value1_mV");
-	mecsbc_data.hw_rev = mecsbc_get_adc_id("aiodev0.in_value3_mV");
+	prt_priv.hw_id = prt_rk356x_get_adc_id("aiodev0.in_value1_mV");
+	prt_priv.hw_rev = prt_rk356x_get_adc_id("aiodev0.in_value3_mV");
 
-	dev_add_param_uint32_ro(dev, "boardrev", &mecsbc_data.hw_rev, "%u");
-	dev_add_param_uint32_ro(dev, "boardid", &mecsbc_data.hw_id, "%u");
+	dev_add_param_uint32_ro(dev, "boardrev", &prt_priv.hw_rev, "%u");
+	dev_add_param_uint32_ro(dev, "boardid", &prt_priv.hw_id, "%u");
 
 	/* Check if we need to enable the USB gadget instead of booting */
-	if (mecsbc_get_usb_boot()) {
+	if (prt_rk356x_get_usb_boot()) {
 		globalvar_add_simple("boot.default", "net");
 		globalvar_add_simple("usbgadget.acm", "1");
 		globalvar_add_simple("usbgadget.autostart", "1");
 		globalvar_add_simple("system.partitions", "/dev/mmc0(mmc0)");
-		pr_info("MECSBC: Enter USB recovery\n");
+		pr_info("Enter USB recovery\n");
 	} else {
 		globalvar_add_simple("boot.default", "bootchooser");
 	}
 
-	pr_info("Board id: %d, revision %d\n", mecsbc_data.hw_id, mecsbc_data.hw_rev);
-	pr_info("VIN = %d V\n", mecsbc_get_vin_mv() / 1000);
+	pr_info("Board id: %d, revision %d\n", prt_priv.hw_id, prt_priv.hw_rev);
+	pr_info("VIN = %d V\n", prt_rk356x_get_vin_mv() / 1000);
 }
 
 static int mecsbc_sd_of_fixup(struct device_node *root, void *context)
@@ -108,31 +108,31 @@ static int mecsbc_sd_of_fixup(struct device_node *root, void *context)
 	return 0;
 }
 
-static int mecsbc_of_fixup_hwrev(struct device *dev)
+static int prt_rk356x_of_fixup_hwrev(struct device *dev)
 {
 	const char *compat;
 	char *buf;
 
 	compat = of_device_get_match_compatible(dev);
 
-	buf = xasprintf("%s-m%u-r%u", compat, mecsbc_data.hw_id,
-			mecsbc_data.hw_rev);
+	buf = xasprintf("%s-m%u-r%u", compat, prt_priv.hw_id,
+			prt_priv.hw_rev);
 	barebox_set_of_machine_compatible(buf);
 
 	free(buf);
 
-	if (mecsbc_data.hw_id == 0 && mecsbc_data.hw_rev == 0)
+	if (prt_priv.hw_id == 0 && prt_priv.hw_rev == 0)
 		of_register_fixup(mecsbc_sd_of_fixup, dev);
 
 	return 0;
 }
 
-static int mecsbc_probe(struct device *dev)
+static int prt_rk356x_probe(struct device *dev)
 {
 	int ret = 0;
 	enum bootsource bootsource = bootsource_get();
 	int instance = bootsource_get_instance();
-	const struct mecsbc_model *model;
+	const struct prt_rk356x_model *model;
 	struct device_node *np;
 
 	np = of_find_node_by_name_address(NULL, "saradc@fe720000");
@@ -151,18 +151,18 @@ static int mecsbc_probe(struct device *dev)
 	rk3568_bbu_mmc_register("emmc", BBU_HANDLER_FLAG_DEFAULT, "/dev/mmc0");
 	rk3568_bbu_mmc_register("sd", 0, "/dev/mmc1");
 
-	mecsbc_process_adc(dev);
-	mecsbc_of_fixup_hwrev(dev);
+	prt_rk356x_process_adc(dev);
+	prt_rk356x_of_fixup_hwrev(dev);
 
 	return ret;
 }
 
-static const struct mecsbc_model mecsbc = {
+static const struct prt_rk356x_model mecsbc = {
 	.name = "Protonic MECSBC board",
 	.shortname = "mecsbc",
 };
 
-static const struct of_device_id mecsbc_of_match[] = {
+static const struct of_device_id prt_rk356x_of_match[] = {
 	{
 		.compatible = "prt,mecsbc",
 		.data = &mecsbc,
@@ -170,11 +170,11 @@ static const struct of_device_id mecsbc_of_match[] = {
 	{ /* sentinel */ },
 };
 
-static struct driver mecsbc_board_driver = {
-	.name = "board-mecsbc",
-	.probe = mecsbc_probe,
-	.of_compatible = mecsbc_of_match,
+static struct driver prt_rk356x_board_driver = {
+	.name = "board-protonic-rk356x",
+	.probe = prt_rk356x_probe,
+	.of_compatible = prt_rk356x_of_match,
 };
-coredevice_platform_driver(mecsbc_board_driver);
+coredevice_platform_driver(prt_rk356x_board_driver);
 
-BAREBOX_DEEP_PROBE_ENABLE(mecsbc_of_match);
+BAREBOX_DEEP_PROBE_ENABLE(prt_rk356x_of_match);
diff --git a/arch/arm/boards/protonic-mecsbc/lowlevel.c b/arch/arm/boards/protonic-rk356x/lowlevel.c
similarity index 100%
rename from arch/arm/boards/protonic-mecsbc/lowlevel.c
rename to arch/arm/boards/protonic-rk356x/lowlevel.c
diff --git a/arch/arm/configs/rockchip_v8_defconfig b/arch/arm/configs/rockchip_v8_defconfig
index b8fc83b842..e0df655ea0 100644
--- a/arch/arm/configs/rockchip_v8_defconfig
+++ b/arch/arm/configs/rockchip_v8_defconfig
@@ -5,7 +5,7 @@ CONFIG_MACH_RK3568_EVB=y
 CONFIG_MACH_RK3568_BPI_R2PRO=y
 CONFIG_MACH_PINE64_PINETAB2=y
 CONFIG_MACH_PINE64_QUARTZ64=y
-CONFIG_MACH_PROTONIC_MECSBC=y
+CONFIG_MACH_PROTONIC_RK356X=y
 CONFIG_MACH_PROTONIC_PRTPUK=y
 CONFIG_MACH_QNAP_TSX33=y
 CONFIG_MACH_RADXA_ROCK3=y
diff --git a/arch/arm/dts/Makefile b/arch/arm/dts/Makefile
index 7a846e878b..ed018dbf7a 100644
--- a/arch/arm/dts/Makefile
+++ b/arch/arm/dts/Makefile
@@ -119,8 +119,8 @@ lwl-$(CONFIG_MACH_PROTONIC_IMX6) += \
 lwl-$(CONFIG_MACH_PROTONIC_IMX8M) += \
 	imx8mm-prt8mm.dtb.o \
 	imx8mp-prt8ml.dtb.o
-lwl-$(CONFIG_MACH_PROTONIC_MECSBC) += rk3568-mecsbc.dtb.o
 lwl-$(CONFIG_MACH_PROTONIC_PRTPUK) += rk3576-prtpuk.dtb.o
+lwl-$(CONFIG_MACH_PROTONIC_RK356X) += rk3568-mecsbc.dtb.o
 lwl-$(CONFIG_MACH_PROTONIC_STM32MP1) += \
 	stm32mp151-prtt1a.dtb.o \
 	stm32mp151-prtt1c.dtb.o \
diff --git a/arch/arm/mach-rockchip/Kconfig b/arch/arm/mach-rockchip/Kconfig
index c1c96c545e..30945b9e09 100644
--- a/arch/arm/mach-rockchip/Kconfig
+++ b/arch/arm/mach-rockchip/Kconfig
@@ -109,11 +109,11 @@ config MACH_PINE64_QUARTZ64
 	help
 	  Say Y here if you are using a Pine64 Quartz64
 
-config MACH_PROTONIC_MECSBC
+config MACH_PROTONIC_RK356X
 	select ARCH_RK3568
-	bool "Protonic MECSBC"
+	bool "Protonic RK356x"
 	help
-	  Say Y here if you are using a Protonic MECSBC
+	  Say Y here if you are using a Protonic board with a RK356x cpu
 
 config MACH_PROTONIC_PRTPUK
 	select ARCH_RK3576
diff --git a/images/Makefile.rockchip b/images/Makefile.rockchip
index 7651f88d62..585341587d 100644
--- a/images/Makefile.rockchip
+++ b/images/Makefile.rockchip
@@ -44,7 +44,7 @@ $(call build_rockchip_image, CONFIG_MACH_RK3568_BPI_R2PRO, start_rk3568_bpi_r2pr
 $(call build_rockchip_image, CONFIG_MACH_PINE64_PINETAB2, start_pinetab2_v0, pine64-pinetab2/sdram-init.bin, pinetab2-v0)
 $(call build_rockchip_image, CONFIG_MACH_PINE64_PINETAB2, start_pinetab2_v2, pine64-pinetab2/sdram-init.bin, pinetab2-v2)
 $(call build_rockchip_image, CONFIG_MACH_PINE64_QUARTZ64, start_quartz64a, pine64-quartz64/sdram-init.bin, quartz64a)
-$(call build_rockchip_image, CONFIG_MACH_PROTONIC_MECSBC, start_mecsbc, protonic-mecsbc/sdram-init.bin, mecsbc)
+$(call build_rockchip_image, CONFIG_MACH_PROTONIC_RK356X, start_mecsbc, protonic-rk356x/rk3568-sdram-init.bin, mecsbc)
 $(call build_rockchip_image, CONFIG_MACH_PROTONIC_PRTPUK, start_prtpuk, protonic-prtpuk/sdram-init.bin, prtpuk)
 $(call build_rockchip_image, CONFIG_MACH_QNAP_TSX33, start_rk3568_qnap_ts433, qnap-tsx33/sdram-init.bin, qnap-ts433)
 $(call build_rockchip_image, CONFIG_MACH_QNAP_TSX33, start_rk3568_qnap_ts433eu, qnap-tsx33/sdram-init.bin, qnap-ts433-eu)
-- 
2.43.0




^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH 2/9] ARM: boards: protonic-rk356x: Remove VIN measurement
  2026-03-04 11:00 [PATCH 0/9] ARM: boards: protonic-mecsbc: Generalization Robin van der Gracht
  2026-03-04 11:00 ` [PATCH 1/9] ARM: boards: Rename protonic-mecsbc to protonic-rk356x Robin van der Gracht
@ 2026-03-04 11:00 ` Robin van der Gracht
  2026-03-04 11:00 ` [PATCH 3/9] ARM: boards: protonic-rk356x: Use devicetree alias for saradc Robin van der Gracht
                   ` (6 subsequent siblings)
  8 siblings, 0 replies; 10+ messages in thread
From: Robin van der Gracht @ 2026-03-04 11:00 UTC (permalink / raw)
  To: barebox; +Cc: Robin van der Gracht

The VIN measurement is inaccurate and requires storing channel and
multiplier information in the board code. This becomes cumbersome
when more boards are added.

Signed-off-by: Robin van der Gracht <robin.van.der.gracht@protonic.nl>
---
 arch/arm/boards/protonic-rk356x/board.c | 6 ------
 1 file changed, 6 deletions(-)

diff --git a/arch/arm/boards/protonic-rk356x/board.c b/arch/arm/boards/protonic-rk356x/board.c
index 51d08b6705..c01438847a 100644
--- a/arch/arm/boards/protonic-rk356x/board.c
+++ b/arch/arm/boards/protonic-rk356x/board.c
@@ -38,11 +38,6 @@ static int saradc_get_value(const char *chan)
 	return voltage;
 }
 
-static int prt_rk356x_get_vin_mv(void)
-{
-	return saradc_get_value("aiodev0.in_value2_mV") * 22;
-}
-
 static bool prt_rk356x_get_usb_boot(void)
 {
 	return saradc_get_value("aiodev0.in_value0_mV") < 74;
@@ -87,7 +82,6 @@ static void prt_rk356x_process_adc(struct device *dev)
 	}
 
 	pr_info("Board id: %d, revision %d\n", prt_priv.hw_id, prt_priv.hw_rev);
-	pr_info("VIN = %d V\n", prt_rk356x_get_vin_mv() / 1000);
 }
 
 static int mecsbc_sd_of_fixup(struct device_node *root, void *context)
-- 
2.43.0




^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH 3/9] ARM: boards: protonic-rk356x: Use devicetree alias for saradc
  2026-03-04 11:00 [PATCH 0/9] ARM: boards: protonic-mecsbc: Generalization Robin van der Gracht
  2026-03-04 11:00 ` [PATCH 1/9] ARM: boards: Rename protonic-mecsbc to protonic-rk356x Robin van der Gracht
  2026-03-04 11:00 ` [PATCH 2/9] ARM: boards: protonic-rk356x: Remove VIN measurement Robin van der Gracht
@ 2026-03-04 11:00 ` Robin van der Gracht
  2026-03-04 11:00 ` [PATCH 4/9] ARM: boards: protonic-rk356x: Configure ADC and channels in model data Robin van der Gracht
                   ` (5 subsequent siblings)
  8 siblings, 0 replies; 10+ messages in thread
From: Robin van der Gracht @ 2026-03-04 11:00 UTC (permalink / raw)
  To: barebox; +Cc: Robin van der Gracht

Using an alias in the device tree is cleaner and more flexible than a
hard coded address. This change paves the way for adding support for a
chip with the saradc at a different address (i.e. RK3562) later on.

Signed-off-by: Robin van der Gracht <robin.van.der.gracht@protonic.nl>
---
 arch/arm/boards/protonic-rk356x/board.c | 18 ++++++++++--------
 arch/arm/dts/rk3568-mecsbc.dts          |  1 +
 2 files changed, 11 insertions(+), 8 deletions(-)

diff --git a/arch/arm/boards/protonic-rk356x/board.c b/arch/arm/boards/protonic-rk356x/board.c
index c01438847a..aec0303e94 100644
--- a/arch/arm/boards/protonic-rk356x/board.c
+++ b/arch/arm/boards/protonic-rk356x/board.c
@@ -40,7 +40,7 @@ static int saradc_get_value(const char *chan)
 
 static bool prt_rk356x_get_usb_boot(void)
 {
-	return saradc_get_value("aiodev0.in_value0_mV") < 74;
+	return saradc_get_value("saradc.in_value0_mV") < 74;
 }
 
 static int prt_rk356x_adc_id_values[] = {
@@ -64,8 +64,8 @@ static int prt_rk356x_get_adc_id(const char *chan)
 
 static void prt_rk356x_process_adc(struct device *dev)
 {
-	prt_priv.hw_id = prt_rk356x_get_adc_id("aiodev0.in_value1_mV");
-	prt_priv.hw_rev = prt_rk356x_get_adc_id("aiodev0.in_value3_mV");
+	prt_priv.hw_id = prt_rk356x_get_adc_id("saradc.in_value1_mV");
+	prt_priv.hw_rev = prt_rk356x_get_adc_id("saradc.in_value3_mV");
 
 	dev_add_param_uint32_ro(dev, "boardrev", &prt_priv.hw_rev, "%u");
 	dev_add_param_uint32_ro(dev, "boardid", &prt_priv.hw_id, "%u");
@@ -123,14 +123,16 @@ static int prt_rk356x_of_fixup_hwrev(struct device *dev)
 
 static int prt_rk356x_probe(struct device *dev)
 {
-	int ret = 0;
+	int error;
 	enum bootsource bootsource = bootsource_get();
 	int instance = bootsource_get_instance();
 	const struct prt_rk356x_model *model;
-	struct device_node *np;
 
-	np = of_find_node_by_name_address(NULL, "saradc@fe720000");
-	of_device_ensure_probed(np);
+	error = of_device_ensure_probed_by_alias("saradc");
+	if (error) {
+		pr_err("saradc is not available\n");
+		return error;
+	}
 
 	model = device_get_match_data(dev);
 
@@ -148,7 +150,7 @@ static int prt_rk356x_probe(struct device *dev)
 	prt_rk356x_process_adc(dev);
 	prt_rk356x_of_fixup_hwrev(dev);
 
-	return ret;
+	return 0;
 }
 
 static const struct prt_rk356x_model mecsbc = {
diff --git a/arch/arm/dts/rk3568-mecsbc.dts b/arch/arm/dts/rk3568-mecsbc.dts
index 1beea32f03..7407f59f9e 100644
--- a/arch/arm/dts/rk3568-mecsbc.dts
+++ b/arch/arm/dts/rk3568-mecsbc.dts
@@ -10,6 +10,7 @@ / {
 
 	aliases {
 		state = &state_emmc;
+		saradc = &saradc;
 	};
 
 	chosen: chosen {
-- 
2.43.0




^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH 4/9] ARM: boards: protonic-rk356x: Configure ADC and channels in model data
  2026-03-04 11:00 [PATCH 0/9] ARM: boards: protonic-mecsbc: Generalization Robin van der Gracht
                   ` (2 preceding siblings ...)
  2026-03-04 11:00 ` [PATCH 3/9] ARM: boards: protonic-rk356x: Use devicetree alias for saradc Robin van der Gracht
@ 2026-03-04 11:00 ` Robin van der Gracht
  2026-03-04 11:00 ` [PATCH 5/9] ARM: boards: protonic-rk356x: Move mecsbc code to model init function Robin van der Gracht
                   ` (4 subsequent siblings)
  8 siblings, 0 replies; 10+ messages in thread
From: Robin van der Gracht @ 2026-03-04 11:00 UTC (permalink / raw)
  To: barebox; +Cc: Robin van der Gracht

Different boards have different ADC's and/or channels for acquiring the
same information. For example on the the RK3562 the first adc channel of
saradc0 is not available for generic use. But it is used on the MECSBC
(RK3568) board.

This conflicts with the hard coded board code as is. Making it per-board
configurable simplifies adding more boards later on.

Signed-off-by: Robin van der Gracht <robin.van.der.gracht@protonic.nl>
---
 arch/arm/boards/protonic-rk356x/board.c | 43 ++++++++++++++++---------
 1 file changed, 27 insertions(+), 16 deletions(-)

diff --git a/arch/arm/boards/protonic-rk356x/board.c b/arch/arm/boards/protonic-rk356x/board.c
index aec0303e94..1aff5ddbc8 100644
--- a/arch/arm/boards/protonic-rk356x/board.c
+++ b/arch/arm/boards/protonic-rk356x/board.c
@@ -7,15 +7,23 @@
 #include <deep-probe.h>
 #include <init.h>
 #include <mach/rockchip/bbu.h>
+#include <mach/rockchip/rockchip.h>
 #include <environment.h>
 #include <param.h>
 #include <of_device.h>
 #include <aiodev.h>
 #include <globalvar.h>
 
+struct prt_rk356x_adc_chs {
+	int usb_boot;
+	int hw_id;
+	int hw_rev;
+};
+
 struct prt_rk356x_model {
 	const char *name;
 	const char *shortname;
+	const struct prt_rk356x_adc_chs adc_channels;
 };
 
 struct prt_rk356x_priv {
@@ -25,34 +33,35 @@ struct prt_rk356x_priv {
 
 static struct prt_rk356x_priv prt_priv;
 
-static int saradc_get_value(const char *chan)
+static int saradc_read_mv(int chan)
 {
-	int ret, voltage;
+	int error, voltage = 0;
+	char *name;
 
-	ret = aiochannel_name_get_value(chan, &voltage);
-	if (ret) {
-		pr_warn_once("Cannot read ADC %s: %pe\n", chan, ERR_PTR(ret));
-		return 0;
-	}
+	name = xasprintf("saradc.in_value%d_mV", chan);
+	error = aiochannel_name_get_value(name, &voltage);
+	if (error)
+		pr_warn_once("Cannot read ADC %s: %pe\n", name, ERR_PTR(error));
 
+	free(name);
 	return voltage;
 }
 
-static bool prt_rk356x_get_usb_boot(void)
+static bool prt_rk356x_get_usb_boot(int chan)
 {
-	return saradc_get_value("saradc.in_value0_mV") < 74;
+	return saradc_read_mv(chan) < 74;
 }
 
 static int prt_rk356x_adc_id_values[] = {
 	1800, 1662, 1521, 1354, 1214, 1059, 900, 742, 335, 589, 278, 137, 0
 };
 
-static int prt_rk356x_get_adc_id(const char *chan)
+static int prt_rk356x_get_adc_id(int chan)
 {
 	int val;
 	unsigned int t;
 
-	val = saradc_get_value(chan) + 74;
+	val = saradc_read_mv(chan) + 74;
 
 	for (t = 0; t < ARRAY_SIZE(prt_rk356x_adc_id_values); t++) {
 		if (val > prt_rk356x_adc_id_values[t])
@@ -62,16 +71,17 @@ static int prt_rk356x_get_adc_id(const char *chan)
 	return t;
 }
 
-static void prt_rk356x_process_adc(struct device *dev)
+static void prt_rk356x_process_adc(struct device *dev,
+				   const struct prt_rk356x_adc_chs *adc_chs)
 {
-	prt_priv.hw_id = prt_rk356x_get_adc_id("saradc.in_value1_mV");
-	prt_priv.hw_rev = prt_rk356x_get_adc_id("saradc.in_value3_mV");
+	prt_priv.hw_id = prt_rk356x_get_adc_id(adc_chs->hw_id);
+	prt_priv.hw_rev = prt_rk356x_get_adc_id(adc_chs->hw_rev);
 
 	dev_add_param_uint32_ro(dev, "boardrev", &prt_priv.hw_rev, "%u");
 	dev_add_param_uint32_ro(dev, "boardid", &prt_priv.hw_id, "%u");
 
 	/* Check if we need to enable the USB gadget instead of booting */
-	if (prt_rk356x_get_usb_boot()) {
+	if (prt_rk356x_get_usb_boot(adc_chs->usb_boot)) {
 		globalvar_add_simple("boot.default", "net");
 		globalvar_add_simple("usbgadget.acm", "1");
 		globalvar_add_simple("usbgadget.autostart", "1");
@@ -147,7 +157,7 @@ static int prt_rk356x_probe(struct device *dev)
 	rk3568_bbu_mmc_register("emmc", BBU_HANDLER_FLAG_DEFAULT, "/dev/mmc0");
 	rk3568_bbu_mmc_register("sd", 0, "/dev/mmc1");
 
-	prt_rk356x_process_adc(dev);
+	prt_rk356x_process_adc(dev, &model->adc_channels);
 	prt_rk356x_of_fixup_hwrev(dev);
 
 	return 0;
@@ -156,6 +166,7 @@ static int prt_rk356x_probe(struct device *dev)
 static const struct prt_rk356x_model mecsbc = {
 	.name = "Protonic MECSBC board",
 	.shortname = "mecsbc",
+	.adc_channels = {0, 1, 3},
 };
 
 static const struct of_device_id prt_rk356x_of_match[] = {
-- 
2.43.0




^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH 5/9] ARM: boards: protonic-rk356x: Move mecsbc code to model init function
  2026-03-04 11:00 [PATCH 0/9] ARM: boards: protonic-mecsbc: Generalization Robin van der Gracht
                   ` (3 preceding siblings ...)
  2026-03-04 11:00 ` [PATCH 4/9] ARM: boards: protonic-rk356x: Configure ADC and channels in model data Robin van der Gracht
@ 2026-03-04 11:00 ` Robin van der Gracht
  2026-03-04 11:00 ` [PATCH 6/9] ARM: boards: protonic-rk356x: Use rockchip_bbu_mmc_register Robin van der Gracht
                   ` (3 subsequent siblings)
  8 siblings, 0 replies; 10+ messages in thread
From: Robin van der Gracht @ 2026-03-04 11:00 UTC (permalink / raw)
  To: barebox; +Cc: Robin van der Gracht

This adds a means for registering a model specific late initcall function.

Signed-off-by: Robin van der Gracht <robin.van.der.gracht@protonic.nl>
---
 arch/arm/boards/protonic-rk356x/board.c | 34 ++++++++++++++++++++++---
 1 file changed, 30 insertions(+), 4 deletions(-)

diff --git a/arch/arm/boards/protonic-rk356x/board.c b/arch/arm/boards/protonic-rk356x/board.c
index 1aff5ddbc8..d36f2477fd 100644
--- a/arch/arm/boards/protonic-rk356x/board.c
+++ b/arch/arm/boards/protonic-rk356x/board.c
@@ -24,11 +24,14 @@ struct prt_rk356x_model {
 	const char *name;
 	const char *shortname;
 	const struct prt_rk356x_adc_chs adc_channels;
+	int (*init)(void);
 };
 
 struct prt_rk356x_priv {
 	int hw_id;
 	int hw_rev;
+	struct device *dev;
+	const struct prt_rk356x_model *model;
 };
 
 static struct prt_rk356x_priv prt_priv;
@@ -112,6 +115,30 @@ static int mecsbc_sd_of_fixup(struct device_node *root, void *context)
 	return 0;
 }
 
+static int prt_rk356x_mecsbc_init(void)
+{
+	if (prt_priv.hw_id == 0 && prt_priv.hw_rev == 0)
+		of_register_fixup(mecsbc_sd_of_fixup, prt_priv.dev);
+
+	return 0;
+}
+
+static int prt_rk356x_devices_init(void)
+{
+	int ret;
+
+	if (prt_priv.model->init) {
+		ret = prt_priv.model->init();
+		if (ret) {
+			pr_warn("Model init failed with %d\n", ret);
+			return ret;
+		}
+	}
+
+	return 0;
+}
+late_initcall(prt_rk356x_devices_init);
+
 static int prt_rk356x_of_fixup_hwrev(struct device *dev)
 {
 	const char *compat;
@@ -124,10 +151,6 @@ static int prt_rk356x_of_fixup_hwrev(struct device *dev)
 	barebox_set_of_machine_compatible(buf);
 
 	free(buf);
-
-	if (prt_priv.hw_id == 0 && prt_priv.hw_rev == 0)
-		of_register_fixup(mecsbc_sd_of_fixup, dev);
-
 	return 0;
 }
 
@@ -160,6 +183,8 @@ static int prt_rk356x_probe(struct device *dev)
 	prt_rk356x_process_adc(dev, &model->adc_channels);
 	prt_rk356x_of_fixup_hwrev(dev);
 
+	prt_priv.dev = dev;
+	prt_priv.model = model;
 	return 0;
 }
 
@@ -167,6 +192,7 @@ static const struct prt_rk356x_model mecsbc = {
 	.name = "Protonic MECSBC board",
 	.shortname = "mecsbc",
 	.adc_channels = {0, 1, 3},
+	.init = prt_rk356x_mecsbc_init,
 };
 
 static const struct of_device_id prt_rk356x_of_match[] = {
-- 
2.43.0




^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH 6/9] ARM: boards: protonic-rk356x: Use rockchip_bbu_mmc_register
  2026-03-04 11:00 [PATCH 0/9] ARM: boards: protonic-mecsbc: Generalization Robin van der Gracht
                   ` (4 preceding siblings ...)
  2026-03-04 11:00 ` [PATCH 5/9] ARM: boards: protonic-rk356x: Move mecsbc code to model init function Robin van der Gracht
@ 2026-03-04 11:00 ` Robin van der Gracht
  2026-03-04 11:00 ` [PATCH 7/9] ARM: boards: protonic-rk356x: Move bbu setup to device late init Robin van der Gracht
                   ` (2 subsequent siblings)
  8 siblings, 0 replies; 10+ messages in thread
From: Robin van der Gracht @ 2026-03-04 11:00 UTC (permalink / raw)
  To: barebox; +Cc: Robin van der Gracht

This board code will support multiple rockchip SoCs in the rk356x series.

Signed-off-by: Robin van der Gracht <robin.van.der.gracht@protonic.nl>
---
 arch/arm/boards/protonic-rk356x/board.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/arch/arm/boards/protonic-rk356x/board.c b/arch/arm/boards/protonic-rk356x/board.c
index d36f2477fd..1d707bb715 100644
--- a/arch/arm/boards/protonic-rk356x/board.c
+++ b/arch/arm/boards/protonic-rk356x/board.c
@@ -177,8 +177,8 @@ static int prt_rk356x_probe(struct device *dev)
 	else
 		of_device_enable_path("/chosen/environment-emmc");
 
-	rk3568_bbu_mmc_register("emmc", BBU_HANDLER_FLAG_DEFAULT, "/dev/mmc0");
-	rk3568_bbu_mmc_register("sd", 0, "/dev/mmc1");
+	rockchip_bbu_mmc_register("emmc", BBU_HANDLER_FLAG_DEFAULT, "/dev/mmc0");
+	rockchip_bbu_mmc_register("sd", 0, "/dev/mmc1");
 
 	prt_rk356x_process_adc(dev, &model->adc_channels);
 	prt_rk356x_of_fixup_hwrev(dev);
-- 
2.43.0




^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH 7/9] ARM: boards: protonic-rk356x: Move bbu setup to device late init
  2026-03-04 11:00 [PATCH 0/9] ARM: boards: protonic-mecsbc: Generalization Robin van der Gracht
                   ` (5 preceding siblings ...)
  2026-03-04 11:00 ` [PATCH 6/9] ARM: boards: protonic-rk356x: Use rockchip_bbu_mmc_register Robin van der Gracht
@ 2026-03-04 11:00 ` Robin van der Gracht
  2026-03-04 11:00 ` [PATCH 8/9] ARM: boards: protonic-rk356x: Fix crash with different boards Robin van der Gracht
  2026-03-04 11:00 ` [PATCH 9/9] ARM: boards: protonic-rk356x: Read board serial and MAC address from eMMC Robin van der Gracht
  8 siblings, 0 replies; 10+ messages in thread
From: Robin van der Gracht @ 2026-03-04 11:00 UTC (permalink / raw)
  To: barebox; +Cc: Robin van der Gracht

Move bbu setup to a separate function and call it from the devices_init
late initcall.

Signed-off-by: Robin van der Gracht <robin.van.der.gracht@protonic.nl>
---
 arch/arm/boards/protonic-rk356x/board.c | 26 +++++++++++++++----------
 1 file changed, 16 insertions(+), 10 deletions(-)

diff --git a/arch/arm/boards/protonic-rk356x/board.c b/arch/arm/boards/protonic-rk356x/board.c
index 1d707bb715..5fba0be98a 100644
--- a/arch/arm/boards/protonic-rk356x/board.c
+++ b/arch/arm/boards/protonic-rk356x/board.c
@@ -123,10 +123,26 @@ static int prt_rk356x_mecsbc_init(void)
 	return 0;
 }
 
+static void prt_rk356x_bbu(void)
+{
+	enum bootsource bootsource = bootsource_get();
+	int instance = bootsource_get_instance();
+
+	if (bootsource == BOOTSOURCE_MMC && instance == 1)
+		of_device_enable_path("/chosen/environment-sd");
+	else
+		of_device_enable_path("/chosen/environment-emmc");
+
+	rockchip_bbu_mmc_register("emmc", BBU_HANDLER_FLAG_DEFAULT, "/dev/mmc0");
+	rockchip_bbu_mmc_register("sd", 0, "/dev/mmc1");
+}
+
 static int prt_rk356x_devices_init(void)
 {
 	int ret;
 
+	prt_rk356x_bbu();
+
 	if (prt_priv.model->init) {
 		ret = prt_priv.model->init();
 		if (ret) {
@@ -157,8 +173,6 @@ static int prt_rk356x_of_fixup_hwrev(struct device *dev)
 static int prt_rk356x_probe(struct device *dev)
 {
 	int error;
-	enum bootsource bootsource = bootsource_get();
-	int instance = bootsource_get_instance();
 	const struct prt_rk356x_model *model;
 
 	error = of_device_ensure_probed_by_alias("saradc");
@@ -172,14 +186,6 @@ static int prt_rk356x_probe(struct device *dev)
 	barebox_set_model(model->name);
 	barebox_set_hostname(model->shortname);
 
-	if (bootsource == BOOTSOURCE_MMC && instance == 1)
-		of_device_enable_path("/chosen/environment-sd");
-	else
-		of_device_enable_path("/chosen/environment-emmc");
-
-	rockchip_bbu_mmc_register("emmc", BBU_HANDLER_FLAG_DEFAULT, "/dev/mmc0");
-	rockchip_bbu_mmc_register("sd", 0, "/dev/mmc1");
-
 	prt_rk356x_process_adc(dev, &model->adc_channels);
 	prt_rk356x_of_fixup_hwrev(dev);
 
-- 
2.43.0




^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH 8/9] ARM: boards: protonic-rk356x: Fix crash with different boards
  2026-03-04 11:00 [PATCH 0/9] ARM: boards: protonic-mecsbc: Generalization Robin van der Gracht
                   ` (6 preceding siblings ...)
  2026-03-04 11:00 ` [PATCH 7/9] ARM: boards: protonic-rk356x: Move bbu setup to device late init Robin van der Gracht
@ 2026-03-04 11:00 ` Robin van der Gracht
  2026-03-04 11:00 ` [PATCH 9/9] ARM: boards: protonic-rk356x: Read board serial and MAC address from eMMC Robin van der Gracht
  8 siblings, 0 replies; 10+ messages in thread
From: Robin van der Gracht @ 2026-03-04 11:00 UTC (permalink / raw)
  To: barebox; +Cc: Robin van der Gracht, David Jander

From: David Jander <david@protonic.nl>

prt_rk356x_devices_init() is an initcall and thus executed even for boards
that are not compatible with this one. This leads to a null-pointer
dereference in prt_priv.model, since this struct is not initialized for
other boards. Add a simple check to avoid this crash.

Signed-off-by: David Jander <david@protonic.nl>
Tested-by: Robin van der Gracht <robin.van.der.gracht@protonic.nl>
---
 arch/arm/boards/protonic-rk356x/board.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/arch/arm/boards/protonic-rk356x/board.c b/arch/arm/boards/protonic-rk356x/board.c
index 5fba0be98a..486c77e441 100644
--- a/arch/arm/boards/protonic-rk356x/board.c
+++ b/arch/arm/boards/protonic-rk356x/board.c
@@ -141,6 +141,9 @@ static int prt_rk356x_devices_init(void)
 {
 	int ret;
 
+	if (!prt_priv.model)
+		return 0; /* Not a prt_rk356x board! */
+
 	prt_rk356x_bbu();
 
 	if (prt_priv.model->init) {
-- 
2.43.0




^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH 9/9] ARM: boards: protonic-rk356x: Read board serial and MAC address from eMMC
  2026-03-04 11:00 [PATCH 0/9] ARM: boards: protonic-mecsbc: Generalization Robin van der Gracht
                   ` (7 preceding siblings ...)
  2026-03-04 11:00 ` [PATCH 8/9] ARM: boards: protonic-rk356x: Fix crash with different boards Robin van der Gracht
@ 2026-03-04 11:00 ` Robin van der Gracht
  8 siblings, 0 replies; 10+ messages in thread
From: Robin van der Gracht @ 2026-03-04 11:00 UTC (permalink / raw)
  To: barebox; +Cc: Robin van der Gracht

Protonic stores the MAC address and serial at the start of the reserved
space gpt partition (see Rockchip doc for partition details).

If a board has multiple ethernet macs the mac addresses are successive.

Signed-off-by: Robin van der Gracht <robin.van.der.gracht@protonic.nl>
---
 arch/arm/boards/protonic-rk356x/board.c | 75 +++++++++++++++++++++++++
 1 file changed, 75 insertions(+)

diff --git a/arch/arm/boards/protonic-rk356x/board.c b/arch/arm/boards/protonic-rk356x/board.c
index 486c77e441..bbf273e44f 100644
--- a/arch/arm/boards/protonic-rk356x/board.c
+++ b/arch/arm/boards/protonic-rk356x/board.c
@@ -13,6 +13,8 @@
 #include <of_device.h>
 #include <aiodev.h>
 #include <globalvar.h>
+#include <net.h>
+#include <barebox-info.h>
 
 struct prt_rk356x_adc_chs {
 	int usb_boot;
@@ -24,6 +26,7 @@ struct prt_rk356x_model {
 	const char *name;
 	const char *shortname;
 	const struct prt_rk356x_adc_chs adc_channels;
+	const int mac_cnt;
 	int (*init)(void);
 };
 
@@ -97,6 +100,76 @@ static void prt_rk356x_process_adc(struct device *dev,
 	pr_info("Board id: %d, revision %d\n", prt_priv.hw_id, prt_priv.hw_rev);
 }
 
+static int prt_rk356x_inc_mac(u8 *mac)
+{
+	mac[5]++;
+	if (mac[5])
+		return 0;
+	mac[4]++;
+	if (mac[4])
+		return 0;
+	mac[3]++;
+	if (mac[3])
+		return 0;
+	pr_err("MAC address overflow!!\n");
+	return -EINVAL;
+}
+
+#define RK_GPT_RESERVED_SPACE (7680 * 512)
+
+static void prt_rk356x_board_info(void)
+{
+	struct cdev *cdev;
+	ssize_t size;
+	u8 buf[11];
+	int i;
+
+	cdev = cdev_by_name("mmc0");
+	if (!cdev) {
+		pr_warn("No eMMC device\n");
+		return;
+	}
+
+	/* Read and check TAG */
+	size = cdev_read(cdev, buf, 4, RK_GPT_RESERVED_SPACE, 0);
+	if (size != 4) {
+		pr_warn("Unable to read board data from eMMC\n");
+		return;
+	}
+	if (strncmp(buf, "PRTm", 4)) {
+		pr_warn("Board has no serial number and no MAC address\n");
+		return;
+	}
+
+	/* Read MAC at offset 4 */
+	if (prt_priv.model->mac_cnt > 0) {
+		size = cdev_read(cdev, buf, 6, RK_GPT_RESERVED_SPACE + 4, 0);
+		if (size != 6) {
+			pr_warn("Unable to read MAC address from eMMC\n");
+			return;
+		}
+		if (is_valid_ether_addr(buf)) {
+			eth_register_ethaddr(0, buf);
+			for (i = 1; i < prt_priv.model->mac_cnt; i++) {
+				prt_rk356x_inc_mac(buf);
+				eth_register_ethaddr(i, buf);
+			}
+		} else {
+			pr_warn("Board has invalid MAC address\n");
+		}
+	}
+
+	/* Read serial at offset 10 */
+	size = cdev_read(cdev, buf, 10, RK_GPT_RESERVED_SPACE + 10, 0);
+	if (size != 10) {
+		pr_warn("Unable to read serial number from eMMC\n");
+		return;
+	}
+	buf[10] = 0;
+	pr_info("Board serial number: %s\n", buf);
+	barebox_set_serial_number(buf);
+}
+
 static int mecsbc_sd_of_fixup(struct device_node *root, void *context)
 {
 	struct device *dev = context;
@@ -145,6 +218,7 @@ static int prt_rk356x_devices_init(void)
 		return 0; /* Not a prt_rk356x board! */
 
 	prt_rk356x_bbu();
+	prt_rk356x_board_info();
 
 	if (prt_priv.model->init) {
 		ret = prt_priv.model->init();
@@ -201,6 +275,7 @@ static const struct prt_rk356x_model mecsbc = {
 	.name = "Protonic MECSBC board",
 	.shortname = "mecsbc",
 	.adc_channels = {0, 1, 3},
+	.mac_cnt = 3,
 	.init = prt_rk356x_mecsbc_init,
 };
 
-- 
2.43.0




^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2026-03-04 11:01 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-03-04 11:00 [PATCH 0/9] ARM: boards: protonic-mecsbc: Generalization Robin van der Gracht
2026-03-04 11:00 ` [PATCH 1/9] ARM: boards: Rename protonic-mecsbc to protonic-rk356x Robin van der Gracht
2026-03-04 11:00 ` [PATCH 2/9] ARM: boards: protonic-rk356x: Remove VIN measurement Robin van der Gracht
2026-03-04 11:00 ` [PATCH 3/9] ARM: boards: protonic-rk356x: Use devicetree alias for saradc Robin van der Gracht
2026-03-04 11:00 ` [PATCH 4/9] ARM: boards: protonic-rk356x: Configure ADC and channels in model data Robin van der Gracht
2026-03-04 11:00 ` [PATCH 5/9] ARM: boards: protonic-rk356x: Move mecsbc code to model init function Robin van der Gracht
2026-03-04 11:00 ` [PATCH 6/9] ARM: boards: protonic-rk356x: Use rockchip_bbu_mmc_register Robin van der Gracht
2026-03-04 11:00 ` [PATCH 7/9] ARM: boards: protonic-rk356x: Move bbu setup to device late init Robin van der Gracht
2026-03-04 11:00 ` [PATCH 8/9] ARM: boards: protonic-rk356x: Fix crash with different boards Robin van der Gracht
2026-03-04 11:00 ` [PATCH 9/9] ARM: boards: protonic-rk356x: Read board serial and MAC address from eMMC Robin van der Gracht

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox