1fda8d26eSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only
27be56a8fSDenis Ciocca /*
37be56a8fSDenis Ciocca * STMicroelectronics gyroscopes driver
47be56a8fSDenis Ciocca *
57be56a8fSDenis Ciocca * Copyright 2012-2013 STMicroelectronics Inc.
67be56a8fSDenis Ciocca *
77be56a8fSDenis Ciocca * Denis Ciocca <denis.ciocca@st.com>
87be56a8fSDenis Ciocca */
97be56a8fSDenis Ciocca
107be56a8fSDenis Ciocca #include <linux/kernel.h>
117be56a8fSDenis Ciocca #include <linux/iio/iio.h>
127be56a8fSDenis Ciocca #include <linux/iio/buffer.h>
139c6cd755SJonathan Cameron #include <linux/iio/trigger.h>
147be56a8fSDenis Ciocca #include <linux/iio/triggered_buffer.h>
157be56a8fSDenis Ciocca
167be56a8fSDenis Ciocca #include <linux/iio/common/st_sensors.h>
177be56a8fSDenis Ciocca #include "st_gyro.h"
187be56a8fSDenis Ciocca
st_gyro_trig_set_state(struct iio_trigger * trig,bool state)197be56a8fSDenis Ciocca int st_gyro_trig_set_state(struct iio_trigger *trig, bool state)
207be56a8fSDenis Ciocca {
211e9663c6SLars-Peter Clausen struct iio_dev *indio_dev = iio_trigger_get_drvdata(trig);
227be56a8fSDenis Ciocca
237be56a8fSDenis Ciocca return st_sensors_set_dataready_irq(indio_dev, state);
247be56a8fSDenis Ciocca }
257be56a8fSDenis Ciocca
st_gyro_buffer_postenable(struct iio_dev * indio_dev)267be56a8fSDenis Ciocca static int st_gyro_buffer_postenable(struct iio_dev *indio_dev)
277be56a8fSDenis Ciocca {
2821b1ee31SDenis Ciocca int err;
297be56a8fSDenis Ciocca
301f38527dSAndy Shevchenko err = st_sensors_set_axis_enable(indio_dev, indio_dev->active_scan_mask[0]);
317be56a8fSDenis Ciocca if (err < 0)
32f11d59d8SLars-Peter Clausen return err;
337be56a8fSDenis Ciocca
3421b1ee31SDenis Ciocca err = st_sensors_set_enable(indio_dev, true);
357be56a8fSDenis Ciocca if (err < 0)
3621b1ee31SDenis Ciocca goto st_gyro_buffer_enable_all_axis;
377be56a8fSDenis Ciocca
3821b1ee31SDenis Ciocca return 0;
397be56a8fSDenis Ciocca
4021b1ee31SDenis Ciocca st_gyro_buffer_enable_all_axis:
4121b1ee31SDenis Ciocca st_sensors_set_axis_enable(indio_dev, ST_SENSORS_ENABLE_ALL_AXIS);
427be56a8fSDenis Ciocca return err;
437be56a8fSDenis Ciocca }
447be56a8fSDenis Ciocca
st_gyro_buffer_predisable(struct iio_dev * indio_dev)457be56a8fSDenis Ciocca static int st_gyro_buffer_predisable(struct iio_dev *indio_dev)
467be56a8fSDenis Ciocca {
47f11d59d8SLars-Peter Clausen int err;
487be56a8fSDenis Ciocca
4921b1ee31SDenis Ciocca err = st_sensors_set_enable(indio_dev, false);
507be56a8fSDenis Ciocca if (err < 0)
517be56a8fSDenis Ciocca return err;
52f11d59d8SLars-Peter Clausen
53f11d59d8SLars-Peter Clausen return st_sensors_set_axis_enable(indio_dev, ST_SENSORS_ENABLE_ALL_AXIS);
547be56a8fSDenis Ciocca }
557be56a8fSDenis Ciocca
567be56a8fSDenis Ciocca static const struct iio_buffer_setup_ops st_gyro_buffer_setup_ops = {
577be56a8fSDenis Ciocca .postenable = &st_gyro_buffer_postenable,
587be56a8fSDenis Ciocca .predisable = &st_gyro_buffer_predisable,
597be56a8fSDenis Ciocca };
607be56a8fSDenis Ciocca
st_gyro_allocate_ring(struct iio_dev * indio_dev)617be56a8fSDenis Ciocca int st_gyro_allocate_ring(struct iio_dev *indio_dev)
627be56a8fSDenis Ciocca {
63*a574e68fSAlexandru Ardelean return devm_iio_triggered_buffer_setup(indio_dev->dev.parent, indio_dev,
64*a574e68fSAlexandru Ardelean NULL, &st_sensors_trigger_handler, &st_gyro_buffer_setup_ops);
657be56a8fSDenis Ciocca }
667be56a8fSDenis Ciocca
67