Merge tag 'for-linus-5.4-rc2-tag' of git://git.kernel.org/pub/scm/linux/kernel/git...
[sfrench/cifs-2.6.git] / drivers / iio / accel / st_accel_core.c
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/gpio.h>
19 #include <linux/irq.h>
20 #include <linux/iio/iio.h>
21 #include <linux/iio/sysfs.h>
22 #include <linux/iio/trigger.h>
23 #include <linux/iio/buffer.h>
24
25 #include <linux/iio/common/st_sensors.h>
26 #include "st_accel.h"
27
28 #define ST_ACCEL_NUMBER_DATA_CHANNELS           3
29
30 /* DEFAULT VALUE FOR SENSORS */
31 #define ST_ACCEL_DEFAULT_OUT_X_L_ADDR           0x28
32 #define ST_ACCEL_DEFAULT_OUT_Y_L_ADDR           0x2a
33 #define ST_ACCEL_DEFAULT_OUT_Z_L_ADDR           0x2c
34
35 /* FULLSCALE */
36 #define ST_ACCEL_FS_AVL_2G                      2
37 #define ST_ACCEL_FS_AVL_4G                      4
38 #define ST_ACCEL_FS_AVL_6G                      6
39 #define ST_ACCEL_FS_AVL_8G                      8
40 #define ST_ACCEL_FS_AVL_16G                     16
41 #define ST_ACCEL_FS_AVL_100G                    100
42 #define ST_ACCEL_FS_AVL_200G                    200
43 #define ST_ACCEL_FS_AVL_400G                    400
44
45 static const struct iio_chan_spec st_accel_8bit_channels[] = {
46         ST_SENSORS_LSM_CHANNELS(IIO_ACCEL,
47                         BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
48                         ST_SENSORS_SCAN_X, 1, IIO_MOD_X, 's', IIO_LE, 8, 8,
49                         ST_ACCEL_DEFAULT_OUT_X_L_ADDR+1),
50         ST_SENSORS_LSM_CHANNELS(IIO_ACCEL,
51                         BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
52                         ST_SENSORS_SCAN_Y, 1, IIO_MOD_Y, 's', IIO_LE, 8, 8,
53                         ST_ACCEL_DEFAULT_OUT_Y_L_ADDR+1),
54         ST_SENSORS_LSM_CHANNELS(IIO_ACCEL,
55                         BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
56                         ST_SENSORS_SCAN_Z, 1, IIO_MOD_Z, 's', IIO_LE, 8, 8,
57                         ST_ACCEL_DEFAULT_OUT_Z_L_ADDR+1),
58         IIO_CHAN_SOFT_TIMESTAMP(3)
59 };
60
61 static const struct iio_chan_spec st_accel_12bit_channels[] = {
62         ST_SENSORS_LSM_CHANNELS(IIO_ACCEL,
63                         BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
64                         ST_SENSORS_SCAN_X, 1, IIO_MOD_X, 's', IIO_LE, 12, 16,
65                         ST_ACCEL_DEFAULT_OUT_X_L_ADDR),
66         ST_SENSORS_LSM_CHANNELS(IIO_ACCEL,
67                         BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
68                         ST_SENSORS_SCAN_Y, 1, IIO_MOD_Y, 's', IIO_LE, 12, 16,
69                         ST_ACCEL_DEFAULT_OUT_Y_L_ADDR),
70         ST_SENSORS_LSM_CHANNELS(IIO_ACCEL,
71                         BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
72                         ST_SENSORS_SCAN_Z, 1, IIO_MOD_Z, 's', IIO_LE, 12, 16,
73                         ST_ACCEL_DEFAULT_OUT_Z_L_ADDR),
74         IIO_CHAN_SOFT_TIMESTAMP(3)
75 };
76
77 static const struct iio_chan_spec st_accel_16bit_channels[] = {
78         ST_SENSORS_LSM_CHANNELS(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, 16, 16,
81                         ST_ACCEL_DEFAULT_OUT_X_L_ADDR),
82         ST_SENSORS_LSM_CHANNELS(IIO_ACCEL,
83                         BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
84                         ST_SENSORS_SCAN_Y, 1, IIO_MOD_Y, 's', IIO_LE, 16, 16,
85                         ST_ACCEL_DEFAULT_OUT_Y_L_ADDR),
86         ST_SENSORS_LSM_CHANNELS(IIO_ACCEL,
87                         BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
88                         ST_SENSORS_SCAN_Z, 1, IIO_MOD_Z, 's', IIO_LE, 16, 16,
89                         ST_ACCEL_DEFAULT_OUT_Z_L_ADDR),
90         IIO_CHAN_SOFT_TIMESTAMP(3)
91 };
92
93 static const struct st_sensor_settings st_accel_sensors_settings[] = {
94         {
95                 .wai = 0x33,
96                 .wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
97                 .sensors_supported = {
98                         [0] = LIS3DH_ACCEL_DEV_NAME,
99                         [1] = LSM303DLHC_ACCEL_DEV_NAME,
100                         [2] = LSM330D_ACCEL_DEV_NAME,
101                         [3] = LSM330DL_ACCEL_DEV_NAME,
102                         [4] = LSM330DLC_ACCEL_DEV_NAME,
103                         [5] = LSM303AGR_ACCEL_DEV_NAME,
104                         [6] = LIS2DH12_ACCEL_DEV_NAME,
105                         [7] = LIS3DE_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                 .wai = 0x33,
834                 .wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
835                 .sensors_supported = {
836                         [0] = LIS2DE12_ACCEL_DEV_NAME,
837                 },
838                 .ch = (struct iio_chan_spec *)st_accel_8bit_channels,
839                 .odr = {
840                         .addr = 0x20,
841                         .mask = 0xf0,
842                         .odr_avl = {
843                                 { .hz = 1, .value = 0x01, },
844                                 { .hz = 10, .value = 0x02, },
845                                 { .hz = 25, .value = 0x03, },
846                                 { .hz = 50, .value = 0x04, },
847                                 { .hz = 100, .value = 0x05, },
848                                 { .hz = 200, .value = 0x06, },
849                                 { .hz = 400, .value = 0x07, },
850                                 { .hz = 1620, .value = 0x08, },
851                                 { .hz = 5376, .value = 0x09, },
852                         },
853                 },
854                 .pw = {
855                         .addr = 0x20,
856                         .mask = 0xf0,
857                         .value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
858                 },
859                 .enable_axis = {
860                         .addr = ST_SENSORS_DEFAULT_AXIS_ADDR,
861                         .mask = ST_SENSORS_DEFAULT_AXIS_MASK,
862                 },
863                 .fs = {
864                         .addr = 0x23,
865                         .mask = 0x30,
866                         .fs_avl = {
867                                 [0] = {
868                                         .num = ST_ACCEL_FS_AVL_2G,
869                                         .value = 0x00,
870                                         .gain = IIO_G_TO_M_S_2(15600),
871                                 },
872                                 [1] = {
873                                         .num = ST_ACCEL_FS_AVL_4G,
874                                         .value = 0x01,
875                                         .gain = IIO_G_TO_M_S_2(31200),
876                                 },
877                                 [2] = {
878                                         .num = ST_ACCEL_FS_AVL_8G,
879                                         .value = 0x02,
880                                         .gain = IIO_G_TO_M_S_2(62500),
881                                 },
882                                 [3] = {
883                                         .num = ST_ACCEL_FS_AVL_16G,
884                                         .value = 0x03,
885                                         .gain = IIO_G_TO_M_S_2(187500),
886                                 },
887                         },
888                 },
889                 .drdy_irq = {
890                         .int1 = {
891                                 .addr = 0x22,
892                                 .mask = 0x10,
893                         },
894                         .addr_ihl = 0x25,
895                         .mask_ihl = 0x02,
896                         .stat_drdy = {
897                                 .addr = ST_SENSORS_DEFAULT_STAT_ADDR,
898                                 .mask = 0x07,
899                         },
900                 },
901                 .sim = {
902                         .addr = 0x23,
903                         .value = BIT(0),
904                 },
905                 .multi_read_bit = true,
906                 .bootime = 2,
907         },
908 };
909
910 static int st_accel_read_raw(struct iio_dev *indio_dev,
911                         struct iio_chan_spec const *ch, int *val,
912                                                         int *val2, long mask)
913 {
914         int err;
915         struct st_sensor_data *adata = iio_priv(indio_dev);
916
917         switch (mask) {
918         case IIO_CHAN_INFO_RAW:
919                 err = st_sensors_read_info_raw(indio_dev, ch, val);
920                 if (err < 0)
921                         goto read_error;
922
923                 return IIO_VAL_INT;
924         case IIO_CHAN_INFO_SCALE:
925                 *val = adata->current_fullscale->gain / 1000000;
926                 *val2 = adata->current_fullscale->gain % 1000000;
927                 return IIO_VAL_INT_PLUS_MICRO;
928         case IIO_CHAN_INFO_SAMP_FREQ:
929                 *val = adata->odr;
930                 return IIO_VAL_INT;
931         default:
932                 return -EINVAL;
933         }
934
935 read_error:
936         return err;
937 }
938
939 static int st_accel_write_raw(struct iio_dev *indio_dev,
940                 struct iio_chan_spec const *chan, int val, int val2, long mask)
941 {
942         int err;
943
944         switch (mask) {
945         case IIO_CHAN_INFO_SCALE: {
946                 int gain;
947
948                 gain = val * 1000000 + val2;
949                 err = st_sensors_set_fullscale_by_gain(indio_dev, gain);
950                 break;
951         }
952         case IIO_CHAN_INFO_SAMP_FREQ:
953                 if (val2)
954                         return -EINVAL;
955                 mutex_lock(&indio_dev->mlock);
956                 err = st_sensors_set_odr(indio_dev, val);
957                 mutex_unlock(&indio_dev->mlock);
958                 return err;
959         default:
960                 return -EINVAL;
961         }
962
963         return err;
964 }
965
966 static ST_SENSORS_DEV_ATTR_SAMP_FREQ_AVAIL();
967 static ST_SENSORS_DEV_ATTR_SCALE_AVAIL(in_accel_scale_available);
968
969 static struct attribute *st_accel_attributes[] = {
970         &iio_dev_attr_sampling_frequency_available.dev_attr.attr,
971         &iio_dev_attr_in_accel_scale_available.dev_attr.attr,
972         NULL,
973 };
974
975 static const struct attribute_group st_accel_attribute_group = {
976         .attrs = st_accel_attributes,
977 };
978
979 static const struct iio_info accel_info = {
980         .attrs = &st_accel_attribute_group,
981         .read_raw = &st_accel_read_raw,
982         .write_raw = &st_accel_write_raw,
983         .debugfs_reg_access = &st_sensors_debugfs_reg_access,
984 };
985
986 #ifdef CONFIG_IIO_TRIGGER
987 static const struct iio_trigger_ops st_accel_trigger_ops = {
988         .set_trigger_state = ST_ACCEL_TRIGGER_SET_STATE,
989         .validate_device = st_sensors_validate_device,
990 };
991 #define ST_ACCEL_TRIGGER_OPS (&st_accel_trigger_ops)
992 #else
993 #define ST_ACCEL_TRIGGER_OPS NULL
994 #endif
995
996 static const struct iio_mount_matrix *
997 get_mount_matrix(const struct iio_dev *indio_dev,
998                  const struct iio_chan_spec *chan)
999 {
1000         struct st_sensor_data *adata = iio_priv(indio_dev);
1001
1002         return adata->mount_matrix;
1003 }
1004
1005 static const struct iio_chan_spec_ext_info mount_matrix_ext_info[] = {
1006         IIO_MOUNT_MATRIX(IIO_SHARED_BY_ALL, get_mount_matrix),
1007         { },
1008 };
1009
1010 /* Read ST-specific _ONT orientation data from ACPI and generate an
1011  * appropriate mount matrix.
1012  */
1013 static int apply_acpi_orientation(struct iio_dev *indio_dev,
1014                                   struct iio_chan_spec *channels)
1015 {
1016 #ifdef CONFIG_ACPI
1017         struct st_sensor_data *adata = iio_priv(indio_dev);
1018         struct acpi_buffer buffer = {ACPI_ALLOCATE_BUFFER, NULL};
1019         struct acpi_device *adev;
1020         union acpi_object *ont;
1021         union acpi_object *elements;
1022         acpi_status status;
1023         int ret = -EINVAL;
1024         unsigned int val;
1025         int i, j;
1026         int final_ont[3][3] = { { 0 }, };
1027
1028         /* For some reason, ST's _ONT translation does not apply directly
1029          * to the data read from the sensor. Another translation must be
1030          * performed first, as described by the matrix below. Perhaps
1031          * ST required this specific translation for the first product
1032          * where the device was mounted?
1033          */
1034         const int default_ont[3][3] = {
1035                 {  0,  1,  0 },
1036                 { -1,  0,  0 },
1037                 {  0,  0, -1 },
1038         };
1039
1040
1041         adev = ACPI_COMPANION(adata->dev);
1042         if (!adev)
1043                 return 0;
1044
1045         /* Read _ONT data, which should be a package of 6 integers. */
1046         status = acpi_evaluate_object(adev->handle, "_ONT", NULL, &buffer);
1047         if (status == AE_NOT_FOUND) {
1048                 return 0;
1049         } else if (ACPI_FAILURE(status)) {
1050                 dev_warn(&indio_dev->dev, "failed to execute _ONT: %d\n",
1051                          status);
1052                 return status;
1053         }
1054
1055         ont = buffer.pointer;
1056         if (ont->type != ACPI_TYPE_PACKAGE || ont->package.count != 6)
1057                 goto out;
1058
1059         /* The first 3 integers provide axis order information.
1060          * e.g. 0 1 2 would indicate normal X,Y,Z ordering.
1061          * e.g. 1 0 2 indicates that data arrives in order Y,X,Z.
1062          */
1063         elements = ont->package.elements;
1064         for (i = 0; i < 3; i++) {
1065                 if (elements[i].type != ACPI_TYPE_INTEGER)
1066                         goto out;
1067
1068                 val = elements[i].integer.value;
1069                 if (val > 2)
1070                         goto out;
1071
1072                 /* Avoiding full matrix multiplication, we simply reorder the
1073                  * columns in the default_ont matrix according to the
1074                  * ordering provided by _ONT.
1075                  */
1076                 final_ont[0][i] = default_ont[0][val];
1077                 final_ont[1][i] = default_ont[1][val];
1078                 final_ont[2][i] = default_ont[2][val];
1079         }
1080
1081         /* The final 3 integers provide sign flip information.
1082          * 0 means no change, 1 means flip.
1083          * e.g. 0 0 1 means that Z data should be sign-flipped.
1084          * This is applied after the axis reordering from above.
1085          */
1086         elements += 3;
1087         for (i = 0; i < 3; i++) {
1088                 if (elements[i].type != ACPI_TYPE_INTEGER)
1089                         goto out;
1090
1091                 val = elements[i].integer.value;
1092                 if (val != 0 && val != 1)
1093                         goto out;
1094                 if (!val)
1095                         continue;
1096
1097                 /* Flip the values in the indicated column */
1098                 final_ont[0][i] *= -1;
1099                 final_ont[1][i] *= -1;
1100                 final_ont[2][i] *= -1;
1101         }
1102
1103         /* Convert our integer matrix to a string-based iio_mount_matrix */
1104         adata->mount_matrix = devm_kmalloc(&indio_dev->dev,
1105                                            sizeof(*adata->mount_matrix),
1106                                            GFP_KERNEL);
1107         if (!adata->mount_matrix) {
1108                 ret = -ENOMEM;
1109                 goto out;
1110         }
1111
1112         for (i = 0; i < 3; i++) {
1113                 for (j = 0; j < 3; j++) {
1114                         int matrix_val = final_ont[i][j];
1115                         char *str_value;
1116
1117                         switch (matrix_val) {
1118                         case -1:
1119                                 str_value = "-1";
1120                                 break;
1121                         case 0:
1122                                 str_value = "0";
1123                                 break;
1124                         case 1:
1125                                 str_value = "1";
1126                                 break;
1127                         default:
1128                                 goto out;
1129                         }
1130                         adata->mount_matrix->rotation[i * 3 + j] = str_value;
1131                 }
1132         }
1133
1134         /* Expose the mount matrix via ext_info */
1135         for (i = 0; i < indio_dev->num_channels; i++)
1136                 channels[i].ext_info = mount_matrix_ext_info;
1137
1138         ret = 0;
1139         dev_info(&indio_dev->dev, "computed mount matrix from ACPI\n");
1140
1141 out:
1142         kfree(buffer.pointer);
1143         return ret;
1144 #else /* !CONFIG_ACPI */
1145         return 0;
1146 #endif
1147 }
1148
1149 /*
1150  * st_accel_get_settings() - get sensor settings from device name
1151  * @name: device name buffer reference.
1152  *
1153  * Return: valid reference on success, NULL otherwise.
1154  */
1155 const struct st_sensor_settings *st_accel_get_settings(const char *name)
1156 {
1157         int index = st_sensors_get_settings_index(name,
1158                                         st_accel_sensors_settings,
1159                                         ARRAY_SIZE(st_accel_sensors_settings));
1160         if (index < 0)
1161                 return NULL;
1162
1163         return &st_accel_sensors_settings[index];
1164 }
1165 EXPORT_SYMBOL(st_accel_get_settings);
1166
1167 int st_accel_common_probe(struct iio_dev *indio_dev)
1168 {
1169         struct st_sensor_data *adata = iio_priv(indio_dev);
1170         struct st_sensors_platform_data *pdata =
1171                 (struct st_sensors_platform_data *)adata->dev->platform_data;
1172         struct iio_chan_spec *channels;
1173         size_t channels_size;
1174         int err;
1175
1176         indio_dev->modes = INDIO_DIRECT_MODE;
1177         indio_dev->info = &accel_info;
1178
1179         err = st_sensors_power_enable(indio_dev);
1180         if (err)
1181                 return err;
1182
1183         err = st_sensors_verify_id(indio_dev);
1184         if (err < 0)
1185                 goto st_accel_power_off;
1186
1187         adata->num_data_channels = ST_ACCEL_NUMBER_DATA_CHANNELS;
1188         indio_dev->num_channels = ST_SENSORS_NUMBER_ALL_CHANNELS;
1189
1190         channels_size = indio_dev->num_channels * sizeof(struct iio_chan_spec);
1191         channels = devm_kmemdup(&indio_dev->dev,
1192                                 adata->sensor_settings->ch,
1193                                 channels_size, GFP_KERNEL);
1194         if (!channels) {
1195                 err = -ENOMEM;
1196                 goto st_accel_power_off;
1197         }
1198
1199         if (apply_acpi_orientation(indio_dev, channels))
1200                 dev_warn(&indio_dev->dev,
1201                          "failed to apply ACPI orientation data: %d\n", err);
1202
1203         indio_dev->channels = channels;
1204         adata->current_fullscale = (struct st_sensor_fullscale_avl *)
1205                                         &adata->sensor_settings->fs.fs_avl[0];
1206         adata->odr = adata->sensor_settings->odr.odr_avl[0].hz;
1207
1208         if (!pdata)
1209                 pdata = (struct st_sensors_platform_data *)&default_accel_pdata;
1210
1211         err = st_sensors_init_sensor(indio_dev, pdata);
1212         if (err < 0)
1213                 goto st_accel_power_off;
1214
1215         err = st_accel_allocate_ring(indio_dev);
1216         if (err < 0)
1217                 goto st_accel_power_off;
1218
1219         if (adata->irq > 0) {
1220                 err = st_sensors_allocate_trigger(indio_dev,
1221                                                  ST_ACCEL_TRIGGER_OPS);
1222                 if (err < 0)
1223                         goto st_accel_probe_trigger_error;
1224         }
1225
1226         err = iio_device_register(indio_dev);
1227         if (err)
1228                 goto st_accel_device_register_error;
1229
1230         dev_info(&indio_dev->dev, "registered accelerometer %s\n",
1231                  indio_dev->name);
1232
1233         return 0;
1234
1235 st_accel_device_register_error:
1236         if (adata->irq > 0)
1237                 st_sensors_deallocate_trigger(indio_dev);
1238 st_accel_probe_trigger_error:
1239         st_accel_deallocate_ring(indio_dev);
1240 st_accel_power_off:
1241         st_sensors_power_disable(indio_dev);
1242
1243         return err;
1244 }
1245 EXPORT_SYMBOL(st_accel_common_probe);
1246
1247 void st_accel_common_remove(struct iio_dev *indio_dev)
1248 {
1249         struct st_sensor_data *adata = iio_priv(indio_dev);
1250
1251         st_sensors_power_disable(indio_dev);
1252
1253         iio_device_unregister(indio_dev);
1254         if (adata->irq > 0)
1255                 st_sensors_deallocate_trigger(indio_dev);
1256
1257         st_accel_deallocate_ring(indio_dev);
1258 }
1259 EXPORT_SYMBOL(st_accel_common_remove);
1260
1261 MODULE_AUTHOR("Denis Ciocca <denis.ciocca@st.com>");
1262 MODULE_DESCRIPTION("STMicroelectronics accelerometers driver");
1263 MODULE_LICENSE("GPL v2");