On Fri, Mar 16, 2012 at 7:21 PM, Felipe Balbi <balbi@xxxxxx> wrote: > On Fri, Mar 16, 2012 at 07:08:57PM +0530, Venkatraman S wrote: >> From: Balaji T K <balajitk@xxxxxx> >> >> Enable Auto-CMD12 for multi block read/write on HSMMC >> Tested on OMAP4430, OMAP3430 and OMAP2430 SDP >> >> Signed-off-by: Balaji T K <balajitk@xxxxxx> >> Signed-off-by: Venkatraman S <svenkatr@xxxxxx> >> --- >> drivers/mmc/host/omap_hsmmc.c | 16 +++++++++++++--- >> 1 file changed, 13 insertions(+), 3 deletions(-) >> >> diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c >> index f29e1a2..a9ffd70 100644 >> --- a/drivers/mmc/host/omap_hsmmc.c >> +++ b/drivers/mmc/host/omap_hsmmc.c >> @@ -85,6 +85,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 >> @@ -115,6 +116,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 >> @@ -175,6 +177,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; >> @@ -766,6 +769,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; >> @@ -837,11 +842,15 @@ 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 { > > while adding the braces, you broke the coding style. Please fix. > Oops - now fixed (and pushed out). >From 00ae42358249e879698029201e3cbb9ea155305e Mon Sep 17 00:00:00 2001 From: Balaji T K <balajitk@xxxxxx> Date: Fri, 24 Feb 2012 21:14:31 +0530 Subject: [PATCH] mmc: omap: Enable Auto CMD12 Enable Auto-CMD12 for multi block read/write on HSMMC Tested on OMAP4430, OMAP3430 and OMAP2430 SDP Signed-off-by: Balaji T K <balajitk@xxxxxx> Signed-off-by: Venkatraman S <svenkatr@xxxxxx> --- drivers/mmc/host/omap_hsmmc.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c index f29e1a2..729ac72 100644 --- a/drivers/mmc/host/omap_hsmmc.c +++ b/drivers/mmc/host/omap_hsmmc.c @@ -85,6 +85,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 @@ -115,6 +116,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 @@ -175,6 +177,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; @@ -766,6 +769,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; @@ -837,11 +842,14 @@ 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); } /* @@ -1826,6 +1834,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.10.rc0.41.gfa678 -- To unsubscribe from this list: send the line "unsubscribe linux-mmc" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html