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:
parent
d1baa4ffa6
commit
afd1db1632
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue