Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 38d122a9 authored by Russell King's avatar Russell King Committed by Greg Kroah-Hartman
Browse files

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: fa4e9989 ("[ARM] dma: RiscPC: don't modify DMA SG entries")
Signed-off-by: default avatarRussell King <rmk+kernel@armlinux.org.uk>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent dc16a7e5
Loading
Loading
Loading
Loading
+4 −1
Original line number Original line Diff line number Diff line
@@ -131,7 +131,7 @@ static irqreturn_t iomd_dma_handle(int irq, void *dev_id)
	} while (1);
	} while (1);


	idma->state = ~DMA_ST_AB;
	idma->state = ~DMA_ST_AB;
	disable_irq(irq);
	disable_irq_nosync(irq);


	return IRQ_HANDLED;
	return IRQ_HANDLED;
}
}
@@ -174,6 +174,9 @@ static void iomd_enable_dma(unsigned int chan, dma_t *dma)
				DMA_FROM_DEVICE : DMA_TO_DEVICE);
				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);
		iomd_writeb(DMA_CR_C, dma_base + CR);
		idma->state = DMA_ST_AB;
		idma->state = DMA_ST_AB;
	}
	}