mirror of
https://xff.cz/git/u-boot/
synced 2025-09-07 19:52:15 +02:00
mmc: if possible, poll the busy state using DAT0
Using the DAT0 line as a rdy/busy line is an alternative to reading the status register of the card. It especially useful in situation where the bus is not in a good shape, like when modes are switched. This is also how the linux driver behaves. Note of warning: As per the specification, while polling on DAT0 the CLK must not turned off: "[...] Without a clock edge the Device (unless previously disconnected by a deselect command (CMD7)) will force the DAT0 line down, forever. [...]" Signed-off-by: Jean-Jacques Hiblot <jjhiblot@ti.com>
This commit is contained in:
committed by
Peng Fan
parent
863d10044a
commit
cd0b80ec9c
@@ -47,7 +47,6 @@ int mmc_set_ios(struct mmc *mmc)
|
|||||||
return dm_mmc_set_ios(mmc->dev);
|
return dm_mmc_set_ios(mmc->dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if CONFIG_IS_ENABLED(MMC_UHS_SUPPORT)
|
|
||||||
int dm_mmc_wait_dat0(struct udevice *dev, int state, int timeout)
|
int dm_mmc_wait_dat0(struct udevice *dev, int state, int timeout)
|
||||||
{
|
{
|
||||||
struct dm_mmc_ops *ops = mmc_get_ops(dev);
|
struct dm_mmc_ops *ops = mmc_get_ops(dev);
|
||||||
@@ -61,7 +60,6 @@ int mmc_wait_dat0(struct mmc *mmc, int state, int timeout)
|
|||||||
{
|
{
|
||||||
return dm_mmc_wait_dat0(mmc->dev, state, timeout);
|
return dm_mmc_wait_dat0(mmc->dev, state, timeout);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
int dm_mmc_get_wp(struct udevice *dev)
|
int dm_mmc_get_wp(struct udevice *dev)
|
||||||
{
|
{
|
||||||
|
@@ -29,12 +29,10 @@ static int mmc_select_mode_and_width(struct mmc *mmc, uint card_caps);
|
|||||||
|
|
||||||
#if !CONFIG_IS_ENABLED(DM_MMC)
|
#if !CONFIG_IS_ENABLED(DM_MMC)
|
||||||
|
|
||||||
#if CONFIG_IS_ENABLED(MMC_UHS_SUPPORT)
|
|
||||||
static int mmc_wait_dat0(struct mmc *mmc, int state, int timeout)
|
static int mmc_wait_dat0(struct mmc *mmc, int state, int timeout)
|
||||||
{
|
{
|
||||||
return -ENOSYS;
|
return -ENOSYS;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
__weak int board_mmc_getwp(struct mmc *mmc)
|
__weak int board_mmc_getwp(struct mmc *mmc)
|
||||||
{
|
{
|
||||||
@@ -233,6 +231,10 @@ int mmc_poll_for_busy(struct mmc *mmc, int timeout)
|
|||||||
unsigned int status;
|
unsigned int status;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
|
err = mmc_wait_dat0(mmc, 1, timeout);
|
||||||
|
if (err != -ENOSYS)
|
||||||
|
return err;
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
err = mmc_send_status(mmc, &status);
|
err = mmc_send_status(mmc, &status);
|
||||||
if (err)
|
if (err)
|
||||||
|
@@ -445,7 +445,6 @@ struct dm_mmc_ops {
|
|||||||
int (*execute_tuning)(struct udevice *dev, uint opcode);
|
int (*execute_tuning)(struct udevice *dev, uint opcode);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if CONFIG_IS_ENABLED(MMC_UHS_SUPPORT)
|
|
||||||
/**
|
/**
|
||||||
* wait_dat0() - wait until dat0 is in the target state
|
* wait_dat0() - wait until dat0 is in the target state
|
||||||
* (CLK must be running during the wait)
|
* (CLK must be running during the wait)
|
||||||
@@ -456,7 +455,6 @@ struct dm_mmc_ops {
|
|||||||
* @return 0 if dat0 is in the target state, -ve on error
|
* @return 0 if dat0 is in the target state, -ve on error
|
||||||
*/
|
*/
|
||||||
int (*wait_dat0)(struct udevice *dev, int state, int timeout);
|
int (*wait_dat0)(struct udevice *dev, int state, int timeout);
|
||||||
#endif
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#define mmc_get_ops(dev) ((struct dm_mmc_ops *)(dev)->driver->ops)
|
#define mmc_get_ops(dev) ((struct dm_mmc_ops *)(dev)->driver->ops)
|
||||||
|
Reference in New Issue
Block a user