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

fbcon: delay screen update when setting the mode of all consoles



If the current framebuffer console is rotated (rotate != 0), doing an
"fbset -a" will corrupt the current console.  Fix by updating the current
console only after all non-visible consoles have been updated.

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 b2f594fd
Loading
Loading
Loading
Loading
+10 −21
Original line number Diff line number Diff line
@@ -2849,7 +2849,7 @@ static void fbcon_set_all_vcs(struct fb_info *info)
	struct fbcon_ops *ops = info->fbcon_par;
	struct vc_data *vc;
	struct display *p;
	int i, rows, cols;
	int i, rows, cols, fg = -1;

	if (!ops || ops->currcon < 0)
		return;
@@ -2860,34 +2860,23 @@ static void fbcon_set_all_vcs(struct fb_info *info)
		    registered_fb[con2fb_map[i]] != info)
			continue;

		if (CON_IS_VISIBLE(vc)) {
			fg = i;
			continue;
		}

		p = &fb_display[vc->vc_num];
		set_blitting_type(vc, info);
		var_to_display(p, &info->var, info);
		cols = FBCON_SWAP(ops->rotate, info->var.xres, info->var.yres);
		rows = FBCON_SWAP(ops->rotate, info->var.yres, info->var.xres);
		cols = FBCON_SWAP(p->rotate, info->var.xres, info->var.yres);
		rows = FBCON_SWAP(p->rotate, info->var.yres, info->var.xres);
		cols /= vc->vc_font.width;
		rows /= vc->vc_font.height;
		vc_resize(vc, cols, rows);

		if (CON_IS_VISIBLE(vc)) {
			updatescrollmode(p, info, vc);
			scrollback_max = 0;
			scrollback_current = 0;

			if (!fbcon_is_inactive(vc, info)) {
			    ops->var.xoffset = ops->var.yoffset =
				p->yscroll = 0;
			    ops->update_start(info);
	}

			fbcon_set_palette(vc, color_table);
			update_screen(vc);
			if (softback_buf)
				fbcon_update_softback(vc);
		}
	}

	ops->p = &fb_display[ops->currcon];
	if (fg != -1)
		fbcon_modechanged(info);
}

static int fbcon_mode_deleted(struct fb_info *info,