18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 28c2ecf20Sopenharmony_ci// Copyright (C) 2013,2019 Intel Corporation 38c2ecf20Sopenharmony_ci 48c2ecf20Sopenharmony_ci#include <linux/acpi.h> 58c2ecf20Sopenharmony_ci#include <linux/acpi_dma.h> 68c2ecf20Sopenharmony_ci 78c2ecf20Sopenharmony_ci#include "internal.h" 88c2ecf20Sopenharmony_ci 98c2ecf20Sopenharmony_cistatic bool dw_dma_acpi_filter(struct dma_chan *chan, void *param) 108c2ecf20Sopenharmony_ci{ 118c2ecf20Sopenharmony_ci struct acpi_dma_spec *dma_spec = param; 128c2ecf20Sopenharmony_ci struct dw_dma_slave slave = { 138c2ecf20Sopenharmony_ci .dma_dev = dma_spec->dev, 148c2ecf20Sopenharmony_ci .src_id = dma_spec->slave_id, 158c2ecf20Sopenharmony_ci .dst_id = dma_spec->slave_id, 168c2ecf20Sopenharmony_ci .m_master = 0, 178c2ecf20Sopenharmony_ci .p_master = 1, 188c2ecf20Sopenharmony_ci }; 198c2ecf20Sopenharmony_ci 208c2ecf20Sopenharmony_ci return dw_dma_filter(chan, &slave); 218c2ecf20Sopenharmony_ci} 228c2ecf20Sopenharmony_ci 238c2ecf20Sopenharmony_civoid dw_dma_acpi_controller_register(struct dw_dma *dw) 248c2ecf20Sopenharmony_ci{ 258c2ecf20Sopenharmony_ci struct device *dev = dw->dma.dev; 268c2ecf20Sopenharmony_ci struct acpi_dma_filter_info *info; 278c2ecf20Sopenharmony_ci int ret; 288c2ecf20Sopenharmony_ci 298c2ecf20Sopenharmony_ci if (!has_acpi_companion(dev)) 308c2ecf20Sopenharmony_ci return; 318c2ecf20Sopenharmony_ci 328c2ecf20Sopenharmony_ci info = devm_kzalloc(dev, sizeof(*info), GFP_KERNEL); 338c2ecf20Sopenharmony_ci if (!info) 348c2ecf20Sopenharmony_ci return; 358c2ecf20Sopenharmony_ci 368c2ecf20Sopenharmony_ci dma_cap_zero(info->dma_cap); 378c2ecf20Sopenharmony_ci dma_cap_set(DMA_SLAVE, info->dma_cap); 388c2ecf20Sopenharmony_ci info->filter_fn = dw_dma_acpi_filter; 398c2ecf20Sopenharmony_ci 408c2ecf20Sopenharmony_ci ret = acpi_dma_controller_register(dev, acpi_dma_simple_xlate, info); 418c2ecf20Sopenharmony_ci if (ret) 428c2ecf20Sopenharmony_ci dev_err(dev, "could not register acpi_dma_controller\n"); 438c2ecf20Sopenharmony_ci} 448c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(dw_dma_acpi_controller_register); 458c2ecf20Sopenharmony_ci 468c2ecf20Sopenharmony_civoid dw_dma_acpi_controller_free(struct dw_dma *dw) 478c2ecf20Sopenharmony_ci{ 488c2ecf20Sopenharmony_ci struct device *dev = dw->dma.dev; 498c2ecf20Sopenharmony_ci 508c2ecf20Sopenharmony_ci if (!has_acpi_companion(dev)) 518c2ecf20Sopenharmony_ci return; 528c2ecf20Sopenharmony_ci 538c2ecf20Sopenharmony_ci acpi_dma_controller_free(dev); 548c2ecf20Sopenharmony_ci} 558c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(dw_dma_acpi_controller_free); 56