From: Chunyan Zhang <zhang.chunyan@linaro.org>
To: Ulf Hansson <ulf.hansson@linaro.org>,
Adrian Hunter <adrian.hunter@intel.com>
Cc: linux-mmc@vger.kernel.org, linux-kernel@vger.kernel.org,
Orson Zhai <orsonzhai@gmail.com>,
Baolin Wang <baolin.wang@linaro.org>,
Billows Wu <billows.wu@unisoc.com>,
Jason Wu <jason.wu@unisoc.com>,
Chunyan Zhang <zhang.lyra@gmail.com>
Subject: [PATCH V5 07/10] mmc: sdhci: Add Auto CMD Auto Select support
Date: Thu, 16 Aug 2018 15:54:21 +0800 [thread overview]
Message-ID: <1534406064-10065-8-git-send-email-zhang.chunyan@linaro.org> (raw)
In-Reply-To: <1534406064-10065-1-git-send-email-zhang.chunyan@linaro.org>
As SD Host Controller Specification v4.10 documents:
Host Controller Version 4.10 defines this "Auto CMD Auto Select" mode.
Selection of Auto CMD depends on setting of CMD23 Enable in the Host
Control 2 register which indicates whether card supports CMD23. If CMD23
Enable =1, Auto CMD23 is used and if CMD23 Enable =0, Auto CMD12 is
used. In case of Version 4.10 or later, use of Auto CMD Auto Select is
recommended rather than use of Auto CMD12 Enable or Auto CMD23
Enable.
This patch add this new mode support.
Signed-off-by: Chunyan Zhang <zhang.chunyan@linaro.org>
---
drivers/mmc/host/sdhci.c | 67 ++++++++++++++++++++++++++++++++++++++++--------
drivers/mmc/host/sdhci.h | 2 ++
2 files changed, 58 insertions(+), 11 deletions(-)
diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
index a72ad0d..06c2ae9 100644
--- a/drivers/mmc/host/sdhci.c
+++ b/drivers/mmc/host/sdhci.c
@@ -312,6 +312,23 @@ static void sdhci_config_dma(struct sdhci_host *host)
sdhci_writeb(host, ctrl, SDHCI_HOST_CONTROL);
}
+static void sdhci_enable_cmd23(struct sdhci_host *host)
+{
+ u16 ctrl2;
+
+ /*
+ * This is used along with "Auto CMD Auto Select" feature,
+ * which is introduced from v4.10, if card supports CMD23,
+ * Auto CMD23 should be used instead of Auto CMD12.
+ */
+ if (host->version >= SDHCI_SPEC_410 &&
+ (host->mmc->caps & MMC_CAP_CMD23)) {
+ ctrl2 = sdhci_readw(host, SDHCI_HOST_CONTROL2);
+ ctrl2 |= SDHCI_CMD23_ENABLE;
+ sdhci_writew(host, ctrl2, SDHCI_HOST_CONTROL2);
+ }
+}
+
static void sdhci_init(struct sdhci_host *host, int soft)
{
struct mmc_host *mmc = host->mmc;
@@ -1095,6 +1112,44 @@ static inline bool sdhci_auto_cmd12(struct sdhci_host *host,
!mrq->cap_cmd_during_tfr;
}
+static inline void sdhci_auto_cmd_select(struct sdhci_host *host,
+ struct mmc_command *cmd,
+ u16 *mode)
+{
+ bool use_cmd12 = sdhci_auto_cmd12(host, cmd->mrq) &&
+ (cmd->opcode != SD_IO_RW_EXTENDED);
+ bool use_cmd23 = cmd->mrq->sbc && (host->flags & SDHCI_AUTO_CMD23);
+
+ /*
+ * In case of Version 4.10 or later, use of 'Auto CMD Auto
+ * Select' is recommended rather than use of 'Auto CMD12
+ * Enable' or 'Auto CMD23 Enable'.
+ */
+ if (host->version >= SDHCI_SPEC_410 && (use_cmd12 || use_cmd23)) {
+ *mode |= SDHCI_TRNS_AUTO_SEL;
+ /*
+ * Note no need to set SDHCI_ARGUMENT2 here, since for version
+ * 4.10 and aboves, it doesn't support stuff bits of CMD23
+ * argument but only number of blocks which have been set
+ * already during prepare data.
+ */
+ if (use_cmd23)
+ sdhci_enable_cmd23(host);
+ return;
+ }
+
+ /*
+ * If we are sending CMD23, CMD12 never gets sent
+ * on successful completion (so no Auto-CMD12).
+ */
+ if (use_cmd12) {
+ *mode |= SDHCI_TRNS_AUTO_CMD12;
+ } else if (use_cmd23) {
+ *mode |= SDHCI_TRNS_AUTO_CMD23;
+ sdhci_writel(host, cmd->mrq->sbc->arg, SDHCI_ARGUMENT2);
+ }
+}
+
static void sdhci_set_transfer_mode(struct sdhci_host *host,
struct mmc_command *cmd)
{
@@ -1121,17 +1176,7 @@ static void sdhci_set_transfer_mode(struct sdhci_host *host,
if (mmc_op_multi(cmd->opcode) || data->blocks > 1) {
mode = SDHCI_TRNS_BLK_CNT_EN | SDHCI_TRNS_MULTI;
- /*
- * If we are sending CMD23, CMD12 never gets sent
- * on successful completion (so no Auto-CMD12).
- */
- if (sdhci_auto_cmd12(host, cmd->mrq) &&
- (cmd->opcode != SD_IO_RW_EXTENDED))
- mode |= SDHCI_TRNS_AUTO_CMD12;
- else if (cmd->mrq->sbc && (host->flags & SDHCI_AUTO_CMD23)) {
- mode |= SDHCI_TRNS_AUTO_CMD23;
- sdhci_writel(host, cmd->mrq->sbc->arg, SDHCI_ARGUMENT2);
- }
+ sdhci_auto_cmd_select(host, cmd, &mode);
}
if (data->flags & MMC_DATA_READ)
diff --git a/drivers/mmc/host/sdhci.h b/drivers/mmc/host/sdhci.h
index daf8c1e..a8d5be5 100644
--- a/drivers/mmc/host/sdhci.h
+++ b/drivers/mmc/host/sdhci.h
@@ -43,6 +43,7 @@
#define SDHCI_TRNS_BLK_CNT_EN 0x02
#define SDHCI_TRNS_AUTO_CMD12 0x04
#define SDHCI_TRNS_AUTO_CMD23 0x08
+#define SDHCI_TRNS_AUTO_SEL 0x0C
#define SDHCI_TRNS_READ 0x10
#define SDHCI_TRNS_MULTI 0x20
@@ -186,6 +187,7 @@
#define SDHCI_CTRL_DRV_TYPE_D 0x0030
#define SDHCI_CTRL_EXEC_TUNING 0x0040
#define SDHCI_CTRL_TUNED_CLK 0x0080
+#define SDHCI_CMD23_ENABLE 0x0800
#define SDHCI_CTRL_V4_MODE 0x1000
#define SDHCI_CTRL_64BIT_ADDR 0x2000
#define SDHCI_CTRL_PRESET_VAL_ENABLE 0x8000
--
2.7.4
next prev parent reply other threads:[~2018-08-16 7:55 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-08-16 7:54 [PATCH V5 00/10] mmc: add support for sdhci 4.0 Chunyan Zhang
2018-08-16 7:54 ` [PATCH V5 01/10] mmc: sdhci: Add version V4 definition Chunyan Zhang
2018-08-16 7:54 ` [PATCH V5 02/10] mmc: sdhci: Add sd host v4 mode Chunyan Zhang
2018-08-16 7:54 ` [PATCH V5 03/10] mmc: sdhci: Change SDMA address register for " Chunyan Zhang
2018-08-16 7:54 ` [PATCH V5 04/10] mmc: sdhci: Add ADMA2 64-bit addressing support for V4 mode Chunyan Zhang
2018-08-16 7:54 ` [PATCH V5 05/10] mmc: sdhci: Add 32-bit block count support for v4 mode Chunyan Zhang
2018-08-23 12:48 ` Adrian Hunter
2018-08-16 7:54 ` [PATCH V5 06/10] mmc: sdhci: Disable auto-CMD23 if stuff bits is set in CMD23 argument Chunyan Zhang
2018-08-16 8:19 ` Chunyan Zhang
2018-08-23 12:50 ` Adrian Hunter
2018-08-27 10:07 ` Ulf Hansson
2018-08-27 11:07 ` Chunyan Zhang
2018-08-16 7:54 ` Chunyan Zhang [this message]
2018-08-23 12:55 ` [PATCH V5 07/10] mmc: sdhci: Add Auto CMD Auto Select support Adrian Hunter
2018-08-24 6:52 ` Chunyan Zhang
2018-08-24 6:55 ` Adrian Hunter
2018-08-16 7:54 ` [PATCH V5 08/10] mmc: sdhci: SDMA may use Auto-CMD23 in v4 mode Chunyan Zhang
2018-08-16 7:54 ` [PATCH V5 09/10] mmc: sdhci-sprd: Add Spreadtrum's initial host controller Chunyan Zhang
2018-08-16 7:54 ` [PATCH V5 10/10] dt-bindings: sdhci-sprd: Add bindings for the sdhci-sprd controller Chunyan Zhang
[not found] ` <CAAfSe-sJYD4_9KGo+z8UzYHkdP15qz4=5U42_cT9tA9+B4bk1Q@mail.gmail.com>
2018-08-22 7:16 ` [PATCH V5 00/10] mmc: add support for sdhci 4.0 Chunyan Zhang (张春艳)
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1534406064-10065-8-git-send-email-zhang.chunyan@linaro.org \
--to=zhang.chunyan@linaro.org \
--cc=adrian.hunter@intel.com \
--cc=baolin.wang@linaro.org \
--cc=billows.wu@unisoc.com \
--cc=jason.wu@unisoc.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mmc@vger.kernel.org \
--cc=orsonzhai@gmail.com \
--cc=ulf.hansson@linaro.org \
--cc=zhang.lyra@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).