[generic] add OF support to rtl8367b driver
authorJohn Crispin <john@openwrt.org>
Wed, 3 Apr 2013 09:58:33 +0000 (09:58 +0000)
committerJohn Crispin <john@openwrt.org>
Wed, 3 Apr 2013 09:58:33 +0000 (09:58 +0000)
Signed-off-by: John Crispin <blogic@openwrt.org>
SVN-Revision: 36159

target/linux/generic/files/drivers/net/phy/rtl8367b.c

index c70a14486f686de73cfef16efcbe22749f18aa9b..5775fa4e98f68607964161aefcb02ffb9390f580 100644 (file)
@@ -862,6 +862,40 @@ static int rtl8367b_extif_init(struct rtl8366_smi *smi, int id,
        return 0;
 }
 
+#ifdef CONFIG_OF
+static int rtl8367b_extif_init_of(struct rtl8366_smi *smi, int id, const char *name)
+{
+       struct rtl8367_extif_config *cfg;
+       const __be32 *prop;
+       int size;
+
+       prop = of_get_property(smi->parent->of_node, name, &size);
+       if (!prop || size != (9 * sizeof(*prop)))
+               return 0;
+
+       cfg = kzalloc(sizeof(struct rtl8367_extif_config), GFP_KERNEL);
+       if (!cfg)
+               return -1;
+
+       cfg->txdelay = be32_to_cpup(prop++);
+       cfg->rxdelay = be32_to_cpup(prop++);
+       cfg->mode = be32_to_cpup(prop++);
+       cfg->ability.force_mode = be32_to_cpup(prop++);
+       cfg->ability.txpause = be32_to_cpup(prop++);
+       cfg->ability.rxpause = be32_to_cpup(prop++);
+       cfg->ability.link = be32_to_cpup(prop++);
+       cfg->ability.duplex = be32_to_cpup(prop++);
+       cfg->ability.speed = be32_to_cpup(prop++);
+
+       return rtl8367b_extif_init(smi, id, cfg);
+}
+#else
+static int rtl8367b_extif_init_of(struct rtl8366_smi *smi, int id, const char *name)
+{
+       return -1;
+}
+#endif
+
 static int rtl8367b_setup(struct rtl8366_smi *smi)
 {
        struct rtl8367_platform_data *pdata;
@@ -875,13 +909,23 @@ static int rtl8367b_setup(struct rtl8366_smi *smi)
                return err;
 
        /* initialize external interfaces */
-       err = rtl8367b_extif_init(smi, 0, pdata->extif0_cfg);
-       if (err)
-               return err;
+       if (smi->parent->of_node) {
+               err = rtl8367b_extif_init_of(smi, 0, "realtek,extif0");
+               if (err)
+                       return err;
 
-       err = rtl8367b_extif_init(smi, 1, pdata->extif1_cfg);
-       if (err)
-               return err;
+               err = rtl8367b_extif_init_of(smi, 1, "realtek,extif1");
+               if (err)
+                       return err;
+       } else {
+               err = rtl8367b_extif_init(smi, 0, pdata->extif0_cfg);
+               if (err)
+                       return err;
+
+               err = rtl8367b_extif_init(smi, 1, pdata->extif1_cfg);
+               if (err)
+                       return err;
+       }
 
        /* set maximum packet length to 1536 bytes */
        REG_RMW(smi, RTL8367B_SWC0_REG, RTL8367B_SWC0_MAX_LENGTH_MASK,