]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - arch/mips/alchemy/common/platform.c
Merge branch 'x86-numa-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git...
[mv-sheeva.git] / arch / mips / alchemy / common / platform.c
index 117f99f70649547f137a4442021444b2e8ef73fd..2580e77624d2072b4637b28eb32f5deb5053c1c0 100644 (file)
 #include <asm/mach-au1x00/au1xxx.h>
 #include <asm/mach-au1x00/au1xxx_dbdma.h>
 #include <asm/mach-au1x00/au1100_mmc.h>
-
-#define PORT(_base, _irq)                              \
-       {                                               \
-               .iobase         = _base,                \
-               .membase        = (void __iomem *)_base,\
-               .mapbase        = CPHYSADDR(_base),     \
-               .irq            = _irq,                 \
-               .regshift       = 2,                    \
-               .iotype         = UPIO_AU,              \
-               .flags          = UPF_SKIP_TEST         \
+#include <asm/mach-au1x00/au1xxx_eth.h>
+
+#define PORT(_base, _irq)                                      \
+       {                                                       \
+               .mapbase        = _base,                        \
+               .irq            = _irq,                         \
+               .regshift       = 2,                            \
+               .iotype         = UPIO_AU,                      \
+               .flags          = UPF_SKIP_TEST | UPF_IOREMAP | \
+                                 UPF_FIXED_TYPE,               \
+               .type           = PORT_16550A,                  \
        }
 
 static struct plat_serial8250_port au1x00_uart_data[] = {
 #if defined(CONFIG_SERIAL_8250_AU1X00)
 #if defined(CONFIG_SOC_AU1000)
-       PORT(UART0_ADDR, AU1000_UART0_INT),
-       PORT(UART1_ADDR, AU1000_UART1_INT),
-       PORT(UART2_ADDR, AU1000_UART2_INT),
-       PORT(UART3_ADDR, AU1000_UART3_INT),
+       PORT(UART0_PHYS_ADDR, AU1000_UART0_INT),
+       PORT(UART1_PHYS_ADDR, AU1000_UART1_INT),
+       PORT(UART2_PHYS_ADDR, AU1000_UART2_INT),
+       PORT(UART3_PHYS_ADDR, AU1000_UART3_INT),
 #elif defined(CONFIG_SOC_AU1500)
-       PORT(UART0_ADDR, AU1500_UART0_INT),
-       PORT(UART3_ADDR, AU1500_UART3_INT),
+       PORT(UART0_PHYS_ADDR, AU1500_UART0_INT),
+       PORT(UART3_PHYS_ADDR, AU1500_UART3_INT),
 #elif defined(CONFIG_SOC_AU1100)
-       PORT(UART0_ADDR, AU1100_UART0_INT),
-       PORT(UART1_ADDR, AU1100_UART1_INT),
-       PORT(UART3_ADDR, AU1100_UART3_INT),
+       PORT(UART0_PHYS_ADDR, AU1100_UART0_INT),
+       PORT(UART1_PHYS_ADDR, AU1100_UART1_INT),
+       PORT(UART3_PHYS_ADDR, AU1100_UART3_INT),
 #elif defined(CONFIG_SOC_AU1550)
-       PORT(UART0_ADDR, AU1550_UART0_INT),
-       PORT(UART1_ADDR, AU1550_UART1_INT),
-       PORT(UART3_ADDR, AU1550_UART3_INT),
+       PORT(UART0_PHYS_ADDR, AU1550_UART0_INT),
+       PORT(UART1_PHYS_ADDR, AU1550_UART1_INT),
+       PORT(UART3_PHYS_ADDR, AU1550_UART3_INT),
 #elif defined(CONFIG_SOC_AU1200)
-       PORT(UART0_ADDR, AU1200_UART0_INT),
-       PORT(UART1_ADDR, AU1200_UART1_INT),
+       PORT(UART0_PHYS_ADDR, AU1200_UART0_INT),
+       PORT(UART1_PHYS_ADDR, AU1200_UART1_INT),
 #endif
 #endif /* CONFIG_SERIAL_8250_AU1X00 */
        { },
@@ -73,8 +74,8 @@ static struct resource au1xxx_usb_ohci_resources[] = {
                .flags          = IORESOURCE_MEM,
        },
        [1] = {
-               .start          = AU1000_USB_HOST_INT,
-               .end            = AU1000_USB_HOST_INT,
+               .start          = FOR_PLATFORM_C_USB_HOST_INT,
+               .end            = FOR_PLATFORM_C_USB_HOST_INT,
                .flags          = IORESOURCE_IRQ,
        },
 };
@@ -132,8 +133,8 @@ static struct resource au1xxx_usb_ehci_resources[] = {
                .flags          = IORESOURCE_MEM,
        },
        [1] = {
-               .start          = AU1000_USB_HOST_INT,
-               .end            = AU1000_USB_HOST_INT,
+               .start          = AU1200_USB_INT,
+               .end            = AU1200_USB_INT,
                .flags          = IORESOURCE_IRQ,
        },
 };
@@ -308,11 +309,6 @@ static struct platform_device au1200_mmc1_device = {
 #endif /* #ifndef CONFIG_MIPS_DB1200 */
 #endif /* #ifdef CONFIG_SOC_AU1200 */
 
-static struct platform_device au1x00_pcmcia_device = {
-       .name           = "au1x00-pcmcia",
-       .id             = 0,
-};
-
 /* All Alchemy demoboards with I2C have this #define in their headers */
 #ifdef SMBUS_PSC_BASE
 static struct resource pbdb_smbus_resources[] = {
@@ -331,10 +327,92 @@ 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 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 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_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,
-       &au1x00_pcmcia_device,
 #ifdef CONFIG_FB_AU1100
        &au1100_lcd_device,
 #endif
@@ -351,6 +429,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)
@@ -362,6 +441,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));
 }