All of lore.kernel.org
 help / color / mirror / Atom feed
From: Tony Lindgren <tony@atomide.com>
To: linux-arm-kernel@lists.infradead.org
Cc: linux-omap@vger.kernel.org, Adrian Hunter <adrian.hunter@nokia.com>
Subject: [PATCH 09/19] omap_hsmmc: Allow for a shared VccQ
Date: Thu, 11 Feb 2010 16:51:29 -0800	[thread overview]
Message-ID: <20100212005129.24958.38870.stgit@baageli.muru.com> (raw)
In-Reply-To: <20100212004844.24958.29506.stgit@baageli.muru.com>

From: Adrian Hunter <adrian.hunter@nokia.com>

EMMC can have two voltage supplies, Vcc and VccQ
which are implemented in the code as consumer
supplies vmmc and vmmc_aux.

If the regulator that supplies vmmc_aux is shared
with other consumers, then sending it to sleep
will disrupt those consumers.  However, the
TWL4030-family regulators may have OFF remapped
to SLEEP, in which case 'regulator_disable()'
will put the regulator to sleep only when all
consumers are disabled - which is the desired
behaviour.

This patch adds a platform data field to allow
that option.

Signed-off-by: Adrian Hunter <adrian.hunter@nokia.com>
Signed-off-by: Tony Lindgren <tony@atomide.com>
---
 arch/arm/mach-omap2/hsmmc.c           |    3 +++
 arch/arm/mach-omap2/hsmmc.h           |    1 +
 arch/arm/plat-omap/include/plat/mmc.h |    3 +++
 drivers/mmc/host/omap_hsmmc.c         |   16 +++++++++++++++-
 4 files changed, 22 insertions(+), 1 deletions(-)

diff --git a/arch/arm/mach-omap2/hsmmc.c b/arch/arm/mach-omap2/hsmmc.c
index e4ab123..9ad2295 100644
--- a/arch/arm/mach-omap2/hsmmc.c
+++ b/arch/arm/mach-omap2/hsmmc.c
@@ -205,6 +205,9 @@ void __init omap2_hsmmc_init(struct omap2_hsmmc_info *controllers)
 		if (c->no_off)
 			mmc->slots[0].no_off = 1;
 
+		if (c->vcc_aux_disable_is_sleep)
+			mmc->slots[0].vcc_aux_disable_is_sleep = 1;
+
 		/* NOTE:  MMC slots should have a Vcc regulator set up.
 		 * This may be from a TWL4030-family chip, another
 		 * controllable regulator, or a fixed supply.
diff --git a/arch/arm/mach-omap2/hsmmc.h b/arch/arm/mach-omap2/hsmmc.h
index 2453a7a..36f0ba8 100644
--- a/arch/arm/mach-omap2/hsmmc.h
+++ b/arch/arm/mach-omap2/hsmmc.h
@@ -15,6 +15,7 @@ struct omap2_hsmmc_info {
 	bool	nonremovable;	/* Nonremovable e.g. eMMC */
 	bool	power_saving;	/* Try to sleep or power off when possible */
 	bool	no_off;		/* power_saving and power is not to go off */
+	bool	vcc_aux_disable_is_sleep; /* Regulator off remapped to sleep */
 	int	gpio_cd;	/* or -EINVAL */
 	int	gpio_wp;	/* or -EINVAL */
 	char	*name;		/* or NULL for default */
diff --git a/arch/arm/plat-omap/include/plat/mmc.h b/arch/arm/plat-omap/include/plat/mmc.h
index b463949..a1bac07 100644
--- a/arch/arm/plat-omap/include/plat/mmc.h
+++ b/arch/arm/plat-omap/include/plat/mmc.h
@@ -99,6 +99,9 @@ struct omap_mmc_platform_data {
 		/* If using power_saving and the MMC power is not to go off */
 		unsigned no_off:1;
 
+		/* Regulator off remapped to sleep */
+		unsigned vcc_aux_disable_is_sleep:1;
+
 		int switch_pin;			/* gpio (card detect) */
 		int gpio_wp;			/* gpio (write protect) */
 
diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
index d2fad58..af37477 100644
--- a/drivers/mmc/host/omap_hsmmc.c
+++ b/drivers/mmc/host/omap_hsmmc.c
@@ -347,7 +347,14 @@ static int omap_hsmmc_23_set_sleep(struct device *dev, int slot, int sleep,
 		err = regulator_set_mode(host->vcc, mode);
 	if (err)
 		return err;
-	return regulator_set_mode(host->vcc_aux, mode);
+
+	if (!mmc_slot(host).vcc_aux_disable_is_sleep)
+		return regulator_set_mode(host->vcc_aux, mode);
+
+	if (sleep)
+		return regulator_disable(host->vcc_aux);
+	else
+		return regulator_enable(host->vcc_aux);
 }
 
 static int omap_hsmmc_gpio_init(struct omap_mmc_platform_data *pdata)
@@ -1982,6 +1989,13 @@ static int __init omap_hsmmc_probe(struct platform_device *pdev)
 	else
 		mmc->ops	= &omap_hsmmc_ops;
 
+	/*
+	 * If regulator_disable can only put vcc_aux to sleep then there is
+	 * no off state.
+	 */
+	if (mmc_slot(host).vcc_aux_disable_is_sleep)
+		mmc_slot(host).no_off = 1;
+
 	mmc->f_min	= 400000;
 	mmc->f_max	= 52000000;
 


WARNING: multiple messages have this Message-ID (diff)
From: tony@atomide.com (Tony Lindgren)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 09/19] omap_hsmmc: Allow for a shared VccQ
Date: Thu, 11 Feb 2010 16:51:29 -0800	[thread overview]
Message-ID: <20100212005129.24958.38870.stgit@baageli.muru.com> (raw)
In-Reply-To: <20100212004844.24958.29506.stgit@baageli.muru.com>

From: Adrian Hunter <adrian.hunter@nokia.com>

EMMC can have two voltage supplies, Vcc and VccQ
which are implemented in the code as consumer
supplies vmmc and vmmc_aux.

If the regulator that supplies vmmc_aux is shared
with other consumers, then sending it to sleep
will disrupt those consumers.  However, the
TWL4030-family regulators may have OFF remapped
to SLEEP, in which case 'regulator_disable()'
will put the regulator to sleep only when all
consumers are disabled - which is the desired
behaviour.

This patch adds a platform data field to allow
that option.

Signed-off-by: Adrian Hunter <adrian.hunter@nokia.com>
Signed-off-by: Tony Lindgren <tony@atomide.com>
---
 arch/arm/mach-omap2/hsmmc.c           |    3 +++
 arch/arm/mach-omap2/hsmmc.h           |    1 +
 arch/arm/plat-omap/include/plat/mmc.h |    3 +++
 drivers/mmc/host/omap_hsmmc.c         |   16 +++++++++++++++-
 4 files changed, 22 insertions(+), 1 deletions(-)

diff --git a/arch/arm/mach-omap2/hsmmc.c b/arch/arm/mach-omap2/hsmmc.c
index e4ab123..9ad2295 100644
--- a/arch/arm/mach-omap2/hsmmc.c
+++ b/arch/arm/mach-omap2/hsmmc.c
@@ -205,6 +205,9 @@ void __init omap2_hsmmc_init(struct omap2_hsmmc_info *controllers)
 		if (c->no_off)
 			mmc->slots[0].no_off = 1;
 
+		if (c->vcc_aux_disable_is_sleep)
+			mmc->slots[0].vcc_aux_disable_is_sleep = 1;
+
 		/* NOTE:  MMC slots should have a Vcc regulator set up.
 		 * This may be from a TWL4030-family chip, another
 		 * controllable regulator, or a fixed supply.
diff --git a/arch/arm/mach-omap2/hsmmc.h b/arch/arm/mach-omap2/hsmmc.h
index 2453a7a..36f0ba8 100644
--- a/arch/arm/mach-omap2/hsmmc.h
+++ b/arch/arm/mach-omap2/hsmmc.h
@@ -15,6 +15,7 @@ struct omap2_hsmmc_info {
 	bool	nonremovable;	/* Nonremovable e.g. eMMC */
 	bool	power_saving;	/* Try to sleep or power off when possible */
 	bool	no_off;		/* power_saving and power is not to go off */
+	bool	vcc_aux_disable_is_sleep; /* Regulator off remapped to sleep */
 	int	gpio_cd;	/* or -EINVAL */
 	int	gpio_wp;	/* or -EINVAL */
 	char	*name;		/* or NULL for default */
diff --git a/arch/arm/plat-omap/include/plat/mmc.h b/arch/arm/plat-omap/include/plat/mmc.h
index b463949..a1bac07 100644
--- a/arch/arm/plat-omap/include/plat/mmc.h
+++ b/arch/arm/plat-omap/include/plat/mmc.h
@@ -99,6 +99,9 @@ struct omap_mmc_platform_data {
 		/* If using power_saving and the MMC power is not to go off */
 		unsigned no_off:1;
 
+		/* Regulator off remapped to sleep */
+		unsigned vcc_aux_disable_is_sleep:1;
+
 		int switch_pin;			/* gpio (card detect) */
 		int gpio_wp;			/* gpio (write protect) */
 
diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
index d2fad58..af37477 100644
--- a/drivers/mmc/host/omap_hsmmc.c
+++ b/drivers/mmc/host/omap_hsmmc.c
@@ -347,7 +347,14 @@ static int omap_hsmmc_23_set_sleep(struct device *dev, int slot, int sleep,
 		err = regulator_set_mode(host->vcc, mode);
 	if (err)
 		return err;
-	return regulator_set_mode(host->vcc_aux, mode);
+
+	if (!mmc_slot(host).vcc_aux_disable_is_sleep)
+		return regulator_set_mode(host->vcc_aux, mode);
+
+	if (sleep)
+		return regulator_disable(host->vcc_aux);
+	else
+		return regulator_enable(host->vcc_aux);
 }
 
 static int omap_hsmmc_gpio_init(struct omap_mmc_platform_data *pdata)
@@ -1982,6 +1989,13 @@ static int __init omap_hsmmc_probe(struct platform_device *pdev)
 	else
 		mmc->ops	= &omap_hsmmc_ops;
 
+	/*
+	 * If regulator_disable can only put vcc_aux to sleep then there is
+	 * no off state.
+	 */
+	if (mmc_slot(host).vcc_aux_disable_is_sleep)
+		mmc_slot(host).no_off = 1;
+
 	mmc->f_min	= 400000;
 	mmc->f_max	= 52000000;
 

  parent reply	other threads:[~2010-02-12  0:50 UTC|newest]

Thread overview: 40+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-02-12  0:51 [PATCH 00/19] omap updates for 2.6.34 merge window, part 2 Tony Lindgren
2010-02-12  0:51 ` Tony Lindgren
2010-02-12  0:51 ` [PATCH 01/19] omap_hsmmc: Move gpio and regulator control from board file Tony Lindgren
2010-02-12  0:51   ` Tony Lindgren
2010-02-12  0:51 ` [PATCH 02/19] omap: Rename mmc-twl4030 files to hsmmc Tony Lindgren
2010-02-12  0:51   ` Tony Lindgren
2010-02-12  0:51 ` [PATCH 03/19] omap: Rename hsmmc symbols to reflect independence from twl4030 Tony Lindgren
2010-02-12  0:51   ` Tony Lindgren
2010-02-12  0:51 ` [PATCH 04/19] omap: Reconnect hsmmc context loss count Tony Lindgren
2010-02-12  0:51   ` Tony Lindgren
2010-02-12  0:51 ` [PATCH 05/19] omap: RX51: Remux to pull eMMC lines down when powering off Tony Lindgren
2010-02-12  0:51   ` Tony Lindgren
2010-02-12  0:51 ` [PATCH 06/19] omap_hsmmc: Allow for power saving without going off Tony Lindgren
2010-02-12  0:51   ` Tony Lindgren
2010-02-12  0:51 ` [PATCH 07/19] omap_hsmmc: Fix disable timeouts Tony Lindgren
2010-02-12  0:51   ` Tony Lindgren
2010-02-12  0:51 ` [PATCH 08/19] omap_hsmmc: Ensure regulator enable / disable are paired Tony Lindgren
2010-02-12  0:51   ` Tony Lindgren
2010-02-12  0:51 ` Tony Lindgren [this message]
2010-02-12  0:51   ` [PATCH 09/19] omap_hsmmc: Allow for a shared VccQ Tony Lindgren
2010-02-12  0:51 ` [PATCH 10/19] omap_hsmmc: allow compile without regulator framework Tony Lindgren
2010-02-12  0:51   ` Tony Lindgren
2010-02-12  0:51 ` [PATCH 11/19] omap3: Clean-up for omap_mux_init Tony Lindgren
2010-02-12  0:51   ` Tony Lindgren
2010-02-12  0:51 ` [PATCH 12/19] omap3: pm: Add T2 Keypad as a wakeup source Tony Lindgren
2010-02-12  0:51   ` Tony Lindgren
2010-02-12  0:51 ` [PATCH 13/19] AM35xx: Introduce am35xx.h file Tony Lindgren
2010-02-12  0:51   ` Tony Lindgren
2010-02-12  0:51 ` [PATCH 14/19] AM35xx: Add AM35xx intr_clr & sw_rst cntrl reg bit definition Tony Lindgren
2010-02-12  0:51   ` Tony Lindgren
2010-02-12  0:51 ` [PATCH 15/19] AM35xx: Update irq.h for AM35xx IPSS module interrupts Tony Lindgren
2010-02-12  0:51   ` Tony Lindgren
2010-02-12  0:51 ` [PATCH 16/19] arm: omap: kill compile warning on board-4430-sdp.c Tony Lindgren
2010-02-12  0:51   ` Tony Lindgren
2010-02-12  0:51 ` [PATCH 17/19] OMAP4: IRQ: Add McPDM IRQ definition Tony Lindgren
2010-02-12  0:51   ` Tony Lindgren
2010-02-12  0:51 ` [PATCH 18/19] ARM: OMAP4: Add McPDM base address Tony Lindgren
2010-02-12  0:51   ` Tony Lindgren
2010-02-12  0:51 ` [PATCH 19/19] OMAP4: MCPDM: Register McPDM platform device Tony Lindgren
2010-02-12  0:51   ` Tony Lindgren

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20100212005129.24958.38870.stgit@baageli.muru.com \
    --to=tony@atomide.com \
    --cc=adrian.hunter@nokia.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-omap@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.