xref: /linux/include/drm/drm_of.h (revision ebc053cf0b4c8ed6bff9a0de6b25f819473ba83a)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef __DRM_OF_H__
3 #define __DRM_OF_H__
4 
5 #include <linux/err.h>
6 #include <linux/of_graph.h>
7 #if IS_ENABLED(CONFIG_OF) && IS_ENABLED(CONFIG_DRM_PANEL_BRIDGE)
8 #include <linux/of.h>
9 #include <drm/drm_bridge.h>
10 #endif
11 
12 struct component_master_ops;
13 struct component_match;
14 struct device;
15 struct drm_device;
16 struct drm_encoder;
17 struct drm_panel;
18 struct drm_bridge;
19 struct device_node;
20 struct mipi_dsi_device_info;
21 struct mipi_dsi_host;
22 
23 enum drm_panel_orientation;
24 
25 /**
26  * enum drm_lvds_dual_link_pixels - Pixel order of an LVDS dual-link connection
27  * @DRM_LVDS_DUAL_LINK_EVEN_ODD_PIXELS: Even pixels are expected to be generated
28  *    from the first port, odd pixels from the second port
29  * @DRM_LVDS_DUAL_LINK_ODD_EVEN_PIXELS: Odd pixels are expected to be generated
30  *    from the first port, even pixels from the second port
31  */
32 enum drm_lvds_dual_link_pixels {
33 	DRM_LVDS_DUAL_LINK_EVEN_ODD_PIXELS = 0,
34 	DRM_LVDS_DUAL_LINK_ODD_EVEN_PIXELS = 1,
35 };
36 
37 #ifdef CONFIG_OF
38 uint32_t drm_of_crtc_port_mask(struct drm_device *dev,
39 			    struct device_node *port);
40 uint32_t drm_of_find_possible_crtcs(struct drm_device *dev,
41 				    struct device_node *port);
42 void drm_of_component_match_add(struct device *master,
43 				struct component_match **matchptr,
44 				int (*compare)(struct device *, void *),
45 				struct device_node *node);
46 int drm_of_component_probe(struct device *dev,
47 			   int (*compare_of)(struct device *, void *),
48 			   const struct component_master_ops *m_ops);
49 int drm_of_encoder_active_endpoint(struct device_node *node,
50 				   struct drm_encoder *encoder,
51 				   struct of_endpoint *endpoint);
52 int drm_of_get_panel_orientation(const struct device_node *np,
53 				 enum drm_panel_orientation *orientation);
54 int drm_of_find_panel_or_bridge(const struct device_node *np,
55 				int port, int endpoint,
56 				struct drm_panel **panel,
57 				struct drm_bridge **bridge);
58 int drm_of_lvds_get_dual_link_pixel_order(const struct device_node *port1,
59 					  const struct device_node *port2);
60 int drm_of_lvds_get_dual_link_pixel_order_sink(struct device_node *port1,
61 					       struct device_node *port2);
62 int drm_of_lvds_get_data_mapping(const struct device_node *port);
63 int drm_of_get_data_lanes_count(const struct device_node *endpoint,
64 				const unsigned int min, const unsigned int max);
65 int drm_of_get_data_lanes_count_ep(const struct device_node *port,
66 				   int port_reg, int reg,
67 				   const unsigned int min,
68 				   const unsigned int max);
69 int drm_of_get_data_lanes_count_remote(const struct device_node *port,
70 				       int port_reg, int reg,
71 				       const unsigned int min,
72 				       const unsigned int max);
73 #else
74 static inline uint32_t drm_of_crtc_port_mask(struct drm_device *dev,
75 					  struct device_node *port)
76 {
77 	return 0;
78 }
79 
80 static inline uint32_t drm_of_find_possible_crtcs(struct drm_device *dev,
81 						  struct device_node *port)
82 {
83 	return 0;
84 }
85 
86 static inline void
87 drm_of_component_match_add(struct device *master,
88 			   struct component_match **matchptr,
89 			   int (*compare)(struct device *, void *),
90 			   struct device_node *node)
91 {
92 }
93 
94 static inline int
95 drm_of_component_probe(struct device *dev,
96 		       int (*compare_of)(struct device *, void *),
97 		       const struct component_master_ops *m_ops)
98 {
99 	return -EINVAL;
100 }
101 
102 static inline int drm_of_encoder_active_endpoint(struct device_node *node,
103 						 struct drm_encoder *encoder,
104 						 struct of_endpoint *endpoint)
105 {
106 	return -EINVAL;
107 }
108 
109 static inline int drm_of_get_panel_orientation(const struct device_node *np,
110 					       enum drm_panel_orientation *orientation)
111 {
112 	return -EINVAL;
113 }
114 
115 static inline int drm_of_find_panel_or_bridge(const struct device_node *np,
116 					      int port, int endpoint,
117 					      struct drm_panel **panel,
118 					      struct drm_bridge **bridge)
119 {
120 	return -EINVAL;
121 }
122 
123 static inline int
124 drm_of_lvds_get_dual_link_pixel_order(const struct device_node *port1,
125 				      const struct device_node *port2)
126 {
127 	return -EINVAL;
128 }
129 
130 static inline int
131 drm_of_lvds_get_dual_link_pixel_order_sink(struct device_node *port1,
132 					   struct device_node *port2)
133 {
134 	return -EINVAL;
135 }
136 
137 static inline int
138 drm_of_lvds_get_data_mapping(const struct device_node *port)
139 {
140 	return -EINVAL;
141 }
142 
143 static inline int
144 drm_of_get_data_lanes_count(const struct device_node *endpoint,
145 			    const unsigned int min, const unsigned int max)
146 {
147 	return -EINVAL;
148 }
149 
150 static inline int
151 drm_of_get_data_lanes_count_ep(const struct device_node *port,
152 			       int port_reg, int reg,
153 			       const unsigned int min,
154 			       const unsigned int max)
155 {
156 	return -EINVAL;
157 }
158 
159 static inline int
160 drm_of_get_data_lanes_count_remote(const struct device_node *port,
161 				   int port_reg, int reg,
162 				   const unsigned int min,
163 				   const unsigned int max)
164 {
165 	return -EINVAL;
166 }
167 #endif
168 
169 #if IS_ENABLED(CONFIG_OF) && IS_ENABLED(CONFIG_DRM_MIPI_DSI)
170 struct mipi_dsi_host *drm_of_get_dsi_bus(struct device *dev);
171 #else
172 static inline struct
173 mipi_dsi_host *drm_of_get_dsi_bus(struct device *dev)
174 {
175 	return ERR_PTR(-EINVAL);
176 }
177 #endif /* CONFIG_OF && CONFIG_DRM_MIPI_DSI */
178 
179 /*
180  * drm_of_panel_bridge_remove - remove panel bridge
181  * @np: device tree node containing panel bridge output ports
182  *
183  * Remove the panel bridge of a given DT node's port and endpoint number
184  *
185  * Returns zero if successful, or one of the standard error codes if it fails.
186  */
187 static inline int drm_of_panel_bridge_remove(const struct device_node *np,
188 					     int port, int endpoint)
189 {
190 #if IS_ENABLED(CONFIG_OF) && IS_ENABLED(CONFIG_DRM_PANEL_BRIDGE)
191 	struct drm_bridge *bridge;
192 	struct device_node *remote;
193 
194 	remote = of_graph_get_remote_node(np, port, endpoint);
195 	if (!remote)
196 		return -ENODEV;
197 
198 	bridge = of_drm_find_and_get_bridge(remote);
199 	drm_panel_bridge_remove(bridge);
200 
201 	drm_bridge_put(bridge);
202 	of_node_put(remote);
203 
204 	return 0;
205 #else
206 	return -EINVAL;
207 #endif
208 }
209 
210 static inline int drm_of_encoder_active_endpoint_id(struct device_node *node,
211 						    struct drm_encoder *encoder)
212 {
213 	struct of_endpoint endpoint;
214 	int ret = drm_of_encoder_active_endpoint(node, encoder,
215 						 &endpoint);
216 
217 	return ret ?: endpoint.id;
218 }
219 
220 static inline int drm_of_encoder_active_port_id(struct device_node *node,
221 						struct drm_encoder *encoder)
222 {
223 	struct of_endpoint endpoint;
224 	int ret = drm_of_encoder_active_endpoint(node, encoder,
225 						 &endpoint);
226 
227 	return ret ?: endpoint.port;
228 }
229 
230 #endif /* __DRM_OF_H__ */
231