summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaisuke Nojiri <dnojiri@chromium.org>2016-04-21 11:14:03 -0700
committerchrome-bot <chrome-bot@chromium.org>2016-04-25 16:49:01 -0700
commitcb0d8108e5a5b630ec05a8d21a824cb601246bf5 (patch)
tree022345cbe80da2a4479144cc7969cbb84dff355b
parenta1fc785977074b4d5b6ebaa826a07374353374dd (diff)
downloadchrome-ec-cb0d8108e5a5b630ec05a8d21a824cb601246bf5.tar.gz
STM32: Add dma_select_channel
dma_select_channel selects which stream (peripheral) to be used on a specific channel. Some STM32 chips simply logically OR requests, thus do not require this selection. BUG=none BRANCH=tot TEST=make buildall && make tests. Verified on stm32l476g-eval. Change-Id: I7b64b78bdec80658992f58cb4c94ade972a1081c Signed-off-by: Daisuke Nojiri <dnojiri@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/340107 Reviewed-by: Gwendal Grignou <gwendal@chromium.org>
-rw-r--r--chip/stm32/config_chip.h3
-rw-r--r--chip/stm32/dma.c16
-rw-r--r--chip/stm32/registers.h3
-rw-r--r--chip/stm32/stm32-dma.h16
4 files changed, 38 insertions, 0 deletions
diff --git a/chip/stm32/config_chip.h b/chip/stm32/config_chip.h
index f77fdf059e..87ebd21c09 100644
--- a/chip/stm32/config_chip.h
+++ b/chip/stm32/config_chip.h
@@ -96,6 +96,9 @@
/* Use DMA */
#define CONFIG_DMA
+/* Number of peripheral request signals per DMA channel */
+#define STM32_DMA_PERIPHERALS_PER_CHANNEL 4
+
/*
* Use DMA for UART transmit for all platforms. DMA for UART receive is
* enabled on a per-chip basis because it doesn't seem to work reliably on
diff --git a/chip/stm32/dma.c b/chip/stm32/dma.c
index 56723e1be1..d169cf7f45 100644
--- a/chip/stm32/dma.c
+++ b/chip/stm32/dma.c
@@ -59,6 +59,22 @@ stm32_dma_chan_t *dma_get_channel(enum dma_channel channel)
return &dma->chan[channel % STM32_DMAC_PER_CTLR];
}
+#ifdef STM32_DMA_CSELR
+void dma_select_channel(enum dma_channel channel, unsigned char stream)
+{
+ /* Local channel # starting from 0 on each DMA controller */
+ const unsigned char ch = channel % STM32_DMAC_PER_CTLR;
+ const unsigned char shift = STM32_DMA_PERIPHERALS_PER_CHANNEL;
+ const unsigned char mask = (1 << shift) - 1;
+ uint32_t val;
+
+ ASSERT(ch < STM32_DMAC_PER_CTLR);
+ ASSERT(stream <= mask);
+ val = STM32_DMA_CSELR(channel) & ~(mask << ch * shift);
+ STM32_DMA_CSELR(channel) = val | (stream << ch * shift);
+}
+#endif
+
void dma_disable(enum dma_channel channel)
{
stm32_dma_chan_t *chan = dma_get_channel(channel);
diff --git a/chip/stm32/registers.h b/chip/stm32/registers.h
index 283fd44498..74eee526cb 100644
--- a/chip/stm32/registers.h
+++ b/chip/stm32/registers.h
@@ -1233,6 +1233,9 @@ typedef volatile struct stm32_dma_regs stm32_dma_regs_t;
#define STM32_DMA_REGS(channel) \
((channel) < STM32_DMAC_PER_CTLR ? STM32_DMA1_REGS : STM32_DMA2_REGS)
+#define STM32_DMA_CSELR(channel) \
+ REG32(((channel) < STM32_DMAC_PER_CTLR ? \
+ STM32_DMA1_BASE : STM32_DMA2_BASE) + 0xA8)
#else
#define STM32_DMA_REGS(channel) STM32_DMA1_REGS
#endif
diff --git a/chip/stm32/stm32-dma.h b/chip/stm32/stm32-dma.h
new file mode 100644
index 0000000000..06233b9c93
--- /dev/null
+++ b/chip/stm32/stm32-dma.h
@@ -0,0 +1,16 @@
+/* Copyright 2016 The Chromium OS Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+/**
+ * Select DMA stream-channel mapping
+ *
+ * This selects which stream (peripheral) to be used on a specific channel.
+ * Some STM32 chips simply logically OR requests, thus do not require this
+ * selection.
+ *
+ * @param channel: (Global) channel # base 0 (Note some STM32s use base 1)
+ * @param peripheral: Refer to the TRM for 'peripheral request signals'
+ */
+void dma_select_channel(enum dma_channel channel, unsigned char stream);