Merge branch 'sh/dwarf-unwinder'
[pandora-kernel.git] / arch / arm / mach-omap2 / serial.c
index a7421a5..ae21868 100644 (file)
@@ -73,7 +73,7 @@ static LIST_HEAD(uart_list);
 
 static struct plat_serial8250_port serial_platform_data0[] = {
        {
-               .membase        = IO_ADDRESS(OMAP_UART1_BASE),
+               .membase        = OMAP2_IO_ADDRESS(OMAP_UART1_BASE),
                .mapbase        = OMAP_UART1_BASE,
                .irq            = 72,
                .flags          = UPF_BOOT_AUTOCONF,
@@ -87,7 +87,7 @@ static struct plat_serial8250_port serial_platform_data0[] = {
 
 static struct plat_serial8250_port serial_platform_data1[] = {
        {
-               .membase        = IO_ADDRESS(OMAP_UART2_BASE),
+               .membase        = OMAP2_IO_ADDRESS(OMAP_UART2_BASE),
                .mapbase        = OMAP_UART2_BASE,
                .irq            = 73,
                .flags          = UPF_BOOT_AUTOCONF,
@@ -101,7 +101,7 @@ static struct plat_serial8250_port serial_platform_data1[] = {
 
 static struct plat_serial8250_port serial_platform_data2[] = {
        {
-               .membase        = IO_ADDRESS(OMAP_UART3_BASE),
+               .membase        = OMAP2_IO_ADDRESS(OMAP_UART3_BASE),
                .mapbase        = OMAP_UART3_BASE,
                .irq            = 74,
                .flags          = UPF_BOOT_AUTOCONF,
@@ -109,10 +109,35 @@ static struct plat_serial8250_port serial_platform_data2[] = {
                .regshift       = 2,
                .uartclk        = OMAP24XX_BASE_BAUD * 16,
        }, {
+#ifdef CONFIG_ARCH_OMAP4
+               .membase        = OMAP2_IO_ADDRESS(OMAP_UART4_BASE),
+               .mapbase        = OMAP_UART4_BASE,
+               .irq            = 70,
+               .flags          = UPF_BOOT_AUTOCONF,
+               .iotype         = UPIO_MEM,
+               .regshift       = 2,
+               .uartclk        = OMAP24XX_BASE_BAUD * 16,
+       }, {
+#endif
                .flags          = 0
        }
 };
 
+#ifdef CONFIG_ARCH_OMAP4
+static struct plat_serial8250_port serial_platform_data3[] = {
+       {
+               .membase        = OMAP2_IO_ADDRESS(OMAP_UART4_BASE),
+               .mapbase        = OMAP_UART4_BASE,
+               .irq            = 70,
+               .flags          = UPF_BOOT_AUTOCONF,
+               .iotype         = UPIO_MEM,
+               .regshift       = 2,
+               .uartclk        = OMAP24XX_BASE_BAUD * 16,
+       }, {
+               .flags          = 0
+       }
+};
+#endif
 static inline unsigned int serial_read_reg(struct plat_serial8250_port *up,
                                           int offset)
 {
@@ -460,7 +485,7 @@ static void omap_uart_idle_init(struct omap_uart_state *uart)
                uart->padconf = 0;
        }
 
-       p->flags |= UPF_SHARE_IRQ;
+       p->irqflags |= IRQF_SHARED;
        ret = request_irq(p->irq, omap_uart_interrupt, IRQF_SHARED,
                          "serial idle", (void *)uart);
        WARN_ON(ret);
@@ -550,12 +575,22 @@ static struct omap_uart_state omap_uart[OMAP_MAX_NR_PORTS] = {
                        },
                },
        },
+#ifdef CONFIG_ARCH_OMAP4
+       {
+               .pdev = {
+                       .name                   = "serial8250",
+                       .id                     = 3,
+                       .dev                    = {
+                               .platform_data  = serial_platform_data3,
+                       },
+               },
+       },
+#endif
 };
 
-void __init omap_serial_init(void)
+void __init omap_serial_early_init(void)
 {
        int i;
-       const struct omap_uart_config *info;
        char name[16];
 
        /*
@@ -564,23 +599,12 @@ void __init omap_serial_init(void)
         * if not needed.
         */
 
-       info = omap_get_config(OMAP_TAG_UART, struct omap_uart_config);
-
-       if (info == NULL)
-               return;
-
        for (i = 0; i < OMAP_MAX_NR_PORTS; i++) {
                struct omap_uart_state *uart = &omap_uart[i];
                struct platform_device *pdev = &uart->pdev;
                struct device *dev = &pdev->dev;
                struct plat_serial8250_port *p = dev->platform_data;
 
-               if (!(info->enabled_uarts & (1 << i))) {
-                       p->membase = NULL;
-                       p->mapbase = 0;
-                       continue;
-               }
-
                sprintf(name, "uart%d_ick", i+1);
                uart->ick = clk_get(NULL, name);
                if (IS_ERR(uart->ick)) {
@@ -595,8 +619,11 @@ void __init omap_serial_init(void)
                        uart->fck = NULL;
                }
 
-               if (!uart->ick || !uart->fck)
-                       continue;
+               /* FIXME: Remove this once the clkdev is ready */
+               if (!cpu_is_omap44xx()) {
+                       if (!uart->ick || !uart->fck)
+                               continue;
+               }
 
                uart->num = i;
                p->private_data = uart;
@@ -607,6 +634,18 @@ void __init omap_serial_init(void)
                        p->irq += 32;
 
                omap_uart_enable_clocks(uart);
+       }
+}
+
+void __init omap_serial_init(void)
+{
+       int i;
+
+       for (i = 0; i < OMAP_MAX_NR_PORTS; i++) {
+               struct omap_uart_state *uart = &omap_uart[i];
+               struct platform_device *pdev = &uart->pdev;
+               struct device *dev = &pdev->dev;
+
                omap_uart_reset(uart);
                omap_uart_idle_init(uart);