]> git.ipfire.org Git - thirdparty/openwrt.git/commitdiff
realtek: simplify SoC detection
authorJan Hoffmann <jan@3e8.eu>
Sat, 2 Aug 2025 18:28:50 +0000 (20:28 +0200)
committerRobert Marko <robimarko@gmail.com>
Wed, 6 Aug 2025 11:41:51 +0000 (13:41 +0200)
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@3e8.eu>
Link: https://github.com/openwrt/openwrt/pull/19653
Signed-off-by: Robert Marko <robimarko@gmail.com>
target/linux/realtek/files-6.12/arch/mips/include/asm/mach-rtl838x/mach-rtl83xx.h
target/linux/realtek/files-6.12/arch/mips/rtl838x/prom.c

index 8ea580f3d113fa3120d5a572ca8c05636d23b1cd..d53414fec74ea2469e6e4acfd98e4d5fcb5b3d0c 100644 (file)
 #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)
 
index 68b4e5c14494d71757989ac9b8adea177fd5f35c..32e7a064fef651961f6b94001b16df93e6c4d271 100644 (file)
@@ -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());
 
        /*