From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jaehoon Chung Date: Tue, 27 Apr 2021 07:15:04 +0900 Subject: [PATCH] mmc: dw_mmc: Fixes data read when receiving DTO interrupt in FIFO mode In-Reply-To: <20210426033505.1906-1-ley.foon.tan@intel.com> References: <20210426033505.1906-1-ley.foon.tan@intel.com> Message-ID: <4b7cd861-04cc-bd0b-f921-00c0025a65f4@samsung.com> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de 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 Reviewed-by: Jaehoon Chung 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) { >