diff options
Diffstat (limited to 'target/linux/mcs814x/files-3.3/arch')
3 files changed, 79 insertions, 4 deletions
diff --git a/target/linux/mcs814x/files-3.3/arch/arm/boot/dts/mcs8140.dtsi b/target/linux/mcs814x/files-3.3/arch/arm/boot/dts/mcs8140.dtsi index 67727efe9c..c68f3ce7da 100644 --- a/target/linux/mcs814x/files-3.3/arch/arm/boot/dts/mcs8140.dtsi +++ b/target/linux/mcs814x/files-3.3/arch/arm/boot/dts/mcs8140.dtsi @@ -37,11 +37,12 @@ ranges; eth0: ethernet@40084000 { - //compatible = "moschip,mcs814x-eth"; compatible = "moschip,nuport-mac"; reg = <0x40084000 0xd8 // mac 0x40080000 0x58>; // dma channels interrupts = <4 5 29>; /* tx, rx, link */ + nuport-mac,buffer-shifting; + nuport-mac,link-activity = <0>; }; tso@40088000 { diff --git a/target/linux/mcs814x/files-3.3/arch/arm/boot/dts/rbt-832.dts b/target/linux/mcs814x/files-3.3/arch/arm/boot/dts/rbt-832.dts index a3d815c07b..cc7fab8ed1 100644 --- a/target/linux/mcs814x/files-3.3/arch/arm/boot/dts/rbt-832.dts +++ b/target/linux/mcs814x/files-3.3/arch/arm/boot/dts/rbt-832.dts @@ -19,6 +19,9 @@ ahb { vci { + eth0: ethernet@40084000 { + nuport-mac,link-activity = <0x01>; + }; adc { sdram: memory@0,0 { diff --git a/target/linux/mcs814x/files-3.3/arch/arm/mach-mcs814x/common.c b/target/linux/mcs814x/files-3.3/arch/arm/mach-mcs814x/common.c index a408e69287..c593561e24 100644 --- a/target/linux/mcs814x/files-3.3/arch/arm/mach-mcs814x/common.c +++ b/target/linux/mcs814x/files-3.3/arch/arm/mach-mcs814x/common.c @@ -12,6 +12,8 @@ #include <linux/init.h> #include <linux/io.h> #include <linux/gpio.h> +#include <linux/of.h> +#include <linux/of_address.h> #include <asm/setup.h> #include <asm/mach-types.h> @@ -30,9 +32,12 @@ static struct map_desc mcs814x_io_desc[] __initdata = { }, }; -#define SYSDBG_BS2 0x04 -#define CPU_MODE_SHIFT 23 -#define CPU_MODE_MASK 0x03 +#define SYSDBG_BS2 0x04 +#define LED_CFG_MASK 0x03 +#define CPU_MODE_SHIFT 23 +#define CPU_MODE_MASK 0x03 + +#define SYSDBG_SYSCTL_MAC 0x1d struct cpu_mode { const char *name; @@ -63,6 +68,70 @@ static const struct cpu_mode cpu_modes[] = { }, }; +static void mcs814x_eth_hardware_filter_set(u8 value) +{ + u32 reg; + + reg = __raw_readl(_CONFADDR_DBGLED); + if (value) + reg |= 0x80; + else + reg &= ~0x80; + __raw_writel(reg, _CONFADDR_DBGLED); +} + +static void mcs814x_eth_led_cfg_set(u8 cfg) +{ + u32 reg; + + reg = __raw_readl(_CONFADDR_SYSDBG + SYSDBG_BS2); + reg &= ~LED_CFG_MASK; + reg |= cfg; + __raw_writel(reg, _CONFADDR_SYSDBG + SYSDBG_BS2); +} + +static void mcs814x_eth_buffer_shifting_set(u8 value) +{ + u8 reg; + + reg = __raw_readb(_CONFADDR_SYSDBG + SYSDBG_SYSCTL_MAC); + if (value) + reg |= 0x01; + else + reg &= ~0x01; + __raw_writeb(reg, _CONFADDR_SYSDBG + SYSDBG_SYSCTL_MAC); +} + +static struct of_device_id mcs814x_eth_ids[] __initdata = { + { .compatible = "moschip,nuport-mac", }, + { /* sentinel */ }, +}; + +/* Configure platform specific knobs based on ethernet device node + * properties */ +static void mcs814x_eth_init(void) +{ + struct device_node *np; + const unsigned int *intspec; + + np = of_find_matching_node(NULL, mcs814x_eth_ids); + if (!np) + return; + + /* hardware filter must always be enabled */ + mcs814x_eth_hardware_filter_set(1); + + intspec = of_get_property(np, "nuport-mac,buffer-shifting", NULL); + if (!intspec) + mcs814x_eth_buffer_shifting_set(0); + else + mcs814x_eth_buffer_shifting_set(1); + + intspec = of_get_property(np, "nuport-mac,link-activity", NULL); + if (intspec) + mcs814x_eth_led_cfg_set(be32_to_cpup(intspec)); +} + void __init mcs814x_init_machine(void) { u32 bs2, cpu_mode; @@ -79,6 +148,8 @@ void __init mcs814x_init_machine(void) if (gpio != -1) gpio_request(gpio, cpu_modes[cpu_mode].name); } + + mcs814x_eth_init(); } void __init mcs814x_map_io(void) |