From: Ethan Du Date: Thu, 9 Sep 2010 23:37:49 +0000 (-0700) Subject: omap hsmmc: fix a racing case between kmmcd and omap_hsmmc_suspend X-Git-Tag: upstream/snapshot3+hdmi~13054 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=e7cb756fc3c7c32040283963572258381b342dff;p=platform%2Fadaptation%2Frenesas_rcar%2Frenesas_kernel.git omap hsmmc: fix a racing case between kmmcd and omap_hsmmc_suspend If suspend called when kmmcd is doing host->ops->disable, as kmmcd already increased host->en_dis_recurs to 1, the mmc_host_enable in suspend function will return directly without increase the nesting_cnt, which will cause the followed register access carried out to the disabled host. mmc_suspend_host will enable host itself. No need to enable host before it. Also works on kmmcd will get flushed in mmc_suspend_host, enable host after it will be safe. So make the mmc_host_enable after it. [cjb: rebase against current Linus] Signed-off-by: Ethan Signed-off-by: Chris Ball Acked-by: Adrian Hunter Acked-by: Madhusudhan Chikkature Cc: Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds --- diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c index fb6446a..4526d27 100644 --- a/drivers/mmc/host/omap_hsmmc.c +++ b/drivers/mmc/host/omap_hsmmc.c @@ -2323,8 +2323,8 @@ static int omap_hsmmc_suspend(struct device *dev) } } cancel_work_sync(&host->mmc_carddetect_work); - mmc_host_enable(host->mmc); ret = mmc_suspend_host(host->mmc); + mmc_host_enable(host->mmc); if (ret == 0) { omap_hsmmc_disable_irq(host); OMAP_HSMMC_WRITE(host->base, HCTL,