[openwrt/openwrt] realtek: simplify SoC detection

LEDE Commits lede-commits at lists.infradead.org
Wed Aug 6 04:41:57 PDT 2025


robimarko pushed a commit to openwrt/openwrt.git, branch main:
https://git.openwrt.org/d469690b838c2fca627e5b871a73f04775b81851

commit d469690b838c2fca627e5b871a73f04775b81851
Author: Jan Hoffmann <jan at 3e8.eu>
AuthorDate: Sat Aug 2 20:28:50 2025 +0200

    realtek: simplify SoC detection
    
    Read model name from the register instead of using hard-coded values.
    
    Also remove detection of the unsupported Realtek ESW/SSW SoCs. The Fast
    Ethernet variants of the Maple and Cypress series stay for now, but are
    moved to the RTL8380/RTL8390 families.
    
    Signed-off-by: Jan Hoffmann <jan at 3e8.eu>
    Link: https://github.com/openwrt/openwrt/pull/19653
    Signed-off-by: Robert Marko <robimarko at gmail.com>
---
 .../mips/include/asm/mach-rtl838x/mach-rtl83xx.h   |   6 +-
 .../realtek/files-6.12/arch/mips/rtl838x/prom.c    | 160 +++++++--------------
 2 files changed, 55 insertions(+), 111 deletions(-)

diff --git a/target/linux/realtek/files-6.12/arch/mips/include/asm/mach-rtl838x/mach-rtl83xx.h b/target/linux/realtek/files-6.12/arch/mips/include/asm/mach-rtl838x/mach-rtl83xx.h
index 8ea580f3d1..d53414fec7 100644
--- a/target/linux/realtek/files-6.12/arch/mips/include/asm/mach-rtl838x/mach-rtl83xx.h
+++ b/target/linux/realtek/files-6.12/arch/mips/include/asm/mach-rtl838x/mach-rtl83xx.h
@@ -373,12 +373,8 @@
 #define RTL931X_ISR_PORT_LINK_STS_CHG	(0x12B8)
 
 /* Definition of family IDs */
-#define RTL8389_FAMILY_ID   (0x8389)
-#define RTL8328_FAMILY_ID   (0x8328)
-#define RTL8390_FAMILY_ID   (0x8390)
-#define RTL8350_FAMILY_ID   (0x8350)
 #define RTL8380_FAMILY_ID   (0x8380)
-#define RTL8330_FAMILY_ID   (0x8330)
+#define RTL8390_FAMILY_ID   (0x8390)
 #define RTL9300_FAMILY_ID   (0x9300)
 #define RTL9310_FAMILY_ID   (0x9310)
 
diff --git a/target/linux/realtek/files-6.12/arch/mips/rtl838x/prom.c b/target/linux/realtek/files-6.12/arch/mips/rtl838x/prom.c
index 68b4e5c144..32e7a064fe 100644
--- a/target/linux/realtek/files-6.12/arch/mips/rtl838x/prom.c
+++ b/target/linux/realtek/files-6.12/arch/mips/rtl838x/prom.c
@@ -20,6 +20,9 @@
 struct rtl83xx_soc_info soc_info;
 const void *fdt;
 
+static char soc_name[16];
+static char rtl83xx_system_type[32];
+
 #ifdef CONFIG_MIPS_MT_SMP
 
 extern const struct plat_smp_ops vsmp_smp_ops;
@@ -96,125 +99,70 @@ void __init device_tree_init(void)
 
 const char *get_system_type(void)
 {
-	return soc_info.name;
+	return rtl83xx_system_type;
 }
 
-static void __init identify_rtl9302(void)
+static uint32_t __init read_model(void)
 {
-	switch (sw_r32(RTL93XX_MODEL_NAME_INFO) & 0xfffffff0) {
-	case 0x93020810:
-		soc_info.name = "RTL9302A 12x2.5G";
-		break;
-	case 0x93021010:
-		soc_info.name = "RTL9302B 8x2.5G";
-		break;
-	case 0x93021810:
-		soc_info.name = "RTL9302C 16x2.5G";
-		break;
-	case 0x93022010:
-		soc_info.name = "RTL9302D 24x2.5G";
-		break;
-	case 0x93020800:
-		soc_info.name = "RTL9302A";
-		break;
-	case 0x93021000:
-		soc_info.name = "RTL9302B";
-		break;
-	case 0x93021800:
-		soc_info.name = "RTL9302C";
-		break;
-	case 0x93022000:
-		soc_info.name = "RTL9302D";
-		break;
-	case 0x93023001:
-		soc_info.name = "RTL9302F";
-		break;
-	default:
-		soc_info.name = "RTL9302";
-	}
-}
-
-void __init prom_init(void)
-{
-	uint32_t model;
+	uint32_t model, id;
 
 	model = sw_r32(RTL838X_MODEL_NAME_INFO);
-	pr_info("RTL838X model is %x\n", model);
-	model = model >> 16 & 0xFFFF;
-
-	if ((model != 0x8328) && (model != 0x8330) && (model != 0x8332)
-	    && (model != 0x8380) && (model != 0x8382)) {
-		model = sw_r32(RTL839X_MODEL_NAME_INFO);
-		pr_info("RTL839X model is %x\n", model);
-		model = model >> 16 & 0xFFFF;
+	id = model >> 16 & 0xffff;
+	if ((id >= 0x8380 && id <= 0x8382) || id == 0x8330 || id == 0x8332) {
+		soc_info.id = id;
+		soc_info.family = RTL8380_FAMILY_ID;
+		return model;
 	}
 
-	if ((model & 0x8390) != 0x8380 && (model & 0x8390) != 0x8390) {
-		model = sw_r32(RTL93XX_MODEL_NAME_INFO);
-		pr_info("RTL93XX model is %x\n", model);
-		model = model >> 16 & 0xFFFF;
+	model = sw_r32(RTL839X_MODEL_NAME_INFO);
+	id = model >> 16 & 0xffff;
+	if ((id >= 0x8391 && id <= 0x8396) || (id >= 0x8351 && id <= 0x8353)) {
+		soc_info.id = id;
+		soc_info.family = RTL8390_FAMILY_ID;
+		return model;
 	}
 
-	soc_info.id = model;
-
-	switch (model) {
-	case 0x8328:
-		soc_info.name = "RTL8328";
-		soc_info.family = RTL8328_FAMILY_ID;
-		break;
-	case 0x8332:
-		soc_info.name = "RTL8332";
-		soc_info.family = RTL8380_FAMILY_ID;
-		break;
-	case 0x8380:
-		soc_info.name = "RTL8380";
-		soc_info.family = RTL8380_FAMILY_ID;
-		break;
-	case 0x8382:
-		soc_info.name = "RTL8382";
-		soc_info.family = RTL8380_FAMILY_ID;
-		break;
-	case 0x8390:
-		soc_info.name = "RTL8390";
-		soc_info.family = RTL8390_FAMILY_ID;
-		break;
-	case 0x8391:
-		soc_info.name = "RTL8391";
-		soc_info.family = RTL8390_FAMILY_ID;
-		break;
-	case 0x8392:
-		soc_info.name = "RTL8392";
-		soc_info.family = RTL8390_FAMILY_ID;
-		break;
-	case 0x8393:
-		soc_info.name = "RTL8393";
-		soc_info.family = RTL8390_FAMILY_ID;
-		break;
-	case 0x9301:
-		soc_info.name = "RTL9301";
-		soc_info.family = RTL9300_FAMILY_ID;
-		break;
-	case 0x9302:
-		identify_rtl9302();
+	model = sw_r32(RTL93XX_MODEL_NAME_INFO);
+	id = model >> 16 & 0xffff;
+	if (id >= 0x9301 && id <= 0x9303) {
+		soc_info.id = id;
 		soc_info.family = RTL9300_FAMILY_ID;
-		break;
-	case 0x9303:
-		soc_info.name = "RTL9303";
-		soc_info.family = RTL9300_FAMILY_ID;
-		break;
-	case 0x9311:
-		soc_info.name = "RTL9311";
-		soc_info.family = RTL9310_FAMILY_ID;
-		break;
-	case 0x9313:
-		soc_info.name = "RTL9313";
+		return model;
+	} else if (id >= 0x9311 && id <= 0x9313) {
+		soc_info.id = id;
 		soc_info.family = RTL9310_FAMILY_ID;
-		break;
-	default:
-		soc_info.name = "DEFAULT";
-		soc_info.family = 0;
+		return model;
 	}
 
+	return 0;
+}
+
+static void __init parse_model(uint32_t model)
+{
+	int val;
+	char suffix = 0;
+
+	val = (model >> 11) & 0x1f;
+	if (val > 0 && val <= 26)
+		suffix = 'A' + (val - 1);
+
+	snprintf(soc_name, sizeof(soc_name), "RTL%04X%c",
+		 soc_info.id, suffix);
+
+	soc_info.name = soc_name;
+}
+
+static void __init rtl83xx_set_system_type(void) {
+	snprintf(rtl83xx_system_type, sizeof(rtl83xx_system_type),
+		 "Realtek %s", soc_info.name);
+}
+
+void __init prom_init(void)
+{
+	uint32_t model = read_model();
+	parse_model(model);
+	rtl83xx_set_system_type();
+
 	pr_info("SoC Type: %s\n", get_system_type());
 
 	/*




More information about the lede-commits mailing list