xref: /dragonfly/sys/dev/drm/include/drm/drm_of.h (revision 5ca0a96d)
1 #ifndef __DRM_OF_H__
2 #define __DRM_OF_H__
3 
4 #include <linux/of_graph.h>
5 #if IS_ENABLED(CONFIG_OF) && IS_ENABLED(CONFIG_DRM_PANEL_BRIDGE)
6 #include <drm/drm_bridge.h>
7 #endif
8 
9 struct component_master_ops;
10 struct component_match;
11 struct device;
12 struct drm_device;
13 struct drm_encoder;
14 struct drm_panel;
15 struct drm_bridge;
16 struct device_node;
17 
18 #ifdef CONFIG_OF
19 uint32_t drm_of_find_possible_crtcs(struct drm_device *dev,
20 				    struct device_node *port);
21 void drm_of_component_match_add(struct device *master,
22 				struct component_match **matchptr,
23 				int (*compare)(struct device *, void *),
24 				struct device_node *node);
25 int drm_of_component_probe(struct device *dev,
26 			   int (*compare_of)(struct device *, void *),
27 			   const struct component_master_ops *m_ops);
28 int drm_of_encoder_active_endpoint(struct device_node *node,
29 				   struct drm_encoder *encoder,
30 				   struct of_endpoint *endpoint);
31 int drm_of_find_panel_or_bridge(const struct device_node *np,
32 				int port, int endpoint,
33 				struct drm_panel **panel,
34 				struct drm_bridge **bridge);
35 #else
36 static inline uint32_t drm_of_find_possible_crtcs(struct drm_device *dev,
37 						  struct device_node *port)
38 {
39 	return 0;
40 }
41 
42 static inline void
43 drm_of_component_match_add(struct device *master,
44 			   struct component_match **matchptr,
45 			   int (*compare)(struct device *, void *),
46 			   struct device_node *node)
47 {
48 }
49 
50 static inline int
51 drm_of_component_probe(struct device *dev,
52 		       int (*compare_of)(struct device *, void *),
53 		       const struct component_master_ops *m_ops)
54 {
55 	return -EINVAL;
56 }
57 
58 static inline int drm_of_encoder_active_endpoint(struct device_node *node,
59 						 struct drm_encoder *encoder,
60 						 struct of_endpoint *endpoint)
61 {
62 	return -EINVAL;
63 }
64 static inline int drm_of_find_panel_or_bridge(const struct device_node *np,
65 					      int port, int endpoint,
66 					      struct drm_panel **panel,
67 					      struct drm_bridge **bridge)
68 {
69 	return -EINVAL;
70 }
71 #endif
72 
73 /*
74  * drm_of_panel_bridge_remove - remove panel bridge
75  * @np: device tree node containing panel bridge output ports
76  *
77  * Remove the panel bridge of a given DT node's port and endpoint number
78  *
79  * Returns zero if successful, or one of the standard error codes if it fails.
80  */
81 static inline int drm_of_panel_bridge_remove(const struct device_node *np,
82 					     int port, int endpoint)
83 {
84 #if IS_ENABLED(CONFIG_OF) && IS_ENABLED(CONFIG_DRM_PANEL_BRIDGE)
85 	struct drm_bridge *bridge;
86 	struct device_node *remote;
87 
88 	remote = of_graph_get_remote_node(np, port, endpoint);
89 	if (!remote)
90 		return -ENODEV;
91 
92 	bridge = of_drm_find_bridge(remote);
93 	drm_panel_bridge_remove(bridge);
94 
95 	return 0;
96 #else
97 	return -EINVAL;
98 #endif
99 }
100 
101 static inline int drm_of_encoder_active_endpoint_id(struct device_node *node,
102 						    struct drm_encoder *encoder)
103 {
104 	struct of_endpoint endpoint;
105 	int ret = drm_of_encoder_active_endpoint(node, encoder,
106 						 &endpoint);
107 
108 	return ret ?: endpoint.id;
109 }
110 
111 static inline int drm_of_encoder_active_port_id(struct device_node *node,
112 						struct drm_encoder *encoder)
113 {
114 	struct of_endpoint endpoint;
115 	int ret = drm_of_encoder_active_endpoint(node, encoder,
116 						 &endpoint);
117 
118 	return ret ?: endpoint.port;
119 }
120 
121 #endif /* __DRM_OF_H__ */
122