You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge branch 'next' of git://git.infradead.org/users/vkoul/slave-dma
Pull slave-dmaengine updates from Vinod Koul: "This is fairly big pull by my standards as I had missed last merge window. So we have the support for device tree for slave-dmaengine, large updates to dw_dmac driver from Andy for reusing on different architectures. Along with this we have fixes on bunch of the drivers" Fix up trivial conflicts, usually due to #include line movement next to each other. * 'next' of git://git.infradead.org/users/vkoul/slave-dma: (111 commits) Revert "ARM: SPEAr13xx: Pass DW DMAC platform data from DT" ARM: dts: pl330: Add #dma-cells for generic dma binding support DMA: PL330: Register the DMA controller with the generic DMA helpers DMA: PL330: Add xlate function DMA: PL330: Add new pl330 filter for DT case. dma: tegra20-apb-dma: remove unnecessary assignment edma: do not waste memory for dma_mask dma: coh901318: set residue only if dma is in progress dma: coh901318: avoid unbalanced locking dmaengine.h: remove redundant else keyword dma: of-dma: protect list write operation by spin_lock dmaengine: ste_dma40: do not remove descriptors for cyclic transfers dma: of-dma.c: fix memory leakage dw_dmac: apply default dma_mask if needed dmaengine: ioat - fix spare sparse complain dmaengine: move drivers/of/dma.c -> drivers/dma/of-dma.c ioatdma: fix race between updating ioat->head and IOAT_COMPLETION_PENDING dw_dmac: add support for Lynxpoint DMA controllers dw_dmac: return proper residue value dw_dmac: fill individual length of descriptor ...
This commit is contained in:
@@ -10,7 +10,11 @@ Required properties:
|
||||
- interrupts: interrupt number to the cpu.
|
||||
|
||||
Optional properties:
|
||||
- dma-coherent : Present if dma operations are coherent
|
||||
- dma-coherent : Present if dma operations are coherent
|
||||
- #dma-cells: must be <1>. used to represent the number of integer
|
||||
cells in the dmas property of client device.
|
||||
- dma-channels: contains the total number of DMA channels supported by the DMAC
|
||||
- dma-requests: contains the total number of DMA requests supported by the DMAC
|
||||
|
||||
Example:
|
||||
|
||||
@@ -18,16 +22,23 @@ Example:
|
||||
compatible = "arm,pl330", "arm,primecell";
|
||||
reg = <0x12680000 0x1000>;
|
||||
interrupts = <99>;
|
||||
#dma-cells = <1>;
|
||||
#dma-channels = <8>;
|
||||
#dma-requests = <32>;
|
||||
};
|
||||
|
||||
Client drivers (device nodes requiring dma transfers from dev-to-mem or
|
||||
mem-to-dev) should specify the DMA channel numbers using a two-value pair
|
||||
mem-to-dev) should specify the DMA channel numbers and dma channel names
|
||||
as shown below.
|
||||
|
||||
[property name] = <[phandle of the dma controller] [dma request id]>;
|
||||
[property name] = <[dma channel name]>
|
||||
|
||||
where 'dma request id' is the dma request number which is connected
|
||||
to the client controller. The 'property name' is recommended to be
|
||||
of the form <name>-dma-channel.
|
||||
to the client controller. The 'property name' 'dmas' and 'dma-names'
|
||||
as required by the generic dma device tree binding helpers. The dma
|
||||
names correspond 1:1 with the dma request ids in the dmas property.
|
||||
|
||||
Example: tx-dma-channel = <&pdma0 12>;
|
||||
Example: dmas = <&pdma0 12
|
||||
&pdma1 11>;
|
||||
dma-names = "tx", "rx";
|
||||
|
||||
@@ -0,0 +1,81 @@
|
||||
* Generic DMA Controller and DMA request bindings
|
||||
|
||||
Generic binding to provide a way for a driver using DMA Engine to retrieve the
|
||||
DMA request or channel information that goes from a hardware device to a DMA
|
||||
controller.
|
||||
|
||||
|
||||
* DMA controller
|
||||
|
||||
Required property:
|
||||
- #dma-cells: Must be at least 1. Used to provide DMA controller
|
||||
specific information. See DMA client binding below for
|
||||
more details.
|
||||
|
||||
Optional properties:
|
||||
- dma-channels: Number of DMA channels supported by the controller.
|
||||
- dma-requests: Number of DMA requests signals supported by the
|
||||
controller.
|
||||
|
||||
Example:
|
||||
|
||||
dma: dma@48000000 {
|
||||
compatible = "ti,omap-sdma";
|
||||
reg = <0x48000000 0x1000>;
|
||||
interrupts = <0 12 0x4
|
||||
0 13 0x4
|
||||
0 14 0x4
|
||||
0 15 0x4>;
|
||||
#dma-cells = <1>;
|
||||
dma-channels = <32>;
|
||||
dma-requests = <127>;
|
||||
};
|
||||
|
||||
|
||||
* DMA client
|
||||
|
||||
Client drivers should specify the DMA property using a phandle to the controller
|
||||
followed by DMA controller specific data.
|
||||
|
||||
Required property:
|
||||
- dmas: List of one or more DMA specifiers, each consisting of
|
||||
- A phandle pointing to DMA controller node
|
||||
- A number of integer cells, as determined by the
|
||||
#dma-cells property in the node referenced by phandle
|
||||
containing DMA controller specific information. This
|
||||
typically contains a DMA request line number or a
|
||||
channel number, but can contain any data that is used
|
||||
required for configuring a channel.
|
||||
- dma-names: Contains one identifier string for each DMA specifier in
|
||||
the dmas property. The specific strings that can be used
|
||||
are defined in the binding of the DMA client device.
|
||||
Multiple DMA specifiers can be used to represent
|
||||
alternatives and in this case the dma-names for those
|
||||
DMA specifiers must be identical (see examples).
|
||||
|
||||
Examples:
|
||||
|
||||
1. A device with one DMA read channel, one DMA write channel:
|
||||
|
||||
i2c1: i2c@1 {
|
||||
...
|
||||
dmas = <&dma 2 /* read channel */
|
||||
&dma 3>; /* write channel */
|
||||
dma-names = "rx", "tx";
|
||||
...
|
||||
};
|
||||
|
||||
2. A single read-write channel with three alternative DMA controllers:
|
||||
|
||||
dmas = <&dma1 5
|
||||
&dma2 7
|
||||
&dma3 2>;
|
||||
dma-names = "rx-tx", "rx-tx", "rx-tx";
|
||||
|
||||
3. A device with three channels, one of which has two alternatives:
|
||||
|
||||
dmas = <&dma1 2 /* read channel */
|
||||
&dma1 3 /* write channel */
|
||||
&dma2 0 /* error read */
|
||||
&dma3 0>; /* alternative error read */
|
||||
dma-names = "rx", "tx", "error", "error";
|
||||
@@ -6,6 +6,26 @@ Required properties:
|
||||
- interrupt-parent: Should be the phandle for the interrupt controller
|
||||
that services interrupts for this device
|
||||
- interrupt: Should contain the DMAC interrupt number
|
||||
- nr_channels: Number of channels supported by hardware
|
||||
- is_private: The device channels should be marked as private and not for by the
|
||||
general purpose DMA channel allocator. False if not passed.
|
||||
- chan_allocation_order: order of allocation of channel, 0 (default): ascending,
|
||||
1: descending
|
||||
- chan_priority: priority of channels. 0 (default): increase from chan 0->n, 1:
|
||||
increase from chan n->0
|
||||
- block_size: Maximum block size supported by the controller
|
||||
- nr_masters: Number of AHB masters supported by the controller
|
||||
- data_width: Maximum data width supported by hardware per AHB master
|
||||
(0 - 8bits, 1 - 16bits, ..., 5 - 256bits)
|
||||
- slave_info:
|
||||
- bus_id: name of this device channel, not just a device name since
|
||||
devices may have more than one channel e.g. "foo_tx". For using the
|
||||
dw_generic_filter(), slave drivers must pass exactly this string as
|
||||
param to filter function.
|
||||
- cfg_hi: Platform-specific initializer for the CFG_HI register
|
||||
- cfg_lo: Platform-specific initializer for the CFG_LO register
|
||||
- src_master: src master for transfers on allocated channel.
|
||||
- dst_master: dest master for transfers on allocated channel.
|
||||
|
||||
Example:
|
||||
|
||||
@@ -14,4 +34,28 @@ Example:
|
||||
reg = <0xfc000000 0x1000>;
|
||||
interrupt-parent = <&vic1>;
|
||||
interrupts = <12>;
|
||||
|
||||
nr_channels = <8>;
|
||||
chan_allocation_order = <1>;
|
||||
chan_priority = <1>;
|
||||
block_size = <0xfff>;
|
||||
nr_masters = <2>;
|
||||
data_width = <3 3 0 0>;
|
||||
|
||||
slave_info {
|
||||
uart0-tx {
|
||||
bus_id = "uart0-tx";
|
||||
cfg_hi = <0x4000>; /* 0x8 << 11 */
|
||||
cfg_lo = <0>;
|
||||
src_master = <0>;
|
||||
dst_master = <1>;
|
||||
};
|
||||
spi0-tx {
|
||||
bus_id = "spi0-tx";
|
||||
cfg_hi = <0x2000>; /* 0x4 << 11 */
|
||||
cfg_lo = <0>;
|
||||
src_master = <0>;
|
||||
dst_master = <0>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
@@ -312,24 +312,36 @@
|
||||
compatible = "arm,pl330", "arm,primecell";
|
||||
reg = <0x121A0000 0x1000>;
|
||||
interrupts = <0 34 0>;
|
||||
#dma-cells = <1>;
|
||||
#dma-channels = <8>;
|
||||
#dma-requests = <32>;
|
||||
};
|
||||
|
||||
pdma1: pdma@121B0000 {
|
||||
compatible = "arm,pl330", "arm,primecell";
|
||||
reg = <0x121B0000 0x1000>;
|
||||
interrupts = <0 35 0>;
|
||||
#dma-cells = <1>;
|
||||
#dma-channels = <8>;
|
||||
#dma-requests = <32>;
|
||||
};
|
||||
|
||||
mdma0: mdma@10800000 {
|
||||
compatible = "arm,pl330", "arm,primecell";
|
||||
reg = <0x10800000 0x1000>;
|
||||
interrupts = <0 33 0>;
|
||||
#dma-cells = <1>;
|
||||
#dma-channels = <8>;
|
||||
#dma-requests = <1>;
|
||||
};
|
||||
|
||||
mdma1: mdma@11C10000 {
|
||||
compatible = "arm,pl330", "arm,primecell";
|
||||
reg = <0x11C10000 0x1000>;
|
||||
interrupts = <0 124 0>;
|
||||
#dma-cells = <1>;
|
||||
#dma-channels = <8>;
|
||||
#dma-requests = <1>;
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@@ -23,13 +23,12 @@
|
||||
#include <linux/clk.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/amba/pl080.h>
|
||||
|
||||
#include <mach/dma.h>
|
||||
#include <mach/map.h>
|
||||
#include <mach/irqs.h>
|
||||
|
||||
#include <asm/hardware/pl080.h>
|
||||
|
||||
#include "regs-sys.h"
|
||||
|
||||
/* dma channel state information */
|
||||
|
||||
@@ -16,7 +16,6 @@
|
||||
#include <linux/amba/pl022.h>
|
||||
#include <linux/amba/pl08x.h>
|
||||
#include <linux/io.h>
|
||||
#include <asm/hardware/pl080.h>
|
||||
#include <plat/pl080.h>
|
||||
#include <mach/generic.h>
|
||||
#include <mach/spear.h>
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/of_platform.h>
|
||||
#include <asm/hardware/pl080.h>
|
||||
#include <linux/amba/pl080.h>
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/time.h>
|
||||
#include <asm/mach/map.h>
|
||||
|
||||
@@ -67,6 +67,12 @@ async_memcpy(struct page *dest, struct page *src, unsigned int dest_offset,
|
||||
|
||||
tx = device->device_prep_dma_memcpy(chan, dma_dest, dma_src,
|
||||
len, dma_prep_flags);
|
||||
if (!tx) {
|
||||
dma_unmap_page(device->dev, dma_dest, len,
|
||||
DMA_FROM_DEVICE);
|
||||
dma_unmap_page(device->dev, dma_src, len,
|
||||
DMA_TO_DEVICE);
|
||||
}
|
||||
}
|
||||
|
||||
if (tx) {
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
*/
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/async_tx.h>
|
||||
|
||||
@@ -128,8 +128,8 @@ async_tx_channel_switch(struct dma_async_tx_descriptor *depend_tx,
|
||||
}
|
||||
device->device_issue_pending(chan);
|
||||
} else {
|
||||
if (dma_wait_for_async_tx(depend_tx) == DMA_ERROR)
|
||||
panic("%s: DMA_ERROR waiting for depend_tx\n",
|
||||
if (dma_wait_for_async_tx(depend_tx) != DMA_SUCCESS)
|
||||
panic("%s: DMA error waiting for depend_tx\n",
|
||||
__func__);
|
||||
tx->tx_submit(tx);
|
||||
}
|
||||
@@ -280,8 +280,9 @@ void async_tx_quiesce(struct dma_async_tx_descriptor **tx)
|
||||
* we are referring to the correct operation
|
||||
*/
|
||||
BUG_ON(async_tx_test_ack(*tx));
|
||||
if (dma_wait_for_async_tx(*tx) == DMA_ERROR)
|
||||
panic("DMA_ERROR waiting for transaction\n");
|
||||
if (dma_wait_for_async_tx(*tx) != DMA_SUCCESS)
|
||||
panic("%s: DMA error waiting for transaction\n",
|
||||
__func__);
|
||||
async_tx_ack(*tx);
|
||||
*tx = NULL;
|
||||
}
|
||||
|
||||
@@ -230,9 +230,7 @@ EXPORT_SYMBOL_GPL(async_xor);
|
||||
|
||||
static int page_is_zero(struct page *p, unsigned int offset, size_t len)
|
||||
{
|
||||
char *a = page_address(p) + offset;
|
||||
return ((*(u32 *) a) == 0 &&
|
||||
memcmp(a, a + 4, len - 4) == 0);
|
||||
return !memchr_inv(page_address(p) + offset, 0, len);
|
||||
}
|
||||
|
||||
static inline struct dma_chan *
|
||||
|
||||
@@ -420,6 +420,11 @@ void unregister_dca_provider(struct dca_provider *dca, struct device *dev)
|
||||
|
||||
raw_spin_lock_irqsave(&dca_lock, flags);
|
||||
|
||||
if (list_empty(&dca_domains)) {
|
||||
raw_spin_unlock_irqrestore(&dca_lock, flags);
|
||||
return;
|
||||
}
|
||||
|
||||
list_del(&dca->node);
|
||||
|
||||
pci_rc = dca_pci_rc_from_dev(dev);
|
||||
|
||||
+7
-4
@@ -51,7 +51,7 @@ config ASYNC_TX_ENABLE_CHANNEL_SWITCH
|
||||
|
||||
config AMBA_PL08X
|
||||
bool "ARM PrimeCell PL080 or PL081 support"
|
||||
depends on ARM_AMBA && EXPERIMENTAL
|
||||
depends on ARM_AMBA
|
||||
select DMA_ENGINE
|
||||
select DMA_VIRTUAL_CHANNELS
|
||||
help
|
||||
@@ -83,7 +83,6 @@ config INTEL_IOP_ADMA
|
||||
|
||||
config DW_DMAC
|
||||
tristate "Synopsys DesignWare AHB DMA support"
|
||||
depends on HAVE_CLK
|
||||
select DMA_ENGINE
|
||||
default y if CPU_AT32AP7000
|
||||
help
|
||||
@@ -215,8 +214,8 @@ config TIMB_DMA
|
||||
Enable support for the Timberdale FPGA DMA engine.
|
||||
|
||||
config SIRF_DMA
|
||||
tristate "CSR SiRFprimaII DMA support"
|
||||
depends on ARCH_PRIMA2
|
||||
tristate "CSR SiRFprimaII/SiRFmarco DMA support"
|
||||
depends on ARCH_SIRF
|
||||
select DMA_ENGINE
|
||||
help
|
||||
Enable support for the CSR SiRFprimaII DMA engine.
|
||||
@@ -328,6 +327,10 @@ config DMA_ENGINE
|
||||
config DMA_VIRTUAL_CHANNELS
|
||||
tristate
|
||||
|
||||
config DMA_OF
|
||||
def_bool y
|
||||
depends on OF
|
||||
|
||||
comment "DMA Clients"
|
||||
depends on DMA_ENGINE
|
||||
|
||||
|
||||
@@ -3,6 +3,8 @@ ccflags-$(CONFIG_DMADEVICES_VDEBUG) += -DVERBOSE_DEBUG
|
||||
|
||||
obj-$(CONFIG_DMA_ENGINE) += dmaengine.o
|
||||
obj-$(CONFIG_DMA_VIRTUAL_CHANNELS) += virt-dma.o
|
||||
obj-$(CONFIG_DMA_OF) += of-dma.o
|
||||
|
||||
obj-$(CONFIG_NET_DMA) += iovlock.o
|
||||
obj-$(CONFIG_INTEL_MID_DMAC) += intel_mid_dma.o
|
||||
obj-$(CONFIG_DMATEST) += dmatest.o
|
||||
|
||||
@@ -83,7 +83,7 @@
|
||||
#include <linux/pm_runtime.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/slab.h>
|
||||
#include <asm/hardware/pl080.h>
|
||||
#include <linux/amba/pl080.h>
|
||||
|
||||
#include "dmaengine.h"
|
||||
#include "virt-dma.h"
|
||||
@@ -1096,15 +1096,9 @@ static void pl08x_free_txd_list(struct pl08x_driver_data *pl08x,
|
||||
struct pl08x_dma_chan *plchan)
|
||||
{
|
||||
LIST_HEAD(head);
|
||||
struct pl08x_txd *txd;
|
||||
|
||||
vchan_get_all_descriptors(&plchan->vc, &head);
|
||||
|
||||
while (!list_empty(&head)) {
|
||||
txd = list_first_entry(&head, struct pl08x_txd, vd.node);
|
||||
list_del(&txd->vd.node);
|
||||
pl08x_desc_free(&txd->vd);
|
||||
}
|
||||
vchan_dma_desc_free_list(&plchan->vc, &head);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -778,7 +778,7 @@ err:
|
||||
*/
|
||||
static int
|
||||
atc_dma_cyclic_check_values(unsigned int reg_width, dma_addr_t buf_addr,
|
||||
size_t period_len, enum dma_transfer_direction direction)
|
||||
size_t period_len)
|
||||
{
|
||||
if (period_len > (ATC_BTSIZE_MAX << reg_width))
|
||||
goto err_out;
|
||||
@@ -786,8 +786,6 @@ atc_dma_cyclic_check_values(unsigned int reg_width, dma_addr_t buf_addr,
|
||||
goto err_out;
|
||||
if (unlikely(buf_addr & ((1 << reg_width) - 1)))
|
||||
goto err_out;
|
||||
if (unlikely(!(direction & (DMA_DEV_TO_MEM | DMA_MEM_TO_DEV))))
|
||||
goto err_out;
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -886,14 +884,16 @@ atc_prep_dma_cyclic(struct dma_chan *chan, dma_addr_t buf_addr, size_t buf_len,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (unlikely(!is_slave_direction(direction)))
|
||||
goto err_out;
|
||||
|
||||
if (sconfig->direction == DMA_MEM_TO_DEV)
|
||||
reg_width = convert_buswidth(sconfig->dst_addr_width);
|
||||
else
|
||||
reg_width = convert_buswidth(sconfig->src_addr_width);
|
||||
|
||||
/* Check for too big/unaligned periods and unaligned DMA buffer */
|
||||
if (atc_dma_cyclic_check_values(reg_width, buf_addr,
|
||||
period_len, direction))
|
||||
if (atc_dma_cyclic_check_values(reg_width, buf_addr, period_len))
|
||||
goto err_out;
|
||||
|
||||
/* build cyclic linked list */
|
||||
|
||||
@@ -369,10 +369,10 @@ static void vdbg_dump_regs(struct at_dma_chan *atchan) {}
|
||||
|
||||
static void atc_dump_lli(struct at_dma_chan *atchan, struct at_lli *lli)
|
||||
{
|
||||
dev_printk(KERN_CRIT, chan2dev(&atchan->chan_common),
|
||||
" desc: s0x%x d0x%x ctrl0x%x:0x%x l0x%x\n",
|
||||
lli->saddr, lli->daddr,
|
||||
lli->ctrla, lli->ctrlb, lli->dscr);
|
||||
dev_crit(chan2dev(&atchan->chan_common),
|
||||
" desc: s0x%x d0x%x ctrl0x%x:0x%x l0x%x\n",
|
||||
lli->saddr, lli->daddr,
|
||||
lli->ctrla, lli->ctrlb, lli->dscr);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -2355,7 +2355,9 @@ coh901318_tx_status(struct dma_chan *chan, dma_cookie_t cookie,
|
||||
enum dma_status ret;
|
||||
|
||||
ret = dma_cookie_status(chan, cookie, txstate);
|
||||
/* FIXME: should be conditional on ret != DMA_SUCCESS? */
|
||||
if (ret == DMA_SUCCESS)
|
||||
return ret;
|
||||
|
||||
dma_set_residue(txstate, coh901318_get_bytes_left(chan));
|
||||
|
||||
if (ret == DMA_IN_PROGRESS && cohc->stopped)
|
||||
|
||||
@@ -61,7 +61,7 @@ coh901318_lli_alloc(struct coh901318_pool *pool, unsigned int len)
|
||||
dma_addr_t phy;
|
||||
|
||||
if (len == 0)
|
||||
goto err;
|
||||
return NULL;
|
||||
|
||||
spin_lock(&pool->lock);
|
||||
|
||||
|
||||
+20
-1
@@ -62,6 +62,7 @@
|
||||
#include <linux/rculist.h>
|
||||
#include <linux/idr.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/of_dma.h>
|
||||
|
||||
static DEFINE_MUTEX(dma_list_mutex);
|
||||
static DEFINE_IDR(dma_idr);
|
||||
@@ -266,7 +267,10 @@ enum dma_status dma_sync_wait(struct dma_chan *chan, dma_cookie_t cookie)
|
||||
pr_err("%s: timeout!\n", __func__);
|
||||
return DMA_ERROR;
|
||||
}
|
||||
} while (status == DMA_IN_PROGRESS);
|
||||
if (status != DMA_IN_PROGRESS)
|
||||
break;
|
||||
cpu_relax();
|
||||
} while (1);
|
||||
|
||||
return status;
|
||||
}
|
||||
@@ -546,6 +550,21 @@ struct dma_chan *__dma_request_channel(dma_cap_mask_t *mask, dma_filter_fn fn, v
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(__dma_request_channel);
|
||||
|
||||
/**
|
||||
* dma_request_slave_channel - try to allocate an exclusive slave channel
|
||||
* @dev: pointer to client device structure
|
||||
* @name: slave channel name
|
||||
*/
|
||||
struct dma_chan *dma_request_slave_channel(struct device *dev, char *name)
|
||||
{
|
||||
/* If device-tree is present get slave info from here */
|
||||
if (dev->of_node)
|
||||
return of_dma_request_slave_channel(dev->of_node, name);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(dma_request_slave_channel);
|
||||
|
||||
void dma_release_channel(struct dma_chan *chan)
|
||||
{
|
||||
mutex_lock(&dma_list_mutex);
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user