18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com 48c2ecf20Sopenharmony_ci * Author: Peter Ujfalusi <peter.ujfalusi@ti.com> 58c2ecf20Sopenharmony_ci */ 68c2ecf20Sopenharmony_ci 78c2ecf20Sopenharmony_ciint xudma_navss_psil_pair(struct udma_dev *ud, u32 src_thread, u32 dst_thread) 88c2ecf20Sopenharmony_ci{ 98c2ecf20Sopenharmony_ci return navss_psil_pair(ud, src_thread, dst_thread); 108c2ecf20Sopenharmony_ci} 118c2ecf20Sopenharmony_ciEXPORT_SYMBOL(xudma_navss_psil_pair); 128c2ecf20Sopenharmony_ci 138c2ecf20Sopenharmony_ciint xudma_navss_psil_unpair(struct udma_dev *ud, u32 src_thread, u32 dst_thread) 148c2ecf20Sopenharmony_ci{ 158c2ecf20Sopenharmony_ci return navss_psil_unpair(ud, src_thread, dst_thread); 168c2ecf20Sopenharmony_ci} 178c2ecf20Sopenharmony_ciEXPORT_SYMBOL(xudma_navss_psil_unpair); 188c2ecf20Sopenharmony_ci 198c2ecf20Sopenharmony_cistruct udma_dev *of_xudma_dev_get(struct device_node *np, const char *property) 208c2ecf20Sopenharmony_ci{ 218c2ecf20Sopenharmony_ci struct device_node *udma_node = np; 228c2ecf20Sopenharmony_ci struct platform_device *pdev; 238c2ecf20Sopenharmony_ci struct udma_dev *ud; 248c2ecf20Sopenharmony_ci 258c2ecf20Sopenharmony_ci if (property) { 268c2ecf20Sopenharmony_ci udma_node = of_parse_phandle(np, property, 0); 278c2ecf20Sopenharmony_ci if (!udma_node) { 288c2ecf20Sopenharmony_ci pr_err("UDMA node is not found\n"); 298c2ecf20Sopenharmony_ci return ERR_PTR(-ENODEV); 308c2ecf20Sopenharmony_ci } 318c2ecf20Sopenharmony_ci } 328c2ecf20Sopenharmony_ci 338c2ecf20Sopenharmony_ci pdev = of_find_device_by_node(udma_node); 348c2ecf20Sopenharmony_ci if (np != udma_node) 358c2ecf20Sopenharmony_ci of_node_put(udma_node); 368c2ecf20Sopenharmony_ci 378c2ecf20Sopenharmony_ci if (!pdev) { 388c2ecf20Sopenharmony_ci pr_debug("UDMA device not found\n"); 398c2ecf20Sopenharmony_ci return ERR_PTR(-EPROBE_DEFER); 408c2ecf20Sopenharmony_ci } 418c2ecf20Sopenharmony_ci 428c2ecf20Sopenharmony_ci ud = platform_get_drvdata(pdev); 438c2ecf20Sopenharmony_ci if (!ud) { 448c2ecf20Sopenharmony_ci pr_debug("UDMA has not been probed\n"); 458c2ecf20Sopenharmony_ci put_device(&pdev->dev); 468c2ecf20Sopenharmony_ci return ERR_PTR(-EPROBE_DEFER); 478c2ecf20Sopenharmony_ci } 488c2ecf20Sopenharmony_ci 498c2ecf20Sopenharmony_ci return ud; 508c2ecf20Sopenharmony_ci} 518c2ecf20Sopenharmony_ciEXPORT_SYMBOL(of_xudma_dev_get); 528c2ecf20Sopenharmony_ci 538c2ecf20Sopenharmony_ciu32 xudma_dev_get_psil_base(struct udma_dev *ud) 548c2ecf20Sopenharmony_ci{ 558c2ecf20Sopenharmony_ci return ud->psil_base; 568c2ecf20Sopenharmony_ci} 578c2ecf20Sopenharmony_ciEXPORT_SYMBOL(xudma_dev_get_psil_base); 588c2ecf20Sopenharmony_ci 598c2ecf20Sopenharmony_cistruct udma_tisci_rm *xudma_dev_get_tisci_rm(struct udma_dev *ud) 608c2ecf20Sopenharmony_ci{ 618c2ecf20Sopenharmony_ci return &ud->tisci_rm; 628c2ecf20Sopenharmony_ci} 638c2ecf20Sopenharmony_ciEXPORT_SYMBOL(xudma_dev_get_tisci_rm); 648c2ecf20Sopenharmony_ci 658c2ecf20Sopenharmony_ciint xudma_alloc_gp_rflow_range(struct udma_dev *ud, int from, int cnt) 668c2ecf20Sopenharmony_ci{ 678c2ecf20Sopenharmony_ci return __udma_alloc_gp_rflow_range(ud, from, cnt); 688c2ecf20Sopenharmony_ci} 698c2ecf20Sopenharmony_ciEXPORT_SYMBOL(xudma_alloc_gp_rflow_range); 708c2ecf20Sopenharmony_ci 718c2ecf20Sopenharmony_ciint xudma_free_gp_rflow_range(struct udma_dev *ud, int from, int cnt) 728c2ecf20Sopenharmony_ci{ 738c2ecf20Sopenharmony_ci return __udma_free_gp_rflow_range(ud, from, cnt); 748c2ecf20Sopenharmony_ci} 758c2ecf20Sopenharmony_ciEXPORT_SYMBOL(xudma_free_gp_rflow_range); 768c2ecf20Sopenharmony_ci 778c2ecf20Sopenharmony_cibool xudma_rflow_is_gp(struct udma_dev *ud, int id) 788c2ecf20Sopenharmony_ci{ 798c2ecf20Sopenharmony_ci return !test_bit(id, ud->rflow_gp_map); 808c2ecf20Sopenharmony_ci} 818c2ecf20Sopenharmony_ciEXPORT_SYMBOL(xudma_rflow_is_gp); 828c2ecf20Sopenharmony_ci 838c2ecf20Sopenharmony_ci#define XUDMA_GET_PUT_RESOURCE(res) \ 848c2ecf20Sopenharmony_cistruct udma_##res *xudma_##res##_get(struct udma_dev *ud, int id) \ 858c2ecf20Sopenharmony_ci{ \ 868c2ecf20Sopenharmony_ci return __udma_reserve_##res(ud, UDMA_TP_NORMAL, id); \ 878c2ecf20Sopenharmony_ci} \ 888c2ecf20Sopenharmony_ciEXPORT_SYMBOL(xudma_##res##_get); \ 898c2ecf20Sopenharmony_ci \ 908c2ecf20Sopenharmony_civoid xudma_##res##_put(struct udma_dev *ud, struct udma_##res *p) \ 918c2ecf20Sopenharmony_ci{ \ 928c2ecf20Sopenharmony_ci clear_bit(p->id, ud->res##_map); \ 938c2ecf20Sopenharmony_ci} \ 948c2ecf20Sopenharmony_ciEXPORT_SYMBOL(xudma_##res##_put) 958c2ecf20Sopenharmony_ciXUDMA_GET_PUT_RESOURCE(tchan); 968c2ecf20Sopenharmony_ciXUDMA_GET_PUT_RESOURCE(rchan); 978c2ecf20Sopenharmony_ci 988c2ecf20Sopenharmony_cistruct udma_rflow *xudma_rflow_get(struct udma_dev *ud, int id) 998c2ecf20Sopenharmony_ci{ 1008c2ecf20Sopenharmony_ci return __udma_get_rflow(ud, id); 1018c2ecf20Sopenharmony_ci} 1028c2ecf20Sopenharmony_ciEXPORT_SYMBOL(xudma_rflow_get); 1038c2ecf20Sopenharmony_ci 1048c2ecf20Sopenharmony_civoid xudma_rflow_put(struct udma_dev *ud, struct udma_rflow *p) 1058c2ecf20Sopenharmony_ci{ 1068c2ecf20Sopenharmony_ci __udma_put_rflow(ud, p); 1078c2ecf20Sopenharmony_ci} 1088c2ecf20Sopenharmony_ciEXPORT_SYMBOL(xudma_rflow_put); 1098c2ecf20Sopenharmony_ci 1108c2ecf20Sopenharmony_ci#define XUDMA_GET_RESOURCE_ID(res) \ 1118c2ecf20Sopenharmony_ciint xudma_##res##_get_id(struct udma_##res *p) \ 1128c2ecf20Sopenharmony_ci{ \ 1138c2ecf20Sopenharmony_ci return p->id; \ 1148c2ecf20Sopenharmony_ci} \ 1158c2ecf20Sopenharmony_ciEXPORT_SYMBOL(xudma_##res##_get_id) 1168c2ecf20Sopenharmony_ciXUDMA_GET_RESOURCE_ID(tchan); 1178c2ecf20Sopenharmony_ciXUDMA_GET_RESOURCE_ID(rchan); 1188c2ecf20Sopenharmony_ciXUDMA_GET_RESOURCE_ID(rflow); 1198c2ecf20Sopenharmony_ci 1208c2ecf20Sopenharmony_ci/* Exported register access functions */ 1218c2ecf20Sopenharmony_ci#define XUDMA_RT_IO_FUNCTIONS(res) \ 1228c2ecf20Sopenharmony_ciu32 xudma_##res##rt_read(struct udma_##res *p, int reg) \ 1238c2ecf20Sopenharmony_ci{ \ 1248c2ecf20Sopenharmony_ci if (!p) \ 1258c2ecf20Sopenharmony_ci return 0; \ 1268c2ecf20Sopenharmony_ci return udma_read(p->reg_rt, reg); \ 1278c2ecf20Sopenharmony_ci} \ 1288c2ecf20Sopenharmony_ciEXPORT_SYMBOL(xudma_##res##rt_read); \ 1298c2ecf20Sopenharmony_ci \ 1308c2ecf20Sopenharmony_civoid xudma_##res##rt_write(struct udma_##res *p, int reg, u32 val) \ 1318c2ecf20Sopenharmony_ci{ \ 1328c2ecf20Sopenharmony_ci if (!p) \ 1338c2ecf20Sopenharmony_ci return; \ 1348c2ecf20Sopenharmony_ci udma_write(p->reg_rt, reg, val); \ 1358c2ecf20Sopenharmony_ci} \ 1368c2ecf20Sopenharmony_ciEXPORT_SYMBOL(xudma_##res##rt_write) 1378c2ecf20Sopenharmony_ciXUDMA_RT_IO_FUNCTIONS(tchan); 1388c2ecf20Sopenharmony_ciXUDMA_RT_IO_FUNCTIONS(rchan); 139