162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci// Copyright (C) 2013,2019 Intel Corporation 362306a36Sopenharmony_ci 462306a36Sopenharmony_ci#include <linux/acpi.h> 562306a36Sopenharmony_ci#include <linux/acpi_dma.h> 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#include "internal.h" 862306a36Sopenharmony_ci 962306a36Sopenharmony_cistatic bool dw_dma_acpi_filter(struct dma_chan *chan, void *param) 1062306a36Sopenharmony_ci{ 1162306a36Sopenharmony_ci struct acpi_dma_spec *dma_spec = param; 1262306a36Sopenharmony_ci struct dw_dma_slave slave = { 1362306a36Sopenharmony_ci .dma_dev = dma_spec->dev, 1462306a36Sopenharmony_ci .src_id = dma_spec->slave_id, 1562306a36Sopenharmony_ci .dst_id = dma_spec->slave_id, 1662306a36Sopenharmony_ci .m_master = 0, 1762306a36Sopenharmony_ci .p_master = 1, 1862306a36Sopenharmony_ci }; 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci return dw_dma_filter(chan, &slave); 2162306a36Sopenharmony_ci} 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_civoid dw_dma_acpi_controller_register(struct dw_dma *dw) 2462306a36Sopenharmony_ci{ 2562306a36Sopenharmony_ci struct device *dev = dw->dma.dev; 2662306a36Sopenharmony_ci struct acpi_dma_filter_info *info; 2762306a36Sopenharmony_ci int ret; 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci if (!has_acpi_companion(dev)) 3062306a36Sopenharmony_ci return; 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci info = devm_kzalloc(dev, sizeof(*info), GFP_KERNEL); 3362306a36Sopenharmony_ci if (!info) 3462306a36Sopenharmony_ci return; 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci dma_cap_zero(info->dma_cap); 3762306a36Sopenharmony_ci dma_cap_set(DMA_SLAVE, info->dma_cap); 3862306a36Sopenharmony_ci info->filter_fn = dw_dma_acpi_filter; 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ci ret = acpi_dma_controller_register(dev, acpi_dma_simple_xlate, info); 4162306a36Sopenharmony_ci if (ret) 4262306a36Sopenharmony_ci dev_err(dev, "could not register acpi_dma_controller\n"); 4362306a36Sopenharmony_ci} 4462306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(dw_dma_acpi_controller_register); 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_civoid dw_dma_acpi_controller_free(struct dw_dma *dw) 4762306a36Sopenharmony_ci{ 4862306a36Sopenharmony_ci struct device *dev = dw->dma.dev; 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ci if (!has_acpi_companion(dev)) 5162306a36Sopenharmony_ci return; 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_ci acpi_dma_controller_free(dev); 5462306a36Sopenharmony_ci} 5562306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(dw_dma_acpi_controller_free); 56