Thread (12 messages) 12 messages, 3 authors, 2012-05-08
DORMANTno replies
Revisions (4)
  1. v1 [diff vs current]
  2. v1 [diff vs current]
  3. v1 [diff vs current]
  4. v1 current

[PATCH 4/8] mmc: mmci: Use ios_handler to save power

From: Ulf Hansson <hidden>
Date: 2012-05-08 11:57:09
Also in: linux-mmc

Hi Russell,

Sorry for a late reply.

On 04/18/2012 03:45 PM, Russell King - ARM Linux wrote:
On Wed, Apr 18, 2012 at 01:57:27PM +0200, Vitaly Wool wrote:
quoted
Hi Ulf,

On Tue, Jan 17, 2012 at 3:34 PM, Ulf Hansson[off-list ref]  wrote:
quoted
To disable a levelshifter when we are in an idle state will
decrease current consumption. We make use of the ios_handler
at runtime suspend and at regular suspend to accomplish this.

Of course depending on the used levelshifter the decrease of
current differs. For ST6G3244ME the value is up to ~200 uA.

Tested-by: Linus Walleij<redacted>
Signed-off-by: Ulf Hansson<redacted>
Signed-off-by: Linus Walleij<redacted>
---
  drivers/mmc/host/mmci.c |   19 ++++++++++++++++++-
  1 files changed, 18 insertions(+), 1 deletions(-)
diff --git a/drivers/mmc/host/mmci.c b/drivers/mmc/host/mmci.c
index a7c8f8f..76ce2cd 100644
--- a/drivers/mmc/host/mmci.c
+++ b/drivers/mmc/host/mmci.c
@@ -1505,10 +1505,22 @@ static int mmci_save(struct amba_device *dev)
  {
        struct mmc_host *mmc = amba_get_drvdata(dev);
        unsigned long flags;
+       struct mmc_ios ios;
+       int ret = 0;

        if (mmc) {
                struct mmci_host *host = mmc_priv(mmc);

+               /* Let the ios_handler act on a POWER_OFF to save power. */
+               if (host->plat->ios_handler) {
+                       memcpy(&ios,&mmc->ios, sizeof(struct mmc_ios));
+                       ios.power_mode = MMC_POWER_OFF;
+                       ret = host->plat->ios_handler(mmc_dev(mmc),
+&ios);
+                       if (ret)
+                               return ret;
+               }
+
                spin_lock_irqsave(&host->lock, flags);

                /*
@@ -1527,7 +1539,7 @@ static int mmci_save(struct amba_device *dev)
                amba_vcore_disable(dev);
        }

-       return 0;
+       return ret;
  }

  static int mmci_restore(struct amba_device *dev)
@@ -1550,6 +1562,11 @@ static int mmci_restore(struct amba_device *dev)
                writel(MCI_IRQENABLE, host->base + MMCIMASK0);

                spin_unlock_irqrestore(&host->lock, flags);
+
+               /* Restore settings done by the ios_handler. */
+               if (host->plat->ios_handler)
+                       host->plat->ios_handler(mmc_dev(mmc),
+&mmc->ios);
        }

        return 0;
this patch is a disaster because it cuts off the chip's power on
suspend regardless of whether MMC_PM_KEEP_POWER flag has been set or
not. Simply put: it breaks everything This patch therefore gets a
strongest *NACK* from me.
Agree, the ios_handler should not be called like this. In our internal 
code base the ios_handler were only handling the levelshifter, which is 
safe to disable in the runtim_suspend sequence. But of course, and 
ios_handler may control power to the card as well and thus shall not be 
called like this patch does.
Thank you for backing up what I've already said about this patch (which
is why I stopped applying Ulf's MMC patches at this patch.)

I've also been concerned with the mere saving and restoring of the
clock and power registers in this patch - something which the ARM version
of the primecell does not actually support.
The ios_handler is not used for the ARM version so it should not be 
causing any issue I think. But, still, according to input from Vitaly 
above, this patch is not OK.

I will rework this patch. Thanks for your input.
I've said that before...
Kind regards
Ulf Hansson
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help