Commit 87c779ba authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'for-linus' of git://git.infradead.org/users/vkoul/slave-dma

Pull dmaengine updates from Vinod Koul:
 "Main features this time are:

   - BAM v1.3.0 support form qcom bam dma
   - support for Allwinner sun8i dma
   - atmels eXtended DMA Controller driver
   - chancnt cleanup by Maxime
   - fixes spread over drivers"

* 'for-linus' of git://git.infradead.org/users/vkoul/slave-dma: (56 commits)
  dmaenegine: Delete a check before free_percpu()
  dmaengine: ioatdma: fix dma mapping errors
  dma: cppi41: add a delay while setting the TD bit
  dma: cppi41: wait longer for the HW to return the descriptor
  dmaengine: fsl-edma: fixup reg offset and hw S/G support in big-endian model
  dmaengine: fsl-edma: fix calculation of remaining bytes
  drivers/dma/pch_dma: declare pch_dma_id_table as static
  dmaengine: ste_dma40: fix error return code
  dma: imx-sdma: clarify about firmware not found error
  Documentation: devicetree: Fix Xilinx VDMA specification
  dmaengine: pl330: update author info
  dmaengine: clarify the issue_pending expectations
  dmaengine: at_xdmac: Add DMA_PRIVATE
  ARM: dts: at_xdmac: fix bad value of dma-cells in documentation
  dmaengine: at_xdmac: fix missing spin_unlock
  dmaengine: at_xdmac: fix a bug in transfer residue computation
  dmaengine: at_xdmac: fix software lockup at_xdmac_tx_status()
  dmaengine: at_xdmac: remove chancnt affectation
  dmaengine: at_xdmac: prefer usage of readl/writel_relaxed
  dmaengine: xdmac: fix print warning on dma_addr_t variable
  ...
parents eea0cf3f a9507ca3
* Atmel Extensible Direct Memory Access Controller (XDMAC)
* XDMA Controller
Required properties:
- compatible: Should be "atmel,<chip>-dma".
<chip> compatible description:
- sama5d4: first SoC adding the XDMAC
- 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
the dmas property of client devices.
- The 1st cell specifies the channel configuration register:
- bit 13: SIF, source interface identifier, used to get the memory
interface identifier,
- bit 14: DIF, destination interface identifier, used to get the peripheral
interface identifier,
- bit 30-24: PERID, peripheral identifier.
Example:
dma1: dma-controller@f0004000 {
compatible = "atmel,sama5d4-dma";
reg = <0xf0004000 0x200>;
interrupts = <50 4 0>;
#dma-cells = <1>;
};
* DMA clients
DMA clients connected to the Atmel XDMA controller must use the format
described in the dma.txt file, using a one-cell specifier for each channel.
The two cells in order are:
1. A phandle pointing to the DMA controller.
2. Channel configuration register. Configurable fields are:
- bit 13: SIF, source interface identifier, used to get the memory
interface identifier,
- bit 14: DIF, destination interface identifier, used to get the peripheral
interface identifier,
- bit 30-24: PERID, peripheral identifier.
Example:
i2c2: i2c@f8024000 {
compatible = "atmel,at91sam9x5-i2c";
reg = <0xf8024000 0x4000>;
interrupts = <34 4 6>;
dmas = <&dma1
(AT91_XDMAC_DT_MEM_IF(0) | AT91_XDMAC_DT_PER_IF(1)
| AT91_XDMAC_DT_PERID(6))>,
<&dma1
(AT91_XDMAC_DT_MEM_IF(0) | AT91_XDMAC_DT_PER_IF(1)
| AT91_XDMAC_DT_PERID(7))>;
dma-names = "tx", "rx";
};
...@@ -48,6 +48,7 @@ The full ID of peripheral types can be found below. ...@@ -48,6 +48,7 @@ The full ID of peripheral types can be found below.
21 ESAI 21 ESAI
22 SSI Dual FIFO (needs firmware ver >= 2) 22 SSI Dual FIFO (needs firmware ver >= 2)
23 Shared ASRC 23 Shared ASRC
24 SAI
The third cell specifies the transfer priority as below. The third cell specifies the transfer priority as below.
......
QCOM BAM DMA controller QCOM BAM DMA controller
Required properties: Required properties:
- compatible: must contain "qcom,bam-v1.4.0" for MSM8974 - compatible: must be one of the following:
* "qcom,bam-v1.4.0" for MSM8974, APQ8074 and APQ8084
* "qcom,bam-v1.3.0" for APQ8064, IPQ8064 and MSM8960
- reg: Address range for DMA registers - reg: Address range for DMA registers
- interrupts: Should contain the one interrupt shared by all channels - interrupts: Should contain the one interrupt shared by all channels
- #dma-cells: must be <1>, the cell in the dmas property of the client device - #dma-cells: must be <1>, the cell in the dmas property of the client device
......
...@@ -4,7 +4,7 @@ This driver follows the generic DMA bindings defined in dma.txt. ...@@ -4,7 +4,7 @@ This driver follows the generic DMA bindings defined in dma.txt.
Required properties: Required properties:
- compatible: Must be "allwinner,sun6i-a31-dma" - compatible: Must be "allwinner,sun6i-a31-dma" or "allwinner,sun8i-a23-dma"
- reg: Should contain the registers base address and length - reg: Should contain the registers base address and length
- interrupts: Should contain a reference to the interrupt used by this device - interrupts: Should contain a reference to the interrupt used by this device
- clocks: Should contain a reference to the parent AHB clock - clocks: Should contain a reference to the parent AHB clock
......
This diff is collapsed.
...@@ -1722,6 +1722,13 @@ F: drivers/dma/at_hdmac.c ...@@ -1722,6 +1722,13 @@ F: drivers/dma/at_hdmac.c
F: drivers/dma/at_hdmac_regs.h F: drivers/dma/at_hdmac_regs.h
F: include/linux/platform_data/dma-atmel.h F: include/linux/platform_data/dma-atmel.h
ATMEL XDMA DRIVER
M: Ludovic Desroches <ludovic.desroches@atmel.com>
L: linux-arm-kernel@lists.infradead.org
L: dmaengine@vger.kernel.org
S: Supported
F: drivers/dma/at_xdmac.c
ATMEL I2C DRIVER ATMEL I2C DRIVER
M: Ludovic Desroches <ludovic.desroches@atmel.com> M: Ludovic Desroches <ludovic.desroches@atmel.com>
L: linux-i2c@vger.kernel.org L: linux-i2c@vger.kernel.org
...@@ -3162,7 +3169,8 @@ Q: https://patchwork.kernel.org/project/linux-dmaengine/list/ ...@@ -3162,7 +3169,8 @@ Q: https://patchwork.kernel.org/project/linux-dmaengine/list/
S: Maintained S: Maintained
F: drivers/dma/ F: drivers/dma/
F: include/linux/dma* F: include/linux/dma*
T: git git://git.infradead.org/users/vkoul/slave-dma.git (slave-dma) F: Documentation/dmaengine/
T: git git://git.infradead.org/users/vkoul/slave-dma.git
DME1737 HARDWARE MONITOR DRIVER DME1737 HARDWARE MONITOR DRIVER
M: Juerg Haefliger <juergh@gmail.com> M: Juerg Haefliger <juergh@gmail.com>
......
...@@ -107,6 +107,13 @@ config AT_HDMAC ...@@ -107,6 +107,13 @@ config AT_HDMAC
help help
Support the Atmel AHB DMA controller. Support the Atmel AHB DMA controller.
config AT_XDMAC
tristate "Atmel XDMA support"
depends on ARCH_AT91
select DMA_ENGINE
help
Support the Atmel XDMA controller.
config FSL_DMA config FSL_DMA
tristate "Freescale Elo series DMA support" tristate "Freescale Elo series DMA support"
depends on FSL_SOC depends on FSL_SOC
...@@ -395,12 +402,12 @@ config XILINX_VDMA ...@@ -395,12 +402,12 @@ config XILINX_VDMA
config DMA_SUN6I config DMA_SUN6I
tristate "Allwinner A31 SoCs DMA support" tristate "Allwinner A31 SoCs DMA support"
depends on MACH_SUN6I || COMPILE_TEST depends on MACH_SUN6I || MACH_SUN8I || COMPILE_TEST
depends on RESET_CONTROLLER depends on RESET_CONTROLLER
select DMA_ENGINE select DMA_ENGINE
select DMA_VIRTUAL_CHANNELS select DMA_VIRTUAL_CHANNELS
help help
Support for the DMA engine for Allwinner A31 SoCs. Support for the DMA engine first found in Allwinner A31 SoCs.
config NBPFAXI_DMA config NBPFAXI_DMA
tristate "Renesas Type-AXI NBPF DMA support" tristate "Renesas Type-AXI NBPF DMA support"
......
...@@ -16,6 +16,7 @@ obj-$(CONFIG_PPC_BESTCOMM) += bestcomm/ ...@@ -16,6 +16,7 @@ obj-$(CONFIG_PPC_BESTCOMM) += bestcomm/
obj-$(CONFIG_MV_XOR) += mv_xor.o obj-$(CONFIG_MV_XOR) += mv_xor.o
obj-$(CONFIG_DW_DMAC_CORE) += dw/ obj-$(CONFIG_DW_DMAC_CORE) += dw/
obj-$(CONFIG_AT_HDMAC) += at_hdmac.o obj-$(CONFIG_AT_HDMAC) += at_hdmac.o
obj-$(CONFIG_AT_XDMAC) += at_xdmac.o
obj-$(CONFIG_MX3_IPU) += ipu/ obj-$(CONFIG_MX3_IPU) += ipu/
obj-$(CONFIG_TXX9_DMAC) += txx9dmac.o obj-$(CONFIG_TXX9_DMAC) += txx9dmac.o
obj-$(CONFIG_SH_DMAE_BASE) += sh/ obj-$(CONFIG_SH_DMAE_BASE) += sh/
......
...@@ -2164,7 +2164,6 @@ static int pl08x_probe(struct amba_device *adev, const struct amba_id *id) ...@@ -2164,7 +2164,6 @@ static int pl08x_probe(struct amba_device *adev, const struct amba_id *id)
__func__, ret); __func__, ret);
goto out_no_memcpy; goto out_no_memcpy;
} }
pl08x->memcpy.chancnt = ret;
/* Register slave channels */ /* Register slave channels */
ret = pl08x_dma_init_virtual_channels(pl08x, &pl08x->slave, ret = pl08x_dma_init_virtual_channels(pl08x, &pl08x->slave,
...@@ -2175,7 +2174,6 @@ static int pl08x_probe(struct amba_device *adev, const struct amba_id *id) ...@@ -2175,7 +2174,6 @@ static int pl08x_probe(struct amba_device *adev, const struct amba_id *id)
__func__, ret); __func__, ret);
goto out_no_slave; goto out_no_slave;
} }
pl08x->slave.chancnt = ret;
ret = dma_async_device_register(&pl08x->memcpy); ret = dma_async_device_register(&pl08x->memcpy);
if (ret) { if (ret) {
......
This diff is collapsed.
...@@ -525,8 +525,6 @@ static int bcm2835_dma_chan_init(struct bcm2835_dmadev *d, int chan_id, int irq) ...@@ -525,8 +525,6 @@ static int bcm2835_dma_chan_init(struct bcm2835_dmadev *d, int chan_id, int irq)
vchan_init(&c->vc, &d->ddev); vchan_init(&c->vc, &d->ddev);
INIT_LIST_HEAD(&c->node); INIT_LIST_HEAD(&c->node);
d->ddev.chancnt++;
c->chan_base = BCM2835_DMA_CHANIO(d->base, chan_id); c->chan_base = BCM2835_DMA_CHANIO(d->base, chan_id);
c->ch = chan_id; c->ch = chan_id;
c->irq_number = irq; c->irq_number = irq;
...@@ -694,7 +692,6 @@ static struct platform_driver bcm2835_dma_driver = { ...@@ -694,7 +692,6 @@ static struct platform_driver bcm2835_dma_driver = {
.remove = bcm2835_dma_remove, .remove = bcm2835_dma_remove,
.driver = { .driver = {
.name = "bcm2835-dma", .name = "bcm2835-dma",
.owner = THIS_MODULE,
.of_match_table = of_match_ptr(bcm2835_dma_of_match), .of_match_table = of_match_ptr(bcm2835_dma_of_match),
}, },
}; };
......
#include <linux/delay.h>
#include <linux/dmaengine.h> #include <linux/dmaengine.h>
#include <linux/dma-mapping.h> #include <linux/dma-mapping.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
...@@ -567,7 +568,7 @@ static int cppi41_tear_down_chan(struct cppi41_channel *c) ...@@ -567,7 +568,7 @@ static int cppi41_tear_down_chan(struct cppi41_channel *c)
reg |= GCR_TEARDOWN; reg |= GCR_TEARDOWN;
cppi_writel(reg, c->gcr_reg); cppi_writel(reg, c->gcr_reg);
c->td_queued = 1; c->td_queued = 1;
c->td_retry = 100; c->td_retry = 500;
} }
if (!c->td_seen || !c->td_desc_seen) { if (!c->td_seen || !c->td_desc_seen) {
...@@ -603,12 +604,16 @@ static int cppi41_tear_down_chan(struct cppi41_channel *c) ...@@ -603,12 +604,16 @@ static int cppi41_tear_down_chan(struct cppi41_channel *c)
* descriptor before the TD we fetch it from enqueue, it has to be * descriptor before the TD we fetch it from enqueue, it has to be
* there waiting for us. * there waiting for us.
*/ */
if (!c->td_seen && c->td_retry) if (!c->td_seen && c->td_retry) {
udelay(1);
return -EAGAIN; return -EAGAIN;
}
WARN_ON(!c->td_retry); WARN_ON(!c->td_retry);
if (!c->td_desc_seen) { if (!c->td_desc_seen) {
desc_phys = cppi41_pop_desc(cdd, c->q_num); desc_phys = cppi41_pop_desc(cdd, c->q_num);
if (!desc_phys)
desc_phys = cppi41_pop_desc(cdd, c->q_comp_num);
WARN_ON(!desc_phys); WARN_ON(!desc_phys);
} }
...@@ -1088,7 +1093,6 @@ static struct platform_driver cpp41_dma_driver = { ...@@ -1088,7 +1093,6 @@ static struct platform_driver cpp41_dma_driver = {
.remove = cppi41_dma_remove, .remove = cppi41_dma_remove,
.driver = { .driver = {
.name = "cppi41-dma-engine", .name = "cppi41-dma-engine",
.owner = THIS_MODULE,
.pm = &cppi41_pm_ops, .pm = &cppi41_pm_ops,
.of_match_table = of_match_ptr(cppi41_dma_ids), .of_match_table = of_match_ptr(cppi41_dma_ids),
}, },
......
...@@ -563,10 +563,9 @@ static int jz4740_dma_probe(struct platform_device *pdev) ...@@ -563,10 +563,9 @@ static int jz4740_dma_probe(struct platform_device *pdev)
dd->device_prep_dma_cyclic = jz4740_dma_prep_dma_cyclic; dd->device_prep_dma_cyclic = jz4740_dma_prep_dma_cyclic;
dd->device_control = jz4740_dma_control; dd->device_control = jz4740_dma_control;
dd->dev = &pdev->dev; dd->dev = &pdev->dev;
dd->chancnt = JZ_DMA_NR_CHANS;
INIT_LIST_HEAD(&dd->channels); INIT_LIST_HEAD(&dd->channels);
for (i = 0; i < dd->chancnt; i++) { for (i = 0; i < JZ_DMA_NR_CHANS; i++) {
chan = &dmadev->chan[i]; chan = &dmadev->chan[i];
chan->id = i; chan->id = i;
chan->vchan.desc_free = jz4740_dma_desc_free; chan->vchan.desc_free = jz4740_dma_desc_free;
...@@ -608,7 +607,6 @@ static struct platform_driver jz4740_dma_driver = { ...@@ -608,7 +607,6 @@ static struct platform_driver jz4740_dma_driver = {
.remove = jz4740_dma_remove, .remove = jz4740_dma_remove,
.driver = { .driver = {
.name = "jz4740-dma", .name = "jz4740-dma",
.owner = THIS_MODULE,
}, },
}; };
module_platform_driver(jz4740_dma_driver); module_platform_driver(jz4740_dma_driver);
......
...@@ -330,7 +330,6 @@ static int __init dma_channel_table_init(void) ...@@ -330,7 +330,6 @@ static int __init dma_channel_table_init(void)
if (err) { if (err) {
pr_err("initialization failure\n"); pr_err("initialization failure\n");
for_each_dma_cap_mask(cap, dma_cap_mask_all) for_each_dma_cap_mask(cap, dma_cap_mask_all)
if (channel_table[cap])
free_percpu(channel_table[cap]); free_percpu(channel_table[cap]);
} }
......
This diff is collapsed.
...@@ -1337,7 +1337,6 @@ static int fsl_dma_chan_probe(struct fsldma_device *fdev, ...@@ -1337,7 +1337,6 @@ static int fsl_dma_chan_probe(struct fsldma_device *fdev,
/* Add the channel to DMA device channel list */ /* Add the channel to DMA device channel list */
list_add_tail(&chan->common.device_node, &fdev->common.channels); list_add_tail(&chan->common.device_node, &fdev->common.channels);
fdev->common.chancnt++;
dev_info(fdev->dev, "#%d (%s), irq %d\n", chan->id, compatible, dev_info(fdev->dev, "#%d (%s), irq %d\n", chan->id, compatible,
chan->irq != NO_IRQ ? chan->irq : fdev->irq); chan->irq != NO_IRQ ? chan->irq : fdev->irq);
......
...@@ -729,6 +729,7 @@ static void sdma_get_pc(struct sdma_channel *sdmac, ...@@ -729,6 +729,7 @@ static void sdma_get_pc(struct sdma_channel *sdmac,
case IMX_DMATYPE_CSPI: case IMX_DMATYPE_CSPI:
case IMX_DMATYPE_EXT: case IMX_DMATYPE_EXT:
case IMX_DMATYPE_SSI: case IMX_DMATYPE_SSI:
case IMX_DMATYPE_SAI:
per_2_emi = sdma->script_addrs->app_2_mcu_addr; per_2_emi = sdma->script_addrs->app_2_mcu_addr;
emi_2_per = sdma->script_addrs->mcu_2_app_addr; emi_2_per = sdma->script_addrs->mcu_2_app_addr;
break; break;
...@@ -1287,7 +1288,8 @@ static void sdma_load_firmware(const struct firmware *fw, void *context) ...@@ -1287,7 +1288,8 @@ static void sdma_load_firmware(const struct firmware *fw, void *context)
unsigned short *ram_code; unsigned short *ram_code;
if (!fw) { if (!fw) {
dev_err(sdma->dev, "firmware not found\n"); dev_info(sdma->dev, "external firmware not found, using ROM firmware\n");
/* In this case we just use the ROM firmware. */
return; return;
} }
...@@ -1346,7 +1348,7 @@ static int sdma_get_firmware(struct sdma_engine *sdma, ...@@ -1346,7 +1348,7 @@ static int sdma_get_firmware(struct sdma_engine *sdma,
return ret; return ret;
} }
static int __init sdma_init(struct sdma_engine *sdma) static int sdma_init(struct sdma_engine *sdma)
{ {
int i, ret; int i, ret;
dma_addr_t ccb_phys; dma_addr_t ccb_phys;
......
...@@ -1265,9 +1265,17 @@ static int ioat_xor_val_self_test(struct ioatdma_device *device) ...@@ -1265,9 +1265,17 @@ static int ioat_xor_val_self_test(struct ioatdma_device *device)
op = IOAT_OP_XOR; op = IOAT_OP_XOR;
dest_dma = dma_map_page(dev, dest, 0, PAGE_SIZE, DMA_FROM_DEVICE); dest_dma = dma_map_page(dev, dest, 0, PAGE_SIZE, DMA_FROM_DEVICE);
if (dma_mapping_error(dev, dest_dma))
goto dma_unmap;
for (i = 0; i < IOAT_NUM_SRC_TEST; i++) for (i = 0; i < IOAT_NUM_SRC_TEST; i++)
dma_srcs[i] = DMA_ERROR_CODE;
for (i = 0; i < IOAT_NUM_SRC_TEST; i++) {
dma_srcs[i] = dma_map_page(dev, xor_srcs[i], 0, PAGE_SIZE, dma_srcs[i] = dma_map_page(dev, xor_srcs[i], 0, PAGE_SIZE,
DMA_TO_DEVICE); DMA_TO_DEVICE);
if (dma_mapping_error(dev, dma_srcs[i]))
goto dma_unmap;
}
tx = dma->device_prep_dma_xor(dma_chan, dest_dma, dma_srcs, tx = dma->device_prep_dma_xor(dma_chan, dest_dma, dma_srcs,
IOAT_NUM_SRC_TEST, PAGE_SIZE, IOAT_NUM_SRC_TEST, PAGE_SIZE,
DMA_PREP_INTERRUPT); DMA_PREP_INTERRUPT);
...@@ -1298,7 +1306,6 @@ static int ioat_xor_val_self_test(struct ioatdma_device *device) ...@@ -1298,7 +1306,6 @@ static int ioat_xor_val_self_test(struct ioatdma_device *device)
goto dma_unmap; goto dma_unmap;
} }
dma_unmap_page(dev, dest_dma, PAGE_SIZE, DMA_FROM_DEVICE);
for (i = 0; i < IOAT_NUM_SRC_TEST; i++) for (i = 0; i < IOAT_NUM_SRC_TEST; i++)
dma_unmap_page(dev, dma_srcs[i], PAGE_SIZE, DMA_TO_DEVICE); dma_unmap_page(dev, dma_srcs[i], PAGE_SIZE, DMA_TO_DEVICE);
...@@ -1313,6 +1320,8 @@ static int ioat_xor_val_self_test(struct ioatdma_device *device) ...@@ -1313,6 +1320,8 @@ static int ioat_xor_val_self_test(struct ioatdma_device *device)
} }
dma_sync_single_for_device(dev, dest_dma, PAGE_SIZE, DMA_FROM_DEVICE); dma_sync_single_for_device(dev, dest_dma, PAGE_SIZE, DMA_FROM_DEVICE);
dma_unmap_page(dev, dest_dma, PAGE_SIZE, DMA_FROM_DEVICE);
/* skip validate if the capability is not present */ /* skip validate if the capability is not present */
if (!dma_has_cap(DMA_XOR_VAL, dma_chan->device->cap_mask)) if (!dma_has_cap(DMA_XOR_VAL, dma_chan->device->cap_mask))
goto free_resources; goto free_resources;
...@@ -1327,8 +1336,13 @@ static int ioat_xor_val_self_test(struct ioatdma_device *device) ...@@ -1327,8 +1336,13 @@ static int ioat_xor_val_self_test(struct ioatdma_device *device)
xor_val_result = 1; xor_val_result = 1;
for (i = 0; i < IOAT_NUM_SRC_TEST + 1; i++) for (i = 0; i < IOAT_NUM_SRC_TEST + 1; i++)
dma_srcs[i] = DMA_ERROR_CODE;
for (i = 0; i < IOAT_NUM_SRC_TEST + 1; i++) {
dma_srcs[i] = dma_map_page(dev, xor_val_srcs[i], 0, PAGE_SIZE, dma_srcs[i] = dma_map_page(dev, xor_val_srcs[i], 0, PAGE_SIZE,
DMA_TO_DEVICE); DMA_TO_DEVICE);
if (dma_mapping_error(dev, dma_srcs[i]))
goto dma_unmap;
}
tx = dma->device_prep_dma_xor_val(dma_chan, dma_srcs, tx = dma->device_prep_dma_xor_val(dma_chan, dma_srcs,
IOAT_NUM_SRC_TEST + 1, PAGE_SIZE, IOAT_NUM_SRC_TEST + 1, PAGE_SIZE,
&xor_val_result, DMA_PREP_INTERRUPT); &xor_val_result, DMA_PREP_INTERRUPT);
...@@ -1374,8 +1388,13 @@ static int ioat_xor_val_self_test(struct ioatdma_device *device) ...@@ -1374,8 +1388,13 @@ static int ioat_xor_val_self_test(struct ioatdma_device *device)
xor_val_result = 0; xor_val_result = 0;
for (i = 0; i < IOAT_NUM_SRC_TEST + 1; i++) for (i = 0; i < IOAT_NUM_SRC_TEST + 1; i++)
dma_srcs[i] = DMA_ERROR_CODE;
for (i = 0; i < IOAT_NUM_SRC_TEST + 1; i++) {
dma_srcs[i] = dma_map_page(dev, xor_val_srcs[i], 0, PAGE_SIZE, dma_srcs[i] = dma_map_page(dev, xor_val_srcs[i], 0, PAGE_SIZE,
DMA_TO_DEVICE); DMA_TO_DEVICE);
if (dma_mapping_error(dev, dma_srcs[i]))
goto dma_unmap;
}
tx = dma->device_prep_dma_xor_val(dma_chan, dma_srcs, tx = dma->device_prep_dma_xor_val(dma_chan, dma_srcs,
IOAT_NUM_SRC_TEST + 1, PAGE_SIZE, IOAT_NUM_SRC_TEST + 1, PAGE_SIZE,
&xor_val_result, DMA_PREP_INTERRUPT); &xor_val_result, DMA_PREP_INTERRUPT);
...@@ -1417,12 +1436,16 @@ static int ioat_xor_val_self_test(struct ioatdma_device *device) ...@@ -1417,12 +1436,16 @@ static int ioat_xor_val_self_test(struct ioatdma_device *device)
goto free_resources; goto free_resources;
dma_unmap: dma_unmap:
if (op == IOAT_OP_XOR) { if (op == IOAT_OP_XOR) {
dma_unmap_page(dev, dest_dma, PAGE_SIZE, DMA_FROM_DEVICE); if (dest_dma != DMA_ERROR_CODE)
dma_unmap_page(dev, dest_dma, PAGE_SIZE,
DMA_FROM_DEVICE);
for (i = 0; i < IOAT_NUM_SRC_TEST; i++) for (i = 0; i < IOAT_NUM_SRC_TEST; i++)
if (dma_srcs[i] != DMA_ERROR_CODE)
dma_unmap_page(dev, dma_srcs[i], PAGE_SIZE, dma_unmap_page(dev, dma_srcs[i], PAGE_SIZE,
DMA_TO_DEVICE); DMA_TO_DEVICE);
} else if (op == IOAT_OP_XOR_VAL) { } else if (op == IOAT_OP_XOR_VAL) {
for (i = 0; i < IOAT_NUM_SRC_TEST + 1; i++) for (i = 0; i < IOAT_NUM_SRC_TEST + 1; i++)
if (dma_srcs[i] != DMA_ERROR_CODE)
dma_unmap_page(dev, dma_srcs[i], PAGE_SIZE, dma_unmap_page(dev, dma_srcs[i], PAGE_SIZE,
DMA_TO_DEVICE); DMA_TO_DEVICE);
} }
......
...@@ -1557,7 +1557,6 @@ static struct platform_driver iop_adma_driver = { ...@@ -1557,7 +1557,6 @@ static struct platform_driver iop_adma_driver = {
.probe = iop_adma_probe, .probe = iop_adma_probe,
.remove = iop_adma_remove, .remove = iop_adma_remove,
.driver = { .driver = {
.owner = THIS_MODULE,
.name = "iop-adma", .name = "iop-adma",
}, },
}; };
......
...@@ -722,7 +722,6 @@ static int k3_dma_probe(struct platform_device *op) ...@@ -722,7 +722,6 @@ static int k3_dma_probe(struct platform_device *op)
d->slave.device_issue_pending = k3_dma_issue_pending; d->slave.device_issue_pending = k3_dma_issue_pending;
d->slave.device_control = k3_dma_control; d->slave.device_control = k3_dma_control;
d->slave.copy_align = DMA_ALIGN; d->slave.copy_align = DMA_ALIGN;
d->slave.chancnt = d->dma_requests;
/* init virtual channel */ /* init virtual channel */
d->chans = devm_kzalloc(&op->dev, d->chans = devm_kzalloc(&op->dev,
...@@ -787,6 +786,7 @@ static int k3_dma_remove(struct platform_device *op) ...@@ -787,6 +786,7 @@ static int k3_dma_remove(struct platform_device *op)
return 0; return 0;
} }
#ifdef CONFIG_PM_SLEEP
static int k3_dma_suspend(struct device *dev) static int k3_dma_suspend(struct device *dev)
{ {
struct k3_dma_dev *d = dev_get_drvdata(dev); struct k3_dma_dev *d = dev_get_drvdata(dev);
...@@ -816,13 +816,13 @@ static int k3_dma_resume(struct device *dev) ...@@ -816,13 +816,13 @@ static int k3_dma_resume(struct device *dev)
k3_dma_enable_dma(d, true); k3_dma_enable_dma(d, true);
return 0; return 0;
} }
#endif
static SIMPLE_DEV_PM_OPS(k3_dma_pmops, k3_dma_suspend, k3_dma_resume); static SIMPLE_DEV_PM_OPS(k3_dma_pmops, k3_dma_suspend, k3_dma_resume);
static struct platform_driver k3_pdma_driver = { static struct platform_driver k3_pdma_driver = {
.driver = { .driver = {
.name = DRIVER_NAME, .name = DRIVER_NAME,
.owner = THIS_MODULE,
.pm = &k3_dma_pmops, .pm = &k3_dma_pmops,
.of_match_table = k3_pdma_dt_ids, .of_match_table = k3_pdma_dt_ids,
}, },
......
...@@ -1098,7 +1098,6 @@ static const struct platform_device_id mmp_pdma_id_table[] = { ...@@ -1098,7 +1098,6 @@ static const struct platform_device_id mmp_pdma_id_table[] = {
static struct platform_driver mmp_pdma_driver = { static struct platform_driver mmp_pdma_driver = {
.driver = { .driver = {
.name = "mmp-pdma", .name = "mmp-pdma",
.owner = THIS_MODULE,
.of_match_table = mmp_pdma_dt_ids, .of_match_table = mmp_pdma_dt_ids,
}, },
.id_table = mmp_pdma_id_table, .id_table = mmp_pdma_id_table,
......
...@@ -703,7 +703,6 @@ static const struct platform_device_id mmp_tdma_id_table[] = { ...@@ -703,7 +703,6 @@ static const struct platform_device_id mmp_tdma_id_table[] = {
static struct platform_driver mmp_tdma_driver = { static struct platform_driver mmp_tdma_driver = {
.driver = { .driver = {
.name = "mmp-tdma", .name = "mmp-tdma",
.owner = THIS_MODULE,
.of_match_table = mmp_tdma_dt_ids, .of_match_table = mmp_tdma_dt_ids,
}, },
.id_table = mmp_tdma_id_table, .id_table = mmp_tdma_id_table,
......
...@@ -885,6 +885,7 @@ static int mpc_dma_probe(struct platform_device *op) ...@@ -885,6 +885,7 @@ static int mpc_dma_probe(struct platform_device *op)
struct resource res; struct resource res;
ulong regs_start, regs_size; ulong regs_start, regs_size;
int retval, i; int retval, i;
u8 chancnt;
mdma = devm_kzalloc(dev, sizeof(struct mpc_dma), GFP_KERNEL); mdma = devm_kzalloc(dev, sizeof(struct mpc_dma), GFP_KERNEL);
if (!mdma) { if (!mdma) {
...@@ -956,10 +957,6 @@ static int mpc_dma_probe(struct platform_device *op) ...@@ -956,10 +957,6 @@ static int mpc_dma_probe(struct platform_device *op)
dma = &mdma->dma; dma = &mdma->dma;
dma->dev = dev; dma->dev = dev;
if (mdma->is_mpc8308)
dma->chancnt = MPC8308_DMACHAN_MAX;
else
dma->chancnt = MPC512x_DMACHAN_MAX;
dma->device_alloc_chan_resources = mpc_dma_alloc_chan_resources; dma->device_alloc_chan_resources = mpc_dma_alloc_chan_resources;
dma->device_free_chan_resources = mpc_dma_free_chan_resources; dma->device_free_chan_resources = mpc_dma_free_chan_resources;
dma->device_issue_pending = mpc_dma_issue_pending; dma->device_issue_pending = mpc_dma_issue_pending;
...@@ -972,7 +969,12 @@ static int mpc_dma_probe(struct platform_device *op) ...@@ -972,7 +969,12 @@ static int mpc_dma_probe(struct platform_device *op)
dma_cap_set(DMA_MEMCPY, dma->cap_mask); dma_cap_set(DMA_MEMCPY, dma->cap_mask);
dma_cap_set(DMA_SLAVE, dma->cap_mask); dma_cap_set(DMA_SLAVE, dma->cap_mask);
for (i = 0; i < dma->chancnt; i++) { if (mdma->is_mpc8308)
chancnt = MPC8308_DMACHAN_MAX;
else
chancnt = MPC512x_DMACHAN_MAX;
for (i = 0; i < chancnt; i++) {
mchan = &mdma->channels[i]; mchan = &mdma->channels[i];
mchan->chan.device = dma; mchan->chan.device = dma;
...@@ -1090,7 +1092,6 @@ static struct platform_driver mpc_dma_driver = { ...@@ -1090,7 +1092,6 @@ static struct platform_driver mpc_dma_driver = {
.remove = mpc_dma_remove, .remove = mpc_dma_remove,
.driver = { .driver = {
.name = DRV_NAME, .name = DRV_NAME,
.owner = THIS_MODULE,
.of_match_table = mpc_dma_match, .of_match_table = mpc_dma_match,
}, },
}; };
......
...@@ -1500,7 +1500,6 @@ static const struct dev_pm_ops nbpf_pm_ops = { ...@@ -1500,7 +1500,6 @@ static const struct dev_pm_ops nbpf_pm_ops = {
static struct platform_driver nbpf_driver = { static struct platform_driver nbpf_driver = {
.driver = { .driver = {
.owner = THIS_MODULE,
.name = "dma-nbpf", .name = "dma-nbpf",
.of_match_table = nbpf_match, .of_match_table = nbpf_match,
.pm = &nbpf_pm_ops, .pm = &nbpf_pm_ops,
......
...@@ -1074,8 +1074,6 @@ static int omap_dma_chan_init(struct omap_dmadev *od, int dma_sig) ...@@ -1074,8 +1074,6 @@ static int omap_dma_chan_init(struct omap_dmadev *od, int dma_sig)
vchan_init(&c->vc, &od->ddev); vchan_init(&c->vc, &od->ddev);
INIT_LIST_HEAD(&c->node); INIT_LIST_HEAD(&c->node);
od->ddev.chancnt++;
return 0; return 0;
} }
......
...@@ -997,7 +997,7 @@ static void pch_dma_remove(struct pci_dev *pdev) ...@@ -997,7 +997,7 @@ static void pch_dma_remove(struct pci_dev *pdev)
#define PCI_DEVICE_ID_ML7831_DMA1_8CH 0x8810 #define PCI_DEVICE_ID_ML7831_DMA1_8CH 0x8810
#define PCI_DEVICE_ID_ML7831_DMA2_4CH 0x8815 #define PCI_DEVICE_ID_ML7831_DMA2_4CH 0x8815
const struct pci_device_id pch_dma_id_table[] = { static const struct pci_device_id pch_dma_id_table[] = {
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_EG20T_PCH_DMA_8CH), 8 }, { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_EG20T_PCH_DMA_8CH), 8 },
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_EG20T_PCH_DMA_4CH), 4 }, { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_EG20T_PCH_DMA_4CH), 4 },
{ PCI_VDEVICE(ROHM, PCI_DEVICE_ID_ML7213_DMA1_8CH), 8}, /* UART Video */ { PCI_VDEVICE(ROHM, PCI_DEVICE_ID_ML7213_DMA1_8CH), 8}, /* UART Video */
......
...@@ -2619,6 +2619,9 @@ pl330_probe(struct amba_device *adev, const struct amba_id *id) ...@@ -2619,6 +2619,9 @@ pl330_probe(struct amba_device *adev, const struct amba_id *id)
return -ENOMEM; return -ENOMEM;
} }
pd = &pl330->ddma;
pd->dev = &adev->dev;
pl330->mcbufsz = pdat ? pdat->mcbuf_sz : 0; pl330->mcbufsz = pdat ? pdat->mcbuf_sz : 0;
res = &adev->res; res = &adev->res;
...@@ -2655,7 +2658,6 @@ pl330_probe(struct amba_device *adev, const struct amba_id *id) ...@@ -2655,7 +2658,6 @@ pl330_probe(struct amba_device *adev, const struct amba_id *id)
if (!add_desc(pl330, GFP_KERNEL, NR_DEFAULT_DESC)) if (!add_desc(pl330, GFP_KERNEL, NR_DEFAULT_DESC))
dev_warn(&adev->dev, "unable to allocate desc\n"); dev_warn(&adev->dev, "unable to allocate desc\n");
pd = &pl330->ddma;
INIT_LIST_HEAD(&pd->channels); INIT_LIST_HEAD(&pd->channels);
/* Initialize channel parameters */ /* Initialize channel parameters */
...@@ -2692,7 +2694,6 @@ pl330_probe(struct amba_device *adev, const struct amba_id *id) ...@@ -2692,7 +2694,6 @@ pl330_probe(struct amba_device *adev, const struct amba_id *id)
list_add_tail(&pch->chan.device_node, &pd->channels); list_add_tail(&pch->chan.device_node, &pd->channels);
} }
pd->dev = &adev->dev;
if (pdat) { if (pdat) {
pd->cap_mask = pdat->cap_mask; pd->cap_mask = pdat->cap_mask;
} else { } else {
...@@ -2819,6 +2820,6 @@ static struct amba_driver pl330_driver = { ...@@ -2819,6 +2820,6 @@ static struct amba_driver pl330_driver = {
module_amba_driver(pl330_driver); module_amba_driver(pl330_driver);
MODULE_AUTHOR("Jaswinder Singh <jassi.brar@samsung.com>"); MODULE_AUTHOR("Jaswinder Singh <jassisinghbrar@gmail.com>");
MODULE_DESCRIPTION("API Driver for PL330 DMAC"); MODULE_DESCRIPTION("API Driver for PL330 DMAC");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
This diff is collapsed.
...@@ -1402,7 +1402,6 @@ static int s3c24xx_dma_remove(struct platform_device *pdev) ...@@ -1402,7 +1402,6 @@ static int s3c24xx_dma_remove(struct platform_device *pdev)
static struct platform_driver s3c24xx_dma_driver = { static struct platform_driver s3c24xx_dma_driver = {
.driver = { .driver = {
.name = "s3c24xx-dma", .name = "s3c24xx-dma",
.owner = THIS_MODULE,
}, },
.id_table = s3c24xx_dma_driver_ids, .id_table = s3c24xx_dma_driver_ids,
.probe = s3c24xx_dma_probe, .probe = s3c24xx_dma_probe,
......
...@@ -829,7 +829,6 @@ static int sa11x0_dma_init_dmadev(struct dma_device *dmadev, ...@@ -829,7 +829,6 @@ static int sa11x0_dma_init_dmadev(struct dma_device *dmadev,
{ {
unsigned i; unsigned i;
dmadev->chancnt = ARRAY_SIZE(chan_desc);
INIT_LIST_HEAD(&dmadev->channels); INIT_LIST_HEAD(&dmadev->channels);
dmadev->dev = dev; dmadev->dev = dev;
dmadev->device_alloc_chan_resources = sa11x0_dma_alloc_chan_resources; dmadev->device_alloc_chan_resources = sa11x0_dma_alloc_chan_resources;
...@@ -838,7 +837,7 @@ static int sa11x0_dma_init_dmadev(struct dma_device *dmadev, ...@@ -838,7 +837,7 @@ static int sa11x0_dma_init_dmadev(struct dma_device *dmadev,
dmadev->device_tx_status = sa11x0_dma_tx_status; dmadev->device_tx_status = sa11x0_dma_tx_status;
dmadev->device_issue_pending = sa11x0_dma_issue_pending; dmadev->device_issue_pending = sa11x0_dma_issue_pending;
for (i = 0; i < dmadev->chancnt; i++) { for (i = 0; i < ARRAY_SIZE(chan_desc); i++) {
struct sa11x0_dma_chan *c; struct sa11x0_dma_chan *c;
c = kzalloc(sizeof(*c), GFP_KERNEL); c = kzalloc(sizeof(*c), GFP_KERNEL);
......
...@@ -253,7 +253,6 @@ static int audmapp_chan_probe(struct platform_device *pdev, ...@@ -253,7 +253,6 @@ static int audmapp_chan_probe(struct platform_device *pdev,
static void audmapp_chan_remove(struct audmapp_device *audev) static void audmapp_chan_remove(struct audmapp_device *audev)
{ {
struct dma_device *dma_dev = &audev->shdma_dev.dma_dev;
struct shdma_chan *schan; struct shdma_chan *schan;
int i; int i;
...@@ -261,7 +260,6 @@ static void audmapp_chan_remove(struct audmapp_device *audev) ...@@ -261,7 +260,6 @@ static void audmapp_chan_remove(struct audmapp_device *audev)
BUG_ON(!schan); BUG_ON(!schan);
shdma_chan_remove(schan); shdma_chan_remove(schan);
} }
dma_dev->chancnt = 0;
} }
static struct dma_chan *audmapp_of_xlate(struct of_phandle_args *dma_spec, static struct dma_chan *audmapp_of_xlate(struct of_phandle_args *dma_spec,
...@@ -367,7 +365,6 @@ static struct platform_driver audmapp_driver = { ...@@ -367,7 +365,6 @@ static struct platform_driver audmapp_driver = {
.probe = audmapp_probe, .probe = audmapp_probe,
.remove = audmapp_remove, .remove = audmapp_remove,
.driver = { .driver = {
.owner = THIS_MODULE,
.name = "rcar-audmapp-engine", .name = "rcar-audmapp-engine",
.of_match_table = audmapp_of_match, .of_match_table = audmapp_of_match,
}, },
......
...@@ -619,7 +619,6 @@ static int hpb_dmae_probe(struct platform_device *pdev) ...@@ -619,7 +619,6 @@ static int hpb_dmae_probe(struct platform_device *pdev)
static void hpb_dmae_chan_remove(struct hpb_dmae_device *hpbdev) static void hpb_dmae_chan_remove(struct hpb_dmae_device *hpbdev)
{ {
struct dma_device *dma_dev = &hpbdev->shdma_dev.dma_dev;
struct shdma_chan *schan; struct shdma_chan *schan;
int i; int i;
...@@ -628,7 +627,6 @@ static void hpb_dmae_chan_remove(struct hpb_dmae_device *hpbdev) ...@@ -628,7 +627,6 @@ static void hpb_dmae_chan_remove(struct hpb_dmae_device *hpbdev)
shdma_chan_remove(schan); shdma_chan_remove(schan);
} }
dma_dev->chancnt = 0;
} }
static int hpb_dmae_remove(struct platform_device *pdev) static int hpb_dmae_remove(struct platform_device *pdev)
...@@ -655,7 +653,6 @@ static struct platform_driver hpb_dmae_driver = { ...@@ -655,7 +653,6 @@ static struct platform_driver hpb_dmae_driver = {
.remove = hpb_dmae_remove, .remove = hpb_dmae_remove,
.shutdown = hpb_dmae_shutdown, .shutdown = hpb_dmae_shutdown,
.driver = { .driver = {
.owner = THIS_MODULE,
.name = "hpb-dma-engine", .name = "hpb-dma-engine",
}, },
}; };
......
...@@ -391,6 +391,8 @@ static dma_async_tx_callback __ld_cleanup(struct shdma_chan *schan, bool all) ...@@ -391,6 +391,8 @@ static dma_async_tx_callback __ld_cleanup(struct shdma_chan *schan, bool all)
dev_dbg(schan->dev, "Bring down channel %d\n", schan->id); dev_dbg(schan->dev, "Bring down channel %d\n", schan->id);
pm_runtime_put(schan->dev); pm_runtime_put(schan->dev);
schan->pm_state = SHDMA_PM_ESTABLISHED; schan->pm_state = SHDMA_PM_ESTABLISHED;
} else if (schan->pm_state == SHDMA_PM_PENDING) {
shdma_chan_xfer_ld_queue(schan);
} }
} }
} }
...@@ -951,7 +953,7 @@ void shdma_chan_probe(struct shdma_dev *sdev, ...@@ -951,7 +953,7 @@ void shdma_chan_probe(struct shdma_dev *sdev,
/* Add the channel to DMA device channel list */ /* Add the channel to DMA device channel list */
list_add_tail(&schan->dma_chan.device_node, list_add_tail(&schan->dma_chan.device_node,
&sdev->dma_dev.channels); &sdev->dma_dev.channels);
sdev->schan[sdev->dma_dev.chancnt++] = schan; sdev->schan[id] = schan;
} }
EXPORT_SYMBOL(shdma_chan_probe); EXPORT_SYMBOL(shdma_chan_probe);
......
...@@ -66,7 +66,6 @@ MODULE_DEVICE_TABLE(of, sh_dmae_of_match); ...@@ -66,7 +66,6 @@ MODULE_DEVICE_TABLE(of, sh_dmae_of_match);
static struct platform_driver shdma_of = { static struct platform_driver shdma_of = {
.driver = { .driver = {
.owner = THIS_MODULE,
.name = "shdma-of", .name = "shdma-of",
.of_match_table = shdma_of_match, .of_match_table = shdma_of_match,
}, },
......
...@@ -572,7 +572,6 @@ static int sh_dmae_chan_probe(struct sh_dmae_device *shdev, int id, ...@@ -572,7 +572,6 @@ static int sh_dmae_chan_probe(struct sh_dmae_device *shdev, int id,
static void sh_dmae_chan_remove(struct sh_dmae_device *shdev) static void sh_dmae_chan_remove(struct sh_dmae_device *shdev)
{ {
struct dma_device *dma_dev = &shdev->shdma_dev.dma_dev;
struct shdma_chan *schan; struct shdma_chan *schan;
int i; int i;
...@@ -581,7 +580,6 @@ static void sh_dmae_chan_remove(struct sh_dmae_device *shdev) ...@@ -581,7 +580,6 @@ static void sh_dmae_chan_remove(struct sh_dmae_device *shdev)
shdma_chan_remove(schan); shdma_chan_remove(schan);
} }
dma_dev->chancnt = 0;
} }
static void sh_dmae_shutdown(struct platform_device *pdev) static void sh_dmae_shutdown(struct platform_device *pdev)
......
...@@ -295,7 +295,6 @@ static int sudmac_chan_probe(struct sudmac_device *su_dev, int id, int irq, ...@@ -295,7 +295,6 @@ static int sudmac_chan_probe(struct sudmac_device *su_dev, int id, int irq,
static void sudmac_chan_remove(struct sudmac_device *su_dev) static void sudmac_chan_remove(struct sudmac_device *su_dev)
{ {
struct dma_device *dma_dev = &su_dev->shdma_dev.dma_dev;
struct shdma_chan *schan; struct shdma_chan *schan;
int i; int i;
...@@ -304,7 +303,6 @@ static void sudmac_chan_remove(struct sudmac_device *su_dev) ...@@ -304,7 +303,6 @@ static void sudmac_chan_remove(struct sudmac_device *su_dev)
shdma_chan_remove(schan); shdma_chan_remove(schan);
} }
dma_dev->chancnt = 0;
} }
static dma_addr_t sudmac_slave_addr(struct shdma_chan *schan) static dma_addr_t sudmac_slave_addr(struct shdma_chan *schan)
...@@ -411,7 +409,6 @@ static int sudmac_remove(struct platform_device *pdev) ...@@ -411,7 +409,6 @@ static int sudmac_remove(struct platform_device *pdev)
static struct platform_driver sudmac_driver = { static struct platform_driver sudmac_driver = {
.driver = { .driver = {
.owner = THIS_MODULE,
.name = SUDMAC_DRV_NAME, .name = SUDMAC_DRV_NAME,
}, },
.probe = sudmac_probe, .probe = sudmac_probe,
......
...@@ -735,7 +735,6 @@ static int sirfsoc_dma_probe(struct platform_device *op) ...@@ -735,7 +735,6 @@ static int sirfsoc_dma_probe(struct platform_device *op)
dma = &sdma->dma; dma = &sdma->dma;
dma->dev = dev; dma->dev = dev;
dma->chancnt = SIRFSOC_DMA_CHANNELS;
dma->device_alloc_chan_resources = sirfsoc_dma_alloc_chan_resources; dma->device_alloc_chan_resources = sirfsoc_dma_alloc_chan_resources;
dma->device_free_chan_resources = sirfsoc_dma_free_chan_resources; dma->device_free_chan_resources = sirfsoc_dma_free_chan_resources;
...@@ -752,7 +751,7 @@ static int sirfsoc_dma_probe(struct platform_device *op) ...@@ -752,7 +751,7 @@ static int sirfsoc_dma_probe(struct platform_device *op)
dma_cap_set(DMA_INTERLEAVE, dma->cap_mask); dma_cap_set(DMA_INTERLEAVE, dma->cap_mask);
dma_cap_set(DMA_PRIVATE, dma->cap_mask); dma_cap_set(DMA_PRIVATE, dma->cap_mask);
for (i = 0; i < dma->chancnt; i++) { for (i = 0; i < SIRFSOC_DMA_CHANNELS; i++) {
schan = &sdma->channels[i]; schan = &sdma->channels[i];
schan->chan.device = dma; schan->chan.device = dma;
...@@ -835,6 +834,7 @@ static int sirfsoc_dma_runtime_resume(struct device *dev) ...@@ -835,6 +834,7 @@ static int sirfsoc_dma_runtime_resume(struct device *dev)
return 0; return 0;
} }
#ifdef CONFIG_PM_SLEEP
static int sirfsoc_dma_pm_suspend(struct device *dev) static int sirfsoc_dma_pm_suspend(struct device *dev)
{ {
struct sirfsoc_dma *sdma = dev_get_drvdata(dev); struct sirfsoc_dma *sdma = dev_get_drvdata(dev);
...@@ -916,6 +916,7 @@ static int sirfsoc_dma_pm_resume(struct device *dev) ...@@ -916,6 +916,7 @@ static int sirfsoc_dma_pm_resume(struct device *dev)
return 0; return 0;
} }
#endif
static const struct dev_pm_ops sirfsoc_dma_pm_ops = { static const struct dev_pm_ops sirfsoc_dma_pm_ops = {
SET_RUNTIME_PM_OPS(sirfsoc_dma_runtime_suspend, sirfsoc_dma_runtime_resume, NULL) SET_RUNTIME_PM_OPS(sirfsoc_dma_runtime_suspend, sirfsoc_dma_runtime_resume, NULL)
......
...@@ -3432,6 +3432,7 @@ static int __init d40_lcla_allocate(struct d40_base *base) ...@@ -3432,6 +3432,7 @@ static int __init d40_lcla_allocate(struct d40_base *base)
d40_err(base->dev, "Failed to allocate %d pages.\n", d40_err(base->dev, "Failed to allocate %d pages.\n",
base->lcla_pool.pages); base->lcla_pool.pages);
ret = -ENOMEM;
for (j = 0; j < i; j++) for (j = 0; j < i; j++)
free_pages(page_list[j], base->lcla_pool.pages); free_pages(page_list[j], base->lcla_pool.pages);
......
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/of_dma.h> #include <linux/of_dma.h>
#include <linux/of_device.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/reset.h> #include <linux/reset.h>
#include <linux/slab.h> #include <linux/slab.h>
...@@ -25,24 +26,6 @@ ...@@ -25,24 +26,6 @@
#include "virt-dma.h" #include "virt-dma.h"
/*
* There's 16 physical channels that can work in parallel.
*
* However we have 30 different endpoints for our requests.
*
* Since the channels are able to handle only an unidirectional
* transfer, we need to allocate more virtual channels so that
* everyone can grab one channel.
*
* Some devices can't work in both direction (mostly because it
* wouldn't make sense), so we have a bit fewer virtual channels than
* 2 channels per endpoints.
*/
#define NR_MAX_CHANNELS 16
#define NR_MAX_REQUESTS 30
#define NR_MAX_VCHANS 53
/* /*
* Common registers * Common registers
*/ */
...@@ -59,6 +42,12 @@ ...@@ -59,6 +42,12 @@
#define DMA_STAT 0x30 #define DMA_STAT 0x30
/*
* sun8i specific registers
*/
#define SUN8I_DMA_GATE 0x20
#define SUN8I_DMA_GATE_ENABLE 0x4
/* /*
* Channels specific registers * Channels specific registers
*/ */
...@@ -101,6 +90,19 @@ ...@@ -101,6 +90,19 @@
#define NORMAL_WAIT 8 #define NORMAL_WAIT 8
#define DRQ_SDRAM 1 #define DRQ_SDRAM 1
/*
* Hardware channels / ports representation
*
* The hardware is used in several SoCs, with differing numbers
* of channels and endpoints. This structure ties those numbers
* to a certain compatible string.
*/
struct sun6i_dma_config {
u32 nr_max_channels;
u32 nr_max_requests;
u32 nr_max_vchans;
};
/* /*
* Hardware representation of the LLI * Hardware representation of the LLI
* *
...@@ -159,6 +161,7 @@ struct sun6i_dma_dev { ...@@ -159,6 +161,7 @@ struct sun6i_dma_dev {
struct dma_pool *pool; struct dma_pool *pool;
struct sun6i_pchan *pchans; struct sun6i_pchan *pchans;
struct sun6i_vchan *vchans; struct sun6i_vchan *vchans;
const struct sun6i_dma_config *cfg;
}; };
static struct device *chan2dev(struct dma_chan *chan) static struct device *chan2dev(struct dma_chan *chan)
...@@ -426,6 +429,7 @@ static int sun6i_dma_start_desc(struct sun6i_vchan *vchan) ...@@ -426,6 +429,7 @@ static int sun6i_dma_start_desc(struct sun6i_vchan *vchan)
static void sun6i_dma_tasklet(unsigned long data) static void sun6i_dma_tasklet(unsigned long data)
{ {
struct sun6i_dma_dev *sdev = (struct sun6i_dma_dev *)data; struct sun6i_dma_dev *sdev = (struct sun6i_dma_dev *)data;
const struct sun6i_dma_config *cfg = sdev->cfg;
struct sun6i_vchan *vchan; struct sun6i_vchan *vchan;
struct sun6i_pchan *pchan; struct sun6i_pchan *pchan;
unsigned int pchan_alloc = 0; unsigned int pchan_alloc = 0;
...@@ -453,7 +457,7 @@ static void sun6i_dma_tasklet(unsigned long data) ...@@ -453,7 +457,7 @@ static void sun6i_dma_tasklet(unsigned long data)
} }
spin_lock_irq(&sdev->lock); spin_lock_irq(&sdev->lock);
for (pchan_idx = 0; pchan_idx < NR_MAX_CHANNELS; pchan_idx++) { for (pchan_idx = 0; pchan_idx < cfg->nr_max_channels; pchan_idx++) {
pchan = &sdev->pchans[pchan_idx]; pchan = &sdev->pchans[pchan_idx];
if (pchan->vchan || list_empty(&sdev->pending)) if (pchan->vchan || list_empty(&sdev->pending))
...@@ -474,7 +478,7 @@ static void sun6i_dma_tasklet(unsigned long data) ...@@ -474,7 +478,7 @@ static void sun6i_dma_tasklet(unsigned long data)
} }
spin_unlock_irq(&sdev->lock); spin_unlock_irq(&sdev->lock);
for (pchan_idx = 0; pchan_idx < NR_MAX_CHANNELS; pchan_idx++) { for (pchan_idx = 0; pchan_idx < cfg->nr_max_channels; pchan_idx++) {
if (!(pchan_alloc & BIT(pchan_idx))) if (!(pchan_alloc & BIT(pchan_idx)))
continue; continue;
...@@ -496,7 +500,7 @@ static irqreturn_t sun6i_dma_interrupt(int irq, void *dev_id) ...@@ -496,7 +500,7 @@ static irqreturn_t sun6i_dma_interrupt(int irq, void *dev_id)
int i, j, ret = IRQ_NONE; int i, j, ret = IRQ_NONE;
u32 status; u32 status;
for (i = 0; i < 2; i++) { for (i = 0; i < sdev->cfg->nr_max_channels / DMA_IRQ_CHAN_NR; i++) {
status = readl(sdev->base + DMA_IRQ_STAT(i)); status = readl(sdev->base + DMA_IRQ_STAT(i));
if (!status) if (!status)
continue; continue;
...@@ -506,7 +510,7 @@ static irqreturn_t sun6i_dma_interrupt(int irq, void *dev_id) ...@@ -506,7 +510,7 @@ static irqreturn_t sun6i_dma_interrupt(int irq, void *dev_id)
writel(status, sdev->base + DMA_IRQ_STAT(i)); writel(status, sdev->base + DMA_IRQ_STAT(i));
for (j = 0; (j < 8) && status; j++) { for (j = 0; (j < DMA_IRQ_CHAN_NR) && status; j++) {
if (status & DMA_IRQ_QUEUE) { if (status & DMA_IRQ_QUEUE) {
pchan = sdev->pchans + j; pchan = sdev->pchans + j;
vchan = pchan->vchan; vchan = pchan->vchan;
...@@ -519,7 +523,7 @@ static irqreturn_t sun6i_dma_interrupt(int irq, void *dev_id) ...@@ -519,7 +523,7 @@ static irqreturn_t sun6i_dma_interrupt(int irq, void *dev_id)
} }
} }
status = status >> 4; status = status >> DMA_IRQ_CHAN_WIDTH;
} }
if (!atomic_read(&sdev->tasklet_shutdown)) if (!atomic_read(&sdev->tasklet_shutdown))
...@@ -815,7 +819,7 @@ static struct dma_chan *sun6i_dma_of_xlate(struct of_phandle_args *dma_spec, ...@@ -815,7 +819,7 @@ static struct dma_chan *sun6i_dma_of_xlate(struct of_phandle_args *dma_spec,
struct dma_chan *chan; struct dma_chan *chan;
u8 port = dma_spec->args[0]; u8 port = dma_spec->args[0];
if (port > NR_MAX_REQUESTS) if (port > sdev->cfg->nr_max_requests)
return NULL; return NULL;
chan = dma_get_any_slave_channel(&sdev->slave); chan = dma_get_any_slave_channel(&sdev->slave);
...@@ -848,7 +852,7 @@ static inline void sun6i_dma_free(struct sun6i_dma_dev *sdev) ...@@ -848,7 +852,7 @@ static inline void sun6i_dma_free(struct sun6i_dma_dev *sdev)
{ {
int i; int i;
for (i = 0; i < NR_MAX_VCHANS; i++) { for (i = 0; i < sdev->cfg->nr_max_vchans; i++) {
struct sun6i_vchan *vchan = &sdev->vchans[i]; struct sun6i_vchan *vchan = &sdev->vchans[i];
list_del(&vchan->vc.chan.device_node); list_del(&vchan->vc.chan.device_node);
...@@ -856,8 +860,48 @@ static inline void sun6i_dma_free(struct sun6i_dma_dev *sdev) ...@@ -856,8 +860,48 @@ static inline void sun6i_dma_free(struct sun6i_dma_dev *sdev)
} }
} }
/*
* For A31:
*
* There's 16 physical channels that can work in parallel.
*
* However we have 30 different endpoints for our requests.
*
* Since the channels are able to handle only an unidirectional
* transfer, we need to allocate more virtual channels so that
* everyone can grab one channel.
*
* Some devices can't work in both direction (mostly because it
* wouldn't make sense), so we have a bit fewer virtual channels than
* 2 channels per endpoints.
*/
static struct sun6i_dma_config sun6i_a31_dma_cfg = {
.nr_max_channels = 16,
.nr_max_requests = 30,
.nr_max_vchans = 53,
};
/*
* The A23 only has 8 physical channels, a maximum DRQ port id of 24,
* and a total of 37 usable source and destination endpoints.
*/
static struct sun6i_dma_config sun8i_a23_dma_cfg = {
.nr_max_channels = 8,
.nr_max_requests = 24,
.nr_max_vchans = 37,
};
static struct of_device_id sun6i_dma_match[] = {
{ .compatible = "allwinner,sun6i-a31-dma", .data = &sun6i_a31_dma_cfg },
{ .compatible = "allwinner,sun8i-a23-dma", .data = &sun8i_a23_dma_cfg },
{ /* sentinel */ }
};
static int sun6i_dma_probe(struct platform_device *pdev) static int sun6i_dma_probe(struct platform_device *pdev)
{ {
const struct of_device_id *device;
struct sun6i_dma_dev *sdc; struct sun6i_dma_dev *sdc;
struct resource *res; struct resource *res;
int ret, i; int ret, i;
...@@ -866,6 +910,11 @@ static int sun6i_dma_probe(struct platform_device *pdev) ...@@ -866,6 +910,11 @@ static int sun6i_dma_probe(struct platform_device *pdev)
if (!sdc) if (!sdc)
return -ENOMEM; return -ENOMEM;
device = of_match_device(sun6i_dma_match, &pdev->dev);
if (!device)
return -ENODEV;
sdc->cfg = device->data;
res = platform_get_resource(pdev, IORESOURCE_MEM, 0); res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
sdc->base = devm_ioremap_resource(&pdev->dev, res); sdc->base = devm_ioremap_resource(&pdev->dev, res);
if (IS_ERR(sdc->base)) if (IS_ERR(sdc->base))
...@@ -912,31 +961,30 @@ static int sun6i_dma_probe(struct platform_device *pdev) ...@@ -912,31 +961,30 @@ static int sun6i_dma_probe(struct platform_device *pdev)
sdc->slave.device_prep_slave_sg = sun6i_dma_prep_slave_sg; sdc->slave.device_prep_slave_sg = sun6i_dma_prep_slave_sg;
sdc->slave.device_prep_dma_memcpy = sun6i_dma_prep_dma_memcpy; sdc->slave.device_prep_dma_memcpy = sun6i_dma_prep_dma_memcpy;
sdc->slave.device_control = sun6i_dma_control; sdc->slave.device_control = sun6i_dma_control;
sdc->slave.chancnt = NR_MAX_VCHANS;
sdc->slave.copy_align = 4; sdc->slave.copy_align = 4;
sdc->slave.dev = &pdev->dev; sdc->slave.dev = &pdev->dev;
sdc->pchans = devm_kcalloc(&pdev->dev, NR_MAX_CHANNELS, sdc->pchans = devm_kcalloc(&pdev->dev, sdc->cfg->nr_max_channels,
sizeof(struct sun6i_pchan), GFP_KERNEL); sizeof(struct sun6i_pchan), GFP_KERNEL);
if (!sdc->pchans) if (!sdc->pchans)
return -ENOMEM; return -ENOMEM;
sdc->vchans = devm_kcalloc(&pdev->dev, NR_MAX_VCHANS, sdc->vchans = devm_kcalloc(&pdev->dev, sdc->cfg->nr_max_vchans,
sizeof(struct sun6i_vchan), GFP_KERNEL); sizeof(struct sun6i_vchan), GFP_KERNEL);
if (!sdc->vchans) if (!sdc->vchans)
return -ENOMEM; return -ENOMEM;
tasklet_init(&sdc->task, sun6i_dma_tasklet, (unsigned long)sdc); tasklet_init(&sdc->task, sun6i_dma_tasklet, (unsigned long)sdc);
for (i = 0; i < NR_MAX_CHANNELS; i++) { for (i = 0; i < sdc->cfg->nr_max_channels; i++) {
struct sun6i_pchan *pchan = &sdc->pchans[i]; struct sun6i_pchan *pchan = &sdc->pchans[i];
pchan->idx = i; pchan->idx = i;
pchan->base = sdc->base + 0x100 + i * 0x40; pchan->base = sdc->base + 0x100 + i * 0x40;
} }
for (i = 0; i < NR_MAX_VCHANS; i++) { for (i = 0; i < sdc->cfg->nr_max_vchans; i++) {
struct sun6i_vchan *vchan = &sdc->vchans[i]; struct sun6i_vchan *vchan = &sdc->vchans[i];
INIT_LIST_HEAD(&vchan->node); INIT_LIST_HEAD(&vchan->node);
...@@ -976,6 +1024,15 @@ static int sun6i_dma_probe(struct platform_device *pdev) ...@@ -976,6 +1024,15 @@ static int sun6i_dma_probe(struct platform_device *pdev)
goto err_dma_unregister; goto err_dma_unregister;
} }
/*
* sun8i variant requires us to toggle a dma gating register,
* as seen in Allwinner's SDK. This register is not documented
* in the A23 user manual.
*/
if (of_device_is_compatible(pdev->dev.of_node,
"allwinner,sun8i-a23-dma"))
writel(SUN8I_DMA_GATE_ENABLE, sdc->base + SUN8I_DMA_GATE);
return 0; return 0;
err_dma_unregister: err_dma_unregister:
...@@ -1008,11 +1065,6 @@ static int sun6i_dma_remove(struct platform_device *pdev) ...@@ -1008,11 +1065,6 @@ static int sun6i_dma_remove(struct platform_device *pdev)
return 0; return 0;
} }
static struct of_device_id sun6i_dma_match[] = {
{ .compatible = "allwinner,sun6i-a31-dma" },
{ /* sentinel */ }
};
static struct platform_driver sun6i_dma_driver = { static struct platform_driver sun6i_dma_driver = {
.probe = sun6i_dma_probe, .probe = sun6i_dma_probe,
.remove = sun6i_dma_remove, .remove = sun6i_dma_remove,
......
...@@ -1597,7 +1597,6 @@ static const struct dev_pm_ops tegra_dma_dev_pm_ops = { ...@@ -1597,7 +1597,6 @@ static const struct dev_pm_ops tegra_dma_dev_pm_ops = {
static struct platform_driver tegra_dmac_driver = { static struct platform_driver tegra_dmac_driver = {
.driver = { .driver = {
.name = "tegra-apbdma", .name = "tegra-apbdma",
.owner = THIS_MODULE,
.pm = &tegra_dma_dev_pm_ops, .pm = &tegra_dma_dev_pm_ops,
.of_match_table = tegra_dma_of_match, .of_match_table = tegra_dma_of_match,
}, },
......
...@@ -783,7 +783,6 @@ static int td_remove(struct platform_device *pdev) ...@@ -783,7 +783,6 @@ static int td_remove(struct platform_device *pdev)
static struct platform_driver td_driver = { static struct platform_driver td_driver = {
.driver = { .driver = {
.name = DRIVER_NAME, .name = DRIVER_NAME,
.owner = THIS_MODULE,
}, },
.probe = td_probe, .probe = td_probe,
.remove = td_remove, .remove = td_remove,
......
...@@ -942,6 +942,9 @@ xilinx_vdma_dma_prep_interleaved(struct dma_chan *dchan, ...@@ -942,6 +942,9 @@ xilinx_vdma_dma_prep_interleaved(struct dma_chan *dchan,
if (!xt->numf || !xt->sgl[0].size) if (!xt->numf || !xt->sgl[0].size)
return NULL; return NULL;
if (xt->frame_size != 1)
return NULL;
/* Allocate a transaction descriptor. */ /* Allocate a transaction descriptor. */
desc = xilinx_vdma_alloc_tx_descriptor(chan); desc = xilinx_vdma_alloc_tx_descriptor(chan);
if (!desc) if (!desc)
...@@ -960,7 +963,7 @@ xilinx_vdma_dma_prep_interleaved(struct dma_chan *dchan, ...@@ -960,7 +963,7 @@ xilinx_vdma_dma_prep_interleaved(struct dma_chan *dchan,
hw = &segment->hw; hw = &segment->hw;
hw->vsize = xt->numf; hw->vsize = xt->numf;
hw->hsize = xt->sgl[0].size; hw->hsize = xt->sgl[0].size;
hw->stride = xt->sgl[0].icg << hw->stride = (xt->sgl[0].icg + xt->sgl[0].size) <<
XILINX_VDMA_FRMDLY_STRIDE_STRIDE_SHIFT; XILINX_VDMA_FRMDLY_STRIDE_STRIDE_SHIFT;
hw->stride |= chan->config.frm_dly << hw->stride |= chan->config.frm_dly <<
XILINX_VDMA_FRMDLY_STRIDE_FRMDLY_SHIFT; XILINX_VDMA_FRMDLY_STRIDE_FRMDLY_SHIFT;
...@@ -971,9 +974,11 @@ xilinx_vdma_dma_prep_interleaved(struct dma_chan *dchan, ...@@ -971,9 +974,11 @@ xilinx_vdma_dma_prep_interleaved(struct dma_chan *dchan,
hw->buf_addr = xt->src_start; hw->buf_addr = xt->src_start;
/* Link the previous next descriptor to current */ /* Link the previous next descriptor to current */
if (!list_empty(&desc->segments)) {
prev = list_last_entry(&desc->segments, prev = list_last_entry(&desc->segments,
struct xilinx_vdma_tx_segment, node); struct xilinx_vdma_tx_segment, node);
prev->hw.next_desc = segment->phys; prev->hw.next_desc = segment->phys;
}
/* Insert the segment into the descriptor segments list. */ /* Insert the segment into the descriptor segments list. */
list_add_tail(&segment->node, &desc->segments); list_add_tail(&segment->node, &desc->segments);
......
...@@ -9,6 +9,8 @@ ...@@ -9,6 +9,8 @@
#ifndef __DT_BINDINGS_AT91_DMA_H__ #ifndef __DT_BINDINGS_AT91_DMA_H__
#define __DT_BINDINGS_AT91_DMA_H__ #define __DT_BINDINGS_AT91_DMA_H__
/* ---------- HDMAC ---------- */
/* /*
* Source and/or destination peripheral ID * Source and/or destination peripheral ID
*/ */
...@@ -24,4 +26,27 @@ ...@@ -24,4 +26,27 @@
#define AT91_DMA_CFG_FIFOCFG_ALAP (0x1 << AT91_DMA_CFG_FIFOCFG_OFFSET) /* largest defined AHB burst */ #define AT91_DMA_CFG_FIFOCFG_ALAP (0x1 << AT91_DMA_CFG_FIFOCFG_OFFSET) /* largest defined AHB burst */
#define AT91_DMA_CFG_FIFOCFG_ASAP (0x2 << AT91_DMA_CFG_FIFOCFG_OFFSET) /* single AHB access */ #define AT91_DMA_CFG_FIFOCFG_ASAP (0x2 << AT91_DMA_CFG_FIFOCFG_OFFSET) /* single AHB access */
/* ---------- XDMAC ---------- */
#define AT91_XDMAC_DT_MEM_IF_MASK (0x1)
#define AT91_XDMAC_DT_MEM_IF_OFFSET (13)
#define AT91_XDMAC_DT_MEM_IF(mem_if) (((mem_if) & AT91_XDMAC_DT_MEM_IF_MASK) \
<< AT91_XDMAC_DT_MEM_IF_OFFSET)
#define AT91_XDMAC_DT_GET_MEM_IF(cfg) (((cfg) >> AT91_XDMAC_DT_MEM_IF_OFFSET) \
& AT91_XDMAC_DT_MEM_IF_MASK)
#define AT91_XDMAC_DT_PER_IF_MASK (0x1)
#define AT91_XDMAC_DT_PER_IF_OFFSET (14)
#define AT91_XDMAC_DT_PER_IF(per_if) (((per_if) & AT91_XDMAC_DT_PER_IF_MASK) \
<< AT91_XDMAC_DT_PER_IF_OFFSET)
#define AT91_XDMAC_DT_GET_PER_IF(cfg) (((cfg) >> AT91_XDMAC_DT_PER_IF_OFFSET) \
& AT91_XDMAC_DT_PER_IF_MASK)
#define AT91_XDMAC_DT_PERID_MASK (0x7f)
#define AT91_XDMAC_DT_PERID_OFFSET (24)
#define AT91_XDMAC_DT_PERID(perid) (((perid) & AT91_XDMAC_DT_PERID_MASK) \
<< AT91_XDMAC_DT_PERID_OFFSET)
#define AT91_XDMAC_DT_GET_PERID(cfg) (((cfg) >> AT91_XDMAC_DT_PERID_OFFSET) \
& AT91_XDMAC_DT_PERID_MASK)
#endif /* __DT_BINDINGS_AT91_DMA_H__ */ #endif /* __DT_BINDINGS_AT91_DMA_H__ */
...@@ -447,7 +447,8 @@ struct dmaengine_unmap_data { ...@@ -447,7 +447,8 @@ struct dmaengine_unmap_data {
* communicate status * communicate status
* @phys: physical address of the descriptor * @phys: physical address of the descriptor
* @chan: target channel for this operation * @chan: target channel for this operation
* @tx_submit: set the prepared descriptor(s) to be executed by the engine * @tx_submit: accept the descriptor, assign ordered cookie and mark the
* descriptor pending. To be pushed on .issue_pending() call
* @callback: routine to call after this operation is complete * @callback: routine to call after this operation is complete
* @callback_param: general parameter to pass to the callback routine * @callback_param: general parameter to pass to the callback routine
* ---async_tx api specific fields--- * ---async_tx api specific fields---
......
...@@ -41,6 +41,7 @@ enum sdma_peripheral_type { ...@@ -41,6 +41,7 @@ enum sdma_peripheral_type {
IMX_DMATYPE_ESAI, /* ESAI */ IMX_DMATYPE_ESAI, /* ESAI */
IMX_DMATYPE_SSI_DUAL, /* SSI Dual FIFO */ IMX_DMATYPE_SSI_DUAL, /* SSI Dual FIFO */
IMX_DMATYPE_ASRC_SP, /* Shared ASRC */ IMX_DMATYPE_ASRC_SP, /* Shared ASRC */
IMX_DMATYPE_SAI, /* SAI */
}; };
enum imx_dma_prio { enum imx_dma_prio {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment