1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun // Copyright (C) 2013,2019 Intel Corporation
3*4882a593Smuzhiyun
4*4882a593Smuzhiyun #include <linux/acpi.h>
5*4882a593Smuzhiyun #include <linux/acpi_dma.h>
6*4882a593Smuzhiyun
7*4882a593Smuzhiyun #include "internal.h"
8*4882a593Smuzhiyun
dw_dma_acpi_filter(struct dma_chan * chan,void * param)9*4882a593Smuzhiyun static bool dw_dma_acpi_filter(struct dma_chan *chan, void *param)
10*4882a593Smuzhiyun {
11*4882a593Smuzhiyun struct acpi_dma_spec *dma_spec = param;
12*4882a593Smuzhiyun struct dw_dma_slave slave = {
13*4882a593Smuzhiyun .dma_dev = dma_spec->dev,
14*4882a593Smuzhiyun .src_id = dma_spec->slave_id,
15*4882a593Smuzhiyun .dst_id = dma_spec->slave_id,
16*4882a593Smuzhiyun .m_master = 0,
17*4882a593Smuzhiyun .p_master = 1,
18*4882a593Smuzhiyun };
19*4882a593Smuzhiyun
20*4882a593Smuzhiyun return dw_dma_filter(chan, &slave);
21*4882a593Smuzhiyun }
22*4882a593Smuzhiyun
dw_dma_acpi_controller_register(struct dw_dma * dw)23*4882a593Smuzhiyun void dw_dma_acpi_controller_register(struct dw_dma *dw)
24*4882a593Smuzhiyun {
25*4882a593Smuzhiyun struct device *dev = dw->dma.dev;
26*4882a593Smuzhiyun struct acpi_dma_filter_info *info;
27*4882a593Smuzhiyun int ret;
28*4882a593Smuzhiyun
29*4882a593Smuzhiyun if (!has_acpi_companion(dev))
30*4882a593Smuzhiyun return;
31*4882a593Smuzhiyun
32*4882a593Smuzhiyun info = devm_kzalloc(dev, sizeof(*info), GFP_KERNEL);
33*4882a593Smuzhiyun if (!info)
34*4882a593Smuzhiyun return;
35*4882a593Smuzhiyun
36*4882a593Smuzhiyun dma_cap_zero(info->dma_cap);
37*4882a593Smuzhiyun dma_cap_set(DMA_SLAVE, info->dma_cap);
38*4882a593Smuzhiyun info->filter_fn = dw_dma_acpi_filter;
39*4882a593Smuzhiyun
40*4882a593Smuzhiyun ret = acpi_dma_controller_register(dev, acpi_dma_simple_xlate, info);
41*4882a593Smuzhiyun if (ret)
42*4882a593Smuzhiyun dev_err(dev, "could not register acpi_dma_controller\n");
43*4882a593Smuzhiyun }
44*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(dw_dma_acpi_controller_register);
45*4882a593Smuzhiyun
dw_dma_acpi_controller_free(struct dw_dma * dw)46*4882a593Smuzhiyun void dw_dma_acpi_controller_free(struct dw_dma *dw)
47*4882a593Smuzhiyun {
48*4882a593Smuzhiyun struct device *dev = dw->dma.dev;
49*4882a593Smuzhiyun
50*4882a593Smuzhiyun if (!has_acpi_companion(dev))
51*4882a593Smuzhiyun return;
52*4882a593Smuzhiyun
53*4882a593Smuzhiyun acpi_dma_controller_free(dev);
54*4882a593Smuzhiyun }
55*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(dw_dma_acpi_controller_free);
56