Pull bugzilla-5452 into release branch
[pandora-kernel.git] / arch / arm / mach-ep93xx / core.c
index 865427b..dcd4176 100644 (file)
@@ -30,7 +30,9 @@
 #include <linux/time.h>
 #include <linux/timex.h>
 #include <linux/delay.h>
+#include <linux/termios.h>
 #include <linux/amba/bus.h>
+#include <linux/amba/serial.h>
 
 #include <asm/types.h>
 #include <asm/setup.h>
@@ -360,6 +362,76 @@ void __init ep93xx_init_irq(void)
 /*************************************************************************
  * EP93xx peripheral handling
  *************************************************************************/
+#define EP93XX_UART_MCR_OFFSET         (0x0100)
+
+static void ep93xx_uart_set_mctrl(struct amba_device *dev,
+                                 void __iomem *base, unsigned int mctrl)
+{
+       unsigned int mcr;
+
+       mcr = 0;
+       if (!(mctrl & TIOCM_RTS))
+               mcr |= 2;
+       if (!(mctrl & TIOCM_DTR))
+               mcr |= 1;
+
+       __raw_writel(mcr, base + EP93XX_UART_MCR_OFFSET);
+}
+
+static struct amba_pl010_data ep93xx_uart_data = {
+       .set_mctrl      = ep93xx_uart_set_mctrl,
+};
+
+static struct amba_device uart1_device = {
+       .dev            = {
+               .bus_id         = "apb:uart1",
+               .platform_data  = &ep93xx_uart_data,
+       },
+       .res            = {
+               .start  = EP93XX_UART1_PHYS_BASE,
+               .end    = EP93XX_UART1_PHYS_BASE + 0x0fff,
+               .flags  = IORESOURCE_MEM,
+       },
+       .irq            = { IRQ_EP93XX_UART1, NO_IRQ },
+       .periphid       = 0x00041010,
+};
+
+static struct amba_device uart2_device = {
+       .dev            = {
+               .bus_id         = "apb:uart2",
+               .platform_data  = &ep93xx_uart_data,
+       },
+       .res            = {
+               .start  = EP93XX_UART2_PHYS_BASE,
+               .end    = EP93XX_UART2_PHYS_BASE + 0x0fff,
+               .flags  = IORESOURCE_MEM,
+       },
+       .irq            = { IRQ_EP93XX_UART2, NO_IRQ },
+       .periphid       = 0x00041010,
+};
+
+static struct amba_device uart3_device = {
+       .dev            = {
+               .bus_id         = "apb:uart3",
+               .platform_data  = &ep93xx_uart_data,
+       },
+       .res            = {
+               .start  = EP93XX_UART3_PHYS_BASE,
+               .end    = EP93XX_UART3_PHYS_BASE + 0x0fff,
+               .flags  = IORESOURCE_MEM,
+       },
+       .irq            = { IRQ_EP93XX_UART3, NO_IRQ },
+       .periphid       = 0x00041010,
+};
+
+
+static struct platform_device ep93xx_rtc_device = {
+       .name           = "ep93xx-rtc",
+       .id             = -1,
+       .num_resources  = 0,
+};
+
+
 void __init ep93xx_init_devices(void)
 {
        unsigned int v;
@@ -371,4 +443,10 @@ void __init ep93xx_init_devices(void)
        v &= ~EP93XX_SYSCON_DEVICE_CONFIG_CRUNCH_ENABLE;
        __raw_writel(0xaa, EP93XX_SYSCON_SWLOCK);
        __raw_writel(v, EP93XX_SYSCON_DEVICE_CONFIG);
+
+       amba_device_register(&uart1_device, &iomem_resource);
+       amba_device_register(&uart2_device, &iomem_resource);
+       amba_device_register(&uart3_device, &iomem_resource);
+
+       platform_device_register(&ep93xx_rtc_device);
 }