diff options
| author | San Mehat <san@android.com> | 2009-03-23 12:20:37 -0700 | 
|---|---|---|
| committer | Arve Hjønnevåg <arve@android.com> | 2013-07-01 13:40:23 -0700 | 
| commit | 57fa81bd6751fab71d83e9a8ea987d5f0e1a7e90 (patch) | |
| tree | b2a5935850c37716c0c61db3739ef15573e48000 /drivers/mmc/core/core.c | |
| parent | 9abeb46f016b75e0c821dd45a89feb4947fb083a (diff) | |
| download | olio-linux-3.10-57fa81bd6751fab71d83e9a8ea987d5f0e1a7e90.tar.xz olio-linux-3.10-57fa81bd6751fab71d83e9a8ea987d5f0e1a7e90.zip  | |
mmc: core: Hold a wake lock accross delayed work + mmc rescan
Signed-off-by: San Mehat <san@android.com>
mmc: core: Rework mmc_delayed_work wakelock so that the wakelock is only extended if a card is added or removed.
Signed-off-by: San Mehat <san@google.com>
Diffstat (limited to 'drivers/mmc/core/core.c')
| -rw-r--r-- | drivers/mmc/core/core.c | 17 | 
1 files changed, 16 insertions, 1 deletions
diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c index c57a28311df..5db69d8849d 100644 --- a/drivers/mmc/core/core.c +++ b/drivers/mmc/core/core.c @@ -27,6 +27,7 @@  #include <linux/fault-inject.h>  #include <linux/random.h>  #include <linux/slab.h> +#include <linux/wakelock.h>  #include <linux/mmc/card.h>  #include <linux/mmc/host.h> @@ -52,6 +53,7 @@  #define MMC_BKOPS_MAX_TIMEOUT	(4 * 60 * 1000) /* max time to wait in ms */  static struct workqueue_struct *workqueue; +static struct wake_lock mmc_delayed_work_wake_lock;  static const unsigned freqs[] = { 400000, 300000, 200000, 100000 };  /* @@ -85,6 +87,7 @@ MODULE_PARM_DESC(  static int mmc_schedule_delayed_work(struct delayed_work *work,  				     unsigned long delay)  { +	wake_lock(&mmc_delayed_work_wake_lock);  	return queue_delayed_work(workqueue, work, delay);  } @@ -2351,6 +2354,7 @@ void mmc_rescan(struct work_struct *work)  	struct mmc_host *host =  		container_of(work, struct mmc_host, detect.work);  	int i; +	bool extend_wakelock = false;  	if (host->rescan_disable)  		return; @@ -2400,14 +2404,20 @@ void mmc_rescan(struct work_struct *work)  	mmc_claim_host(host);  	for (i = 0; i < ARRAY_SIZE(freqs); i++) { -		if (!mmc_rescan_try_freq(host, max(freqs[i], host->f_min))) +		if (!mmc_rescan_try_freq(host, max(freqs[i], host->f_min))) { +			extend_wakelock = true;  			break; +		}  		if (freqs[i] <= host->f_min)  			break;  	}  	mmc_release_host(host);   out: +	if (extend_wakelock) +		wake_lock_timeout(&mmc_delayed_work_wake_lock, HZ / 2); +	else +		wake_unlock(&mmc_delayed_work_wake_lock);  	if (host->caps & MMC_CAP_NEEDS_POLL)  		mmc_schedule_delayed_work(&host->detect, HZ);  } @@ -2813,6 +2823,9 @@ static int __init mmc_init(void)  	if (!workqueue)  		return -ENOMEM; +	wake_lock_init(&mmc_delayed_work_wake_lock, WAKE_LOCK_SUSPEND, +		       "mmc_delayed_work"); +  	ret = mmc_register_bus();  	if (ret)  		goto destroy_workqueue; @@ -2833,6 +2846,7 @@ unregister_bus:  	mmc_unregister_bus();  destroy_workqueue:  	destroy_workqueue(workqueue); +	wake_lock_destroy(&mmc_delayed_work_wake_lock);  	return ret;  } @@ -2843,6 +2857,7 @@ static void __exit mmc_exit(void)  	mmc_unregister_host_class();  	mmc_unregister_bus();  	destroy_workqueue(workqueue); +	wake_lock_destroy(&mmc_delayed_work_wake_lock);  }  subsys_initcall(mmc_init);  |