mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-12-25 04:23:46 +00:00
a58d222df9
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>
106 lines
2.9 KiB
C
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;
|
|
|
|
}
|