Merge branch 'stable-3.2' into pandora-3.2
[pandora-kernel.git] / arch / arm / mach-omap2 / hsmmc.c
index 616523a..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"
@@ -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()) {
@@ -438,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,
@@ -469,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;