aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPierre Ossman <drzeus@drzeus.cx>2007-02-11 14:43:19 -0500
committerPierre Ossman <drzeus@drzeus.cx>2007-05-01 07:04:17 -0400
commit3b91e5507cddaca53bccf1524ff11a0ac5c85531 (patch)
tree50d0df36aafa5b8f3a0abd5753457e50a3638041
parent1c6a0718f0bfdab0d9b7da5f7b74f38a0058c03a (diff)
mmc: Flush pending detects on host removal
Make sure we kill of any pending detection runs when the host is removed instead of when it is freed. Also add some debugging to make sure the driver doesn't queue up more detection after it has removed the host. Signed-off-by: Pierre Ossman <drzeus@drzeus.cx>
-rw-r--r--drivers/mmc/mmc.c15
-rw-r--r--include/linux/mmc/host.h3
2 files changed, 17 insertions, 1 deletions
diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c
index 9ffeeb2cba45..0242c6a21daf 100644
--- a/drivers/mmc/mmc.c
+++ b/drivers/mmc/mmc.c
@@ -1550,6 +1550,12 @@ static void mmc_setup(struct mmc_host *host)
1550 */ 1550 */
1551void mmc_detect_change(struct mmc_host *host, unsigned long delay) 1551void mmc_detect_change(struct mmc_host *host, unsigned long delay)
1552{ 1552{
1553#ifdef CONFIG_MMC_DEBUG
1554 mmc_claim_host(host);
1555 BUG_ON(host->removed);
1556 mmc_release_host(host);
1557#endif
1558
1553 mmc_schedule_delayed_work(&host->detect, delay); 1559 mmc_schedule_delayed_work(&host->detect, delay);
1554} 1560}
1555 1561
@@ -1690,6 +1696,14 @@ void mmc_remove_host(struct mmc_host *host)
1690{ 1696{
1691 struct list_head *l, *n; 1697 struct list_head *l, *n;
1692 1698
1699#ifdef CONFIG_MMC_DEBUG
1700 mmc_claim_host(host);
1701 host->removed = 1;
1702 mmc_release_host(host);
1703#endif
1704
1705 mmc_flush_scheduled_work();
1706
1693 list_for_each_safe(l, n, &host->cards) { 1707 list_for_each_safe(l, n, &host->cards) {
1694 struct mmc_card *card = mmc_list_to_card(l); 1708 struct mmc_card *card = mmc_list_to_card(l);
1695 1709
@@ -1710,7 +1724,6 @@ EXPORT_SYMBOL(mmc_remove_host);
1710 */ 1724 */
1711void mmc_free_host(struct mmc_host *host) 1725void mmc_free_host(struct mmc_host *host)
1712{ 1726{
1713 mmc_flush_scheduled_work();
1714 mmc_free_host_sysfs(host); 1727 mmc_free_host_sysfs(host);
1715} 1728}
1716 1729
diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h
index c89f41091304..92efe8e5be7e 100644
--- a/include/linux/mmc/host.h
+++ b/include/linux/mmc/host.h
@@ -147,6 +147,9 @@ struct mmc_host {
147 struct mmc_card *card_selected; /* the selected MMC card */ 147 struct mmc_card *card_selected; /* the selected MMC card */
148 148
149 struct delayed_work detect; 149 struct delayed_work detect;
150#ifdef CONFIG_MMC_DEBUG
151 unsigned int removed:1; /* host is being removed */
152#endif
150 153
151 unsigned long private[0] ____cacheline_aligned; 154 unsigned long private[0] ____cacheline_aligned;
152}; 155};