mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-15 17:28:15 +00:00
1e94b46f73
This old patch was marked as deferred. Bring it back to life, to continue towards the removal of common.h Move this out of the common header and include it only where needed. Signed-off-by: Simon Glass <sjg@chromium.org>
108 lines
3 KiB
C
108 lines
3 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 <fdt_support.h>
|
|
#include <asm/global_data.h>
|
|
#include <asm/io.h>
|
|
#include <cpsw.h>
|
|
#include <dm/device_compat.h>
|
|
#include <linux/printk.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;
|
|
|
|
}
|