|
@@ -1665,6 +1665,7 @@ static int do_unregister_framebuffer(struct fb_info *fb_info)
|
|
|
if (ret)
|
|
|
return -EINVAL;
|
|
|
|
|
|
+ unlink_framebuffer(fb_info);
|
|
|
if (fb_info->pixmap.addr &&
|
|
|
(fb_info->pixmap.flags & FB_PIXMAP_DEFAULT))
|
|
|
kfree(fb_info->pixmap.addr);
|
|
@@ -1672,7 +1673,6 @@ static int do_unregister_framebuffer(struct fb_info *fb_info)
|
|
|
registered_fb[i] = NULL;
|
|
|
num_registered_fb--;
|
|
|
fb_cleanup_device(fb_info);
|
|
|
- device_destroy(fb_class, MKDEV(FB_MAJOR, i));
|
|
|
event.info = fb_info;
|
|
|
fb_notifier_call_chain(FB_EVENT_FB_UNREGISTERED, &event);
|
|
|
|
|
@@ -1681,6 +1681,22 @@ static int do_unregister_framebuffer(struct fb_info *fb_info)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+int unlink_framebuffer(struct fb_info *fb_info)
|
|
|
+{
|
|
|
+ int i;
|
|
|
+
|
|
|
+ i = fb_info->node;
|
|
|
+ if (i < 0 || i >= FB_MAX || registered_fb[i] != fb_info)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ if (fb_info->dev) {
|
|
|
+ device_destroy(fb_class, MKDEV(FB_MAJOR, i));
|
|
|
+ fb_info->dev = NULL;
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+EXPORT_SYMBOL(unlink_framebuffer);
|
|
|
+
|
|
|
void remove_conflicting_framebuffers(struct apertures_struct *a,
|
|
|
const char *name, bool primary)
|
|
|
{
|