drm_of.h (4372B)
1/* SPDX-License-Identifier: GPL-2.0 */ 2#ifndef __DRM_OF_H__ 3#define __DRM_OF_H__ 4 5#include <linux/of_graph.h> 6#if IS_ENABLED(CONFIG_OF) && IS_ENABLED(CONFIG_DRM_PANEL_BRIDGE) 7#include <drm/drm_bridge.h> 8#endif 9 10struct component_master_ops; 11struct component_match; 12struct device; 13struct drm_device; 14struct drm_encoder; 15struct drm_panel; 16struct drm_bridge; 17struct device_node; 18 19/** 20 * enum drm_lvds_dual_link_pixels - Pixel order of an LVDS dual-link connection 21 * @DRM_LVDS_DUAL_LINK_EVEN_ODD_PIXELS: Even pixels are expected to be generated 22 * from the first port, odd pixels from the second port 23 * @DRM_LVDS_DUAL_LINK_ODD_EVEN_PIXELS: Odd pixels are expected to be generated 24 * from the first port, even pixels from the second port 25 */ 26enum drm_lvds_dual_link_pixels { 27 DRM_LVDS_DUAL_LINK_EVEN_ODD_PIXELS = 0, 28 DRM_LVDS_DUAL_LINK_ODD_EVEN_PIXELS = 1, 29}; 30 31#ifdef CONFIG_OF 32uint32_t drm_of_crtc_port_mask(struct drm_device *dev, 33 struct device_node *port); 34uint32_t drm_of_find_possible_crtcs(struct drm_device *dev, 35 struct device_node *port); 36void drm_of_component_match_add(struct device *master, 37 struct component_match **matchptr, 38 int (*compare)(struct device *, void *), 39 struct device_node *node); 40int drm_of_component_probe(struct device *dev, 41 int (*compare_of)(struct device *, void *), 42 const struct component_master_ops *m_ops); 43int drm_of_encoder_active_endpoint(struct device_node *node, 44 struct drm_encoder *encoder, 45 struct of_endpoint *endpoint); 46int drm_of_find_panel_or_bridge(const struct device_node *np, 47 int port, int endpoint, 48 struct drm_panel **panel, 49 struct drm_bridge **bridge); 50int drm_of_lvds_get_dual_link_pixel_order(const struct device_node *port1, 51 const struct device_node *port2); 52int drm_of_lvds_get_data_mapping(const struct device_node *port); 53#else 54static inline uint32_t drm_of_crtc_port_mask(struct drm_device *dev, 55 struct device_node *port) 56{ 57 return 0; 58} 59 60static inline uint32_t drm_of_find_possible_crtcs(struct drm_device *dev, 61 struct device_node *port) 62{ 63 return 0; 64} 65 66static inline void 67drm_of_component_match_add(struct device *master, 68 struct component_match **matchptr, 69 int (*compare)(struct device *, void *), 70 struct device_node *node) 71{ 72} 73 74static inline int 75drm_of_component_probe(struct device *dev, 76 int (*compare_of)(struct device *, void *), 77 const struct component_master_ops *m_ops) 78{ 79 return -EINVAL; 80} 81 82static inline int drm_of_encoder_active_endpoint(struct device_node *node, 83 struct drm_encoder *encoder, 84 struct of_endpoint *endpoint) 85{ 86 return -EINVAL; 87} 88static inline int drm_of_find_panel_or_bridge(const struct device_node *np, 89 int port, int endpoint, 90 struct drm_panel **panel, 91 struct drm_bridge **bridge) 92{ 93 return -EINVAL; 94} 95 96static inline int 97drm_of_lvds_get_dual_link_pixel_order(const struct device_node *port1, 98 const struct device_node *port2) 99{ 100 return -EINVAL; 101} 102 103static inline int 104drm_of_lvds_get_data_mapping(const struct device_node *port) 105{ 106 return -EINVAL; 107} 108#endif 109 110/* 111 * drm_of_panel_bridge_remove - remove panel bridge 112 * @np: device tree node containing panel bridge output ports 113 * 114 * Remove the panel bridge of a given DT node's port and endpoint number 115 * 116 * Returns zero if successful, or one of the standard error codes if it fails. 117 */ 118static inline int drm_of_panel_bridge_remove(const struct device_node *np, 119 int port, int endpoint) 120{ 121#if IS_ENABLED(CONFIG_OF) && IS_ENABLED(CONFIG_DRM_PANEL_BRIDGE) 122 struct drm_bridge *bridge; 123 struct device_node *remote; 124 125 remote = of_graph_get_remote_node(np, port, endpoint); 126 if (!remote) 127 return -ENODEV; 128 129 bridge = of_drm_find_bridge(remote); 130 drm_panel_bridge_remove(bridge); 131 132 return 0; 133#else 134 return -EINVAL; 135#endif 136} 137 138static inline int drm_of_encoder_active_endpoint_id(struct device_node *node, 139 struct drm_encoder *encoder) 140{ 141 struct of_endpoint endpoint; 142 int ret = drm_of_encoder_active_endpoint(node, encoder, 143 &endpoint); 144 145 return ret ?: endpoint.id; 146} 147 148static inline int drm_of_encoder_active_port_id(struct device_node *node, 149 struct drm_encoder *encoder) 150{ 151 struct of_endpoint endpoint; 152 int ret = drm_of_encoder_active_endpoint(node, encoder, 153 &endpoint); 154 155 return ret ?: endpoint.port; 156} 157 158#endif /* __DRM_OF_H__ */