staging: lirc: fix for "lirc_dev: lirc_register_driver: driver pointer must be not...
authorThomas Viehweger <patchesThomas.Vie@web.de>
Wed, 2 Mar 2011 22:00:20 +0000 (23:00 +0100)
committerGreg Kroah-Hartman <gregkh@suse.de>
Mon, 7 Mar 2011 21:23:26 +0000 (13:23 -0800)
Unable to load the module lirc_parallel without the attached patch.

Signed-off-by: Thomas Viehweger <patchesThomas.Vie@web.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/staging/lirc/lirc_parallel.c

index 2f668a8a0c41ae2a0818d6c2778d870618193faf..832522c290cbd068250ea0cbf7559a8393f3adea 100644 (file)
@@ -42,6 +42,7 @@
 
 #include <linux/poll.h>
 #include <linux/parport.h>
+#include <linux/platform_device.h>
 
 #include <media/lirc.h>
 #include <media/lirc_dev.h>
@@ -580,6 +581,40 @@ static struct lirc_driver driver = {
        .owner          = THIS_MODULE,
 };
 
+static struct platform_device *lirc_parallel_dev;
+
+static int __devinit lirc_parallel_probe(struct platform_device *dev)
+{
+       return 0;
+}
+
+static int __devexit lirc_parallel_remove(struct platform_device *dev)
+{
+       return 0;
+}
+
+static int lirc_parallel_suspend(struct platform_device *dev,
+                                 pm_message_t state)
+{
+       return 0;
+}
+
+static int lirc_parallel_resume(struct platform_device *dev)
+{
+       return 0;
+}
+
+static struct platform_driver lirc_parallel_driver = {
+       .probe  = lirc_parallel_probe,
+       .remove = __devexit_p(lirc_parallel_remove),
+       .suspend        = lirc_parallel_suspend,
+       .resume = lirc_parallel_resume,
+       .driver = {
+               .name   = LIRC_DRIVER_NAME,
+               .owner  = THIS_MODULE,
+       },
+};
+
 static int pf(void *handle);
 static void kf(void *handle);
 
@@ -608,11 +643,30 @@ static void kf(void *handle)
 
 static int __init lirc_parallel_init(void)
 {
+       int result;
+
+       result = platform_driver_register(&lirc_parallel_driver);
+       if (result) {
+               printk("platform_driver_register returned %d\n", result);
+               return result;
+       }
+
+       lirc_parallel_dev = platform_device_alloc(LIRC_DRIVER_NAME, 0);
+       if (!lirc_parallel_dev) {
+               result = -ENOMEM;
+               goto exit_driver_unregister;
+       }
+
+       result = platform_device_add(lirc_parallel_dev);
+       if (result)
+               goto exit_device_put;
+
        pport = parport_find_base(io);
        if (pport == NULL) {
                printk(KERN_NOTICE "%s: no port at %x found\n",
                       LIRC_DRIVER_NAME, io);
-               return -ENXIO;
+               result = -ENXIO;
+               goto exit_device_put;
        }
        ppdevice = parport_register_device(pport, LIRC_DRIVER_NAME,
                                           pf, kf, irq_handler, 0, NULL);
@@ -620,7 +674,8 @@ static int __init lirc_parallel_init(void)
        if (ppdevice == NULL) {
                printk(KERN_NOTICE "%s: parport_register_device() failed\n",
                       LIRC_DRIVER_NAME);
-               return -ENXIO;
+               result = -ENXIO;
+               goto exit_device_put;
        }
        if (parport_claim(ppdevice) != 0)
                goto skip_init;
@@ -638,7 +693,8 @@ static int __init lirc_parallel_init(void)
                is_claimed = 0;
                parport_release(pport);
                parport_unregister_device(ppdevice);
-               return -EIO;
+               result = -EIO;
+               goto exit_device_put;
        }
 
 #endif
@@ -649,16 +705,24 @@ static int __init lirc_parallel_init(void)
        is_claimed = 0;
        parport_release(ppdevice);
  skip_init:
+       driver.dev = &lirc_parallel_dev->dev;
        driver.minor = lirc_register_driver(&driver);
        if (driver.minor < 0) {
                printk(KERN_NOTICE "%s: register_chrdev() failed\n",
                       LIRC_DRIVER_NAME);
                parport_unregister_device(ppdevice);
-               return -EIO;
+               result = -EIO;
+               goto exit_device_put;
        }
        printk(KERN_INFO "%s: installed using port 0x%04x irq %d\n",
               LIRC_DRIVER_NAME, io, irq);
        return 0;
+
+exit_device_put:
+       platform_device_put(lirc_parallel_dev);
+exit_driver_unregister:
+       platform_driver_unregister(&lirc_parallel_driver);
+       return result;
 }
 
 static void __exit lirc_parallel_exit(void)