mmc: mmcblk: Add support for deferred SD bus resume
Signed-off-by: San Mehat <san@google.com> mmc: card: Add MMC_BLOCK_DEFERRED_RESUME option to Kconfig Signed-off-by: San Mehat <san@google.com>
This commit is contained in:
@@ -50,6 +50,15 @@ config MMC_BLOCK_BOUNCE
|
|||||||
|
|
||||||
If unsure, say Y here.
|
If unsure, say Y here.
|
||||||
|
|
||||||
|
config MMC_BLOCK_DEFERRED_RESUME
|
||||||
|
bool "Deferr MMC layer resume until I/O is requested"
|
||||||
|
depends on MMC_BLOCK
|
||||||
|
default n
|
||||||
|
help
|
||||||
|
Say Y here to enable deferred MMC resume until I/O
|
||||||
|
is requested. This will reduce overall resume latency and
|
||||||
|
save power when theres an SD card inserted but not being used.
|
||||||
|
|
||||||
config SDIO_UART
|
config SDIO_UART
|
||||||
tristate "SDIO UART/GPS class support"
|
tristate "SDIO UART/GPS class support"
|
||||||
help
|
help
|
||||||
|
|||||||
@@ -1379,12 +1379,22 @@ static int mmc_blk_issue_rw_rq(struct mmc_queue *mq, struct request *rqc)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
mmc_blk_set_blksize(struct mmc_blk_data *md, struct mmc_card *card);
|
||||||
|
|
||||||
static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req)
|
static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
struct mmc_blk_data *md = mq->data;
|
struct mmc_blk_data *md = mq->data;
|
||||||
struct mmc_card *card = md->queue.card;
|
struct mmc_card *card = md->queue.card;
|
||||||
|
|
||||||
|
#ifdef CONFIG_MMC_BLOCK_DEFERRED_RESUME
|
||||||
|
if (mmc_bus_needs_resume(card->host)) {
|
||||||
|
mmc_resume_bus(card->host);
|
||||||
|
mmc_blk_set_blksize(md, card);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if (req && !mq->mqrq_prev->req)
|
if (req && !mq->mqrq_prev->req)
|
||||||
/* claim host only for the first request */
|
/* claim host only for the first request */
|
||||||
mmc_claim_host(card->host);
|
mmc_claim_host(card->host);
|
||||||
@@ -1771,6 +1781,9 @@ static int mmc_blk_probe(struct mmc_card *card)
|
|||||||
mmc_set_drvdata(card, md);
|
mmc_set_drvdata(card, md);
|
||||||
mmc_fixup_device(card, blk_fixups);
|
mmc_fixup_device(card, blk_fixups);
|
||||||
|
|
||||||
|
#ifdef CONFIG_MMC_BLOCK_DEFERRED_RESUME
|
||||||
|
mmc_set_bus_resume_policy(card->host, 1);
|
||||||
|
#endif
|
||||||
if (mmc_add_disk(md))
|
if (mmc_add_disk(md))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
@@ -1796,6 +1809,9 @@ static void mmc_blk_remove(struct mmc_card *card)
|
|||||||
mmc_release_host(card->host);
|
mmc_release_host(card->host);
|
||||||
mmc_blk_remove_req(md);
|
mmc_blk_remove_req(md);
|
||||||
mmc_set_drvdata(card, NULL);
|
mmc_set_drvdata(card, NULL);
|
||||||
|
#ifdef CONFIG_MMC_BLOCK_DEFERRED_RESUME
|
||||||
|
mmc_set_bus_resume_policy(card->host, 0);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_PM
|
#ifdef CONFIG_PM
|
||||||
|
|||||||
@@ -2050,6 +2050,12 @@ void mmc_rescan(struct work_struct *work)
|
|||||||
|
|
||||||
host->detect_change = 0;
|
host->detect_change = 0;
|
||||||
|
|
||||||
|
/* If the card was removed the bus will be marked
|
||||||
|
* as dead - extend the wakelock so userspace
|
||||||
|
* can respond */
|
||||||
|
if (host->bus_dead)
|
||||||
|
extend_wakelock = 1;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Let mmc_bus_put() free the bus/bus_ops if we've found that
|
* Let mmc_bus_put() free the bus/bus_ops if we've found that
|
||||||
* the card is no longer present.
|
* the card is no longer present.
|
||||||
|
|||||||
Reference in New Issue
Block a user