Merge branch 'viafb-next' of git://github.com/schandinat/linux-2.6
[pandora-kernel.git] / arch / arm / mach-kirkwood / openrd-setup.c
index fd06be6..c9d77fa 100644 (file)
@@ -16,6 +16,7 @@
 #include <linux/ata_platform.h>
 #include <linux/mv643xx_eth.h>
 #include <linux/i2c.h>
+#include <linux/gpio.h>
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 #include <mach/kirkwood.h>
@@ -57,7 +58,22 @@ static struct mvsdio_platform_data openrd_mvsdio_data = {
 };
 
 static unsigned int openrd_mpp_config[] __initdata = {
+       MPP12_SD_CLK,
+       MPP13_SD_CMD,
+       MPP14_SD_D0,
+       MPP15_SD_D1,
+       MPP16_SD_D2,
+       MPP17_SD_D3,
+       MPP28_GPIO,
        MPP29_GPIO,
+       MPP34_GPIO,
+       0
+};
+
+/* Configure MPP for UART1 */
+static unsigned int openrd_uart1_mpp_config[] __initdata = {
+       MPP13_UART1_TXD,
+       MPP14_UART1_RXD,
        0
 };
 
@@ -67,6 +83,68 @@ static struct i2c_board_info i2c_board_info[] __initdata = {
        },
 };
 
+static int __initdata uart1;
+
+static int __init sd_uart_selection(char *str)
+{
+       uart1 = -EINVAL;
+
+       /* Default is SD. Change if required, for UART */
+       if (!str)
+               return 0;
+
+       if (!strncmp(str, "232", 3)) {
+               uart1 = 232;
+       } else if (!strncmp(str, "485", 3)) {
+               /* OpenRD-Base doesn't have RS485. Treat is as an
+                * unknown argument & just have default setting -
+                * which is SD */
+               if (machine_is_openrd_base()) {
+                       uart1 = -ENODEV;
+                       return 1;
+               }
+
+               uart1 = 485;
+       }
+       return 1;
+}
+/* Parse boot_command_line string kw_openrd_init_uart1=232/485 */
+__setup("kw_openrd_init_uart1=", sd_uart_selection);
+
+static int __init uart1_mpp_config(void)
+{
+       kirkwood_mpp_conf(openrd_uart1_mpp_config);
+
+       if (gpio_request(34, "SD_UART1_SEL")) {
+               printk(KERN_ERR "GPIO request failed for SD/UART1 selection"
+                               ", gpio: 34\n");
+               return -EIO;
+       }
+
+       if (gpio_request(28, "RS232_RS485_SEL")) {
+               printk(KERN_ERR "GPIO request failed for RS232/RS485 selection"
+                               ", gpio# 28\n");
+               gpio_free(34);
+               return -EIO;
+       }
+
+       /* Select UART1
+        * Pin # 34: 0 => UART1, 1 => SD */
+       gpio_direction_output(34, 0);
+
+       /* Select RS232 OR RS485
+        * Pin # 28: 0 => RS232, 1 => RS485 */
+       if (uart1 == 232)
+               gpio_direction_output(28, 0);
+       else
+               gpio_direction_output(28, 1);
+
+       gpio_free(34);
+       gpio_free(28);
+
+       return 0;
+}
+
 static void __init openrd_init(void)
 {
        /*
@@ -90,7 +168,6 @@ static void __init openrd_init(void)
                kirkwood_ge01_init(&openrd_ge01_data);
 
        kirkwood_sata_init(&openrd_sata_data);
-       kirkwood_sdio_init(&openrd_mvsdio_data);
 
        kirkwood_i2c_init();
 
@@ -99,6 +176,28 @@ static void __init openrd_init(void)
                        ARRAY_SIZE(i2c_board_info));
                kirkwood_audio_init();
        }
+
+       if (uart1 <= 0) {
+               if (uart1 < 0)
+                       printk(KERN_ERR "Invalid kernel parameter to select "
+                               "UART1. Defaulting to SD. ERROR CODE: %d\n",
+                               uart1);
+
+               /* Select SD
+                * Pin # 34: 0 => UART1, 1 => SD */
+               if (gpio_request(34, "SD_UART1_SEL")) {
+                       printk(KERN_ERR "GPIO request failed for SD/UART1 "
+                                       "selection, gpio: 34\n");
+               } else {
+
+                       gpio_direction_output(34, 1);
+                       gpio_free(34);
+                       kirkwood_sdio_init(&openrd_mvsdio_data);
+               }
+       } else {
+               if (!uart1_mpp_config())
+                       kirkwood_uart1_init();
+       }
 }
 
 static int __init openrd_pci_init(void)
@@ -115,8 +214,6 @@ subsys_initcall(openrd_pci_init);
 #ifdef CONFIG_MACH_OPENRD_BASE
 MACHINE_START(OPENRD_BASE, "Marvell OpenRD Base Board")
        /* Maintainer: Dhaval Vasa <dhaval.vasa@einfochips.com> */
-       .phys_io        = KIRKWOOD_REGS_PHYS_BASE,
-       .io_pg_offst    = ((KIRKWOOD_REGS_VIRT_BASE) >> 18) & 0xfffc,
        .boot_params    = 0x00000100,
        .init_machine   = openrd_init,
        .map_io         = kirkwood_map_io,
@@ -128,8 +225,6 @@ MACHINE_END
 #ifdef CONFIG_MACH_OPENRD_CLIENT
 MACHINE_START(OPENRD_CLIENT, "Marvell OpenRD Client Board")
        /* Maintainer: Dhaval Vasa <dhaval.vasa@einfochips.com> */
-       .phys_io        = KIRKWOOD_REGS_PHYS_BASE,
-       .io_pg_offst    = ((KIRKWOOD_REGS_VIRT_BASE) >> 18) & 0xfffc,
        .boot_params    = 0x00000100,
        .init_machine   = openrd_init,
        .map_io         = kirkwood_map_io,
@@ -141,8 +236,6 @@ MACHINE_END
 #ifdef CONFIG_MACH_OPENRD_ULTIMATE
 MACHINE_START(OPENRD_ULTIMATE, "Marvell OpenRD Ultimate Board")
        /* Maintainer: Dhaval Vasa <dhaval.vasa@einfochips.com> */
-       .phys_io        = KIRKWOOD_REGS_PHYS_BASE,
-       .io_pg_offst    = ((KIRKWOOD_REGS_VIRT_BASE) >> 18) & 0xfffc,
        .boot_params    = 0x00000100,
        .init_machine   = openrd_init,
        .map_io         = kirkwood_map_io,