staging:iio: Add common ADIS library
[deliverable/linux.git] / drivers / staging / iio / imu / adis_trigger.c
CommitLineData
ccd2b52f
LPC
1/*
2 * Common library for ADIS16XXX devices
3 *
4 * Copyright 2012 Analog Devices Inc.
5 * Author: Lars-Peter Clausen <lars@metafoo.de>
6 *
7 * Licensed under the GPL-2 or later.
8 */
9
10#include <linux/interrupt.h>
11#include <linux/kernel.h>
12#include <linux/spi/spi.h>
13#include <linux/export.h>
14
15#include <linux/iio/iio.h>
16#include <linux/iio/trigger.h>
17
18#include "adis.h"
19
20static int adis_data_rdy_trigger_set_state(struct iio_trigger *trig,
21 bool state)
22{
23 struct adis *adis = trig->private_data;
24
25 return adis_enable_irq(adis, state);
26}
27
28static const struct iio_trigger_ops adis_trigger_ops = {
29 .owner = THIS_MODULE,
30 .set_trigger_state = &adis_data_rdy_trigger_set_state,
31};
32
33/**
34 * adis_probe_trigger() - Sets up trigger for a adis device
35 * @adis: The adis device
36 * @indio_dev: The IIO device
37 *
38 * Returns 0 on success or a negative error code
39 *
40 * adis_remove_trigger() should be used to free the trigger.
41 */
42int adis_probe_trigger(struct adis *adis, struct iio_dev *indio_dev)
43{
44 int ret;
45
46 adis->trig = iio_trigger_alloc("%s-dev%d", indio_dev->name,
47 indio_dev->id);
48 if (adis->trig == NULL)
49 return -ENOMEM;
50
51 ret = request_irq(adis->spi->irq,
52 &iio_trigger_generic_data_rdy_poll,
53 IRQF_TRIGGER_RISING,
54 indio_dev->name,
55 adis->trig);
56 if (ret)
57 goto error_free_trig;
58
59 adis->trig->dev.parent = &adis->spi->dev;
60 adis->trig->ops = &adis_trigger_ops;
61 adis->trig->private_data = adis;
62 ret = iio_trigger_register(adis->trig);
63
64 indio_dev->trig = adis->trig;
65 if (ret)
66 goto error_free_irq;
67
68 return 0;
69
70error_free_irq:
71 free_irq(adis->spi->irq, adis->trig);
72error_free_trig:
73 iio_trigger_free(adis->trig);
74 return ret;
75}
76EXPORT_SYMBOL_GPL(adis_probe_trigger);
77
78/**
79 * adis_remove_trigger() - Remove trigger for a adis devices
80 * @adis: The adis device
81 *
82 * Removes the trigger previously registered with adis_probe_trigger().
83 */
84void adis_remove_trigger(struct adis *adis)
85{
86 iio_trigger_unregister(adis->trig);
87 free_irq(adis->spi->irq, adis->trig);
88 iio_trigger_free(adis->trig);
89}
90EXPORT_SYMBOL_GPL(adis_remove_trigger);
This page took 0.032345 seconds and 5 git commands to generate.