From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jaehoon Chung Date: Thu, 25 May 2017 22:02:28 +0900 Subject: [U-Boot] [PATCH 06/33] mmc: add card_busy to query card status In-Reply-To: <1494828447-24332-6-git-send-email-xzy.xu@rock-chips.com> References: <1494828447-24332-1-git-send-email-xzy.xu@rock-chips.com> <1494828447-24332-6-git-send-email-xzy.xu@rock-chips.com> Message-ID: <86a1909b-4420-1179-1483-2cdf359c99f9@samsung.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 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 > --- > > 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); >