amdgpu_acpi: add backlight control for the DC case
authorAndriy Gapon <avg@FreeBSD.org>
Tue, 5 May 2020 13:27:29 +0000 (16:27 +0300)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 5 May 2020 17:12:55 +0000 (13:12 -0400)
This uses backlight_device_set_brightness() to set the brightness
level requested via ATIF.

Signed-off-by: Andriy Gapon <avg@FreeBSD.org>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c

index 1e41367..956cbbd 100644 (file)
@@ -444,7 +444,6 @@ static int amdgpu_atif_handler(struct amdgpu_device *adev,
 
                DRM_DEBUG_DRIVER("ATIF: %d pending SBIOS requests\n", count);
 
-               /* todo: add DC handling */
                if ((req.pending & ATIF_PANEL_BRIGHTNESS_CHANGE_REQUEST) &&
                    !amdgpu_device_has_dc_support(adev)) {
                        struct amdgpu_encoder *enc = atif->encoder_for_bl;
@@ -463,6 +462,27 @@ static int amdgpu_atif_handler(struct amdgpu_device *adev,
 #endif
                        }
                }
+#if defined(CONFIG_DRM_AMD_DC)
+#if defined(CONFIG_BACKLIGHT_CLASS_DEVICE) || defined(CONFIG_BACKLIGHT_CLASS_DEVICE_MODULE)
+               if ((req.pending & ATIF_PANEL_BRIGHTNESS_CHANGE_REQUEST) &&
+                   amdgpu_device_has_dc_support(adev)) {
+                       struct amdgpu_display_manager *dm = &adev->dm;
+                       struct backlight_device *bd = dm->backlight_dev;
+
+                       if (bd) {
+                               DRM_DEBUG_DRIVER("Changing brightness to %d\n",
+                                                req.backlight_level);
+
+                               /*
+                                * XXX backlight_device_set_brightness() is
+                                * hardwired to post BACKLIGHT_UPDATE_SYSFS.
+                                * It probably should accept 'reason' parameter.
+                                */
+                               backlight_device_set_brightness(bd, req.backlight_level);
+                       }
+               }
+#endif
+#endif
                if (req.pending & ATIF_DGPU_DISPLAY_EVENT) {
                        if (adev->flags & AMD_IS_PX) {
                                pm_runtime_get_sync(adev->ddev->dev);