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