summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZhang Jiejing <jiejing.zhang@freescale.com>2011-10-20 19:09:03 +0800
committerZhang Jiejing <jiejing.zhang@freescale.com>2011-11-02 11:13:52 +0800
commita762c73803259008fc62a3b3f5ec32c86d51c5b7 (patch)
treef00c09ec1b1be2a094a39d26fa31f3a206dfa7ac
parent6e037efc0b6ca27bb8d8525310690e063b1ab885 (diff)
ENGR00000001 Revert "mmc: core: Add deferred bus resume policy for android."
This reverts commit 8ac7fbd32b8b72ccfd0511089e4fad2d828d8682. Conflicts: drivers/mmc/card/block.c Revert this commit because this patch changed in android 2.6.35 branch. I revert this patch and apply the new patch to avoid misunstanding. Signed-off-by: Zhang Jiejing <jiejing.zhang@freescale.com>
-rw-r--r--drivers/mmc/card/Kconfig9
-rw-r--r--drivers/mmc/card/block.c44
-rw-r--r--drivers/mmc/core/core.c45
-rw-r--r--include/linux/mmc/host.h8
4 files changed, 25 insertions, 81 deletions
diff --git a/drivers/mmc/card/Kconfig b/drivers/mmc/card/Kconfig
index 325f3402e252..10ba9a035a58 100644
--- a/drivers/mmc/card/Kconfig
+++ b/drivers/mmc/card/Kconfig
@@ -32,15 +32,6 @@ 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"
help
diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c
index 84a265648cd2..a1239b93c078 100644
--- a/drivers/mmc/card/block.c
+++ b/drivers/mmc/card/block.c
@@ -242,7 +242,31 @@ static u32 get_card_status(struct mmc_card *card, struct request *req)
return cmd.resp[0];
}
-static int mmc_blk_set_blksize(struct mmc_blk_data *md, struct mmc_card *card);
+static int
+mmc_blk_set_blksize(struct mmc_blk_data *md, struct mmc_card *card)
+{
+ struct mmc_command cmd;
+ int err;
+
+ /* Block-addressed cards ignore MMC_SET_BLOCKLEN. */
+ if (mmc_card_blockaddr(card))
+ return 0;
+
+ mmc_claim_host(card->host);
+ cmd.opcode = MMC_SET_BLOCKLEN;
+ cmd.arg = 512;
+ cmd.flags = MMC_RSP_SPI_R1 | MMC_RSP_R1 | MMC_CMD_AC;
+ err = mmc_wait_for_cmd(card->host, &cmd, 5);
+ mmc_release_host(card->host);
+
+ if (err) {
+ printk(KERN_ERR "%s: unable to set block size to %d: %d\n",
+ md->disk->disk_name, cmd.arg, err);
+ return -EINVAL;
+ }
+
+ return 0;
+}
static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req)
{
@@ -251,11 +275,6 @@ static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req)
struct mmc_blk_request brq;
int ret = 1, disable_multi = 0;
-#ifdef CONFIG_MMC_BLOCK_DEFERRED_RESUME
- if (!mmc_resume_bus(card->host))
- mmc_blk_set_blksize(md, card);
-#endif
-
mmc_claim_host(card->host);
do {
@@ -580,10 +599,6 @@ mmc_blk_set_blksize(struct mmc_blk_data *md, struct mmc_card *card)
if (mmc_card_blockaddr(card))
return 0;
- /* DDR Mode cards ignore MMC_SET_BLOCKLEN. */
- if (mmc_card_ddrmode(card))
- return 0;
-
mmc_claim_host(card->host);
cmd.opcode = MMC_SET_BLOCKLEN;
cmd.arg = 512;
@@ -628,10 +643,6 @@ static int mmc_blk_probe(struct mmc_card *card)
cap_str, md->read_only ? "(ro)" : "");
mmc_set_drvdata(card, md);
-#ifdef CONFIG_MMC_BLOCK_DEFERRED_RESUME
- card->host->deferred_resume = 1;
- card->host->need_resume = 0;
-#endif
add_disk(md->disk);
return 0;
@@ -656,9 +667,6 @@ static void mmc_blk_remove(struct mmc_card *card)
mmc_blk_put(md);
}
mmc_set_drvdata(card, NULL);
-#ifdef CONFIG_MMC_BLOCK_DEFERRED_RESUME
- card->host->deferred_resume = 0;
-#endif
}
#ifdef CONFIG_PM
@@ -677,9 +685,7 @@ static int mmc_blk_resume(struct mmc_card *card)
struct mmc_blk_data *md = mmc_get_drvdata(card);
if (md) {
-#ifndef CONFIG_MMC_BLOCK_DEFERRED_RESUME
mmc_blk_set_blksize(md, card);
-#endif
mmc_queue_resume(&md->queue);
}
return 0;
diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c
index e6233c06243c..65e5ead06787 100644
--- a/drivers/mmc/core/core.c
+++ b/drivers/mmc/core/core.c
@@ -983,37 +983,6 @@ static inline void mmc_bus_put(struct mmc_host *host)
spin_unlock_irqrestore(&host->lock, flags);
}
-#ifdef CONFIG_MMC_BLOCK_DEFERRED_RESUME
-int mmc_resume_bus(struct mmc_host *host)
-{
- unsigned long flags;
-
- if (!host->deferred_resume || !host->need_resume)
- return -EINVAL;
-
- printk("%s: Starting deferred resume\n", mmc_hostname(host));
- spin_lock_irqsave(&host->lock, flags);
- host->need_resume = 0;
- spin_unlock_irqrestore(&host->lock, flags);
-
- mmc_bus_get(host);
- if (host->bus_ops && !host->bus_dead) {
- mmc_power_up(host);
- BUG_ON(!host->bus_ops->resume);
- host->bus_ops->resume(host);
- }
-
- if (host->bus_ops->detect && !host->bus_dead)
- host->bus_ops->detect(host);
-
- mmc_bus_put(host);
- printk("%s: Deferred resume completed\n", mmc_hostname(host));
- return 0;
-}
-
-EXPORT_SYMBOL(mmc_resume_bus);
-#endif
-
/*
* Assign a mmc bus handler to a host. Only one bus handler may control a
* host at any given time.
@@ -1309,11 +1278,6 @@ int mmc_suspend_host(struct mmc_host *host)
{
int err = 0;
-#ifdef CONFIG_MMC_BLOCK_DEFERRED_RESUME
- if (host->need_resume)
- return 0;
-#endif
-
if (host->caps & MMC_CAP_DISABLE)
cancel_delayed_work(&host->disable);
cancel_delayed_work(&host->detect);
@@ -1356,15 +1320,6 @@ int mmc_resume_host(struct mmc_host *host)
int err = 0;
mmc_bus_get(host);
-
-#ifdef CONFIG_MMC_BLOCK_DEFERRED_RESUME
- if (host->deferred_resume) {
- host->need_resume = 1;
- mmc_bus_put(host);
- return 0;
- }
-#endif
-
if (host->bus_ops && !host->bus_dead) {
if (!(host->pm_flags & MMC_PM_KEEP_POWER)) {
mmc_power_up(host);
diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h
index 8e613a5c53a7..e77d7541da3c 100644
--- a/include/linux/mmc/host.h
+++ b/include/linux/mmc/host.h
@@ -200,10 +200,6 @@ struct mmc_host {
const struct mmc_bus_ops *bus_ops; /* current bus driver */
unsigned int bus_refs; /* reference counter */
-#ifdef CONFIG_MMC_BLOCK_DEFERRED_RESUME
- unsigned int need_resume:1;
- unsigned int deferred_resume:1;
-#endif
unsigned int sdio_irqs;
struct task_struct *sdio_irq_thread;
@@ -236,10 +232,6 @@ static inline void *mmc_priv(struct mmc_host *host)
#define mmc_classdev(x) (&(x)->class_dev)
#define mmc_hostname(x) (dev_name(&(x)->class_dev))
-#ifdef CONFIG_MMC_BLOCK_DEFERRED_RESUME
-extern int mmc_resume_bus(struct mmc_host *host);
-#endif
-
extern int mmc_suspend_host(struct mmc_host *);
extern int mmc_resume_host(struct mmc_host *);