RE: mmc: sdio add regulator vsdio

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Zhangfei,

See below.

Philip

>
>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@xxxxxxxxxx>
>Signed-off-by: Zhangfei Gao <zhangfei.gao@xxxxxxxxxxx>
>
>---
>drivers/mmc/host/sdhci.c  |   24 ++++++++++++++++++++++++
> include/linux/mmc/sdhci.h |    2 ++
> 2 files changed, 26 insertions(+), 0 deletions(-)
>
>diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
>index 790f959..61fff10 100644
>--- a/drivers/mmc/host/sdhci.c
>+++ b/drivers/mmc/host/sdhci.c
>@@ -1295,6 +1295,18 @@ static void sdhci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
> 
> 	sdhci_set_clock(host, ios->clock);
> 
>+	if (host->vsdio) {

Why does this code need to be specific to sdio ?  Should be generalized.

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

move up inside if since if not change no need to set.

if the regulator is shared between different devices will this work ?

>+	}
>+
> 	if (ios->power_mode == MMC_POWER_OFF)
> 		sdhci_set_power(host, -1);
> 	else
>@@ -2751,6 +2763,13 @@ int sdhci_add_host(struct sdhci_host *host)
> 		regulator_enable(host->vmmc);
> 	}
> 
>+	host->vsdio = regulator_get(mmc_dev(mmc), "vsdio");

comment on name -- should have nothing to do with sdio.

>+	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
>@@ -2842,6 +2861,11 @@ void sdhci_remove_host(struct sdhci_host *host, int dead)
> 		regulator_put(host->vmmc);
> 	}
> 
>+	if (host->vsdio) {
>+		regulator_disable(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 13c13f8..bea07c7 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 */
>--
To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux USB Devel]     [Linux Media]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux