From: Raffaele Recalcati <raffaele.recalc...@bticino.it>

The first SEND_OP_COND (CMD1) is used only to ask card capabilities, waiting
that the card is not busy.
After it, an AND operation is done between card capabilities and host
capabilities, (at the moment only for the voltage field).
Finally the correct value is sent to the MMC.

Signed-off-by: Raffaele Recalcati <raffaele.recalc...@bticino.it>
---
 drivers/mmc/mmc.c |   21 +++++++++++++++++++--
 include/mmc.h     |    2 ++
 2 files changed, 21 insertions(+), 2 deletions(-)

diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c
index 53ed36f..acd7479 100644
--- a/drivers/mmc/mmc.c
+++ b/drivers/mmc/mmc.c
@@ -348,17 +348,34 @@ sd_send_op_cond(struct mmc *mmc)
 
 int mmc_send_op_cond(struct mmc *mmc)
 {
-       int timeout = 1000;
+       int timeout = 10000;
        struct mmc_cmd cmd;
        int err;
 
        /* Some cards seem to need this */
        mmc_go_idle(mmc);
 
+       /* Asking to the card its capabilities */
+       do {
+               cmd.cmdidx = MMC_CMD_SEND_OP_COND;
+               cmd.resp_type = MMC_RSP_R3;
+               cmd.cmdarg = 0;
+               cmd.flags = 0;
+
+               err = mmc_send_cmd(mmc, &cmd, NULL);
+
+               if (err)
+                       return err;
+
+               udelay(1000);
+       } while (!(cmd.response[0] & OCR_BUSY) && timeout--);
+
        do {
                cmd.cmdidx = MMC_CMD_SEND_OP_COND;
                cmd.resp_type = MMC_RSP_R3;
-               cmd.cmdarg = OCR_HCS | mmc->voltages;
+               cmd.cmdarg = ((mmc->voltages &
+                             (cmd.response[0] & OCR_VOLTAGE_MASK)) |
+                             (cmd.response[0] & OCR_ACCESS_MODE));
                cmd.flags = 0;
 
                err = mmc_send_cmd(mmc, &cmd, NULL);
diff --git a/include/mmc.h b/include/mmc.h
index 4ee8e1c..d18526d 100644
--- a/include/mmc.h
+++ b/include/mmc.h
@@ -93,6 +93,8 @@
 
 #define OCR_BUSY       0x80000000
 #define OCR_HCS                0x40000000
+#define OCR_VOLTAGE_MASK       0x007FFF80
+#define OCR_ACCESS_MODE                0x60000000
 
 #define MMC_STATUS_MASK                (~0x0206BF7F)
 #define MMC_STATUS_RDY_FOR_DATA (1<<8)
-- 
1.7.0.4

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to