diff options
Diffstat (limited to 'drivers/mmc/core/core.c')
| -rw-r--r-- | drivers/mmc/core/core.c | 16 | 
1 files changed, 15 insertions, 1 deletions
diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c index 00abe448f07..297367ab548 100644 --- a/drivers/mmc/core/core.c +++ b/drivers/mmc/core/core.c @@ -1596,11 +1596,17 @@ static inline void mmc_bus_put(struct mmc_host *host)  int mmc_resume_bus(struct mmc_host *host)  { +	unsigned long flags; +  	if (!mmc_bus_needs_resume(host))  		return -EINVAL;  	printk("%s: Starting deferred resume\n", mmc_hostname(host)); +	spin_lock_irqsave(&host->lock, flags);  	host->bus_resume_flags &= ~MMC_BUSRESUME_NEEDS_RESUME; +	host->rescan_disable = 0; +	spin_unlock_irqrestore(&host->lock, flags); +  	mmc_bus_get(host);  	if (host->bus_ops && !host->bus_dead) {  		mmc_power_up(host); @@ -2722,7 +2728,7 @@ int mmc_resume_host(struct mmc_host *host)  	int err = 0;  	mmc_bus_get(host); -	if (host->bus_resume_flags & MMC_BUSRESUME_MANUAL_RESUME) { +	if (mmc_bus_manual_resume(host)) {  		host->bus_resume_flags |= MMC_BUSRESUME_NEEDS_RESUME;  		mmc_bus_put(host);  		return 0; @@ -2788,6 +2794,10 @@ int mmc_pm_notify(struct notifier_block *notify_block,  		}  		spin_lock_irqsave(&host->lock, flags); +		if (mmc_bus_needs_resume(host)) { +			spin_unlock_irqrestore(&host->lock, flags); +			break; +		}  		host->rescan_disable = 1;  		spin_unlock_irqrestore(&host->lock, flags);  		cancel_delayed_work_sync(&host->detect); @@ -2811,6 +2821,10 @@ int mmc_pm_notify(struct notifier_block *notify_block,  	case PM_POST_RESTORE:  		spin_lock_irqsave(&host->lock, flags); +		if (mmc_bus_manual_resume(host)) { +			spin_unlock_irqrestore(&host->lock, flags); +			break; +		}  		host->rescan_disable = 0;  		spin_unlock_irqrestore(&host->lock, flags);  		mmc_detect_change(host, 0);  |