adis_trigger.c 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * Common library for ADIS16XXX devices
  4. *
  5. * Copyright 2012 Analog Devices Inc.
  6. * Author: Lars-Peter Clausen <lars@metafoo.de>
  7. */
  8. #include <linux/interrupt.h>
  9. #include <linux/kernel.h>
  10. #include <linux/spi/spi.h>
  11. #include <linux/export.h>
  12. #include <linux/iio/iio.h>
  13. #include <linux/iio/trigger.h>
  14. #include <linux/iio/imu/adis.h>
  15. static int adis_data_rdy_trigger_set_state(struct iio_trigger *trig,
  16. bool state)
  17. {
  18. struct adis *adis = iio_trigger_get_drvdata(trig);
  19. return adis_enable_irq(adis, state);
  20. }
  21. static const struct iio_trigger_ops adis_trigger_ops = {
  22. .set_trigger_state = &adis_data_rdy_trigger_set_state,
  23. };
  24. static void adis_trigger_setup(struct adis *adis)
  25. {
  26. adis->trig->dev.parent = &adis->spi->dev;
  27. adis->trig->ops = &adis_trigger_ops;
  28. iio_trigger_set_drvdata(adis->trig, adis);
  29. }
  30. static int adis_validate_irq_flag(struct adis *adis)
  31. {
  32. /*
  33. * Typically this devices have data ready either on the rising edge or
  34. * on the falling edge of the data ready pin. This checks enforces that
  35. * one of those is set in the drivers... It defaults to
  36. * IRQF_TRIGGER_RISING for backward compatibility wiht devices that
  37. * don't support changing the pin polarity.
  38. */
  39. if (!adis->irq_flag) {
  40. adis->irq_flag = IRQF_TRIGGER_RISING;
  41. return 0;
  42. } else if (adis->irq_flag != IRQF_TRIGGER_RISING &&
  43. adis->irq_flag != IRQF_TRIGGER_FALLING) {
  44. dev_err(&adis->spi->dev, "Invalid IRQ mask: %08lx\n",
  45. adis->irq_flag);
  46. return -EINVAL;
  47. }
  48. return 0;
  49. }
  50. /**
  51. * devm_adis_probe_trigger() - Sets up trigger for a managed adis device
  52. * @adis: The adis device
  53. * @indio_dev: The IIO device
  54. *
  55. * Returns 0 on success or a negative error code
  56. */
  57. int devm_adis_probe_trigger(struct adis *adis, struct iio_dev *indio_dev)
  58. {
  59. int ret;
  60. adis->trig = devm_iio_trigger_alloc(&adis->spi->dev, "%s-dev%d",
  61. indio_dev->name, indio_dev->id);
  62. if (!adis->trig)
  63. return -ENOMEM;
  64. adis_trigger_setup(adis);
  65. ret = adis_validate_irq_flag(adis);
  66. if (ret)
  67. return ret;
  68. ret = devm_request_irq(&adis->spi->dev, adis->spi->irq,
  69. &iio_trigger_generic_data_rdy_poll,
  70. adis->irq_flag,
  71. indio_dev->name,
  72. adis->trig);
  73. if (ret)
  74. return ret;
  75. return devm_iio_trigger_register(&adis->spi->dev, adis->trig);
  76. }
  77. EXPORT_SYMBOL_GPL(devm_adis_probe_trigger);