summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRussell King <rmk+kernel@armlinux.org.uk>2019-05-02 17:43:36 +0100
committerRussell King <rmk+kernel@armlinux.org.uk>2019-05-09 17:16:41 +0100
commit39694ed0dbe17de1eff7850e7481bef98047130c (patch)
treec28618f706451ab29c160c4965d69abc65516870
parent8194468fadaaac5e04558d955e7bff8692212459 (diff)
ARM: riscpc: dma: make state a local variable
Make state a local variable to avoid rewriting it in the DMA loop. Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
-rw-r--r--arch/arm/mach-rpc/dma.c17
1 files changed, 9 insertions, 8 deletions
diff --git a/arch/arm/mach-rpc/dma.c b/arch/arm/mach-rpc/dma.c
index 37750c6493b4..e2b9c95d853b 100644
--- a/arch/arm/mach-rpc/dma.c
+++ b/arch/arm/mach-rpc/dma.c
@@ -99,15 +99,15 @@ static irqreturn_t iomd_dma_handle(int irq, void *dev_id)
{
struct iomd_dma *idma = dev_id;
unsigned long base = idma->base;
+ unsigned int state = idma->state;
+ unsigned int status;
do {
- unsigned int status;
-
status = iomd_readb(base + ST);
if (!(status & DMA_ST_INT))
- return IRQ_HANDLED;
+ goto out;
- if ((idma->state ^ status) & DMA_ST_AB)
+ if ((state ^ status) & DMA_ST_AB)
iomd_get_next_sg(idma);
switch (status & (DMA_ST_OFL | DMA_ST_AB)) {
@@ -115,14 +115,14 @@ static irqreturn_t iomd_dma_handle(int irq, void *dev_id)
case DMA_ST_AB: /* .IB */
iomd_writel(idma->cur_addr, base + CURA);
iomd_writel(idma->cur_len, base + ENDA);
- idma->state = DMA_ST_AB;
+ state = DMA_ST_AB;
break;
case DMA_ST_OFL | DMA_ST_AB: /* OIB */
case 0: /* .IA */
iomd_writel(idma->cur_addr, base + CURB);
iomd_writel(idma->cur_len, base + ENDB);
- idma->state = 0;
+ state = 0;
break;
}
@@ -131,9 +131,10 @@ static irqreturn_t iomd_dma_handle(int irq, void *dev_id)
break;
} while (1);
- idma->state = ~DMA_ST_AB;
+ state = ~DMA_ST_AB;
disable_irq_nosync(irq);
-
+out:
+ idma->state = state;
return IRQ_HANDLED;
}