Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/amdgpu: save/restore backlight level in legacy dce code

Save/restore the backlight level scratch register in S3/S4 so the
backlight level comes back at the previously requested level.

Bug: https://bugzilla.kernel.org/show_bug.cgi?id=199047
Fixes: 4ec6ecf48c64d (drm/amdgpu: drop scratch regs save and restore from S3/S4 handling)
Acked-by: Michel Dänzer <michel.daenzer@amd.com>
Reviewed-by: Harry Wentland <harry.wentland@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

+40 -2
+1
drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h
··· 352 352 u16 firmware_flags; 353 353 /* pointer to backlight encoder */ 354 354 struct amdgpu_encoder *bl_encoder; 355 + u8 bl_level; /* saved backlight level */ 355 356 struct amdgpu_audio audio; /* audio stuff */ 356 357 int num_crtc; /* number of crtcs */ 357 358 int num_hpd; /* number of hpd pins */
+2 -2
drivers/gpu/drm/amd/amdgpu/atombios_encoders.c
··· 34 34 #include <linux/backlight.h> 35 35 #include "bif/bif_4_1_d.h" 36 36 37 - static u8 37 + u8 38 38 amdgpu_atombios_encoder_get_backlight_level_from_reg(struct amdgpu_device *adev) 39 39 { 40 40 u8 backlight_level; ··· 48 48 return backlight_level; 49 49 } 50 50 51 - static void 51 + void 52 52 amdgpu_atombios_encoder_set_backlight_level_to_reg(struct amdgpu_device *adev, 53 53 u8 backlight_level) 54 54 {
+5
drivers/gpu/drm/amd/amdgpu/atombios_encoders.h
··· 25 25 #define __ATOMBIOS_ENCODER_H__ 26 26 27 27 u8 28 + amdgpu_atombios_encoder_get_backlight_level_from_reg(struct amdgpu_device *adev); 29 + void 30 + amdgpu_atombios_encoder_set_backlight_level_to_reg(struct amdgpu_device *adev, 31 + u8 backlight_level); 32 + u8 28 33 amdgpu_atombios_encoder_get_backlight_level(struct amdgpu_encoder *amdgpu_encoder); 29 34 void 30 35 amdgpu_atombios_encoder_set_backlight_level(struct amdgpu_encoder *amdgpu_encoder,
+8
drivers/gpu/drm/amd/amdgpu/dce_v10_0.c
··· 2921 2921 2922 2922 static int dce_v10_0_suspend(void *handle) 2923 2923 { 2924 + struct amdgpu_device *adev = (struct amdgpu_device *)handle; 2925 + 2926 + adev->mode_info.bl_level = 2927 + amdgpu_atombios_encoder_get_backlight_level_from_reg(adev); 2928 + 2924 2929 return dce_v10_0_hw_fini(handle); 2925 2930 } 2926 2931 ··· 2933 2928 { 2934 2929 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 2935 2930 int ret; 2931 + 2932 + amdgpu_atombios_encoder_set_backlight_level_to_reg(adev, 2933 + adev->mode_info.bl_level); 2936 2934 2937 2935 ret = dce_v10_0_hw_init(handle); 2938 2936
+8
drivers/gpu/drm/amd/amdgpu/dce_v11_0.c
··· 3047 3047 3048 3048 static int dce_v11_0_suspend(void *handle) 3049 3049 { 3050 + struct amdgpu_device *adev = (struct amdgpu_device *)handle; 3051 + 3052 + adev->mode_info.bl_level = 3053 + amdgpu_atombios_encoder_get_backlight_level_from_reg(adev); 3054 + 3050 3055 return dce_v11_0_hw_fini(handle); 3051 3056 } 3052 3057 ··· 3059 3054 { 3060 3055 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 3061 3056 int ret; 3057 + 3058 + amdgpu_atombios_encoder_set_backlight_level_to_reg(adev, 3059 + adev->mode_info.bl_level); 3062 3060 3063 3061 ret = dce_v11_0_hw_init(handle); 3064 3062
+8
drivers/gpu/drm/amd/amdgpu/dce_v6_0.c
··· 2787 2787 2788 2788 static int dce_v6_0_suspend(void *handle) 2789 2789 { 2790 + struct amdgpu_device *adev = (struct amdgpu_device *)handle; 2791 + 2792 + adev->mode_info.bl_level = 2793 + amdgpu_atombios_encoder_get_backlight_level_from_reg(adev); 2794 + 2790 2795 return dce_v6_0_hw_fini(handle); 2791 2796 } 2792 2797 ··· 2799 2794 { 2800 2795 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 2801 2796 int ret; 2797 + 2798 + amdgpu_atombios_encoder_set_backlight_level_to_reg(adev, 2799 + adev->mode_info.bl_level); 2802 2800 2803 2801 ret = dce_v6_0_hw_init(handle); 2804 2802
+8
drivers/gpu/drm/amd/amdgpu/dce_v8_0.c
··· 2819 2819 2820 2820 static int dce_v8_0_suspend(void *handle) 2821 2821 { 2822 + struct amdgpu_device *adev = (struct amdgpu_device *)handle; 2823 + 2824 + adev->mode_info.bl_level = 2825 + amdgpu_atombios_encoder_get_backlight_level_from_reg(adev); 2826 + 2822 2827 return dce_v8_0_hw_fini(handle); 2823 2828 } 2824 2829 ··· 2831 2826 { 2832 2827 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 2833 2828 int ret; 2829 + 2830 + amdgpu_atombios_encoder_set_backlight_level_to_reg(adev, 2831 + adev->mode_info.bl_level); 2834 2832 2835 2833 ret = dce_v8_0_hw_init(handle); 2836 2834