struct fb_event *evdata = data;
 
        /* If we aren't interested in this event, skip it immediately ... */
-       if (event != FB_EVENT_BLANK)
+       switch (event) {
+       case FB_EVENT_BLANK:
+       case FB_EVENT_MODE_CHANGE:
+       case FB_EVENT_MODE_CHANGE_ALL:
+               break;
+       default:
                return 0;
+       }
 
        ld = container_of(self, struct lcd_device, fb_notif);
+       if (!ld->ops)
+               return 0;
+
        mutex_lock(&ld->ops_lock);
-       if (ld->ops)
-               if (!ld->ops->check_fb || ld->ops->check_fb(ld, evdata->info))
+       if (!ld->ops->check_fb || ld->ops->check_fb(ld, evdata->info)) {
+               if (event == FB_EVENT_BLANK)
                        ld->ops->set_power(ld, *(int *)evdata->data);
+               else
+                       ld->ops->set_mode(ld, evdata->data);
+       }
        mutex_unlock(&ld->ops_lock);
        return 0;
 }
 
 #include <linux/device.h>
 #include <linux/mutex.h>
 #include <linux/notifier.h>
+#include <linux/fb.h>
 
 /* Notes on locking:
  *
        int (*get_contrast)(struct lcd_device *);
        /* Set LCD panel contrast */
         int (*set_contrast)(struct lcd_device *, int contrast);
+       /* Set LCD panel mode (resolutions ...) */
+       int (*set_mode)(struct lcd_device *, struct fb_videomode *);
        /* Check if given framebuffer device is the one LCD is bound to;
           return 0 if not, !=0 if it is. If NULL, lcd always matches the fb. */
        int (*check_fb)(struct lcd_device *, struct fb_info *);