aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux-4.19/linux-yocto-4.19.8/0593-mmc-sdhci-Add-Auto-CMD-Auto-Select-support.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux-4.19/linux-yocto-4.19.8/0593-mmc-sdhci-Add-Auto-CMD-Auto-Select-support.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux-4.19/linux-yocto-4.19.8/0593-mmc-sdhci-Add-Auto-CMD-Auto-Select-support.patch113
1 files changed, 113 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux-4.19/linux-yocto-4.19.8/0593-mmc-sdhci-Add-Auto-CMD-Auto-Select-support.patch b/meta-amd-bsp/recipes-kernel/linux-4.19/linux-yocto-4.19.8/0593-mmc-sdhci-Add-Auto-CMD-Auto-Select-support.patch
new file mode 100644
index 00000000..4720ed08
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux-4.19/linux-yocto-4.19.8/0593-mmc-sdhci-Add-Auto-CMD-Auto-Select-support.patch
@@ -0,0 +1,113 @@
+From 617616fd33191d24f183614369e67505d341b65e Mon Sep 17 00:00:00 2001
+From: Sudheesh Mavila <sudheesh.mavila@amd.com>
+Date: Tue, 22 Jan 2019 23:01:11 +0530
+Subject: [PATCH 0593/2940] mmc: sdhci: Add Auto CMD Auto Select support
+
+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: Sudheesh Mavila <sudheesh.mavila@amd.com>
+---
+ drivers/mmc/host/sdhci.c | 49 ++++++++++++++++++++++++++++++++--------
+ drivers/mmc/host/sdhci.h | 2 ++
+ 2 files changed, 41 insertions(+), 10 deletions(-)
+
+diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
+index b109251aff9e..55a84e79d591 100644
+--- a/drivers/mmc/host/sdhci.c
++++ b/drivers/mmc/host/sdhci.c
+@@ -1094,6 +1094,43 @@ 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);
++ u16 ctrl2;
++
++ /*
++ * 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;
++
++ ctrl2 = sdhci_readw(host, SDHCI_HOST_CONTROL2);
++ if (use_cmd23)
++ ctrl2 |= SDHCI_CMD23_ENABLE;
++ else
++ ctrl2 &= ~SDHCI_CMD23_ENABLE;
++ sdhci_writew(host, ctrl2, SDHCI_HOST_CONTROL2);
++
++ 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;
++}
++
+ static void sdhci_set_transfer_mode(struct sdhci_host *host,
+ struct mmc_command *cmd)
+ {
+@@ -1122,17 +1159,9 @@ 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_auto_cmd_select(host, cmd, &mode);
++ if (cmd->mrq->sbc && (host->flags & SDHCI_AUTO_CMD23))
+ sdhci_writel(host, cmd->mrq->sbc->arg, SDHCI_ARGUMENT2);
+- }
+ }
+
+ if (data->flags & MMC_DATA_READ)
+diff --git a/drivers/mmc/host/sdhci.h b/drivers/mmc/host/sdhci.h
+index 22b448c8b7f9..65fe35e9673d 100755
+--- a/drivers/mmc/host/sdhci.h
++++ b/drivers/mmc/host/sdhci.h
+@@ -42,6 +42,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
+
+@@ -185,6 +186,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.17.1
+