Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-only
0002 /*
0003  * STMicroelectronics gyroscopes driver
0004  *
0005  * Copyright 2012-2013 STMicroelectronics Inc.
0006  *
0007  * Denis Ciocca <denis.ciocca@st.com>
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