Merge ../linux-2.6-watchdog-mm
[linux-drm-fsl-dcu.git] / arch / arm / mach-ixp2000 / ixdp2x01.c
index f9d4968c1d66de07aac95aef902ff0aa3a7223fe..9ccae9e63f70deacdffc5fde976abd4d86677799 100644 (file)
@@ -15,7 +15,6 @@
  *  option) any later version.
  */
 
-#include <linux/config.h>
 #include <linux/kernel.h>
 #include <linux/init.h>
 #include <linux/mm.h>
@@ -30,6 +29,7 @@
 #include <linux/tty.h>
 #include <linux/serial_core.h>
 #include <linux/platform_device.h>
+#include <linux/serial_8250.h>
 
 #include <asm/io.h>
 #include <asm/irq.h>
@@ -63,7 +63,7 @@ static void ixdp2x01_irq_unmask(unsigned int irq)
 
 static u32 valid_irq_mask;
 
-static void ixdp2x01_irq_handler(unsigned int irq, struct irqdesc *desc, struct pt_regs *regs)
+static void ixdp2x01_irq_handler(unsigned int irq, struct irqdesc *desc)
 {
        u32 ex_interrupt;
        int i;
@@ -82,7 +82,7 @@ static void ixdp2x01_irq_handler(unsigned int irq, struct irqdesc *desc, struct
                        struct irqdesc *cpld_desc;
                        int cpld_irq = IXP2000_BOARD_IRQ(0) + i;
                        cpld_desc = irq_desc + cpld_irq;
-                       desc_handle_irq(cpld_irq, cpld_desc, regs);
+                       desc_handle_irq(cpld_irq, cpld_desc);
                }
        }
 
@@ -127,12 +127,12 @@ void __init ixdp2x01_init_irq(void)
        }
 
        /* Hook into PCI interrupts */
-       set_irq_chained_handler(IRQ_IXP2000_PCIB, &ixdp2x01_irq_handler);
+       set_irq_chained_handler(IRQ_IXP2000_PCIB, ixdp2x01_irq_handler);
 }
 
 
 /*************************************************************************
- * IXDP2x01 memory map and serial ports
+ * IXDP2x01 memory map
  *************************************************************************/
 static struct map_desc ixdp2x01_io_desc __initdata = {
        .virtual        = IXDP2X01_VIRT_CPLD_BASE, 
@@ -141,40 +141,78 @@ static struct map_desc ixdp2x01_io_desc __initdata = {
        .type           = MT_DEVICE
 };
 
-static struct uart_port ixdp2x01_serial_ports[2] = {
+static void __init ixdp2x01_map_io(void)
+{
+       ixp2000_map_io();
+       iotable_init(&ixdp2x01_io_desc, 1);
+}
+
+
+/*************************************************************************
+ * IXDP2x01 serial ports
+ *************************************************************************/
+static struct plat_serial8250_port ixdp2x01_serial_port1[] = {
        {
-               .membase        = (char *)(IXDP2X01_UART1_VIRT_BASE),
                .mapbase        = (unsigned long)IXDP2X01_UART1_PHYS_BASE,
+               .membase        = (char *)IXDP2X01_UART1_VIRT_BASE,
                .irq            = IRQ_IXDP2X01_UART1,
-               .flags          = UPF_SKIP_TEST,
+               .flags          = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST,
                .iotype         = UPIO_MEM32,
                .regshift       = 2,
                .uartclk        = IXDP2X01_UART_CLK,
-               .line           = 1,
-               .type           = PORT_16550A,
-               .fifosize       = 16
-       }, {
-               .membase        = (char *)(IXDP2X01_UART2_VIRT_BASE),
+       },
+       { }
+};
+
+static struct resource ixdp2x01_uart_resource1 = {
+       .start          = IXDP2X01_UART1_PHYS_BASE,
+       .end            = IXDP2X01_UART1_PHYS_BASE + 0xffff,
+       .flags          = IORESOURCE_MEM,
+};
+
+static struct platform_device ixdp2x01_serial_device1 = {
+       .name           = "serial8250",
+       .id             = PLAT8250_DEV_PLATFORM1,
+       .dev            = {
+               .platform_data          = ixdp2x01_serial_port1,
+       },
+       .num_resources  = 1,
+       .resource       = &ixdp2x01_uart_resource1,
+};
+
+static struct plat_serial8250_port ixdp2x01_serial_port2[] = {
+       {
                .mapbase        = (unsigned long)IXDP2X01_UART2_PHYS_BASE,
+               .membase        = (char *)IXDP2X01_UART2_VIRT_BASE,
                .irq            = IRQ_IXDP2X01_UART2,
-               .flags          = UPF_SKIP_TEST,
+               .flags          = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST,
                .iotype         = UPIO_MEM32,
                .regshift       = 2,
                .uartclk        = IXDP2X01_UART_CLK,
-               .line           = 2,
-               .type           = PORT_16550A,
-               .fifosize       = 16
        }, 
+       { }
 };
 
-static void __init ixdp2x01_map_io(void)
-{
-       ixp2000_map_io();       
+static struct resource ixdp2x01_uart_resource2 = {
+       .start          = IXDP2X01_UART2_PHYS_BASE,
+       .end            = IXDP2X01_UART2_PHYS_BASE + 0xffff,
+       .flags          = IORESOURCE_MEM,
+};
 
-       iotable_init(&ixdp2x01_io_desc, 1);
+static struct platform_device ixdp2x01_serial_device2 = {
+       .name           = "serial8250",
+       .id             = PLAT8250_DEV_PLATFORM2,
+       .dev            = {
+               .platform_data          = ixdp2x01_serial_port2,
+       },
+       .num_resources  = 1,
+       .resource       = &ixdp2x01_uart_resource2,
+};
 
-       early_serial_setup(&ixdp2x01_serial_ports[0]);
-       early_serial_setup(&ixdp2x01_serial_ports[1]);
+static void ixdp2x01_uart_init(void)
+{
+       platform_device_register(&ixdp2x01_serial_device1);
+       platform_device_register(&ixdp2x01_serial_device2);
 }
 
 
@@ -374,6 +412,7 @@ static void __init ixdp2x01_init_machine(void)
 
        platform_add_devices(ixdp2x01_devices, ARRAY_SIZE(ixdp2x01_devices));
        ixp2000_uart_init();
+       ixdp2x01_uart_init();
 }