[PATCH v3] arm: mach-mmp: brownstone.c support multiple sd slots

Philip Rakity prakity at marvell.com
Wed Jul 6 11:21:19 EDT 2011


On Jul 6, 2011, at 12:19 AM, zhangfei gao wrote:

> On Wed, Jul 6, 2011 at 4:20 AM, Philip Rakity <prakity at marvell.com> wrote:
>> 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 <prakity at marvell.com>
>> ---
>>  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.
> 

Good Point -- Will do.  

What is the correct method to handle this ? 

>>  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




More information about the linux-arm-kernel mailing list