[PATCH v3] arm: mach-mmp: brownstone.c support multiple sd slots
From: zhangfei gao <hidden>
Date: 2011-07-06 07:19:34
Also in:
linux-mmc
On Wed, Jul 6, 2011 at 4:20 AM, Philip Rakity [off-list ref] wrote:
quoted hunk ↗ jump to hunk
Subject: [PATCH V3] arm: mach-mmp: brownstone.c support multiple sd slots V3 == Change since V2 -- delete mmc3 since it was committed to linux next. enable mmc1 used for wifi (8688) and marked PERMANENT. Wifi requires enabling of power on the device by toggling the gpio lines for power and reset. ?Enable eMMC first to work around problem in booting order due to workqueue bug. Signed-off-by: Philip Rakity <redacted> --- ?arch/arm/mach-mmp/brownstone.c | ? 41 +++++++++++++++++++++++++++++++++++++++- ?1 files changed, 40 insertions(+), 1 deletions(-)diff --git a/arch/arm/mach-mmp/brownstone.c b/arch/arm/mach-mmp/brownstone.c index c79162a..940982c 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>@@ -180,6 +181,11 @@ static struct sdhci_pxa_platdata mmp2_sdh_platdata_mmc0 = {? ? ? ?.clk_delay_cycles = 0x1f, ?}; +static struct sdhci_pxa_platdata mmp2_sdh_platdata_mmc1 = { + ? ? ? .clk_delay_cycles = 0x1f, + ? ? ? .flags ? ? ? ? ?= PXA_FLAG_CARD_PERMANENT, +}; + ?static struct sdhci_pxa_platdata mmp2_sdh_platdata_mmc2 = { ? ? ? ?.clk_delay_cycles = 0x1f, ? ? ? ?.flags = PXA_FLAG_CARD_PERMANENT@@ -187,6 +193,38 @@ static struct sdhci_pxa_platdata mmp2_sdh_platdata_mmc2 = {?}; +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, 0); + ? ? ? msleep(1); + ? ? ? 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 */ +} +
The method keeps power on wifi chip, without dynamically enable/disable wifi power, which is not final solution. How about pushing later with dynamically control power, which is in debugging here.
quoted hunk ↗ jump to hunk
?static void __init brownstone_init(void) ?{ ? ? ? ?mfp_config(ARRAY_AND_SIZE(brownstone_pin_config));@@ -195,8 +233,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(0, &mmp2_sdh_platdata_mmc0); /* SD/MMC */ ? ? ? ?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