Linux Audio

Check our new training course

Loading...
 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/module.h>
11#include <linux/kernel.h>
12#include <linux/slab.h>
13#include <linux/stat.h>
14#include <linux/interrupt.h>
15#include <linux/i2c.h>
16#include <linux/delay.h>
17#include <linux/iio/iio.h>
18#include <linux/iio/buffer.h>
19#include <linux/iio/trigger_consumer.h>
20#include <linux/iio/triggered_buffer.h>
21
22#include <linux/iio/common/st_sensors.h>
23#include "st_accel.h"
24
25int st_accel_trig_set_state(struct iio_trigger *trig, bool state)
26{
27	struct iio_dev *indio_dev = iio_trigger_get_drvdata(trig);
28
29	return st_sensors_set_dataready_irq(indio_dev, state);
30}
31
32static int st_accel_buffer_postenable(struct iio_dev *indio_dev)
33{
34	int err;
35
36	err = st_sensors_set_axis_enable(indio_dev, indio_dev->active_scan_mask[0]);
37	if (err < 0)
38		return err;
39
40	err = st_sensors_set_enable(indio_dev, true);
41	if (err < 0)
42		goto st_accel_buffer_enable_all_axis;
43
44	return 0;
45
46st_accel_buffer_enable_all_axis:
47	st_sensors_set_axis_enable(indio_dev, ST_SENSORS_ENABLE_ALL_AXIS);
48	return err;
49}
50
51static int st_accel_buffer_predisable(struct iio_dev *indio_dev)
52{
53	int err;
54
55	err = st_sensors_set_enable(indio_dev, false);
56	if (err < 0)
57		return err;
58
59	return st_sensors_set_axis_enable(indio_dev,
60					  ST_SENSORS_ENABLE_ALL_AXIS);
61}
62
63static const struct iio_buffer_setup_ops st_accel_buffer_setup_ops = {
64	.postenable = &st_accel_buffer_postenable,
65	.predisable = &st_accel_buffer_predisable,
66};
67
68int st_accel_allocate_ring(struct iio_dev *indio_dev)
69{
70	return iio_triggered_buffer_setup(indio_dev, NULL,
71		&st_sensors_trigger_handler, &st_accel_buffer_setup_ops);
72}
73
74void st_accel_deallocate_ring(struct iio_dev *indio_dev)
75{
76	iio_triggered_buffer_cleanup(indio_dev);
77}
78
79MODULE_AUTHOR("Denis Ciocca <denis.ciocca@st.com>");
80MODULE_DESCRIPTION("STMicroelectronics accelerometers buffer");
81MODULE_LICENSE("GPL v2");
  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");