Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit afd1db16 authored by Antonino A. Daplas's avatar Antonino A. Daplas Committed by Linus Torvalds
Browse files

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: default avatarAntonino Daplas <adaplas@gmail.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent d1baa4ff
Loading
Loading
Loading
Loading
+1 −5
Original line number Diff line number Diff line
@@ -120,7 +120,7 @@ config FRAMEBUFFER_CONSOLE

config FRAMEBUFFER_CONSOLE_DETECT_PRIMARY
       bool "Map the console to the primary display device"
       depends on FRAMEBUFFER_CONSOLE && VT_HW_CONSOLE_BINDING
       depends on FRAMEBUFFER_CONSOLE
       default n
       ---help---
         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
	 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.

config FRAMEBUFFER_CONSOLE_ROTATION
+13 −36
Original line number Diff line number Diff line
@@ -3041,52 +3041,32 @@ static int fbcon_fb_unregistered(struct fb_info *info)
}

#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 &&
	    fb_is_primary_device(info)) {
		int i, err;
		int i;

		printk(KERN_INFO "fbcon: %s is primary device\n",
		       info->fix.id);
		printk(KERN_INFO "fbcon: %s (fb%i) is primary device\n",
		       info->fix.id, info->node);
		primary_device = info->node;

		if (!con_is_bound(&fb_con))
			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[i] = 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;
			con2fb_map_boot[i] = primary_device;

			info_idx = -1;
		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;
		}

		ret = 1;
	}

done:
	return ret;
}
#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 */

@@ -3094,9 +3074,7 @@ static int fbcon_fb_registered(struct fb_info *info)
{
	int ret = 0, i, idx = info->node;

	if (fbcon_select_primary(info))
		goto done;

	fbcon_select_primary(info);

	if (info_idx == -1) {
		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;
}