0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #include <linux/kernel.h>
0011 #include <linux/iio/iio.h>
0012 #include <linux/iio/buffer.h>
0013 #include <linux/iio/trigger.h>
0014 #include <linux/iio/triggered_buffer.h>
0015
0016 #include <linux/iio/common/st_sensors.h>
0017 #include "st_gyro.h"
0018
0019 int st_gyro_trig_set_state(struct iio_trigger *trig, bool state)
0020 {
0021 struct iio_dev *indio_dev = iio_trigger_get_drvdata(trig);
0022
0023 return st_sensors_set_dataready_irq(indio_dev, state);
0024 }
0025
0026 static int st_gyro_buffer_postenable(struct iio_dev *indio_dev)
0027 {
0028 int err;
0029
0030 err = st_sensors_set_axis_enable(indio_dev, indio_dev->active_scan_mask[0]);
0031 if (err < 0)
0032 return err;
0033
0034 err = st_sensors_set_enable(indio_dev, true);
0035 if (err < 0)
0036 goto st_gyro_buffer_enable_all_axis;
0037
0038 return 0;
0039
0040 st_gyro_buffer_enable_all_axis:
0041 st_sensors_set_axis_enable(indio_dev, ST_SENSORS_ENABLE_ALL_AXIS);
0042 return err;
0043 }
0044
0045 static int st_gyro_buffer_predisable(struct iio_dev *indio_dev)
0046 {
0047 int err;
0048
0049 err = st_sensors_set_enable(indio_dev, false);
0050 if (err < 0)
0051 return err;
0052
0053 return st_sensors_set_axis_enable(indio_dev, ST_SENSORS_ENABLE_ALL_AXIS);
0054 }
0055
0056 static const struct iio_buffer_setup_ops st_gyro_buffer_setup_ops = {
0057 .postenable = &st_gyro_buffer_postenable,
0058 .predisable = &st_gyro_buffer_predisable,
0059 };
0060
0061 int st_gyro_allocate_ring(struct iio_dev *indio_dev)
0062 {
0063 return devm_iio_triggered_buffer_setup(indio_dev->dev.parent, indio_dev,
0064 NULL, &st_sensors_trigger_handler, &st_gyro_buffer_setup_ops);
0065 }
0066