On Jul 27, 2011, at 10:55 AM, Philip Rakity wrote:
> Support 8787 device, provide regulator vmmc
>
> With CONFIG_PM_RUNTIME=y
> 8787 power is enabled if any client module over sdio is insmod, and disbled
> automatically after all client modules over sdio are rmmod
> Also 8787 power could be controled by mmc_start/stop_host via debugfs
>
> Signed-off-by: Zhangfei Gao <[email protected]>
> ---
> arch/arm/mach-mmp/brownstone.c | 60 ++++++++++++++++++++++++++++++++++++++-
> 1 files changed, 58 insertions(+), 2 deletions(-)
>
> diff --git a/arch/arm/mach-mmp/brownstone.c b/arch/arm/mach-mmp/brownstone.c
> index c79162a..46a67b9 100644
> --- a/arch/arm/mach-mmp/brownstone.c
> +++ b/arch/arm/mach-mmp/brownstone.c
> @@ -89,6 +89,9 @@ static unsigned long brownstone_pin_config[] __initdata = {
> GPIO41_MMC2_CMD | MFP_PULL_HIGH,
> GPIO42_MMC2_CLK,
>
> + GPIO57_GPIO | MFP_LPM_DRIVE_HIGH | MFP_PULL_HIGH,
> + GPIO58_GPIO | MFP_LPM_DRIVE_HIGH | MFP_PULL_HIGH,
> +
> /* MMC2 */
> GPIO165_MMC3_DAT7 | MFP_PULL_HIGH,
> GPIO162_MMC3_DAT6 | MFP_PULL_HIGH,
> @@ -180,12 +183,66 @@ static struct sdhci_pxa_platdata mmp2_sdh_platdata_mmc0
> = {
> .clk_delay_cycles = 0x1f,
> };
>
> +static struct sdhci_pxa_platdata mmp2_sdh_platdata_mmc1 = {
> + .flags = PXA_FLAG_CARD_PERMANENT,
> +};
> +
> static struct sdhci_pxa_platdata mmp2_sdh_platdata_mmc2 = {
> .clk_delay_cycles = 0x1f,
> .flags = PXA_FLAG_CARD_PERMANENT
> | PXA_FLAG_SD_8_BIT_CAPABLE_SLOT,
> };
>
> +static struct regulator_consumer_supply sdio_power_supplies[] = {
> + REGULATOR_SUPPLY("vmmc", "sdhci-pxav3.1"),
> +};
> +
> +static struct regulator_init_data sdio_power_data = {
> + .constraints = {
> + .valid_ops_mask = REGULATOR_CHANGE_STATUS,
> + },
> + .num_consumer_supplies = ARRAY_SIZE(sdio_power_supplies),
> + .consumer_supplies = sdio_power_supplies,
> +};
> +
> +static struct fixed_voltage_config sdio_power = {
> + .supply_name = "vmmc",
> + .microvolts = 3000000,
> + .gpio = mfp_to_gpio(MFP_PIN_GPIO57),
> + .enable_high = 1,
> + .enabled_at_boot = 0,
> + .init_data = &sdio_power_data,
> +};
> +
ldo7 is the power source. The 8787 is the consumer and the code should
reflect this.
GPIO57 is an on/off switch to the 8787.
> +static struct platform_device sdio_power_device = {
> + .name = "reg-fixed-voltage",
> + .id = 2,
> + .dev = {
> + .platform_data = &sdio_power,
> + },
> +};
> +
> +static void __init brownstone_init_mmc(void)
> +{
> + /*
> + * PDn: GPIO57; RESETn: GPIO58
> + * 8787, RESETn keeps high, PDn control power
> + * on: PDn 1; off: PDn 0;
> + */
> + int RESETn = mfp_to_gpio(MFP_PIN_GPIO58);
> +
> + if (gpio_request(RESETn, "sdio RESETn")) {
> + pr_err("Failed to request sdio RESETn gpio\n");
> + return;
> + }
> + gpio_direction_output(RESETn, 1);
> + gpio_free(RESETn);
> +
> + platform_device_register(&sdio_power_device);
> + mmp2_add_sdhost(0, &mmp2_sdh_platdata_mmc0); /* SD/MMC */
> + mmp2_add_sdhost(1, &mmp2_sdh_platdata_mmc1); /* sdio */
> + mmp2_add_sdhost(2, &mmp2_sdh_platdata_mmc2); /* eMMC */
> +}
>
> static void __init brownstone_init(void)
> {
> @@ -195,8 +252,7 @@ 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 */
> + brownstone_init_mmc();
>
> /* 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 [email protected]
> More majordomo info at http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html