Commit d060a321 authored by Ville Syrjala's avatar Ville Syrjala Committed by Linus Torvalds

[PATCH] Fix console blanking

Current console blanking code is broken.  It will first do a normal blank,
then start the VESA blank timer if vesa_off_interval != 0, and then proceed
to do the VESA blanking directly.  After the timer expires it will do the
VESA blanking a second time.  Also the vesa_powerdown() function doesn't
allow all VESA modes to be used.

With this patch the behaviour is:
1. Blank: vesa_off_interval != 0 -> Do normal blank
          vesa_off_interval == 0 -> Do VESA blank
2. Start the VESA blank timer if vesa_off_interval != 0 and
   vesa_power_mode != 0.

It also gets rid of the limiting vesa_powerdown() function.
Signed-off-by: default avatarVille Syrjala <syrjala@sci.fi>
Cc: "Antonino A. Daplas" <adaplas@pol.net>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent cae8a12f
...@@ -2758,29 +2758,6 @@ static void set_vesa_blanking(char __user *p) ...@@ -2758,29 +2758,6 @@ static void set_vesa_blanking(char __user *p)
vesa_blank_mode = (mode < 4) ? mode : 0; vesa_blank_mode = (mode < 4) ? mode : 0;
} }
/*
* This is called by a timer handler
*/
static void vesa_powerdown(void)
{
struct vc_data *c = vc_cons[fg_console].d;
/*
* Power down if currently suspended (1 or 2),
* suspend if currently blanked (0),
* else do nothing (i.e. already powered down (3)).
* Called only if powerdown features are allowed.
*/
switch (vesa_blank_mode) {
case VESA_NO_BLANKING:
c->vc_sw->con_blank(c, VESA_VSYNC_SUSPEND+1, 0);
break;
case VESA_VSYNC_SUSPEND:
case VESA_HSYNC_SUSPEND:
c->vc_sw->con_blank(c, VESA_POWERDOWN+1, 0);
break;
}
}
void do_blank_screen(int entering_gfx) void do_blank_screen(int entering_gfx)
{ {
struct vc_data *vc = vc_cons[fg_console].d; struct vc_data *vc = vc_cons[fg_console].d;
...@@ -2791,8 +2768,7 @@ void do_blank_screen(int entering_gfx) ...@@ -2791,8 +2768,7 @@ void do_blank_screen(int entering_gfx)
if (console_blanked) { if (console_blanked) {
if (blank_state == blank_vesa_wait) { if (blank_state == blank_vesa_wait) {
blank_state = blank_off; blank_state = blank_off;
vesa_powerdown(); vc->vc_sw->con_blank(vc, vesa_blank_mode + 1, 0);
} }
return; return;
} }
...@@ -2822,7 +2798,7 @@ void do_blank_screen(int entering_gfx) ...@@ -2822,7 +2798,7 @@ void do_blank_screen(int entering_gfx)
save_screen(vc); save_screen(vc);
/* In case we need to reset origin, blanking hook returns 1 */ /* In case we need to reset origin, blanking hook returns 1 */
i = vc->vc_sw->con_blank(vc, 1, 0); i = vc->vc_sw->con_blank(vc, vesa_off_interval ? 1 : (vesa_blank_mode + 1), 0);
console_blanked = fg_console + 1; console_blanked = fg_console + 1;
if (i) if (i)
set_origin(vc); set_origin(vc);
...@@ -2830,13 +2806,10 @@ void do_blank_screen(int entering_gfx) ...@@ -2830,13 +2806,10 @@ void do_blank_screen(int entering_gfx)
if (console_blank_hook && console_blank_hook(1)) if (console_blank_hook && console_blank_hook(1))
return; return;
if (vesa_off_interval) { if (vesa_off_interval && vesa_blank_mode) {
blank_state = blank_vesa_wait; blank_state = blank_vesa_wait;
mod_timer(&console_timer, jiffies + vesa_off_interval); mod_timer(&console_timer, jiffies + vesa_off_interval);
} }
if (vesa_blank_mode)
vc->vc_sw->con_blank(vc, vesa_blank_mode + 1, 0);
} }
EXPORT_SYMBOL(do_blank_screen); EXPORT_SYMBOL(do_blank_screen);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment