diff options
Diffstat (limited to 'drivers/staging/lirc')
-rw-r--r-- | drivers/staging/lirc/lirc_parallel.c | 74 |
1 files changed, 69 insertions, 5 deletions
diff --git a/drivers/staging/lirc/lirc_parallel.c b/drivers/staging/lirc/lirc_parallel.c index 3a9c098..832522c 100644 --- a/drivers/staging/lirc/lirc_parallel.c +++ b/drivers/staging/lirc/lirc_parallel.c @@ -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> @@ -295,7 +296,7 @@ static void irq_handler(void *blah) } while (lirc_get_signal()); if (signal != 0) { - /* ajust value to usecs */ + /* adjust value to usecs */ __u64 helper; helper = ((__u64) signal)*1000000; @@ -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) |