adis_trigger.c 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  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. #include <linux/interrupt.h>
  10. #include <linux/kernel.h>
  11. #include <linux/spi/spi.h>
  12. #include <linux/export.h>
  13. #include <linux/iio/iio.h>
  14. #include <linux/iio/trigger.h>
  15. #include <linux/iio/imu/adis.h>
  16. static int adis_data_rdy_trigger_set_state(struct iio_trigger *trig,
  17. bool state)
  18. {
  19. struct adis *adis = iio_trigger_get_drvdata(trig);
  20. return adis_enable_irq(adis, state);
  21. }
  22. static const struct iio_trigger_ops adis_trigger_ops = {
  23. .owner = THIS_MODULE,
  24. .set_trigger_state = &adis_data_rdy_trigger_set_state,
  25. };
  26. /**
  27. * adis_probe_trigger() - Sets up trigger for a adis device
  28. * @adis: The adis device
  29. * @indio_dev: The IIO device
  30. *
  31. * Returns 0 on success or a negative error code
  32. *
  33. * adis_remove_trigger() should be used to free the trigger.
  34. */
  35. int adis_probe_trigger(struct adis *adis, struct iio_dev *indio_dev)
  36. {
  37. int ret;
  38. adis->trig = iio_trigger_alloc("%s-dev%d", indio_dev->name,
  39. indio_dev->id);
  40. if (adis->trig == NULL)
  41. return -ENOMEM;
  42. adis->trig->dev.parent = &adis->spi->dev;
  43. adis->trig->ops = &adis_trigger_ops;
  44. iio_trigger_set_drvdata(adis->trig, adis);
  45. ret = request_irq(adis->spi->irq,
  46. &iio_trigger_generic_data_rdy_poll,
  47. IRQF_TRIGGER_RISING,
  48. indio_dev->name,
  49. adis->trig);
  50. if (ret)
  51. goto error_free_trig;
  52. ret = iio_trigger_register(adis->trig);
  53. indio_dev->trig = iio_trigger_get(adis->trig);
  54. if (ret)
  55. goto error_free_irq;
  56. return 0;
  57. error_free_irq:
  58. free_irq(adis->spi->irq, adis->trig);
  59. error_free_trig:
  60. iio_trigger_free(adis->trig);
  61. return ret;
  62. }
  63. EXPORT_SYMBOL_GPL(adis_probe_trigger);
  64. /**
  65. * adis_remove_trigger() - Remove trigger for a adis devices
  66. * @adis: The adis device
  67. *
  68. * Removes the trigger previously registered with adis_probe_trigger().
  69. */
  70. void adis_remove_trigger(struct adis *adis)
  71. {
  72. iio_trigger_unregister(adis->trig);
  73. free_irq(adis->spi->irq, adis->trig);
  74. iio_trigger_free(adis->trig);
  75. }
  76. EXPORT_SYMBOL_GPL(adis_remove_trigger);