mmc: prohibit card detection when host is not ready
authorGuennadi Liakhovetski <g.liakhovetski@gmx.de>
Thu, 14 Jun 2012 08:17:39 +0000 (10:17 +0200)
committerChris Ball <cjb@laptop.org>
Sat, 21 Jul 2012 04:02:21 +0000 (00:02 -0400)
Currently mmc host drivers have to decide whether to enable card
detection before calling mmc_add_host() -- in which case a card
insertion event can arrive before the host has been completely
initialised -- or after mmc_add_host(), in which case the initial
card detection can be problematic.

This patch adds an explicit indication of when card detection should
not be carried out. With it in place enabling card detection before
calling mmc_add_host() should be safe. Similarly, disabling it again
after calling mmc_remove_host() will avoid any races.

Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
Signed-off-by: Chris Ball <cjb@laptop.org>
drivers/mmc/core/core.c
drivers/mmc/core/host.c

index 8d00aef9523e6a348d0cf34797ece8b5dd70a658..9503cabc96f1b6ada03e1ebc469c6153331d80f1 100644 (file)
@@ -2107,6 +2107,7 @@ void mmc_rescan(struct work_struct *work)
 void mmc_start_host(struct mmc_host *host)
 {
        host->f_init = max(freqs[0], host->f_min);
+       host->rescan_disable = 0;
        mmc_power_up(host);
        mmc_detect_change(host, 0);
 }
@@ -2120,6 +2121,7 @@ void mmc_stop_host(struct mmc_host *host)
        spin_unlock_irqrestore(&host->lock, flags);
 #endif
 
+       host->rescan_disable = 1;
        cancel_delayed_work_sync(&host->detect);
        mmc_flush_scheduled_work();
 
index 74cf29a504f4fe0c0a431c84ec366c8c7d7d86aa..597f189b44278caa4edd682ef27b6c57066eb1f2 100644 (file)
@@ -313,6 +313,8 @@ struct mmc_host *mmc_alloc_host(int extra, struct device *dev)
        if (!host)
                return NULL;
 
+       /* scanning will be enabled when we're ready */
+       host->rescan_disable = 1;
        spin_lock(&mmc_host_lock);
        err = idr_get_new(&mmc_host_idr, host, &host->index);
        spin_unlock(&mmc_host_lock);