u-boot/drivers/net/ti/cpsw-common.c
Faiz Abbas a58d222df9 net: ti: cpsw-common: Isolate getting syscon address from assigning macid
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>
2019-04-12 08:05:53 -04:00

106 lines
2.9 KiB
C

// SPDX-License-Identifier: GPL-2.0+
/*
* CPSW common - libs used across TI ethernet devices.
*
* Copyright (C) 2016, Texas Instruments, Incorporated
*/
#include <common.h>
#include <dm.h>
#include <environment.h>
#include <fdt_support.h>
#include <asm/io.h>
#include <cpsw.h>
DECLARE_GLOBAL_DATA_PTR;
#define CTRL_MAC_REG(offset, id) ((offset) + 0x8 * (id))
static void davinci_emac_3517_get_macid(u32 addr, u8 *mac_addr)
{
/* try reading mac address from efuse */
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;
mac_addr[2] = macid_msb & 0xff;
mac_addr[3] = (macid_lsb >> 16) & 0xff;
mac_addr[4] = (macid_lsb >> 8) & 0xff;
mac_addr[5] = macid_lsb & 0xff;
}
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);
}
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);
fdt32_t gmii = 0;
int syscon;
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) {
pr_err("Syscon offset not found\n");
return -ENOENT;
}
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;
}
data->syscon_addr += CTRL_MAC_REG(offset, slave);
return 0;
}