]> git.baikalelectronics.ru Git - kernel.git/commitdiff
drm/ast: Fix black screen when getting out of suspend
authorJocelyn Falempe <jfalempe@redhat.com>
Wed, 22 Jun 2022 12:48:15 +0000 (14:48 +0200)
committerJocelyn Falempe <jfalempe@redhat.com>
Mon, 27 Jun 2022 08:15:02 +0000 (10:15 +0200)
With an AST2600, the screen is garbage when going out of suspend.
This is because color settings are lost, and not restored on resume.
Force the color settings on DPMS_ON, to make sure the settings are correct.

I didn't write this code, it comes from the out-of-tree aspeed driver v1.13
https://www.aspeedtech.com/support_driver/

Signed-off-by: Jocelyn Falempe <jfalempe@redhat.com>
Tested-by: Venkat Tadikonda <venkateswara.rao@intel.com>
Reviewed-by: Lyude Paul <lyude@redhat.com>
Acked-by: Thomas Zimmermann <tzimmermann@suse.de>
Tested-by: Thomas Zimmermann <tzimmermann@suse.de>
Link: https://patchwork.freedesktop.org/patch/msgid/20220622124815.356035-1-jfalempe@redhat.com
drivers/gpu/drm/ast/ast_mode.c

index 3eb9afecd9d438ad9d3d3d9e0078e4c0eae2db00..4a91605b4654b7aab0c48ef99e0c59575014869c 100644 (file)
@@ -990,6 +990,9 @@ static void ast_crtc_dpms(struct drm_crtc *crtc, int mode)
 {
        struct ast_private *ast = to_ast_private(crtc->dev);
        u8 ch = AST_DPMS_VSYNC_OFF | AST_DPMS_HSYNC_OFF;
+       struct ast_crtc_state *ast_state;
+       const struct drm_format_info *format;
+       struct ast_vbios_mode_info *vbios_mode_info;
 
        /* TODO: Maybe control display signal generation with
         *       Sync Enable (bit CR17.7).
@@ -1007,6 +1010,16 @@ static void ast_crtc_dpms(struct drm_crtc *crtc, int mode)
                        ast_dp_set_on_off(crtc->dev, 1);
                }
 
+               ast_state = to_ast_crtc_state(crtc->state);
+               format = ast_state->format;
+
+               if (format) {
+                       vbios_mode_info = &ast_state->vbios_mode_info;
+
+                       ast_set_color_reg(ast, format);
+                       ast_set_vbios_color_reg(ast, format, vbios_mode_info);
+               }
+
                ast_crtc_load_lut(ast, crtc);
                break;
        case DRM_MODE_DPMS_STANDBY: