drm/radeon: restore backlight level on resume
authorAlex Deucher <alexander.deucher@amd.com>
Fri, 14 Sep 2012 13:45:50 +0000 (09:45 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 27 Sep 2012 14:22:42 +0000 (10:22 -0400)
Restore the backlight level on resume.  Some systems
need to explicitly restore the backlight level on
resume.

Fixes panel resume on my Trinity laptop and may fix the
following bugs:
https://bugs.freedesktop.org/show_bug.cgi?id=43829
https://bugzilla.kernel.org/show_bug.cgi?id=46241

Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/radeon/atombios_encoders.c
drivers/gpu/drm/radeon/radeon_device.c
drivers/gpu/drm/radeon/radeon_encoders.c
drivers/gpu/drm/radeon/radeon_mode.h

index 5ce13b8fbe6c6866455cc84175a90d3ebf907577..806cbcc94fdd2a4dcb1c7108119dffaa229cd90b 100644 (file)
@@ -32,8 +32,6 @@
 
 extern int atom_debug;
 
-#if defined(CONFIG_BACKLIGHT_CLASS_DEVICE) || defined(CONFIG_BACKLIGHT_CLASS_DEVICE_MODULE)
-
 static u8
 radeon_atom_get_backlight_level_from_reg(struct radeon_device *rdev)
 {
@@ -134,6 +132,8 @@ atombios_set_backlight_level(struct radeon_encoder *radeon_encoder, u8 level)
        }
 }
 
+#if defined(CONFIG_BACKLIGHT_CLASS_DEVICE) || defined(CONFIG_BACKLIGHT_CLASS_DEVICE_MODULE)
+
 static u8 radeon_atom_bl_level(struct backlight_device *bd)
 {
        u8 level;
index 6fca11c64dcd1158947f142a26f1d7c7c66f1b7e..64a42647f08a43cacdabd7a76bc7b52dde6c762b 100644 (file)
@@ -1282,6 +1282,13 @@ int radeon_resume_kms(struct drm_device *dev)
        if (rdev->is_atom_bios) {
                radeon_atom_encoder_init(rdev);
                radeon_atom_disp_eng_pll_init(rdev);
+               /* turn on the BL */
+               if (rdev->mode_info.bl_encoder) {
+                       u8 bl_level = radeon_get_backlight_level(rdev,
+                                                                rdev->mode_info.bl_encoder);
+                       radeon_set_backlight_level(rdev, rdev->mode_info.bl_encoder,
+                                                  bl_level);
+               }
        }
        /* reset hpd state */
        radeon_hpd_init(rdev);
index 93b0d64b3f6db0506df0a666829060daf9482b96..e66c807df9e6d1da2778228af84c5319b0c30baa 100644 (file)
@@ -179,6 +179,7 @@ radeon_link_encoder_connector(struct drm_device *dev)
                                                radeon_atom_backlight_init(radeon_encoder, connector);
                                        else
                                                radeon_legacy_backlight_init(radeon_encoder, connector);
+                                       rdev->mode_info.bl_encoder = radeon_encoder;
                                }
                        }
                }
index 917d02750cf7ccfd591929af5b477fdd20ad229f..527761801590b3f10c9955adc7f84852476c19b6 100644 (file)
@@ -254,12 +254,14 @@ struct radeon_mode_info {
        struct radeon_fbdev *rfbdev;
        /* firmware flags */
        u16 firmware_flags;
+       /* pointer to backlight encoder */
+       struct radeon_encoder *bl_encoder;
 };
 
-#if defined(CONFIG_BACKLIGHT_CLASS_DEVICE) || defined(CONFIG_BACKLIGHT_CLASS_DEVICE_MODULE)
-
 #define RADEON_MAX_BL_LEVEL 0xFF
 
+#if defined(CONFIG_BACKLIGHT_CLASS_DEVICE) || defined(CONFIG_BACKLIGHT_CLASS_DEVICE_MODULE)
+
 struct radeon_backlight_privdata {
        struct radeon_encoder *encoder;
        uint8_t negative;