On 12/20/2018 10:55 AM, Ley Foon Tan wrote:
> Poll for iDMAC TX/RX interrupt before disable DMA.
> This to prevent disable DMA before data is transfer
> completed.
> 
> Signed-off-by: Ley Foon Tan <ley.foon....@intel.com>

Reviewed-by: Marek Vasut <ma...@denx.de>

> ---
>  drivers/mmc/dw_mmc.c |   19 +++++++++++++++++++
>  include/dwmmc.h      |    7 +++++++
>  2 files changed, 26 insertions(+), 0 deletions(-)
> 
> diff --git a/drivers/mmc/dw_mmc.c b/drivers/mmc/dw_mmc.c
> index 7544b84..93a836e 100644
> --- a/drivers/mmc/dw_mmc.c
> +++ b/drivers/mmc/dw_mmc.c
> @@ -12,6 +12,7 @@
>  #include <memalign.h>
>  #include <mmc.h>
>  #include <dwmmc.h>
> +#include <wait_bit.h>
>  
>  #define PAGE_SIZE 4096
>  
> @@ -55,6 +56,9 @@ static void dwmci_prepare_data(struct dwmci_host *host,
>  
>       dwmci_wait_reset(host, DWMCI_CTRL_FIFO_RESET);
>  
> +     /* Clear IDMAC interrupt */
> +     dwmci_writel(host, DWMCI_IDSTS, 0xFFFFFFFF);
> +
>       data_start = (ulong)cur_idmac;
>       dwmci_writel(host, DWMCI_DBADDR, (ulong)cur_idmac);
>  
> @@ -340,6 +344,18 @@ static int dwmci_send_cmd(struct mmc *mmc, struct 
> mmc_cmd *cmd,
>  
>               /* only dma mode need it */
>               if (!host->fifo_mode) {
> +                     if (data->flags == MMC_DATA_READ)
> +                             mask = DWMCI_IDINTEN_RI;
> +                     else
> +                             mask = DWMCI_IDINTEN_TI;
> +                     ret = wait_for_bit_le32(host->ioaddr + DWMCI_IDSTS,
> +                                             mask, true, 1000, false);
> +                     if (ret)
> +                             debug("%s: DWMCI_IDINTEN mask 0x%x timeout.\n",
> +                                   __func__, mask);
> +                     /* clear interrupts */
> +                     dwmci_writel(host, DWMCI_IDSTS, DWMCI_IDINTEN_MASK);
> +
>                       ctrl = dwmci_readl(host, DWMCI_CTRL);
>                       ctrl &= ~(DWMCI_DMA_EN);
>                       dwmci_writel(host, DWMCI_CTRL, ctrl);
> @@ -494,6 +510,9 @@ static int dwmci_init(struct mmc *mmc)
>       dwmci_writel(host, DWMCI_CLKENA, 0);
>       dwmci_writel(host, DWMCI_CLKSRC, 0);
>  
> +     if (!host->fifo_mode)
> +             dwmci_writel(host, DWMCI_IDINTEN, DWMCI_IDINTEN_MASK);
> +
>       return 0;
>  }
>  
> diff --git a/include/dwmmc.h b/include/dwmmc.h
> index 4ceda5e..f06720d 100644
> --- a/include/dwmmc.h
> +++ b/include/dwmmc.h
> @@ -130,6 +130,13 @@
>  /* UHS register */
>  #define DWMCI_DDR_MODE       (1 << 16)
>  
> +/* Internal IDMAC interrupt defines */
> +#define DWMCI_IDINTEN_RI             BIT(1)
> +#define DWMCI_IDINTEN_TI             BIT(0)
> +
> +#define DWMCI_IDINTEN_MASK   (DWMCI_IDINTEN_TI | \
> +                              DWMCI_IDINTEN_RI)
> +
>  /* quirks */
>  #define DWMCI_QUIRK_DISABLE_SMU              (1 << 0)
>  
> 


-- 
Best regards,
Marek Vasut
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot

Reply via email to