arm: mach-mmp: brownstone.c support multiple sd slots
Subsystems (4)
PATCH 5/5 arm: mach-mmp: brownstone.c support multiple sd slots
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.
--- arch/arm/mach-mmp/brownstone.c | 42 ++++++++++++++++++++++++++++++++++++++++ 1 files changed, 42 insertions(+), 0 deletions(-)
arch/arm/mach-mmp/brownstone.c +42 -0
@@ -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>
@@ -180,6 +181,45 @@ static struct sdhci_pxa_platdata mmp2_sdh_platdata_mmc0 = { .max_speed = 25000000, }; +static struct sdhci_pxa_platdata mmp2_sdh_platdata_mmc1 = { + .flags =PXA_FLAG_CARD_PERMANENT , +}; + +static struct sdhci_pxa_platdata mmp2_sdh_platdata_mmc2 = { + .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 ); +mdelay (20 ); +gpio_direction_output (reset,0 ); +mdelay (20 ); +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 ();/* enable 5v regulator */ platform_device_register (&brownstone_v_5vp_device);
Signature · 1 line
1.7.0.4
PATCH 5/5 arm: mach-mmp: brownstone.c support multiple sd slots
arch/arm/mach-mmp/brownstone.c static struct sdhci_pxa_platdata mmp2_sdh_platdata_mmc0 = { · line 218
Quoted 8 lines · Philip Rakity
arch/arm/mach-mmp/brownstone.c +8
-0+ +gpio_direction_output (poweron,1 ); +mdelay (20 ); +gpio_direction_output (reset,0 ); +mdelay (20 ); +gpio_direction_output (reset,1 ); +gpio_free (reset); +gpio_free (poweron);
mdelay is not nice, especially in boot code, because a lot of people are interested in reducing boot times, and 40 miliseconds is definitely in the range that people notice.
At the very least, change it from mdelay() to msleep(), to allow other processes to continue.
Ideally, you can run the function in the background using schedule_work(), but there may be better ways to do that for the entire platform code.
Arnd