mirror of
https://github.com/armbian/linux-cix.git
synced 2026-01-06 12:30:45 -08:00
Merge tag 'dmaengine-6.6-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/vkoul/dmaengine
Pull dmaengine updates from Vinod Koul: "New controller support and updates to drivers. New support: - Qualcomm SM6115 and QCM2290 dmaengine support - at_xdma support for microchip,sam9x7 controller Updates: - idxd updates for wq simplification and ats knob updates - fsl edma updates for v3 support - Xilinx AXI4-Stream control support - Yaml conversion for bcm dma binding" * tag 'dmaengine-6.6-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/vkoul/dmaengine: (53 commits) dmaengine: fsl-edma: integrate v3 support dt-bindings: fsl-dma: fsl-edma: add edma3 compatible string dmaengine: fsl-edma: move tcd into struct fsl_dma_chan dmaengine: fsl-edma: refactor chan_name setup and safety dmaengine: fsl-edma: move clearing of register interrupt into setup_irq function dmaengine: fsl-edma: refactor using devm_clk_get_enabled dmaengine: fsl-edma: simply ATTR_DSIZE and ATTR_SSIZE by using ffs() dmaengine: fsl-edma: move common IRQ handler to common.c dmaengine: fsl-edma: Remove enum edma_version dmaengine: fsl-edma: transition from bool fields to bitmask flags in drvdata dmaengine: fsl-edma: clean up EXPORT_SYMBOL_GPL in fsl-edma-common.c dmaengine: fsl-edma: fix build error when arch is s390 dmaengine: idxd: Fix issues with PRS disable sysfs knob dmaengine: idxd: Allow ATS disable update only for configurable devices dmaengine: xilinx_dma: Program interrupt delay timeout dmaengine: xilinx_dma: Use tasklet_hi_schedule for timing critical usecase dmaengine: xilinx_dma: Freeup active list based on descriptor completion bit dmaengine: xilinx_dma: Increase AXI DMA transaction segment count dmaengine: xilinx_dma: Pass AXI4-Stream control words to dma client dt-bindings: dmaengine: xilinx_dma: Add xlnx,irq-delay property ...
This commit is contained in:
@@ -84,7 +84,7 @@ What: /sys/bus/dsa/devices/dsa<m>/pasid_enabled
|
||||
Date: Oct 27, 2020
|
||||
KernelVersion: 5.11.0
|
||||
Contact: dmaengine@vger.kernel.org
|
||||
Description: To indicate if PASID (process address space identifier) is
|
||||
Description: To indicate if user PASID (process address space identifier) is
|
||||
enabled or not for this device.
|
||||
|
||||
What: /sys/bus/dsa/devices/dsa<m>/state
|
||||
|
||||
@@ -3,7 +3,8 @@
|
||||
* XDMA Controller
|
||||
Required properties:
|
||||
- compatible: Should be "atmel,sama5d4-dma", "microchip,sam9x60-dma" or
|
||||
"microchip,sama7g5-dma".
|
||||
"microchip,sama7g5-dma" or
|
||||
"microchip,sam9x7-dma", "atmel,sama5d4-dma".
|
||||
- reg: Should contain DMA registers location and length.
|
||||
- interrupts: Should contain DMA interrupt.
|
||||
- #dma-cells: Must be <1>, used to represent the number of integer cells in
|
||||
|
||||
@@ -1,83 +0,0 @@
|
||||
* BCM2835 DMA controller
|
||||
|
||||
The BCM2835 DMA controller has 16 channels in total.
|
||||
Only the lower 13 channels have an associated IRQ.
|
||||
Some arbitrary channels are used by the firmware
|
||||
(1,3,6,7 in the current firmware version).
|
||||
The channels 0,2 and 3 have special functionality
|
||||
and should not be used by the driver.
|
||||
|
||||
Required properties:
|
||||
- compatible: Should be "brcm,bcm2835-dma".
|
||||
- reg: Should contain DMA registers location and length.
|
||||
- interrupts: Should contain the DMA interrupts associated
|
||||
to the DMA channels in ascending order.
|
||||
- interrupt-names: Should contain the names of the interrupt
|
||||
in the form "dmaXX".
|
||||
Use "dma-shared-all" for the common interrupt line
|
||||
that is shared by all dma channels.
|
||||
- #dma-cells: Must be <1>, the cell in the dmas property of the
|
||||
client device represents the DREQ number.
|
||||
- brcm,dma-channel-mask: Bit mask representing the channels
|
||||
not used by the firmware in ascending order,
|
||||
i.e. first channel corresponds to LSB.
|
||||
|
||||
Example:
|
||||
|
||||
dma: dma@7e007000 {
|
||||
compatible = "brcm,bcm2835-dma";
|
||||
reg = <0x7e007000 0xf00>;
|
||||
interrupts = <1 16>,
|
||||
<1 17>,
|
||||
<1 18>,
|
||||
<1 19>,
|
||||
<1 20>,
|
||||
<1 21>,
|
||||
<1 22>,
|
||||
<1 23>,
|
||||
<1 24>,
|
||||
<1 25>,
|
||||
<1 26>,
|
||||
/* dma channel 11-14 share one irq */
|
||||
<1 27>,
|
||||
<1 27>,
|
||||
<1 27>,
|
||||
<1 27>,
|
||||
/* unused shared irq for all channels */
|
||||
<1 28>;
|
||||
interrupt-names = "dma0",
|
||||
"dma1",
|
||||
"dma2",
|
||||
"dma3",
|
||||
"dma4",
|
||||
"dma5",
|
||||
"dma6",
|
||||
"dma7",
|
||||
"dma8",
|
||||
"dma9",
|
||||
"dma10",
|
||||
"dma11",
|
||||
"dma12",
|
||||
"dma13",
|
||||
"dma14",
|
||||
"dma-shared-all";
|
||||
|
||||
#dma-cells = <1>;
|
||||
brcm,dma-channel-mask = <0x7f35>;
|
||||
};
|
||||
|
||||
|
||||
DMA clients connected to the BCM2835 DMA controller must use the format
|
||||
described in the dma.txt file, using a two-cell specifier for each channel.
|
||||
|
||||
Example:
|
||||
|
||||
bcm2835_i2s: i2s@7e203000 {
|
||||
compatible = "brcm,bcm2835-i2s";
|
||||
reg = < 0x7e203000 0x24>;
|
||||
clocks = <&clocks BCM2835_CLOCK_PCM>;
|
||||
|
||||
dmas = <&dma 2>,
|
||||
<&dma 3>;
|
||||
dma-names = "tx", "rx";
|
||||
};
|
||||
102
Documentation/devicetree/bindings/dma/brcm,bcm2835-dma.yaml
Normal file
102
Documentation/devicetree/bindings/dma/brcm,bcm2835-dma.yaml
Normal file
@@ -0,0 +1,102 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/dma/brcm,bcm2835-dma.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: BCM2835 DMA controller
|
||||
|
||||
maintainers:
|
||||
- Nicolas Saenz Julienne <nsaenz@kernel.org>
|
||||
|
||||
description:
|
||||
The BCM2835 DMA controller has 16 channels in total. Only the lower
|
||||
13 channels have an associated IRQ. Some arbitrary channels are used by the
|
||||
VideoCore firmware (1,3,6,7 in the current firmware version). The channels
|
||||
0, 2 and 3 have special functionality and should not be used by the driver.
|
||||
|
||||
allOf:
|
||||
- $ref: dma-controller.yaml#
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: brcm,bcm2835-dma
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
interrupts:
|
||||
description:
|
||||
Should contain the DMA interrupts associated to the DMA channels in
|
||||
ascending order.
|
||||
minItems: 1
|
||||
maxItems: 16
|
||||
|
||||
interrupt-names:
|
||||
minItems: 1
|
||||
maxItems: 16
|
||||
|
||||
'#dma-cells':
|
||||
description: The single cell represents the DREQ number.
|
||||
const: 1
|
||||
|
||||
brcm,dma-channel-mask:
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
description:
|
||||
Bitmask of available DMA channels in ascending order that are
|
||||
not reserved by firmware and are available to the
|
||||
kernel. i.e. first channel corresponds to LSB.
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- interrupts
|
||||
- "#dma-cells"
|
||||
- brcm,dma-channel-mask
|
||||
|
||||
examples:
|
||||
- |
|
||||
dma-controller@7e007000 {
|
||||
compatible = "brcm,bcm2835-dma";
|
||||
reg = <0x7e007000 0xf00>;
|
||||
interrupts = <1 16>,
|
||||
<1 17>,
|
||||
<1 18>,
|
||||
<1 19>,
|
||||
<1 20>,
|
||||
<1 21>,
|
||||
<1 22>,
|
||||
<1 23>,
|
||||
<1 24>,
|
||||
<1 25>,
|
||||
<1 26>,
|
||||
/* dma channel 11-14 share one irq */
|
||||
<1 27>,
|
||||
<1 27>,
|
||||
<1 27>,
|
||||
<1 27>,
|
||||
/* unused shared irq for all channels */
|
||||
<1 28>;
|
||||
interrupt-names = "dma0",
|
||||
"dma1",
|
||||
"dma2",
|
||||
"dma3",
|
||||
"dma4",
|
||||
"dma5",
|
||||
"dma6",
|
||||
"dma7",
|
||||
"dma8",
|
||||
"dma9",
|
||||
"dma10",
|
||||
"dma11",
|
||||
"dma12",
|
||||
"dma13",
|
||||
"dma14",
|
||||
"dma-shared-all";
|
||||
#dma-cells = <1>;
|
||||
brcm,dma-channel-mask = <0x7f35>;
|
||||
};
|
||||
|
||||
...
|
||||
@@ -21,32 +21,41 @@ properties:
|
||||
- enum:
|
||||
- fsl,vf610-edma
|
||||
- fsl,imx7ulp-edma
|
||||
- fsl,imx8qm-adma
|
||||
- fsl,imx8qm-edma
|
||||
- fsl,imx93-edma3
|
||||
- fsl,imx93-edma4
|
||||
- items:
|
||||
- const: fsl,ls1028a-edma
|
||||
- const: fsl,vf610-edma
|
||||
|
||||
reg:
|
||||
minItems: 2
|
||||
minItems: 1
|
||||
maxItems: 3
|
||||
|
||||
interrupts:
|
||||
minItems: 2
|
||||
maxItems: 17
|
||||
minItems: 1
|
||||
maxItems: 64
|
||||
|
||||
interrupt-names:
|
||||
minItems: 2
|
||||
maxItems: 17
|
||||
minItems: 1
|
||||
maxItems: 64
|
||||
|
||||
"#dma-cells":
|
||||
const: 2
|
||||
enum:
|
||||
- 2
|
||||
- 3
|
||||
|
||||
dma-channels:
|
||||
const: 32
|
||||
minItems: 1
|
||||
maxItems: 64
|
||||
|
||||
clocks:
|
||||
minItems: 1
|
||||
maxItems: 2
|
||||
|
||||
clock-names:
|
||||
minItems: 1
|
||||
maxItems: 2
|
||||
|
||||
big-endian:
|
||||
@@ -65,6 +74,29 @@ required:
|
||||
|
||||
allOf:
|
||||
- $ref: dma-controller.yaml#
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- fsl,imx8qm-adma
|
||||
- fsl,imx8qm-edma
|
||||
- fsl,imx93-edma3
|
||||
- fsl,imx93-edma4
|
||||
then:
|
||||
properties:
|
||||
"#dma-cells":
|
||||
const: 3
|
||||
# It is not necessary to write the interrupt name for each channel.
|
||||
# instead, you can simply maintain the sequential IRQ numbers as
|
||||
# defined for the DMA channels.
|
||||
interrupt-names: false
|
||||
clock-names:
|
||||
items:
|
||||
- const: dma
|
||||
clocks:
|
||||
maxItems: 1
|
||||
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
@@ -72,18 +104,26 @@ allOf:
|
||||
const: fsl,vf610-edma
|
||||
then:
|
||||
properties:
|
||||
clocks:
|
||||
minItems: 2
|
||||
clock-names:
|
||||
items:
|
||||
- const: dmamux0
|
||||
- const: dmamux1
|
||||
interrupts:
|
||||
minItems: 2
|
||||
maxItems: 2
|
||||
interrupt-names:
|
||||
items:
|
||||
- const: edma-tx
|
||||
- const: edma-err
|
||||
reg:
|
||||
minItems: 2
|
||||
maxItems: 3
|
||||
"#dma-cells":
|
||||
const: 2
|
||||
dma-channels:
|
||||
const: 32
|
||||
|
||||
- if:
|
||||
properties:
|
||||
@@ -92,14 +132,22 @@ allOf:
|
||||
const: fsl,imx7ulp-edma
|
||||
then:
|
||||
properties:
|
||||
clock:
|
||||
minItems: 2
|
||||
clock-names:
|
||||
items:
|
||||
- const: dma
|
||||
- const: dmamux0
|
||||
interrupts:
|
||||
minItems: 2
|
||||
maxItems: 17
|
||||
reg:
|
||||
minItems: 2
|
||||
maxItems: 2
|
||||
"#dma-cells":
|
||||
const: 2
|
||||
dma-channels:
|
||||
const: 32
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
@@ -153,3 +201,47 @@ examples:
|
||||
clock-names = "dma", "dmamux0";
|
||||
clocks = <&pcc2 IMX7ULP_CLK_DMA1>, <&pcc2 IMX7ULP_CLK_DMA_MUX1>;
|
||||
};
|
||||
|
||||
- |
|
||||
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
#include <dt-bindings/clock/imx93-clock.h>
|
||||
|
||||
dma-controller@44000000 {
|
||||
compatible = "fsl,imx93-edma3";
|
||||
reg = <0x44000000 0x200000>;
|
||||
#dma-cells = <3>;
|
||||
dma-channels = <31>;
|
||||
interrupts = <GIC_SPI 95 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 96 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 97 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 98 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 99 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 100 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 101 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 102 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 103 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 104 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 105 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 106 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 107 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 108 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 109 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 110 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 111 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 112 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 113 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 114 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 115 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 116 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 117 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 118 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 119 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 120 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 121 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 122 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 123 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 124 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 125 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&clk IMX93_CLK_EDMA1_GATE>;
|
||||
clock-names = "dma";
|
||||
};
|
||||
|
||||
@@ -15,13 +15,19 @@ allOf:
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
# APQ8064, IPQ8064 and MSM8960
|
||||
- qcom,bam-v1.3.0
|
||||
# MSM8974, APQ8074 and APQ8084
|
||||
- qcom,bam-v1.4.0
|
||||
# MSM8916 and SDM845
|
||||
- qcom,bam-v1.7.0
|
||||
oneOf:
|
||||
- enum:
|
||||
# APQ8064, IPQ8064 and MSM8960
|
||||
- qcom,bam-v1.3.0
|
||||
# MSM8974, APQ8074 and APQ8084
|
||||
- qcom,bam-v1.4.0
|
||||
# MSM8916, SDM630
|
||||
- qcom,bam-v1.7.0
|
||||
- items:
|
||||
- enum:
|
||||
# SDM845, SM6115, SM8150, SM8250 and QCM2290
|
||||
- qcom,bam-v1.7.4
|
||||
- const: qcom,bam-v1.7.0
|
||||
|
||||
clocks:
|
||||
maxItems: 1
|
||||
@@ -38,7 +44,7 @@ properties:
|
||||
|
||||
iommus:
|
||||
minItems: 1
|
||||
maxItems: 4
|
||||
maxItems: 6
|
||||
|
||||
num-channels:
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
@@ -81,6 +87,15 @@ required:
|
||||
- qcom,ee
|
||||
- reg
|
||||
|
||||
anyOf:
|
||||
- required:
|
||||
- qcom,powered-remotely
|
||||
- required:
|
||||
- qcom,controlled-remotely
|
||||
- required:
|
||||
- clocks
|
||||
- clock-names
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
|
||||
@@ -49,6 +49,12 @@ Optional properties for AXI DMA and MCDMA:
|
||||
register as configured in h/w. Takes values {8...26}. If the property
|
||||
is missing or invalid then the default value 23 is used. This is the
|
||||
maximum value that is supported by all IP versions.
|
||||
|
||||
Optional properties for AXI DMA:
|
||||
- xlnx,axistream-connected: Tells whether DMA is connected to AXI stream IP.
|
||||
- xlnx,irq-delay: Tells the interrupt delay timeout value. Valid range is from
|
||||
0-255. Setting this value to zero disables the delay timer interrupt.
|
||||
1 timeout interval = 125 * clock period of SG clock.
|
||||
Optional properties for VDMA:
|
||||
- xlnx,flush-fsync: Tells which channel to Flush on Frame sync.
|
||||
It takes following values:
|
||||
|
||||
@@ -474,25 +474,6 @@ config MXS_DMA
|
||||
Support the MXS DMA engine. This engine including APBH-DMA
|
||||
and APBX-DMA is integrated into some Freescale chips.
|
||||
|
||||
config MX3_IPU
|
||||
bool "MX3x Image Processing Unit support"
|
||||
depends on ARCH_MXC
|
||||
select DMA_ENGINE
|
||||
default y
|
||||
help
|
||||
If you plan to use the Image Processing unit in the i.MX3x, say
|
||||
Y here. If unsure, select Y.
|
||||
|
||||
config MX3_IPU_IRQS
|
||||
int "Number of dynamically mapped interrupts for IPU"
|
||||
depends on MX3_IPU
|
||||
range 2 137
|
||||
default 4
|
||||
help
|
||||
Out of 137 interrupt sources on i.MX31 IPU only very few are used.
|
||||
To avoid bloating the irq_desc[] array we allocate a sufficient
|
||||
number of IRQ slots and map them dynamically to specific sources.
|
||||
|
||||
config NBPFAXI_DMA
|
||||
tristate "Renesas Type-AXI NBPF DMA support"
|
||||
select DMA_ENGINE
|
||||
@@ -699,7 +680,7 @@ config XGENE_DMA
|
||||
|
||||
config XILINX_DMA
|
||||
tristate "Xilinx AXI DMAS Engine"
|
||||
depends on (ARCH_ZYNQ || MICROBLAZE || ARM64)
|
||||
depends on HAS_IOMEM
|
||||
select DMA_ENGINE
|
||||
help
|
||||
Enable support for Xilinx AXI VDMA Soft IP.
|
||||
|
||||
@@ -32,8 +32,10 @@ obj-$(CONFIG_DW_DMAC_CORE) += dw/
|
||||
obj-$(CONFIG_DW_EDMA) += dw-edma/
|
||||
obj-$(CONFIG_EP93XX_DMA) += ep93xx_dma.o
|
||||
obj-$(CONFIG_FSL_DMA) += fsldma.o
|
||||
obj-$(CONFIG_FSL_EDMA) += fsl-edma.o fsl-edma-common.o
|
||||
obj-$(CONFIG_MCF_EDMA) += mcf-edma.o fsl-edma-common.o
|
||||
fsl-edma-objs := fsl-edma-main.o fsl-edma-common.o
|
||||
obj-$(CONFIG_FSL_EDMA) += fsl-edma.o
|
||||
mcf-edma-objs := mcf-edma-main.o fsl-edma-common.o
|
||||
obj-$(CONFIG_MCF_EDMA) += mcf-edma.o
|
||||
obj-$(CONFIG_FSL_QDMA) += fsl-qdma.o
|
||||
obj-$(CONFIG_FSL_RAID) += fsl_raid.o
|
||||
obj-$(CONFIG_HISI_DMA) += hisi_dma.o
|
||||
@@ -55,7 +57,6 @@ obj-$(CONFIG_MPC512X_DMA) += mpc512x_dma.o
|
||||
obj-$(CONFIG_MV_XOR) += mv_xor.o
|
||||
obj-$(CONFIG_MV_XOR_V2) += mv_xor_v2.o
|
||||
obj-$(CONFIG_MXS_DMA) += mxs-dma.o
|
||||
obj-$(CONFIG_MX3_IPU) += ipu/
|
||||
obj-$(CONFIG_NBPFAXI_DMA) += nbpfaxi.o
|
||||
obj-$(CONFIG_OWL_DMA) += owl-dma.o
|
||||
obj-$(CONFIG_PCH_DMA) += pch_dma.o
|
||||
|
||||
@@ -10,8 +10,9 @@
|
||||
#include <linux/device.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_dma.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/reset.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/interrupt.h>
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/overflow.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/of_platform.h>
|
||||
#include <linux/of_dma.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
@@ -35,7 +35,9 @@
|
||||
#include <linux/mailbox_client.h>
|
||||
#include <linux/mailbox/brcm-message.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_platform.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/raid/pq.h>
|
||||
|
||||
|
||||
@@ -14,9 +14,8 @@
|
||||
#include <linux/slab.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/of_irq.h>
|
||||
#include <linux/of_platform.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/irq.h>
|
||||
#include <asm/mpc52xx.h>
|
||||
|
||||
@@ -13,7 +13,6 @@
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/of_dma.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
@@ -1147,69 +1147,27 @@ int dma_async_device_register(struct dma_device *device)
|
||||
|
||||
device->owner = device->dev->driver->owner;
|
||||
|
||||
if (dma_has_cap(DMA_MEMCPY, device->cap_mask) && !device->device_prep_dma_memcpy) {
|
||||
dev_err(device->dev,
|
||||
"Device claims capability %s, but op is not defined\n",
|
||||
"DMA_MEMCPY");
|
||||
return -EIO;
|
||||
}
|
||||
#define CHECK_CAP(_name, _type) \
|
||||
{ \
|
||||
if (dma_has_cap(_type, device->cap_mask) && !device->device_prep_##_name) { \
|
||||
dev_err(device->dev, \
|
||||
"Device claims capability %s, but op is not defined\n", \
|
||||
__stringify(_type)); \
|
||||
return -EIO; \
|
||||
} \
|
||||
}
|
||||
|
||||
if (dma_has_cap(DMA_XOR, device->cap_mask) && !device->device_prep_dma_xor) {
|
||||
dev_err(device->dev,
|
||||
"Device claims capability %s, but op is not defined\n",
|
||||
"DMA_XOR");
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
if (dma_has_cap(DMA_XOR_VAL, device->cap_mask) && !device->device_prep_dma_xor_val) {
|
||||
dev_err(device->dev,
|
||||
"Device claims capability %s, but op is not defined\n",
|
||||
"DMA_XOR_VAL");
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
if (dma_has_cap(DMA_PQ, device->cap_mask) && !device->device_prep_dma_pq) {
|
||||
dev_err(device->dev,
|
||||
"Device claims capability %s, but op is not defined\n",
|
||||
"DMA_PQ");
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
if (dma_has_cap(DMA_PQ_VAL, device->cap_mask) && !device->device_prep_dma_pq_val) {
|
||||
dev_err(device->dev,
|
||||
"Device claims capability %s, but op is not defined\n",
|
||||
"DMA_PQ_VAL");
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
if (dma_has_cap(DMA_MEMSET, device->cap_mask) && !device->device_prep_dma_memset) {
|
||||
dev_err(device->dev,
|
||||
"Device claims capability %s, but op is not defined\n",
|
||||
"DMA_MEMSET");
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
if (dma_has_cap(DMA_INTERRUPT, device->cap_mask) && !device->device_prep_dma_interrupt) {
|
||||
dev_err(device->dev,
|
||||
"Device claims capability %s, but op is not defined\n",
|
||||
"DMA_INTERRUPT");
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
if (dma_has_cap(DMA_CYCLIC, device->cap_mask) && !device->device_prep_dma_cyclic) {
|
||||
dev_err(device->dev,
|
||||
"Device claims capability %s, but op is not defined\n",
|
||||
"DMA_CYCLIC");
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
if (dma_has_cap(DMA_INTERLEAVE, device->cap_mask) && !device->device_prep_interleaved_dma) {
|
||||
dev_err(device->dev,
|
||||
"Device claims capability %s, but op is not defined\n",
|
||||
"DMA_INTERLEAVE");
|
||||
return -EIO;
|
||||
}
|
||||
CHECK_CAP(dma_memcpy, DMA_MEMCPY);
|
||||
CHECK_CAP(dma_xor, DMA_XOR);
|
||||
CHECK_CAP(dma_xor_val, DMA_XOR_VAL);
|
||||
CHECK_CAP(dma_pq, DMA_PQ);
|
||||
CHECK_CAP(dma_pq_val, DMA_PQ_VAL);
|
||||
CHECK_CAP(dma_memset, DMA_MEMSET);
|
||||
CHECK_CAP(dma_interrupt, DMA_INTERRUPT);
|
||||
CHECK_CAP(dma_cyclic, DMA_CYCLIC);
|
||||
CHECK_CAP(interleaved_dma, DMA_INTERLEAVE);
|
||||
|
||||
#undef CHECK_CAP
|
||||
|
||||
if (!device->device_tx_status) {
|
||||
dev_err(device->dev, "Device tx_status is not defined\n");
|
||||
|
||||
@@ -21,7 +21,6 @@
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/of_dma.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
|
||||
@@ -5,8 +5,10 @@
|
||||
* Based on TI crossbar driver written by Peter Ujfalusi <peter.ujfalusi@ti.com>
|
||||
*/
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_dma.h>
|
||||
#include <linux/of_platform.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/soc/renesas/r9a06g032-sysctrl.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
@@ -1320,11 +1320,9 @@ static int __init ep93xx_dma_probe(struct platform_device *pdev)
|
||||
struct ep93xx_dma_platform_data *pdata = dev_get_platdata(&pdev->dev);
|
||||
struct ep93xx_dma_engine *edma;
|
||||
struct dma_device *dma_dev;
|
||||
size_t edma_size;
|
||||
int ret, i;
|
||||
|
||||
edma_size = pdata->num_channels * sizeof(struct ep93xx_dma_chan);
|
||||
edma = kzalloc(sizeof(*edma) + edma_size, GFP_KERNEL);
|
||||
edma = kzalloc(struct_size(edma, channels, pdata->num_channels), GFP_KERNEL);
|
||||
if (!edma)
|
||||
return -ENOMEM;
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -29,16 +29,6 @@
|
||||
#define EDMA_TCD_ATTR_DMOD(x) (((x) & GENMASK(4, 0)) << 3)
|
||||
#define EDMA_TCD_ATTR_SSIZE(x) (((x) & GENMASK(2, 0)) << 8)
|
||||
#define EDMA_TCD_ATTR_SMOD(x) (((x) & GENMASK(4, 0)) << 11)
|
||||
#define EDMA_TCD_ATTR_DSIZE_8BIT 0
|
||||
#define EDMA_TCD_ATTR_DSIZE_16BIT BIT(0)
|
||||
#define EDMA_TCD_ATTR_DSIZE_32BIT BIT(1)
|
||||
#define EDMA_TCD_ATTR_DSIZE_64BIT (BIT(0) | BIT(1))
|
||||
#define EDMA_TCD_ATTR_DSIZE_32BYTE (BIT(2) | BIT(0))
|
||||
#define EDMA_TCD_ATTR_SSIZE_8BIT 0
|
||||
#define EDMA_TCD_ATTR_SSIZE_16BIT (EDMA_TCD_ATTR_DSIZE_16BIT << 8)
|
||||
#define EDMA_TCD_ATTR_SSIZE_32BIT (EDMA_TCD_ATTR_DSIZE_32BIT << 8)
|
||||
#define EDMA_TCD_ATTR_SSIZE_64BIT (EDMA_TCD_ATTR_DSIZE_64BIT << 8)
|
||||
#define EDMA_TCD_ATTR_SSIZE_32BYTE (EDMA_TCD_ATTR_DSIZE_32BYTE << 8)
|
||||
|
||||
#define EDMA_TCD_CITER_CITER(x) ((x) & GENMASK(14, 0))
|
||||
#define EDMA_TCD_BITER_BITER(x) ((x) & GENMASK(14, 0))
|
||||
@@ -52,16 +42,32 @@
|
||||
#define EDMA_TCD_CSR_ACTIVE BIT(6)
|
||||
#define EDMA_TCD_CSR_DONE BIT(7)
|
||||
|
||||
#define EDMA_V3_TCD_NBYTES_MLOFF_NBYTES(x) ((x) & GENMASK(9, 0))
|
||||
#define EDMA_V3_TCD_NBYTES_MLOFF(x) (x << 10)
|
||||
#define EDMA_V3_TCD_NBYTES_DMLOE (1 << 30)
|
||||
#define EDMA_V3_TCD_NBYTES_SMLOE (1 << 31)
|
||||
|
||||
#define EDMAMUX_CHCFG_DIS 0x0
|
||||
#define EDMAMUX_CHCFG_ENBL 0x80
|
||||
#define EDMAMUX_CHCFG_SOURCE(n) ((n) & 0x3F)
|
||||
|
||||
#define DMAMUX_NR 2
|
||||
|
||||
#define EDMA_TCD 0x1000
|
||||
|
||||
#define FSL_EDMA_BUSWIDTHS (BIT(DMA_SLAVE_BUSWIDTH_1_BYTE) | \
|
||||
BIT(DMA_SLAVE_BUSWIDTH_2_BYTES) | \
|
||||
BIT(DMA_SLAVE_BUSWIDTH_4_BYTES) | \
|
||||
BIT(DMA_SLAVE_BUSWIDTH_8_BYTES))
|
||||
|
||||
#define EDMA_V3_CH_SBR_RD BIT(22)
|
||||
#define EDMA_V3_CH_SBR_WR BIT(21)
|
||||
#define EDMA_V3_CH_CSR_ERQ BIT(0)
|
||||
#define EDMA_V3_CH_CSR_EARQ BIT(1)
|
||||
#define EDMA_V3_CH_CSR_EEI BIT(2)
|
||||
#define EDMA_V3_CH_CSR_DONE BIT(30)
|
||||
#define EDMA_V3_CH_CSR_ACTIVE BIT(31)
|
||||
|
||||
enum fsl_edma_pm_state {
|
||||
RUNNING = 0,
|
||||
SUSPENDED,
|
||||
@@ -81,6 +87,18 @@ struct fsl_edma_hw_tcd {
|
||||
__le16 biter;
|
||||
};
|
||||
|
||||
struct fsl_edma3_ch_reg {
|
||||
__le32 ch_csr;
|
||||
__le32 ch_es;
|
||||
__le32 ch_int;
|
||||
__le32 ch_sbr;
|
||||
__le32 ch_pri;
|
||||
__le32 ch_mux;
|
||||
__le32 ch_mattr; /* edma4, reserved for edma3 */
|
||||
__le32 ch_reserved;
|
||||
struct fsl_edma_hw_tcd tcd;
|
||||
} __packed;
|
||||
|
||||
/*
|
||||
* These are iomem pointers, for both v32 and v64.
|
||||
*/
|
||||
@@ -103,7 +121,6 @@ struct edma_regs {
|
||||
void __iomem *intl;
|
||||
void __iomem *errh;
|
||||
void __iomem *errl;
|
||||
struct fsl_edma_hw_tcd __iomem *tcd;
|
||||
};
|
||||
|
||||
struct fsl_edma_sw_tcd {
|
||||
@@ -126,7 +143,20 @@ struct fsl_edma_chan {
|
||||
dma_addr_t dma_dev_addr;
|
||||
u32 dma_dev_size;
|
||||
enum dma_data_direction dma_dir;
|
||||
char chan_name[16];
|
||||
char chan_name[32];
|
||||
struct fsl_edma_hw_tcd __iomem *tcd;
|
||||
u32 real_count;
|
||||
struct work_struct issue_worker;
|
||||
struct platform_device *pdev;
|
||||
struct device *pd_dev;
|
||||
u32 srcid;
|
||||
struct clk *clk;
|
||||
int priority;
|
||||
int hw_chanid;
|
||||
int txirq;
|
||||
bool is_rxchan;
|
||||
bool is_remote;
|
||||
bool is_multi_fifo;
|
||||
};
|
||||
|
||||
struct fsl_edma_desc {
|
||||
@@ -138,17 +168,32 @@ struct fsl_edma_desc {
|
||||
struct fsl_edma_sw_tcd tcd[];
|
||||
};
|
||||
|
||||
enum edma_version {
|
||||
v1, /* 32ch, Vybrid, mpc57x, etc */
|
||||
v2, /* 64ch Coldfire */
|
||||
v3, /* 32ch, i.mx7ulp */
|
||||
};
|
||||
#define FSL_EDMA_DRV_HAS_DMACLK BIT(0)
|
||||
#define FSL_EDMA_DRV_MUX_SWAP BIT(1)
|
||||
#define FSL_EDMA_DRV_CONFIG32 BIT(2)
|
||||
#define FSL_EDMA_DRV_WRAP_IO BIT(3)
|
||||
#define FSL_EDMA_DRV_EDMA64 BIT(4)
|
||||
#define FSL_EDMA_DRV_HAS_PD BIT(5)
|
||||
#define FSL_EDMA_DRV_HAS_CHCLK BIT(6)
|
||||
#define FSL_EDMA_DRV_HAS_CHMUX BIT(7)
|
||||
/* imx8 QM audio edma remote local swapped */
|
||||
#define FSL_EDMA_DRV_QUIRK_SWAPPED BIT(8)
|
||||
/* control and status register is in tcd address space, edma3 reg layout */
|
||||
#define FSL_EDMA_DRV_SPLIT_REG BIT(9)
|
||||
#define FSL_EDMA_DRV_BUS_8BYTE BIT(10)
|
||||
#define FSL_EDMA_DRV_DEV_TO_DEV BIT(11)
|
||||
#define FSL_EDMA_DRV_ALIGN_64BYTE BIT(12)
|
||||
|
||||
#define FSL_EDMA_DRV_EDMA3 (FSL_EDMA_DRV_SPLIT_REG | \
|
||||
FSL_EDMA_DRV_BUS_8BYTE | \
|
||||
FSL_EDMA_DRV_DEV_TO_DEV | \
|
||||
FSL_EDMA_DRV_ALIGN_64BYTE)
|
||||
|
||||
struct fsl_edma_drvdata {
|
||||
enum edma_version version;
|
||||
u32 dmamuxs;
|
||||
bool has_dmaclk;
|
||||
bool mux_swap;
|
||||
u32 dmamuxs; /* only used before v3 */
|
||||
u32 chreg_off;
|
||||
u32 chreg_space_sz;
|
||||
u32 flags;
|
||||
int (*setup_irq)(struct platform_device *pdev,
|
||||
struct fsl_edma_engine *fsl_edma);
|
||||
};
|
||||
@@ -159,6 +204,7 @@ struct fsl_edma_engine {
|
||||
void __iomem *muxbase[DMAMUX_NR];
|
||||
struct clk *muxclk[DMAMUX_NR];
|
||||
struct clk *dmaclk;
|
||||
struct clk *chclk;
|
||||
struct mutex fsl_edma_mutex;
|
||||
const struct fsl_edma_drvdata *drvdata;
|
||||
u32 n_chans;
|
||||
@@ -166,9 +212,28 @@ struct fsl_edma_engine {
|
||||
int errirq;
|
||||
bool big_endian;
|
||||
struct edma_regs regs;
|
||||
u64 chan_masked;
|
||||
struct fsl_edma_chan chans[];
|
||||
};
|
||||
|
||||
#define edma_read_tcdreg(chan, __name) \
|
||||
(sizeof(chan->tcd->__name) == sizeof(u32) ? \
|
||||
edma_readl(chan->edma, &chan->tcd->__name) : \
|
||||
edma_readw(chan->edma, &chan->tcd->__name))
|
||||
|
||||
#define edma_write_tcdreg(chan, val, __name) \
|
||||
(sizeof(chan->tcd->__name) == sizeof(u32) ? \
|
||||
edma_writel(chan->edma, (u32 __force)val, &chan->tcd->__name) : \
|
||||
edma_writew(chan->edma, (u16 __force)val, &chan->tcd->__name))
|
||||
|
||||
#define edma_readl_chreg(chan, __name) \
|
||||
edma_readl(chan->edma, \
|
||||
(void __iomem *)&(container_of(chan->tcd, struct fsl_edma3_ch_reg, tcd)->__name))
|
||||
|
||||
#define edma_writel_chreg(chan, val, __name) \
|
||||
edma_writel(chan->edma, val, \
|
||||
(void __iomem *)&(container_of(chan->tcd, struct fsl_edma3_ch_reg, tcd)->__name))
|
||||
|
||||
/*
|
||||
* R/W functions for big- or little-endian registers:
|
||||
* The eDMA controller's endian is independent of the CPU core's endian.
|
||||
@@ -183,6 +248,14 @@ static inline u32 edma_readl(struct fsl_edma_engine *edma, void __iomem *addr)
|
||||
return ioread32(addr);
|
||||
}
|
||||
|
||||
static inline u16 edma_readw(struct fsl_edma_engine *edma, void __iomem *addr)
|
||||
{
|
||||
if (edma->big_endian)
|
||||
return ioread16be(addr);
|
||||
else
|
||||
return ioread16(addr);
|
||||
}
|
||||
|
||||
static inline void edma_writeb(struct fsl_edma_engine *edma,
|
||||
u8 val, void __iomem *addr)
|
||||
{
|
||||
@@ -217,11 +290,23 @@ static inline struct fsl_edma_chan *to_fsl_edma_chan(struct dma_chan *chan)
|
||||
return container_of(chan, struct fsl_edma_chan, vchan.chan);
|
||||
}
|
||||
|
||||
static inline u32 fsl_edma_drvflags(struct fsl_edma_chan *fsl_chan)
|
||||
{
|
||||
return fsl_chan->edma->drvdata->flags;
|
||||
}
|
||||
|
||||
static inline struct fsl_edma_desc *to_fsl_edma_desc(struct virt_dma_desc *vd)
|
||||
{
|
||||
return container_of(vd, struct fsl_edma_desc, vdesc);
|
||||
}
|
||||
|
||||
static inline void fsl_edma_err_chan_handler(struct fsl_edma_chan *fsl_chan)
|
||||
{
|
||||
fsl_chan->status = DMA_ERROR;
|
||||
fsl_chan->idle = true;
|
||||
}
|
||||
|
||||
void fsl_edma_tx_chan_handler(struct fsl_edma_chan *fsl_chan);
|
||||
void fsl_edma_disable_request(struct fsl_edma_chan *fsl_chan);
|
||||
void fsl_edma_chan_mux(struct fsl_edma_chan *fsl_chan,
|
||||
unsigned int slot, bool enable);
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user