[PATCH 12/12] arm: mach-mmp: brownstone.c support multiple sd slot=
From: Philip Rakity <hidden>
Date: 2011-02-07 19:49:53
Subsystem:
arm port, mmp support, the rest · Maintainers:
Russell King, Linus Torvalds
s 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 <redacted> --- arch/arm/mach-mmp/brownstone.c | 42 ++++++++++++++++++++++++++++++++++++= ++++ 1 files changed, 42 insertions(+), 0 deletions(-)
diff --git a/arch/arm/mach-mmp/brownstone.c b/arch/arm/mach-mmp/brownstone.=c index 7bb78fd..36d5b82 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>
=20 #include <asm/mach-types.h> #include <asm/mach/arch.h>
@@ -180,6 +181,45 @@ static struct sdhci_pxa_platdata mmp2_sdh_platdata_mmc=0 =3D {
.max_speed =3D 25000000,
};
=20
+static struct sdhci_pxa_platdata mmp2_sdh_platdata_mmc1 =3D {
+ .flags =3D PXA_FLAG_CARD_PERMANENT,
+};
+
+static struct sdhci_pxa_platdata mmp2_sdh_platdata_mmc2 =3D {
+ .flags =3D PXA_FLAG_CARD_PERMANENT |
+ PXA_FLAG_SD_8_BIT_CAPABLE_SLOT,
+};
+
+static void __init mmc_sdio_wifi(void)
+{
+ int poweron;
+ int reset;
+
+ poweron =3D mfp_to_gpio(GPIO57_GPIO);
+ reset =3D 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 +228,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();
=20 /* enable 5v regulator */ platform_device_register(&brownstone_v_5vp_device); --=20 1.7.0.4