staging:iio: Push interrupt setup down into the drivers for event lines.
authorJonathan Cameron <jic23@cam.ac.uk>
Wed, 18 May 2011 13:40:59 +0000 (14:40 +0100)
committerGreg Kroah-Hartman <gregkh@suse.de>
Thu, 19 May 2011 23:06:12 +0000 (16:06 -0700)
It is much easier to do in driver, and the core does not add much.
Note all drivers will have to be updated with this patch.
None currently are.

Signed-off-by: Jonathan Cameron <jic23@cam.ac.uk>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/staging/iio/iio.h
drivers/staging/iio/industrialio-core.c

index 7e44639148680866fd9093153f20495c32fc5811..cd5ac59c4c239d02b46e419cd7638022a9a9520a 100644 (file)
@@ -12,6 +12,7 @@
 
 #include <linux/device.h>
 #include <linux/cdev.h>
+#include <linux/irq.h>
 #include "sysfs.h"
 #include "chrdev.h"
 
@@ -376,6 +377,8 @@ void iio_unregister_interrupt_line(struct iio_dev *dev_info,
                                   int line_number);
 
 
+/* temporarily exported to allow moving of interrupt requesting into drivers */
+irqreturn_t iio_interrupt_handler(int irq, void *_int_info);
 
 /**
  * iio_push_event() - try to add event to the list for userspace reading
index 9ddd6a639ac40516fb6343857d44938c435d02bd..136ff04d647ad2877f72d8b6c9c5d642960d24fa 100644 (file)
@@ -134,7 +134,7 @@ int iio_push_event(struct iio_dev *dev_info,
 EXPORT_SYMBOL(iio_push_event);
 
 /* Generic interrupt line interrupt handler */
-static irqreturn_t iio_interrupt_handler(int irq, void *_int_info)
+irqreturn_t iio_interrupt_handler(int irq, void *_int_info)
 {
        struct iio_interrupt *int_info = _int_info;
        struct iio_dev *dev_info = int_info->dev_info;
@@ -157,6 +157,7 @@ static irqreturn_t iio_interrupt_handler(int irq, void *_int_info)
 
        return IRQ_HANDLED;
 }
+EXPORT_SYMBOL(iio_interrupt_handler);
 
 static struct iio_interrupt *iio_allocate_interrupt(void)
 {
@@ -175,7 +176,7 @@ int iio_register_interrupt_line(unsigned int irq,
                                unsigned long type,
                                const char *name)
 {
-       int ret;
+       int ret = 0;
 
        dev_info->interrupts[line_number] = iio_allocate_interrupt();
        if (dev_info->interrupts[line_number] == NULL) {
@@ -186,16 +187,6 @@ int iio_register_interrupt_line(unsigned int irq,
        dev_info->interrupts[line_number]->irq = irq;
        dev_info->interrupts[line_number]->dev_info = dev_info;
 
-       /* Possibly only request on demand?
-        * Can see this may complicate the handling of interrupts.
-        * However, with this approach we might end up handling lots of
-        * events no-one cares about.*/
-       ret = request_irq(irq,
-                         &iio_interrupt_handler,
-                         type,
-                         name,
-                         dev_info->interrupts[line_number]);
-
 error_ret:
        return ret;
 }
@@ -215,8 +206,6 @@ void iio_unregister_interrupt_line(struct iio_dev *dev_info, int line_number)
 {
        /* make sure the interrupt handlers are all done */
        flush_scheduled_work();
-       free_irq(dev_info->interrupts[line_number]->irq,
-                dev_info->interrupts[line_number]);
        kfree(dev_info->interrupts[line_number]);
 }
 EXPORT_SYMBOL(iio_unregister_interrupt_line);