From mboxrd@z Thu Jan 1 00:00:00 1970 From: Marek Vasut Date: Mon, 18 Mar 2019 12:53:18 +0100 Subject: [U-Boot] [PATCH] mmc: correct the HS400 initialization process In-Reply-To: <20190318083059.32462-1-haibo.chen@nxp.com> References: <20190318083059.32462-1-haibo.chen@nxp.com> Message-ID: <496896e8-6c88-1bda-b710-a4aadb1dd66f@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 3/18/19 9:23 AM, BOUGH CHEN wrote: > After the commit b9a2a0e2e9c0 ("mmc: Add support for downgrading > HS200/HS400 to HS mode"), it add a parameter in mmc_set_card_speed() > which indicates that the HS200/HS400 to HS downgrade is happening. > > During the HS400 initialization, first select to HS200, and config > the related clock rate, then downgrade to HS mode. So here also need > to config the downgrade value to be true, make sure in the function > mmc_set_card_speed(), after switch to HS mode, first config the > clock rate, then read the EXT_CSD. Otherwise read EXT_CSD in HS mode > at wrong clock rate, e.g. 200MHz, may lead to uncertain result. I think the fix is right, but the reasoning for it is not. If you call mmc_set_card_speed() with hsdowngrade=true, it will result in calling __mmc_switch() with send_status=false , which in turn means that after issuing the MMC_CMD_SWITCH command, the code won't poll the card using MMC_CMD_SEND_STATUS, but just wait a bit and then switch the bus properties. This is indeed required when switching bus properties. And that's what I think was making your card unstable. Is that the case ? > Test on i.MX8QM MEK board, some Micron eMMC will stuck in transfer > mode in this case, and USDHC will never get data transfer complete > status, cause the uboot hang. > > Signed-off-by: Haibo Chen > --- > drivers/mmc/mmc.c | 3 +-- > 1 file changed, 1 insertion(+), 2 deletions(-) > > diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c > index 1c1527cc74..55d3560b30 100644 > --- a/drivers/mmc/mmc.c > +++ b/drivers/mmc/mmc.c > @@ -1892,8 +1892,7 @@ static int mmc_select_hs400(struct mmc *mmc) > } > > /* Set back to HS */ > - mmc_set_card_speed(mmc, MMC_HS, false); > - mmc_set_clock(mmc, mmc_mode2freq(mmc, MMC_HS), false); > + mmc_set_card_speed(mmc, MMC_HS, true); > > err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_BUS_WIDTH, > EXT_CSD_BUS_WIDTH_8 | EXT_CSD_DDR_FLAG); > -- Best regards, Marek Vasut