generic: rtl8366rb: add support for initvals from DTS
authorKevin Darbyshire-Bryant <kevin@darbyshire-bryant.me.uk>
Thu, 20 Apr 2017 18:14:35 +0000 (19:14 +0100)
committerMathias Kresin <dev@kresin.me>
Tue, 25 Apr 2017 17:29:59 +0000 (19:29 +0200)
Allow per-device initvals in the DTS file for rlt8366rb
switches.

Shamelessly copies 30494598f891fc4436a49eca55fc31d03c087841

Signed-off-by: Kevin Darbyshire-Bryant <kevin@darbyshire-bryant.me.uk>
target/linux/generic/files/drivers/net/phy/rtl8366rb.c

index a0aaabf5468d192791514deea56933ec389f8b83..264343a81f701964aeef39be8a63a6bfe53f6a55 100644 (file)
@@ -282,6 +282,31 @@ static int rtl8366rb_reset_chip(struct rtl8366_smi *smi)
 static int rtl8366rb_setup(struct rtl8366_smi *smi)
 {
        int err;
+#ifdef CONFIG_OF
+       unsigned i;
+       struct device_node *np;
+       unsigned num_initvals;
+       const __be32 *paddr;
+
+       np = smi->parent->of_node;
+
+       paddr = of_get_property(np, "realtek,initvals", &num_initvals);
+       if (paddr) {
+               dev_info(smi->parent, "applying initvals from DTS\n");
+
+               if (num_initvals < (2 * sizeof(*paddr)))
+                       return -EINVAL;
+
+               num_initvals /= sizeof(*paddr);
+
+               for (i = 0; i < num_initvals - 1; i += 2) {
+                       u32 reg = be32_to_cpup(paddr + i);
+                       u32 val = be32_to_cpup(paddr + i + 1);
+
+                       REG_WR(smi, reg, val);
+               }
+       }
+#endif
 
        /* set maximum packet length to 1536 bytes */
        REG_RMW(smi, RTL8366RB_SGCR, RTL8366RB_SGCR_MAX_LENGTH_MASK,