[PATCH] mmc: dw_mmc: Fixes data read when receiving DTO interrupt in FIFO mode

Jaehoon Chung jh80.chung at samsung.com
Tue Apr 27 00:15:04 CEST 2021


On 4/26/21 12:35 PM, Ley Foon Tan wrote:
> The data read is not working when using FIFO mode.
> 
>>From DesignWare databook, when a Data_Transfer_Over (DTO) interrupt is
> received, the software should read the remaining data from FIFO.
> 
> Add DTO interrupt checking on data read path and clear interrupts before
> start reading from FIFO. So, it doesn't clear the next pending
> interrupts unintentionally after read from FIFO.
> 
> Signed-off-by: Ley Foon Tan <ley.foon.tan at intel.com>

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

Best Regards,
Jaehoon Chung

> ---
>  drivers/mmc/dw_mmc.c | 6 +++---
>  1 file changed, 3 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/mmc/dw_mmc.c b/drivers/mmc/dw_mmc.c
> index 7c8a312fa71a..a949dad57402 100644
> --- a/drivers/mmc/dw_mmc.c
> +++ b/drivers/mmc/dw_mmc.c
> @@ -166,7 +166,9 @@ static int dwmci_data_transfer(struct dwmci_host *host, struct mmc_data *data)
>  		if (host->fifo_mode && size) {
>  			len = 0;
>  			if (data->flags == MMC_DATA_READ &&
> -			    (mask & DWMCI_INTMSK_RXDR)) {
> +			    (mask & (DWMCI_INTMSK_RXDR | DWMCI_INTMSK_DTO))) {
> +				dwmci_writel(host, DWMCI_RINTSTS,
> +					     DWMCI_INTMSK_RXDR | DWMCI_INTMSK_DTO);
>  				while (size) {
>  					ret = dwmci_fifo_ready(host,
>  							DWMCI_FIFO_EMPTY,
> @@ -182,8 +184,6 @@ static int dwmci_data_transfer(struct dwmci_host *host, struct mmc_data *data)
>  						dwmci_readl(host, DWMCI_DATA);
>  					size = size > len ? (size - len) : 0;
>  				}
> -				dwmci_writel(host, DWMCI_RINTSTS,
> -					     DWMCI_INTMSK_RXDR);
>  			} else if (data->flags == MMC_DATA_WRITE &&
>  				   (mask & DWMCI_INTMSK_TXDR)) {
>  				while (size) {
> 



More information about the U-Boot mailing list