From 68d8875986ce90d09f389f70f96a1789176af410 Mon Sep 17 00:00:00 2001 From: Abhilash Kesavan Date: Mon, 19 Nov 2012 10:26:21 +0530 Subject: [PATCH] --- yaml --- r: 336295 b: refs/heads/master c: ab269128a2cff7abee06f023e6466fc29991738c h: refs/heads/master i: 336293: 4c5c2ef7930f72e3e927fbfc5a30b8a65651840a 336291: d24b9a49549d3494f514fec37423a4c42da5f385 336287: 87a5e5c70fadb26d554b31167bf34138ac2e6941 v: v3 --- [refs] | 2 +- trunk/drivers/mmc/host/dw_mmc.c | 20 +++++++++++++++++--- trunk/include/linux/mmc/dw_mmc.h | 1 + 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/[refs] b/[refs] index 215c4870f946..e59b1513e9e9 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: f5ccfd4174639119664b6d76495ea1388f13b838 +refs/heads/master: ab269128a2cff7abee06f023e6466fc29991738c diff --git a/trunk/drivers/mmc/host/dw_mmc.c b/trunk/drivers/mmc/host/dw_mmc.c index 5b4134811c90..73420296b268 100644 --- a/trunk/drivers/mmc/host/dw_mmc.c +++ b/trunk/drivers/mmc/host/dw_mmc.c @@ -617,13 +617,13 @@ static void mci_send_cmd(struct dw_mci_slot *slot, u32 cmd, u32 arg) cmd, arg, cmd_status); } -static void dw_mci_setup_bus(struct dw_mci_slot *slot) +static void dw_mci_setup_bus(struct dw_mci_slot *slot, bool force_clkinit) { struct dw_mci *host = slot->host; u32 div; u32 clk_en_a; - if (slot->clock != host->current_speed) { + if (slot->clock != host->current_speed || force_clkinit) { div = host->bus_hz / slot->clock; if (host->bus_hz % slot->clock && host->bus_hz > slot->clock) /* @@ -684,7 +684,7 @@ static void __dw_mci_start_request(struct dw_mci *host, host->pdata->select_slot(slot->id); /* Slot specific timing and width adjustment */ - dw_mci_setup_bus(slot); + dw_mci_setup_bus(slot, false); host->cur_slot = slot; host->mrq = mrq; @@ -1850,6 +1850,9 @@ static int dw_mci_init_slot(struct dw_mci *host, unsigned int id) if (host->pdata->caps) mmc->caps = host->pdata->caps; + if (host->pdata->pm_caps) + mmc->pm_caps = host->pdata->pm_caps; + if (host->dev->of_node) { ctrl_id = of_alias_get_id(host->dev->of_node, "mshc"); if (ctrl_id < 0) @@ -2072,6 +2075,12 @@ static struct dw_mci_board *dw_mci_parse_dt(struct dw_mci *host) return ERR_PTR(ret); } + if (of_find_property(np, "keep-power-in-suspend", NULL)) + pdata->pm_caps |= MMC_PM_KEEP_POWER; + + if (of_find_property(np, "enable-sdio-wakeup", NULL)) + pdata->pm_caps |= MMC_PM_WAKE_SDIO_IRQ; + return pdata; } @@ -2411,6 +2420,11 @@ int dw_mci_resume(struct dw_mci *host) struct dw_mci_slot *slot = host->slot[i]; if (!slot) continue; + if (slot->mmc->pm_flags & MMC_PM_KEEP_POWER) { + dw_mci_set_ios(slot->mmc, &slot->mmc->ios); + dw_mci_setup_bus(slot, true); + } + ret = mmc_resume_host(host->slot[i]->mmc); if (ret < 0) return ret; diff --git a/trunk/include/linux/mmc/dw_mmc.h b/trunk/include/linux/mmc/dw_mmc.h index a5498dce1cb5..34be4f47293c 100644 --- a/trunk/include/linux/mmc/dw_mmc.h +++ b/trunk/include/linux/mmc/dw_mmc.h @@ -231,6 +231,7 @@ struct dw_mci_board { u32 caps; /* Capabilities */ u32 caps2; /* More capabilities */ + u32 pm_caps; /* PM capabilities */ /* * Override fifo depth. If 0, autodetect it from the FIFOTH register, * but note that this may not be reliable after a bootloader has used