Merge branch 'l2x0-pull-rmk' of git://dev.omapzoom.org/pub/scm/santosh/kernel-omap4...
[pandora-kernel.git] / arch / arm / mach-omap2 / board-omap3logic.c
index ac3b0f7..5f7d2c1 100644 (file)
@@ -26,6 +26,7 @@
 #include <linux/regulator/machine.h>
 
 #include <linux/i2c/twl.h>
+#include <linux/mmc/host.h>
 
 #include <mach/hardware.h>
 #include <asm/mach-types.h>
 #include <asm/mach/map.h>
 
 #include "mux.h"
+#include "hsmmc.h"
+#include "timer-gp.h"
+#include "control.h"
 
 #include <plat/mux.h>
 #include <plat/board.h>
 #include <plat/common.h>
+#include <plat/gpmc-smsc911x.h>
 #include <plat/gpmc.h>
-#include <plat/timer-gp.h>
 #include <plat/sdrc.h>
-#include <plat/control.h>
 
 #define OMAP3LOGIC_SMSC911X_CS                 1
 
@@ -87,6 +90,7 @@ static struct twl4030_platform_data omap3logic_twldata = {
 
        /* platform_data for children goes here */
        .gpio           = &omap3logic_gpio_data,
+       .vmmc1          = &omap3logic_vmmc1,
 };
 
 static struct i2c_board_info __initdata omap3logic_i2c_boardinfo[] = {
@@ -105,6 +109,92 @@ static int __init omap3logic_i2c_init(void)
        return 0;
 }
 
+static struct omap2_hsmmc_info __initdata board_mmc_info[] = {
+       {
+               .name           = "external",
+               .mmc            = 1,
+               .caps           = MMC_CAP_4_BIT_DATA,
+               .gpio_cd        = -EINVAL,
+               .gpio_wp        = -EINVAL,
+       },
+       {}      /* Terminator */
+};
+
+static void __init board_mmc_init(void)
+{
+       if (machine_is_omap3530_lv_som()) {
+               /* OMAP3530 LV SOM board */
+               board_mmc_info[0].gpio_cd = OMAP3530_LV_SOM_MMC_GPIO_CD;
+               board_mmc_info[0].gpio_wp = OMAP3530_LV_SOM_MMC_GPIO_WP;
+               omap_mux_init_signal("gpio_110", OMAP_PIN_OUTPUT);
+               omap_mux_init_signal("gpio_126", OMAP_PIN_OUTPUT);
+       } else if (machine_is_omap3_torpedo()) {
+               /* OMAP3 Torpedo board */
+               board_mmc_info[0].gpio_cd = OMAP3_TORPEDO_MMC_GPIO_CD;
+               omap_mux_init_signal("gpio_127", OMAP_PIN_OUTPUT);
+       } else {
+               /* unsupported board */
+               printk(KERN_ERR "%s(): unknown machine type\n", __func__);
+               return;
+       }
+
+       omap2_hsmmc_init(board_mmc_info);
+       /* link regulators to MMC adapters */
+       omap3logic_vmmc1_supply.dev = board_mmc_info[0].dev;
+}
+
+static struct omap_smsc911x_platform_data __initdata board_smsc911x_data = {
+       .cs             = OMAP3LOGIC_SMSC911X_CS,
+       .gpio_irq       = -EINVAL,
+       .gpio_reset     = -EINVAL,
+       .flags          = IORESOURCE_IRQ_LOWLEVEL,
+};
+
+/* TODO/FIXME (comment by Peter Barada, LogicPD):
+ * Fix the PBIAS voltage for Torpedo MMC1 pins that
+ * are used for other needs (IRQs, etc).            */
+static void omap3torpedo_fix_pbias_voltage(void)
+{
+       u16 control_pbias_offset = OMAP343X_CONTROL_PBIAS_LITE;
+       u32 reg;
+
+       if (machine_is_omap3_torpedo())
+       {
+               /* Set the bias for the pin */
+               reg = omap_ctrl_readl(control_pbias_offset);
+
+               reg &= ~OMAP343X_PBIASLITEPWRDNZ1;
+               omap_ctrl_writel(reg, control_pbias_offset);
+
+               /* 100ms delay required for PBIAS configuration */
+               msleep(100);
+
+               reg |= OMAP343X_PBIASLITEVMODE1;
+               reg |= OMAP343X_PBIASLITEPWRDNZ1;
+               omap_ctrl_writel(reg | 0x300, control_pbias_offset);
+       }
+}
+
+static inline void __init board_smsc911x_init(void)
+{
+       if (machine_is_omap3530_lv_som()) {
+               /* OMAP3530 LV SOM board */
+               board_smsc911x_data.gpio_irq =
+                                       OMAP3530_LV_SOM_SMSC911X_GPIO_IRQ;
+               omap_mux_init_signal("gpio_152", OMAP_PIN_INPUT);
+       } else if (machine_is_omap3_torpedo()) {
+               /* OMAP3 Torpedo board */
+               board_smsc911x_data.gpio_irq = OMAP3_TORPEDO_SMSC911X_GPIO_IRQ;
+               omap_mux_init_signal("gpio_129", OMAP_PIN_INPUT);
+       } else {
+               /* unsupported board */
+               printk(KERN_ERR "%s(): unknown machine type\n", __func__);
+               return;
+       }
+
+       gpmc_smsc911x_init(&board_smsc911x_data);
+}
+
 static void __init omap3logic_init_irq(void)
 {
        omap2_init_common_hw(NULL, NULL);
@@ -112,10 +202,22 @@ static void __init omap3logic_init_irq(void)
        omap_gpio_init();
 }
 
+#ifdef CONFIG_OMAP_MUX
+static struct omap_board_mux board_mux[] __initdata = {
+       { .reg_offset = OMAP_MUX_TERMINATOR },
+};
+#else
+#define board_mux       NULL
+#endif
+
 static void __init omap3logic_init(void)
 {
+       omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
+       omap3torpedo_fix_pbias_voltage();
        omap3logic_i2c_init();
        omap_serial_init();
+       board_mmc_init();
+       board_smsc911x_init();
 
        /* Ensure SDRC pins are mux'd for self-refresh */
        omap_mux_init_signal("sdrc_cke0", OMAP_PIN_OUTPUT);
@@ -123,8 +225,6 @@ static void __init omap3logic_init(void)
 }
 
 MACHINE_START(OMAP3_TORPEDO, "Logic OMAP3 Torpedo board")
-       .phys_io        = 0x48000000,
-       .io_pg_offst    = ((0xd8000000) >> 18) & 0xfffc,
        .boot_params    = 0x80000100,
        .map_io         = omap3_map_io,
        .init_irq       = omap3logic_init_irq,
@@ -133,8 +233,6 @@ MACHINE_START(OMAP3_TORPEDO, "Logic OMAP3 Torpedo board")
 MACHINE_END
 
 MACHINE_START(OMAP3530_LV_SOM, "OMAP Logic 3530 LV SOM board")
-       .phys_io        = 0x48000000,
-       .io_pg_offst    = ((0xd8000000) >> 18) & 0xfffc,
        .boot_params    = 0x80000100,
        .map_io         = omap3_map_io,
        .init_irq       = omap3logic_init_irq,