xref: /OK3568_Linux_fs/kernel/drivers/dma/dw/acpi.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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