mirror of
https://source.denx.de/u-boot/u-boot.git
synced 2026-05-05 12:46:14 +02:00
This commit is contained in:
commit
6f1b951500
@ -398,6 +398,26 @@ int mmc_send_tuning(struct mmc *mmc, u32 opcode, int *cmd_error)
|
||||
}
|
||||
#endif
|
||||
|
||||
int mmc_send_stop_transmission(struct mmc *mmc, bool write)
|
||||
{
|
||||
struct mmc_cmd cmd;
|
||||
|
||||
cmd.cmdidx = MMC_CMD_STOP_TRANSMISSION;
|
||||
cmd.cmdarg = 0;
|
||||
/*
|
||||
* JEDEC Standard No. 84-B51 Page 126
|
||||
* CMD12 STOP_TRANSMISSION R1/R1b[3]
|
||||
* NOTE 3 R1 for read cases and R1b for write cases.
|
||||
*
|
||||
* Physical Layer Simplified Specification Version 9.00
|
||||
* 7.3.1.3 Detailed Command Description
|
||||
* CMD12 R1b
|
||||
*/
|
||||
cmd.resp_type = (IS_SD(mmc) || write) ? MMC_RSP_R1b : MMC_RSP_R1;
|
||||
|
||||
return mmc_send_cmd(mmc, &cmd, NULL);
|
||||
}
|
||||
|
||||
static int mmc_read_blocks(struct mmc *mmc, void *dst, lbaint_t start,
|
||||
lbaint_t blkcnt)
|
||||
{
|
||||
@ -425,10 +445,7 @@ static int mmc_read_blocks(struct mmc *mmc, void *dst, lbaint_t start,
|
||||
return 0;
|
||||
|
||||
if (blkcnt > 1) {
|
||||
cmd.cmdidx = MMC_CMD_STOP_TRANSMISSION;
|
||||
cmd.cmdarg = 0;
|
||||
cmd.resp_type = MMC_RSP_R1b;
|
||||
if (mmc_send_cmd(mmc, &cmd, NULL)) {
|
||||
if (mmc_send_stop_transmission(mmc, false)) {
|
||||
#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
|
||||
pr_err("mmc fail to send stop cmd\n");
|
||||
#endif
|
||||
@ -2223,6 +2240,7 @@ error:
|
||||
mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
|
||||
EXT_CSD_BUS_WIDTH, EXT_CSD_BUS_WIDTH_1);
|
||||
mmc_select_mode(mmc, MMC_LEGACY);
|
||||
mmc_set_clock(mmc, mmc->legacy_speed, MMC_CLK_ENABLE);
|
||||
mmc_set_bus_width(mmc, 1);
|
||||
}
|
||||
}
|
||||
|
||||
@ -611,6 +611,17 @@ int renesas_sdhi_execute_tuning(struct udevice *dev, uint opcode)
|
||||
priv->smpcmp |= BIT(i);
|
||||
|
||||
mdelay(1);
|
||||
|
||||
/*
|
||||
* eMMC specification specifies that CMD12 can be used to stop a tuning
|
||||
* command, but SD specification does not, so do nothing unless it is
|
||||
* eMMC.
|
||||
*/
|
||||
if (ret && (opcode == MMC_CMD_SEND_TUNING_BLOCK_HS200)) {
|
||||
ret = mmc_send_stop_transmission(mmc, false);
|
||||
if (ret < 0)
|
||||
dev_dbg(dev, "Tuning abort fail (%d)\n", ret);
|
||||
}
|
||||
}
|
||||
|
||||
ret = renesas_sdhi_select_tuning(priv, taps);
|
||||
|
||||
@ -558,6 +558,8 @@ int mmc_deferred_probe(struct mmc *mmc);
|
||||
int mmc_reinit(struct mmc *mmc);
|
||||
int mmc_get_b_max(struct mmc *mmc, void *dst, lbaint_t blkcnt);
|
||||
int mmc_hs400_prepare_ddr(struct mmc *mmc);
|
||||
int mmc_send_stop_transmission(struct mmc *mmc, bool write);
|
||||
|
||||
#else
|
||||
struct mmc_ops {
|
||||
int (*send_cmd)(struct mmc *mmc,
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user