Patchwork [U-Boot,2/2] mmc: Add a SDHCI quirk for boards that have no CD

login
register
mail settings
Submitter Joe Hershberger
Date Aug. 17, 2012, 8:18 p.m.
Message ID <1345234736-12423-2-git-send-email-joe.hershberger@ni.com>
Download mbox | patch
Permalink /patch/178348/
State Accepted
Commit 470dcc7511431db4210a79ea4e6b14cf109a24dc
Delegated to: Andy Fleming
Headers show

Comments

Joe Hershberger - Aug. 17, 2012, 8:18 p.m.
Some boards have no Card Detect wired.  In that case, set the CD test
bits in the standard interface.

Signed-off-by: Joe Hershberger <joe.hershberger@ni.com>
---
 drivers/mmc/sdhci.c | 17 +++++++++++++++--
 include/sdhci.h     |  7 ++++++-
 2 files changed, 21 insertions(+), 3 deletions(-)

Patch

diff --git a/drivers/mmc/sdhci.c b/drivers/mmc/sdhci.c
index b07dc00..3bb0ad0 100644
--- a/drivers/mmc/sdhci.c
+++ b/drivers/mmc/sdhci.c
@@ -381,12 +381,25 @@  int sdhci_init(struct mmc *mmc)
 		}
 	}
 
+	sdhci_set_power(host, fls(mmc->voltages) - 1);
+
+	if (host->quirks & SDHCI_QUIRK_NO_CD) {
+		unsigned int status;
+
+		sdhci_writel(host, SDHCI_CTRL_CD_TEST_INS | SDHCI_CTRL_CD_TEST,
+			SDHCI_HOST_CONTROL);
+
+		status = sdhci_readl(host, SDHCI_PRESENT_STATE);
+		while ((!(status & SDHCI_CARD_PRESENT)) ||
+		    (!(status & SDHCI_CARD_STATE_STABLE)) ||
+		    (!(status & SDHCI_CARD_DETECT_PIN_LEVEL)))
+			status = sdhci_readl(host, SDHCI_PRESENT_STATE);
+	}
+
 	/* Eable all state */
 	sdhci_writel(host, SDHCI_INT_ALL_MASK, SDHCI_INT_ENABLE);
 	sdhci_writel(host, SDHCI_INT_ALL_MASK, SDHCI_SIGNAL_ENABLE);
 
-	sdhci_set_power(host, fls(mmc->voltages) - 1);
-
 	return 0;
 }
 
diff --git a/include/sdhci.h b/include/sdhci.h
index 9d37183..d41287f 100644
--- a/include/sdhci.h
+++ b/include/sdhci.h
@@ -76,6 +76,8 @@ 
 #define  SDHCI_SPACE_AVAILABLE	0x00000400
 #define  SDHCI_DATA_AVAILABLE	0x00000800
 #define  SDHCI_CARD_PRESENT	0x00010000
+#define  SDHCI_CARD_STATE_STABLE	0x00020000
+#define  SDHCI_CARD_DETECT_PIN_LEVEL	0x00040000
 #define  SDHCI_WRITE_PROTECT	0x00080000
 
 #define SDHCI_HOST_CONTROL	0x28
@@ -87,7 +89,9 @@ 
 #define   SDHCI_CTRL_ADMA1	0x08
 #define   SDHCI_CTRL_ADMA32	0x10
 #define   SDHCI_CTRL_ADMA64	0x18
-#define   SDHCI_CTRL_8BITBUS	0x20
+#define  SDHCI_CTRL_8BITBUS	0x20
+#define  SDHCI_CTRL_CD_TEST_INS	0x40
+#define  SDHCI_CTRL_CD_TEST	0x80
 
 #define SDHCI_POWER_CONTROL	0x29
 #define  SDHCI_POWER_ON		0x01
@@ -219,6 +223,7 @@ 
 #define SDHCI_QUIRK_BROKEN_R1B		(1 << 2)
 #define SDHCI_QUIRK_NO_HISPD_BIT	(1 << 3)
 #define SDHCI_QUIRK_BROKEN_VOLTAGE	(1 << 4)
+#define SDHCI_QUIRK_NO_CD		(1 << 5)
 
 /* to make gcc happy */
 struct sdhci_host;