st_magn_buffer.c 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. /*
  2. * STMicroelectronics magnetometers 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/module.h>
  11. #include <linux/kernel.h>
  12. #include <linux/slab.h>
  13. #include <linux/stat.h>
  14. #include <linux/interrupt.h>
  15. #include <linux/i2c.h>
  16. #include <linux/delay.h>
  17. #include <linux/iio/iio.h>
  18. #include <linux/iio/buffer.h>
  19. #include <linux/iio/trigger_consumer.h>
  20. #include <linux/iio/triggered_buffer.h>
  21. #include <linux/iio/common/st_sensors.h>
  22. #include "st_magn.h"
  23. static int st_magn_buffer_preenable(struct iio_dev *indio_dev)
  24. {
  25. return st_sensors_set_enable(indio_dev, true);
  26. }
  27. static int st_magn_buffer_postenable(struct iio_dev *indio_dev)
  28. {
  29. int err;
  30. struct st_sensor_data *mdata = iio_priv(indio_dev);
  31. mdata->buffer_data = kmalloc(indio_dev->scan_bytes, GFP_KERNEL);
  32. if (mdata->buffer_data == NULL) {
  33. err = -ENOMEM;
  34. goto allocate_memory_error;
  35. }
  36. err = iio_triggered_buffer_postenable(indio_dev);
  37. if (err < 0)
  38. goto st_magn_buffer_postenable_error;
  39. return err;
  40. st_magn_buffer_postenable_error:
  41. kfree(mdata->buffer_data);
  42. allocate_memory_error:
  43. return err;
  44. }
  45. static int st_magn_buffer_predisable(struct iio_dev *indio_dev)
  46. {
  47. int err;
  48. struct st_sensor_data *mdata = iio_priv(indio_dev);
  49. err = iio_triggered_buffer_predisable(indio_dev);
  50. if (err < 0)
  51. goto st_magn_buffer_predisable_error;
  52. err = st_sensors_set_enable(indio_dev, false);
  53. st_magn_buffer_predisable_error:
  54. kfree(mdata->buffer_data);
  55. return err;
  56. }
  57. static const struct iio_buffer_setup_ops st_magn_buffer_setup_ops = {
  58. .preenable = &st_magn_buffer_preenable,
  59. .postenable = &st_magn_buffer_postenable,
  60. .predisable = &st_magn_buffer_predisable,
  61. };
  62. int st_magn_allocate_ring(struct iio_dev *indio_dev)
  63. {
  64. return iio_triggered_buffer_setup(indio_dev, &iio_pollfunc_store_time,
  65. &st_sensors_trigger_handler, &st_magn_buffer_setup_ops);
  66. }
  67. void st_magn_deallocate_ring(struct iio_dev *indio_dev)
  68. {
  69. iio_triggered_buffer_cleanup(indio_dev);
  70. }
  71. MODULE_AUTHOR("Denis Ciocca <denis.ciocca@st.com>");
  72. MODULE_DESCRIPTION("STMicroelectronics magnetometers buffer");
  73. MODULE_LICENSE("GPL v2");