staging: media: lirc: use new parport device model
authorSudip Mukherjee <sudip.mukherjee@codethink.co.uk>
Sat, 21 Jan 2017 00:55:54 +0000 (00:55 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 23 Jan 2017 08:59:46 +0000 (09:59 +0100)
Modify lirc_parallel driver to use the new parallel port device model.

Signed-off-by: Sudip Mukherjee <sudip.mukherjee@codethink.co.uk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/media/lirc/lirc_parallel.c

index bfb76a45bfbfccdf9c8a77f664e3d293384274ad..0a43bac2b1627ff0cb661ce3c83bdfc133448dcf 100644 (file)
@@ -626,41 +626,26 @@ static void kf(void *handle)
 
 /*** module initialization and cleanup ***/
 
-static int __init lirc_parallel_init(void)
+static void lirc_parallel_attach(struct parport *port)
 {
-       int result;
-
-       result = platform_driver_register(&lirc_parallel_driver);
-       if (result) {
-               pr_notice("platform_driver_register returned %d\n", result);
-               return result;
-       }
+       struct pardev_cb lirc_parallel_cb;
 
-       lirc_parallel_dev = platform_device_alloc(LIRC_DRIVER_NAME, 0);
-       if (!lirc_parallel_dev) {
-               result = -ENOMEM;
-               goto exit_driver_unregister;
-       }
+       if (port->base != io)
+               return;
 
-       result = platform_device_add(lirc_parallel_dev);
-       if (result)
-               goto exit_device_put;
+       pport = port;
+       memset(&lirc_parallel_cb, 0, sizeof(lirc_parallel_cb));
+       lirc_parallel_cb.preempt = pf;
+       lirc_parallel_cb.wakeup = kf;
+       lirc_parallel_cb.irq_func = lirc_lirc_irq_handler;
 
-       pport = parport_find_base(io);
-       if (!pport) {
-               pr_notice("no port at %x found\n", io);
-               result = -ENXIO;
-               goto exit_device_del;
-       }
-       ppdevice = parport_register_device(pport, LIRC_DRIVER_NAME,
-                                          pf, kf, lirc_lirc_irq_handler, 0,
-                                          NULL);
-       parport_put_port(pport);
+       ppdevice = parport_register_dev_model(port, LIRC_DRIVER_NAME,
+                                             &lirc_parallel_cb, 0);
        if (!ppdevice) {
                pr_notice("parport_register_device() failed\n");
-               result = -ENXIO;
-               goto exit_device_del;
+               return;
        }
+
        if (parport_claim(ppdevice) != 0)
                goto skip_init;
        is_claimed = 1;
@@ -688,18 +673,64 @@ static int __init lirc_parallel_init(void)
 
        is_claimed = 0;
        parport_release(ppdevice);
+
  skip_init:
+       return;
+}
+
+static void lirc_parallel_detach(struct parport *port)
+{
+       if (port->base != io)
+               return;
+
+       parport_unregister_device(ppdevice);
+}
+
+static struct parport_driver lirc_parport_driver = {
+       .name = LIRC_DRIVER_NAME,
+       .match_port = lirc_parallel_attach,
+       .detach = lirc_parallel_detach,
+       .devmodel = true,
+};
+
+static int __init lirc_parallel_init(void)
+{
+       int result;
+
+       result = platform_driver_register(&lirc_parallel_driver);
+       if (result) {
+               pr_notice("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;
+
+       result = parport_register_driver(&lirc_parport_driver);
+       if (result) {
+               pr_notice("parport_register_driver returned %d\n", result);
+               goto exit_device_del;
+       }
+
        driver.dev = &lirc_parallel_dev->dev;
        driver.minor = lirc_register_driver(&driver);
        if (driver.minor < 0) {
                pr_notice("register_chrdev() failed\n");
-               parport_unregister_device(ppdevice);
                result = -EIO;
-               goto exit_device_del;
+               goto exit_unregister;
        }
        pr_info("installed using port 0x%04x irq %d\n", io, irq);
        return 0;
 
+exit_unregister:
+       parport_unregister_driver(&lirc_parport_driver);
 exit_device_del:
        platform_device_del(lirc_parallel_dev);
 exit_device_put:
@@ -711,9 +742,9 @@ exit_driver_unregister:
 
 static void __exit lirc_parallel_exit(void)
 {
-       parport_unregister_device(ppdevice);
        lirc_unregister_driver(driver.minor);
 
+       parport_unregister_driver(&lirc_parport_driver);
        platform_device_unregister(lirc_parallel_dev);
        platform_driver_unregister(&lirc_parallel_driver);
 }