fbcon: Revise primary device selection

Use set_con2fb_map() to select the primary display driver instead of using
unbind_con_driver() and bind_con_driver().  Using the former is much simpler
and safer than the current one.

Signed-off-by: Antonino Daplas <adaplas@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
Antonino A. Daplas 2007-07-17 04:05:32 -07:00 committed by Linus Torvalds
parent d1baa4ffa6
commit afd1db1632
2 changed files with 15 additions and 42 deletions

View File

@ -120,7 +120,7 @@ config FRAMEBUFFER_CONSOLE
config FRAMEBUFFER_CONSOLE_DETECT_PRIMARY config FRAMEBUFFER_CONSOLE_DETECT_PRIMARY
bool "Map the console to the primary display device" bool "Map the console to the primary display device"
depends on FRAMEBUFFER_CONSOLE && VT_HW_CONSOLE_BINDING depends on FRAMEBUFFER_CONSOLE
default n default n
---help--- ---help---
If this option is selected, the framebuffer console will If this option is selected, the framebuffer console will
@ -132,10 +132,6 @@ config FRAMEBUFFER_CONSOLE_DETECT_PRIMARY
You can always override the automatic selection of the primary device You can always override the automatic selection of the primary device
by using the fbcon=map: boot option. by using the fbcon=map: boot option.
To select this feature, "Support for binding and unbinding console
drivers", under "Device Drivers"->"Character Devices" must be set to
y.
If unsure, select n. If unsure, select n.
config FRAMEBUFFER_CONSOLE_ROTATION config FRAMEBUFFER_CONSOLE_ROTATION

View File

@ -3041,52 +3041,32 @@ static int fbcon_fb_unregistered(struct fb_info *info)
} }
#ifdef CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY #ifdef CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY
static int fbcon_select_primary(struct fb_info *info) static void fbcon_select_primary(struct fb_info *info)
{ {
int ret = 0;
if (!map_override && primary_device == -1 && if (!map_override && primary_device == -1 &&
fb_is_primary_device(info)) { fb_is_primary_device(info)) {
int i, err; int i;
printk(KERN_INFO "fbcon: %s is primary device\n", printk(KERN_INFO "fbcon: %s (fb%i) is primary device\n",
info->fix.id); info->fix.id, info->node);
primary_device = info->node; primary_device = info->node;
if (!con_is_bound(&fb_con)) for (i = first_fb_vc; i <= last_fb_vc; i++)
goto done;
printk(KERN_INFO "fbcon: Unbinding old driver\n");
unbind_con_driver(&fb_con, first_fb_vc, last_fb_vc,
fbcon_is_default);
info_idx = primary_device;
for (i = first_fb_vc; i <= last_fb_vc; i++) {
con2fb_map_boot[i] = primary_device; con2fb_map_boot[i] = primary_device;
con2fb_map[i] = primary_device;
if (con_is_bound(&fb_con)) {
printk(KERN_INFO "fbcon: Remapping primary device, "
"fb%i, to tty %i-%i\n", info->node,
first_fb_vc + 1, last_fb_vc + 1);
info_idx = primary_device;
} }
printk(KERN_INFO "fbcon: Selecting new driver\n");
err = bind_con_driver(&fb_con, first_fb_vc, last_fb_vc,
fbcon_is_default);
if (err) {
for (i = first_fb_vc; i <= last_fb_vc; i++)
con2fb_map[i] = -1;
info_idx = -1;
}
ret = 1;
} }
done:
return ret;
} }
#else #else
static inline int fbcon_select_primary(struct fb_info *info) static inline void fbcon_select_primary(struct fb_info *info)
{ {
return 0; return;
} }
#endif /* CONFIG_FRAMEBUFFER_DETECT_PRIMARY */ #endif /* CONFIG_FRAMEBUFFER_DETECT_PRIMARY */
@ -3094,9 +3074,7 @@ static int fbcon_fb_registered(struct fb_info *info)
{ {
int ret = 0, i, idx = info->node; int ret = 0, i, idx = info->node;
if (fbcon_select_primary(info)) fbcon_select_primary(info);
goto done;
if (info_idx == -1) { if (info_idx == -1) {
for (i = first_fb_vc; i <= last_fb_vc; i++) { for (i = first_fb_vc; i <= last_fb_vc; i++) {
@ -3115,7 +3093,6 @@ static int fbcon_fb_registered(struct fb_info *info)
} }
} }
done:
return ret; return ret;
} }