@@ -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;