kernel: rtl8367: use realtek,extif property
authorMieczyslaw Nalewaj <namiltd@yahoo.com>
Sun, 21 Jul 2024 19:46:49 +0000 (21:46 +0200)
committerHauke Mehrtens <hauke@hauke-m.de>
Mon, 5 Aug 2024 22:34:14 +0000 (00:34 +0200)
Use realtek,extif property instead of realtek,extif0 and realtek,extif1
by extending it with the cpu_port parameter.
The extif number is automatically calculated based on cpu_port.

Signed-off-by: Mieczyslaw Nalewaj <namiltd@yahoo.com>
Link: https://github.com/openwrt/openwrt/pull/15749
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
target/linux/ath79/dts/ar7242_tplink_tl-wr2543-v1.dts
target/linux/generic/files/drivers/net/phy/rtl8367.c
target/linux/ramips/dts/rt3662_asus_rt-n56u.dts
target/linux/ramips/dts/rt3662_edimax_br-6475nd.dts
target/linux/ramips/dts/rt3662_samsung_cy-swr1100.dts

index 77eeedc588475d270b9255cd18063fafecd190ed..0124ddff87a53cd52c47dc65f7628be5dbd55df7 100644 (file)
@@ -78,7 +78,7 @@
                compatible = "realtek,rtl8367";
                gpio-sda = <&gpio 1 GPIO_ACTIVE_HIGH>;
                gpio-sck = <&gpio 6 GPIO_ACTIVE_HIGH>;
-               realtek,extif0 = <1 0 1 1 1 1 1 1 2>;
+               realtek,extif = <9 1 0 1 1 1 1 1 1 2>;
 
                mdio-bus {
                        #address-cells = <1>;
index b14b63e03630bd5a351508bcda0bc15b21010c5c..0acfeb54bba58784d31a025f74483c5e465f78c9 100644 (file)
@@ -1077,21 +1077,37 @@ static int rtl8367_led_blinkrate_set(struct rtl8366_smi *smi, unsigned int rate)
 }
 
 #ifdef CONFIG_OF
-static int rtl8367_extif_init_of(struct rtl8366_smi *smi, int id,
+static int rtl8367_extif_init_of(struct rtl8366_smi *smi,
                                 const char *name)
 {
        struct rtl8367_extif_config *cfg;
        const __be32 *prop;
        int size;
        int err;
+       unsigned cpu_port;
+       unsigned id = UINT_MAX;
 
        prop = of_get_property(smi->parent->of_node, name, &size);
-       if (!prop)
-               return rtl8367_extif_init(smi, id, NULL);
+       if (!prop || (size != (10 * sizeof(*prop)))) {
+               dev_err(smi->parent, "%s property is not defined or invalid\n", name);
+               err = -EINVAL;
+               goto err_init;
+       }
 
-       if (size != (9 * sizeof(*prop))) {
-               dev_err(smi->parent, "%s property is invalid\n", name);
-               return -EINVAL;
+       cpu_port = be32_to_cpup(prop++);
+       switch (cpu_port) {
+       case RTL8367_CPU_PORT_NUM - 1:
+       case RTL8367_CPU_PORT_NUM:
+               id = RTL8367_CPU_PORT_NUM - cpu_port;
+               if (smi->cpu_port == UINT_MAX) {
+                       dev_info(smi->parent, "cpu_port:%u, assigned to extif%u\n", cpu_port, id);
+                       smi->cpu_port = cpu_port;
+               }
+               break;
+       default:
+               dev_err(smi->parent, "wrong cpu_port %u in %s property\n", cpu_port, name);
+               err = -EINVAL;
+               goto err_init;
        }
 
        cfg = kzalloc(sizeof(struct rtl8367_extif_config), GFP_KERNEL);
@@ -1111,10 +1127,14 @@ static int rtl8367_extif_init_of(struct rtl8366_smi *smi, int id,
        err = rtl8367_extif_init(smi, id, cfg);
        kfree(cfg);
 
+err_init:
+       if (id != 0) rtl8367_extif_init(smi, 0, NULL);
+       if (id != 1) rtl8367_extif_init(smi, 1, NULL);
+
        return err;
 }
 #else
-static int rtl8367_extif_init_of(struct rtl8366_smi *smi, int id,
+static int rtl8367_extif_init_of(struct rtl8366_smi *smi,
                                 const char *name)
 {
        return -EINVAL;
@@ -1135,11 +1155,7 @@ static int rtl8367_setup(struct rtl8366_smi *smi)
 
        /* initialize external interfaces */
        if (smi->parent->of_node) {
-               err = rtl8367_extif_init_of(smi, 0, "realtek,extif0");
-               if (err)
-                       return err;
-
-               err = rtl8367_extif_init_of(smi, 1, "realtek,extif1");
+               err = rtl8367_extif_init_of(smi, "realtek,extif");
                if (err)
                        return err;
        } else {
@@ -1722,11 +1738,6 @@ static int rtl8367_detect(struct rtl8366_smi *smi)
        dev_info(smi->parent, "RTL%s ver. %u chip found\n",
                 chip_name, rtl_ver & RTL8367_RTL_VER_MASK);
 
-       if (of_property_present(smi->parent->of_node, "realtek,extif1"))
-               smi->cpu_port = RTL8367_CPU_PORT_NUM - 1;
-
-       dev_info(smi->parent, "CPU port: %u\n", smi->cpu_port);
-
        return 0;
 }
 
@@ -1764,7 +1775,7 @@ static int rtl8367_probe(struct platform_device *pdev)
        smi->cmd_read = 0xb9;
        smi->cmd_write = 0xb8;
        smi->ops = &rtl8367_smi_ops;
-       smi->cpu_port = RTL8367_CPU_PORT_NUM;
+       smi->cpu_port = UINT_MAX; /* not defined yet */
        smi->num_ports = RTL8367_NUM_PORTS;
        smi->num_vlan_mc = RTL8367_NUM_VLANS;
        smi->mib_counters = rtl8367_mib_counters;
index 391076cee963d726a82cc4f9a5acf41beb89bd6b..c381aa3e031750f52cd597bdf9a3d5f8247c5a1d 100644 (file)
@@ -73,7 +73,7 @@
                compatible = "realtek,rtl8367";
                gpio-sda = <&gpio0 1 GPIO_ACTIVE_HIGH>;
                gpio-sck = <&gpio0 2 GPIO_ACTIVE_HIGH>;
-               realtek,extif1 = <1 0 1 1 1 1 1 1 2>;
+               realtek,extif = <8 1 0 1 1 1 1 1 1 2>;
        };
 
        keys {
index 051e28da8fb589949aab1f1207282d6ed0f01bfd..fbc795b24f6af1e3e3db8a04906cc70706403b6c 100644 (file)
                compatible = "realtek,rtl8367";
                gpio-sda = <&gpio0 5 GPIO_ACTIVE_HIGH>;
                gpio-sck = <&gpio0 4 GPIO_ACTIVE_HIGH>;
-               realtek,extif0 = <1 0 1 1 1 1 1 1 2>;
+               realtek,extif = <9 1 0 1 1 1 1 1 1 2>;
        };
 
        /*
index 9964fcf600af7a0f8238624052ad597c5c5315ca..bcc215c17abdd7639d491af4bcbcde36fd07b4bf 100644 (file)
@@ -81,7 +81,7 @@
                compatible = "realtek,rtl8367";
                gpio-sda = <&gpio0 1 GPIO_ACTIVE_HIGH>;
                gpio-sck = <&gpio0 2 GPIO_ACTIVE_HIGH>;
-               realtek,extif0 = <1 0 1 1 1 1 1 1 2>;
+               realtek,extif = <9 1 0 1 1 1 1 1 1 2>;
        };
 
        keys {