net: ti: cpsw-common: Isolate getting syscon address from assigning macid
[u-boot.git] / drivers / net / ti / cpsw-common.c
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;
 }
This page took 0.036246 seconds and 4 git commands to generate.