1 | /* SPDX-License-Identifier: GPL-2.0 */ |
2 | /* |
3 | * OF helpers for DMA request / controller |
4 | * |
5 | * Based on of_gpio.h |
6 | * |
7 | * Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.com/ |
8 | */ |
9 | |
10 | #ifndef __LINUX_OF_DMA_H |
11 | #define __LINUX_OF_DMA_H |
12 | |
13 | #include <linux/of.h> |
14 | #include <linux/dmaengine.h> |
15 | |
16 | struct device_node; |
17 | |
18 | struct of_dma { |
19 | struct list_head of_dma_controllers; |
20 | struct device_node *of_node; |
21 | struct dma_chan *(*of_dma_xlate) |
22 | (struct of_phandle_args *, struct of_dma *); |
23 | void *(*of_dma_route_allocate) |
24 | (struct of_phandle_args *, struct of_dma *); |
25 | struct dma_router *dma_router; |
26 | void *of_dma_data; |
27 | }; |
28 | |
29 | struct of_dma_filter_info { |
30 | dma_cap_mask_t dma_cap; |
31 | dma_filter_fn filter_fn; |
32 | }; |
33 | |
34 | #ifdef CONFIG_DMA_OF |
35 | extern int of_dma_controller_register(struct device_node *np, |
36 | struct dma_chan *(*of_dma_xlate) |
37 | (struct of_phandle_args *, struct of_dma *), |
38 | void *data); |
39 | extern void of_dma_controller_free(struct device_node *np); |
40 | |
41 | extern int of_dma_router_register(struct device_node *np, |
42 | void *(*of_dma_route_allocate) |
43 | (struct of_phandle_args *, struct of_dma *), |
44 | struct dma_router *dma_router); |
45 | #define of_dma_router_free of_dma_controller_free |
46 | |
47 | extern struct dma_chan *of_dma_request_slave_channel(struct device_node *np, |
48 | const char *name); |
49 | extern struct dma_chan *of_dma_simple_xlate(struct of_phandle_args *dma_spec, |
50 | struct of_dma *ofdma); |
51 | extern struct dma_chan *of_dma_xlate_by_chan_id(struct of_phandle_args *dma_spec, |
52 | struct of_dma *ofdma); |
53 | |
54 | #else |
55 | static inline int of_dma_controller_register(struct device_node *np, |
56 | struct dma_chan *(*of_dma_xlate) |
57 | (struct of_phandle_args *, struct of_dma *), |
58 | void *data) |
59 | { |
60 | return -ENODEV; |
61 | } |
62 | |
63 | static inline void of_dma_controller_free(struct device_node *np) |
64 | { |
65 | } |
66 | |
67 | static inline int of_dma_router_register(struct device_node *np, |
68 | void *(*of_dma_route_allocate) |
69 | (struct of_phandle_args *, struct of_dma *), |
70 | struct dma_router *dma_router) |
71 | { |
72 | return -ENODEV; |
73 | } |
74 | |
75 | #define of_dma_router_free of_dma_controller_free |
76 | |
77 | static inline struct dma_chan *of_dma_request_slave_channel(struct device_node *np, |
78 | const char *name) |
79 | { |
80 | return ERR_PTR(-ENODEV); |
81 | } |
82 | |
83 | static inline struct dma_chan *of_dma_simple_xlate(struct of_phandle_args *dma_spec, |
84 | struct of_dma *ofdma) |
85 | { |
86 | return NULL; |
87 | } |
88 | |
89 | #define of_dma_xlate_by_chan_id NULL |
90 | |
91 | #endif |
92 | |
93 | #endif /* __LINUX_OF_DMA_H */ |
94 | |