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_accel.h"
0018
0019 int st_accel_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_accel_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_accel_buffer_enable_all_axis;
0037
0038 return 0;
0039
0040 st_accel_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_accel_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,
0054 ST_SENSORS_ENABLE_ALL_AXIS);
0055 }
0056
0057 static const struct iio_buffer_setup_ops st_accel_buffer_setup_ops = {
0058 .postenable = &st_accel_buffer_postenable,
0059 .predisable = &st_accel_buffer_predisable,
0060 };
0061
0062 int st_accel_allocate_ring(struct iio_dev *indio_dev)
0063 {
0064 return devm_iio_triggered_buffer_setup(indio_dev->dev.parent, indio_dev,
0065 NULL, &st_sensors_trigger_handler, &st_accel_buffer_setup_ops);
0066 }