On 05/15/2017 03:07 PM, Ziyuan Xu wrote: > Card devices get into busy status since host request speed mode > switch, if host controller is able to query whether the device is busy, > try it instead of sending cmd13.
This patch is similar to one of Jean-Jacques's patches. > > Signed-off-by: Ziyuan Xu <xzy...@rock-chips.com> > --- > > drivers/mmc/mmc-uclass.c | 16 ++++++++++++++++ > drivers/mmc/mmc.c | 13 +++++++++++++ > include/mmc.h | 11 +++++++++++ > 3 files changed, 40 insertions(+) > > diff --git a/drivers/mmc/mmc-uclass.c b/drivers/mmc/mmc-uclass.c > index 9c07871..a300a6d 100644 > --- a/drivers/mmc/mmc-uclass.c > +++ b/drivers/mmc/mmc-uclass.c > @@ -38,6 +38,22 @@ int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, > struct mmc_data *data) > return dm_mmc_send_cmd(mmc->dev, cmd, data); > } > > +bool mmc_card_busy(struct mmc *mmc) > +{ > + struct dm_mmc_ops *ops = mmc_get_ops(mmc->dev); > + > + if (!ops->card_busy) > + return -ENOSYS; return is ENOSYS but this function is return bool type..fix it. > + return ops->card_busy(mmc->dev); > +} > + > +bool mmc_can_card_busy(struct mmc *mmc) > +{ > + struct dm_mmc_ops *ops = mmc_get_ops(mmc->dev); > + > + return !!ops->card_busy; > +} > + > int dm_mmc_set_ios(struct udevice *dev) > { > struct dm_mmc_ops *ops = mmc_get_ops(dev); > diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c > index 0b30172..13d8f04 100644 > --- a/drivers/mmc/mmc.c > +++ b/drivers/mmc/mmc.c > @@ -1156,6 +1156,19 @@ static void mmc_set_ios(struct mmc *mmc) > if (mmc->cfg->ops->set_ios) > mmc->cfg->ops->set_ios(mmc); > } > + > +static bool mmc_card_busy(struct mmc *mmc) > +{ > + if (!mmc->cfg->ops->card_busy) > + return -ENOSYS; > + > + return mmc->cfg->ops->card_busy(mmc); ditto. > +} > + > +static bool mmc_can_card_busy(struct mmc *) > +{ > + return !!mmc->cfg->ops->card_busy; > +} > #endif > > void mmc_set_clock(struct mmc *mmc, uint clock) > diff --git a/include/mmc.h b/include/mmc.h > index 060c1f8..9bed935 100644 > --- a/include/mmc.h > +++ b/include/mmc.h > @@ -357,6 +357,14 @@ struct dm_mmc_ops { > struct mmc_data *data); > > /** > + * card_busy() - Query the card device status > + * > + * @dev: Device to update > + * @return true if card device is busy > + */ > + bool (*card_busy)(struct udevice *dev); > + > + /** > * set_ios() - Set the I/O speed/width for an MMC device > * > * @dev: Device to update > @@ -390,12 +398,15 @@ int dm_mmc_get_cd(struct udevice *dev); > int dm_mmc_get_wp(struct udevice *dev); > > /* Transition functions for compatibility */ > +bool mmc_card_busy(struct mmc *mmc); > +bool mmc_can_card_busy(struct mmc *mmc); > int mmc_set_ios(struct mmc *mmc); > int mmc_getcd(struct mmc *mmc); > int mmc_getwp(struct mmc *mmc); > > #else > struct mmc_ops { > + bool (*card_busy)(struct mmc *mmc); > int (*send_cmd)(struct mmc *mmc, > struct mmc_cmd *cmd, struct mmc_data *data); > int (*set_ios)(struct mmc *mmc); > _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot