]> git.karo-electronics.de Git - karo-tx-linux.git/blob - drivers/iio/accel/st_accel_core.c
Merge remote-tracking branches 'spi/topic/ti-qspi' and 'spi/topic/topcliff-pch' into...
[karo-tx-linux.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                         .addr = 0x22,
163                         .mask_int1 = 0x10,
164                         .mask_int2 = 0x08,
165                         .addr_ihl = 0x25,
166                         .mask_ihl = 0x02,
167                         .addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
168                 },
169                 .multi_read_bit = true,
170                 .bootime = 2,
171         },
172         {
173                 .wai = 0x32,
174                 .wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
175                 .sensors_supported = {
176                         [0] = LIS331DLH_ACCEL_DEV_NAME,
177                         [1] = LSM303DL_ACCEL_DEV_NAME,
178                         [2] = LSM303DLH_ACCEL_DEV_NAME,
179                         [3] = LSM303DLM_ACCEL_DEV_NAME,
180                 },
181                 .ch = (struct iio_chan_spec *)st_accel_12bit_channels,
182                 .odr = {
183                         .addr = 0x20,
184                         .mask = 0x18,
185                         .odr_avl = {
186                                 { .hz = 50, .value = 0x00, },
187                                 { .hz = 100, .value = 0x01, },
188                                 { .hz = 400, .value = 0x02, },
189                                 { .hz = 1000, .value = 0x03, },
190                         },
191                 },
192                 .pw = {
193                         .addr = 0x20,
194                         .mask = 0xe0,
195                         .value_on = ST_SENSORS_DEFAULT_POWER_ON_VALUE,
196                         .value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
197                 },
198                 .enable_axis = {
199                         .addr = ST_SENSORS_DEFAULT_AXIS_ADDR,
200                         .mask = ST_SENSORS_DEFAULT_AXIS_MASK,
201                 },
202                 .fs = {
203                         .addr = 0x23,
204                         .mask = 0x30,
205                         .fs_avl = {
206                                 [0] = {
207                                         .num = ST_ACCEL_FS_AVL_2G,
208                                         .value = 0x00,
209                                         .gain = IIO_G_TO_M_S_2(1000),
210                                 },
211                                 [1] = {
212                                         .num = ST_ACCEL_FS_AVL_4G,
213                                         .value = 0x01,
214                                         .gain = IIO_G_TO_M_S_2(2000),
215                                 },
216                                 [2] = {
217                                         .num = ST_ACCEL_FS_AVL_8G,
218                                         .value = 0x03,
219                                         .gain = IIO_G_TO_M_S_2(3900),
220                                 },
221                         },
222                 },
223                 .bdu = {
224                         .addr = 0x23,
225                         .mask = 0x80,
226                 },
227                 .drdy_irq = {
228                         .addr = 0x22,
229                         .mask_int1 = 0x02,
230                         .mask_int2 = 0x10,
231                         .addr_ihl = 0x22,
232                         .mask_ihl = 0x80,
233                         .addr_od = 0x22,
234                         .mask_od = 0x40,
235                         .addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
236                 },
237                 .multi_read_bit = true,
238                 .bootime = 2,
239         },
240         {
241                 .wai = 0x40,
242                 .wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
243                 .sensors_supported = {
244                         [0] = LSM330_ACCEL_DEV_NAME,
245                 },
246                 .ch = (struct iio_chan_spec *)st_accel_16bit_channels,
247                 .odr = {
248                         .addr = 0x20,
249                         .mask = 0xf0,
250                         .odr_avl = {
251                                 { .hz = 3, .value = 0x01, },
252                                 { .hz = 6, .value = 0x02, },
253                                 { .hz = 12, .value = 0x03, },
254                                 { .hz = 25, .value = 0x04, },
255                                 { .hz = 50, .value = 0x05, },
256                                 { .hz = 100, .value = 0x06, },
257                                 { .hz = 200, .value = 0x07, },
258                                 { .hz = 400, .value = 0x08, },
259                                 { .hz = 800, .value = 0x09, },
260                                 { .hz = 1600, .value = 0x0a, },
261                         },
262                 },
263                 .pw = {
264                         .addr = 0x20,
265                         .mask = 0xf0,
266                         .value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
267                 },
268                 .enable_axis = {
269                         .addr = ST_SENSORS_DEFAULT_AXIS_ADDR,
270                         .mask = ST_SENSORS_DEFAULT_AXIS_MASK,
271                 },
272                 .fs = {
273                         .addr = 0x24,
274                         .mask = 0x38,
275                         .fs_avl = {
276                                 [0] = {
277                                         .num = ST_ACCEL_FS_AVL_2G,
278                                         .value = 0x00,
279                                         .gain = IIO_G_TO_M_S_2(61),
280                                 },
281                                 [1] = {
282                                         .num = ST_ACCEL_FS_AVL_4G,
283                                         .value = 0x01,
284                                         .gain = IIO_G_TO_M_S_2(122),
285                                 },
286                                 [2] = {
287                                         .num = ST_ACCEL_FS_AVL_6G,
288                                         .value = 0x02,
289                                         .gain = IIO_G_TO_M_S_2(183),
290                                 },
291                                 [3] = {
292                                         .num = ST_ACCEL_FS_AVL_8G,
293                                         .value = 0x03,
294                                         .gain = IIO_G_TO_M_S_2(244),
295                                 },
296                                 [4] = {
297                                         .num = ST_ACCEL_FS_AVL_16G,
298                                         .value = 0x04,
299                                         .gain = IIO_G_TO_M_S_2(732),
300                                 },
301                         },
302                 },
303                 .bdu = {
304                         .addr = 0x20,
305                         .mask = 0x08,
306                 },
307                 .drdy_irq = {
308                         .addr = 0x23,
309                         .mask_int1 = 0x80,
310                         .mask_int2 = 0x00,
311                         .addr_ihl = 0x23,
312                         .mask_ihl = 0x40,
313                         .addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
314                         .ig1 = {
315                                 .en_addr = 0x23,
316                                 .en_mask = 0x08,
317                         },
318                 },
319                 .multi_read_bit = false,
320                 .bootime = 2,
321         },
322         {
323                 .wai = 0x3a,
324                 .wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
325                 .sensors_supported = {
326                         [0] = LIS3LV02DL_ACCEL_DEV_NAME,
327                 },
328                 .ch = (struct iio_chan_spec *)st_accel_12bit_channels,
329                 .odr = {
330                         .addr = 0x20,
331                         .mask = 0x30, /* DF1 and DF0 */
332                         .odr_avl = {
333                                 { .hz = 40, .value = 0x00, },
334                                 { .hz = 160, .value = 0x01, },
335                                 { .hz = 640, .value = 0x02, },
336                                 { .hz = 2560, .value = 0x03, },
337                         },
338                 },
339                 .pw = {
340                         .addr = 0x20,
341                         .mask = 0xc0,
342                         .value_on = ST_SENSORS_DEFAULT_POWER_ON_VALUE,
343                         .value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
344                 },
345                 .enable_axis = {
346                         .addr = ST_SENSORS_DEFAULT_AXIS_ADDR,
347                         .mask = ST_SENSORS_DEFAULT_AXIS_MASK,
348                 },
349                 .fs = {
350                         .addr = 0x21,
351                         .mask = 0x80,
352                         .fs_avl = {
353                                 [0] = {
354                                         .num = ST_ACCEL_FS_AVL_2G,
355                                         .value = 0x00,
356                                         .gain = IIO_G_TO_M_S_2(1024),
357                                 },
358                                 [1] = {
359                                         .num = ST_ACCEL_FS_AVL_6G,
360                                         .value = 0x01,
361                                         .gain = IIO_G_TO_M_S_2(340),
362                                 },
363                         },
364                 },
365                 .bdu = {
366                         .addr = 0x21,
367                         .mask = 0x40,
368                 },
369                 .drdy_irq = {
370                         .addr = 0x21,
371                         .mask_int1 = 0x04,
372                         .addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
373                 },
374                 .multi_read_bit = true,
375                 .bootime = 2, /* guess */
376         },
377         {
378                 .wai = 0x3b,
379                 .wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
380                 .sensors_supported = {
381                         [0] = LIS331DL_ACCEL_DEV_NAME,
382                 },
383                 .ch = (struct iio_chan_spec *)st_accel_8bit_channels,
384                 .odr = {
385                         .addr = 0x20,
386                         .mask = 0x80,
387                         .odr_avl = {
388                                 { .hz = 100, .value = 0x00, },
389                                 { .hz = 400, .value = 0x01, },
390                         },
391                 },
392                 .pw = {
393                         .addr = 0x20,
394                         .mask = 0x40,
395                         .value_on = ST_SENSORS_DEFAULT_POWER_ON_VALUE,
396                         .value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
397                 },
398                 .enable_axis = {
399                         .addr = ST_SENSORS_DEFAULT_AXIS_ADDR,
400                         .mask = ST_SENSORS_DEFAULT_AXIS_MASK,
401                 },
402                 .fs = {
403                         .addr = 0x20,
404                         .mask = 0x20,
405                         /*
406                          * TODO: check these resulting gain settings, these are
407                          * not in the datsheet
408                          */
409                         .fs_avl = {
410                                 [0] = {
411                                         .num = ST_ACCEL_FS_AVL_2G,
412                                         .value = 0x00,
413                                         .gain = IIO_G_TO_M_S_2(18000),
414                                 },
415                                 [1] = {
416                                         .num = ST_ACCEL_FS_AVL_8G,
417                                         .value = 0x01,
418                                         .gain = IIO_G_TO_M_S_2(72000),
419                                 },
420                         },
421                 },
422                 .drdy_irq = {
423                         .addr = 0x22,
424                         .mask_int1 = 0x04,
425                         .mask_int2 = 0x20,
426                         .addr_ihl = 0x22,
427                         .mask_ihl = 0x80,
428                         .addr_od = 0x22,
429                         .mask_od = 0x40,
430                         .addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
431                 },
432                 .multi_read_bit = false,
433                 .bootime = 2, /* guess */
434         },
435         {
436                 .wai = 0x32,
437                 .wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
438                 .sensors_supported = {
439                         [0] = H3LIS331DL_DRIVER_NAME,
440                 },
441                 .ch = (struct iio_chan_spec *)st_accel_12bit_channels,
442                 .odr = {
443                         .addr = 0x20,
444                         .mask = 0x18,
445                         .odr_avl = {
446                                 { .hz = 50, .value = 0x00, },
447                                 { .hz = 100, .value = 0x01, },
448                                 { .hz = 400, .value = 0x02, },
449                                 { .hz = 1000, .value = 0x03, },
450                         },
451                 },
452                 .pw = {
453                         .addr = 0x20,
454                         .mask = 0x20,
455                         .value_on = ST_SENSORS_DEFAULT_POWER_ON_VALUE,
456                         .value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
457                 },
458                 .enable_axis = {
459                         .addr = ST_SENSORS_DEFAULT_AXIS_ADDR,
460                         .mask = ST_SENSORS_DEFAULT_AXIS_MASK,
461                 },
462                 .fs = {
463                         .addr = 0x23,
464                         .mask = 0x30,
465                         .fs_avl = {
466                                 [0] = {
467                                         .num = ST_ACCEL_FS_AVL_100G,
468                                         .value = 0x00,
469                                         .gain = IIO_G_TO_M_S_2(49000),
470                                 },
471                                 [1] = {
472                                         .num = ST_ACCEL_FS_AVL_200G,
473                                         .value = 0x01,
474                                         .gain = IIO_G_TO_M_S_2(98000),
475                                 },
476                                 [2] = {
477                                         .num = ST_ACCEL_FS_AVL_400G,
478                                         .value = 0x03,
479                                         .gain = IIO_G_TO_M_S_2(195000),
480                                 },
481                         },
482                 },
483                 .bdu = {
484                         .addr = 0x23,
485                         .mask = 0x80,
486                 },
487                 .drdy_irq = {
488                         .addr = 0x22,
489                         .mask_int1 = 0x02,
490                         .mask_int2 = 0x10,
491                         .addr_ihl = 0x22,
492                         .mask_ihl = 0x80,
493                 },
494                 .multi_read_bit = true,
495                 .bootime = 2,
496         },
497         {
498                 /* No WAI register present */
499                 .sensors_supported = {
500                         [0] = LIS3L02DQ_ACCEL_DEV_NAME,
501                 },
502                 .ch = (struct iio_chan_spec *)st_accel_12bit_channels,
503                 .odr = {
504                         .addr = 0x20,
505                         .mask = 0x30,
506                         .odr_avl = {
507                                 { .hz = 280, .value = 0x00, },
508                                 { .hz = 560, .value = 0x01, },
509                                 { .hz = 1120, .value = 0x02, },
510                                 { .hz = 4480, .value = 0x03, },
511                         },
512                 },
513                 .pw = {
514                         .addr = 0x20,
515                         .mask = 0xc0,
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                         .fs_avl = {
525                                 [0] = {
526                                         .num = ST_ACCEL_FS_AVL_2G,
527                                         .gain = IIO_G_TO_M_S_2(488),
528                                 },
529                         },
530                 },
531                 /*
532                  * The part has a BDU bit but if set the data is never
533                  * updated so don't set it.
534                  */
535                 .bdu = {
536                 },
537                 .drdy_irq = {
538                         .addr = 0x21,
539                         .mask_int1 = 0x04,
540                         .addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
541                 },
542                 .multi_read_bit = false,
543                 .bootime = 2,
544         },
545         {
546                 .wai = 0x33,
547                 .wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
548                 .sensors_supported = {
549                         [0] = LNG2DM_ACCEL_DEV_NAME,
550                 },
551                 .ch = (struct iio_chan_spec *)st_accel_8bit_channels,
552                 .odr = {
553                         .addr = 0x20,
554                         .mask = 0xf0,
555                         .odr_avl = {
556                                 { .hz = 1, .value = 0x01, },
557                                 { .hz = 10, .value = 0x02, },
558                                 { .hz = 25, .value = 0x03, },
559                                 { .hz = 50, .value = 0x04, },
560                                 { .hz = 100, .value = 0x05, },
561                                 { .hz = 200, .value = 0x06, },
562                                 { .hz = 400, .value = 0x07, },
563                                 { .hz = 1600, .value = 0x08, },
564                         },
565                 },
566                 .pw = {
567                         .addr = 0x20,
568                         .mask = 0xf0,
569                         .value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
570                 },
571                 .enable_axis = {
572                         .addr = ST_SENSORS_DEFAULT_AXIS_ADDR,
573                         .mask = ST_SENSORS_DEFAULT_AXIS_MASK,
574                 },
575                 .fs = {
576                         .addr = 0x23,
577                         .mask = 0x30,
578                         .fs_avl = {
579                                 [0] = {
580                                         .num = ST_ACCEL_FS_AVL_2G,
581                                         .value = 0x00,
582                                         .gain = IIO_G_TO_M_S_2(15600),
583                                 },
584                                 [1] = {
585                                         .num = ST_ACCEL_FS_AVL_4G,
586                                         .value = 0x01,
587                                         .gain = IIO_G_TO_M_S_2(31200),
588                                 },
589                                 [2] = {
590                                         .num = ST_ACCEL_FS_AVL_8G,
591                                         .value = 0x02,
592                                         .gain = IIO_G_TO_M_S_2(62500),
593                                 },
594                                 [3] = {
595                                         .num = ST_ACCEL_FS_AVL_16G,
596                                         .value = 0x03,
597                                         .gain = IIO_G_TO_M_S_2(187500),
598                                 },
599                         },
600                 },
601                 .drdy_irq = {
602                         .addr = 0x22,
603                         .mask_int1 = 0x10,
604                         .mask_int2 = 0x08,
605                         .addr_ihl = 0x25,
606                         .mask_ihl = 0x02,
607                         .addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
608                 },
609                 .multi_read_bit = true,
610                 .bootime = 2,
611         },
612 };
613
614 static int st_accel_read_raw(struct iio_dev *indio_dev,
615                         struct iio_chan_spec const *ch, int *val,
616                                                         int *val2, long mask)
617 {
618         int err;
619         struct st_sensor_data *adata = iio_priv(indio_dev);
620
621         switch (mask) {
622         case IIO_CHAN_INFO_RAW:
623                 err = st_sensors_read_info_raw(indio_dev, ch, val);
624                 if (err < 0)
625                         goto read_error;
626
627                 return IIO_VAL_INT;
628         case IIO_CHAN_INFO_SCALE:
629                 *val = adata->current_fullscale->gain / 1000000;
630                 *val2 = adata->current_fullscale->gain % 1000000;
631                 return IIO_VAL_INT_PLUS_MICRO;
632         case IIO_CHAN_INFO_SAMP_FREQ:
633                 *val = adata->odr;
634                 return IIO_VAL_INT;
635         default:
636                 return -EINVAL;
637         }
638
639 read_error:
640         return err;
641 }
642
643 static int st_accel_write_raw(struct iio_dev *indio_dev,
644                 struct iio_chan_spec const *chan, int val, int val2, long mask)
645 {
646         int err;
647
648         switch (mask) {
649         case IIO_CHAN_INFO_SCALE: {
650                 int gain;
651
652                 gain = val * 1000000 + val2;
653                 err = st_sensors_set_fullscale_by_gain(indio_dev, gain);
654                 break;
655         }
656         case IIO_CHAN_INFO_SAMP_FREQ:
657                 if (val2)
658                         return -EINVAL;
659                 mutex_lock(&indio_dev->mlock);
660                 err = st_sensors_set_odr(indio_dev, val);
661                 mutex_unlock(&indio_dev->mlock);
662                 return err;
663         default:
664                 return -EINVAL;
665         }
666
667         return err;
668 }
669
670 static ST_SENSORS_DEV_ATTR_SAMP_FREQ_AVAIL();
671 static ST_SENSORS_DEV_ATTR_SCALE_AVAIL(in_accel_scale_available);
672
673 static struct attribute *st_accel_attributes[] = {
674         &iio_dev_attr_sampling_frequency_available.dev_attr.attr,
675         &iio_dev_attr_in_accel_scale_available.dev_attr.attr,
676         NULL,
677 };
678
679 static const struct attribute_group st_accel_attribute_group = {
680         .attrs = st_accel_attributes,
681 };
682
683 static const struct iio_info accel_info = {
684         .driver_module = THIS_MODULE,
685         .attrs = &st_accel_attribute_group,
686         .read_raw = &st_accel_read_raw,
687         .write_raw = &st_accel_write_raw,
688         .debugfs_reg_access = &st_sensors_debugfs_reg_access,
689 };
690
691 #ifdef CONFIG_IIO_TRIGGER
692 static const struct iio_trigger_ops st_accel_trigger_ops = {
693         .owner = THIS_MODULE,
694         .set_trigger_state = ST_ACCEL_TRIGGER_SET_STATE,
695         .validate_device = st_sensors_validate_device,
696 };
697 #define ST_ACCEL_TRIGGER_OPS (&st_accel_trigger_ops)
698 #else
699 #define ST_ACCEL_TRIGGER_OPS NULL
700 #endif
701
702 int st_accel_common_probe(struct iio_dev *indio_dev)
703 {
704         struct st_sensor_data *adata = iio_priv(indio_dev);
705         int irq = adata->get_irq_data_ready(indio_dev);
706         int err;
707
708         indio_dev->modes = INDIO_DIRECT_MODE;
709         indio_dev->info = &accel_info;
710         mutex_init(&adata->tb.buf_lock);
711
712         err = st_sensors_power_enable(indio_dev);
713         if (err)
714                 return err;
715
716         err = st_sensors_check_device_support(indio_dev,
717                                         ARRAY_SIZE(st_accel_sensors_settings),
718                                         st_accel_sensors_settings);
719         if (err < 0)
720                 goto st_accel_power_off;
721
722         adata->num_data_channels = ST_ACCEL_NUMBER_DATA_CHANNELS;
723         adata->multiread_bit = adata->sensor_settings->multi_read_bit;
724         indio_dev->channels = adata->sensor_settings->ch;
725         indio_dev->num_channels = ST_SENSORS_NUMBER_ALL_CHANNELS;
726
727         adata->current_fullscale = (struct st_sensor_fullscale_avl *)
728                                         &adata->sensor_settings->fs.fs_avl[0];
729         adata->odr = adata->sensor_settings->odr.odr_avl[0].hz;
730
731         if (!adata->dev->platform_data)
732                 adata->dev->platform_data =
733                         (struct st_sensors_platform_data *)&default_accel_pdata;
734
735         err = st_sensors_init_sensor(indio_dev, adata->dev->platform_data);
736         if (err < 0)
737                 goto st_accel_power_off;
738
739         err = st_accel_allocate_ring(indio_dev);
740         if (err < 0)
741                 goto st_accel_power_off;
742
743         if (irq > 0) {
744                 err = st_sensors_allocate_trigger(indio_dev,
745                                                  ST_ACCEL_TRIGGER_OPS);
746                 if (err < 0)
747                         goto st_accel_probe_trigger_error;
748         }
749
750         err = iio_device_register(indio_dev);
751         if (err)
752                 goto st_accel_device_register_error;
753
754         dev_info(&indio_dev->dev, "registered accelerometer %s\n",
755                  indio_dev->name);
756
757         return 0;
758
759 st_accel_device_register_error:
760         if (irq > 0)
761                 st_sensors_deallocate_trigger(indio_dev);
762 st_accel_probe_trigger_error:
763         st_accel_deallocate_ring(indio_dev);
764 st_accel_power_off:
765         st_sensors_power_disable(indio_dev);
766
767         return err;
768 }
769 EXPORT_SYMBOL(st_accel_common_probe);
770
771 void st_accel_common_remove(struct iio_dev *indio_dev)
772 {
773         struct st_sensor_data *adata = iio_priv(indio_dev);
774
775         st_sensors_power_disable(indio_dev);
776
777         iio_device_unregister(indio_dev);
778         if (adata->get_irq_data_ready(indio_dev) > 0)
779                 st_sensors_deallocate_trigger(indio_dev);
780
781         st_accel_deallocate_ring(indio_dev);
782 }
783 EXPORT_SYMBOL(st_accel_common_remove);
784
785 MODULE_AUTHOR("Denis Ciocca <denis.ciocca@st.com>");
786 MODULE_DESCRIPTION("STMicroelectronics accelerometers driver");
787 MODULE_LICENSE("GPL v2");