linux-mips
[Top] [All Lists]

[PATCH 1/4] alchemy: register au1000_eth as a platform driver part one

To: Ralf Baechle <ralf@linux-mips.org>
Subject: [PATCH 1/4] alchemy: register au1000_eth as a platform driver part one
From: Florian Fainelli <florian@openwrt.org>
Date: Tue, 28 Jul 2009 23:00:13 +0200
Cc: linux-mips@linux-mips.org, Manuel Lauss <manuel.lauss@googlemail.com>
Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:sender:from:date:subject :mime-version:x-uid:x-length:to:cc:content-type :content-transfer-encoding:content-disposition:message-id; bh=e3FdX05NDD7eE/22063Uk/XKrY7pv4sSpDHVR3YMouk=; b=B55NDSwubssQl+SLIQyCRtoA3RFzRmSEejpAN83V+9Ub4Z6SE743rd/cbRMxzTWs1y IIsSR00a5MeRt56UrTi5F7lfVlzRY3OERw3JUy5RDOZeOduyddDN6Is8XH7S9V+3lIVP LVRUazuNSmg7d4LFfPO2iNlTWtD+4jfXUpiK0=
Domainkey-signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=sender:from:date:subject:mime-version:x-uid:x-length:to:cc :content-type:content-transfer-encoding:content-disposition :message-id; b=DHV7/CP0MXyKIgrzAJcRHNX2lIl8bOz7EcF1519qua0zAVZtZFGlsOC36mEI3oYAnh qRvqlp53FqqwoiXlU6gOGtz6pcth9bEi4tqVwNQ1fBqNhABnDDvfcXpMhJB99Mid1M/J 9nXWwdt9i1f9KiSsYyYD96DhNGg/KlBQ//mms=
Original-recipient: rfc822;linux-mips@linux-mips.org
Sender: linux-mips-bounce@linux-mips.org
This is the first patch which registers au1000_eth as a platform
driver. Note that the second MAC (only on non-Au1100 SoC) is
dynamically registered if the interface is enabled in sys_pinfunc.
which also custom boards like Meshcube. PHY information is passed
to the driver in a follow-up patch.

Signed-off-by: Florian Fainelli <florian@openwrt.org>
---
diff --git a/arch/mips/alchemy/common/platform.c 
b/arch/mips/alchemy/common/platform.c
index 117f99f..acc1ae2 100644
--- a/arch/mips/alchemy/common/platform.c
+++ b/arch/mips/alchemy/common/platform.c
@@ -331,6 +331,61 @@ static struct platform_device pbdb_smbus_device = {
 };
 #endif
 
+/* All Alchemy board have at least one Ethernet MAC */
+#define MAC_RES(_base, _enable, _irq)                  \
+       {                                               \
+               .start  = CPHYSADDR(_base),             \
+               .end    = CPHYSADDR(_base + 0xffff),    \
+               .flags  = IORESOURCE_MEM,               \
+       },                                              \
+       {                                               \
+               .start  = CPHYSADDR(_enable),           \
+               .end    = CPHYSADDR(_enable + 0x4),     \
+               .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 platform_device au1xxx_eth0_device = {
+       .name           = "au1000-eth",
+       .id             = 0,
+       .num_resources  = ARRAY_SIZE(au1xxx_eth0_resources),
+       .resource       = au1xxx_eth0_resources,
+};
+
+#ifndef CONFIG_SOC_AU1100
+static struct platform_device au1xxx_eth1_device = {
+       .name           = "au1000-eth",
+       .id             = 1,
+       .num_resources  = ARRAY_SIZE(au1xxx_eth1_resources),
+       .resource       = au1xxx_eth1_resources,
+};
+#endif
+
 static struct platform_device *au1xxx_platform_devices[] __initdata = {
        &au1xx0_uart_device,
        &au1xxx_usb_ohci_device,
@@ -351,17 +406,25 @@ 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)
 {
        unsigned int uartclk = get_au1x00_uart_baud_base() * 16;
-       int i;
+       int i, ni;
 
        /* Fill up uartclk. */
        for (i = 0; au1x00_uart_data[i].flags; i++)
                au1x00_uart_data[i].uartclk = uartclk;
 
+       /* Register second MAC if enabled in pinfunc */
+#ifndef CONFIG_SOC_AU1100
+        ni = (int)((au_readl(SYS_PINFUNC) & (u32)(SYS_PF_NI2)) >> 4);
+        if (!(ni + 1))
+               platform_device_register(&au1xxx_eth1_device);
+#endif
+
        return platform_add_devices(au1xxx_platform_devices,
                                    ARRAY_SIZE(au1xxx_platform_devices));
 }

<Prev in Thread] Current Thread [Next in Thread>