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