From: "Mario Limonciello (AMD)" <[email protected]> The link should allow clients to change luminance property.
Tested-by: Dmitry Baryshkov <[email protected]> # SM8150-HDK Signed-off-by: Mario Limonciello (AMD) <[email protected]> Tested-by: Simon Ser <[email protected]> --- drivers/gpu/drm/bridge/panel.c | 15 +++++++++++++++ drivers/gpu/drm/display/drm_bridge_connector.c | 15 ++++++++++++++- include/drm/drm_bridge.h | 1 + 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/bridge/panel.c b/drivers/gpu/drm/bridge/panel.c index 4978ec98a0828..2fa15278faf87 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 649969fca1413..23a3802294625 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> @@ -1051,9 +1053,20 @@ 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) { + ret = drm_backlight_alloc(connector); + if (!ret) + drm_backlight_link(connector->backlight, + 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 4ba3a5deef9a6..6311ca726b45f 100644 --- a/include/drm/drm_bridge.h +++ b/include/drm/drm_bridge.h @@ -1586,6 +1586,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
