[PATCH v3 1/2] mmc: sdio add regulator vsdio

Eric Miao eric.y.miao at gmail.com
Wed Aug 31 10:06:15 EDT 2011


Zhangfei,

My understanding is that the card in the slot would be either MMC _or_
SDIO and why do we need another regulator for the power on/off?

On Thu, Aug 25, 2011 at 2:26 PM, Zhangfei Gao <zhangfei.gao at marvell.com> wrote:
> sdio client may be required power on/off dynamically.
> With regulator vsdio, sdio client power on/off could be executed by mmc_power_up/down
>
> CC: Ohad Ben-Cohen <ohad at wizery.com>
> Signed-off-by: Zhangfei Gao <zhangfei.gao at marvell.com>
> ---
>  drivers/mmc/host/sdhci.c  |   22 , >  include/linux/mmc/sdhci.h |    2 ++
>  2 files changed, 24 insertions(+), 0 deletions(-)
>
> diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
> index 0e02cc1..e0ef7d3 100644
> --- a/drivers/mmc/host/sdhci.c
> +++ b/drivers/mmc/host/sdhci.c
> @@ -1424,6 +1424,18 @@ static void sdhci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
>  out:
>        mmiowb();
>        spin_unlock_irqrestore(&host->lock, flags);
> +
> +       if (host->vsdio) {
> +               if (ios->power_mode != host->power_mode_old) {
> +                       if (ios->power_mode == MMC_POWER_OFF)
> +                               regulator_disable(host->vsdio);
> +
> +                       if (ios->power_mode == MMC_POWER_UP)
> +                               regulator_enable(host->vsdio);
> +               }
> +
> +               host->power_mode_old = ios->power_mode;
> +       }
>  }
>
>  static int check_ro(struct sdhci_host *host)
> @@ -2748,6 +2760,13 @@ int sdhci_add_host(struct sdhci_host *host)
>                regulator_enable(host->vmmc);
>        }
>
> +       host->vsdio = regulator_get(mmc_dev(mmc), "vsdio");
> +       if (IS_ERR(host->vsdio))
> +               host->vsdio = NULL;
> +       else
> +               printk(KERN_INFO "%s: vsdio regulator found\n",
> +                       mmc_hostname(mmc));
> +
>        sdhci_init(host, 0);
>
>  #ifdef CONFIG_MMC_DEBUG
> @@ -2839,6 +2858,9 @@ void sdhci_remove_host(struct sdhci_host *host, int dead)
>                regulator_put(host->vmmc);
>        }
>
> +       if (host->vsdio)
> +               regulator_put(host->vsdio);
> +
>        kfree(host->adma_desc);
>        kfree(host->align_buffer);
>
> diff --git a/include/linux/mmc/sdhci.h b/include/linux/mmc/sdhci.h
> index 5666f3a..201207a 100644
> --- a/include/linux/mmc/sdhci.h
> +++ b/include/linux/mmc/sdhci.h
> @@ -94,6 +94,8 @@ struct sdhci_host {
>        const struct sdhci_ops *ops;    /* Low level hw interface */
>
>        struct regulator *vmmc; /* Power regulator */
> +       struct regulator *vsdio;        /* sdio Power regulator */
> +       unsigned char power_mode_old;   /* power supply mode */
>
>        /* Internal data */
>        struct mmc_host *mmc;   /* MMC structure */
> --
> 1.7.0.4
>
>



More information about the linux-arm-kernel mailing list