mmc: tmio: postpone controller reset during resume
authorGuennadi Liakhovetski <g.liakhovetski@gmx.de>
Mon, 22 Apr 2013 08:29:26 +0000 (10:29 +0200)
committerChris Ball <cjb@laptop.org>
Thu, 6 Jun 2013 11:37:48 +0000 (07:37 -0400)
When resuming, the tmio_mmc_host_resume() function is run when the
controller might still be powered down. Issuing a reset command to it at
that time has no effect. This patch postpones resetting the controller
until the first powering-up .set_ios() call.

Reported-by: Nguyen Viet Dung <nv-dung@jinso.co.jp>
Signed-off-by: Guennadi Liakhovetski <g.liakhovetski+renesas@gmail.com>
Signed-off-by: Chris Ball <cjb@laptop.org>
drivers/mmc/host/tmio_mmc.h
drivers/mmc/host/tmio_mmc_pio.c

index d857f5c6e7d96d93fa771bee36178b93c901becf..759d8f4f130ca04aa51837ad4c9ec77d8b2d795d 100644 (file)
@@ -85,6 +85,7 @@ struct tmio_mmc_host {
        unsigned long           last_req_ts;
        struct mutex            ios_lock;       /* protect set_ios() context */
        bool                    native_hotplug;
+       bool                    resuming;
 };
 
 int tmio_mmc_host_probe(struct tmio_mmc_host **host,
index f508ecb5b8a7dcd446aafcfdf4b6a0be857d4f1d..435cc4d2520fb1a8df53e947cd6e9347bec8e9f9 100644 (file)
@@ -862,6 +862,10 @@ static void tmio_mmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
                if (!host->power) {
                        tmio_mmc_clk_update(mmc);
                        pm_runtime_get_sync(dev);
+                       if (host->resuming) {
+                               tmio_mmc_reset(host);
+                               host->resuming = false;
+                       }
                }
                tmio_mmc_set_clock(host, ios->clock);
                if (!host->power) {
@@ -1154,10 +1158,10 @@ int tmio_mmc_host_resume(struct device *dev)
        struct mmc_host *mmc = dev_get_drvdata(dev);
        struct tmio_mmc_host *host = mmc_priv(mmc);
 
-       tmio_mmc_reset(host);
        tmio_mmc_enable_dma(host, true);
 
        /* The MMC core will perform the complete set up */
+       host->resuming = true;
        return mmc_resume_host(mmc);
 }
 EXPORT_SYMBOL(tmio_mmc_host_resume);