u-boot/drivers/net/ti/cpsw-common.c
Tom Rini d678a59d2d Revert "Merge patch series "arm: dts: am62-beagleplay: Fix Beagleplay Ethernet""
When bringing in the series 'arm: dts: am62-beagleplay: Fix Beagleplay
Ethernet"' I failed to notice that b4 noticed it was based on next and
so took that as the base commit and merged that part of next to master.

This reverts commit c8ffd1356d, reversing
changes made to 2ee6f3a5f7.

Reported-by: Jonas Karlman <jonas@kwiboo.se>
Signed-off-by: Tom Rini <trini@konsulko.com>
2024-05-19 08:16:36 -06:00

109 lines
3.0 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;
}