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

Commit bda3a47c authored by Nikolaus Voss's avatar Nikolaus Voss Committed by Vinod Koul
Browse files

at_hdmac: bugfix for enabling channel irq



commit 46389470 deleted redundant
chan_id and chancnt initialization in dma drivers as this is done
in dma_async_device_register().

However, atc_enable_irq() relied on chan_id set before registering
the device, what left only channel 0 functional for this driver.

This patch introduces atc_enable/disable_chan_irq() as a variant
of atc_enable/disable_irq() with the channel as explicit argument.

Signed-off-by: default avatarNikolaus Voss <n.voss@weinmann.de>
Signed-off-by: default avatarNicolas Ferre <nicolas.ferre@atmel.com>
Cc: stable <stable@vger.kernel.org>
Signed-off-by: default avatarVinod Koul <vinod.koul@linux.intel.com>
parent dcd6c922
Loading
Loading
Loading
Loading
+2 −2
Original line number Original line Diff line number Diff line
@@ -1343,7 +1343,7 @@ static int __init at_dma_probe(struct platform_device *pdev)


		tasklet_init(&atchan->tasklet, atc_tasklet,
		tasklet_init(&atchan->tasklet, atc_tasklet,
				(unsigned long)atchan);
				(unsigned long)atchan);
		atc_enable_irq(atchan);
		atc_enable_chan_irq(atdma, i);
	}
	}


	/* set base routines */
	/* set base routines */
@@ -1410,7 +1410,7 @@ static int __exit at_dma_remove(struct platform_device *pdev)
		struct at_dma_chan	*atchan = to_at_dma_chan(chan);
		struct at_dma_chan	*atchan = to_at_dma_chan(chan);


		/* Disable interrupts */
		/* Disable interrupts */
		atc_disable_irq(atchan);
		atc_disable_chan_irq(atdma, chan->chan_id);
		tasklet_disable(&atchan->tasklet);
		tasklet_disable(&atchan->tasklet);


		tasklet_kill(&atchan->tasklet);
		tasklet_kill(&atchan->tasklet);
+8 −9
Original line number Original line Diff line number Diff line
@@ -327,28 +327,27 @@ static void atc_dump_lli(struct at_dma_chan *atchan, struct at_lli *lli)
}
}




static void atc_setup_irq(struct at_dma_chan *atchan, int on)
static void atc_setup_irq(struct at_dma *atdma, int chan_id, int on)
{
{
	struct at_dma	*atdma = to_at_dma(atchan->chan_common.device);
	u32 ebci;
	u32 ebci;


	/* enable interrupts on buffer transfer completion & error */
	/* enable interrupts on buffer transfer completion & error */
	ebci =    AT_DMA_BTC(atchan->chan_common.chan_id)
	ebci =    AT_DMA_BTC(chan_id)
		| AT_DMA_ERR(atchan->chan_common.chan_id);
		| AT_DMA_ERR(chan_id);
	if (on)
	if (on)
		dma_writel(atdma, EBCIER, ebci);
		dma_writel(atdma, EBCIER, ebci);
	else
	else
		dma_writel(atdma, EBCIDR, ebci);
		dma_writel(atdma, EBCIDR, ebci);
}
}


static inline void atc_enable_irq(struct at_dma_chan *atchan)
static void atc_enable_chan_irq(struct at_dma *atdma, int chan_id)
{
{
	atc_setup_irq(atchan, 1);
	atc_setup_irq(atdma, chan_id, 1);
}
}


static inline void atc_disable_irq(struct at_dma_chan *atchan)
static void atc_disable_chan_irq(struct at_dma *atdma, int chan_id)
{
{
	atc_setup_irq(atchan, 0);
	atc_setup_irq(atdma, chan_id, 0);
}
}