Commit d9adcc12 authored by Guennadi Liakhovetski's avatar Guennadi Liakhovetski Committed by Chris Ball

mmc: prohibit card detection when host is not ready

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: default avatarGuennadi Liakhovetski <g.liakhovetski@gmx.de>
Signed-off-by: default avatarChris Ball <cjb@laptop.org>
parent bf68a812
...@@ -2107,6 +2107,7 @@ void mmc_rescan(struct work_struct *work) ...@@ -2107,6 +2107,7 @@ void mmc_rescan(struct work_struct *work)
void mmc_start_host(struct mmc_host *host) void mmc_start_host(struct mmc_host *host)
{ {
host->f_init = max(freqs[0], host->f_min); host->f_init = max(freqs[0], host->f_min);
host->rescan_disable = 0;
mmc_power_up(host); mmc_power_up(host);
mmc_detect_change(host, 0); mmc_detect_change(host, 0);
} }
...@@ -2120,6 +2121,7 @@ void mmc_stop_host(struct mmc_host *host) ...@@ -2120,6 +2121,7 @@ void mmc_stop_host(struct mmc_host *host)
spin_unlock_irqrestore(&host->lock, flags); spin_unlock_irqrestore(&host->lock, flags);
#endif #endif
host->rescan_disable = 1;
cancel_delayed_work_sync(&host->detect); cancel_delayed_work_sync(&host->detect);
mmc_flush_scheduled_work(); mmc_flush_scheduled_work();
......
...@@ -313,6 +313,8 @@ struct mmc_host *mmc_alloc_host(int extra, struct device *dev) ...@@ -313,6 +313,8 @@ struct mmc_host *mmc_alloc_host(int extra, struct device *dev)
if (!host) if (!host)
return NULL; return NULL;
/* scanning will be enabled when we're ready */
host->rescan_disable = 1;
spin_lock(&mmc_host_lock); spin_lock(&mmc_host_lock);
err = idr_get_new(&mmc_host_idr, host, &host->index); err = idr_get_new(&mmc_host_idr, host, &host->index);
spin_unlock(&mmc_host_lock); spin_unlock(&mmc_host_lock);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment