Linux Audio

Check our new training course

Loading...
v6.13.7
 1// SPDX-License-Identifier: GPL-2.0-only
 2/*
 3 * STMicroelectronics accelerometers driver
 4 *
 5 * Copyright 2012-2013 STMicroelectronics Inc.
 6 *
 7 * Denis Ciocca <denis.ciocca@st.com>
 
 
 8 */
 9
 
10#include <linux/kernel.h>
 
 
 
 
 
11#include <linux/iio/iio.h>
12#include <linux/iio/buffer.h>
13#include <linux/iio/trigger.h>
14#include <linux/iio/triggered_buffer.h>
15
16#include <linux/iio/common/st_sensors.h>
17#include "st_accel.h"
18
19int st_accel_trig_set_state(struct iio_trigger *trig, bool state)
20{
21	struct iio_dev *indio_dev = iio_trigger_get_drvdata(trig);
22
23	return st_sensors_set_dataready_irq(indio_dev, state);
24}
25
 
 
 
 
 
26static int st_accel_buffer_postenable(struct iio_dev *indio_dev)
27{
28	int err;
 
29
30	err = st_sensors_set_axis_enable(indio_dev, indio_dev->active_scan_mask[0]);
 
 
 
 
 
 
 
31	if (err < 0)
32		return err;
33
34	err = st_sensors_set_enable(indio_dev, true);
35	if (err < 0)
36		goto st_accel_buffer_enable_all_axis;
37
38	return 0;
39
40st_accel_buffer_enable_all_axis:
41	st_sensors_set_axis_enable(indio_dev, ST_SENSORS_ENABLE_ALL_AXIS);
 
42	return err;
43}
44
45static int st_accel_buffer_predisable(struct iio_dev *indio_dev)
46{
47	int err;
 
48
49	err = st_sensors_set_enable(indio_dev, false);
 
 
 
 
50	if (err < 0)
51		return err;
 
 
52
53	return st_sensors_set_axis_enable(indio_dev,
54					  ST_SENSORS_ENABLE_ALL_AXIS);
 
55}
56
57static const struct iio_buffer_setup_ops st_accel_buffer_setup_ops = {
 
58	.postenable = &st_accel_buffer_postenable,
59	.predisable = &st_accel_buffer_predisable,
60};
61
62int st_accel_allocate_ring(struct iio_dev *indio_dev)
63{
64	return devm_iio_triggered_buffer_setup(indio_dev->dev.parent, indio_dev,
65		NULL, &st_sensors_trigger_handler, &st_accel_buffer_setup_ops);
66}
v4.10.11
 
  1/*
  2 * STMicroelectronics accelerometers driver
  3 *
  4 * Copyright 2012-2013 STMicroelectronics Inc.
  5 *
  6 * Denis Ciocca <denis.ciocca@st.com>
  7 *
  8 * Licensed under the GPL-2.
  9 */
 10
 11#include <linux/module.h>
 12#include <linux/kernel.h>
 13#include <linux/slab.h>
 14#include <linux/stat.h>
 15#include <linux/interrupt.h>
 16#include <linux/i2c.h>
 17#include <linux/delay.h>
 18#include <linux/iio/iio.h>
 19#include <linux/iio/buffer.h>
 20#include <linux/iio/trigger_consumer.h>
 21#include <linux/iio/triggered_buffer.h>
 22
 23#include <linux/iio/common/st_sensors.h>
 24#include "st_accel.h"
 25
 26int st_accel_trig_set_state(struct iio_trigger *trig, bool state)
 27{
 28	struct iio_dev *indio_dev = iio_trigger_get_drvdata(trig);
 29
 30	return st_sensors_set_dataready_irq(indio_dev, state);
 31}
 32
 33static int st_accel_buffer_preenable(struct iio_dev *indio_dev)
 34{
 35	return st_sensors_set_enable(indio_dev, true);
 36}
 37
 38static int st_accel_buffer_postenable(struct iio_dev *indio_dev)
 39{
 40	int err;
 41	struct st_sensor_data *adata = iio_priv(indio_dev);
 42
 43	adata->buffer_data = kmalloc(indio_dev->scan_bytes, GFP_KERNEL);
 44	if (adata->buffer_data == NULL) {
 45		err = -ENOMEM;
 46		goto allocate_memory_error;
 47	}
 48
 49	err = st_sensors_set_axis_enable(indio_dev,
 50					(u8)indio_dev->active_scan_mask[0]);
 51	if (err < 0)
 52		goto st_accel_buffer_postenable_error;
 53
 54	err = iio_triggered_buffer_postenable(indio_dev);
 55	if (err < 0)
 56		goto st_accel_buffer_postenable_error;
 57
 58	return err;
 59
 60st_accel_buffer_postenable_error:
 61	kfree(adata->buffer_data);
 62allocate_memory_error:
 63	return err;
 64}
 65
 66static int st_accel_buffer_predisable(struct iio_dev *indio_dev)
 67{
 68	int err;
 69	struct st_sensor_data *adata = iio_priv(indio_dev);
 70
 71	err = iio_triggered_buffer_predisable(indio_dev);
 72	if (err < 0)
 73		goto st_accel_buffer_predisable_error;
 74
 75	err = st_sensors_set_axis_enable(indio_dev, ST_SENSORS_ENABLE_ALL_AXIS);
 76	if (err < 0)
 77		goto st_accel_buffer_predisable_error;
 78
 79	err = st_sensors_set_enable(indio_dev, false);
 80
 81st_accel_buffer_predisable_error:
 82	kfree(adata->buffer_data);
 83	return err;
 84}
 85
 86static const struct iio_buffer_setup_ops st_accel_buffer_setup_ops = {
 87	.preenable = &st_accel_buffer_preenable,
 88	.postenable = &st_accel_buffer_postenable,
 89	.predisable = &st_accel_buffer_predisable,
 90};
 91
 92int st_accel_allocate_ring(struct iio_dev *indio_dev)
 93{
 94	return iio_triggered_buffer_setup(indio_dev, NULL,
 95		&st_sensors_trigger_handler, &st_accel_buffer_setup_ops);
 96}
 97
 98void st_accel_deallocate_ring(struct iio_dev *indio_dev)
 99{
100	iio_triggered_buffer_cleanup(indio_dev);
101}
102
103MODULE_AUTHOR("Denis Ciocca <denis.ciocca@st.com>");
104MODULE_DESCRIPTION("STMicroelectronics accelerometers buffer");
105MODULE_LICENSE("GPL v2");