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