[PATCH] fbdev: Add fbset -a support
Add capability to fbdev to listen to the FB_ACTIVATE_ALL flag. If set, it notifies fbcon that all consoles must be set to the current var. Signed-off-by: Antonino Daplas <adaplas@pol.net> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
committed by
Linus Torvalds
parent
cb2e87a65d
commit
7726e9e10f
@@ -2593,6 +2593,51 @@ static void fbcon_modechanged(struct fb_info *info)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
|
||||||
|
if (!ops || ops->currcon < 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (i = 0; i < MAX_NR_CONSOLES; i++) {
|
||||||
|
vc = vc_cons[i].d;
|
||||||
|
if (!vc || vc->vc_mode != KD_TEXT ||
|
||||||
|
registered_fb[con2fb_map[i]] != info)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
p = &fb_display[vc->vc_num];
|
||||||
|
|
||||||
|
info->var.xoffset = info->var.yoffset = p->yscroll = 0;
|
||||||
|
var_to_display(p, &info->var, info);
|
||||||
|
cols = info->var.xres / vc->vc_font.width;
|
||||||
|
rows = info->var.yres / vc->vc_font.height;
|
||||||
|
vc_resize(vc, cols, rows);
|
||||||
|
|
||||||
|
if (CON_IS_VISIBLE(vc)) {
|
||||||
|
updatescrollmode(p, info, vc);
|
||||||
|
scrollback_max = 0;
|
||||||
|
scrollback_current = 0;
|
||||||
|
update_var(vc->vc_num, info);
|
||||||
|
fbcon_set_palette(vc, color_table);
|
||||||
|
update_screen(vc);
|
||||||
|
if (softback_buf) {
|
||||||
|
int l = fbcon_softback_size / vc->vc_size_row;
|
||||||
|
if (l > 5)
|
||||||
|
softback_end = softback_buf + l * vc->vc_size_row;
|
||||||
|
else {
|
||||||
|
/* Smaller scrollback makes no sense, and 0
|
||||||
|
would screw the operation totally */
|
||||||
|
softback_top = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static int fbcon_mode_deleted(struct fb_info *info,
|
static int fbcon_mode_deleted(struct fb_info *info,
|
||||||
struct fb_videomode *mode)
|
struct fb_videomode *mode)
|
||||||
{
|
{
|
||||||
@@ -2708,6 +2753,9 @@ static int fbcon_event_notify(struct notifier_block *self,
|
|||||||
case FB_EVENT_MODE_CHANGE:
|
case FB_EVENT_MODE_CHANGE:
|
||||||
fbcon_modechanged(info);
|
fbcon_modechanged(info);
|
||||||
break;
|
break;
|
||||||
|
case FB_EVENT_MODE_CHANGE_ALL:
|
||||||
|
fbcon_set_all_vcs(info);
|
||||||
|
break;
|
||||||
case FB_EVENT_MODE_DELETE:
|
case FB_EVENT_MODE_DELETE:
|
||||||
mode = event->data;
|
mode = event->data;
|
||||||
ret = fbcon_mode_deleted(info, mode);
|
ret = fbcon_mode_deleted(info, mode);
|
||||||
|
@@ -684,11 +684,13 @@ fb_set_var(struct fb_info *info, struct fb_var_screeninfo *var)
|
|||||||
|
|
||||||
if (!err && (flags & FBINFO_MISC_USEREVENT)) {
|
if (!err && (flags & FBINFO_MISC_USEREVENT)) {
|
||||||
struct fb_event event;
|
struct fb_event event;
|
||||||
|
int evnt = (var->activate & FB_ACTIVATE_ALL) ?
|
||||||
|
FB_EVENT_MODE_CHANGE_ALL :
|
||||||
|
FB_EVENT_MODE_CHANGE;
|
||||||
|
|
||||||
info->flags &= ~FBINFO_MISC_USEREVENT;
|
info->flags &= ~FBINFO_MISC_USEREVENT;
|
||||||
event.info = info;
|
event.info = info;
|
||||||
notifier_call_chain(&fb_notifier_list,
|
notifier_call_chain(&fb_notifier_list, evnt,
|
||||||
FB_EVENT_MODE_CHANGE,
|
|
||||||
&event);
|
&event);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -495,6 +495,9 @@ struct fb_cursor_user {
|
|||||||
#define FB_EVENT_BLANK 0x08
|
#define FB_EVENT_BLANK 0x08
|
||||||
/* Private modelist is to be replaced */
|
/* Private modelist is to be replaced */
|
||||||
#define FB_EVENT_NEW_MODELIST 0x09
|
#define FB_EVENT_NEW_MODELIST 0x09
|
||||||
|
/* The resolution of the passed in fb_info about to change and
|
||||||
|
all vc's should be changed */
|
||||||
|
#define FB_EVENT_MODE_CHANGE_ALL 0x0A
|
||||||
|
|
||||||
struct fb_event {
|
struct fb_event {
|
||||||
struct fb_info *info;
|
struct fb_info *info;
|
||||||
|
Reference in New Issue
Block a user