]> Pileus Git - ~andy/linux/blobdiff - drivers/staging/iio/accel/adis16201_trigger.c
staging:iio: lis3l02dq - separate entirely interrupt handling for thesholds from...
[~andy/linux] / drivers / staging / iio / accel / adis16201_trigger.c
index 8a9cea1986e7298e26f51d771df93f486c867259..8a48bddc702dd81543eea9a1ef2af269a70a1f37 100644 (file)
 /**
  * adis16201_data_rdy_trig_poll() the event handler for the data rdy trig
  **/
-static int adis16201_data_rdy_trig_poll(struct iio_dev *dev_info,
-                                      int index,
-                                      s64 timestamp,
-                                      int no_test)
+static irqreturn_t adis16201_data_rdy_trig_poll(int irq, void *private)
 {
-       struct adis16201_state *st = iio_dev_get_devdata(dev_info);
-       struct iio_trigger *trig = st->trig;
-
-       iio_trigger_poll(trig, timestamp);
-
+       disable_irq_nosync(irq);
+       iio_trigger_poll(private, iio_get_time_ns());
        return IRQ_HANDLED;
 }
 
-IIO_EVENT_SH(data_rdy_trig, &adis16201_data_rdy_trig_poll);
-
 static DEVICE_ATTR(name, S_IRUGO, iio_trigger_read_name, NULL);
 
 static struct attribute *adis16201_trigger_attrs[] = {
@@ -49,20 +41,9 @@ static int adis16201_data_rdy_trigger_set_state(struct iio_trigger *trig,
 {
        struct adis16201_state *st = trig->private_data;
        struct iio_dev *indio_dev = st->indio_dev;
-       int ret = 0;
 
        dev_dbg(&indio_dev->dev, "%s (%d)\n", __func__, state);
-       ret = adis16201_set_irq(&st->indio_dev->dev, state);
-       if (state == false) {
-               iio_remove_event_from_list(&iio_event_data_rdy_trig,
-                                          &indio_dev->interrupts[0]
-                                          ->ev_list);
-               flush_scheduled_work();
-       } else {
-               iio_add_event_to_list(&iio_event_data_rdy_trig,
-                                     &indio_dev->interrupts[0]->ev_list);
-       }
-       return ret;
+       return adis16201_set_irq(&st->indio_dev->dev, state);
 }
 
 /**
@@ -82,12 +63,23 @@ int adis16201_probe_trigger(struct iio_dev *indio_dev)
        struct adis16201_state *st = indio_dev->dev_data;
 
        st->trig = iio_allocate_trigger();
+       if (st->trig == NULL) {
+               ret = -ENOMEM;
+               goto error_ret;
+       }
+       ret = request_irq(st->us->irq,
+                         adis16201_data_rdy_trig_poll,
+                         IRQF_TRIGGER_RISING,
+                         "adis16201",
+                         st->trig);
+       if (ret)
+               goto error_free_trig;
        st->trig->name = kasprintf(GFP_KERNEL,
                                "adis16201-dev%d",
                                indio_dev->id);
        if (!st->trig->name) {
                ret = -ENOMEM;
-               goto error_free_trig;
+               goto error_free_irq;
        }
        st->trig->dev.parent = &st->us->dev;
        st->trig->owner = THIS_MODULE;
@@ -106,9 +98,11 @@ int adis16201_probe_trigger(struct iio_dev *indio_dev)
 
 error_free_trig_name:
        kfree(st->trig->name);
+error_free_irq:
+       free_irq(st->us->irq, st->trig);
 error_free_trig:
        iio_free_trigger(st->trig);
-
+error_ret:
        return ret;
 }
 
@@ -118,5 +112,6 @@ void adis16201_remove_trigger(struct iio_dev *indio_dev)
 
        iio_trigger_unregister(state->trig);
        kfree(state->trig->name);
+       free_irq(state->us->irq, state->trig);
        iio_free_trigger(state->trig);
 }