Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 33c760fb authored by Chris Zankel's avatar Chris Zankel
Browse files

xtensa: set the correct ethernet address for xtfpga



The last byte of the mac address is determined by a DIP switch, so
update the OF property with that address.

Signed-off-by: default avatarChris Zankel <chris@zankel.net>
parent c4c4594b
Loading
Loading
Loading
Loading
+34 −2
Original line number Diff line number Diff line
@@ -32,6 +32,7 @@
#include <asm/platform.h>
#include <asm/bootparam.h>
#include <platform/lcd.h>
#include <platform/hardware.h>

void platform_halt(void)
{
@@ -84,8 +85,7 @@ static void __init update_clock_frequency(struct device_node *node)
	struct property *newfreq;
	u32 freq;

	if (!of_property_read_u32(node, "clock-frequency", &freq) &&
			freq != 0)
	if (!of_property_read_u32(node, "clock-frequency", &freq) && freq != 0)
		return;

	newfreq = kzalloc(sizeof(*newfreq) + sizeof(u32), GFP_KERNEL);
@@ -103,12 +103,44 @@ static void __init update_clock_frequency(struct device_node *node)
	prom_update_property(node, newfreq);
}

#define MAC_LEN 6
static void __init update_local_mac(struct device_node *node)
{
	struct property *newmac;
	const u8* macaddr;
	int prop_len;

	macaddr = of_get_property(node, "local-mac-address", &prop_len);
	if (macaddr == NULL || prop_len != MAC_LEN)
		return;

	newmac = kzalloc(sizeof(*newmac) + MAC_LEN, GFP_KERNEL);
	if (newmac == NULL)
		return;

	newmac->value = newmac + 1;
	newmac->length = MAC_LEN;
	newmac->name = kstrdup("local-mac-address", GFP_KERNEL);
	if (newmac->name == NULL) {
		kfree(newmac);
		return;
	}

	memcpy(newmac->value, macaddr, MAC_LEN);
	((u8*)newmac->value)[5] = (*(u32*)DIP_SWITCHES_VADDR) & 0x3f;
	prom_update_property(node, newmac);
}

static int __init machine_setup(void)
{
	struct device_node *serial;
	struct device_node *eth = NULL;

	for_each_compatible_node(serial, NULL, "ns16550a")
		update_clock_frequency(serial);

	if ((eth = of_find_compatible_node(eth, NULL, "opencores,ethoc")))
		update_local_mac(eth);
	return 0;
}
arch_initcall(machine_setup);