Commit e6c6fea5 authored by Thomas Zimmermann's avatar Thomas Zimmermann Committed by Lee Jones

backlight: Match backlight device against struct fb_info.bl_dev

Framebuffer drivers for devices with dedicated backlight are supposed
to set struct fb_info.bl_dev to the backlight's respective device. Use
the value to match backlight and framebuffer in the backlight core code.

The code first tests against struct backlight_ops.check_ops. If this
test succeeds, it performs the test against fbdev. So backlight drivers
can override the later test as before.

Fbdev's backlight support depends on CONFIG_FB_BACKLIGHT. To avoid
ifdef in the code, the new helper fb_bl_device() returns the backlight
device, or NULL if the config option has been disabled. The test in
the backlight code will then do nothing.

v4:
	* declare empty fb_bl_device() as static inline
	* export fb_bl_device()
v3:
	* hide ifdef in fb_bl_device() (Lee)
	* no if-else blocks (Andy)
Signed-off-by: default avatarThomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: default avatarDaniel Thompson <daniel.thompson@linaro.org>
Reviewed-by: default avatarJavier Martinez Canillas <javierm@redhat.com>
Link: https://lore.kernel.org/r/20240305162425.23845-2-tzimmermann@suse.deSigned-off-by: default avatarLee Jones <lee@kernel.org>
parent 4cece764
...@@ -98,7 +98,9 @@ static int fb_notifier_callback(struct notifier_block *self, ...@@ -98,7 +98,9 @@ static int fb_notifier_callback(struct notifier_block *self,
{ {
struct backlight_device *bd; struct backlight_device *bd;
struct fb_event *evdata = data; struct fb_event *evdata = data;
int node = evdata->info->node; struct fb_info *info = evdata->info;
struct backlight_device *fb_bd = fb_bl_device(info);
int node = info->node;
int fb_blank = 0; int fb_blank = 0;
/* If we aren't interested in this event, skip it immediately ... */ /* If we aren't interested in this event, skip it immediately ... */
...@@ -110,7 +112,9 @@ static int fb_notifier_callback(struct notifier_block *self, ...@@ -110,7 +112,9 @@ static int fb_notifier_callback(struct notifier_block *self,
if (!bd->ops) if (!bd->ops)
goto out; goto out;
if (bd->ops->check_fb && !bd->ops->check_fb(bd, evdata->info)) if (bd->ops->check_fb && !bd->ops->check_fb(bd, info))
goto out;
if (fb_bd && fb_bd != bd)
goto out; goto out;
fb_blank = *(int *)evdata->data; fb_blank = *(int *)evdata->data;
......
...@@ -30,4 +30,10 @@ void fb_bl_default_curve(struct fb_info *fb_info, u8 off, u8 min, u8 max) ...@@ -30,4 +30,10 @@ void fb_bl_default_curve(struct fb_info *fb_info, u8 off, u8 min, u8 max)
mutex_unlock(&fb_info->bl_curve_mutex); mutex_unlock(&fb_info->bl_curve_mutex);
} }
EXPORT_SYMBOL_GPL(fb_bl_default_curve); EXPORT_SYMBOL_GPL(fb_bl_default_curve);
struct backlight_device *fb_bl_device(struct fb_info *info)
{
return info->bl_dev;
}
EXPORT_SYMBOL(fb_bl_device);
#endif #endif
...@@ -738,6 +738,15 @@ extern struct fb_info *framebuffer_alloc(size_t size, struct device *dev); ...@@ -738,6 +738,15 @@ extern struct fb_info *framebuffer_alloc(size_t size, struct device *dev);
extern void framebuffer_release(struct fb_info *info); extern void framebuffer_release(struct fb_info *info);
extern void fb_bl_default_curve(struct fb_info *fb_info, u8 off, u8 min, u8 max); extern void fb_bl_default_curve(struct fb_info *fb_info, u8 off, u8 min, u8 max);
#if IS_ENABLED(CONFIG_FB_BACKLIGHT)
struct backlight_device *fb_bl_device(struct fb_info *info);
#else
static inline struct backlight_device *fb_bl_device(struct fb_info *info)
{
return NULL;
}
#endif
/* fbmon.c */ /* fbmon.c */
#define FB_MAXTIMINGS 0 #define FB_MAXTIMINGS 0
#define FB_VSYNCTIMINGS 1 #define FB_VSYNCTIMINGS 1
......
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