net: ti: cpsw-common: Isolate getting syscon address from assigning macid
authorFaiz Abbas <faiz_abbas@ti.com>
Mon, 18 Mar 2019 08:24:34 +0000 (13:54 +0530)
committerTom Rini <trini@konsulko.com>
Fri, 12 Apr 2019 12:05:53 +0000 (08:05 -0400)
ti_cm_get_macid() is used to get a syscon node from the dt, read the
efuse address and then assign the macid read from the address. Divide
these two steps into separate functions one of which can be called from
ofdata_to_platdata() while the other can be called from _probe(). This
ensures that platdata can be assigned statically in a board file when
OF_CONTROL is not enabled. Also add a macid_sel_compat in private data
to get information about the macid byte placement.

Signed-off-by: Faiz Abbas <faiz_abbas@ti.com>
drivers/net/ti/cpsw-common.c
drivers/net/ti/cpsw.c
include/cpsw.h

index 6c8ddbd93618b913e9c2eec08032f671b049f438..ac12cfe9b86bd989777943915c5e1f34f94d7a00 100644 (file)
@@ -16,35 +16,11 @@ DECLARE_GLOBAL_DATA_PTR;
 
 #define CTRL_MAC_REG(offset, id) ((offset) + 0x8 * (id))
 
-static int davinci_emac_3517_get_macid(struct udevice *dev, u16 offset,
-                                      int slave, u8 *mac_addr)
+static void davinci_emac_3517_get_macid(u32 addr, u8 *mac_addr)
 {
-       void *fdt = (void *)gd->fdt_blob;
-       int node = dev_of_offset(dev);
-       u32 macid_lsb;
-       u32 macid_msb;
-       fdt32_t gmii = 0;
-       int syscon;
-       u32 addr;
-
-       syscon = fdtdec_lookup_phandle(fdt, node, "syscon");
-       if (syscon < 0) {
-               pr_err("Syscon offset not found\n");
-               return -ENOENT;
-       }
-
-       addr = (u32)map_physmem(fdt_translate_address(fdt, syscon, &gmii),
-                               sizeof(u32), MAP_NOCACHE);
-       if (addr == FDT_ADDR_T_NONE) {
-               pr_err("Not able to get syscon address to get mac efuse address\n");
-               return -ENOENT;
-       }
-
-       addr += CTRL_MAC_REG(offset, slave);
-
        /* try reading mac address from efuse */
-       macid_lsb = readl(addr);
-       macid_msb = readl(addr + 4);
+       u32 macid_lsb = readl(addr);
+       u32 macid_msb = readl(addr + 4);
 
        mac_addr[0] = (macid_msb >> 16) & 0xff;
        mac_addr[1] = (macid_msb >> 8)  & 0xff;
@@ -52,20 +28,62 @@ static int davinci_emac_3517_get_macid(struct udevice *dev, u16 offset,
        mac_addr[3] = (macid_lsb >> 16) & 0xff;
        mac_addr[4] = (macid_lsb >> 8)  & 0xff;
        mac_addr[5] = macid_lsb & 0xff;
+}
 
-       return 0;
+static void cpsw_am33xx_cm_get_macid(u32 addr, u8 *mac_addr)
+{
+       /* try reading mac address from efuse */
+       u32 macid_lo = readl(addr);
+       u32 macid_hi = readl(addr + 4);
+
+       mac_addr[5] = (macid_lo >> 8) & 0xff;
+       mac_addr[4] = macid_lo & 0xff;
+       mac_addr[3] = (macid_hi >> 24) & 0xff;
+       mac_addr[2] = (macid_hi >> 16) & 0xff;
+       mac_addr[1] = (macid_hi >> 8) & 0xff;
+       mac_addr[0] = macid_hi & 0xff;
+}
+
+void ti_cm_get_macid(struct udevice *dev, struct cpsw_platform_data *data,
+                    u8 *mac_addr)
+{
+       if (!strcmp(data->macid_sel_compat, "cpsw,am33xx"))
+               cpsw_am33xx_cm_get_macid(data->syscon_addr, mac_addr);
+       else if (!strcmp(data->macid_sel_compat, "davinci,emac"))
+               davinci_emac_3517_get_macid(data->syscon_addr, mac_addr);
 }
 
-static int cpsw_am33xx_cm_get_macid(struct udevice *dev, u16 offset, int slave,
-                                   u8 *mac_addr)
+int ti_cm_get_macid_addr(struct udevice *dev, int slave,
+                        struct cpsw_platform_data *data)
 {
        void *fdt = (void *)gd->fdt_blob;
        int node = dev_of_offset(dev);
-       u32 macid_lo;
-       u32 macid_hi;
        fdt32_t gmii = 0;
        int syscon;
-       u32 addr;
+       u16 offset;
+
+       if (of_machine_is_compatible("ti,dm8148")) {
+               offset = 0x630;
+               data->macid_sel_compat = "cpsw,am33xx";
+       } else if (of_machine_is_compatible("ti,am33xx")) {
+               offset = 0x630;
+               data->macid_sel_compat = "cpsw,am33xx";
+       } else if (device_is_compatible(dev, "ti,am3517-emac")) {
+               offset = 0x110;
+               data->macid_sel_compat = "davinci,emac";
+       } else if (device_is_compatible(dev, "ti,dm816-emac")) {
+               offset = 0x30;
+               data->macid_sel_compat = "cpsw,am33xx";
+       } else if (of_machine_is_compatible("ti,am43")) {
+               offset = 0x630;
+               data->macid_sel_compat = "cpsw,am33xx";
+       } else if (of_machine_is_compatible("ti,dra7")) {
+               offset = 0x514;
+               data->macid_sel_compat = "davinci,emac";
+       } else {
+               dev_err(dev, "incompatible machine/device type for reading mac address\n");
+               return -ENOENT;
+       }
 
        syscon = fdtdec_lookup_phandle(fdt, node, "syscon");
        if (syscon < 0) {
@@ -73,49 +91,16 @@ static int cpsw_am33xx_cm_get_macid(struct udevice *dev, u16 offset, int slave,
                return -ENOENT;
        }
 
-       addr = (u32)map_physmem(fdt_translate_address(fdt, syscon, &gmii),
-                               sizeof(u32), MAP_NOCACHE);
-       if (addr == FDT_ADDR_T_NONE) {
+       data->syscon_addr = (u32)map_physmem(fdt_translate_address(fdt, syscon,
+                                                                  &gmii),
+                                            sizeof(u32), MAP_NOCACHE);
+       if (data->syscon_addr == FDT_ADDR_T_NONE) {
                pr_err("Not able to get syscon address to get mac efuse address\n");
                return -ENOENT;
        }
 
-       addr += CTRL_MAC_REG(offset, slave);
-
-       /* try reading mac address from efuse */
-       macid_lo = readl(addr);
-       macid_hi = readl(addr + 4);
-
-       mac_addr[5] = (macid_lo >> 8) & 0xff;
-       mac_addr[4] = macid_lo & 0xff;
-       mac_addr[3] = (macid_hi >> 24) & 0xff;
-       mac_addr[2] = (macid_hi >> 16) & 0xff;
-       mac_addr[1] = (macid_hi >> 8) & 0xff;
-       mac_addr[0] = macid_hi & 0xff;
+       data->syscon_addr += CTRL_MAC_REG(offset, slave);
 
        return 0;
-}
-
-int ti_cm_get_macid(struct udevice *dev, int slave, u8 *mac_addr)
-{
-       if (of_machine_is_compatible("ti,dm8148"))
-               return cpsw_am33xx_cm_get_macid(dev, 0x630, slave, mac_addr);
-
-       if (of_machine_is_compatible("ti,am33xx"))
-               return cpsw_am33xx_cm_get_macid(dev, 0x630, slave, mac_addr);
-
-       if (device_is_compatible(dev, "ti,am3517-emac"))
-               return davinci_emac_3517_get_macid(dev, 0x110, slave, mac_addr);
-
-       if (device_is_compatible(dev, "ti,dm816-emac"))
-               return cpsw_am33xx_cm_get_macid(dev, 0x30, slave, mac_addr);
-
-       if (of_machine_is_compatible("ti,am43"))
-               return cpsw_am33xx_cm_get_macid(dev, 0x630, slave, mac_addr);
-
-       if (of_machine_is_compatible("ti,dra7"))
-               return davinci_emac_3517_get_macid(dev, 0x514, slave, mac_addr);
 
-       dev_err(dev, "incompatible machine/device type for reading mac address\n");
-       return -ENOENT;
 }
index 904d402e3a99374b1adbe8e574e77a7000cee58b..d9d25a629fba836ad748bb462cb40bf1ae46cdd3 100644 (file)
@@ -1185,6 +1185,7 @@ static int cpsw_eth_probe(struct udevice *dev)
 
        priv->dev = dev;
        priv->data = pdata->priv_pdata;
+       ti_cm_get_macid(dev, priv->data, pdata->enetaddr);
        /* Select phy interface in control module */
        cpsw_phy_sel(priv, priv->data->phy_sel_compat,
                     pdata->phy_interface);
@@ -1336,7 +1337,7 @@ static int cpsw_eth_ofdata_to_platdata(struct udevice *dev)
                data->slave_data[1].sliver_reg_ofs = CPSW_SLIVER1_OFFSET;
        }
 
-       ret = ti_cm_get_macid(dev, active_slave, pdata->enetaddr);
+       ret = ti_cm_get_macid_addr(dev, active_slave, data);
        if (ret < 0) {
                pr_err("cpsw read efuse mac failed\n");
                return ret;
index 55db277e73d33f067fd2dc7854c4190acef7fa01..0023151bc05c3c748bd52954378dcaf0be440cde 100644 (file)
@@ -51,10 +51,15 @@ struct cpsw_platform_data {
        bool    rmii_clock_external;
        u8      version;
        const char *phy_sel_compat;
+       u32     syscon_addr;
+       const char *macid_sel_compat;
 };
 
 int cpsw_register(struct cpsw_platform_data *data);
-int ti_cm_get_macid(struct udevice *dev, int slave, u8 *mac_addr);
+int ti_cm_get_macid_addr(struct udevice *dev, int slave,
+                        struct cpsw_platform_data *data);
+void ti_cm_get_macid(struct udevice *dev, struct cpsw_platform_data *data,
+                    u8 *mac_addr);
 int cpsw_get_slave_phy_addr(struct udevice *dev, int slave);
 
 #endif /* _CPSW_H_  */