Merge tag 'xtensa-20180820' of git://github.com/jcmvbkbc/linux-xtensa
[sfrench/cifs-2.6.git] / drivers / iio / common / st_sensors / st_sensors_core.c
1 /*
2  * STMicroelectronics sensors core library 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/delay.h>
15 #include <linux/iio/iio.h>
16 #include <linux/regulator/consumer.h>
17 #include <linux/of.h>
18 #include <linux/of_device.h>
19 #include <asm/unaligned.h>
20 #include <linux/iio/common/st_sensors.h>
21
22 #include "st_sensors_core.h"
23
24 static inline u32 st_sensors_get_unaligned_le24(const u8 *p)
25 {
26         return (s32)((p[0] | p[1] << 8 | p[2] << 16) << 8) >> 8;
27 }
28
29 int st_sensors_write_data_with_mask(struct iio_dev *indio_dev,
30                                     u8 reg_addr, u8 mask, u8 data)
31 {
32         int err;
33         u8 new_data;
34         struct st_sensor_data *sdata = iio_priv(indio_dev);
35
36         err = sdata->tf->read_byte(&sdata->tb, sdata->dev, reg_addr, &new_data);
37         if (err < 0)
38                 goto st_sensors_write_data_with_mask_error;
39
40         new_data = ((new_data & (~mask)) | ((data << __ffs(mask)) & mask));
41         err = sdata->tf->write_byte(&sdata->tb, sdata->dev, reg_addr, new_data);
42
43 st_sensors_write_data_with_mask_error:
44         return err;
45 }
46
47 int st_sensors_debugfs_reg_access(struct iio_dev *indio_dev,
48                                   unsigned reg, unsigned writeval,
49                                   unsigned *readval)
50 {
51         struct st_sensor_data *sdata = iio_priv(indio_dev);
52         u8 readdata;
53         int err;
54
55         if (!readval)
56                 return sdata->tf->write_byte(&sdata->tb, sdata->dev,
57                                              (u8)reg, (u8)writeval);
58
59         err = sdata->tf->read_byte(&sdata->tb, sdata->dev, (u8)reg, &readdata);
60         if (err < 0)
61                 return err;
62
63         *readval = (unsigned)readdata;
64
65         return 0;
66 }
67 EXPORT_SYMBOL(st_sensors_debugfs_reg_access);
68
69 static int st_sensors_match_odr(struct st_sensor_settings *sensor_settings,
70                         unsigned int odr, struct st_sensor_odr_avl *odr_out)
71 {
72         int i, ret = -EINVAL;
73
74         for (i = 0; i < ST_SENSORS_ODR_LIST_MAX; i++) {
75                 if (sensor_settings->odr.odr_avl[i].hz == 0)
76                         goto st_sensors_match_odr_error;
77
78                 if (sensor_settings->odr.odr_avl[i].hz == odr) {
79                         odr_out->hz = sensor_settings->odr.odr_avl[i].hz;
80                         odr_out->value = sensor_settings->odr.odr_avl[i].value;
81                         ret = 0;
82                         break;
83                 }
84         }
85
86 st_sensors_match_odr_error:
87         return ret;
88 }
89
90 int st_sensors_set_odr(struct iio_dev *indio_dev, unsigned int odr)
91 {
92         int err;
93         struct st_sensor_odr_avl odr_out = {0, 0};
94         struct st_sensor_data *sdata = iio_priv(indio_dev);
95
96         if (!sdata->sensor_settings->odr.addr)
97                 return 0;
98
99         err = st_sensors_match_odr(sdata->sensor_settings, odr, &odr_out);
100         if (err < 0)
101                 goto st_sensors_match_odr_error;
102
103         if ((sdata->sensor_settings->odr.addr ==
104                                         sdata->sensor_settings->pw.addr) &&
105                                 (sdata->sensor_settings->odr.mask ==
106                                         sdata->sensor_settings->pw.mask)) {
107                 if (sdata->enabled == true) {
108                         err = st_sensors_write_data_with_mask(indio_dev,
109                                 sdata->sensor_settings->odr.addr,
110                                 sdata->sensor_settings->odr.mask,
111                                 odr_out.value);
112                 } else {
113                         err = 0;
114                 }
115         } else {
116                 err = st_sensors_write_data_with_mask(indio_dev,
117                         sdata->sensor_settings->odr.addr,
118                         sdata->sensor_settings->odr.mask,
119                         odr_out.value);
120         }
121         if (err >= 0)
122                 sdata->odr = odr_out.hz;
123
124 st_sensors_match_odr_error:
125         return err;
126 }
127 EXPORT_SYMBOL(st_sensors_set_odr);
128
129 static int st_sensors_match_fs(struct st_sensor_settings *sensor_settings,
130                                         unsigned int fs, int *index_fs_avl)
131 {
132         int i, ret = -EINVAL;
133
134         for (i = 0; i < ST_SENSORS_FULLSCALE_AVL_MAX; i++) {
135                 if (sensor_settings->fs.fs_avl[i].num == 0)
136                         goto st_sensors_match_odr_error;
137
138                 if (sensor_settings->fs.fs_avl[i].num == fs) {
139                         *index_fs_avl = i;
140                         ret = 0;
141                         break;
142                 }
143         }
144
145 st_sensors_match_odr_error:
146         return ret;
147 }
148
149 static int st_sensors_set_fullscale(struct iio_dev *indio_dev, unsigned int fs)
150 {
151         int err, i = 0;
152         struct st_sensor_data *sdata = iio_priv(indio_dev);
153
154         if (sdata->sensor_settings->fs.addr == 0)
155                 return 0;
156
157         err = st_sensors_match_fs(sdata->sensor_settings, fs, &i);
158         if (err < 0)
159                 goto st_accel_set_fullscale_error;
160
161         err = st_sensors_write_data_with_mask(indio_dev,
162                                 sdata->sensor_settings->fs.addr,
163                                 sdata->sensor_settings->fs.mask,
164                                 sdata->sensor_settings->fs.fs_avl[i].value);
165         if (err < 0)
166                 goto st_accel_set_fullscale_error;
167
168         sdata->current_fullscale = (struct st_sensor_fullscale_avl *)
169                                         &sdata->sensor_settings->fs.fs_avl[i];
170         return err;
171
172 st_accel_set_fullscale_error:
173         dev_err(&indio_dev->dev, "failed to set new fullscale.\n");
174         return err;
175 }
176
177 int st_sensors_set_enable(struct iio_dev *indio_dev, bool enable)
178 {
179         u8 tmp_value;
180         int err = -EINVAL;
181         bool found = false;
182         struct st_sensor_odr_avl odr_out = {0, 0};
183         struct st_sensor_data *sdata = iio_priv(indio_dev);
184
185         if (enable) {
186                 tmp_value = sdata->sensor_settings->pw.value_on;
187                 if ((sdata->sensor_settings->odr.addr ==
188                                         sdata->sensor_settings->pw.addr) &&
189                                 (sdata->sensor_settings->odr.mask ==
190                                         sdata->sensor_settings->pw.mask)) {
191                         err = st_sensors_match_odr(sdata->sensor_settings,
192                                                         sdata->odr, &odr_out);
193                         if (err < 0)
194                                 goto set_enable_error;
195                         tmp_value = odr_out.value;
196                         found = true;
197                 }
198                 err = st_sensors_write_data_with_mask(indio_dev,
199                                 sdata->sensor_settings->pw.addr,
200                                 sdata->sensor_settings->pw.mask, tmp_value);
201                 if (err < 0)
202                         goto set_enable_error;
203
204                 sdata->enabled = true;
205
206                 if (found)
207                         sdata->odr = odr_out.hz;
208         } else {
209                 err = st_sensors_write_data_with_mask(indio_dev,
210                                 sdata->sensor_settings->pw.addr,
211                                 sdata->sensor_settings->pw.mask,
212                                 sdata->sensor_settings->pw.value_off);
213                 if (err < 0)
214                         goto set_enable_error;
215
216                 sdata->enabled = false;
217         }
218
219 set_enable_error:
220         return err;
221 }
222 EXPORT_SYMBOL(st_sensors_set_enable);
223
224 int st_sensors_set_axis_enable(struct iio_dev *indio_dev, u8 axis_enable)
225 {
226         struct st_sensor_data *sdata = iio_priv(indio_dev);
227         int err = 0;
228
229         if (sdata->sensor_settings->enable_axis.addr)
230                 err = st_sensors_write_data_with_mask(indio_dev,
231                                 sdata->sensor_settings->enable_axis.addr,
232                                 sdata->sensor_settings->enable_axis.mask,
233                                 axis_enable);
234         return err;
235 }
236 EXPORT_SYMBOL(st_sensors_set_axis_enable);
237
238 int st_sensors_power_enable(struct iio_dev *indio_dev)
239 {
240         struct st_sensor_data *pdata = iio_priv(indio_dev);
241         int err;
242
243         /* Regulators not mandatory, but if requested we should enable them. */
244         pdata->vdd = devm_regulator_get(indio_dev->dev.parent, "vdd");
245         if (IS_ERR(pdata->vdd)) {
246                 dev_err(&indio_dev->dev, "unable to get Vdd supply\n");
247                 return PTR_ERR(pdata->vdd);
248         }
249         err = regulator_enable(pdata->vdd);
250         if (err != 0) {
251                 dev_warn(&indio_dev->dev,
252                          "Failed to enable specified Vdd supply\n");
253                 return err;
254         }
255
256         pdata->vdd_io = devm_regulator_get(indio_dev->dev.parent, "vddio");
257         if (IS_ERR(pdata->vdd_io)) {
258                 dev_err(&indio_dev->dev, "unable to get Vdd_IO supply\n");
259                 err = PTR_ERR(pdata->vdd_io);
260                 goto st_sensors_disable_vdd;
261         }
262         err = regulator_enable(pdata->vdd_io);
263         if (err != 0) {
264                 dev_warn(&indio_dev->dev,
265                          "Failed to enable specified Vdd_IO supply\n");
266                 goto st_sensors_disable_vdd;
267         }
268
269         return 0;
270
271 st_sensors_disable_vdd:
272         regulator_disable(pdata->vdd);
273         return err;
274 }
275 EXPORT_SYMBOL(st_sensors_power_enable);
276
277 void st_sensors_power_disable(struct iio_dev *indio_dev)
278 {
279         struct st_sensor_data *pdata = iio_priv(indio_dev);
280
281         regulator_disable(pdata->vdd);
282         regulator_disable(pdata->vdd_io);
283 }
284 EXPORT_SYMBOL(st_sensors_power_disable);
285
286 static int st_sensors_set_drdy_int_pin(struct iio_dev *indio_dev,
287                                         struct st_sensors_platform_data *pdata)
288 {
289         struct st_sensor_data *sdata = iio_priv(indio_dev);
290
291         /* Sensor does not support interrupts */
292         if (!sdata->sensor_settings->drdy_irq.int1.addr &&
293             !sdata->sensor_settings->drdy_irq.int2.addr) {
294                 if (pdata->drdy_int_pin)
295                         dev_info(&indio_dev->dev,
296                                  "DRDY on pin INT%d specified, but sensor "
297                                  "does not support interrupts\n",
298                                  pdata->drdy_int_pin);
299                 return 0;
300         }
301
302         switch (pdata->drdy_int_pin) {
303         case 1:
304                 if (!sdata->sensor_settings->drdy_irq.int1.mask) {
305                         dev_err(&indio_dev->dev,
306                                         "DRDY on INT1 not available.\n");
307                         return -EINVAL;
308                 }
309                 sdata->drdy_int_pin = 1;
310                 break;
311         case 2:
312                 if (!sdata->sensor_settings->drdy_irq.int2.mask) {
313                         dev_err(&indio_dev->dev,
314                                         "DRDY on INT2 not available.\n");
315                         return -EINVAL;
316                 }
317                 sdata->drdy_int_pin = 2;
318                 break;
319         default:
320                 dev_err(&indio_dev->dev, "DRDY on pdata not valid.\n");
321                 return -EINVAL;
322         }
323
324         if (pdata->open_drain) {
325                 if (!sdata->sensor_settings->drdy_irq.int1.addr_od &&
326                     !sdata->sensor_settings->drdy_irq.int2.addr_od)
327                         dev_err(&indio_dev->dev,
328                                 "open drain requested but unsupported.\n");
329                 else
330                         sdata->int_pin_open_drain = true;
331         }
332
333         return 0;
334 }
335
336 #ifdef CONFIG_OF
337 static struct st_sensors_platform_data *st_sensors_of_probe(struct device *dev,
338                 struct st_sensors_platform_data *defdata)
339 {
340         struct st_sensors_platform_data *pdata;
341         struct device_node *np = dev->of_node;
342         u32 val;
343
344         if (!np)
345                 return NULL;
346
347         pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
348         if (!of_property_read_u32(np, "st,drdy-int-pin", &val) && (val <= 2))
349                 pdata->drdy_int_pin = (u8) val;
350         else
351                 pdata->drdy_int_pin = defdata ? defdata->drdy_int_pin : 0;
352
353         pdata->open_drain = of_property_read_bool(np, "drive-open-drain");
354
355         return pdata;
356 }
357
358 /**
359  * st_sensors_of_name_probe() - device tree probe for ST sensor name
360  * @dev: driver model representation of the device.
361  * @match: the OF match table for the device, containing compatible strings
362  *      but also a .data field with the corresponding internal kernel name
363  *      used by this sensor.
364  * @name: device name buffer reference.
365  * @len: device name buffer length.
366  *
367  * In effect this function matches a compatible string to an internal kernel
368  * name for a certain sensor device, so that the rest of the autodetection can
369  * rely on that name from this point on. I2C/SPI devices will be renamed
370  * to match the internal kernel convention.
371  */
372 void st_sensors_of_name_probe(struct device *dev,
373                               const struct of_device_id *match,
374                               char *name, int len)
375 {
376         const struct of_device_id *of_id;
377
378         of_id = of_match_device(match, dev);
379         if (!of_id || !of_id->data)
380                 return;
381
382         /* The name from the OF match takes precedence if present */
383         strlcpy(name, of_id->data, len);
384 }
385 EXPORT_SYMBOL(st_sensors_of_name_probe);
386 #else
387 static struct st_sensors_platform_data *st_sensors_of_probe(struct device *dev,
388                 struct st_sensors_platform_data *defdata)
389 {
390         return NULL;
391 }
392 #endif
393
394 int st_sensors_init_sensor(struct iio_dev *indio_dev,
395                                         struct st_sensors_platform_data *pdata)
396 {
397         struct st_sensor_data *sdata = iio_priv(indio_dev);
398         struct st_sensors_platform_data *of_pdata;
399         int err = 0;
400
401         /* If OF/DT pdata exists, it will take precedence of anything else */
402         of_pdata = st_sensors_of_probe(indio_dev->dev.parent, pdata);
403         if (of_pdata)
404                 pdata = of_pdata;
405
406         if (pdata) {
407                 err = st_sensors_set_drdy_int_pin(indio_dev, pdata);
408                 if (err < 0)
409                         return err;
410         }
411
412         err = st_sensors_set_enable(indio_dev, false);
413         if (err < 0)
414                 return err;
415
416         /* Disable DRDY, this might be still be enabled after reboot. */
417         err = st_sensors_set_dataready_irq(indio_dev, false);
418         if (err < 0)
419                 return err;
420
421         if (sdata->current_fullscale) {
422                 err = st_sensors_set_fullscale(indio_dev,
423                                                 sdata->current_fullscale->num);
424                 if (err < 0)
425                         return err;
426         } else
427                 dev_info(&indio_dev->dev, "Full-scale not possible\n");
428
429         err = st_sensors_set_odr(indio_dev, sdata->odr);
430         if (err < 0)
431                 return err;
432
433         /* set BDU */
434         if (sdata->sensor_settings->bdu.addr) {
435                 err = st_sensors_write_data_with_mask(indio_dev,
436                                         sdata->sensor_settings->bdu.addr,
437                                         sdata->sensor_settings->bdu.mask, true);
438                 if (err < 0)
439                         return err;
440         }
441
442         /* set DAS */
443         if (sdata->sensor_settings->das.addr) {
444                 err = st_sensors_write_data_with_mask(indio_dev,
445                                         sdata->sensor_settings->das.addr,
446                                         sdata->sensor_settings->das.mask, 1);
447                 if (err < 0)
448                         return err;
449         }
450
451         if (sdata->int_pin_open_drain) {
452                 u8 addr, mask;
453
454                 if (sdata->drdy_int_pin == 1) {
455                         addr = sdata->sensor_settings->drdy_irq.int1.addr_od;
456                         mask = sdata->sensor_settings->drdy_irq.int1.mask_od;
457                 } else {
458                         addr = sdata->sensor_settings->drdy_irq.int2.addr_od;
459                         mask = sdata->sensor_settings->drdy_irq.int2.mask_od;
460                 }
461
462                 dev_info(&indio_dev->dev,
463                          "set interrupt line to open drain mode on pin %d\n",
464                          sdata->drdy_int_pin);
465                 err = st_sensors_write_data_with_mask(indio_dev, addr,
466                                                       mask, 1);
467                 if (err < 0)
468                         return err;
469         }
470
471         err = st_sensors_set_axis_enable(indio_dev, ST_SENSORS_ENABLE_ALL_AXIS);
472
473         return err;
474 }
475 EXPORT_SYMBOL(st_sensors_init_sensor);
476
477 int st_sensors_set_dataready_irq(struct iio_dev *indio_dev, bool enable)
478 {
479         int err;
480         u8 drdy_addr, drdy_mask;
481         struct st_sensor_data *sdata = iio_priv(indio_dev);
482
483         if (!sdata->sensor_settings->drdy_irq.int1.addr &&
484             !sdata->sensor_settings->drdy_irq.int2.addr) {
485                 /*
486                  * there are some devices (e.g. LIS3MDL) where drdy line is
487                  * routed to a given pin and it is not possible to select a
488                  * different one. Take into account irq status register
489                  * to understand if irq trigger can be properly supported
490                  */
491                 if (sdata->sensor_settings->drdy_irq.stat_drdy.addr)
492                         sdata->hw_irq_trigger = enable;
493                 return 0;
494         }
495
496         /* Enable/Disable the interrupt generator 1. */
497         if (sdata->sensor_settings->drdy_irq.ig1.en_addr > 0) {
498                 err = st_sensors_write_data_with_mask(indio_dev,
499                                 sdata->sensor_settings->drdy_irq.ig1.en_addr,
500                                 sdata->sensor_settings->drdy_irq.ig1.en_mask,
501                                 (int)enable);
502                 if (err < 0)
503                         goto st_accel_set_dataready_irq_error;
504         }
505
506         if (sdata->drdy_int_pin == 1) {
507                 drdy_addr = sdata->sensor_settings->drdy_irq.int1.addr;
508                 drdy_mask = sdata->sensor_settings->drdy_irq.int1.mask;
509         } else {
510                 drdy_addr = sdata->sensor_settings->drdy_irq.int2.addr;
511                 drdy_mask = sdata->sensor_settings->drdy_irq.int2.mask;
512         }
513
514         /* Flag to the poll function that the hardware trigger is in use */
515         sdata->hw_irq_trigger = enable;
516
517         /* Enable/Disable the interrupt generator for data ready. */
518         err = st_sensors_write_data_with_mask(indio_dev, drdy_addr,
519                                               drdy_mask, (int)enable);
520
521 st_accel_set_dataready_irq_error:
522         return err;
523 }
524 EXPORT_SYMBOL(st_sensors_set_dataready_irq);
525
526 int st_sensors_set_fullscale_by_gain(struct iio_dev *indio_dev, int scale)
527 {
528         int err = -EINVAL, i;
529         struct st_sensor_data *sdata = iio_priv(indio_dev);
530
531         for (i = 0; i < ST_SENSORS_FULLSCALE_AVL_MAX; i++) {
532                 if ((sdata->sensor_settings->fs.fs_avl[i].gain == scale) &&
533                                 (sdata->sensor_settings->fs.fs_avl[i].gain != 0)) {
534                         err = 0;
535                         break;
536                 }
537         }
538         if (err < 0)
539                 goto st_sensors_match_scale_error;
540
541         err = st_sensors_set_fullscale(indio_dev,
542                                 sdata->sensor_settings->fs.fs_avl[i].num);
543
544 st_sensors_match_scale_error:
545         return err;
546 }
547 EXPORT_SYMBOL(st_sensors_set_fullscale_by_gain);
548
549 static int st_sensors_read_axis_data(struct iio_dev *indio_dev,
550                                 struct iio_chan_spec const *ch, int *data)
551 {
552         int err;
553         u8 *outdata;
554         struct st_sensor_data *sdata = iio_priv(indio_dev);
555         unsigned int byte_for_channel;
556
557         byte_for_channel = DIV_ROUND_UP(ch->scan_type.realbits +
558                                         ch->scan_type.shift, 8);
559         outdata = kmalloc(byte_for_channel, GFP_KERNEL);
560         if (!outdata)
561                 return -ENOMEM;
562
563         err = sdata->tf->read_multiple_byte(&sdata->tb, sdata->dev,
564                                 ch->address, byte_for_channel,
565                                 outdata, sdata->multiread_bit);
566         if (err < 0)
567                 goto st_sensors_free_memory;
568
569         if (byte_for_channel == 1)
570                 *data = (s8)*outdata;
571         else if (byte_for_channel == 2)
572                 *data = (s16)get_unaligned_le16(outdata);
573         else if (byte_for_channel == 3)
574                 *data = (s32)st_sensors_get_unaligned_le24(outdata);
575
576 st_sensors_free_memory:
577         kfree(outdata);
578
579         return err;
580 }
581
582 int st_sensors_read_info_raw(struct iio_dev *indio_dev,
583                                 struct iio_chan_spec const *ch, int *val)
584 {
585         int err;
586         struct st_sensor_data *sdata = iio_priv(indio_dev);
587
588         mutex_lock(&indio_dev->mlock);
589         if (indio_dev->currentmode == INDIO_BUFFER_TRIGGERED) {
590                 err = -EBUSY;
591                 goto out;
592         } else {
593                 err = st_sensors_set_enable(indio_dev, true);
594                 if (err < 0)
595                         goto out;
596
597                 msleep((sdata->sensor_settings->bootime * 1000) / sdata->odr);
598                 err = st_sensors_read_axis_data(indio_dev, ch, val);
599                 if (err < 0)
600                         goto out;
601
602                 *val = *val >> ch->scan_type.shift;
603
604                 err = st_sensors_set_enable(indio_dev, false);
605         }
606 out:
607         mutex_unlock(&indio_dev->mlock);
608
609         return err;
610 }
611 EXPORT_SYMBOL(st_sensors_read_info_raw);
612
613 static int st_sensors_init_interface_mode(struct iio_dev *indio_dev,
614                         const struct st_sensor_settings *sensor_settings)
615 {
616         struct st_sensor_data *sdata = iio_priv(indio_dev);
617         struct device_node *np = sdata->dev->of_node;
618         struct st_sensors_platform_data *pdata;
619
620         pdata = (struct st_sensors_platform_data *)sdata->dev->platform_data;
621         if (((np && of_property_read_bool(np, "spi-3wire")) ||
622              (pdata && pdata->spi_3wire)) && sensor_settings->sim.addr) {
623                 int err;
624
625                 err = sdata->tf->write_byte(&sdata->tb, sdata->dev,
626                                             sensor_settings->sim.addr,
627                                             sensor_settings->sim.value);
628                 if (err < 0) {
629                         dev_err(&indio_dev->dev,
630                                 "failed to init interface mode\n");
631                         return err;
632                 }
633         }
634
635         return 0;
636 }
637
638 int st_sensors_check_device_support(struct iio_dev *indio_dev,
639                         int num_sensors_list,
640                         const struct st_sensor_settings *sensor_settings)
641 {
642         int i, n, err = 0;
643         u8 wai;
644         struct st_sensor_data *sdata = iio_priv(indio_dev);
645
646         for (i = 0; i < num_sensors_list; i++) {
647                 for (n = 0; n < ST_SENSORS_MAX_4WAI; n++) {
648                         if (strcmp(indio_dev->name,
649                                 sensor_settings[i].sensors_supported[n]) == 0) {
650                                 break;
651                         }
652                 }
653                 if (n < ST_SENSORS_MAX_4WAI)
654                         break;
655         }
656         if (i == num_sensors_list) {
657                 dev_err(&indio_dev->dev, "device name %s not recognized.\n",
658                                                         indio_dev->name);
659                 return -ENODEV;
660         }
661
662         err = st_sensors_init_interface_mode(indio_dev, &sensor_settings[i]);
663         if (err < 0)
664                 return err;
665
666         if (sensor_settings[i].wai_addr) {
667                 err = sdata->tf->read_byte(&sdata->tb, sdata->dev,
668                                            sensor_settings[i].wai_addr, &wai);
669                 if (err < 0) {
670                         dev_err(&indio_dev->dev,
671                                 "failed to read Who-Am-I register.\n");
672                         return err;
673                 }
674
675                 if (sensor_settings[i].wai != wai) {
676                         dev_err(&indio_dev->dev,
677                                 "%s: WhoAmI mismatch (0x%x).\n",
678                                 indio_dev->name, wai);
679                         return -EINVAL;
680                 }
681         }
682
683         sdata->sensor_settings =
684                         (struct st_sensor_settings *)&sensor_settings[i];
685
686         return i;
687 }
688 EXPORT_SYMBOL(st_sensors_check_device_support);
689
690 ssize_t st_sensors_sysfs_sampling_frequency_avail(struct device *dev,
691                                 struct device_attribute *attr, char *buf)
692 {
693         int i, len = 0;
694         struct iio_dev *indio_dev = dev_get_drvdata(dev);
695         struct st_sensor_data *sdata = iio_priv(indio_dev);
696
697         mutex_lock(&indio_dev->mlock);
698         for (i = 0; i < ST_SENSORS_ODR_LIST_MAX; i++) {
699                 if (sdata->sensor_settings->odr.odr_avl[i].hz == 0)
700                         break;
701
702                 len += scnprintf(buf + len, PAGE_SIZE - len, "%d ",
703                                 sdata->sensor_settings->odr.odr_avl[i].hz);
704         }
705         mutex_unlock(&indio_dev->mlock);
706         buf[len - 1] = '\n';
707
708         return len;
709 }
710 EXPORT_SYMBOL(st_sensors_sysfs_sampling_frequency_avail);
711
712 ssize_t st_sensors_sysfs_scale_avail(struct device *dev,
713                                 struct device_attribute *attr, char *buf)
714 {
715         int i, len = 0, q, r;
716         struct iio_dev *indio_dev = dev_get_drvdata(dev);
717         struct st_sensor_data *sdata = iio_priv(indio_dev);
718
719         mutex_lock(&indio_dev->mlock);
720         for (i = 0; i < ST_SENSORS_FULLSCALE_AVL_MAX; i++) {
721                 if (sdata->sensor_settings->fs.fs_avl[i].num == 0)
722                         break;
723
724                 q = sdata->sensor_settings->fs.fs_avl[i].gain / 1000000;
725                 r = sdata->sensor_settings->fs.fs_avl[i].gain % 1000000;
726
727                 len += scnprintf(buf + len, PAGE_SIZE - len, "%u.%06u ", q, r);
728         }
729         mutex_unlock(&indio_dev->mlock);
730         buf[len - 1] = '\n';
731
732         return len;
733 }
734 EXPORT_SYMBOL(st_sensors_sysfs_scale_avail);
735
736 MODULE_AUTHOR("Denis Ciocca <denis.ciocca@st.com>");
737 MODULE_DESCRIPTION("STMicroelectronics ST-sensors core");
738 MODULE_LICENSE("GPL v2");