xref: /OK3568_Linux_fs/kernel/include/linux/of_graph.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * OF graph binding parsing helpers
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright (C) 2012 - 2013 Samsung Electronics Co., Ltd.
6*4882a593Smuzhiyun  * Author: Sylwester Nawrocki <s.nawrocki@samsung.com>
7*4882a593Smuzhiyun  *
8*4882a593Smuzhiyun  * Copyright (C) 2012 Renesas Electronics Corp.
9*4882a593Smuzhiyun  * Author: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
10*4882a593Smuzhiyun  */
11*4882a593Smuzhiyun #ifndef __LINUX_OF_GRAPH_H
12*4882a593Smuzhiyun #define __LINUX_OF_GRAPH_H
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun #include <linux/types.h>
15*4882a593Smuzhiyun #include <linux/errno.h>
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun /**
18*4882a593Smuzhiyun  * struct of_endpoint - the OF graph endpoint data structure
19*4882a593Smuzhiyun  * @port: identifier (value of reg property) of a port this endpoint belongs to
20*4882a593Smuzhiyun  * @id: identifier (value of reg property) of this endpoint
21*4882a593Smuzhiyun  * @local_node: pointer to device_node of this endpoint
22*4882a593Smuzhiyun  */
23*4882a593Smuzhiyun struct of_endpoint {
24*4882a593Smuzhiyun 	unsigned int port;
25*4882a593Smuzhiyun 	unsigned int id;
26*4882a593Smuzhiyun 	const struct device_node *local_node;
27*4882a593Smuzhiyun };
28*4882a593Smuzhiyun 
29*4882a593Smuzhiyun /**
30*4882a593Smuzhiyun  * for_each_endpoint_of_node - iterate over every endpoint in a device node
31*4882a593Smuzhiyun  * @parent: parent device node containing ports and endpoints
32*4882a593Smuzhiyun  * @child: loop variable pointing to the current endpoint node
33*4882a593Smuzhiyun  *
34*4882a593Smuzhiyun  * When breaking out of the loop, of_node_put(child) has to be called manually.
35*4882a593Smuzhiyun  */
36*4882a593Smuzhiyun #define for_each_endpoint_of_node(parent, child) \
37*4882a593Smuzhiyun 	for (child = of_graph_get_next_endpoint(parent, NULL); child != NULL; \
38*4882a593Smuzhiyun 	     child = of_graph_get_next_endpoint(parent, child))
39*4882a593Smuzhiyun 
40*4882a593Smuzhiyun #ifdef CONFIG_OF
41*4882a593Smuzhiyun bool of_graph_is_present(const struct device_node *node);
42*4882a593Smuzhiyun int of_graph_parse_endpoint(const struct device_node *node,
43*4882a593Smuzhiyun 				struct of_endpoint *endpoint);
44*4882a593Smuzhiyun int of_graph_get_endpoint_count(const struct device_node *np);
45*4882a593Smuzhiyun struct device_node *of_graph_get_port_by_id(struct device_node *node, u32 id);
46*4882a593Smuzhiyun struct device_node *of_graph_get_next_endpoint(const struct device_node *parent,
47*4882a593Smuzhiyun 					struct device_node *previous);
48*4882a593Smuzhiyun struct device_node *of_graph_get_endpoint_by_regs(
49*4882a593Smuzhiyun 		const struct device_node *parent, int port_reg, int reg);
50*4882a593Smuzhiyun struct device_node *of_graph_get_remote_endpoint(
51*4882a593Smuzhiyun 					const struct device_node *node);
52*4882a593Smuzhiyun struct device_node *of_graph_get_port_parent(struct device_node *node);
53*4882a593Smuzhiyun struct device_node *of_graph_get_remote_port_parent(
54*4882a593Smuzhiyun 					const struct device_node *node);
55*4882a593Smuzhiyun struct device_node *of_graph_get_remote_port(const struct device_node *node);
56*4882a593Smuzhiyun struct device_node *of_graph_get_remote_node(const struct device_node *node,
57*4882a593Smuzhiyun 					     u32 port, u32 endpoint);
58*4882a593Smuzhiyun #else
59*4882a593Smuzhiyun 
of_graph_is_present(const struct device_node * node)60*4882a593Smuzhiyun static inline bool of_graph_is_present(const struct device_node *node)
61*4882a593Smuzhiyun {
62*4882a593Smuzhiyun 	return false;
63*4882a593Smuzhiyun }
64*4882a593Smuzhiyun 
of_graph_parse_endpoint(const struct device_node * node,struct of_endpoint * endpoint)65*4882a593Smuzhiyun static inline int of_graph_parse_endpoint(const struct device_node *node,
66*4882a593Smuzhiyun 					struct of_endpoint *endpoint)
67*4882a593Smuzhiyun {
68*4882a593Smuzhiyun 	return -ENOSYS;
69*4882a593Smuzhiyun }
70*4882a593Smuzhiyun 
of_graph_get_endpoint_count(const struct device_node * np)71*4882a593Smuzhiyun static inline int of_graph_get_endpoint_count(const struct device_node *np)
72*4882a593Smuzhiyun {
73*4882a593Smuzhiyun 	return 0;
74*4882a593Smuzhiyun }
75*4882a593Smuzhiyun 
of_graph_get_port_by_id(struct device_node * node,u32 id)76*4882a593Smuzhiyun static inline struct device_node *of_graph_get_port_by_id(
77*4882a593Smuzhiyun 					struct device_node *node, u32 id)
78*4882a593Smuzhiyun {
79*4882a593Smuzhiyun 	return NULL;
80*4882a593Smuzhiyun }
81*4882a593Smuzhiyun 
of_graph_get_next_endpoint(const struct device_node * parent,struct device_node * previous)82*4882a593Smuzhiyun static inline struct device_node *of_graph_get_next_endpoint(
83*4882a593Smuzhiyun 					const struct device_node *parent,
84*4882a593Smuzhiyun 					struct device_node *previous)
85*4882a593Smuzhiyun {
86*4882a593Smuzhiyun 	return NULL;
87*4882a593Smuzhiyun }
88*4882a593Smuzhiyun 
of_graph_get_endpoint_by_regs(const struct device_node * parent,int port_reg,int reg)89*4882a593Smuzhiyun static inline struct device_node *of_graph_get_endpoint_by_regs(
90*4882a593Smuzhiyun 		const struct device_node *parent, int port_reg, int reg)
91*4882a593Smuzhiyun {
92*4882a593Smuzhiyun 	return NULL;
93*4882a593Smuzhiyun }
94*4882a593Smuzhiyun 
of_graph_get_remote_endpoint(const struct device_node * node)95*4882a593Smuzhiyun static inline struct device_node *of_graph_get_remote_endpoint(
96*4882a593Smuzhiyun 					const struct device_node *node)
97*4882a593Smuzhiyun {
98*4882a593Smuzhiyun 	return NULL;
99*4882a593Smuzhiyun }
100*4882a593Smuzhiyun 
of_graph_get_port_parent(struct device_node * node)101*4882a593Smuzhiyun static inline struct device_node *of_graph_get_port_parent(
102*4882a593Smuzhiyun 	struct device_node *node)
103*4882a593Smuzhiyun {
104*4882a593Smuzhiyun 	return NULL;
105*4882a593Smuzhiyun }
106*4882a593Smuzhiyun 
of_graph_get_remote_port_parent(const struct device_node * node)107*4882a593Smuzhiyun static inline struct device_node *of_graph_get_remote_port_parent(
108*4882a593Smuzhiyun 					const struct device_node *node)
109*4882a593Smuzhiyun {
110*4882a593Smuzhiyun 	return NULL;
111*4882a593Smuzhiyun }
112*4882a593Smuzhiyun 
of_graph_get_remote_port(const struct device_node * node)113*4882a593Smuzhiyun static inline struct device_node *of_graph_get_remote_port(
114*4882a593Smuzhiyun 					const struct device_node *node)
115*4882a593Smuzhiyun {
116*4882a593Smuzhiyun 	return NULL;
117*4882a593Smuzhiyun }
of_graph_get_remote_node(const struct device_node * node,u32 port,u32 endpoint)118*4882a593Smuzhiyun static inline struct device_node *of_graph_get_remote_node(
119*4882a593Smuzhiyun 					const struct device_node *node,
120*4882a593Smuzhiyun 					u32 port, u32 endpoint)
121*4882a593Smuzhiyun {
122*4882a593Smuzhiyun 	return NULL;
123*4882a593Smuzhiyun }
124*4882a593Smuzhiyun 
125*4882a593Smuzhiyun #endif /* CONFIG_OF */
126*4882a593Smuzhiyun 
127*4882a593Smuzhiyun #endif /* __LINUX_OF_GRAPH_H */
128