On 2011-04-13 05:24, Andy Fleming wrote: > On Fri, Mar 11, 2011 at 6:01 AM, Raffaele Recalcati > <lamiapost...@gmail.com> wrote: >> From: Raffaele Recalcati<raffaele.recalc...@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 Recalcati<raffaele.recalc...@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; _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot