aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/layerscape/patches-5.4/806-dma-0009-MLK-16327-1-dma-fsl-edma-v3-make-exclusive-channel-n.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/layerscape/patches-5.4/806-dma-0009-MLK-16327-1-dma-fsl-edma-v3-make-exclusive-channel-n.patch')
-rw-r--r--target/linux/layerscape/patches-5.4/806-dma-0009-MLK-16327-1-dma-fsl-edma-v3-make-exclusive-channel-n.patch128
1 files changed, 128 insertions, 0 deletions
diff --git a/target/linux/layerscape/patches-5.4/806-dma-0009-MLK-16327-1-dma-fsl-edma-v3-make-exclusive-channel-n.patch b/target/linux/layerscape/patches-5.4/806-dma-0009-MLK-16327-1-dma-fsl-edma-v3-make-exclusive-channel-n.patch
new file mode 100644
index 0000000000..6c770ed4df
--- /dev/null
+++ b/target/linux/layerscape/patches-5.4/806-dma-0009-MLK-16327-1-dma-fsl-edma-v3-make-exclusive-channel-n.patch
@@ -0,0 +1,128 @@
+From c5a5706b8a86660505ef0dc863a85596437ca49b Mon Sep 17 00:00:00 2001
+From: Robin Gong <yibin.gong@nxp.com>
+Date: Wed, 30 Aug 2017 18:51:16 +0800
+Subject: [PATCH] MLK-16327-1: dma: fsl-edma-v3: make exclusive channel name
+ for all edma channels
+
+ Since there are multi edmav3 instances on i.mx8, every edma channel name
+is better unique.But so far, all edma channel name is 'edma-channel(id)-
+tx',thus some edma channels which share the same channel id but different
+edma instance will show the same channel name in kernel and this is not
+friendly to debug in kernel.
+ Now the edma channel name(interrupt-names property) is define in dts
+as below:
+ "edmaX-chanX-Xx"
+ | | |---> receive/transmit, r or t
+ | |---> channel id, the max number is 32
+ |---> edma controller instance, 0, 1, 2,..etc
+and get below correct name with 'cat /proc/interrupts':
+ 43: 0 0 0 0 GICv3 466 Level edma0-chan8-rx
+ 44: 0 0 0 0 GICv3 467 Level edma0-chan9-tx
+ 45: 79 0 0 0 GICv3 468 Level edma0-chan10-rx
+ 46: 311 0 0 0 GICv3 469 Level edma0-chan11-tx
+ 47: 0 0 0 0 GICv3 470 Level edma0-chan12-rx
+ 48: 0 0 0 0 GICv3 471 Level edma0-chan13-tx
+ 49: 0 0 0 0 GICv3 472 Level edma0-chan14-rx
+ 50: 0 0 0 0 GICv3 473 Level edma0-chan15-tx
+ 51: 0 0 0 0 GICv3 406 Level edma2-chan0-tx
+ 52: 0 0 0 0 GICv3 407 Level edma2-chan1-tx
+ 53: 0 0 0 0 GICv3 408 Level edma2-chan2-tx
+ 54: 0 0 0 0 GICv3 409 Level edma2-chan3-tx
+ 55: 0 0 0 0 GICv3 410 Level edma2-chan4-tx
+ 56: 0 0 0 0 GICv3 411 Level edma2-chan5-tx
+ 57: 0 0 0 0 GICv3 442 Level edma2-chan6-rx, edma2-chan7-tx
+
+Signed-off-by: Robin Gong <yibin.gong@nxp.com>
+Reviewed-by: Shengjiu Wang <shengjiu.wang@nxp.com>
+(cherry picked from commit af8e197a92c9c024ec4fbfcf543d744e81748773)
+---
+ .../devicetree/bindings/dma/fsl-edma-v3.txt | 12 +++++---
+ drivers/dma/fsl-edma-v3.c | 35 ++++++++++++++++++++--
+ 2 files changed, 41 insertions(+), 6 deletions(-)
+
+--- a/Documentation/devicetree/bindings/dma/fsl-edma-v3.txt
++++ b/Documentation/devicetree/bindings/dma/fsl-edma-v3.txt
+@@ -12,8 +12,12 @@ Required properties:
+ - reg : Specifies base physical address(s) and size of the eDMA channel registers.
+ Each eDMA channel has separated register's address and size.
+ - interrupts : A list of interrupt-specifiers, each channel has one interrupt.
+-- interrupt-names : Should contain:
+- "edma-chan12-tx" - the channel12 transmission interrupt
++- interrupt-names : Should contain below template:
++ "edmaX-chanX-Xx"
++ | | |---> receive/transmit, r or t
++ | |---> channel id, the max number is 32
++ |---> edma controller instance, 0, 1, 2,..etc
++
+ - #dma-cells : Must be <3>.
+ The 1st cell specifies the channel ID.
+ The 2nd cell specifies the channel priority.
+@@ -40,8 +44,8 @@ edma0: dma-controller@40018000 {
+ <GIC_SPI 435 IRQ_TYPE_LEVEL_HIGH>,
+ <GIC_SPI 436 IRQ_TYPE_LEVEL_HIGH>,
+ <GIC_SPI 437 IRQ_TYPE_LEVEL_HIGH>;
+- interrupt-names = "edma-chan12-tx", "edma-chan13-tx",
+- "edma-chan14-tx", "edma-chan15-tx";
++ interrupt-names = "edma0-chan12-rx", "edma0-chan13-tx",
++ "edma0-chan14-rx", "edma0-chan15-tx";
+ status = "okay";
+ };
+
+--- a/drivers/dma/fsl-edma-v3.c
++++ b/drivers/dma/fsl-edma-v3.c
+@@ -107,6 +107,10 @@
+ #define ARGS_REMOTE BIT(1)
+ #define ARGS_DFIFO BIT(2)
+
++/* channel name template define in dts */
++#define CHAN_PREFIX "edma0-chan"
++#define CHAN_POSFIX "-tx"
++
+ struct fsl_edma3_hw_tcd {
+ __le32 saddr;
+ __le16 soff;
+@@ -806,7 +810,10 @@ static int fsl_edma3_probe(struct platfo
+ INIT_LIST_HEAD(&fsl_edma3->dma_dev.channels);
+ for (i = 0; i < fsl_edma3->n_chans; i++) {
+ struct fsl_edma3_chan *fsl_chan = &fsl_edma3->chans[i];
+- char *txirq_name = fsl_chan->txirq_name;
++ const char *txirq_name = fsl_chan->txirq_name;
++ char chanid[3], id_len = 0;
++ char *p = chanid;
++ unsigned long val;
+
+ fsl_chan->edma3 = fsl_edma3;
+ /* Get per channel membase */
+@@ -819,7 +826,31 @@ static int fsl_edma3_probe(struct platfo
+ * channel0:0x10000, channel1:0x20000... total 32 channels
+ */
+ fsl_chan->hw_chanid = (res->start >> 16) & 0x1f;
+- sprintf(txirq_name, "edma-chan%d-tx", fsl_chan->hw_chanid);
++
++ ret = of_property_read_string_index(np, "interrupt-names", i,
++ &txirq_name);
++ if (ret) {
++ dev_err(&pdev->dev, "read interrupt-names fail.\n");
++ return ret;
++ }
++ /* Get channel id length from dts, one-digit or double-digit */
++ id_len = strlen(txirq_name) - strlen(CHAN_PREFIX) -
++ strlen(CHAN_POSFIX);
++ if (id_len > 2) {
++ dev_err(&pdev->dev, "%s is edmaX-chanX-tx in dts?\n",
++ res->name);
++ return -EINVAL;
++ }
++ /* Grab channel id from txirq_name */
++ strncpy(p, txirq_name + strlen(CHAN_PREFIX), id_len);
++ *(p + id_len) = '\0';
++
++ /* check if the channel id match well with hw_chanid */
++ ret = kstrtoul(chanid, 0, &val);
++ if (ret || val != fsl_chan->hw_chanid) {
++ dev_err(&pdev->dev, "%s,wrong id?\n", txirq_name);
++ return -EINVAL;
++ }
+
+ /* request channel irq */
+ fsl_chan->txirq = platform_get_irq_byname(pdev, txirq_name);