summaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorPierre Ossman <drzeus@drzeus.cx>2006-11-08 23:03:10 +0100
committerPierre Ossman <drzeus@drzeus.cx>2006-12-01 18:53:37 +0100
commit7ccd266e676a3f0c6f8f897f58b684cac3dd1650 (patch)
treeaba8632fc523c5c663a56876ce67c580ce8d38eb /include
parent73778120c4088a0a7b59c4c378904f7a230b4820 (diff)
downloadkernel-crypto-7ccd266e676a3f0c6f8f897f58b684cac3dd1650.tar.gz
kernel-crypto-7ccd266e676a3f0c6f8f897f58b684cac3dd1650.tar.xz
kernel-crypto-7ccd266e676a3f0c6f8f897f58b684cac3dd1650.zip
mmc: Support for high speed SD cards
Modern SD cards support a clock speed of 50 MHz. Make sure we test for this capability and do the song and dance required to activate it. Activating high speed support actually modifies the TRAN_SPEED field of the CSD. But as the spec says that the cards must report 50 MHz, we might as well skip re-reading the CSD. Signed-off-by: Pierre Ossman <drzeus@drzeus.cx>
Diffstat (limited to 'include')
-rw-r--r--include/linux/mmc/card.h7
-rw-r--r--include/linux/mmc/protocol.h22
2 files changed, 28 insertions, 1 deletions
diff --git a/include/linux/mmc/card.h b/include/linux/mmc/card.h
index ce25256f80d..d0e6a549761 100644
--- a/include/linux/mmc/card.h
+++ b/include/linux/mmc/card.h
@@ -50,6 +50,10 @@ struct sd_scr {
#define SD_SCR_BUS_WIDTH_4 (1<<2)
};
+struct sd_switch_caps {
+ unsigned int hs_max_dtr;
+};
+
struct mmc_host;
/*
@@ -66,7 +70,7 @@ struct mmc_card {
#define MMC_STATE_BAD (1<<2) /* unrecognised device */
#define MMC_STATE_SDCARD (1<<3) /* is an SD card */
#define MMC_STATE_READONLY (1<<4) /* card is read-only */
-#define MMC_STATE_HIGHSPEED (1<<5) /* card is in mmc4 highspeed mode */
+#define MMC_STATE_HIGHSPEED (1<<5) /* card is in high speed mode */
u32 raw_cid[4]; /* raw card CID */
u32 raw_csd[4]; /* raw card CSD */
u32 raw_scr[2]; /* raw card SCR */
@@ -74,6 +78,7 @@ struct mmc_card {
struct mmc_csd csd; /* card specific */
struct mmc_ext_csd ext_csd; /* mmc v4 extended card specific */
struct sd_scr scr; /* extra SD information */
+ struct sd_switch_caps sw_caps; /* switch (CMD6) caps */
};
#define mmc_card_present(c) ((c)->state & MMC_STATE_PRESENT)
diff --git a/include/linux/mmc/protocol.h b/include/linux/mmc/protocol.h
index 45c51fd8578..2dce60c43f4 100644
--- a/include/linux/mmc/protocol.h
+++ b/include/linux/mmc/protocol.h
@@ -82,6 +82,7 @@
/* class 8 */
/* This is basically the same command as for MMC with some quirks. */
#define SD_SEND_RELATIVE_ADDR 3 /* bcr R6 */
+#define SD_SWITCH 6 /* adtc [31:0] See below R1 */
/* Application commands */
#define SD_APP_SET_BUS_WIDTH 6 /* ac [1:0] bus width R1 */
@@ -101,6 +102,19 @@
*/
/*
+ * SD_SWITCH argument format:
+ *
+ * [31] Check (0) or switch (1)
+ * [30:24] Reserved (0)
+ * [23:20] Function group 6
+ * [19:16] Function group 5
+ * [15:12] Function group 4
+ * [11:8] Function group 3
+ * [7:4] Function group 2
+ * [3:0] Function group 1
+ */
+
+/*
MMC status in R1
Type
e : error bit
@@ -285,6 +299,14 @@ struct _mmc_csd {
#define MMC_SWITCH_MODE_WRITE_BYTE 0x03 /* Set target to value */
/*
+ * SCR field definitions
+ */
+
+#define SCR_SPEC_VER_0 0 /* Implements system specification 1.0 - 1.01 */
+#define SCR_SPEC_VER_1 1 /* Implements system specification 1.10 */
+#define SCR_SPEC_VER_2 2 /* Implements system specification 2.00 */
+
+/*
* SD bus widths
*/
#define SD_BUS_WIDTH_1 0