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