[PATCH 2/2] drivers: mmc: Add wait_dat0 support for sdhci driver
Stephen Carlson
stcarlso at linux.microsoft.com
Tue Aug 31 20:11:06 CEST 2021
Jaehoon,
readx_poll_timeout expands to read_poll_timeout which accepts the signature:
read_poll_timeout(op, addr, val, cond, sleep_us, timeout_us)
sdhci_readl requires two arguments, host and SHCI_PRESENT_STATE, which
cannot both be provided to that macro in the addr parameter. One potential
workaround would be to declare a static helper function to call
sdhci_readl with a constant second parameter, but this proposal would
increase function call overhead and stack usage. Is it worth changing for
the readability improvement?
Thanks,
Stephen Carlson
-----Original Message-----
From: Jaehoon Chung <jh80.chung at samsung.com>
Sent: Friday, August 27, 2021 10:14 PM
To: stcarlso at linux.microsoft.com; u-boot at lists.denx.de
Cc: Peng Fan <peng.fan at nxp.com>
Subject: Re: [PATCH 2/2] drivers: mmc: Add wait_dat0 support for sdhci
driver
On 8/18/21 4:46 AM, stcarlso at linux.microsoft.com wrote:
> From: Stephen Carlson <stcarlso at linux.microsoft.com>
>
> Adds an implementation of the wait_dat0 MMC operation for the DM SDHCI
> driver, allowing the driver to continue when the card is ready rather
> than waiting for the worst case time on each MMC switch operation.
>
> Signed-off-by: Stephen Carlson <stcarlso at linux.microsoft.com>
> ---
> drivers/mmc/sdhci.c | 20 ++++++++++++++++++++
> include/sdhci.h | 2 ++
> 2 files changed, 22 insertions(+)
>
> diff --git a/drivers/mmc/sdhci.c b/drivers/mmc/sdhci.c index
> eea4701d8a..bb55e00ef5 100644
> --- a/drivers/mmc/sdhci.c
> +++ b/drivers/mmc/sdhci.c
> @@ -775,6 +775,25 @@ static int sdhci_get_cd(struct udevice *dev)
> return value;
> }
>
> +static int sdhci_wait_dat0(struct udevice *dev, int state,
> + int timeout_us)
> +{
> + int tmp;
> + struct mmc *mmc = mmc_get_mmc_dev(dev);
> + struct sdhci_host *host = mmc->priv;
> + unsigned long timeout = timer_get_us() + timeout_us;
> +
> + // readx_poll_timeout is unsuitable because sdhci_readl accepts
> + // two arguments
Removed the comment or use "/* */" instead of "//"
And i didn't understand what's unsuitable?
Best Regards,
Jaehoon Chung
> + do {
> + tmp = sdhci_readl(host, SDHCI_PRESENT_STATE);
> + if (!!(tmp & SDHCI_DATA_0_LVL_MASK) == !!state)
> + return 0;
> + } while (!timeout_us || !time_after(timer_get_us(), timeout));
> +
> + return -ETIMEDOUT;
> +}
> +
> const struct dm_mmc_ops sdhci_ops = {
> .send_cmd = sdhci_send_command,
> .set_ios = sdhci_set_ios,
> @@ -783,6 +802,7 @@ const struct dm_mmc_ops sdhci_ops = { #ifdef
> MMC_SUPPORTS_TUNING
> .execute_tuning = sdhci_execute_tuning,
> #endif
> + .wait_dat0 = sdhci_wait_dat0,
> };
> #else
> static const struct mmc_ops sdhci_ops = { diff --git
> a/include/sdhci.h b/include/sdhci.h index 0ae9471ad7..dd4eb41442
> 100644
> --- a/include/sdhci.h
> +++ b/include/sdhci.h
> @@ -65,6 +65,8 @@
> #define SDHCI_CARD_STATE_STABLE BIT(17)
> #define SDHCI_CARD_DETECT_PIN_LEVEL BIT(18)
> #define SDHCI_WRITE_PROTECT BIT(19)
> +#define SDHCI_DATA_LVL_MASK 0x00F00000
> +#define SDHCI_DATA_0_LVL_MASK BIT(20)
>
> #define SDHCI_HOST_CONTROL 0x28
> #define SDHCI_CTRL_LED BIT(0)
>
More information about the U-Boot
mailing list