Link a panel's backlight_device to the bridge connector so luminance-aware clients can drive it through the LUMINANCE property.
Signed-off-by: Mario Limonciello (AMD) <[email protected]> --- drivers/gpu/drm/bridge/panel.c | 15 +++++++++++++++ drivers/gpu/drm/display/drm_bridge_connector.c | 11 ++++++++++- include/drm/drm_bridge.h | 1 + 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/bridge/panel.c b/drivers/gpu/drm/bridge/panel.c index 02388a3de626e..36005e10494d3 100644 --- a/drivers/gpu/drm/bridge/panel.c +++ b/drivers/gpu/drm/bridge/panel.c @@ -233,6 +233,21 @@ bool drm_bridge_is_panel(const struct drm_bridge *bridge) } EXPORT_SYMBOL(drm_bridge_is_panel); +/** + * drm_panel_bridge_to_panel - get the drm_panel wrapped by a panel bridge + * @bridge: the panel bridge + * + * Returns the &drm_panel wrapped by @bridge, or NULL if @bridge is not a + * panel bridge. + */ +struct drm_panel *drm_panel_bridge_to_panel(struct drm_bridge *bridge) +{ + if (!drm_bridge_is_panel(bridge)) + return NULL; + return drm_bridge_to_panel_bridge(bridge)->panel; +} +EXPORT_SYMBOL(drm_panel_bridge_to_panel); + /** * drm_panel_bridge_add - Creates a &drm_bridge and &drm_connector that * just calls the appropriate functions from &drm_panel. diff --git a/drivers/gpu/drm/display/drm_bridge_connector.c b/drivers/gpu/drm/display/drm_bridge_connector.c index 8b54069fa53a4..d4b4e59cea51c 100644 --- a/drivers/gpu/drm/display/drm_bridge_connector.c +++ b/drivers/gpu/drm/display/drm_bridge_connector.c @@ -11,7 +11,9 @@ #include <linux/slab.h> #include <drm/drm_atomic_state_helper.h> +#include <drm/drm_backlight.h> #include <drm/drm_bridge.h> +#include <drm/drm_panel.h> #include <drm/drm_bridge_connector.h> #include <drm/drm_connector.h> #include <drm/drm_device.h> @@ -1082,9 +1084,16 @@ struct drm_connector *drm_bridge_connector_init(struct drm_device *drm, connector->polled = DRM_CONNECTOR_POLL_CONNECT | DRM_CONNECTOR_POLL_DISCONNECT; - if (panel_bridge) + if (panel_bridge) { + struct drm_panel *panel; + drm_panel_bridge_set_orientation(connector, panel_bridge); + panel = drm_panel_bridge_to_panel(panel_bridge); + if (panel && panel->backlight) + drm_backlight_link(connector, panel->backlight); + } + if (support_hdcp && IS_REACHABLE(CONFIG_DRM_DISPLAY_HELPER) && IS_ENABLED(CONFIG_DRM_DISPLAY_HDCP_HELPER)) drm_connector_attach_content_protection_property(connector, true); diff --git a/include/drm/drm_bridge.h b/include/drm/drm_bridge.h index 58fff047f43b6..ce1fc8695b455 100644 --- a/include/drm/drm_bridge.h +++ b/include/drm/drm_bridge.h @@ -1475,6 +1475,7 @@ void drm_bridge_hpd_notify(struct drm_bridge *bridge, #ifdef CONFIG_DRM_PANEL_BRIDGE bool drm_bridge_is_panel(const struct drm_bridge *bridge); +struct drm_panel *drm_panel_bridge_to_panel(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); -- 2.43.0
