efifb: Disallow manual bind and unbind
authorAndy Lutomirski <luto@MIT.EDU>
Thu, 26 May 2011 14:13:34 +0000 (10:13 -0400)
committerPaul Mundt <lethal@linux-sh.org>
Thu, 2 Jun 2011 08:18:07 +0000 (17:18 +0900)
Both were buggy: bind would happily scribble over a real graphics
device and unbind wouldn't destroy the framebuffer.  Hotplugging
efifb makes no sense anyway, so just disable it.

As an added benefit, we save some runtime memory.

Signed-off-by: Andy Lutomirski <luto@mit.edu>
Signed-off-by: Peter Jones <pjones@redhat.com>
Signed-off-by: Paul Mundt <lethal@linux-sh.org>
drivers/video/efifb.c

index 8cb31e106b9e04db937ffc05d9b13c585c192711..69c49dfce9cf93aa3c771dbf4af91f0669fea260 100644 (file)
@@ -330,7 +330,7 @@ static int __init efifb_setup(char *options)
        return 0;
 }
 
-static int __devinit efifb_probe(struct platform_device *dev)
+static int __init efifb_probe(struct platform_device *dev)
 {
        struct fb_info *info;
        int err;
@@ -500,7 +500,6 @@ err_release_mem:
 }
 
 static struct platform_driver efifb_driver = {
-       .probe  = efifb_probe,
        .driver = {
                .name   = "efifb",
        },
@@ -531,13 +530,21 @@ static int __init efifb_init(void)
        if (!screen_info.lfb_linelength)
                return -ENODEV;
 
-       ret = platform_driver_register(&efifb_driver);
+       ret = platform_device_register(&efifb_device);
+       if (ret)
+               return ret;
 
-       if (!ret) {
-               ret = platform_device_register(&efifb_device);
-               if (ret)
-                       platform_driver_unregister(&efifb_driver);
+       /*
+        * This is not just an optimization.  We will interfere
+        * with a real driver if we get reprobed, so don't allow
+        * it.
+        */
+       ret = platform_driver_probe(&efifb_driver, efifb_probe);
+       if (ret) {
+               platform_device_unregister(&efifb_driver);
+               return ret;
        }
+
        return ret;
 }
 module_init(efifb_init);