diff options
| author | Florian Fainelli <florian@openwrt.org> | 2009-11-10 01:13:30 +0100 | 
|---|---|---|
| committer | Ralf Baechle <ralf@linux-mips.org> | 2010-02-27 12:53:01 +0100 | 
| commit | 66f75ccb856304c190fde9c26e651c2b754e3e72 (patch) | |
| tree | f63f8fe9362fc9805b73f9146a20457d1ceddff0 /arch/mips/alchemy/common/platform.c | |
| parent | cf6e47e03239059bcf2942b1b3242e835231ab75 (diff) | |
MIPS: Alchemy: Add au1000-eth platform device
This patch makes the board code register the au1000-eth platform device. The
au1000-eth platform data can be overriden with the au1xxx_override_eth_cfg
function like it has to be done for the Bosporus board which uses a
different MAC/PHY setup.
Signed-off-by: Florian Fainelli <florian@openwrt.org>
Cc: David Miller <davem@davemloft.net>
Cc: linux-mips@linux-mips.org
Cc: netdev@vger.kernel.org
Patchwork: http://patchwork.linux-mips.org/patch/618/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Diffstat (limited to 'arch/mips/alchemy/common/platform.c')
| -rw-r--r-- | arch/mips/alchemy/common/platform.c | 90 | 
1 files changed, 90 insertions, 0 deletions
diff --git a/arch/mips/alchemy/common/platform.c b/arch/mips/alchemy/common/platform.c index 3be14b09157c..3fbe30c1fd9a 100644 --- a/arch/mips/alchemy/common/platform.c +++ b/arch/mips/alchemy/common/platform.c @@ -19,6 +19,7 @@  #include <asm/mach-au1x00/au1xxx.h>  #include <asm/mach-au1x00/au1xxx_dbdma.h>  #include <asm/mach-au1x00/au1100_mmc.h> +#include <asm/mach-au1x00/au1xxx_eth.h>  #define PORT(_base, _irq)					\  	{							\ @@ -326,6 +327,88 @@ static struct platform_device pbdb_smbus_device = {  };  #endif +/* Macro to help defining the Ethernet MAC resources */ +#define MAC_RES(_base, _enable, _irq)			\ +	{						\ +		.start	= CPHYSADDR(_base),		\ +		.end	= CPHYSADDR(_base + 0xffff),	\ +		.flags	= IORESOURCE_MEM,		\ +	},						\ +	{						\ +		.start	= CPHYSADDR(_enable),		\ +		.end	= CPHYSADDR(_enable + 0x3),	\ +		.flags	= IORESOURCE_MEM,		\ +	},						\ +	{						\ +		.start	= _irq,				\ +		.end	= _irq,				\ +		.flags	= IORESOURCE_IRQ		\ +	} + +static struct resource au1xxx_eth0_resources[] = { +#if defined(CONFIG_SOC_AU1000) +	MAC_RES(AU1000_ETH0_BASE, AU1000_MAC0_ENABLE, AU1000_MAC0_DMA_INT), +#elif defined(CONFIG_SOC_AU1100) +	MAC_RES(AU1100_ETH0_BASE, AU1100_MAC0_ENABLE, AU1100_MAC0_DMA_INT), +#elif defined(CONFIG_SOC_AU1550) +	MAC_RES(AU1550_ETH0_BASE, AU1550_MAC0_ENABLE, AU1550_MAC0_DMA_INT), +#elif defined(CONFIG_SOC_AU1500) +	MAC_RES(AU1500_ETH0_BASE, AU1500_MAC0_ENABLE, AU1500_MAC0_DMA_INT), +#endif +}; + +static struct resource au1xxx_eth1_resources[] = { +#if defined(CONFIG_SOC_AU1000) +	MAC_RES(AU1000_ETH1_BASE, AU1000_MAC1_ENABLE, AU1000_MAC1_DMA_INT), +#elif defined(CONFIG_SOC_AU1550) +	MAC_RES(AU1550_ETH1_BASE, AU1550_MAC1_ENABLE, AU1550_MAC1_DMA_INT), +#elif defined(CONFIG_SOC_AU1500) +	MAC_RES(AU1500_ETH1_BASE, AU1500_MAC1_ENABLE, AU1500_MAC1_DMA_INT), +#endif +}; + +static struct au1000_eth_platform_data au1xxx_eth0_platform_data = { +	.phy1_search_mac0 = 1, +}; + +static struct platform_device au1xxx_eth0_device = { +	.name		= "au1000-eth", +	.id		= 0, +	.num_resources	= ARRAY_SIZE(au1xxx_eth0_resources), +	.resource	= au1xxx_eth0_resources, +	.dev.platform_data = &au1xxx_eth0_platform_data, +}; + +#ifndef CONFIG_SOC_AU1100 +static struct au1000_eth_platform_data au1xxx_eth1_platform_data = { +	.phy1_search_mac0 = 1, +}; + +static struct platform_device au1xxx_eth1_device = { +	.name		= "au1000-eth", +	.id		= 1, +	.num_resources	= ARRAY_SIZE(au1xxx_eth1_resources), +	.resource	= au1xxx_eth1_resources, +	.dev.platform_data = &au1xxx_eth1_platform_data, +}; +#endif + +void __init au1xxx_override_eth_cfg(unsigned int port, +			struct au1000_eth_platform_data *eth_data) +{ +	if (!eth_data || port > 1) +		return; + +	if (port == 0) +		memcpy(&au1xxx_eth0_platform_data, eth_data, +			sizeof(struct au1000_eth_platform_data)); +#ifndef CONFIG_SOC_AU1100 +	else +		memcpy(&au1xxx_eth1_platform_data, eth_data, +			sizeof(struct au1000_eth_platform_data)); +#endif +} +  static struct platform_device *au1xxx_platform_devices[] __initdata = {  	&au1xx0_uart_device,  	&au1xxx_usb_ohci_device, @@ -345,6 +428,7 @@ static struct platform_device *au1xxx_platform_devices[] __initdata = {  #ifdef SMBUS_PSC_BASE  	&pbdb_smbus_device,  #endif +	&au1xxx_eth0_device,  };  static int __init au1xxx_platform_init(void) @@ -356,6 +440,12 @@ static int __init au1xxx_platform_init(void)  	for (i = 0; au1x00_uart_data[i].flags; i++)  		au1x00_uart_data[i].uartclk = uartclk; +#ifndef CONFIG_SOC_AU1100 +	/* Register second MAC if enabled in pinfunc */ +	if (!(au_readl(SYS_PINFUNC) & (u32)SYS_PF_NI2)) +		platform_device_register(&au1xxx_eth1_device); +#endif +  	return platform_add_devices(au1xxx_platform_devices,  				    ARRAY_SIZE(au1xxx_platform_devices));  }  | 
