diff options
author | Francisco Jerez <currojerez@riseup.net> | 2009-09-22 19:47:53 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-09-23 10:39:57 -0400 |
commit | f0c7d2b72ad1a694c0c886a14cc708841181e9bd (patch) | |
tree | 4c843c53762352136f4cefd99b8f2f56a4b63d03 | |
parent | 2ddce3fd0acbdc1be684fb5f919ae3d2e9518aac (diff) |
vgacon: prevent vgacon_deinit from touching the hardware for inactive consoles.
fbcon makes the (reasonable) assumption that it only needs to program the
hardware once, when fbcon_init() is called for the foreground console.
This doesn't always play well with vgacon because vgacon_deinit() is only
doing its job when the last console it owns is closed (when switching from
vgacon to fbcon, that's usually *after* fbcon_init() has set the new
mode).
Depending on the hardware this can cause the wrong framebuffer location to
be scanned out (e.g. reproduced on nv05 with the nouveau framebuffer
driver).
Signed-off-by: Francisco Jerez <currojerez@riseup.net>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
Cc: Krzysztof Helt <krzysztof.h1@poczta.fm>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r-- | drivers/video/console/vgacon.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/drivers/video/console/vgacon.c b/drivers/video/console/vgacon.c index 74e96cf83b7e..da55ccaf4d55 100644 --- a/drivers/video/console/vgacon.c +++ b/drivers/video/console/vgacon.c | |||
@@ -589,12 +589,14 @@ static void vgacon_init(struct vc_data *c, int init) | |||
589 | 589 | ||
590 | static void vgacon_deinit(struct vc_data *c) | 590 | static void vgacon_deinit(struct vc_data *c) |
591 | { | 591 | { |
592 | /* When closing the last console, reset video origin */ | 592 | /* When closing the active console, reset video origin */ |
593 | if (!--vgacon_uni_pagedir[1]) { | 593 | if (CON_IS_VISIBLE(c)) { |
594 | c->vc_visible_origin = vga_vram_base; | 594 | c->vc_visible_origin = vga_vram_base; |
595 | vga_set_mem_top(c); | 595 | vga_set_mem_top(c); |
596 | con_free_unimap(c); | ||
597 | } | 596 | } |
597 | |||
598 | if (!--vgacon_uni_pagedir[1]) | ||
599 | con_free_unimap(c); | ||
598 | c->vc_uni_pagedir_loc = &c->vc_uni_pagedir; | 600 | c->vc_uni_pagedir_loc = &c->vc_uni_pagedir; |
599 | con_set_default_unimap(c); | 601 | con_set_default_unimap(c); |
600 | } | 602 | } |