* [PATCH 1/4] mmc: omap: Enable Auto CMD12
2012-02-24 15:44 [PATCH 0/4] mmc: omap: add autocmd12, DDR support and runtime fixes Balaji T K
@ 2012-02-24 15:44 ` Balaji T K
2012-02-24 15:44 ` [PATCH 2/4] mmc: omap: add DDR support to omap_hsmmc Balaji T K
` (2 subsequent siblings)
3 siblings, 0 replies; 5+ messages in thread
From: Balaji T K @ 2012-02-24 15:44 UTC (permalink / raw)
To: linux-mmc, cjb; +Cc: linux-omap, Balaji T K
Enable Auto-CMD12 for multi block read/write on HSMMC
Tested on OMAP4430, OMAP3430 and OMAP2430 SDP
Signed-off-by: Balaji T K <balajitk@ti.com>
---
drivers/mmc/host/omap_hsmmc.c | 17 ++++++++++++++---
1 files changed, 14 insertions(+), 3 deletions(-)
diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
index 36e7f5b..f4c7f89 100644
--- a/drivers/mmc/host/omap_hsmmc.c
+++ b/drivers/mmc/host/omap_hsmmc.c
@@ -82,6 +82,7 @@
#define BRR_ENABLE (1 << 5)
#define DTO_ENABLE (1 << 20)
#define INIT_STREAM (1 << 1)
+#define ACEN_ACMD12 (1 << 2)
#define DP_SELECT (1 << 21)
#define DDIR (1 << 4)
#define DMA_EN 0x1
@@ -123,6 +124,7 @@
#define OMAP_MMC_MAX_CLOCK 52000000
#define DRIVER_NAME "omap_hsmmc"
+#define AUTO_CMD12 (1 << 0) /* Auto CMD12 support */
/*
* One controller can have multiple slots, like on some omap boards using
* omap.c controller driver. Luckily this is not currently done on any known
@@ -185,6 +187,7 @@ struct omap_hsmmc_host {
int reqs_blocked;
int use_reg;
int req_in_progress;
+ unsigned int flags;
struct omap_hsmmc_next next_data;
struct omap_mmc_platform_data *pdata;
@@ -886,6 +889,8 @@ omap_hsmmc_start_command(struct omap_hsmmc_host *host, struct mmc_command *cmd,
cmdtype = 0x3;
cmdreg = (cmd->opcode << 24) | (resptype << 16) | (cmdtype << 22);
+ if ((host->flags & AUTO_CMD12) && mmc_op_multi(cmd->opcode))
+ cmdreg |= ACEN_ACMD12;
if (data) {
cmdreg |= DP_SELECT | MSBS | BCE;
@@ -957,11 +962,16 @@ omap_hsmmc_xfer_done(struct omap_hsmmc_host *host, struct mmc_data *data)
else
data->bytes_xfered = 0;
- if (!data->stop) {
+ if (data->stop && ((!(host->flags & AUTO_CMD12)) || data->error))
+ omap_hsmmc_start_command(host, data->stop, NULL);
+ else {
+ if (data->stop)
+ data->stop->resp[0] = OMAP_HSMMC_READ(host->base,
+ RSP76);
omap_hsmmc_request_done(host, data->mrq);
- return;
}
- omap_hsmmc_start_command(host, data->stop, NULL);
+
+ return;
}
/*
@@ -1899,6 +1909,7 @@ static int __init omap_hsmmc_probe(struct platform_device *pdev)
host->mapbase = res->start;
host->base = ioremap(host->mapbase, SZ_4K);
host->power_mode = MMC_POWER_OFF;
+ host->flags = AUTO_CMD12;
host->next_data.cookie = 1;
platform_set_drvdata(pdev, host);
--
1.7.0.4
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH 2/4] mmc: omap: add DDR support to omap_hsmmc
2012-02-24 15:44 [PATCH 0/4] mmc: omap: add autocmd12, DDR support and runtime fixes Balaji T K
2012-02-24 15:44 ` [PATCH 1/4] mmc: omap: Enable Auto CMD12 Balaji T K
@ 2012-02-24 15:44 ` Balaji T K
2012-02-24 15:44 ` [PATCH 3/4] mmc: omap: use runtime put sync in probe error patch Balaji T K
2012-02-24 15:44 ` [PATCH 4/4] mmc: omap: context save after enabling runtime pm Balaji T K
3 siblings, 0 replies; 5+ messages in thread
From: Balaji T K @ 2012-02-24 15:44 UTC (permalink / raw)
To: linux-mmc, cjb; +Cc: linux-omap, Balaji T K
Add Dual data rate support for omap_hsmmc
Signed-off-by: Balaji T K <balajitk@ti.com>
---
drivers/mmc/host/omap_hsmmc.c | 5 +++++
1 files changed, 5 insertions(+), 0 deletions(-)
diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
index f4c7f89..c39fb8f 100644
--- a/drivers/mmc/host/omap_hsmmc.c
+++ b/drivers/mmc/host/omap_hsmmc.c
@@ -89,6 +89,7 @@
#define MSBS (1 << 5)
#define BCE (1 << 1)
#define FOUR_BIT (1 << 1)
+#define DDR (1 << 19)
#define DW8 (1 << 5)
#define CC 0x1
#define TC 0x02
@@ -643,6 +644,10 @@ static void omap_hsmmc_set_bus_width(struct omap_hsmmc_host *host)
u32 con;
con = OMAP_HSMMC_READ(host->base, CON);
+ if (ios->timing == MMC_TIMING_UHS_DDR50)
+ con |= DDR; /* configure in DDR mode */
+ else
+ con &= ~DDR;
switch (ios->bus_width) {
case MMC_BUS_WIDTH_8:
OMAP_HSMMC_WRITE(host->base, CON, con | DW8);
--
1.7.0.4
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH 3/4] mmc: omap: use runtime put sync in probe error patch
2012-02-24 15:44 [PATCH 0/4] mmc: omap: add autocmd12, DDR support and runtime fixes Balaji T K
2012-02-24 15:44 ` [PATCH 1/4] mmc: omap: Enable Auto CMD12 Balaji T K
2012-02-24 15:44 ` [PATCH 2/4] mmc: omap: add DDR support to omap_hsmmc Balaji T K
@ 2012-02-24 15:44 ` Balaji T K
2012-02-24 15:44 ` [PATCH 4/4] mmc: omap: context save after enabling runtime pm Balaji T K
3 siblings, 0 replies; 5+ messages in thread
From: Balaji T K @ 2012-02-24 15:44 UTC (permalink / raw)
To: linux-mmc, cjb; +Cc: linux-omap, Balaji T K
pm_runtime_put_sync instead of autosuspend pm runtime API
because iounmap(host->base) follows immediately.
Reported-by: Rajendra Nayak <rnayak@ti.com>
Signed-off-by: Balaji T K <balajitk@ti.com>
---
drivers/mmc/host/omap_hsmmc.c | 3 +--
1 files changed, 1 insertions(+), 2 deletions(-)
diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
index c39fb8f..2576c36 100644
--- a/drivers/mmc/host/omap_hsmmc.c
+++ b/drivers/mmc/host/omap_hsmmc.c
@@ -2101,8 +2101,7 @@ err_reg:
err_irq_cd_init:
free_irq(host->irq, host);
err_irq:
- pm_runtime_mark_last_busy(host->dev);
- pm_runtime_put_autosuspend(host->dev);
+ pm_runtime_put_sync(host->dev);
clk_put(host->fclk);
if (host->got_dbclk) {
clk_disable(host->dbclk);
--
1.7.0.4
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH 4/4] mmc: omap: context save after enabling runtime pm
2012-02-24 15:44 [PATCH 0/4] mmc: omap: add autocmd12, DDR support and runtime fixes Balaji T K
` (2 preceding siblings ...)
2012-02-24 15:44 ` [PATCH 3/4] mmc: omap: use runtime put sync in probe error patch Balaji T K
@ 2012-02-24 15:44 ` Balaji T K
3 siblings, 0 replies; 5+ messages in thread
From: Balaji T K @ 2012-02-24 15:44 UTC (permalink / raw)
To: linux-mmc, cjb; +Cc: linux-omap, Balaji T K
call context save api after enabling runtime pm
to make sure register access in context save api happens with clk enabled.
Signed-off-by: Balaji T K <balajitk@ti.com>
---
drivers/mmc/host/omap_hsmmc.c | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
index 2576c36..0924cc8 100644
--- a/drivers/mmc/host/omap_hsmmc.c
+++ b/drivers/mmc/host/omap_hsmmc.c
@@ -1944,8 +1944,6 @@ static int __init omap_hsmmc_probe(struct platform_device *pdev)
goto err1;
}
- omap_hsmmc_context_save(host);
-
mmc->caps |= MMC_CAP_DISABLE;
if (host->pdata->controller_flags & OMAP_HSMMC_BROKEN_MULTIBLOCK_READ) {
dev_info(&pdev->dev, "multiblock reads disabled due to 35xx erratum 2.1.1.128; MMC read performance may suffer\n");
@@ -1957,6 +1955,8 @@ static int __init omap_hsmmc_probe(struct platform_device *pdev)
pm_runtime_set_autosuspend_delay(host->dev, MMC_AUTOSUSPEND_DELAY);
pm_runtime_use_autosuspend(host->dev);
+ omap_hsmmc_context_save(host);
+
if (cpu_is_omap2430()) {
host->dbclk = clk_get(&pdev->dev, "mmchsdb_fck");
/*
--
1.7.0.4
^ permalink raw reply related [flat|nested] 5+ messages in thread