xref: /linux/drivers/iio/accel/st_accel_core.c (revision 856e7c4b619af622d56b3b454f7bec32a170ac99)
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/kernel.h>
12 #include <linux/module.h>
13 #include <linux/slab.h>
14 #include <linux/errno.h>
15 #include <linux/types.h>
16 #include <linux/mutex.h>
17 #include <linux/interrupt.h>
18 #include <linux/i2c.h>
19 #include <linux/gpio.h>
20 #include <linux/irq.h>
21 #include <linux/iio/iio.h>
22 #include <linux/iio/sysfs.h>
23 #include <linux/iio/trigger.h>
24 #include <linux/iio/buffer.h>
25 
26 #include <linux/iio/common/st_sensors.h>
27 #include "st_accel.h"
28 
29 #define ST_ACCEL_NUMBER_DATA_CHANNELS		3
30 
31 /* DEFAULT VALUE FOR SENSORS */
32 #define ST_ACCEL_DEFAULT_OUT_X_L_ADDR		0x28
33 #define ST_ACCEL_DEFAULT_OUT_Y_L_ADDR		0x2a
34 #define ST_ACCEL_DEFAULT_OUT_Z_L_ADDR		0x2c
35 
36 /* FULLSCALE */
37 #define ST_ACCEL_FS_AVL_2G			2
38 #define ST_ACCEL_FS_AVL_4G			4
39 #define ST_ACCEL_FS_AVL_6G			6
40 #define ST_ACCEL_FS_AVL_8G			8
41 #define ST_ACCEL_FS_AVL_16G			16
42 #define ST_ACCEL_FS_AVL_100G			100
43 #define ST_ACCEL_FS_AVL_200G			200
44 #define ST_ACCEL_FS_AVL_400G			400
45 
46 static const struct iio_chan_spec st_accel_8bit_channels[] = {
47 	ST_SENSORS_LSM_CHANNELS(IIO_ACCEL,
48 			BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
49 			ST_SENSORS_SCAN_X, 1, IIO_MOD_X, 's', IIO_LE, 8, 8,
50 			ST_ACCEL_DEFAULT_OUT_X_L_ADDR+1),
51 	ST_SENSORS_LSM_CHANNELS(IIO_ACCEL,
52 			BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
53 			ST_SENSORS_SCAN_Y, 1, IIO_MOD_Y, 's', IIO_LE, 8, 8,
54 			ST_ACCEL_DEFAULT_OUT_Y_L_ADDR+1),
55 	ST_SENSORS_LSM_CHANNELS(IIO_ACCEL,
56 			BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
57 			ST_SENSORS_SCAN_Z, 1, IIO_MOD_Z, 's', IIO_LE, 8, 8,
58 			ST_ACCEL_DEFAULT_OUT_Z_L_ADDR+1),
59 	IIO_CHAN_SOFT_TIMESTAMP(3)
60 };
61 
62 static const struct iio_chan_spec st_accel_12bit_channels[] = {
63 	ST_SENSORS_LSM_CHANNELS(IIO_ACCEL,
64 			BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
65 			ST_SENSORS_SCAN_X, 1, IIO_MOD_X, 's', IIO_LE, 12, 16,
66 			ST_ACCEL_DEFAULT_OUT_X_L_ADDR),
67 	ST_SENSORS_LSM_CHANNELS(IIO_ACCEL,
68 			BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
69 			ST_SENSORS_SCAN_Y, 1, IIO_MOD_Y, 's', IIO_LE, 12, 16,
70 			ST_ACCEL_DEFAULT_OUT_Y_L_ADDR),
71 	ST_SENSORS_LSM_CHANNELS(IIO_ACCEL,
72 			BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
73 			ST_SENSORS_SCAN_Z, 1, IIO_MOD_Z, 's', IIO_LE, 12, 16,
74 			ST_ACCEL_DEFAULT_OUT_Z_L_ADDR),
75 	IIO_CHAN_SOFT_TIMESTAMP(3)
76 };
77 
78 static const struct iio_chan_spec st_accel_16bit_channels[] = {
79 	ST_SENSORS_LSM_CHANNELS(IIO_ACCEL,
80 			BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
81 			ST_SENSORS_SCAN_X, 1, IIO_MOD_X, 's', IIO_LE, 16, 16,
82 			ST_ACCEL_DEFAULT_OUT_X_L_ADDR),
83 	ST_SENSORS_LSM_CHANNELS(IIO_ACCEL,
84 			BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
85 			ST_SENSORS_SCAN_Y, 1, IIO_MOD_Y, 's', IIO_LE, 16, 16,
86 			ST_ACCEL_DEFAULT_OUT_Y_L_ADDR),
87 	ST_SENSORS_LSM_CHANNELS(IIO_ACCEL,
88 			BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
89 			ST_SENSORS_SCAN_Z, 1, IIO_MOD_Z, 's', IIO_LE, 16, 16,
90 			ST_ACCEL_DEFAULT_OUT_Z_L_ADDR),
91 	IIO_CHAN_SOFT_TIMESTAMP(3)
92 };
93 
94 static const struct st_sensor_settings st_accel_sensors_settings[] = {
95 	{
96 		.wai = 0x33,
97 		.wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
98 		.sensors_supported = {
99 			[0] = LIS3DH_ACCEL_DEV_NAME,
100 			[1] = LSM303DLHC_ACCEL_DEV_NAME,
101 			[2] = LSM330D_ACCEL_DEV_NAME,
102 			[3] = LSM330DL_ACCEL_DEV_NAME,
103 			[4] = LSM330DLC_ACCEL_DEV_NAME,
104 			[5] = LSM303AGR_ACCEL_DEV_NAME,
105 			[6] = LIS2DH12_ACCEL_DEV_NAME,
106 		},
107 		.ch = (struct iio_chan_spec *)st_accel_12bit_channels,
108 		.odr = {
109 			.addr = 0x20,
110 			.mask = 0xf0,
111 			.odr_avl = {
112 				{ .hz = 1, .value = 0x01, },
113 				{ .hz = 10, .value = 0x02, },
114 				{ .hz = 25, .value = 0x03, },
115 				{ .hz = 50, .value = 0x04, },
116 				{ .hz = 100, .value = 0x05, },
117 				{ .hz = 200, .value = 0x06, },
118 				{ .hz = 400, .value = 0x07, },
119 				{ .hz = 1600, .value = 0x08, },
120 			},
121 		},
122 		.pw = {
123 			.addr = 0x20,
124 			.mask = 0xf0,
125 			.value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
126 		},
127 		.enable_axis = {
128 			.addr = ST_SENSORS_DEFAULT_AXIS_ADDR,
129 			.mask = ST_SENSORS_DEFAULT_AXIS_MASK,
130 		},
131 		.fs = {
132 			.addr = 0x23,
133 			.mask = 0x30,
134 			.fs_avl = {
135 				[0] = {
136 					.num = ST_ACCEL_FS_AVL_2G,
137 					.value = 0x00,
138 					.gain = IIO_G_TO_M_S_2(1000),
139 				},
140 				[1] = {
141 					.num = ST_ACCEL_FS_AVL_4G,
142 					.value = 0x01,
143 					.gain = IIO_G_TO_M_S_2(2000),
144 				},
145 				[2] = {
146 					.num = ST_ACCEL_FS_AVL_8G,
147 					.value = 0x02,
148 					.gain = IIO_G_TO_M_S_2(4000),
149 				},
150 				[3] = {
151 					.num = ST_ACCEL_FS_AVL_16G,
152 					.value = 0x03,
153 					.gain = IIO_G_TO_M_S_2(12000),
154 				},
155 			},
156 		},
157 		.bdu = {
158 			.addr = 0x23,
159 			.mask = 0x80,
160 		},
161 		.drdy_irq = {
162 			.int1 = {
163 				.addr = 0x22,
164 				.mask = 0x10,
165 			},
166 			.addr_ihl = 0x25,
167 			.mask_ihl = 0x02,
168 			.stat_drdy = {
169 				.addr = ST_SENSORS_DEFAULT_STAT_ADDR,
170 				.mask = 0x07,
171 			},
172 		},
173 		.sim = {
174 			.addr = 0x23,
175 			.value = BIT(0),
176 		},
177 		.multi_read_bit = true,
178 		.bootime = 2,
179 	},
180 	{
181 		.wai = 0x32,
182 		.wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
183 		.sensors_supported = {
184 			[0] = LIS331DLH_ACCEL_DEV_NAME,
185 			[1] = LSM303DL_ACCEL_DEV_NAME,
186 			[2] = LSM303DLH_ACCEL_DEV_NAME,
187 			[3] = LSM303DLM_ACCEL_DEV_NAME,
188 		},
189 		.ch = (struct iio_chan_spec *)st_accel_12bit_channels,
190 		.odr = {
191 			.addr = 0x20,
192 			.mask = 0x18,
193 			.odr_avl = {
194 				{ .hz = 50, .value = 0x00, },
195 				{ .hz = 100, .value = 0x01, },
196 				{ .hz = 400, .value = 0x02, },
197 				{ .hz = 1000, .value = 0x03, },
198 			},
199 		},
200 		.pw = {
201 			.addr = 0x20,
202 			.mask = 0xe0,
203 			.value_on = ST_SENSORS_DEFAULT_POWER_ON_VALUE,
204 			.value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
205 		},
206 		.enable_axis = {
207 			.addr = ST_SENSORS_DEFAULT_AXIS_ADDR,
208 			.mask = ST_SENSORS_DEFAULT_AXIS_MASK,
209 		},
210 		.fs = {
211 			.addr = 0x23,
212 			.mask = 0x30,
213 			.fs_avl = {
214 				[0] = {
215 					.num = ST_ACCEL_FS_AVL_2G,
216 					.value = 0x00,
217 					.gain = IIO_G_TO_M_S_2(1000),
218 				},
219 				[1] = {
220 					.num = ST_ACCEL_FS_AVL_4G,
221 					.value = 0x01,
222 					.gain = IIO_G_TO_M_S_2(2000),
223 				},
224 				[2] = {
225 					.num = ST_ACCEL_FS_AVL_8G,
226 					.value = 0x03,
227 					.gain = IIO_G_TO_M_S_2(3900),
228 				},
229 			},
230 		},
231 		.bdu = {
232 			.addr = 0x23,
233 			.mask = 0x80,
234 		},
235 		.drdy_irq = {
236 			.int1 = {
237 				.addr = 0x22,
238 				.mask = 0x02,
239 				.addr_od = 0x22,
240 				.mask_od = 0x40,
241 			},
242 			.int2 = {
243 				.addr = 0x22,
244 				.mask = 0x10,
245 				.addr_od = 0x22,
246 				.mask_od = 0x40,
247 			},
248 			.addr_ihl = 0x22,
249 			.mask_ihl = 0x80,
250 			.stat_drdy = {
251 				.addr = ST_SENSORS_DEFAULT_STAT_ADDR,
252 				.mask = 0x07,
253 			},
254 		},
255 		.sim = {
256 			.addr = 0x23,
257 			.value = BIT(0),
258 		},
259 		.multi_read_bit = true,
260 		.bootime = 2,
261 	},
262 	{
263 		.wai = 0x40,
264 		.wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
265 		.sensors_supported = {
266 			[0] = LSM330_ACCEL_DEV_NAME,
267 		},
268 		.ch = (struct iio_chan_spec *)st_accel_16bit_channels,
269 		.odr = {
270 			.addr = 0x20,
271 			.mask = 0xf0,
272 			.odr_avl = {
273 				{ .hz = 3, .value = 0x01, },
274 				{ .hz = 6, .value = 0x02, },
275 				{ .hz = 12, .value = 0x03, },
276 				{ .hz = 25, .value = 0x04, },
277 				{ .hz = 50, .value = 0x05, },
278 				{ .hz = 100, .value = 0x06, },
279 				{ .hz = 200, .value = 0x07, },
280 				{ .hz = 400, .value = 0x08, },
281 				{ .hz = 800, .value = 0x09, },
282 				{ .hz = 1600, .value = 0x0a, },
283 			},
284 		},
285 		.pw = {
286 			.addr = 0x20,
287 			.mask = 0xf0,
288 			.value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
289 		},
290 		.enable_axis = {
291 			.addr = ST_SENSORS_DEFAULT_AXIS_ADDR,
292 			.mask = ST_SENSORS_DEFAULT_AXIS_MASK,
293 		},
294 		.fs = {
295 			.addr = 0x24,
296 			.mask = 0x38,
297 			.fs_avl = {
298 				[0] = {
299 					.num = ST_ACCEL_FS_AVL_2G,
300 					.value = 0x00,
301 					.gain = IIO_G_TO_M_S_2(61),
302 				},
303 				[1] = {
304 					.num = ST_ACCEL_FS_AVL_4G,
305 					.value = 0x01,
306 					.gain = IIO_G_TO_M_S_2(122),
307 				},
308 				[2] = {
309 					.num = ST_ACCEL_FS_AVL_6G,
310 					.value = 0x02,
311 					.gain = IIO_G_TO_M_S_2(183),
312 				},
313 				[3] = {
314 					.num = ST_ACCEL_FS_AVL_8G,
315 					.value = 0x03,
316 					.gain = IIO_G_TO_M_S_2(244),
317 				},
318 				[4] = {
319 					.num = ST_ACCEL_FS_AVL_16G,
320 					.value = 0x04,
321 					.gain = IIO_G_TO_M_S_2(732),
322 				},
323 			},
324 		},
325 		.bdu = {
326 			.addr = 0x20,
327 			.mask = 0x08,
328 		},
329 		.drdy_irq = {
330 			.int1 = {
331 				.addr = 0x23,
332 				.mask = 0x80,
333 			},
334 			.addr_ihl = 0x23,
335 			.mask_ihl = 0x40,
336 			.stat_drdy = {
337 				.addr = ST_SENSORS_DEFAULT_STAT_ADDR,
338 				.mask = 0x07,
339 			},
340 			.ig1 = {
341 				.en_addr = 0x23,
342 				.en_mask = 0x08,
343 			},
344 		},
345 		.sim = {
346 			.addr = 0x24,
347 			.value = BIT(0),
348 		},
349 		.multi_read_bit = false,
350 		.bootime = 2,
351 	},
352 	{
353 		.wai = 0x3a,
354 		.wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
355 		.sensors_supported = {
356 			[0] = LIS3LV02DL_ACCEL_DEV_NAME,
357 		},
358 		.ch = (struct iio_chan_spec *)st_accel_12bit_channels,
359 		.odr = {
360 			.addr = 0x20,
361 			.mask = 0x30, /* DF1 and DF0 */
362 			.odr_avl = {
363 				{ .hz = 40, .value = 0x00, },
364 				{ .hz = 160, .value = 0x01, },
365 				{ .hz = 640, .value = 0x02, },
366 				{ .hz = 2560, .value = 0x03, },
367 			},
368 		},
369 		.pw = {
370 			.addr = 0x20,
371 			.mask = 0xc0,
372 			.value_on = ST_SENSORS_DEFAULT_POWER_ON_VALUE,
373 			.value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
374 		},
375 		.enable_axis = {
376 			.addr = ST_SENSORS_DEFAULT_AXIS_ADDR,
377 			.mask = ST_SENSORS_DEFAULT_AXIS_MASK,
378 		},
379 		.fs = {
380 			.addr = 0x21,
381 			.mask = 0x80,
382 			.fs_avl = {
383 				[0] = {
384 					.num = ST_ACCEL_FS_AVL_2G,
385 					.value = 0x00,
386 					.gain = IIO_G_TO_M_S_2(1000),
387 				},
388 				[1] = {
389 					.num = ST_ACCEL_FS_AVL_6G,
390 					.value = 0x01,
391 					.gain = IIO_G_TO_M_S_2(3000),
392 				},
393 			},
394 		},
395 		.bdu = {
396 			.addr = 0x21,
397 			.mask = 0x40,
398 		},
399 		/*
400 		 * Data Alignment Setting - needs to be set to get
401 		 * left-justified data like all other sensors.
402 		 */
403 		.das = {
404 			.addr = 0x21,
405 			.mask = 0x01,
406 		},
407 		.drdy_irq = {
408 			.int1 = {
409 				.addr = 0x21,
410 				.mask = 0x04,
411 			},
412 			.stat_drdy = {
413 				.addr = ST_SENSORS_DEFAULT_STAT_ADDR,
414 				.mask = 0x07,
415 			},
416 		},
417 		.sim = {
418 			.addr = 0x21,
419 			.value = BIT(1),
420 		},
421 		.multi_read_bit = true,
422 		.bootime = 2, /* guess */
423 	},
424 	{
425 		.wai = 0x3b,
426 		.wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
427 		.sensors_supported = {
428 			[0] = LIS331DL_ACCEL_DEV_NAME,
429 		},
430 		.ch = (struct iio_chan_spec *)st_accel_8bit_channels,
431 		.odr = {
432 			.addr = 0x20,
433 			.mask = 0x80,
434 			.odr_avl = {
435 				{ .hz = 100, .value = 0x00, },
436 				{ .hz = 400, .value = 0x01, },
437 			},
438 		},
439 		.pw = {
440 			.addr = 0x20,
441 			.mask = 0x40,
442 			.value_on = ST_SENSORS_DEFAULT_POWER_ON_VALUE,
443 			.value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
444 		},
445 		.enable_axis = {
446 			.addr = ST_SENSORS_DEFAULT_AXIS_ADDR,
447 			.mask = ST_SENSORS_DEFAULT_AXIS_MASK,
448 		},
449 		.fs = {
450 			.addr = 0x20,
451 			.mask = 0x20,
452 			/*
453 			 * TODO: check these resulting gain settings, these are
454 			 * not in the datsheet
455 			 */
456 			.fs_avl = {
457 				[0] = {
458 					.num = ST_ACCEL_FS_AVL_2G,
459 					.value = 0x00,
460 					.gain = IIO_G_TO_M_S_2(18000),
461 				},
462 				[1] = {
463 					.num = ST_ACCEL_FS_AVL_8G,
464 					.value = 0x01,
465 					.gain = IIO_G_TO_M_S_2(72000),
466 				},
467 			},
468 		},
469 		.drdy_irq = {
470 			.int1 = {
471 				.addr = 0x22,
472 				.mask = 0x04,
473 				.addr_od = 0x22,
474 				.mask_od = 0x40,
475 			},
476 			.int2 = {
477 				.addr = 0x22,
478 				.mask = 0x20,
479 				.addr_od = 0x22,
480 				.mask_od = 0x40,
481 			},
482 			.addr_ihl = 0x22,
483 			.mask_ihl = 0x80,
484 			.stat_drdy = {
485 				.addr = ST_SENSORS_DEFAULT_STAT_ADDR,
486 				.mask = 0x07,
487 			},
488 		},
489 		.sim = {
490 			.addr = 0x21,
491 			.value = BIT(7),
492 		},
493 		.multi_read_bit = false,
494 		.bootime = 2, /* guess */
495 	},
496 	{
497 		.wai = 0x32,
498 		.wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
499 		.sensors_supported = {
500 			[0] = H3LIS331DL_ACCEL_DEV_NAME,
501 		},
502 		.ch = (struct iio_chan_spec *)st_accel_12bit_channels,
503 		.odr = {
504 			.addr = 0x20,
505 			.mask = 0x18,
506 			.odr_avl = {
507 				{ .hz = 50, .value = 0x00, },
508 				{ .hz = 100, .value = 0x01, },
509 				{ .hz = 400, .value = 0x02, },
510 				{ .hz = 1000, .value = 0x03, },
511 			},
512 		},
513 		.pw = {
514 			.addr = 0x20,
515 			.mask = 0x20,
516 			.value_on = ST_SENSORS_DEFAULT_POWER_ON_VALUE,
517 			.value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
518 		},
519 		.enable_axis = {
520 			.addr = ST_SENSORS_DEFAULT_AXIS_ADDR,
521 			.mask = ST_SENSORS_DEFAULT_AXIS_MASK,
522 		},
523 		.fs = {
524 			.addr = 0x23,
525 			.mask = 0x30,
526 			.fs_avl = {
527 				[0] = {
528 					.num = ST_ACCEL_FS_AVL_100G,
529 					.value = 0x00,
530 					.gain = IIO_G_TO_M_S_2(49000),
531 				},
532 				[1] = {
533 					.num = ST_ACCEL_FS_AVL_200G,
534 					.value = 0x01,
535 					.gain = IIO_G_TO_M_S_2(98000),
536 				},
537 				[2] = {
538 					.num = ST_ACCEL_FS_AVL_400G,
539 					.value = 0x03,
540 					.gain = IIO_G_TO_M_S_2(195000),
541 				},
542 			},
543 		},
544 		.bdu = {
545 			.addr = 0x23,
546 			.mask = 0x80,
547 		},
548 		.drdy_irq = {
549 			.int1 = {
550 				.addr = 0x22,
551 				.mask = 0x02,
552 			},
553 			.int2 = {
554 				.addr = 0x22,
555 				.mask = 0x10,
556 			},
557 			.addr_ihl = 0x22,
558 			.mask_ihl = 0x80,
559 		},
560 		.sim = {
561 			.addr = 0x23,
562 			.value = BIT(0),
563 		},
564 		.multi_read_bit = true,
565 		.bootime = 2,
566 	},
567 	{
568 		/* No WAI register present */
569 		.sensors_supported = {
570 			[0] = LIS3L02DQ_ACCEL_DEV_NAME,
571 		},
572 		.ch = (struct iio_chan_spec *)st_accel_12bit_channels,
573 		.odr = {
574 			.addr = 0x20,
575 			.mask = 0x30,
576 			.odr_avl = {
577 				{ .hz = 280, .value = 0x00, },
578 				{ .hz = 560, .value = 0x01, },
579 				{ .hz = 1120, .value = 0x02, },
580 				{ .hz = 4480, .value = 0x03, },
581 			},
582 		},
583 		.pw = {
584 			.addr = 0x20,
585 			.mask = 0xc0,
586 			.value_on = ST_SENSORS_DEFAULT_POWER_ON_VALUE,
587 			.value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
588 		},
589 		.enable_axis = {
590 			.addr = ST_SENSORS_DEFAULT_AXIS_ADDR,
591 			.mask = ST_SENSORS_DEFAULT_AXIS_MASK,
592 		},
593 		.fs = {
594 			.fs_avl = {
595 				[0] = {
596 					.num = ST_ACCEL_FS_AVL_2G,
597 					.gain = IIO_G_TO_M_S_2(488),
598 				},
599 			},
600 		},
601 		/*
602 		 * The part has a BDU bit but if set the data is never
603 		 * updated so don't set it.
604 		 */
605 		.bdu = {
606 		},
607 		.drdy_irq = {
608 			.int1 = {
609 				.addr = 0x21,
610 				.mask = 0x04,
611 			},
612 			.stat_drdy = {
613 				.addr = ST_SENSORS_DEFAULT_STAT_ADDR,
614 				.mask = 0x07,
615 			},
616 		},
617 		.sim = {
618 			.addr = 0x21,
619 			.value = BIT(1),
620 		},
621 		.multi_read_bit = false,
622 		.bootime = 2,
623 	},
624 	{
625 		.wai = 0x33,
626 		.wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
627 		.sensors_supported = {
628 			[0] = LNG2DM_ACCEL_DEV_NAME,
629 		},
630 		.ch = (struct iio_chan_spec *)st_accel_8bit_channels,
631 		.odr = {
632 			.addr = 0x20,
633 			.mask = 0xf0,
634 			.odr_avl = {
635 				{ .hz = 1, .value = 0x01, },
636 				{ .hz = 10, .value = 0x02, },
637 				{ .hz = 25, .value = 0x03, },
638 				{ .hz = 50, .value = 0x04, },
639 				{ .hz = 100, .value = 0x05, },
640 				{ .hz = 200, .value = 0x06, },
641 				{ .hz = 400, .value = 0x07, },
642 				{ .hz = 1600, .value = 0x08, },
643 			},
644 		},
645 		.pw = {
646 			.addr = 0x20,
647 			.mask = 0xf0,
648 			.value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
649 		},
650 		.enable_axis = {
651 			.addr = ST_SENSORS_DEFAULT_AXIS_ADDR,
652 			.mask = ST_SENSORS_DEFAULT_AXIS_MASK,
653 		},
654 		.fs = {
655 			.addr = 0x23,
656 			.mask = 0x30,
657 			.fs_avl = {
658 				[0] = {
659 					.num = ST_ACCEL_FS_AVL_2G,
660 					.value = 0x00,
661 					.gain = IIO_G_TO_M_S_2(15600),
662 				},
663 				[1] = {
664 					.num = ST_ACCEL_FS_AVL_4G,
665 					.value = 0x01,
666 					.gain = IIO_G_TO_M_S_2(31200),
667 				},
668 				[2] = {
669 					.num = ST_ACCEL_FS_AVL_8G,
670 					.value = 0x02,
671 					.gain = IIO_G_TO_M_S_2(62500),
672 				},
673 				[3] = {
674 					.num = ST_ACCEL_FS_AVL_16G,
675 					.value = 0x03,
676 					.gain = IIO_G_TO_M_S_2(187500),
677 				},
678 			},
679 		},
680 		.drdy_irq = {
681 			.int1 = {
682 				.addr = 0x22,
683 				.mask = 0x10,
684 			},
685 			.addr_ihl = 0x25,
686 			.mask_ihl = 0x02,
687 			.stat_drdy = {
688 				.addr = ST_SENSORS_DEFAULT_STAT_ADDR,
689 				.mask = 0x07,
690 			},
691 		},
692 		.sim = {
693 			.addr = 0x23,
694 			.value = BIT(0),
695 		},
696 		.multi_read_bit = true,
697 		.bootime = 2,
698 	},
699 	{
700 		.wai = 0x44,
701 		.wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
702 		.sensors_supported = {
703 			[0] = LIS2DW12_ACCEL_DEV_NAME,
704 		},
705 		.ch = (struct iio_chan_spec *)st_accel_12bit_channels,
706 		.odr = {
707 			.addr = 0x20,
708 			.mask = 0xf0,
709 			.odr_avl = {
710 				{ .hz = 1, .value = 0x01, },
711 				{ .hz = 12, .value = 0x02, },
712 				{ .hz = 25, .value = 0x03, },
713 				{ .hz = 50, .value = 0x04, },
714 				{ .hz = 100, .value = 0x05, },
715 				{ .hz = 200, .value = 0x06, },
716 			},
717 		},
718 		.pw = {
719 			.addr = 0x20,
720 			.mask = 0xf0,
721 			.value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
722 		},
723 		.fs = {
724 			.addr = 0x25,
725 			.mask = 0x30,
726 			.fs_avl = {
727 				[0] = {
728 					.num = ST_ACCEL_FS_AVL_2G,
729 					.value = 0x00,
730 					.gain = IIO_G_TO_M_S_2(976),
731 				},
732 				[1] = {
733 					.num = ST_ACCEL_FS_AVL_4G,
734 					.value = 0x01,
735 					.gain = IIO_G_TO_M_S_2(1952),
736 				},
737 				[2] = {
738 					.num = ST_ACCEL_FS_AVL_8G,
739 					.value = 0x02,
740 					.gain = IIO_G_TO_M_S_2(3904),
741 				},
742 				[3] = {
743 					.num = ST_ACCEL_FS_AVL_16G,
744 					.value = 0x03,
745 					.gain = IIO_G_TO_M_S_2(7808),
746 				},
747 			},
748 		},
749 		.bdu = {
750 			.addr = 0x21,
751 			.mask = 0x08,
752 		},
753 		.drdy_irq = {
754 			.int1 = {
755 				.addr = 0x23,
756 				.mask = 0x01,
757 				.addr_od = 0x22,
758 				.mask_od = 0x20,
759 			},
760 			.int2 = {
761 				.addr = 0x24,
762 				.mask = 0x01,
763 				.addr_od = 0x22,
764 				.mask_od = 0x20,
765 			},
766 			.addr_ihl = 0x22,
767 			.mask_ihl = 0x08,
768 			.stat_drdy = {
769 				.addr = ST_SENSORS_DEFAULT_STAT_ADDR,
770 				.mask = 0x01,
771 			},
772 		},
773 		.sim = {
774 			.addr = 0x21,
775 			.value = BIT(0),
776 		},
777 		.multi_read_bit = false,
778 		.bootime = 2,
779 	},
780 	{
781 		.wai = 0x11,
782 		.wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
783 		.sensors_supported = {
784 			[0] = LIS3DHH_ACCEL_DEV_NAME,
785 		},
786 		.ch = (struct iio_chan_spec *)st_accel_16bit_channels,
787 		.odr = {
788 			/* just ODR = 1100Hz available */
789 			.odr_avl = {
790 				{ .hz = 1100, .value = 0x00, },
791 			},
792 		},
793 		.pw = {
794 			.addr = 0x20,
795 			.mask = 0x80,
796 			.value_on = ST_SENSORS_DEFAULT_POWER_ON_VALUE,
797 			.value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
798 		},
799 		.fs = {
800 			.fs_avl = {
801 				[0] = {
802 					.num = ST_ACCEL_FS_AVL_2G,
803 					.gain = IIO_G_TO_M_S_2(76),
804 				},
805 			},
806 		},
807 		.bdu = {
808 			.addr = 0x20,
809 			.mask = 0x01,
810 		},
811 		.drdy_irq = {
812 			.int1 = {
813 				.addr = 0x21,
814 				.mask = 0x80,
815 				.addr_od = 0x23,
816 				.mask_od = 0x04,
817 			},
818 			.int2 = {
819 				.addr = 0x22,
820 				.mask = 0x80,
821 				.addr_od = 0x23,
822 				.mask_od = 0x08,
823 			},
824 			.stat_drdy = {
825 				.addr = ST_SENSORS_DEFAULT_STAT_ADDR,
826 				.mask = 0x07,
827 			},
828 		},
829 		.multi_read_bit = false,
830 		.bootime = 2,
831 	},
832 };
833 
834 static int st_accel_read_raw(struct iio_dev *indio_dev,
835 			struct iio_chan_spec const *ch, int *val,
836 							int *val2, long mask)
837 {
838 	int err;
839 	struct st_sensor_data *adata = iio_priv(indio_dev);
840 
841 	switch (mask) {
842 	case IIO_CHAN_INFO_RAW:
843 		err = st_sensors_read_info_raw(indio_dev, ch, val);
844 		if (err < 0)
845 			goto read_error;
846 
847 		return IIO_VAL_INT;
848 	case IIO_CHAN_INFO_SCALE:
849 		*val = adata->current_fullscale->gain / 1000000;
850 		*val2 = adata->current_fullscale->gain % 1000000;
851 		return IIO_VAL_INT_PLUS_MICRO;
852 	case IIO_CHAN_INFO_SAMP_FREQ:
853 		*val = adata->odr;
854 		return IIO_VAL_INT;
855 	default:
856 		return -EINVAL;
857 	}
858 
859 read_error:
860 	return err;
861 }
862 
863 static int st_accel_write_raw(struct iio_dev *indio_dev,
864 		struct iio_chan_spec const *chan, int val, int val2, long mask)
865 {
866 	int err;
867 
868 	switch (mask) {
869 	case IIO_CHAN_INFO_SCALE: {
870 		int gain;
871 
872 		gain = val * 1000000 + val2;
873 		err = st_sensors_set_fullscale_by_gain(indio_dev, gain);
874 		break;
875 	}
876 	case IIO_CHAN_INFO_SAMP_FREQ:
877 		if (val2)
878 			return -EINVAL;
879 		mutex_lock(&indio_dev->mlock);
880 		err = st_sensors_set_odr(indio_dev, val);
881 		mutex_unlock(&indio_dev->mlock);
882 		return err;
883 	default:
884 		return -EINVAL;
885 	}
886 
887 	return err;
888 }
889 
890 static ST_SENSORS_DEV_ATTR_SAMP_FREQ_AVAIL();
891 static ST_SENSORS_DEV_ATTR_SCALE_AVAIL(in_accel_scale_available);
892 
893 static struct attribute *st_accel_attributes[] = {
894 	&iio_dev_attr_sampling_frequency_available.dev_attr.attr,
895 	&iio_dev_attr_in_accel_scale_available.dev_attr.attr,
896 	NULL,
897 };
898 
899 static const struct attribute_group st_accel_attribute_group = {
900 	.attrs = st_accel_attributes,
901 };
902 
903 static const struct iio_info accel_info = {
904 	.attrs = &st_accel_attribute_group,
905 	.read_raw = &st_accel_read_raw,
906 	.write_raw = &st_accel_write_raw,
907 	.debugfs_reg_access = &st_sensors_debugfs_reg_access,
908 };
909 
910 #ifdef CONFIG_IIO_TRIGGER
911 static const struct iio_trigger_ops st_accel_trigger_ops = {
912 	.set_trigger_state = ST_ACCEL_TRIGGER_SET_STATE,
913 	.validate_device = st_sensors_validate_device,
914 };
915 #define ST_ACCEL_TRIGGER_OPS (&st_accel_trigger_ops)
916 #else
917 #define ST_ACCEL_TRIGGER_OPS NULL
918 #endif
919 
920 int st_accel_common_probe(struct iio_dev *indio_dev)
921 {
922 	struct st_sensor_data *adata = iio_priv(indio_dev);
923 	struct st_sensors_platform_data *pdata =
924 		(struct st_sensors_platform_data *)adata->dev->platform_data;
925 	int irq = adata->get_irq_data_ready(indio_dev);
926 	int err;
927 
928 	indio_dev->modes = INDIO_DIRECT_MODE;
929 	indio_dev->info = &accel_info;
930 	mutex_init(&adata->tb.buf_lock);
931 
932 	err = st_sensors_power_enable(indio_dev);
933 	if (err)
934 		return err;
935 
936 	err = st_sensors_check_device_support(indio_dev,
937 					ARRAY_SIZE(st_accel_sensors_settings),
938 					st_accel_sensors_settings);
939 	if (err < 0)
940 		goto st_accel_power_off;
941 
942 	adata->num_data_channels = ST_ACCEL_NUMBER_DATA_CHANNELS;
943 	adata->multiread_bit = adata->sensor_settings->multi_read_bit;
944 	indio_dev->channels = adata->sensor_settings->ch;
945 	indio_dev->num_channels = ST_SENSORS_NUMBER_ALL_CHANNELS;
946 
947 	adata->current_fullscale = (struct st_sensor_fullscale_avl *)
948 					&adata->sensor_settings->fs.fs_avl[0];
949 	adata->odr = adata->sensor_settings->odr.odr_avl[0].hz;
950 
951 	if (!pdata)
952 		pdata = (struct st_sensors_platform_data *)&default_accel_pdata;
953 
954 	err = st_sensors_init_sensor(indio_dev, pdata);
955 	if (err < 0)
956 		goto st_accel_power_off;
957 
958 	err = st_accel_allocate_ring(indio_dev);
959 	if (err < 0)
960 		goto st_accel_power_off;
961 
962 	if (irq > 0) {
963 		err = st_sensors_allocate_trigger(indio_dev,
964 						 ST_ACCEL_TRIGGER_OPS);
965 		if (err < 0)
966 			goto st_accel_probe_trigger_error;
967 	}
968 
969 	err = iio_device_register(indio_dev);
970 	if (err)
971 		goto st_accel_device_register_error;
972 
973 	dev_info(&indio_dev->dev, "registered accelerometer %s\n",
974 		 indio_dev->name);
975 
976 	return 0;
977 
978 st_accel_device_register_error:
979 	if (irq > 0)
980 		st_sensors_deallocate_trigger(indio_dev);
981 st_accel_probe_trigger_error:
982 	st_accel_deallocate_ring(indio_dev);
983 st_accel_power_off:
984 	st_sensors_power_disable(indio_dev);
985 
986 	return err;
987 }
988 EXPORT_SYMBOL(st_accel_common_probe);
989 
990 void st_accel_common_remove(struct iio_dev *indio_dev)
991 {
992 	struct st_sensor_data *adata = iio_priv(indio_dev);
993 
994 	st_sensors_power_disable(indio_dev);
995 
996 	iio_device_unregister(indio_dev);
997 	if (adata->get_irq_data_ready(indio_dev) > 0)
998 		st_sensors_deallocate_trigger(indio_dev);
999 
1000 	st_accel_deallocate_ring(indio_dev);
1001 }
1002 EXPORT_SYMBOL(st_accel_common_remove);
1003 
1004 MODULE_AUTHOR("Denis Ciocca <denis.ciocca@st.com>");
1005 MODULE_DESCRIPTION("STMicroelectronics accelerometers driver");
1006 MODULE_LICENSE("GPL v2");
1007