blob: e732fda6c8e6443ca5e373fe24b3daef51bfed9f [file] [log] [blame]
Denis Ciocca23491b52013-01-25 23:44:00 +00001/*
2 * STMicroelectronics sensors library 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#ifndef ST_SENSORS_H
12#define ST_SENSORS_H
13
14#include <linux/i2c.h>
15#include <linux/spi/spi.h>
16#include <linux/irqreturn.h>
17#include <linux/iio/trigger.h>
Jonathan Cameron5ea86492013-02-27 19:41:59 +000018#include <linux/bitops.h>
Denis Ciocca23491b52013-01-25 23:44:00 +000019
Denis CIOCCA23cde4d2013-06-19 09:28:00 +010020#include <linux/platform_data/st_sensors_pdata.h>
21
Denis Ciocca23491b52013-01-25 23:44:00 +000022#define ST_SENSORS_TX_MAX_LENGTH 2
23#define ST_SENSORS_RX_MAX_LENGTH 6
24
25#define ST_SENSORS_ODR_LIST_MAX 10
26#define ST_SENSORS_FULLSCALE_AVL_MAX 10
27
28#define ST_SENSORS_NUMBER_ALL_CHANNELS 4
Denis Ciocca23491b52013-01-25 23:44:00 +000029#define ST_SENSORS_ENABLE_ALL_AXIS 0x07
Denis Ciocca23491b52013-01-25 23:44:00 +000030#define ST_SENSORS_SCAN_X 0
31#define ST_SENSORS_SCAN_Y 1
32#define ST_SENSORS_SCAN_Z 2
Denis Ciocca23491b52013-01-25 23:44:00 +000033#define ST_SENSORS_DEFAULT_POWER_ON_VALUE 0x01
34#define ST_SENSORS_DEFAULT_POWER_OFF_VALUE 0x00
35#define ST_SENSORS_DEFAULT_WAI_ADDRESS 0x0f
36#define ST_SENSORS_DEFAULT_AXIS_ADDR 0x20
37#define ST_SENSORS_DEFAULT_AXIS_MASK 0x07
38#define ST_SENSORS_DEFAULT_AXIS_N_BIT 3
39
40#define ST_SENSORS_MAX_NAME 17
41#define ST_SENSORS_MAX_4WAI 7
42
Denis CIOCCA762011d2013-06-03 15:58:00 +010043#define ST_SENSORS_LSM_CHANNELS(device_type, mask, index, mod, \
44 ch2, s, endian, rbits, sbits, addr) \
Denis Ciocca23491b52013-01-25 23:44:00 +000045{ \
46 .type = device_type, \
Denis CIOCCA762011d2013-06-03 15:58:00 +010047 .modified = mod, \
48 .info_mask_separate = mask, \
Denis Ciocca23491b52013-01-25 23:44:00 +000049 .scan_index = index, \
Denis CIOCCA762011d2013-06-03 15:58:00 +010050 .channel2 = ch2, \
Denis Ciocca23491b52013-01-25 23:44:00 +000051 .address = addr, \
52 .scan_type = { \
Denis CIOCCA762011d2013-06-03 15:58:00 +010053 .sign = s, \
54 .realbits = rbits, \
55 .shift = sbits - rbits, \
56 .storagebits = sbits, \
Denis Ciocca23491b52013-01-25 23:44:00 +000057 .endianness = endian, \
58 }, \
59}
60
61#define ST_SENSOR_DEV_ATTR_SAMP_FREQ() \
62 IIO_DEV_ATTR_SAMP_FREQ(S_IWUSR | S_IRUGO, \
63 st_sensors_sysfs_get_sampling_frequency, \
64 st_sensors_sysfs_set_sampling_frequency)
65
66#define ST_SENSORS_DEV_ATTR_SAMP_FREQ_AVAIL() \
67 IIO_DEV_ATTR_SAMP_FREQ_AVAIL( \
68 st_sensors_sysfs_sampling_frequency_avail)
69
70#define ST_SENSORS_DEV_ATTR_SCALE_AVAIL(name) \
71 IIO_DEVICE_ATTR(name, S_IRUGO, \
72 st_sensors_sysfs_scale_avail, NULL , 0);
73
74struct st_sensor_odr_avl {
75 unsigned int hz;
76 u8 value;
77};
78
79struct st_sensor_odr {
80 u8 addr;
81 u8 mask;
82 struct st_sensor_odr_avl odr_avl[ST_SENSORS_ODR_LIST_MAX];
83};
84
85struct st_sensor_power {
86 u8 addr;
87 u8 mask;
88 u8 value_off;
89 u8 value_on;
90};
91
92struct st_sensor_axis {
93 u8 addr;
94 u8 mask;
95};
96
97struct st_sensor_fullscale_avl {
98 unsigned int num;
99 u8 value;
100 unsigned int gain;
101 unsigned int gain2;
102};
103
104struct st_sensor_fullscale {
105 u8 addr;
106 u8 mask;
107 struct st_sensor_fullscale_avl fs_avl[ST_SENSORS_FULLSCALE_AVL_MAX];
108};
109
110/**
111 * struct st_sensor_bdu - ST sensor device block data update
112 * @addr: address of the register.
113 * @mask: mask to write the block data update flag.
114 */
115struct st_sensor_bdu {
116 u8 addr;
117 u8 mask;
118};
119
120/**
121 * struct st_sensor_data_ready_irq - ST sensor device data-ready interrupt
122 * @addr: address of the register.
Denis CIOCCA23cde4d2013-06-19 09:28:00 +0100123 * @mask_int1: mask to enable/disable IRQ on INT1 pin.
124 * @mask_int2: mask to enable/disable IRQ on INT2 pin.
Denis Ciocca23491b52013-01-25 23:44:00 +0000125 * struct ig1 - represents the Interrupt Generator 1 of sensors.
126 * @en_addr: address of the enable ig1 register.
127 * @en_mask: mask to write the on/off value for enable.
128 */
129struct st_sensor_data_ready_irq {
130 u8 addr;
Denis CIOCCA23cde4d2013-06-19 09:28:00 +0100131 u8 mask_int1;
132 u8 mask_int2;
Denis Ciocca23491b52013-01-25 23:44:00 +0000133 struct {
134 u8 en_addr;
135 u8 en_mask;
136 } ig1;
137};
138
139/**
140 * struct st_sensor_transfer_buffer - ST sensor device I/O buffer
141 * @buf_lock: Mutex to protect rx and tx buffers.
142 * @tx_buf: Buffer used by SPI transfer function to send data to the sensors.
143 * This buffer is used to avoid DMA not-aligned issue.
144 * @rx_buf: Buffer used by SPI transfer to receive data from sensors.
145 * This buffer is used to avoid DMA not-aligned issue.
146 */
147struct st_sensor_transfer_buffer {
148 struct mutex buf_lock;
149 u8 rx_buf[ST_SENSORS_RX_MAX_LENGTH];
150 u8 tx_buf[ST_SENSORS_TX_MAX_LENGTH] ____cacheline_aligned;
151};
152
153/**
154 * struct st_sensor_transfer_function - ST sensor device I/O function
155 * @read_byte: Function used to read one byte.
156 * @write_byte: Function used to write one byte.
157 * @read_multiple_byte: Function used to read multiple byte.
158 */
159struct st_sensor_transfer_function {
160 int (*read_byte) (struct st_sensor_transfer_buffer *tb,
161 struct device *dev, u8 reg_addr, u8 *res_byte);
162 int (*write_byte) (struct st_sensor_transfer_buffer *tb,
163 struct device *dev, u8 reg_addr, u8 data);
164 int (*read_multiple_byte) (struct st_sensor_transfer_buffer *tb,
165 struct device *dev, u8 reg_addr, int len, u8 *data,
166 bool multiread_bit);
167};
168
169/**
170 * struct st_sensors - ST sensors list
171 * @wai: Contents of WhoAmI register.
172 * @sensors_supported: List of supported sensors by struct itself.
173 * @ch: IIO channels for the sensor.
174 * @odr: Output data rate register and ODR list available.
175 * @pw: Power register of the sensor.
176 * @enable_axis: Enable one or more axis of the sensor.
177 * @fs: Full scale register and full scale list available.
178 * @bdu: Block data update register.
179 * @drdy_irq: Data ready register of the sensor.
180 * @multi_read_bit: Use or not particular bit for [I2C/SPI] multi-read.
181 * @bootime: samples to discard when sensor passing from power-down to power-up.
182 */
183struct st_sensors {
184 u8 wai;
185 char sensors_supported[ST_SENSORS_MAX_4WAI][ST_SENSORS_MAX_NAME];
186 struct iio_chan_spec *ch;
Lee Jonesea01f2c2013-09-10 13:49:00 +0100187 int num_ch;
Denis Ciocca23491b52013-01-25 23:44:00 +0000188 struct st_sensor_odr odr;
189 struct st_sensor_power pw;
190 struct st_sensor_axis enable_axis;
191 struct st_sensor_fullscale fs;
192 struct st_sensor_bdu bdu;
193 struct st_sensor_data_ready_irq drdy_irq;
194 bool multi_read_bit;
195 unsigned int bootime;
196};
197
198/**
199 * struct st_sensor_data - ST sensor device status
200 * @dev: Pointer to instance of struct device (I2C or SPI).
201 * @trig: The trigger in use by the core driver.
202 * @sensor: Pointer to the current sensor struct in use.
203 * @current_fullscale: Maximum range of measure by the sensor.
204 * @enabled: Status of the sensor (false->off, true->on).
205 * @multiread_bit: Use or not particular bit for [I2C/SPI] multiread.
206 * @buffer_data: Data used by buffer part.
207 * @odr: Output data rate of the sensor [Hz].
Denis CIOCCA607a5682013-06-03 15:58:00 +0100208 * num_data_channels: Number of data channels used in buffer.
Denis CIOCCA23cde4d2013-06-19 09:28:00 +0100209 * @drdy_int_pin: Redirect DRDY on pin 1 (1) or pin 2 (2).
Denis Ciocca23491b52013-01-25 23:44:00 +0000210 * @get_irq_data_ready: Function to get the IRQ used for data ready signal.
211 * @tf: Transfer function structure used by I/O operations.
212 * @tb: Transfer buffers and mutex used by I/O operations.
213 */
214struct st_sensor_data {
215 struct device *dev;
216 struct iio_trigger *trig;
217 struct st_sensors *sensor;
218 struct st_sensor_fullscale_avl *current_fullscale;
219
220 bool enabled;
221 bool multiread_bit;
222
223 char *buffer_data;
224
225 unsigned int odr;
Denis CIOCCA607a5682013-06-03 15:58:00 +0100226 unsigned int num_data_channels;
Denis Ciocca23491b52013-01-25 23:44:00 +0000227
Denis CIOCCA23cde4d2013-06-19 09:28:00 +0100228 u8 drdy_int_pin;
229
Denis Ciocca23491b52013-01-25 23:44:00 +0000230 unsigned int (*get_irq_data_ready) (struct iio_dev *indio_dev);
231
232 const struct st_sensor_transfer_function *tf;
233 struct st_sensor_transfer_buffer tb;
234};
235
236#ifdef CONFIG_IIO_BUFFER
Guenter Roeck5a4d7292013-03-01 15:57:00 +0000237irqreturn_t st_sensors_trigger_handler(int irq, void *p);
238
239int st_sensors_get_buffer_element(struct iio_dev *indio_dev, u8 *buf);
240#endif
241
242#ifdef CONFIG_IIO_TRIGGER
Denis Ciocca23491b52013-01-25 23:44:00 +0000243int st_sensors_allocate_trigger(struct iio_dev *indio_dev,
244 const struct iio_trigger_ops *trigger_ops);
245
246void st_sensors_deallocate_trigger(struct iio_dev *indio_dev);
247
Denis CIOCCA91ffbab2013-02-07 09:46:00 +0000248#else
249static inline int st_sensors_allocate_trigger(struct iio_dev *indio_dev,
250 const struct iio_trigger_ops *trigger_ops)
251{
252 return 0;
253}
254static inline void st_sensors_deallocate_trigger(struct iio_dev *indio_dev)
255{
256 return;
257}
Denis Ciocca23491b52013-01-25 23:44:00 +0000258#endif
259
Denis CIOCCA23cde4d2013-06-19 09:28:00 +0100260int st_sensors_init_sensor(struct iio_dev *indio_dev,
261 struct st_sensors_platform_data *pdata);
Denis Ciocca23491b52013-01-25 23:44:00 +0000262
263int st_sensors_set_enable(struct iio_dev *indio_dev, bool enable);
264
265int st_sensors_set_axis_enable(struct iio_dev *indio_dev, u8 axis_enable);
266
Denis Ciocca23491b52013-01-25 23:44:00 +0000267int st_sensors_set_odr(struct iio_dev *indio_dev, unsigned int odr);
268
269int st_sensors_set_dataready_irq(struct iio_dev *indio_dev, bool enable);
270
271int st_sensors_set_fullscale_by_gain(struct iio_dev *indio_dev, int scale);
272
273int st_sensors_read_info_raw(struct iio_dev *indio_dev,
274 struct iio_chan_spec const *ch, int *val);
275
276int st_sensors_check_device_support(struct iio_dev *indio_dev,
277 int num_sensors_list, const struct st_sensors *sensors);
278
279ssize_t st_sensors_sysfs_get_sampling_frequency(struct device *dev,
280 struct device_attribute *attr, char *buf);
281
282ssize_t st_sensors_sysfs_set_sampling_frequency(struct device *dev,
283 struct device_attribute *attr, const char *buf, size_t size);
284
285ssize_t st_sensors_sysfs_sampling_frequency_avail(struct device *dev,
286 struct device_attribute *attr, char *buf);
287
288ssize_t st_sensors_sysfs_scale_avail(struct device *dev,
289 struct device_attribute *attr, char *buf);
290
291#endif /* ST_SENSORS_H */