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
