On 11/13/21 4:15 AM, Sean Anderson wrote: > [ fsl_esdhc commit 7e48a028a42c111ba38a90b86e5f57dace980fa0 ] > > First, we need the waterlevel setting for PIO mode only. Secondy, both DMA > setup code is identical for both directions, except for the data pointer. > Thus, unify them. > > Signed-off-by: Michael Walle <mich...@walle.cc> > Signed-off-by: Sean Anderson <sean.ander...@seco.com>
Reviewed-by: Jaehoon Chung <jh80.ch...@samsung.com> Best Regards, Jaehoon Chung > --- > > (no changes since v1) > > drivers/mmc/fsl_esdhc_imx.c | 89 ++++++++++++++++++++++--------------- > 1 file changed, 52 insertions(+), 37 deletions(-) > > diff --git a/drivers/mmc/fsl_esdhc_imx.c b/drivers/mmc/fsl_esdhc_imx.c > index afc8259323..aa3d0877cb 100644 > --- a/drivers/mmc/fsl_esdhc_imx.c > +++ b/drivers/mmc/fsl_esdhc_imx.c > @@ -279,59 +279,74 @@ static void esdhc_pio_read_write(struct fsl_esdhc_priv > *priv, > } > #endif > > -static int esdhc_setup_data(struct fsl_esdhc_priv *priv, struct mmc *mmc, > - struct mmc_data *data) > +#ifdef CONFIG_SYS_FSL_ESDHC_USE_PIO > +static void esdhc_setup_watermark_level(struct fsl_esdhc_priv *priv, > + struct mmc_data *data) > { > - int timeout; > - uint trans_bytes = data->blocksize * data->blocks; > struct fsl_esdhc *regs = priv->esdhc_regs; > - uint wml_value; > - > - wml_value = data->blocksize/4; > + uint wml_value = data->blocksize / 4; > > if (data->flags & MMC_DATA_READ) { > if (wml_value > WML_RD_WML_MAX) > wml_value = WML_RD_WML_MAX_VAL; > > esdhc_clrsetbits32(®s->wml, WML_RD_WML_MASK, wml_value); > -#ifndef CONFIG_SYS_FSL_ESDHC_USE_PIO > - priv->dma_addr = dma_map_single(data->dest, trans_bytes, > - mmc_get_dma_dir(data)); > - if (upper_32_bits(priv->dma_addr)) > - printf("Cannot use 64 bit addresses with SDMA\n"); > - esdhc_write32(®s->dsaddr, lower_32_bits(priv->dma_addr)); > -#endif > } else { > if (wml_value > WML_WR_WML_MAX) > wml_value = WML_WR_WML_MAX_VAL; > - if (priv->wp_enable) { > - if ((esdhc_read32(®s->prsstat) & > - PRSSTAT_WPSPL) == 0) { > - printf("\nThe SD card is locked. Can not write > to a locked card.\n\n"); > - return -ETIMEDOUT; > - } > - } else { > -#if CONFIG_IS_ENABLED(DM_GPIO) > - if (dm_gpio_is_valid(&priv->wp_gpio) && > - dm_gpio_get_value(&priv->wp_gpio)) { > - printf("\nThe SD card is locked. Can not write > to a locked card.\n\n"); > - return -ETIMEDOUT; > - } > -#endif > - } > > esdhc_clrsetbits32(®s->wml, WML_WR_WML_MASK, > - wml_value << 16); > -#ifndef CONFIG_SYS_FSL_ESDHC_USE_PIO > - priv->dma_addr = dma_map_single((void *)data->src, trans_bytes, > - mmc_get_dma_dir(data)); > - if (upper_32_bits(priv->dma_addr)) > - printf("Cannot use 64 bit addresses with SDMA\n"); > - esdhc_write32(®s->dsaddr, lower_32_bits(priv->dma_addr)); > -#endif > + wml_value << 16); > } > +} > +#endif > > +static void esdhc_setup_dma(struct fsl_esdhc_priv *priv, struct mmc_data > *data) > +{ > + uint trans_bytes = data->blocksize * data->blocks; > + struct fsl_esdhc *regs = priv->esdhc_regs; > + void *buf; > + > + if (data->flags & MMC_DATA_WRITE) > + buf = (void *)data->src; > + else > + buf = data->dest; > + > + priv->dma_addr = dma_map_single(buf, trans_bytes, > + mmc_get_dma_dir(data)); > + if (upper_32_bits(priv->dma_addr)) > + printf("Cannot use 64 bit addresses with SDMA\n"); > + esdhc_write32(®s->dsaddr, lower_32_bits(priv->dma_addr)); > esdhc_write32(®s->blkattr, data->blocks << 16 | data->blocksize); > +} > + > +static int esdhc_setup_data(struct fsl_esdhc_priv *priv, struct mmc *mmc, > + struct mmc_data *data) > +{ > + int timeout; > + bool is_write = data->flags & MMC_DATA_WRITE; > + struct fsl_esdhc *regs = priv->esdhc_regs; > + > + if (is_write) { > + if (priv->wp_enable && !(esdhc_read32(®s->prsstat) & > PRSSTAT_WPSPL)) { > + printf("Cannot write to locked SD card.\n"); > + return -EINVAL; > + } else { > +#if CONFIG_IS_ENABLED(DM_GPIO) > + if (dm_gpio_is_valid(&priv->wp_gpio) && > + dm_gpio_get_value(&priv->wp_gpio)) { > + printf("Cannot write to locked SD card.\n"); > + return -EINVAL; > + } > +#endif > + } > + } > + > +#ifdef CONFIG_SYS_FSL_ESDHC_USE_PIO > + esdhc_setup_watermark_level(priv, data); > +#else > + esdhc_setup_dma(priv, data); > +#endif > > /* Calculate the timeout period for data transactions */ > /* >