Support multiple sd/eMMC interfaces. enable mmc1, 2, and 3.
mmc2 is used eMMC and slot is marked PERMANENT and 8 bit device.
mmc1 is used for Wifi and slot is marked PERMANENT

Note: eMMC (mmc2) is set to initialize first to workaround a problem
where booting in logical order requires mmc create work queue
to be multi-threaded otherwise boot process hangs.  BUG report
send to linux-mmc and linux-kernel mailing list.

Wifi (mmc1) requires we enable power on the device by toggling
the gpio lines for power and reset.

Signed-off-by: Philip Rakity <prak...@marvell.com>
---
 arch/arm/mach-mmp/brownstone.c |   52 +++++++++++++++++++++++++++++++++++++++-
 1 files changed, 51 insertions(+), 1 deletions(-)

diff --git a/arch/arm/mach-mmp/brownstone.c b/arch/arm/mach-mmp/brownstone.c
index 7bb78fd..577e8de 100644
--- a/arch/arm/mach-mmp/brownstone.c
+++ b/arch/arm/mach-mmp/brownstone.c
@@ -19,6 +19,7 @@
 #include <linux/regulator/max8649.h>
 #include <linux/regulator/fixed.h>
 #include <linux/mfd/max8925.h>
+#include <linux/delay.h>
 
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
@@ -177,9 +178,56 @@ static struct i2c_board_info brownstone_twsi1_info[] = {
 };
 
 static struct sdhci_pxa_platdata mmp2_sdh_platdata_mmc0 = {
-       .max_speed      = 25000000,
+       .adjust_clocks  = 1,
+       .clk_select     = 1,
+       .clk_delay      = 31,
 };
 
+static struct sdhci_pxa_platdata mmp2_sdh_platdata_mmc1 = {
+       .adjust_clocks  = 1,
+       .clk_select     = 1,
+       .clk_delay      = 15,
+       .flags          = PXA_FLAG_CARD_PERMANENT,
+};
+
+static struct sdhci_pxa_platdata mmp2_sdh_platdata_mmc2 = {
+       .adjust_clocks  = 1,
+       .clk_select     = 1,
+       .clk_delay      = 31,
+       .flags          = PXA_FLAG_CARD_PERMANENT |
+                               PXA_FLAG_SD_8_BIT_CAPABLE_SLOT,
+};
+
+static void __init mmc_sdio_wifi(void)
+{
+       int poweron;
+       int reset;
+
+       poweron = mfp_to_gpio(GPIO57_GPIO);
+       reset = mfp_to_gpio(GPIO58_GPIO);
+
+       if (gpio_request(reset, "sd8xxx reset")) {
+               printk(KERN_INFO "gpio %d request failed\n", reset);
+               return;
+       }
+
+       if (gpio_request(poweron, "sd8xxx PDn")) {
+               gpio_free(reset);
+               printk(KERN_INFO "gpio %d request failed\n", poweron);
+               return;
+       }
+
+       gpio_direction_output(poweron, 1);
+       msleep(1);
+       gpio_direction_output(reset, 0);
+       msleep(1);
+       gpio_direction_output(reset, 1);
+       gpio_free(reset);
+       gpio_free(poweron);
+
+       mmp2_add_sdhost(1, &mmp2_sdh_platdata_mmc1); /* Wifi */
+}
+
 static void __init brownstone_init(void)
 {
        mfp_config(ARRAY_AND_SIZE(brownstone_pin_config));
@@ -188,7 +236,9 @@ static void __init brownstone_init(void)
        mmp2_add_uart(1);
        mmp2_add_uart(3);
        mmp2_add_twsi(1, NULL, ARRAY_AND_SIZE(brownstone_twsi1_info));
+       mmp2_add_sdhost(2, &mmp2_sdh_platdata_mmc2); /* eMMC */
        mmp2_add_sdhost(0, &mmp2_sdh_platdata_mmc0); /* SD/MMC */
+       mmc_sdio_wifi();
 
        /* enable 5v regulator */
        platform_device_register(&brownstone_v_5vp_device);
-- 
1.7.0.4


--
To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to