Merge pull request #2375 from JuulLabs/fix-dma-req-mux
mcu/dialog: Fix a few bugs in da1469x_dma.c
diff --git a/hw/mcu/dialog/da1469x/src/da1469x_dma.c b/hw/mcu/dialog/da1469x/src/da1469x_dma.c
index ff98682..79277a7 100644
--- a/hw/mcu/dialog/da1469x/src/da1469x_dma.c
+++ b/hw/mcu/dialog/da1469x/src/da1469x_dma.c
@@ -38,7 +38,7 @@
((_periph) << ((_cidx) * 2)); \
} while (0)
#define MCU_DMA_GET_MUX(_cidx) \
- (DMA->DMA_REQ_MUX_REG >> ((_cidx) * 4) & 0xf)
+ ((DMA->DMA_REQ_MUX_REG >> ((_cidx) * 2)) & 0xf)
struct da1469x_dma_interrupt_cfg {
da1469x_dma_interrupt_cb cb;
@@ -133,7 +133,12 @@
chan = MCU_DMA_CIDX2CHAN(cidx);
- MCU_DMA_SET_MUX(cidx, MCU_DMA_PERIPH_NONE);
+ /*
+ * DMA_REQ_MUX_REG applies only to channels < 8
+ */
+ if (cidx < 8) {
+ MCU_DMA_SET_MUX(cidx, MCU_DMA_PERIPH_NONE);
+ }
chan->DMA_CTRL_REG &= ~DMA_DMA0_CTRL_REG_DREQ_MODE_Msk;
@@ -181,8 +186,10 @@
/*
* If corresponding pair for this channel is configured for triggering from
* peripheral, we'll use lower of channel index.
+ *
+ * Only channels 0-7 can use pairs for peripherals.
*/
- if (MCU_DMA_GET_MUX(cidx) != MCU_DMA_PERIPH_NONE) {
+ if (cidx < 8 && MCU_DMA_GET_MUX(cidx) != MCU_DMA_PERIPH_NONE) {
cidx &= 0xfe;
chan = MCU_DMA_CIDX2CHAN(cidx);
@@ -201,7 +208,6 @@
} else {
chan->DMA_CTRL_REG &= ~DMA_DMA0_CTRL_REG_DMA_ON_Msk;
g_da1469x_dma_acquired &= ~(1 << cidx);
-
g_da1469x_dma_isr_set &= ~(1 << cidx);
DMA->DMA_CLEAR_INT_REG = 1 << cidx;
memset(&g_da1469x_dma_isr_cfg[cidx], 0,