xref: /linux/drivers/iio/accel/st_accel_core.c (revision bdd1a21b52557ea8f61d0a5dc2f77151b576eb70)
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/module.h>
12 #include <linux/slab.h>
13 #include <linux/acpi.h>
14 #include <linux/errno.h>
15 #include <linux/types.h>
16 #include <linux/interrupt.h>
17 #include <linux/i2c.h>
18 #include <linux/irq.h>
19 #include <linux/iio/iio.h>
20 #include <linux/iio/sysfs.h>
21 #include <linux/iio/trigger.h>
22 #include <linux/iio/buffer.h>
23 
24 #include <linux/iio/common/st_sensors.h>
25 #include "st_accel.h"
26 
27 #define ST_ACCEL_NUMBER_DATA_CHANNELS		3
28 
29 /* DEFAULT VALUE FOR SENSORS */
30 #define ST_ACCEL_DEFAULT_OUT_X_L_ADDR		0x28
31 #define ST_ACCEL_DEFAULT_OUT_Y_L_ADDR		0x2a
32 #define ST_ACCEL_DEFAULT_OUT_Z_L_ADDR		0x2c
33 
34 /* FULLSCALE */
35 #define ST_ACCEL_FS_AVL_2G			2
36 #define ST_ACCEL_FS_AVL_4G			4
37 #define ST_ACCEL_FS_AVL_6G			6
38 #define ST_ACCEL_FS_AVL_8G			8
39 #define ST_ACCEL_FS_AVL_16G			16
40 #define ST_ACCEL_FS_AVL_100G			100
41 #define ST_ACCEL_FS_AVL_200G			200
42 #define ST_ACCEL_FS_AVL_400G			400
43 
44 static const struct iio_mount_matrix *
45 st_accel_get_mount_matrix(const struct iio_dev *indio_dev,
46 			  const struct iio_chan_spec *chan)
47 {
48 	struct st_sensor_data *adata = iio_priv(indio_dev);
49 
50 	return &adata->mount_matrix;
51 }
52 
53 static const struct iio_chan_spec_ext_info st_accel_mount_matrix_ext_info[] = {
54 	IIO_MOUNT_MATRIX(IIO_SHARED_BY_ALL, st_accel_get_mount_matrix),
55 	{ }
56 };
57 
58 static const struct iio_chan_spec st_accel_8bit_channels[] = {
59 	ST_SENSORS_LSM_CHANNELS_EXT(IIO_ACCEL,
60 			BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
61 			ST_SENSORS_SCAN_X, 1, IIO_MOD_X, 's', IIO_LE, 8, 8,
62 			ST_ACCEL_DEFAULT_OUT_X_L_ADDR+1,
63 			st_accel_mount_matrix_ext_info),
64 	ST_SENSORS_LSM_CHANNELS_EXT(IIO_ACCEL,
65 			BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
66 			ST_SENSORS_SCAN_Y, 1, IIO_MOD_Y, 's', IIO_LE, 8, 8,
67 			ST_ACCEL_DEFAULT_OUT_Y_L_ADDR+1,
68 			st_accel_mount_matrix_ext_info),
69 	ST_SENSORS_LSM_CHANNELS_EXT(IIO_ACCEL,
70 			BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
71 			ST_SENSORS_SCAN_Z, 1, IIO_MOD_Z, 's', IIO_LE, 8, 8,
72 			ST_ACCEL_DEFAULT_OUT_Z_L_ADDR+1,
73 			st_accel_mount_matrix_ext_info),
74 	IIO_CHAN_SOFT_TIMESTAMP(3)
75 };
76 
77 static const struct iio_chan_spec st_accel_12bit_channels[] = {
78 	ST_SENSORS_LSM_CHANNELS_EXT(IIO_ACCEL,
79 			BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
80 			ST_SENSORS_SCAN_X, 1, IIO_MOD_X, 's', IIO_LE, 12, 16,
81 			ST_ACCEL_DEFAULT_OUT_X_L_ADDR,
82 			st_accel_mount_matrix_ext_info),
83 	ST_SENSORS_LSM_CHANNELS_EXT(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, 12, 16,
86 			ST_ACCEL_DEFAULT_OUT_Y_L_ADDR,
87 			st_accel_mount_matrix_ext_info),
88 	ST_SENSORS_LSM_CHANNELS_EXT(IIO_ACCEL,
89 			BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
90 			ST_SENSORS_SCAN_Z, 1, IIO_MOD_Z, 's', IIO_LE, 12, 16,
91 			ST_ACCEL_DEFAULT_OUT_Z_L_ADDR,
92 			st_accel_mount_matrix_ext_info),
93 	IIO_CHAN_SOFT_TIMESTAMP(3)
94 };
95 
96 static const struct iio_chan_spec st_accel_16bit_channels[] = {
97 	ST_SENSORS_LSM_CHANNELS_EXT(IIO_ACCEL,
98 			BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
99 			ST_SENSORS_SCAN_X, 1, IIO_MOD_X, 's', IIO_LE, 16, 16,
100 			ST_ACCEL_DEFAULT_OUT_X_L_ADDR,
101 			st_accel_mount_matrix_ext_info),
102 	ST_SENSORS_LSM_CHANNELS_EXT(IIO_ACCEL,
103 			BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
104 			ST_SENSORS_SCAN_Y, 1, IIO_MOD_Y, 's', IIO_LE, 16, 16,
105 			ST_ACCEL_DEFAULT_OUT_Y_L_ADDR,
106 			st_accel_mount_matrix_ext_info),
107 	ST_SENSORS_LSM_CHANNELS_EXT(IIO_ACCEL,
108 			BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
109 			ST_SENSORS_SCAN_Z, 1, IIO_MOD_Z, 's', IIO_LE, 16, 16,
110 			ST_ACCEL_DEFAULT_OUT_Z_L_ADDR,
111 			st_accel_mount_matrix_ext_info),
112 	IIO_CHAN_SOFT_TIMESTAMP(3)
113 };
114 
115 static const struct st_sensor_settings st_accel_sensors_settings[] = {
116 	{
117 		.wai = 0x33,
118 		.wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
119 		.sensors_supported = {
120 			[0] = LIS3DH_ACCEL_DEV_NAME,
121 			[1] = LSM303DLHC_ACCEL_DEV_NAME,
122 			[2] = LSM330D_ACCEL_DEV_NAME,
123 			[3] = LSM330DL_ACCEL_DEV_NAME,
124 			[4] = LSM330DLC_ACCEL_DEV_NAME,
125 			[5] = LSM303AGR_ACCEL_DEV_NAME,
126 			[6] = LIS2DH12_ACCEL_DEV_NAME,
127 			[7] = LIS3DE_ACCEL_DEV_NAME,
128 		},
129 		.ch = (struct iio_chan_spec *)st_accel_12bit_channels,
130 		.odr = {
131 			.addr = 0x20,
132 			.mask = 0xf0,
133 			.odr_avl = {
134 				{ .hz = 1, .value = 0x01, },
135 				{ .hz = 10, .value = 0x02, },
136 				{ .hz = 25, .value = 0x03, },
137 				{ .hz = 50, .value = 0x04, },
138 				{ .hz = 100, .value = 0x05, },
139 				{ .hz = 200, .value = 0x06, },
140 				{ .hz = 400, .value = 0x07, },
141 				{ .hz = 1600, .value = 0x08, },
142 			},
143 		},
144 		.pw = {
145 			.addr = 0x20,
146 			.mask = 0xf0,
147 			.value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
148 		},
149 		.enable_axis = {
150 			.addr = ST_SENSORS_DEFAULT_AXIS_ADDR,
151 			.mask = ST_SENSORS_DEFAULT_AXIS_MASK,
152 		},
153 		.fs = {
154 			.addr = 0x23,
155 			.mask = 0x30,
156 			.fs_avl = {
157 				[0] = {
158 					.num = ST_ACCEL_FS_AVL_2G,
159 					.value = 0x00,
160 					.gain = IIO_G_TO_M_S_2(1000),
161 				},
162 				[1] = {
163 					.num = ST_ACCEL_FS_AVL_4G,
164 					.value = 0x01,
165 					.gain = IIO_G_TO_M_S_2(2000),
166 				},
167 				[2] = {
168 					.num = ST_ACCEL_FS_AVL_8G,
169 					.value = 0x02,
170 					.gain = IIO_G_TO_M_S_2(4000),
171 				},
172 				[3] = {
173 					.num = ST_ACCEL_FS_AVL_16G,
174 					.value = 0x03,
175 					.gain = IIO_G_TO_M_S_2(12000),
176 				},
177 			},
178 		},
179 		.bdu = {
180 			.addr = 0x23,
181 			.mask = 0x80,
182 		},
183 		.drdy_irq = {
184 			.int1 = {
185 				.addr = 0x22,
186 				.mask = 0x10,
187 			},
188 			.addr_ihl = 0x25,
189 			.mask_ihl = 0x02,
190 			.stat_drdy = {
191 				.addr = ST_SENSORS_DEFAULT_STAT_ADDR,
192 				.mask = 0x07,
193 			},
194 		},
195 		.sim = {
196 			.addr = 0x23,
197 			.value = BIT(0),
198 		},
199 		.multi_read_bit = true,
200 		.bootime = 2,
201 	},
202 	{
203 		.wai = 0x32,
204 		.wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
205 		.sensors_supported = {
206 			[0] = LIS331DLH_ACCEL_DEV_NAME,
207 			[1] = LSM303DL_ACCEL_DEV_NAME,
208 			[2] = LSM303DLH_ACCEL_DEV_NAME,
209 			[3] = LSM303DLM_ACCEL_DEV_NAME,
210 		},
211 		.ch = (struct iio_chan_spec *)st_accel_12bit_channels,
212 		.odr = {
213 			.addr = 0x20,
214 			.mask = 0x18,
215 			.odr_avl = {
216 				{ .hz = 50, .value = 0x00, },
217 				{ .hz = 100, .value = 0x01, },
218 				{ .hz = 400, .value = 0x02, },
219 				{ .hz = 1000, .value = 0x03, },
220 			},
221 		},
222 		.pw = {
223 			.addr = 0x20,
224 			.mask = 0xe0,
225 			.value_on = ST_SENSORS_DEFAULT_POWER_ON_VALUE,
226 			.value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
227 		},
228 		.enable_axis = {
229 			.addr = ST_SENSORS_DEFAULT_AXIS_ADDR,
230 			.mask = ST_SENSORS_DEFAULT_AXIS_MASK,
231 		},
232 		.fs = {
233 			.addr = 0x23,
234 			.mask = 0x30,
235 			.fs_avl = {
236 				[0] = {
237 					.num = ST_ACCEL_FS_AVL_2G,
238 					.value = 0x00,
239 					.gain = IIO_G_TO_M_S_2(1000),
240 				},
241 				[1] = {
242 					.num = ST_ACCEL_FS_AVL_4G,
243 					.value = 0x01,
244 					.gain = IIO_G_TO_M_S_2(2000),
245 				},
246 				[2] = {
247 					.num = ST_ACCEL_FS_AVL_8G,
248 					.value = 0x03,
249 					.gain = IIO_G_TO_M_S_2(3900),
250 				},
251 			},
252 		},
253 		.bdu = {
254 			.addr = 0x23,
255 			.mask = 0x80,
256 		},
257 		.drdy_irq = {
258 			.int1 = {
259 				.addr = 0x22,
260 				.mask = 0x02,
261 				.addr_od = 0x22,
262 				.mask_od = 0x40,
263 			},
264 			.int2 = {
265 				.addr = 0x22,
266 				.mask = 0x10,
267 				.addr_od = 0x22,
268 				.mask_od = 0x40,
269 			},
270 			.addr_ihl = 0x22,
271 			.mask_ihl = 0x80,
272 			.stat_drdy = {
273 				.addr = ST_SENSORS_DEFAULT_STAT_ADDR,
274 				.mask = 0x07,
275 			},
276 		},
277 		.sim = {
278 			.addr = 0x23,
279 			.value = BIT(0),
280 		},
281 		.multi_read_bit = true,
282 		.bootime = 2,
283 	},
284 	{
285 		.wai = 0x40,
286 		.wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
287 		.sensors_supported = {
288 			[0] = LSM330_ACCEL_DEV_NAME,
289 		},
290 		.ch = (struct iio_chan_spec *)st_accel_16bit_channels,
291 		.odr = {
292 			.addr = 0x20,
293 			.mask = 0xf0,
294 			.odr_avl = {
295 				{ .hz = 3, .value = 0x01, },
296 				{ .hz = 6, .value = 0x02, },
297 				{ .hz = 12, .value = 0x03, },
298 				{ .hz = 25, .value = 0x04, },
299 				{ .hz = 50, .value = 0x05, },
300 				{ .hz = 100, .value = 0x06, },
301 				{ .hz = 200, .value = 0x07, },
302 				{ .hz = 400, .value = 0x08, },
303 				{ .hz = 800, .value = 0x09, },
304 				{ .hz = 1600, .value = 0x0a, },
305 			},
306 		},
307 		.pw = {
308 			.addr = 0x20,
309 			.mask = 0xf0,
310 			.value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
311 		},
312 		.enable_axis = {
313 			.addr = ST_SENSORS_DEFAULT_AXIS_ADDR,
314 			.mask = ST_SENSORS_DEFAULT_AXIS_MASK,
315 		},
316 		.fs = {
317 			.addr = 0x24,
318 			.mask = 0x38,
319 			.fs_avl = {
320 				[0] = {
321 					.num = ST_ACCEL_FS_AVL_2G,
322 					.value = 0x00,
323 					.gain = IIO_G_TO_M_S_2(61),
324 				},
325 				[1] = {
326 					.num = ST_ACCEL_FS_AVL_4G,
327 					.value = 0x01,
328 					.gain = IIO_G_TO_M_S_2(122),
329 				},
330 				[2] = {
331 					.num = ST_ACCEL_FS_AVL_6G,
332 					.value = 0x02,
333 					.gain = IIO_G_TO_M_S_2(183),
334 				},
335 				[3] = {
336 					.num = ST_ACCEL_FS_AVL_8G,
337 					.value = 0x03,
338 					.gain = IIO_G_TO_M_S_2(244),
339 				},
340 				[4] = {
341 					.num = ST_ACCEL_FS_AVL_16G,
342 					.value = 0x04,
343 					.gain = IIO_G_TO_M_S_2(732),
344 				},
345 			},
346 		},
347 		.bdu = {
348 			.addr = 0x20,
349 			.mask = 0x08,
350 		},
351 		.drdy_irq = {
352 			.int1 = {
353 				.addr = 0x23,
354 				.mask = 0x80,
355 			},
356 			.addr_ihl = 0x23,
357 			.mask_ihl = 0x40,
358 			.stat_drdy = {
359 				.addr = ST_SENSORS_DEFAULT_STAT_ADDR,
360 				.mask = 0x07,
361 			},
362 			.ig1 = {
363 				.en_addr = 0x23,
364 				.en_mask = 0x08,
365 			},
366 		},
367 		.sim = {
368 			.addr = 0x24,
369 			.value = BIT(0),
370 		},
371 		.multi_read_bit = false,
372 		.bootime = 2,
373 	},
374 	{
375 		.wai = 0x3a,
376 		.wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
377 		.sensors_supported = {
378 			[0] = LIS3LV02DL_ACCEL_DEV_NAME,
379 		},
380 		.ch = (struct iio_chan_spec *)st_accel_12bit_channels,
381 		.odr = {
382 			.addr = 0x20,
383 			.mask = 0x30, /* DF1 and DF0 */
384 			.odr_avl = {
385 				{ .hz = 40, .value = 0x00, },
386 				{ .hz = 160, .value = 0x01, },
387 				{ .hz = 640, .value = 0x02, },
388 				{ .hz = 2560, .value = 0x03, },
389 			},
390 		},
391 		.pw = {
392 			.addr = 0x20,
393 			.mask = 0xc0,
394 			.value_on = ST_SENSORS_DEFAULT_POWER_ON_VALUE,
395 			.value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
396 		},
397 		.enable_axis = {
398 			.addr = ST_SENSORS_DEFAULT_AXIS_ADDR,
399 			.mask = ST_SENSORS_DEFAULT_AXIS_MASK,
400 		},
401 		.fs = {
402 			.addr = 0x21,
403 			.mask = 0x80,
404 			.fs_avl = {
405 				[0] = {
406 					.num = ST_ACCEL_FS_AVL_2G,
407 					.value = 0x00,
408 					.gain = IIO_G_TO_M_S_2(1000),
409 				},
410 				[1] = {
411 					.num = ST_ACCEL_FS_AVL_6G,
412 					.value = 0x01,
413 					.gain = IIO_G_TO_M_S_2(3000),
414 				},
415 			},
416 		},
417 		.bdu = {
418 			.addr = 0x21,
419 			.mask = 0x40,
420 		},
421 		/*
422 		 * Data Alignment Setting - needs to be set to get
423 		 * left-justified data like all other sensors.
424 		 */
425 		.das = {
426 			.addr = 0x21,
427 			.mask = 0x01,
428 		},
429 		.drdy_irq = {
430 			.int1 = {
431 				.addr = 0x21,
432 				.mask = 0x04,
433 			},
434 			.stat_drdy = {
435 				.addr = ST_SENSORS_DEFAULT_STAT_ADDR,
436 				.mask = 0x07,
437 			},
438 		},
439 		.sim = {
440 			.addr = 0x21,
441 			.value = BIT(1),
442 		},
443 		.multi_read_bit = true,
444 		.bootime = 2, /* guess */
445 	},
446 	{
447 		.wai = 0x3b,
448 		.wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
449 		.sensors_supported = {
450 			[0] = LIS331DL_ACCEL_DEV_NAME,
451 		},
452 		.ch = (struct iio_chan_spec *)st_accel_8bit_channels,
453 		.odr = {
454 			.addr = 0x20,
455 			.mask = 0x80,
456 			.odr_avl = {
457 				{ .hz = 100, .value = 0x00, },
458 				{ .hz = 400, .value = 0x01, },
459 			},
460 		},
461 		.pw = {
462 			.addr = 0x20,
463 			.mask = 0x40,
464 			.value_on = ST_SENSORS_DEFAULT_POWER_ON_VALUE,
465 			.value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
466 		},
467 		.enable_axis = {
468 			.addr = ST_SENSORS_DEFAULT_AXIS_ADDR,
469 			.mask = ST_SENSORS_DEFAULT_AXIS_MASK,
470 		},
471 		.fs = {
472 			.addr = 0x20,
473 			.mask = 0x20,
474 			/*
475 			 * TODO: check these resulting gain settings, these are
476 			 * not in the datsheet
477 			 */
478 			.fs_avl = {
479 				[0] = {
480 					.num = ST_ACCEL_FS_AVL_2G,
481 					.value = 0x00,
482 					.gain = IIO_G_TO_M_S_2(18000),
483 				},
484 				[1] = {
485 					.num = ST_ACCEL_FS_AVL_8G,
486 					.value = 0x01,
487 					.gain = IIO_G_TO_M_S_2(72000),
488 				},
489 			},
490 		},
491 		.drdy_irq = {
492 			.int1 = {
493 				.addr = 0x22,
494 				.mask = 0x04,
495 				.addr_od = 0x22,
496 				.mask_od = 0x40,
497 			},
498 			.int2 = {
499 				.addr = 0x22,
500 				.mask = 0x20,
501 				.addr_od = 0x22,
502 				.mask_od = 0x40,
503 			},
504 			.addr_ihl = 0x22,
505 			.mask_ihl = 0x80,
506 			.stat_drdy = {
507 				.addr = ST_SENSORS_DEFAULT_STAT_ADDR,
508 				.mask = 0x07,
509 			},
510 		},
511 		.sim = {
512 			.addr = 0x21,
513 			.value = BIT(7),
514 		},
515 		.multi_read_bit = false,
516 		.bootime = 2, /* guess */
517 	},
518 	{
519 		.wai = 0x32,
520 		.wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
521 		.sensors_supported = {
522 			[0] = H3LIS331DL_ACCEL_DEV_NAME,
523 		},
524 		.ch = (struct iio_chan_spec *)st_accel_12bit_channels,
525 		.odr = {
526 			.addr = 0x20,
527 			.mask = 0x18,
528 			.odr_avl = {
529 				{ .hz = 50, .value = 0x00, },
530 				{ .hz = 100, .value = 0x01, },
531 				{ .hz = 400, .value = 0x02, },
532 				{ .hz = 1000, .value = 0x03, },
533 			},
534 		},
535 		.pw = {
536 			.addr = 0x20,
537 			.mask = 0x20,
538 			.value_on = ST_SENSORS_DEFAULT_POWER_ON_VALUE,
539 			.value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
540 		},
541 		.enable_axis = {
542 			.addr = ST_SENSORS_DEFAULT_AXIS_ADDR,
543 			.mask = ST_SENSORS_DEFAULT_AXIS_MASK,
544 		},
545 		.fs = {
546 			.addr = 0x23,
547 			.mask = 0x30,
548 			.fs_avl = {
549 				[0] = {
550 					.num = ST_ACCEL_FS_AVL_100G,
551 					.value = 0x00,
552 					.gain = IIO_G_TO_M_S_2(49000),
553 				},
554 				[1] = {
555 					.num = ST_ACCEL_FS_AVL_200G,
556 					.value = 0x01,
557 					.gain = IIO_G_TO_M_S_2(98000),
558 				},
559 				[2] = {
560 					.num = ST_ACCEL_FS_AVL_400G,
561 					.value = 0x03,
562 					.gain = IIO_G_TO_M_S_2(195000),
563 				},
564 			},
565 		},
566 		.bdu = {
567 			.addr = 0x23,
568 			.mask = 0x80,
569 		},
570 		.drdy_irq = {
571 			.int1 = {
572 				.addr = 0x22,
573 				.mask = 0x02,
574 			},
575 			.int2 = {
576 				.addr = 0x22,
577 				.mask = 0x10,
578 			},
579 			.addr_ihl = 0x22,
580 			.mask_ihl = 0x80,
581 		},
582 		.sim = {
583 			.addr = 0x23,
584 			.value = BIT(0),
585 		},
586 		.multi_read_bit = true,
587 		.bootime = 2,
588 	},
589 	{
590 		/* No WAI register present */
591 		.sensors_supported = {
592 			[0] = LIS3L02DQ_ACCEL_DEV_NAME,
593 		},
594 		.ch = (struct iio_chan_spec *)st_accel_12bit_channels,
595 		.odr = {
596 			.addr = 0x20,
597 			.mask = 0x30,
598 			.odr_avl = {
599 				{ .hz = 280, .value = 0x00, },
600 				{ .hz = 560, .value = 0x01, },
601 				{ .hz = 1120, .value = 0x02, },
602 				{ .hz = 4480, .value = 0x03, },
603 			},
604 		},
605 		.pw = {
606 			.addr = 0x20,
607 			.mask = 0xc0,
608 			.value_on = ST_SENSORS_DEFAULT_POWER_ON_VALUE,
609 			.value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
610 		},
611 		.enable_axis = {
612 			.addr = ST_SENSORS_DEFAULT_AXIS_ADDR,
613 			.mask = ST_SENSORS_DEFAULT_AXIS_MASK,
614 		},
615 		.fs = {
616 			.fs_avl = {
617 				[0] = {
618 					.num = ST_ACCEL_FS_AVL_2G,
619 					.gain = IIO_G_TO_M_S_2(488),
620 				},
621 			},
622 		},
623 		/*
624 		 * The part has a BDU bit but if set the data is never
625 		 * updated so don't set it.
626 		 */
627 		.bdu = {
628 		},
629 		.drdy_irq = {
630 			.int1 = {
631 				.addr = 0x21,
632 				.mask = 0x04,
633 			},
634 			.stat_drdy = {
635 				.addr = ST_SENSORS_DEFAULT_STAT_ADDR,
636 				.mask = 0x07,
637 			},
638 		},
639 		.sim = {
640 			.addr = 0x21,
641 			.value = BIT(1),
642 		},
643 		.multi_read_bit = false,
644 		.bootime = 2,
645 	},
646 	{
647 		.wai = 0x33,
648 		.wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
649 		.sensors_supported = {
650 			[0] = LNG2DM_ACCEL_DEV_NAME,
651 		},
652 		.ch = (struct iio_chan_spec *)st_accel_8bit_channels,
653 		.odr = {
654 			.addr = 0x20,
655 			.mask = 0xf0,
656 			.odr_avl = {
657 				{ .hz = 1, .value = 0x01, },
658 				{ .hz = 10, .value = 0x02, },
659 				{ .hz = 25, .value = 0x03, },
660 				{ .hz = 50, .value = 0x04, },
661 				{ .hz = 100, .value = 0x05, },
662 				{ .hz = 200, .value = 0x06, },
663 				{ .hz = 400, .value = 0x07, },
664 				{ .hz = 1600, .value = 0x08, },
665 			},
666 		},
667 		.pw = {
668 			.addr = 0x20,
669 			.mask = 0xf0,
670 			.value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
671 		},
672 		.enable_axis = {
673 			.addr = ST_SENSORS_DEFAULT_AXIS_ADDR,
674 			.mask = ST_SENSORS_DEFAULT_AXIS_MASK,
675 		},
676 		.fs = {
677 			.addr = 0x23,
678 			.mask = 0x30,
679 			.fs_avl = {
680 				[0] = {
681 					.num = ST_ACCEL_FS_AVL_2G,
682 					.value = 0x00,
683 					.gain = IIO_G_TO_M_S_2(15600),
684 				},
685 				[1] = {
686 					.num = ST_ACCEL_FS_AVL_4G,
687 					.value = 0x01,
688 					.gain = IIO_G_TO_M_S_2(31200),
689 				},
690 				[2] = {
691 					.num = ST_ACCEL_FS_AVL_8G,
692 					.value = 0x02,
693 					.gain = IIO_G_TO_M_S_2(62500),
694 				},
695 				[3] = {
696 					.num = ST_ACCEL_FS_AVL_16G,
697 					.value = 0x03,
698 					.gain = IIO_G_TO_M_S_2(187500),
699 				},
700 			},
701 		},
702 		.drdy_irq = {
703 			.int1 = {
704 				.addr = 0x22,
705 				.mask = 0x10,
706 			},
707 			.addr_ihl = 0x25,
708 			.mask_ihl = 0x02,
709 			.stat_drdy = {
710 				.addr = ST_SENSORS_DEFAULT_STAT_ADDR,
711 				.mask = 0x07,
712 			},
713 		},
714 		.sim = {
715 			.addr = 0x23,
716 			.value = BIT(0),
717 		},
718 		.multi_read_bit = true,
719 		.bootime = 2,
720 	},
721 	{
722 		.wai = 0x44,
723 		.wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
724 		.sensors_supported = {
725 			[0] = LIS2DW12_ACCEL_DEV_NAME,
726 		},
727 		.ch = (struct iio_chan_spec *)st_accel_12bit_channels,
728 		.odr = {
729 			.addr = 0x20,
730 			.mask = 0xf0,
731 			.odr_avl = {
732 				{ .hz = 1, .value = 0x01, },
733 				{ .hz = 12, .value = 0x02, },
734 				{ .hz = 25, .value = 0x03, },
735 				{ .hz = 50, .value = 0x04, },
736 				{ .hz = 100, .value = 0x05, },
737 				{ .hz = 200, .value = 0x06, },
738 			},
739 		},
740 		.pw = {
741 			.addr = 0x20,
742 			.mask = 0xf0,
743 			.value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
744 		},
745 		.fs = {
746 			.addr = 0x25,
747 			.mask = 0x30,
748 			.fs_avl = {
749 				[0] = {
750 					.num = ST_ACCEL_FS_AVL_2G,
751 					.value = 0x00,
752 					.gain = IIO_G_TO_M_S_2(976),
753 				},
754 				[1] = {
755 					.num = ST_ACCEL_FS_AVL_4G,
756 					.value = 0x01,
757 					.gain = IIO_G_TO_M_S_2(1952),
758 				},
759 				[2] = {
760 					.num = ST_ACCEL_FS_AVL_8G,
761 					.value = 0x02,
762 					.gain = IIO_G_TO_M_S_2(3904),
763 				},
764 				[3] = {
765 					.num = ST_ACCEL_FS_AVL_16G,
766 					.value = 0x03,
767 					.gain = IIO_G_TO_M_S_2(7808),
768 				},
769 			},
770 		},
771 		.bdu = {
772 			.addr = 0x21,
773 			.mask = 0x08,
774 		},
775 		.drdy_irq = {
776 			.int1 = {
777 				.addr = 0x23,
778 				.mask = 0x01,
779 				.addr_od = 0x22,
780 				.mask_od = 0x20,
781 			},
782 			.int2 = {
783 				.addr = 0x24,
784 				.mask = 0x01,
785 				.addr_od = 0x22,
786 				.mask_od = 0x20,
787 			},
788 			.addr_ihl = 0x22,
789 			.mask_ihl = 0x08,
790 			.stat_drdy = {
791 				.addr = ST_SENSORS_DEFAULT_STAT_ADDR,
792 				.mask = 0x01,
793 			},
794 		},
795 		.sim = {
796 			.addr = 0x21,
797 			.value = BIT(0),
798 		},
799 		.multi_read_bit = false,
800 		.bootime = 2,
801 	},
802 	{
803 		.wai = 0x11,
804 		.wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
805 		.sensors_supported = {
806 			[0] = LIS3DHH_ACCEL_DEV_NAME,
807 		},
808 		.ch = (struct iio_chan_spec *)st_accel_16bit_channels,
809 		.odr = {
810 			/* just ODR = 1100Hz available */
811 			.odr_avl = {
812 				{ .hz = 1100, .value = 0x00, },
813 			},
814 		},
815 		.pw = {
816 			.addr = 0x20,
817 			.mask = 0x80,
818 			.value_on = ST_SENSORS_DEFAULT_POWER_ON_VALUE,
819 			.value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
820 		},
821 		.fs = {
822 			.fs_avl = {
823 				[0] = {
824 					.num = ST_ACCEL_FS_AVL_2G,
825 					.gain = IIO_G_TO_M_S_2(76),
826 				},
827 			},
828 		},
829 		.bdu = {
830 			.addr = 0x20,
831 			.mask = 0x01,
832 		},
833 		.drdy_irq = {
834 			.int1 = {
835 				.addr = 0x21,
836 				.mask = 0x80,
837 				.addr_od = 0x23,
838 				.mask_od = 0x04,
839 			},
840 			.int2 = {
841 				.addr = 0x22,
842 				.mask = 0x80,
843 				.addr_od = 0x23,
844 				.mask_od = 0x08,
845 			},
846 			.stat_drdy = {
847 				.addr = ST_SENSORS_DEFAULT_STAT_ADDR,
848 				.mask = 0x07,
849 			},
850 		},
851 		.multi_read_bit = false,
852 		.bootime = 2,
853 	},
854 	{
855 		.wai = 0x33,
856 		.wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
857 		.sensors_supported = {
858 			[0] = LIS2DE12_ACCEL_DEV_NAME,
859 		},
860 		.ch = (struct iio_chan_spec *)st_accel_8bit_channels,
861 		.odr = {
862 			.addr = 0x20,
863 			.mask = 0xf0,
864 			.odr_avl = {
865 				{ .hz = 1, .value = 0x01, },
866 				{ .hz = 10, .value = 0x02, },
867 				{ .hz = 25, .value = 0x03, },
868 				{ .hz = 50, .value = 0x04, },
869 				{ .hz = 100, .value = 0x05, },
870 				{ .hz = 200, .value = 0x06, },
871 				{ .hz = 400, .value = 0x07, },
872 				{ .hz = 1620, .value = 0x08, },
873 				{ .hz = 5376, .value = 0x09, },
874 			},
875 		},
876 		.pw = {
877 			.addr = 0x20,
878 			.mask = 0xf0,
879 			.value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
880 		},
881 		.enable_axis = {
882 			.addr = ST_SENSORS_DEFAULT_AXIS_ADDR,
883 			.mask = ST_SENSORS_DEFAULT_AXIS_MASK,
884 		},
885 		.fs = {
886 			.addr = 0x23,
887 			.mask = 0x30,
888 			.fs_avl = {
889 				[0] = {
890 					.num = ST_ACCEL_FS_AVL_2G,
891 					.value = 0x00,
892 					.gain = IIO_G_TO_M_S_2(15600),
893 				},
894 				[1] = {
895 					.num = ST_ACCEL_FS_AVL_4G,
896 					.value = 0x01,
897 					.gain = IIO_G_TO_M_S_2(31200),
898 				},
899 				[2] = {
900 					.num = ST_ACCEL_FS_AVL_8G,
901 					.value = 0x02,
902 					.gain = IIO_G_TO_M_S_2(62500),
903 				},
904 				[3] = {
905 					.num = ST_ACCEL_FS_AVL_16G,
906 					.value = 0x03,
907 					.gain = IIO_G_TO_M_S_2(187500),
908 				},
909 			},
910 		},
911 		.drdy_irq = {
912 			.int1 = {
913 				.addr = 0x22,
914 				.mask = 0x10,
915 			},
916 			.addr_ihl = 0x25,
917 			.mask_ihl = 0x02,
918 			.stat_drdy = {
919 				.addr = ST_SENSORS_DEFAULT_STAT_ADDR,
920 				.mask = 0x07,
921 			},
922 		},
923 		.sim = {
924 			.addr = 0x23,
925 			.value = BIT(0),
926 		},
927 		.multi_read_bit = true,
928 		.bootime = 2,
929 	},
930 	{
931 		.wai = 0x41,
932 		.wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
933 		.sensors_supported = {
934 			[0] = LIS2HH12_ACCEL_DEV_NAME,
935 		},
936 		.ch = (struct iio_chan_spec *)st_accel_16bit_channels,
937 		.odr = {
938 			.addr = 0x20,
939 			.mask = 0x70,
940 			.odr_avl = {
941 				{ .hz = 10, .value = 0x01, },
942 				{ .hz = 50, .value = 0x02, },
943 				{ .hz = 100, .value = 0x03, },
944 				{ .hz = 200, .value = 0x04, },
945 				{ .hz = 400, .value = 0x05, },
946 				{ .hz = 800, .value = 0x06, },
947 			},
948 		},
949 		.pw = {
950 			.addr = 0x20,
951 			.mask = 0x70,
952 			.value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
953 		},
954 		.enable_axis = {
955 			.addr = ST_SENSORS_DEFAULT_AXIS_ADDR,
956 			.mask = ST_SENSORS_DEFAULT_AXIS_MASK,
957 		},
958 		.fs = {
959 			.addr = 0x23,
960 			.mask = 0x30,
961 			.fs_avl = {
962 				[0] = {
963 					.num = ST_ACCEL_FS_AVL_2G,
964 					.value = 0x00,
965 					.gain = IIO_G_TO_M_S_2(61),
966 				},
967 				[1] = {
968 					.num = ST_ACCEL_FS_AVL_4G,
969 					.value = 0x02,
970 					.gain = IIO_G_TO_M_S_2(122),
971 				},
972 				[2] = {
973 					.num = ST_ACCEL_FS_AVL_8G,
974 					.value = 0x03,
975 					.gain = IIO_G_TO_M_S_2(244),
976 				},
977 			},
978 		},
979 		.bdu = {
980 			.addr = 0x20,
981 			.mask = 0x08,
982 		},
983 		.drdy_irq = {
984 			.int1 = {
985 				.addr = 0x22,
986 				.mask = 0x01,
987 			},
988 			.int2 = {
989 				.addr = 0x25,
990 				.mask = 0x01,
991 			},
992 			.addr_ihl = 0x24,
993 			.mask_ihl = 0x02,
994 			.stat_drdy = {
995 				.addr = ST_SENSORS_DEFAULT_STAT_ADDR,
996 				.mask = 0x07,
997 			},
998 		},
999 		.sim = {
1000 			.addr = 0x23,
1001 			.value = BIT(0),
1002 		},
1003 		.multi_read_bit = true,
1004 		.bootime = 2,
1005 	},
1006 	{
1007 		.wai = 0x49,
1008 		.wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
1009 		.sensors_supported = {
1010 			[0] = LSM9DS0_IMU_DEV_NAME,
1011 		},
1012 		.ch = (struct iio_chan_spec *)st_accel_16bit_channels,
1013 		.odr = {
1014 			.addr = 0x20,
1015 			.mask = GENMASK(7, 4),
1016 			.odr_avl = {
1017 				{ 3, 0x01, },
1018 				{ 6, 0x02, },
1019 				{ 12, 0x03, },
1020 				{ 25, 0x04, },
1021 				{ 50, 0x05, },
1022 				{ 100, 0x06, },
1023 				{ 200, 0x07, },
1024 				{ 400, 0x08, },
1025 				{ 800, 0x09, },
1026 				{ 1600, 0x0a, },
1027 			},
1028 		},
1029 		.pw = {
1030 			.addr = 0x20,
1031 			.mask = GENMASK(7, 4),
1032 			.value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
1033 		},
1034 		.enable_axis = {
1035 			.addr = ST_SENSORS_DEFAULT_AXIS_ADDR,
1036 			.mask = ST_SENSORS_DEFAULT_AXIS_MASK,
1037 		},
1038 		.fs = {
1039 			.addr = 0x21,
1040 			.mask = GENMASK(5, 3),
1041 			.fs_avl = {
1042 				[0] = {
1043 					.num = ST_ACCEL_FS_AVL_2G,
1044 					.value = 0x00,
1045 					.gain = IIO_G_TO_M_S_2(61),
1046 				},
1047 				[1] = {
1048 					.num = ST_ACCEL_FS_AVL_4G,
1049 					.value = 0x01,
1050 					.gain = IIO_G_TO_M_S_2(122),
1051 				},
1052 				[2] = {
1053 					.num = ST_ACCEL_FS_AVL_6G,
1054 					.value = 0x02,
1055 					.gain = IIO_G_TO_M_S_2(183),
1056 				},
1057 				[3] = {
1058 					.num = ST_ACCEL_FS_AVL_8G,
1059 					.value = 0x03,
1060 					.gain = IIO_G_TO_M_S_2(244),
1061 				},
1062 				[4] = {
1063 					.num = ST_ACCEL_FS_AVL_16G,
1064 					.value = 0x04,
1065 					.gain = IIO_G_TO_M_S_2(732),
1066 				},
1067 			},
1068 		},
1069 		.bdu = {
1070 			.addr = 0x20,
1071 			.mask = BIT(3),
1072 		},
1073 		.drdy_irq = {
1074 			.int1 = {
1075 				.addr = 0x22,
1076 				.mask = BIT(2),
1077 			},
1078 			.int2 = {
1079 				.addr = 0x23,
1080 				.mask = BIT(3),
1081 			},
1082 			.stat_drdy = {
1083 				.addr = ST_SENSORS_DEFAULT_STAT_ADDR,
1084 				.mask = GENMASK(2, 0),
1085 			},
1086 		},
1087 		.sim = {
1088 			.addr = 0x21,
1089 			.value = BIT(0),
1090 		},
1091 		.multi_read_bit = true,
1092 		.bootime = 2,
1093 	},
1094 };
1095 
1096 /* Default accel DRDY is available on INT1 pin */
1097 static const struct st_sensors_platform_data default_accel_pdata = {
1098 	.drdy_int_pin = 1,
1099 };
1100 
1101 static int st_accel_read_raw(struct iio_dev *indio_dev,
1102 			struct iio_chan_spec const *ch, int *val,
1103 							int *val2, long mask)
1104 {
1105 	int err;
1106 	struct st_sensor_data *adata = iio_priv(indio_dev);
1107 
1108 	switch (mask) {
1109 	case IIO_CHAN_INFO_RAW:
1110 		err = st_sensors_read_info_raw(indio_dev, ch, val);
1111 		if (err < 0)
1112 			goto read_error;
1113 
1114 		return IIO_VAL_INT;
1115 	case IIO_CHAN_INFO_SCALE:
1116 		*val = adata->current_fullscale->gain / 1000000;
1117 		*val2 = adata->current_fullscale->gain % 1000000;
1118 		return IIO_VAL_INT_PLUS_MICRO;
1119 	case IIO_CHAN_INFO_SAMP_FREQ:
1120 		*val = adata->odr;
1121 		return IIO_VAL_INT;
1122 	default:
1123 		return -EINVAL;
1124 	}
1125 
1126 read_error:
1127 	return err;
1128 }
1129 
1130 static int st_accel_write_raw(struct iio_dev *indio_dev,
1131 		struct iio_chan_spec const *chan, int val, int val2, long mask)
1132 {
1133 	int err;
1134 
1135 	switch (mask) {
1136 	case IIO_CHAN_INFO_SCALE: {
1137 		int gain;
1138 
1139 		gain = val * 1000000 + val2;
1140 		err = st_sensors_set_fullscale_by_gain(indio_dev, gain);
1141 		break;
1142 	}
1143 	case IIO_CHAN_INFO_SAMP_FREQ:
1144 		if (val2)
1145 			return -EINVAL;
1146 		mutex_lock(&indio_dev->mlock);
1147 		err = st_sensors_set_odr(indio_dev, val);
1148 		mutex_unlock(&indio_dev->mlock);
1149 		return err;
1150 	default:
1151 		return -EINVAL;
1152 	}
1153 
1154 	return err;
1155 }
1156 
1157 static ST_SENSORS_DEV_ATTR_SAMP_FREQ_AVAIL();
1158 static ST_SENSORS_DEV_ATTR_SCALE_AVAIL(in_accel_scale_available);
1159 
1160 static struct attribute *st_accel_attributes[] = {
1161 	&iio_dev_attr_sampling_frequency_available.dev_attr.attr,
1162 	&iio_dev_attr_in_accel_scale_available.dev_attr.attr,
1163 	NULL,
1164 };
1165 
1166 static const struct attribute_group st_accel_attribute_group = {
1167 	.attrs = st_accel_attributes,
1168 };
1169 
1170 static const struct iio_info accel_info = {
1171 	.attrs = &st_accel_attribute_group,
1172 	.read_raw = &st_accel_read_raw,
1173 	.write_raw = &st_accel_write_raw,
1174 	.debugfs_reg_access = &st_sensors_debugfs_reg_access,
1175 };
1176 
1177 #ifdef CONFIG_IIO_TRIGGER
1178 static const struct iio_trigger_ops st_accel_trigger_ops = {
1179 	.set_trigger_state = ST_ACCEL_TRIGGER_SET_STATE,
1180 	.validate_device = st_sensors_validate_device,
1181 };
1182 #define ST_ACCEL_TRIGGER_OPS (&st_accel_trigger_ops)
1183 #else
1184 #define ST_ACCEL_TRIGGER_OPS NULL
1185 #endif
1186 
1187 #ifdef CONFIG_ACPI
1188 /* Read ST-specific _ONT orientation data from ACPI and generate an
1189  * appropriate mount matrix.
1190  */
1191 static int apply_acpi_orientation(struct iio_dev *indio_dev)
1192 {
1193 	struct st_sensor_data *adata = iio_priv(indio_dev);
1194 	struct acpi_buffer buffer = {ACPI_ALLOCATE_BUFFER, NULL};
1195 	struct acpi_device *adev;
1196 	union acpi_object *ont;
1197 	union acpi_object *elements;
1198 	acpi_status status;
1199 	int ret = -EINVAL;
1200 	unsigned int val;
1201 	int i, j;
1202 	int final_ont[3][3] = { { 0 }, };
1203 
1204 	/* For some reason, ST's _ONT translation does not apply directly
1205 	 * to the data read from the sensor. Another translation must be
1206 	 * performed first, as described by the matrix below. Perhaps
1207 	 * ST required this specific translation for the first product
1208 	 * where the device was mounted?
1209 	 */
1210 	const int default_ont[3][3] = {
1211 		{  0,  1,  0 },
1212 		{ -1,  0,  0 },
1213 		{  0,  0, -1 },
1214 	};
1215 
1216 
1217 	adev = ACPI_COMPANION(adata->dev);
1218 	if (!adev)
1219 		return 0;
1220 
1221 	/* Read _ONT data, which should be a package of 6 integers. */
1222 	status = acpi_evaluate_object(adev->handle, "_ONT", NULL, &buffer);
1223 	if (status == AE_NOT_FOUND) {
1224 		return 0;
1225 	} else if (ACPI_FAILURE(status)) {
1226 		dev_warn(&indio_dev->dev, "failed to execute _ONT: %d\n",
1227 			 status);
1228 		return status;
1229 	}
1230 
1231 	ont = buffer.pointer;
1232 	if (ont->type != ACPI_TYPE_PACKAGE || ont->package.count != 6)
1233 		goto out;
1234 
1235 	/* The first 3 integers provide axis order information.
1236 	 * e.g. 0 1 2 would indicate normal X,Y,Z ordering.
1237 	 * e.g. 1 0 2 indicates that data arrives in order Y,X,Z.
1238 	 */
1239 	elements = ont->package.elements;
1240 	for (i = 0; i < 3; i++) {
1241 		if (elements[i].type != ACPI_TYPE_INTEGER)
1242 			goto out;
1243 
1244 		val = elements[i].integer.value;
1245 		if (val > 2)
1246 			goto out;
1247 
1248 		/* Avoiding full matrix multiplication, we simply reorder the
1249 		 * columns in the default_ont matrix according to the
1250 		 * ordering provided by _ONT.
1251 		 */
1252 		final_ont[0][i] = default_ont[0][val];
1253 		final_ont[1][i] = default_ont[1][val];
1254 		final_ont[2][i] = default_ont[2][val];
1255 	}
1256 
1257 	/* The final 3 integers provide sign flip information.
1258 	 * 0 means no change, 1 means flip.
1259 	 * e.g. 0 0 1 means that Z data should be sign-flipped.
1260 	 * This is applied after the axis reordering from above.
1261 	 */
1262 	elements += 3;
1263 	for (i = 0; i < 3; i++) {
1264 		if (elements[i].type != ACPI_TYPE_INTEGER)
1265 			goto out;
1266 
1267 		val = elements[i].integer.value;
1268 		if (val != 0 && val != 1)
1269 			goto out;
1270 		if (!val)
1271 			continue;
1272 
1273 		/* Flip the values in the indicated column */
1274 		final_ont[0][i] *= -1;
1275 		final_ont[1][i] *= -1;
1276 		final_ont[2][i] *= -1;
1277 	}
1278 
1279 	/* Convert our integer matrix to a string-based iio_mount_matrix */
1280 	for (i = 0; i < 3; i++) {
1281 		for (j = 0; j < 3; j++) {
1282 			int matrix_val = final_ont[i][j];
1283 			char *str_value;
1284 
1285 			switch (matrix_val) {
1286 			case -1:
1287 				str_value = "-1";
1288 				break;
1289 			case 0:
1290 				str_value = "0";
1291 				break;
1292 			case 1:
1293 				str_value = "1";
1294 				break;
1295 			default:
1296 				goto out;
1297 			}
1298 			adata->mount_matrix.rotation[i * 3 + j] = str_value;
1299 		}
1300 	}
1301 
1302 	ret = 0;
1303 	dev_info(&indio_dev->dev, "computed mount matrix from ACPI\n");
1304 
1305 out:
1306 	kfree(buffer.pointer);
1307 	if (ret)
1308 		dev_dbg(&indio_dev->dev,
1309 			"failed to apply ACPI orientation data: %d\n", ret);
1310 
1311 	return ret;
1312 }
1313 #else /* !CONFIG_ACPI */
1314 static int apply_acpi_orientation(struct iio_dev *indio_dev)
1315 {
1316 	return -EINVAL;
1317 }
1318 #endif
1319 
1320 /*
1321  * st_accel_get_settings() - get sensor settings from device name
1322  * @name: device name buffer reference.
1323  *
1324  * Return: valid reference on success, NULL otherwise.
1325  */
1326 const struct st_sensor_settings *st_accel_get_settings(const char *name)
1327 {
1328 	int index = st_sensors_get_settings_index(name,
1329 					st_accel_sensors_settings,
1330 					ARRAY_SIZE(st_accel_sensors_settings));
1331 	if (index < 0)
1332 		return NULL;
1333 
1334 	return &st_accel_sensors_settings[index];
1335 }
1336 EXPORT_SYMBOL(st_accel_get_settings);
1337 
1338 int st_accel_common_probe(struct iio_dev *indio_dev)
1339 {
1340 	struct st_sensor_data *adata = iio_priv(indio_dev);
1341 	struct st_sensors_platform_data *pdata = dev_get_platdata(adata->dev);
1342 	int err;
1343 
1344 	indio_dev->modes = INDIO_DIRECT_MODE;
1345 	indio_dev->info = &accel_info;
1346 
1347 	err = st_sensors_verify_id(indio_dev);
1348 	if (err < 0)
1349 		return err;
1350 
1351 	adata->num_data_channels = ST_ACCEL_NUMBER_DATA_CHANNELS;
1352 	indio_dev->channels = adata->sensor_settings->ch;
1353 	indio_dev->num_channels = ST_SENSORS_NUMBER_ALL_CHANNELS;
1354 
1355 	/*
1356 	 * First try specific ACPI methods to retrieve orientation then try the
1357 	 * generic function.
1358 	 */
1359 	err = apply_acpi_orientation(indio_dev);
1360 	if (err) {
1361 		err = iio_read_mount_matrix(adata->dev, &adata->mount_matrix);
1362 		if (err)
1363 			return err;
1364 	}
1365 
1366 	adata->current_fullscale = &adata->sensor_settings->fs.fs_avl[0];
1367 	adata->odr = adata->sensor_settings->odr.odr_avl[0].hz;
1368 
1369 	if (!pdata)
1370 		pdata = (struct st_sensors_platform_data *)&default_accel_pdata;
1371 
1372 	err = st_sensors_init_sensor(indio_dev, pdata);
1373 	if (err < 0)
1374 		return err;
1375 
1376 	err = st_accel_allocate_ring(indio_dev);
1377 	if (err < 0)
1378 		return err;
1379 
1380 	if (adata->irq > 0) {
1381 		err = st_sensors_allocate_trigger(indio_dev,
1382 						 ST_ACCEL_TRIGGER_OPS);
1383 		if (err < 0)
1384 			goto st_accel_probe_trigger_error;
1385 	}
1386 
1387 	err = iio_device_register(indio_dev);
1388 	if (err)
1389 		goto st_accel_device_register_error;
1390 
1391 	dev_info(&indio_dev->dev, "registered accelerometer %s\n",
1392 		 indio_dev->name);
1393 
1394 	return 0;
1395 
1396 st_accel_device_register_error:
1397 	if (adata->irq > 0)
1398 		st_sensors_deallocate_trigger(indio_dev);
1399 st_accel_probe_trigger_error:
1400 	st_accel_deallocate_ring(indio_dev);
1401 	return err;
1402 }
1403 EXPORT_SYMBOL(st_accel_common_probe);
1404 
1405 void st_accel_common_remove(struct iio_dev *indio_dev)
1406 {
1407 	struct st_sensor_data *adata = iio_priv(indio_dev);
1408 
1409 	iio_device_unregister(indio_dev);
1410 	if (adata->irq > 0)
1411 		st_sensors_deallocate_trigger(indio_dev);
1412 
1413 	st_accel_deallocate_ring(indio_dev);
1414 }
1415 EXPORT_SYMBOL(st_accel_common_remove);
1416 
1417 MODULE_AUTHOR("Denis Ciocca <denis.ciocca@st.com>");
1418 MODULE_DESCRIPTION("STMicroelectronics accelerometers driver");
1419 MODULE_LICENSE("GPL v2");
1420