st_sensors_trigger.c 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. /*
  2. * STMicroelectronics sensors trigger library driver
  3. *
  4. * Copyright 2012-2013 STMicroelectronics Inc.
  5. *
  6. * Denis Ciocca <denis.ciocca@st.com>
  7. *
  8. * Licensed under the GPL-2.
  9. */
  10. #include <linux/kernel.h>
  11. #include <linux/module.h>
  12. #include <linux/slab.h>
  13. #include <linux/iio/iio.h>
  14. #include <linux/iio/trigger.h>
  15. #include <linux/interrupt.h>
  16. #include <linux/iio/common/st_sensors.h>
  17. int st_sensors_allocate_trigger(struct iio_dev *indio_dev,
  18. const struct iio_trigger_ops *trigger_ops)
  19. {
  20. int err;
  21. struct st_sensor_data *sdata = iio_priv(indio_dev);
  22. sdata->trig = iio_trigger_alloc("%s-trigger", indio_dev->name);
  23. if (sdata->trig == NULL) {
  24. err = -ENOMEM;
  25. dev_err(&indio_dev->dev, "failed to allocate iio trigger.\n");
  26. goto iio_trigger_alloc_error;
  27. }
  28. err = request_threaded_irq(sdata->get_irq_data_ready(indio_dev),
  29. iio_trigger_generic_data_rdy_poll,
  30. NULL,
  31. IRQF_TRIGGER_RISING,
  32. sdata->trig->name,
  33. sdata->trig);
  34. if (err)
  35. goto request_irq_error;
  36. iio_trigger_set_drvdata(sdata->trig, indio_dev);
  37. sdata->trig->ops = trigger_ops;
  38. sdata->trig->dev.parent = sdata->dev;
  39. err = iio_trigger_register(sdata->trig);
  40. if (err < 0) {
  41. dev_err(&indio_dev->dev, "failed to register iio trigger.\n");
  42. goto iio_trigger_register_error;
  43. }
  44. indio_dev->trig = iio_trigger_get(sdata->trig);
  45. return 0;
  46. iio_trigger_register_error:
  47. free_irq(sdata->get_irq_data_ready(indio_dev), sdata->trig);
  48. request_irq_error:
  49. iio_trigger_free(sdata->trig);
  50. iio_trigger_alloc_error:
  51. return err;
  52. }
  53. EXPORT_SYMBOL(st_sensors_allocate_trigger);
  54. void st_sensors_deallocate_trigger(struct iio_dev *indio_dev)
  55. {
  56. struct st_sensor_data *sdata = iio_priv(indio_dev);
  57. iio_trigger_unregister(sdata->trig);
  58. free_irq(sdata->get_irq_data_ready(indio_dev), sdata->trig);
  59. iio_trigger_free(sdata->trig);
  60. }
  61. EXPORT_SYMBOL(st_sensors_deallocate_trigger);
  62. MODULE_AUTHOR("Denis Ciocca <denis.ciocca@st.com>");
  63. MODULE_DESCRIPTION("STMicroelectronics ST-sensors trigger");
  64. MODULE_LICENSE("GPL v2");