| From bcd4bf143c4a4ea3f840bd2757c0625bb186a457 Mon Sep 17 00:00:00 2001 |
| From: Russell King <rmk+kernel@armlinux.org.uk> |
| Date: Thu, 2 May 2019 17:19:18 +0100 |
| Subject: ARM: riscpc: fix DMA |
| |
| [ Upstream commit ffd9a1ba9fdb7f2bd1d1ad9b9243d34e96756ba2 ] |
| |
| DMA got broken a while back in two different ways: |
| 1) a change in the behaviour of disable_irq() to wait for the interrupt |
| to finish executing causes us to deadlock at the end of DMA. |
| 2) a change to avoid modifying the scatterlist left the first transfer |
| uninitialised. |
| |
| DMA is only used with expansion cards, so has gone unnoticed. |
| |
| Fixes: fa4e99899932 ("[ARM] dma: RiscPC: don't modify DMA SG entries") |
| Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| arch/arm/mach-rpc/dma.c | 5 ++++- |
| 1 file changed, 4 insertions(+), 1 deletion(-) |
| |
| diff --git a/arch/arm/mach-rpc/dma.c b/arch/arm/mach-rpc/dma.c |
| index 6d3517dc4772a..82aac38fa2cff 100644 |
| --- a/arch/arm/mach-rpc/dma.c |
| +++ b/arch/arm/mach-rpc/dma.c |
| @@ -131,7 +131,7 @@ static irqreturn_t iomd_dma_handle(int irq, void *dev_id) |
| } while (1); |
| |
| idma->state = ~DMA_ST_AB; |
| - disable_irq(irq); |
| + disable_irq_nosync(irq); |
| |
| return IRQ_HANDLED; |
| } |
| @@ -174,6 +174,9 @@ static void iomd_enable_dma(unsigned int chan, dma_t *dma) |
| DMA_FROM_DEVICE : DMA_TO_DEVICE); |
| } |
| |
| + idma->dma_addr = idma->dma.sg->dma_address; |
| + idma->dma_len = idma->dma.sg->length; |
| + |
| iomd_writeb(DMA_CR_C, dma_base + CR); |
| idma->state = DMA_ST_AB; |
| } |
| -- |
| 2.20.1 |
| |