linux/include/drm/drm_of.h
<<
>>
Prefs
   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__ */
 159