From mboxrd@z Thu Jan 1 00:00:00 1970 From: Gary Thomas Date: Thu, 28 Jul 2011 13:25:48 -0600 Subject: [U-Boot] [RFC 2/3][v4] mmc: SEND_OP_COND considers card capabilities (voltage) In-Reply-To: References: <1299844874-7605-1-git-send-email-lamiaposta71@gmail.com> <1299844874-7605-3-git-send-email-lamiaposta71@gmail.com> Message-ID: <4E31B7BC.1030907@gmail.com> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de On 2011-04-13 05:24, Andy Fleming wrote: > On Fri, Mar 11, 2011 at 6:01 AM, Raffaele Recalcati > wrote: >> From: Raffaele Recalcati >> >> 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 >> --- >> 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;