[ARM] 5374/1: The w90p910 uart0 driver patch
authorwanzongshun <mcuos.com@gmail.com>
Wed, 4 Feb 2009 04:01:38 +0000 (05:01 +0100)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Tue, 10 Feb 2009 11:24:21 +0000 (11:24 +0000)
Add W90P910 UART0 support,the W90P910 UART0 is 8250 series.

Signed-off-by: Wan ZongShun <mcuos.com@gmail.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
arch/arm/mach-w90x900/cpu.h
arch/arm/mach-w90x900/mach-w90p910evb.c
arch/arm/mach-w90x900/w90p910.c

index 40ff408..001d509 100644 (file)
@@ -43,6 +43,7 @@ extern void w90p910_init_io(struct map_desc *mach_desc, int size);
 extern void w90p910_init_uarts(struct w90x900_uartcfg *cfg, int no);
 extern void w90p910_init_clocks(int xtal);
 extern void w90p910_map_io(struct map_desc *mach_desc, int size);
+extern struct platform_device w90p910_serial_device;
 extern struct sys_timer w90x900_timer;
 
 #define W90X900_RES(name)                              \
@@ -67,11 +68,13 @@ struct platform_device w90x900_##devname = {                                \
        .resource       = w90x900_##regname##_resource,                 \
 }
 
-#define W90X900_UARTCFG(port, flag, uc, ulc, ufc)      \
-{                                                      \
-               .hwport = port,                         \
-               .flags  = flag,                         \
-               .ucon   = uc,                           \
-               .ulcon  = ulc,                          \
-               .ufcon  = ufc,                          \
+#define W90X900_8250PORT(name)                                 \
+{                                                              \
+       .membase        = name##_BA,                            \
+       .mapbase        = name##_PA,                            \
+       .irq            = IRQ_##name,                           \
+       .uartclk        = 11313600,                             \
+       .regshift       = 2,                                    \
+       .iotype         = UPIO_MEM,                             \
+       .flags          = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST,    \
 }
index 9ebc93f..5425270 100644 (file)
 static struct map_desc w90p910_iodesc[] __initdata = {
 };
 
-static struct w90x900_uartcfg w90p910_uartcfgs[] = {
-       W90X900_UARTCFG(0, 0, 0, 0, 0),
-       W90X900_UARTCFG(1, 0, 0, 0, 0),
-       W90X900_UARTCFG(2, 0, 0, 0, 0),
-       W90X900_UARTCFG(3, 0, 0, 0, 0),
-       W90X900_UARTCFG(4, 0, 0, 0, 0),
-};
-
 /*Here should be your evb resourse,such as LCD*/
 
 static struct platform_device *w90p910evb_dev[] __initdata = {
+       &w90p910_serial_device,
 };
 
 static void __init w90p910evb_map_io(void)
 {
        w90p910_map_io(w90p910_iodesc, ARRAY_SIZE(w90p910_iodesc));
        w90p910_init_clocks(0);
-       w90p910_init_uarts(w90p910_uartcfgs, ARRAY_SIZE(w90p910_uartcfgs));
 }
 
 static void __init w90p910evb_init(void)
index aa783bc..2bcbaa6 100644 (file)
@@ -25,6 +25,7 @@
 #include <linux/init.h>
 #include <linux/platform_device.h>
 #include <linux/io.h>
+#include <linux/serial_8250.h>
 
 #include <asm/mach/arch.h>
 #include <asm/mach/map.h>
 
 #include "cpu.h"
 
-/*W90P910 has five uarts*/
-
-#define MAX_UART_COUNT 5
-static int uart_count;
-static struct platform_device *uart_devs[MAX_UART_COUNT-1];
-
 /* Initial IO mappings */
 
 static struct map_desc w90p910_iodesc[] __initdata = {
@@ -53,48 +48,19 @@ static struct map_desc w90p910_iodesc[] __initdata = {
        /*IODESC_ENT(LCD),*/
 };
 
-/*Init the dev resource*/
-
-static W90X900_RES(UART0);
-static W90X900_RES(UART1);
-static W90X900_RES(UART2);
-static W90X900_RES(UART3);
-static W90X900_RES(UART4);
-static W90X900_DEVICE(uart0, UART0, 0, "w90x900-uart");
-static W90X900_DEVICE(uart1, UART1, 1, "w90x900-uart");
-static W90X900_DEVICE(uart2, UART2, 2, "w90x900-uart");
-static W90X900_DEVICE(uart3, UART3, 3, "w90x900-uart");
-static W90X900_DEVICE(uart4, UART4, 4, "w90x900-uart");
-
-static struct platform_device *uart_devices[] __initdata = {
-       &w90x900_uart0,
-       &w90x900_uart1,
-       &w90x900_uart2,
-       &w90x900_uart3,
-       &w90x900_uart4
-};
+/* Initial serial platform data */
 
-/*Init W90P910 uart device*/
+struct plat_serial8250_port w90p910_uart_data[] = {
+       W90X900_8250PORT(UART0),
+};
 
-void __init w90p910_init_uarts(struct w90x900_uartcfg *cfg, int no)
-{
-       struct platform_device *platdev;
-       int uart, uartdev;
-
-       /*By min() to judge count of uart be used indeed*/
-
-       uartdev = ARRAY_SIZE(uart_devices);
-       no = min(uartdev, no);
-
-       for (uart = 0; uart < no; uart++, cfg++) {
-               if (cfg->hwport != uart)
-                       printk(KERN_ERR "w90x900_uartcfg[%d] error\n", uart);
-               platdev = uart_devices[cfg->hwport];
-               uart_devs[uart] = platdev;
-               platdev->dev.platform_data = cfg;
-       }
-       uart_count = uart;
-}
+struct platform_device w90p910_serial_device = {
+       .name                   = "serial8250",
+       .id                     = PLAT8250_DEV_PLATFORM,
+       .dev                    = {
+               .platform_data  = w90p910_uart_data,
+       },
+};
 
 /*Init W90P910 evb io*/
 
@@ -122,13 +88,6 @@ static int __init w90p910_init_cpu(void)
 
 static int __init w90x900_arch_init(void)
 {
-       int ret;
-
-       ret = w90p910_init_cpu();
-       if (ret != 0)
-               return ret;
-
-       return platform_add_devices(uart_devs, uart_count);
-
+       return w90p910_init_cpu();
 }
 arch_initcall(w90x900_arch_init);