summaryrefslogtreecommitdiff
path: root/drivers/staging/iio/imu/adis16400_trigger.c
diff options
context:
space:
mode:
authorJonathan Cameron <jic23@cam.ac.uk>2011-04-18 11:58:59 (GMT)
committerGreg Kroah-Hartman <gregkh@suse.de>2011-04-26 00:24:32 (GMT)
commitb333a24057e9443ec2db52afe78b4a60dfb79097 (patch)
treeda3ae549482cfe7c2876c198777e12f0b2755fbe /drivers/staging/iio/imu/adis16400_trigger.c
parent9f201bbeb53c963d80e8917839e48ada971fd868 (diff)
downloadlinux-fsl-qoriq-b333a24057e9443ec2db52afe78b4a60dfb79097.tar.xz
staging:iio:adis16400 replace unnecessary event line registration.
Whilst the adis16400 does indeed support events, currently the driver does not. The trigger code should never use that infrastructure. Tested indirectly via the IMU driver merge to follow. Signed-off-by: Jonathan Cameron <jic23@cam.ac.uk> Acked-by: Michael Hennerich <michael.hennerich@analog.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/staging/iio/imu/adis16400_trigger.c')
-rw-r--r--drivers/staging/iio/imu/adis16400_trigger.c47
1 files changed, 20 insertions, 27 deletions
diff --git a/drivers/staging/iio/imu/adis16400_trigger.c b/drivers/staging/iio/imu/adis16400_trigger.c
index 36b5ff5..afa5e74 100644
--- a/drivers/staging/iio/imu/adis16400_trigger.c
+++ b/drivers/staging/iio/imu/adis16400_trigger.c
@@ -15,21 +15,13 @@
/**
* adis16400_data_rdy_trig_poll() the event handler for the data rdy trig
**/
-static int adis16400_data_rdy_trig_poll(struct iio_dev *dev_info,
- int index,
- s64 timestamp,
- int no_test)
+static irqreturn_t adis16400_data_rdy_trig_poll(int irq, void *private)
{
- struct adis16400_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, &adis16400_data_rdy_trig_poll);
-
static IIO_TRIGGER_NAME_ATTR;
static struct attribute *adis16400_trigger_attrs[] = {
@@ -49,22 +41,9 @@ static int adis16400_data_rdy_trigger_set_state(struct iio_trigger *trig,
{
struct adis16400_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 = adis16400_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);
- /* possible quirk with handler currently worked around
- by ensuring the work queue is empty */
- flush_scheduled_work();
- } else {
- iio_add_event_to_list(&iio_event_data_rdy_trig,
- &indio_dev->interrupts[0]->ev_list);
- }
- return ret;
+ return adis16400_set_irq(&st->indio_dev->dev, state);
}
/**
@@ -85,12 +64,23 @@ int adis16400_probe_trigger(struct iio_dev *indio_dev)
struct adis16400_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,
+ adis16400_data_rdy_trig_poll,
+ IRQF_TRIGGER_RISING,
+ "adis16400",
+ st->trig);
+ if (ret)
+ goto error_free_trig;
st->trig->name = kasprintf(GFP_KERNEL,
"adis16400-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;
@@ -109,9 +99,11 @@ int adis16400_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;
}
@@ -121,5 +113,6 @@ void adis16400_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);
}