diff mbox series

[1/2] drivers: mmc: Add wait_dat0 support for Freescale eSDHC driver

Message ID 20210817194641.2269-2-stcarlso@linux.microsoft.com
State Accepted
Commit ee02543561d4d776b15ad1ad2f6430b361414102
Delegated to: Jaehoon Chung
Headers show
Series drivers: mmc: Add wait_dat0 support for more devices | expand

Commit Message

Stephen Carlson Aug. 17, 2021, 7:46 p.m. UTC
From: Stephen Carlson <stcarlso@linux.microsoft.com>

Adds an implementation of the wait_dat0 MMC operation for the Freescale
eSHDC 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@linux.microsoft.com>
---
 drivers/mmc/fsl_esdhc.c | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

Comments

Jaehoon Chung Aug. 28, 2021, 5:08 a.m. UTC | #1
On 8/18/21 4:46 AM, stcarlso@linux.microsoft.com wrote:
> From: Stephen Carlson <stcarlso@linux.microsoft.com>
> 
> Adds an implementation of the wait_dat0 MMC operation for the Freescale
> eSHDC 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@linux.microsoft.com>
> ---
>  drivers/mmc/fsl_esdhc.c | 16 ++++++++++++++++
>  1 file changed, 16 insertions(+)
> 
> diff --git a/drivers/mmc/fsl_esdhc.c b/drivers/mmc/fsl_esdhc.c
> index 1d98fa65c4..f74289a677 100644
> --- a/drivers/mmc/fsl_esdhc.c
> +++ b/drivers/mmc/fsl_esdhc.c
> @@ -27,6 +27,7 @@
>  #include <dm/device_compat.h>
>  #include <linux/bitops.h>
>  #include <linux/delay.h>
> +#include <linux/iopoll.h>
>  #include <linux/dma-mapping.h>
>  #include <sdhci.h>
>  
> @@ -1145,6 +1146,20 @@ int fsl_esdhc_hs400_prepare_ddr(struct udevice *dev)
>  	return 0;
>  }
>  
> +static int fsl_esdhc_wait_dat0(struct udevice *dev, int state,
> +			       int timeout_us)
> +{
> +	int ret;

nitpick, doesn't need to use the ret variable.

> +	u32 tmp;
> +	struct fsl_esdhc_priv *priv = dev_get_priv(dev);
> +	struct fsl_esdhc *regs = priv->esdhc_regs;
> +
> +	ret = readx_poll_timeout(esdhc_read32, &regs->prsstat, tmp,
> +				 !!(tmp & PRSSTAT_DAT0) == !!state,
> +				 timeout_us);
> +	return ret;

return readx_poll_timeout(); ?

Other things look good to me.

Reviewed-by: Jaehoon Chung <jh80.chung@samsung.com>

Best Regards,
Jaehoon Chung

> +}
> +
>  static const struct dm_mmc_ops fsl_esdhc_ops = {
>  	.get_cd		= fsl_esdhc_get_cd,
>  	.send_cmd	= fsl_esdhc_send_cmd,
> @@ -1154,6 +1169,7 @@ static const struct dm_mmc_ops fsl_esdhc_ops = {
>  #endif
>  	.reinit = fsl_esdhc_reinit,
>  	.hs400_prepare_ddr = fsl_esdhc_hs400_prepare_ddr,
> +	.wait_dat0 = fsl_esdhc_wait_dat0,
>  };
>  
>  static const struct udevice_id fsl_esdhc_ids[] = {
>
diff mbox series

Patch

diff --git a/drivers/mmc/fsl_esdhc.c b/drivers/mmc/fsl_esdhc.c
index 1d98fa65c4..f74289a677 100644
--- a/drivers/mmc/fsl_esdhc.c
+++ b/drivers/mmc/fsl_esdhc.c
@@ -27,6 +27,7 @@ 
 #include <dm/device_compat.h>
 #include <linux/bitops.h>
 #include <linux/delay.h>
+#include <linux/iopoll.h>
 #include <linux/dma-mapping.h>
 #include <sdhci.h>
 
@@ -1145,6 +1146,20 @@  int fsl_esdhc_hs400_prepare_ddr(struct udevice *dev)
 	return 0;
 }
 
+static int fsl_esdhc_wait_dat0(struct udevice *dev, int state,
+			       int timeout_us)
+{
+	int ret;
+	u32 tmp;
+	struct fsl_esdhc_priv *priv = dev_get_priv(dev);
+	struct fsl_esdhc *regs = priv->esdhc_regs;
+
+	ret = readx_poll_timeout(esdhc_read32, &regs->prsstat, tmp,
+				 !!(tmp & PRSSTAT_DAT0) == !!state,
+				 timeout_us);
+	return ret;
+}
+
 static const struct dm_mmc_ops fsl_esdhc_ops = {
 	.get_cd		= fsl_esdhc_get_cd,
 	.send_cmd	= fsl_esdhc_send_cmd,
@@ -1154,6 +1169,7 @@  static const struct dm_mmc_ops fsl_esdhc_ops = {
 #endif
 	.reinit = fsl_esdhc_reinit,
 	.hs400_prepare_ddr = fsl_esdhc_hs400_prepare_ddr,
+	.wait_dat0 = fsl_esdhc_wait_dat0,
 };
 
 static const struct udevice_id fsl_esdhc_ids[] = {