2019-05-28 09:57:06 -07:00
// SPDX-License-Identifier: GPL-2.0-only
2013-01-25 23:44:00 +00:00
/*
* STMicroelectronics gyroscopes driver
*
* Copyright 2012 - 2013 STMicroelectronics Inc .
*
* Denis Ciocca < denis . ciocca @ st . com >
*/
# include <linux/kernel.h>
# include <linux/iio/iio.h>
# include <linux/iio/buffer.h>
2021-06-08 18:51:49 +01:00
# include <linux/iio/trigger.h>
2013-01-25 23:44:00 +00:00
# include <linux/iio/triggered_buffer.h>
# include <linux/iio/common/st_sensors.h>
# include "st_gyro.h"
int st_gyro_trig_set_state ( struct iio_trigger * trig , bool state )
{
2013-03-25 08:58:00 +00:00
struct iio_dev * indio_dev = iio_trigger_get_drvdata ( trig ) ;
2013-01-25 23:44:00 +00:00
return st_sensors_set_dataready_irq ( indio_dev , state ) ;
}
static int st_gyro_buffer_postenable ( struct iio_dev * indio_dev )
{
2019-07-31 14:48:58 -07:00
int err ;
2013-01-25 23:44:00 +00:00
2020-03-13 12:49:50 +02:00
err = st_sensors_set_axis_enable ( indio_dev , indio_dev - > active_scan_mask [ 0 ] ) ;
2013-01-25 23:44:00 +00:00
if ( err < 0 )
2020-05-25 14:38:53 +03:00
return err ;
2013-01-25 23:44:00 +00:00
2019-07-31 14:48:58 -07:00
err = st_sensors_set_enable ( indio_dev , true ) ;
2013-01-25 23:44:00 +00:00
if ( err < 0 )
2019-07-31 14:48:58 -07:00
goto st_gyro_buffer_enable_all_axis ;
2013-01-25 23:44:00 +00:00
2019-07-31 14:48:58 -07:00
return 0 ;
2013-01-25 23:44:00 +00:00
2019-07-31 14:48:58 -07:00
st_gyro_buffer_enable_all_axis :
st_sensors_set_axis_enable ( indio_dev , ST_SENSORS_ENABLE_ALL_AXIS ) ;
2013-01-25 23:44:00 +00:00
return err ;
}
static int st_gyro_buffer_predisable ( struct iio_dev * indio_dev )
{
2020-05-25 14:38:53 +03:00
int err ;
2013-01-25 23:44:00 +00:00
2019-07-31 14:48:58 -07:00
err = st_sensors_set_enable ( indio_dev , false ) ;
2013-01-25 23:44:00 +00:00
if ( err < 0 )
2020-05-25 14:38:53 +03:00
return err ;
2013-01-25 23:44:00 +00:00
2020-05-25 14:38:53 +03:00
return st_sensors_set_axis_enable ( indio_dev , ST_SENSORS_ENABLE_ALL_AXIS ) ;
2013-01-25 23:44:00 +00:00
}
static const struct iio_buffer_setup_ops st_gyro_buffer_setup_ops = {
. postenable = & st_gyro_buffer_postenable ,
. predisable = & st_gyro_buffer_predisable ,
} ;
int st_gyro_allocate_ring ( struct iio_dev * indio_dev )
{
2021-07-20 10:46:42 +03:00
return devm_iio_triggered_buffer_setup ( indio_dev - > dev . parent , indio_dev ,
NULL , & st_sensors_trigger_handler , & st_gyro_buffer_setup_ops ) ;
2013-01-25 23:44:00 +00:00
}