i915's fbdev contains code for restoring the client's framebuffer. It
is specific to i195 and cannot be ported to the common fbdev client.
Introduce the callback struct drm_fb_helper.fb_restore and implement
it for i915. The fbdev helpers invoke the callback after restoring the
fbdev client.
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20241212170913.185939-6-tzimmermann@suse.de
Signed-off-by: Maarten Lankhorst <dev@lankhorst.se>
        if (do_delayed)
                drm_fb_helper_hotplug_event(fb_helper);
 
+       if (fb_helper->funcs->fb_restore)
+               fb_helper->funcs->fb_restore(fb_helper);
+
        return ret;
 }
 
 
        return 0;
 }
 
+static void intelfb_restore(struct drm_fb_helper *fb_helper)
+{
+       struct intel_fbdev *ifbdev = to_intel_fbdev(fb_helper);
+
+       intel_fbdev_invalidate(ifbdev);
+}
+
 static const struct drm_fb_helper_funcs intel_fb_helper_funcs = {
        .fb_probe = intelfb_create,
        .fb_dirty = intelfb_dirty,
+       .fb_restore = intelfb_restore,
 };
 
 /*
        if (ret)
                return ret;
 
-       intel_fbdev_invalidate(ifbdev);
-
        return 0;
 }
 
 
         * 0 on success, or an error code otherwise.
         */
        int (*fb_dirty)(struct drm_fb_helper *helper, struct drm_clip_rect *clip);
+
+       /**
+        * @fb_restore:
+        *
+        * Driver callback to restore internal fbdev state. If set, fbdev
+        * emulation will invoke this callback after restoring the display
+        * mode.
+        *
+        * Only for i915. Do not use in new code.
+        *
+        * TODO: Fix i915 to not require this callback.
+        */
+       void (*fb_restore)(struct drm_fb_helper *helper);
 };
 
 /**