summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorƁukasz Majewski <l.majewski@samsung.com>2011-07-05 02:19:44 +0000
committerAndy Fleming <afleming@freescale.com>2011-07-15 20:29:21 -0500
commitb1f1e821d335de58d362bf3013c93cef86cdb356 (patch)
tree0f058682c3f873e291671d93f8be6e7275431c73
parentafb35666da107ccac076b30aed1ad90e7bbcffae (diff)
downloadu-boot-b1f1e821d335de58d362bf3013c93cef86cdb356.tar.gz
u-boot-b1f1e821d335de58d362bf3013c93cef86cdb356.tar.xz
u-boot-b1f1e821d335de58d362bf3013c93cef86cdb356.zip
mmc: Access mode validation for eMMC cards > 2 GiB
This patch provides handling of the two way handshake when SEND_OP_COND (CMD1) is send to mmc card. It is necessary to inform eMMC card if the host can work with high capacity cards (Jedec JESD84-A441, point 7.4.3). The extra flag MMC_MODE_HC (high capacity) is added to indicate if the host is capable of handling the high capacity eMMC cards. Since this change is added to the generic mmc framework, then it requires other boards to indicate if their mmc controllers can handle high capacity cards. As it is now - the old behaviour of the framework is preserved. Signed-off-by: Lukasz Majewski <l.majewski@samsung.com> Signed-off-by: Andy Fleming <afleming@freescale.com>
-rw-r--r--drivers/mmc/mmc.c6
-rw-r--r--drivers/mmc/s5p_mmc.c2
-rw-r--r--include/mmc.h1
3 files changed, 7 insertions, 2 deletions
diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c
index 4e4e0fb0f3..cbd75673b8 100644
--- a/drivers/mmc/mmc.c
+++ b/drivers/mmc/mmc.c
@@ -531,6 +531,10 @@ int mmc_send_op_cond(struct mmc *mmc)
(mmc->voltages &
(cmd.response[0] & OCR_VOLTAGE_MASK)) |
(cmd.response[0] & OCR_ACCESS_MODE));
+
+ if (mmc->host_caps & MMC_MODE_HC)
+ cmd.cmdarg |= OCR_HCS;
+
cmd.flags = 0;
err = mmc_send_cmd(mmc, &cmd, NULL);
@@ -1010,7 +1014,7 @@ int mmc_startup(struct mmc *mmc)
capacity = ext_csd[212] << 0 | ext_csd[213] << 8 |
ext_csd[214] << 16 | ext_csd[215] << 24;
capacity *= 512;
- if (capacity > 2 * 1024 * 1024 * 1024)
+ if ((capacity >> 20) > 2 * 1024)
mmc->capacity = capacity;
}
diff --git a/drivers/mmc/s5p_mmc.c b/drivers/mmc/s5p_mmc.c
index 280738fbf4..f1368132a3 100644
--- a/drivers/mmc/s5p_mmc.c
+++ b/drivers/mmc/s5p_mmc.c
@@ -462,7 +462,7 @@ static int s5p_mmc_initialize(int dev_index, int bus_width)
mmc->host_caps = MMC_MODE_8BIT;
else
mmc->host_caps = MMC_MODE_4BIT;
- mmc->host_caps |= MMC_MODE_HS_52MHz | MMC_MODE_HS;
+ mmc->host_caps |= MMC_MODE_HS_52MHz | MMC_MODE_HS | MMC_MODE_HC;
mmc->f_min = 400000;
mmc->f_max = 52000000;
diff --git a/include/mmc.h b/include/mmc.h
index 1c8a360717..53aff9b4b4 100644
--- a/include/mmc.h
+++ b/include/mmc.h
@@ -45,6 +45,7 @@
#define MMC_MODE_4BIT 0x100
#define MMC_MODE_8BIT 0x200
#define MMC_MODE_SPI 0x400
+#define MMC_MODE_HC 0x800
#define SD_DATA_4BIT 0x00040000