|
@@ -16,7 +16,9 @@
|
|
|
#include <mach/hardware.h>
|
|
|
#include <plat/mmc.h>
|
|
|
#include <plat/omap-pm.h>
|
|
|
+#include <plat/mux.h>
|
|
|
|
|
|
+#include "mux.h"
|
|
|
#include "hsmmc.h"
|
|
|
#include "control.h"
|
|
|
|
|
@@ -204,6 +206,87 @@ static int nop_mmc_set_power(struct device *dev, int slot, int power_on,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static inline void omap_hsmmc_mux(struct omap_mmc_platform_data *mmc_controller,
|
|
|
+ int controller_nr)
|
|
|
+{
|
|
|
+ if ((mmc_controller->slots[0].switch_pin > 0) && \
|
|
|
+ (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 ((mmc_controller->slots[0].gpio_wp > 0) && \
|
|
|
+ (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()) {
|
|
|
+ if (controller_nr == 0) {
|
|
|
+ omap_mux_init_signal("sdmmc1_clk",
|
|
|
+ OMAP_PIN_INPUT_PULLUP);
|
|
|
+ omap_mux_init_signal("sdmmc1_cmd",
|
|
|
+ OMAP_PIN_INPUT_PULLUP);
|
|
|
+ omap_mux_init_signal("sdmmc1_dat0",
|
|
|
+ OMAP_PIN_INPUT_PULLUP);
|
|
|
+ if (mmc_controller->slots[0].caps &
|
|
|
+ (MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA)) {
|
|
|
+ omap_mux_init_signal("sdmmc1_dat1",
|
|
|
+ OMAP_PIN_INPUT_PULLUP);
|
|
|
+ omap_mux_init_signal("sdmmc1_dat2",
|
|
|
+ OMAP_PIN_INPUT_PULLUP);
|
|
|
+ omap_mux_init_signal("sdmmc1_dat3",
|
|
|
+ OMAP_PIN_INPUT_PULLUP);
|
|
|
+ }
|
|
|
+ if (mmc_controller->slots[0].caps &
|
|
|
+ MMC_CAP_8_BIT_DATA) {
|
|
|
+ omap_mux_init_signal("sdmmc1_dat4",
|
|
|
+ OMAP_PIN_INPUT_PULLUP);
|
|
|
+ omap_mux_init_signal("sdmmc1_dat5",
|
|
|
+ OMAP_PIN_INPUT_PULLUP);
|
|
|
+ omap_mux_init_signal("sdmmc1_dat6",
|
|
|
+ OMAP_PIN_INPUT_PULLUP);
|
|
|
+ omap_mux_init_signal("sdmmc1_dat7",
|
|
|
+ OMAP_PIN_INPUT_PULLUP);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (controller_nr == 1) {
|
|
|
+ /* MMC2 */
|
|
|
+ omap_mux_init_signal("sdmmc2_clk",
|
|
|
+ OMAP_PIN_INPUT_PULLUP);
|
|
|
+ omap_mux_init_signal("sdmmc2_cmd",
|
|
|
+ OMAP_PIN_INPUT_PULLUP);
|
|
|
+ omap_mux_init_signal("sdmmc2_dat0",
|
|
|
+ OMAP_PIN_INPUT_PULLUP);
|
|
|
+
|
|
|
+ /*
|
|
|
+ * For 8 wire configurations, Lines DAT4, 5, 6 and 7
|
|
|
+ * need to be muxed in the board-*.c files
|
|
|
+ */
|
|
|
+ if (mmc_controller->slots[0].caps &
|
|
|
+ (MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA)) {
|
|
|
+ omap_mux_init_signal("sdmmc2_dat1",
|
|
|
+ OMAP_PIN_INPUT_PULLUP);
|
|
|
+ omap_mux_init_signal("sdmmc2_dat2",
|
|
|
+ OMAP_PIN_INPUT_PULLUP);
|
|
|
+ omap_mux_init_signal("sdmmc2_dat3",
|
|
|
+ OMAP_PIN_INPUT_PULLUP);
|
|
|
+ }
|
|
|
+ if (mmc_controller->slots[0].caps &
|
|
|
+ MMC_CAP_8_BIT_DATA) {
|
|
|
+ omap_mux_init_signal("sdmmc2_dat4.sdmmc2_dat4",
|
|
|
+ OMAP_PIN_INPUT_PULLUP);
|
|
|
+ omap_mux_init_signal("sdmmc2_dat5.sdmmc2_dat5",
|
|
|
+ OMAP_PIN_INPUT_PULLUP);
|
|
|
+ omap_mux_init_signal("sdmmc2_dat6.sdmmc2_dat6",
|
|
|
+ OMAP_PIN_INPUT_PULLUP);
|
|
|
+ omap_mux_init_signal("sdmmc2_dat7.sdmmc2_dat7",
|
|
|
+ OMAP_PIN_INPUT_PULLUP);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /*
|
|
|
+ * For MMC3 the pins need to be muxed in the board-*.c files
|
|
|
+ */
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
static struct omap_mmc_platform_data *hsmmc_data[OMAP34XX_NR_MMC] __initdata;
|
|
|
|
|
|
void __init omap2_hsmmc_init(struct omap2_hsmmc_info *controllers)
|
|
@@ -361,6 +444,7 @@ void __init omap2_hsmmc_init(struct omap2_hsmmc_info *controllers)
|
|
|
continue;
|
|
|
}
|
|
|
hsmmc_data[c->mmc - 1] = mmc;
|
|
|
+ omap_hsmmc_mux(hsmmc_data[c->mmc - 1], (c->mmc - 1));
|
|
|
}
|
|
|
|
|
|
omap2_init_mmc(hsmmc_data, OMAP34XX_NR_MMC);
|