From: "Antonino A. Daplas" From: Bugzilla Bug 5351 "After resuming from S3 (suspended while in X), the LCD panel stays black . However, the laptop is up again, and I can SSH into it from another machine. I can get the panel working again, when I first direct video output to the CRT output of the laptop, and then back to LCD (done by repeatedly hitting Fn+F5 buttons on the Toshiba, which directs output to either LCD, CRT or TV) None of this ever happened with older kernels." This bug is due to the recently added vesafb_blank() method in vesafb. It works with CRT displays, but has a high incidence of problems in laptop users. Since CRT users don't really get that much benefit from hardware blanking, drop support for this. Signed-off-by: Antonino Daplas Signed-off-by: Andrew Morton --- arch/i386/boot/video.S | 5 ---- drivers/video/vesafb.c | 37 ---------------------------------- include/linux/screen_info.h | 3 -- linux/tty.h | 0 4 files changed, 1 insertion(+), 44 deletions(-) diff -puN arch/i386/boot/video.S~vesafb-drop-blank-hook arch/i386/boot/video.S --- devel/arch/i386/boot/video.S~vesafb-drop-blank-hook 2006-01-04 00:53:47.000000000 -0800 +++ devel-akpm/arch/i386/boot/video.S 2006-01-04 00:53:47.000000000 -0800 @@ -97,7 +97,6 @@ #define PARAM_VESAPM_OFF 0x30 #define PARAM_LFB_PAGES 0x32 #define PARAM_VESA_ATTRIB 0x34 -#define PARAM_CAPABILITIES 0x36 /* Define DO_STORE according to CONFIG_VIDEO_RETAIN */ #ifdef CONFIG_VIDEO_RETAIN @@ -234,10 +233,6 @@ mopar_gr: movw 18(%di), %ax movl %eax, %fs:(PARAM_LFB_SIZE) -# store mode capabilities - movl 10(%di), %eax - movl %eax, %fs:(PARAM_CAPABILITIES) - # switching the DAC to 8-bit is for <= 8 bpp only movw %fs:(PARAM_LFB_DEPTH), %ax cmpw $8, %ax diff -puN drivers/video/vesafb.c~vesafb-drop-blank-hook drivers/video/vesafb.c --- devel/drivers/video/vesafb.c~vesafb-drop-blank-hook 2006-01-04 00:53:47.000000000 -0800 +++ devel-akpm/drivers/video/vesafb.c 2006-01-04 00:53:47.000000000 -0800 @@ -57,7 +57,6 @@ static unsigned short *pmi_base = NULL static void (*pmi_start)(void); static void (*pmi_pal)(void); static int depth; -static int vga_compat; /* --------------------------------------------------------------------- */ @@ -90,37 +89,6 @@ static int vesafb_pan_display(struct fb_ return 0; } -static int vesafb_blank(int blank, struct fb_info *info) -{ - int err = 1; - - if (vga_compat) { - int loop = 10000; - u8 seq = 0, crtc17 = 0; - - if (blank == FB_BLANK_POWERDOWN) { - seq = 0x20; - crtc17 = 0x00; - err = 0; - } else { - seq = 0x00; - crtc17 = 0x80; - err = (blank == FB_BLANK_UNBLANK) ? 0 : -EINVAL; - } - - vga_wseq(NULL, 0x00, 0x01); - seq |= vga_rseq(NULL, 0x01) & ~0x20; - vga_wseq(NULL, 0x00, seq); - - crtc17 |= vga_rcrt(NULL, 0x17) & ~0x80; - while (loop--); - vga_wcrt(NULL, 0x17, crtc17); - vga_wseq(NULL, 0x00, 0x03); - } - - return err; -} - static void vesa_setpalette(int regno, unsigned red, unsigned green, unsigned blue) { @@ -205,7 +173,6 @@ static struct fb_ops vesafb_ops = { .owner = THIS_MODULE, .fb_setcolreg = vesafb_setcolreg, .fb_pan_display = vesafb_pan_display, - .fb_blank = vesafb_blank, .fb_fillrect = cfb_fillrect, .fb_copyarea = cfb_copyarea, .fb_imageblit = cfb_imageblit, @@ -459,10 +426,6 @@ static int __init vesafb_probe(struct pl info->flags = FBINFO_FLAG_DEFAULT | (ypan) ? FBINFO_HWACCEL_YPAN : 0; - vga_compat = (screen_info.capabilities & 2) ? 0 : 1; - printk("vesafb: Mode is %sVGA compatible\n", - (vga_compat) ? "" : "not "); - if (fb_alloc_cmap(&info->cmap, 256, 0) < 0) { err = -ENOMEM; goto err; diff -puN include/linux/tty.h~vesafb-drop-blank-hook include/linux/tty.h diff -puN include/linux/screen_info.h~vesafb-drop-blank-hook include/linux/screen_info.h --- devel/include/linux/screen_info.h~vesafb-drop-blank-hook 2006-01-04 00:54:07.000000000 -0800 +++ devel-akpm/include/linux/screen_info.h 2006-01-04 00:54:37.000000000 -0800 @@ -41,8 +41,7 @@ struct screen_info { u16 vesapm_off; /* 0x30 */ u16 pages; /* 0x32 */ u16 vesa_attributes; /* 0x34 */ - u32 capabilities; /* 0x36 */ - /* 0x3a -- 0x3f reserved for future expansion */ + /* 0x36 -- 0x3f reserved for future expansion */ }; extern struct screen_info screen_info; _