
On 2011-04-13 05:24, Andy Fleming wrote:
On Fri, Mar 11, 2011 at 6:01 AM, Raffaele Recalcati lamiaposta71@gmail.com wrote:
From: Raffaele Recalcatiraffaele.recalcati@bticino.it
The first SEND_OP_COND (CMD1) command added is used to ask card capabilities. 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, waiting that the card exits from busy state.
Signed-off-by: Raffaele Recalcatiraffaele.recalcati@bticino.it
drivers/mmc/mmc.c | 19 +++++++++++++++++-- include/mmc.h | 2 ++ 2 files changed, 19 insertions(+), 2 deletions(-)
diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c index fc1792a..5bea476 100644 --- a/drivers/mmc/mmc.c +++ b/drivers/mmc/mmc.c @@ -351,17 +351,32 @@ 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 */
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);
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));
My concern here is that OCR_HCS has been dropped. I thought it was necessary to query the HCS abilities.
I'm guessing I'm missing something, or that it's not needed, so I will apply this patch, and we'll see if anyone has issues.
I just tried this on my eMMC chip (THGBM1G5D2EBAI7) and without the OCR_HCS bit set, the device gets totally hosed. Only a power cycle will fix it.
Adding it back like this fixes the problem: diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c index 21aedba..76117da 100644 --- a/drivers/mmc/mmc.c +++ b/drivers/mmc/mmc.c @@ -446,7 +446,7 @@ int mmc_send_op_cond(struct mmc *mmc) cmd.cmdidx = MMC_CMD_SEND_OP_COND; cmd.resp_type = MMC_RSP_R3; cmd.cmdarg = (mmc_host_is_spi(mmc) ? 0 : - (mmc->voltages & + OCR_HCS | (mmc->voltages & (cmd.response[0] & OCR_VOLTAGE_MASK)) | (cmd.response[0] & OCR_ACCESS_MODE)); cmd.flags = 0;