aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorThomas Zimmermann <tzimmermann@suse.de>2025-03-21 10:54:00 +0100
committerLee Jones <lee@kernel.org>2025-04-10 10:39:09 +0100
commite98696cea7e289447a5d2328546b947629301616 (patch)
treeb7b2ad56f8ef1e9afbd9bb718ffd49b49f31fe18
parentbacklight: Replace fb events with a dedicated function call (diff)
downloadwireguard-linux-e98696cea7e289447a5d2328546b947629301616.tar.xz
wireguard-linux-e98696cea7e289447a5d2328546b947629301616.zip
backlight: lcd: Move event handling into helpers
Move the handling of display updates to separate helper functions. There is code for handling fbdev blank events and fbdev mode changes. The code currently runs from fbdev event notifiers, which will be replaced. Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de> Reviewed-by: "Daniel Thompson (RISCstar)" <danielt@kernel.org> Acked-by: Simona Vetter <simona.vetter@ffwll.ch> Link: https://lore.kernel.org/r/20250321095517.313713-8-tzimmermann@suse.de Signed-off-by: Lee Jones <lee@kernel.org>
-rw-r--r--drivers/video/backlight/lcd.c38
1 files changed, 28 insertions, 10 deletions
diff --git a/drivers/video/backlight/lcd.c b/drivers/video/backlight/lcd.c
index 3267acf8dc5b..f57ff8bcc2fa 100644
--- a/drivers/video/backlight/lcd.c
+++ b/drivers/video/backlight/lcd.c
@@ -18,6 +18,32 @@
#include <linux/fb.h>
#include <linux/slab.h>
+static void lcd_notify_blank(struct lcd_device *ld, struct device *display_dev,
+ int power)
+{
+ guard(mutex)(&ld->ops_lock);
+
+ if (!ld->ops || !ld->ops->set_power)
+ return;
+ if (ld->ops->controls_device && !ld->ops->controls_device(ld, display_dev))
+ return;
+
+ ld->ops->set_power(ld, power);
+}
+
+static void lcd_notify_mode_change(struct lcd_device *ld, struct device *display_dev,
+ unsigned int width, unsigned int height)
+{
+ guard(mutex)(&ld->ops_lock);
+
+ if (!ld->ops || !ld->ops->set_mode)
+ return;
+ if (ld->ops->controls_device && !ld->ops->controls_device(ld, display_dev))
+ return;
+
+ ld->ops->set_mode(ld, width, height);
+}
+
#if defined(CONFIG_FB) || (defined(CONFIG_FB_MODULE) && \
defined(CONFIG_LCD_CLASS_DEVICE_MODULE))
static int to_lcd_power(int fb_blank)
@@ -50,25 +76,17 @@ static int fb_notifier_callback(struct notifier_block *self,
struct fb_info *info = evdata->info;
struct lcd_device *fb_lcd = fb_lcd_device(info);
- guard(mutex)(&ld->ops_lock);
-
- if (!ld->ops)
- return 0;
- if (ld->ops->controls_device && !ld->ops->controls_device(ld, info->device))
- return 0;
if (fb_lcd && fb_lcd != ld)
return 0;
if (event == FB_EVENT_BLANK) {
int power = to_lcd_power(*(int *)evdata->data);
- if (ld->ops->set_power)
- ld->ops->set_power(ld, power);
+ lcd_notify_blank(ld, info->device, power);
} else {
const struct fb_videomode *videomode = evdata->data;
- if (ld->ops->set_mode)
- ld->ops->set_mode(ld, videomode->xres, videomode->yres);
+ lcd_notify_mode_change(ld, info->device, videomode->xres, videomode->yres);
}
return 0;