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>
This commit is contained in:
parent
707392fd2c
commit
bec7bcbb70
1 changed files with 16 additions and 1 deletions
|
|
@ -29,6 +29,7 @@
|
|||
#include <linux/random.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/wakelock.h>
|
||||
|
||||
#include <linux/mmc/card.h>
|
||||
#include <linux/mmc/host.h>
|
||||
|
|
@ -56,6 +57,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 };
|
||||
|
||||
/*
|
||||
|
|
@ -72,6 +74,7 @@ module_param(use_spi_crc, bool, 0);
|
|||
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);
|
||||
}
|
||||
|
||||
|
|
@ -2566,6 +2569,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->trigger_card_event && host->ops->card_event) {
|
||||
host->ops->card_event(host);
|
||||
|
|
@ -2621,14 +2625,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);
|
||||
}
|
||||
|
|
@ -2856,6 +2866,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;
|
||||
|
|
@ -2876,6 +2889,7 @@ unregister_bus:
|
|||
mmc_unregister_bus();
|
||||
destroy_workqueue:
|
||||
destroy_workqueue(workqueue);
|
||||
wake_lock_destroy(&mmc_delayed_work_wake_lock);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -2886,6 +2900,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);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue