From: Mario Limonciello <[email protected]>

Allow bridges that own brightness control to advertise a luminance
operation and its supported relative range.

Signed-off-by: Mario Limonciello <[email protected]>
---
v10:
 * Split bridge operations out of the combined panel and bridge patch
---
 include/drm/drm_bridge.h | 74 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 74 insertions(+)

diff --git a/include/drm/drm_bridge.h b/include/drm/drm_bridge.h
index 1981d24a700d2..95f5c2b8656cd 100644
--- a/include/drm/drm_bridge.h
+++ b/include/drm/drm_bridge.h
@@ -62,6 +62,15 @@ enum drm_bridge_attach_flags {
  * struct drm_bridge_funcs - drm_bridge control functions
  */
 struct drm_bridge_funcs {
+       /**
+        * @set_luminance:
+        *
+        * Apply a relative luminance level to a bridge that controls panel
+        * emission. Bridges implementing this callback shall set
+        * @DRM_BRIDGE_OP_LUMINANCE.
+        */
+       void (*set_luminance)(struct drm_bridge *bridge, unsigned int 
luminance);
+
        /**
         * @attach:
         *
@@ -1021,6 +1030,11 @@ enum drm_bridge_ops {
         * &drm_bridge_funcs->hdmi_clear_spd_infoframe callbacks.
         */
        DRM_BRIDGE_OP_HDMI_SPD_INFOFRAME = BIT(10),
+
+       /**
+        * @DRM_BRIDGE_OP_LUMINANCE: The bridge controls panel luminance.
+        */
+       DRM_BRIDGE_OP_LUMINANCE = BIT(11),
 };
 
 /**
@@ -1071,6 +1085,12 @@ struct drm_bridge {
        void *driver_private;
        /** @ops: bitmask of operations supported by the bridge */
        enum drm_bridge_ops ops;
+
+       /** @luminance_max: Maximum relative luminance level. */
+       unsigned int luminance_max;
+
+       /** @luminance: Current relative luminance level. */
+       unsigned int luminance;
        /**
         * @type: Type of the connection at the bridge output
         * (DRM_MODE_CONNECTOR_*). For bridges at the end of this chain this
@@ -1522,6 +1542,60 @@ void drm_bridge_hpd_disable(struct drm_bridge *bridge);
 void drm_bridge_hpd_notify(struct drm_bridge *bridge,
                           enum drm_connector_status status);
 
+#ifdef CONFIG_DRM_PANEL_BRIDGE
+bool drm_bridge_is_panel(const struct drm_bridge *bridge);
+struct drm_bridge *drm_panel_bridge_add(struct drm_panel *panel);
+struct drm_bridge *drm_panel_bridge_add_typed(struct drm_panel *panel,
+                                             u32 connector_type);
+void drm_panel_bridge_remove(struct drm_bridge *bridge);
+int drm_panel_bridge_set_orientation(struct drm_connector *connector,
+                                    struct drm_bridge *bridge);
+struct drm_bridge *devm_drm_panel_bridge_add(struct device *dev,
+                                            struct drm_panel *panel);
+struct drm_bridge *devm_drm_panel_bridge_add_typed(struct device *dev,
+                                                  struct drm_panel *panel,
+                                                  u32 connector_type);
+struct drm_bridge *drmm_panel_bridge_add(struct drm_device *drm,
+                                            struct drm_panel *panel);
+struct drm_connector *drm_panel_bridge_connector(struct drm_bridge *bridge);
+#else
+static inline bool drm_bridge_is_panel(const struct drm_bridge *bridge)
+{
+       return false;
+}
+
+static inline int drm_panel_bridge_set_orientation(struct drm_connector 
*connector,
+                                                  struct drm_bridge *bridge)
+{
+       return -EINVAL;
+}
+
+#endif
+
+#if defined(CONFIG_OF) && defined(CONFIG_DRM_PANEL_BRIDGE)
+struct drm_bridge *devm_drm_of_get_bridge(struct device *dev, struct 
device_node *node,
+                                         u32 port, u32 endpoint);
+struct drm_bridge *drmm_of_get_bridge(struct drm_device *drm, struct 
device_node *node,
+                                         u32 port, u32 endpoint);
+#else
+static inline struct drm_bridge *devm_drm_of_get_bridge(struct device *dev,
+                                                       struct device_node 
*node,
+                                                       u32 port,
+                                                       u32 endpoint)
+{
+       return ERR_PTR(-ENODEV);
+}
+
+static inline struct drm_bridge *drmm_of_get_bridge(struct drm_device *drm,
+                                                    struct device_node *node,
+                                                    u32 port,
+                                                    u32 endpoint)
+{
+       return ERR_PTR(-ENODEV);
+}
+#endif
+
+void devm_drm_put_bridge(struct device *dev, struct drm_bridge *bridge);
 void drm_bridge_debugfs_params(struct dentry *root);
 void drm_bridge_debugfs_encoder_params(struct dentry *root, struct drm_encoder 
*encoder);
 

-- 
2.53.0

Reply via email to