Commit 9e146700 authored by Daniel Vetter's avatar Daniel Vetter

fbcon: replace FB_EVENT_MODE_CHANGE/_ALL with direct calls

Create a new wrapper function for this, feels like there's some
refactoring room here between the two modes.

v2: backlight notifier is also interested in the mode change event,
it calls lcd->set_mode, of which there are 3 implementations. Thanks
to Maarten for spotting this. So we keep that. We can ditch the differentiation
between mode change and all mode changes (because backlight notifier
doesn't care), and we can drop the FBINFO_MISC_USEREVENT stuff too,
because that's just to prevent recursion between fbmem.c and fbcon.c.

While at it flatten the control flow a bit.

v3: Need to add a static inline to the dummy function.

v4: Add missing #include <fbcon.h> to sh_mob (Sam).

Cc: Sam Ravnborg <sam@ravnborg.org>
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@intel.com>
Reviewed-by: default avatarSam Ravnborg <sam@ravnborg.org>
Reviewed-by: default avatarMaarten Lankhorst <maarten.lankhorst@linux.intel.com>
Acked-by: default avatarDaniel Thompson <daniel.thompson@linaro.org>
Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Cc: Lee Jones <lee.jones@linaro.org>
Cc: Daniel Thompson <daniel.thompson@linaro.org>
Cc: Jingoo Han <jingoohan1@gmail.com>
Cc: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
Cc: Hans de Goede <hdegoede@redhat.com>
Cc: Yisheng Xie <ysxie@foxmail.com>
Cc: "Michał Mirosław" <mirq-linux@rere.qmqm.pl>
Cc: Peter Rosin <peda@axentia.se>
Cc: Mikulas Patocka <mpatocka@redhat.com>
Cc: linux-fbdev@vger.kernel.org
Link: https://patchwork.freedesktop.org/patch/msgid/20190528090304.9388-29-daniel.vetter@ffwll.ch
parent c428f35a
...@@ -34,7 +34,6 @@ static int fb_notifier_callback(struct notifier_block *self, ...@@ -34,7 +34,6 @@ static int fb_notifier_callback(struct notifier_block *self,
switch (event) { switch (event) {
case FB_EVENT_BLANK: case FB_EVENT_BLANK:
case FB_EVENT_MODE_CHANGE: case FB_EVENT_MODE_CHANGE:
case FB_EVENT_MODE_CHANGE_ALL:
case FB_EARLY_EVENT_BLANK: case FB_EARLY_EVENT_BLANK:
case FB_R_EARLY_EVENT_BLANK: case FB_R_EARLY_EVENT_BLANK:
break; break;
......
...@@ -3009,6 +3009,15 @@ static void fbcon_set_all_vcs(struct fb_info *info) ...@@ -3009,6 +3009,15 @@ static void fbcon_set_all_vcs(struct fb_info *info)
fbcon_modechanged(info); fbcon_modechanged(info);
} }
void fbcon_update_vcs(struct fb_info *info, bool all)
{
if (all)
fbcon_set_all_vcs(info);
else
fbcon_modechanged(info);
}
int fbcon_mode_deleted(struct fb_info *info, int fbcon_mode_deleted(struct fb_info *info,
struct fb_videomode *mode) struct fb_videomode *mode)
{ {
...@@ -3318,12 +3327,6 @@ static int fbcon_event_notify(struct notifier_block *self, ...@@ -3318,12 +3327,6 @@ static int fbcon_event_notify(struct notifier_block *self,
int idx, ret = 0; int idx, ret = 0;
switch(action) { switch(action) {
case FB_EVENT_MODE_CHANGE:
fbcon_modechanged(info);
break;
case FB_EVENT_MODE_CHANGE_ALL:
fbcon_set_all_vcs(info);
break;
case FB_EVENT_SET_CONSOLE_MAP: case FB_EVENT_SET_CONSOLE_MAP:
/* called with console lock held */ /* called with console lock held */
con2fb = event->data; con2fb = event->data;
......
...@@ -957,6 +957,7 @@ fb_set_var(struct fb_info *info, struct fb_var_screeninfo *var) ...@@ -957,6 +957,7 @@ fb_set_var(struct fb_info *info, struct fb_var_screeninfo *var)
u32 activate; u32 activate;
struct fb_var_screeninfo old_var; struct fb_var_screeninfo old_var;
struct fb_videomode mode; struct fb_videomode mode;
struct fb_event event;
if (var->activate & FB_ACTIVATE_INV_MODE) { if (var->activate & FB_ACTIVATE_INV_MODE) {
struct fb_videomode mode1, mode2; struct fb_videomode mode1, mode2;
...@@ -1039,19 +1040,17 @@ fb_set_var(struct fb_info *info, struct fb_var_screeninfo *var) ...@@ -1039,19 +1040,17 @@ fb_set_var(struct fb_info *info, struct fb_var_screeninfo *var)
!list_empty(&info->modelist)) !list_empty(&info->modelist))
ret = fb_add_videomode(&mode, &info->modelist); ret = fb_add_videomode(&mode, &info->modelist);
if (!ret && (flags & FBINFO_MISC_USEREVENT)) { if (ret)
struct fb_event event; return ret;
int evnt = (activate & FB_ACTIVATE_ALL) ?
FB_EVENT_MODE_CHANGE_ALL :
FB_EVENT_MODE_CHANGE;
info->flags &= ~FBINFO_MISC_USEREVENT; event.info = info;
event.info = info; event.data = &mode;
event.data = &mode; fb_notifier_call_chain(FB_EVENT_MODE_CHANGE, &event);
fb_notifier_call_chain(evnt, &event);
}
return ret; if (flags & FBINFO_MISC_USEREVENT)
fbcon_update_vcs(info, activate & FB_ACTIVATE_ALL);
return 0;
} }
EXPORT_SYMBOL(fb_set_var); EXPORT_SYMBOL(fb_set_var);
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#include <linux/ctype.h> #include <linux/ctype.h>
#include <linux/dma-mapping.h> #include <linux/dma-mapping.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/fbcon.h>
#include <linux/gpio.h> #include <linux/gpio.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
...@@ -1757,8 +1758,6 @@ static void sh_mobile_fb_reconfig(struct fb_info *info) ...@@ -1757,8 +1758,6 @@ static void sh_mobile_fb_reconfig(struct fb_info *info)
struct sh_mobile_lcdc_chan *ch = info->par; struct sh_mobile_lcdc_chan *ch = info->par;
struct fb_var_screeninfo var; struct fb_var_screeninfo var;
struct fb_videomode mode; struct fb_videomode mode;
struct fb_event event;
int evnt = FB_EVENT_MODE_CHANGE_ALL;
if (ch->use_count > 1 || (ch->use_count == 1 && !info->fbcon_par)) if (ch->use_count > 1 || (ch->use_count == 1 && !info->fbcon_par))
/* More framebuffer users are active */ /* More framebuffer users are active */
...@@ -1780,14 +1779,7 @@ static void sh_mobile_fb_reconfig(struct fb_info *info) ...@@ -1780,14 +1779,7 @@ static void sh_mobile_fb_reconfig(struct fb_info *info)
/* Couldn't reconfigure, hopefully, can continue as before */ /* Couldn't reconfigure, hopefully, can continue as before */
return; return;
/* fbcon_update_vcs(info, true);
* fb_set_var() calls the notifier change internally, only if
* FBINFO_MISC_USEREVENT flag is set. Since we do not want to fake a
* user event, we have to call the chain ourselves.
*/
event.info = info;
event.data = &ch->display.mode;
fb_notifier_call_chain(evnt, &event);
} }
/* /*
......
...@@ -139,8 +139,6 @@ struct fb_cursor_user { ...@@ -139,8 +139,6 @@ struct fb_cursor_user {
#define FB_EVENT_SET_CONSOLE_MAP 0x08 #define FB_EVENT_SET_CONSOLE_MAP 0x08
/* A display blank is requested */ /* A display blank is requested */
#define FB_EVENT_BLANK 0x09 #define FB_EVENT_BLANK 0x09
/* Private modelist is to be replaced */
#define FB_EVENT_MODE_CHANGE_ALL 0x0B
/* CONSOLE-SPECIFIC: remap all consoles to new fb - for vga_switcheroo */ /* CONSOLE-SPECIFIC: remap all consoles to new fb - for vga_switcheroo */
#define FB_EVENT_REMAP_ALL_CONSOLE 0x0F #define FB_EVENT_REMAP_ALL_CONSOLE 0x0F
/* A hardware display blank early change occurred */ /* A hardware display blank early change occurred */
......
...@@ -15,6 +15,7 @@ void fbcon_new_modelist(struct fb_info *info); ...@@ -15,6 +15,7 @@ void fbcon_new_modelist(struct fb_info *info);
void fbcon_get_requirement(struct fb_info *info, void fbcon_get_requirement(struct fb_info *info,
struct fb_blit_caps *caps); struct fb_blit_caps *caps);
void fbcon_fb_blanked(struct fb_info *info, int blank); void fbcon_fb_blanked(struct fb_info *info, int blank);
void fbcon_update_vcs(struct fb_info *info, bool all);
#else #else
static inline void fb_console_init(void) {} static inline void fb_console_init(void) {}
static inline void fb_console_exit(void) {} static inline void fb_console_exit(void) {}
...@@ -29,6 +30,7 @@ static inline void fbcon_new_modelist(struct fb_info *info) {} ...@@ -29,6 +30,7 @@ static inline void fbcon_new_modelist(struct fb_info *info) {}
static inline void fbcon_get_requirement(struct fb_info *info, static inline void fbcon_get_requirement(struct fb_info *info,
struct fb_blit_caps *caps) {} struct fb_blit_caps *caps) {}
static inline void fbcon_fb_blanked(struct fb_info *info, int blank) {} static inline void fbcon_fb_blanked(struct fb_info *info, int blank) {}
static inline void fbcon_update_vcs(struct fb_info *info, bool all) {}
#endif #endif
#endif /* _LINUX_FBCON_H */ #endif /* _LINUX_FBCON_H */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment