Convert AMD display driver to use the new DRM backlight infrastructure.
This allows brightness control via DRM connector properties.

Includes fixes for backlight resource lifecycle management.

Signed-off-by: Mario Limonciello (AMD) <[email protected]>
---
 .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 21 +++++++++++++++++++
 1 file changed, 21 insertions(+)

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
index f6610902eee4..55c3838f7ec8 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -86,6 +86,7 @@
 #include <drm/drm_atomic.h>
 #include <drm/drm_atomic_uapi.h>
 #include <drm/drm_atomic_helper.h>
+#include <drm/drm_backlight.h>
 #include <drm/drm_blend.h>
 #include <drm/drm_fixed.h>
 #include <drm/drm_fourcc.h>
@@ -5549,6 +5550,15 @@ amdgpu_dm_register_backlight_device(struct 
amdgpu_dm_connector *aconnector)
                dm->actual_brightness[aconnector->bl_idx] = real_brightness;
                dm->brightness[aconnector->bl_idx] = real_brightness;
        }
+
+       /* Link the registered backlight device to the DRM connector. If
+        * drm_backlight_alloc() failed earlier in init_helper,
+        * aconnector->base.backlight is NULL and drm_backlight_link() is a
+        * no-op.
+        */
+       drm_backlight_link(aconnector->base.backlight,
+                          dm->backlight_dev[aconnector->bl_idx]);
+
        drm_dbg_driver(drm, "DM: Registered Backlight device: %s\n", bl_name);
 
        return 0;
@@ -7993,6 +8003,7 @@ static void amdgpu_dm_connector_destroy(struct 
drm_connector *connector)
        }
 
        if (aconnector->bl_idx != -1) {
+               drm_backlight_link(aconnector->base.backlight, NULL);
                
backlight_device_unregister(dm->backlight_dev[aconnector->bl_idx]);
                dm->backlight_dev[aconnector->bl_idx] = NULL;
        }
@@ -8005,6 +8016,10 @@ static void amdgpu_dm_connector_destroy(struct 
drm_connector *connector)
        aconnector->dc_sink = NULL;
 
        drm_dp_cec_unregister_connector(&aconnector->dm_dp_aux.aux);
+       /* DRM core will handle drm_backlight cleanup via:
+        * drm_connector_unregister() -> drm_backlight_unregister()
+        * drm_connector_cleanup() -> drm_backlight_free()
+        */
        drm_connector_unregister(connector);
        drm_connector_cleanup(connector);
        kfree(aconnector->dm_dp_aux.aux.name);
@@ -9254,6 +9269,12 @@ void amdgpu_dm_connector_init_helper(struct 
amdgpu_display_manager *dm,
        aconnector->base.state->max_bpc = 16;
        aconnector->base.state->max_requested_bpc = 
aconnector->base.state->max_bpc;
 
+       if (connector_type == DRM_MODE_CONNECTOR_eDP) {
+               int r = drm_backlight_alloc(&aconnector->base);
+
+               if (r)
+                       drm_err(dm->ddev, "Failed to allocate backlight: %d\n", 
r);
+       }
        if (connector_type == DRM_MODE_CONNECTOR_HDMIA) {
                /* Content Type is currently only implemented for HDMI. */
                drm_connector_attach_content_type_property(&aconnector->base);
-- 
2.54.0

Reply via email to