st_gyro_buffer.c 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * STMicroelectronics gyroscopes driver
  4. *
  5. * Copyright 2012-2013 STMicroelectronics Inc.
  6. *
  7. * Denis Ciocca <[email protected]>
  8. */
  9. #include <linux/kernel.h>
  10. #include <linux/iio/iio.h>
  11. #include <linux/iio/buffer.h>
  12. #include <linux/iio/trigger.h>
  13. #include <linux/iio/triggered_buffer.h>
  14. #include <linux/iio/common/st_sensors.h>
  15. #include "st_gyro.h"
  16. int st_gyro_trig_set_state(struct iio_trigger *trig, bool state)
  17. {
  18. struct iio_dev *indio_dev = iio_trigger_get_drvdata(trig);
  19. return st_sensors_set_dataready_irq(indio_dev, state);
  20. }
  21. static int st_gyro_buffer_postenable(struct iio_dev *indio_dev)
  22. {
  23. int err;
  24. err = st_sensors_set_axis_enable(indio_dev, indio_dev->active_scan_mask[0]);
  25. if (err < 0)
  26. return err;
  27. err = st_sensors_set_enable(indio_dev, true);
  28. if (err < 0)
  29. goto st_gyro_buffer_enable_all_axis;
  30. return 0;
  31. st_gyro_buffer_enable_all_axis:
  32. st_sensors_set_axis_enable(indio_dev, ST_SENSORS_ENABLE_ALL_AXIS);
  33. return err;
  34. }
  35. static int st_gyro_buffer_predisable(struct iio_dev *indio_dev)
  36. {
  37. int err;
  38. err = st_sensors_set_enable(indio_dev, false);
  39. if (err < 0)
  40. return err;
  41. return st_sensors_set_axis_enable(indio_dev, ST_SENSORS_ENABLE_ALL_AXIS);
  42. }
  43. static const struct iio_buffer_setup_ops st_gyro_buffer_setup_ops = {
  44. .postenable = &st_gyro_buffer_postenable,
  45. .predisable = &st_gyro_buffer_predisable,
  46. };
  47. int st_gyro_allocate_ring(struct iio_dev *indio_dev)
  48. {
  49. return devm_iio_triggered_buffer_setup(indio_dev->dev.parent, indio_dev,
  50. NULL, &st_sensors_trigger_handler, &st_gyro_buffer_setup_ops);
  51. }