pandora: defconfig: update
[pandora-kernel.git] / arch / arm / mach-omap2 / hsmmc.c
index f4a1020..a7035a5 100644 (file)
@@ -19,6 +19,7 @@
 #include <plat/omap-pm.h>
 #include <plat/mux.h>
 #include <plat/omap_device.h>
+#include <asm/mach-types.h>
 
 #include "mux.h"
 #include "hsmmc.h"
@@ -171,7 +172,7 @@ static void omap4_hsmmc1_after_set_reg(struct device *dev, int slot,
        }
 }
 
-static void hsmmc23_before_set_reg(struct device *dev, int slot,
+static void hsmmc2_before_set_reg(struct device *dev, int slot,
                                   int power_on, int vdd)
 {
        struct omap_mmc_platform_data *mmc = dev->platform_data;
@@ -180,14 +181,14 @@ static void hsmmc23_before_set_reg(struct device *dev, int slot,
                mmc->slots[0].remux(dev, slot, power_on);
 
        if (power_on) {
-               /* Only MMC2 supports a CLKIN */
-               if (mmc->slots[0].internal_clock) {
-                       u32 reg;
+               u32 reg;
 
-                       reg = omap_ctrl_readl(control_devconf1_offset);
+               reg = omap_ctrl_readl(control_devconf1_offset);
+               if (mmc->slots[0].internal_clock)
                        reg |= OMAP2_MMCSDIO2ADPCLKISEL;
-                       omap_ctrl_writel(reg, control_devconf1_offset);
-               }
+               else
+                       reg &= ~OMAP2_MMCSDIO2ADPCLKISEL;
+               omap_ctrl_writel(reg, control_devconf1_offset);
        }
 }
 
@@ -200,10 +201,12 @@ static int nop_mmc_set_power(struct device *dev, int slot, int power_on,
 static inline void omap_hsmmc_mux(struct omap_mmc_platform_data *mmc_controller,
                        int controller_nr)
 {
-       if (gpio_is_valid(mmc_controller->slots[0].switch_pin))
+       if (gpio_is_valid(mmc_controller->slots[0].switch_pin) &&
+               (mmc_controller->slots[0].switch_pin < OMAP_MAX_GPIO_LINES))
                omap_mux_init_gpio(mmc_controller->slots[0].switch_pin,
                                        OMAP_PIN_INPUT_PULLUP);
-       if (gpio_is_valid(mmc_controller->slots[0].gpio_wp))
+       if (gpio_is_valid(mmc_controller->slots[0].gpio_wp) &&
+               (mmc_controller->slots[0].gpio_wp < OMAP_MAX_GPIO_LINES))
                omap_mux_init_gpio(mmc_controller->slots[0].gpio_wp,
                                        OMAP_PIN_INPUT_PULLUP);
        if (cpu_is_omap34xx()) {
@@ -378,14 +381,13 @@ static int __init omap_hsmmc_pdata_init(struct omap2_hsmmc_info *c,
                        c->caps &= ~MMC_CAP_8_BIT_DATA;
                        c->caps |= MMC_CAP_4_BIT_DATA;
                }
-               /* FALLTHROUGH */
-       case 3:
                if (mmc->slots[0].features & HSMMC_HAS_PBIAS) {
                        /* off-chip level shifting, or none */
-                       mmc->slots[0].before_set_reg = hsmmc23_before_set_reg;
+                       mmc->slots[0].before_set_reg = hsmmc2_before_set_reg;
                        mmc->slots[0].after_set_reg = NULL;
                }
                break;
+       case 3:
        case 4:
        case 5:
                mmc->slots[0].before_set_reg = NULL;
@@ -439,6 +441,13 @@ void __init omap_init_hsmmc(struct omap2_hsmmc_info *hsmmcinfo, int ctrl_nr)
        if (oh->dev_attr != NULL) {
                mmc_dev_attr = oh->dev_attr;
                mmc_data->controller_flags = mmc_dev_attr->flags;
+               /*
+                * erratum 2.1.1.128 doesn't apply if board has
+                * a transceiver is attached
+                */
+               if (hsmmcinfo->transceiver)
+                       mmc_data->controller_flags &=
+                               ~OMAP_HSMMC_BROKEN_MULTIBLOCK_READ;
        }
 
        pdev = omap_device_build(name, ctrl_nr - 1, oh, mmc_data,
@@ -470,6 +479,13 @@ void __init omap2_hsmmc_init(struct omap2_hsmmc_info *controllers)
                        control_pbias_offset = OMAP343X_CONTROL_PBIAS_LITE;
                        control_devconf1_offset = OMAP343X_CONTROL_DEVCONF1;
                }
+
+               if (machine_is_omap3_pandora()) {
+                       /* needed for gpio_126 - gpio_129 to work correctly */
+                       reg = omap_ctrl_readl(control_pbias_offset);
+                       reg &= ~OMAP343X_PBIASLITEVMODE1;
+                       omap_ctrl_writel(reg, control_pbias_offset);
+               }
        } else {
                control_pbias_offset =
                        OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_PBIASLITE;