xref: /openbmc/linux/drivers/iio/gyro/st_gyro_buffer.c (revision 4f2c0a4acffbec01079c28f839422e64ddeff004)
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