Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2c84417a authored by San Mehat's avatar San Mehat Committed by Ruchi Kandoi
Browse files

mmc: mmcblk: Add support for deferred SD bus resume



Signed-off-by: default avatarSan Mehat <san@google.com>

mmc: card: Add MMC_BLOCK_DEFERRED_RESUME option to Kconfig

Signed-off-by: default avatarSan Mehat <san@google.com>
parent c4cda98f
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -50,6 +50,15 @@ config MMC_BLOCK_BOUNCE

	  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
	tristate "SDIO UART/GPS class support"
	depends on TTY
+16 −0
Original line number Diff line number Diff line
@@ -2002,6 +2002,9 @@ static int mmc_blk_issue_rw_rq(struct mmc_queue *mq, struct request *rqc)
	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)
{
	int ret;
@@ -2011,6 +2014,13 @@ static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req)
	unsigned long flags;
	unsigned int cmd_flags = req ? req->cmd_flags : 0;

#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)
		/* claim host only for the first request */
		mmc_get_card(card);
@@ -2450,6 +2460,9 @@ static int mmc_blk_probe(struct mmc_card *card)

	mmc_set_drvdata(card, md);

#ifdef CONFIG_MMC_BLOCK_DEFERRED_RESUME
	mmc_set_bus_resume_policy(card->host, 1);
#endif
	if (mmc_add_disk(md))
		goto out;

@@ -2492,6 +2505,9 @@ static void mmc_blk_remove(struct mmc_card *card)
	pm_runtime_put_noidle(&card->dev);
	mmc_blk_remove_req(md);
	mmc_set_drvdata(card, NULL);
#ifdef CONFIG_MMC_BLOCK_DEFERRED_RESUME
	mmc_set_bus_resume_policy(card->host, 0);
#endif
}

static int _mmc_blk_suspend(struct mmc_card *card)
+6 −0
Original line number Diff line number Diff line
@@ -2441,6 +2441,12 @@ void mmc_rescan(struct work_struct *work)

	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
	 * the card is no longer present.