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
st_sensors_get_unaligned_le24(const u8 * p)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
st_sensors_write_data_with_mask(struct iio_dev * indio_dev,u8 reg_addr,u8 mask,u8 data)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
st_sensors_debugfs_reg_access(struct iio_dev * indio_dev,unsigned reg,unsigned writeval,unsigned * readval)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
st_sensors_match_odr(struct st_sensor_settings * sensor_settings,unsigned int odr,struct st_sensor_odr_avl * odr_out)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
st_sensors_set_odr(struct iio_dev * indio_dev,unsigned int odr)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
st_sensors_match_fs(struct st_sensor_settings * sensor_settings,unsigned int fs,int * index_fs_avl)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
st_sensors_set_fullscale(struct iio_dev * indio_dev,unsigned int fs)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
st_sensors_set_enable(struct iio_dev * indio_dev,bool enable)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
st_sensors_set_axis_enable(struct iio_dev * indio_dev,u8 axis_enable)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
st_sensors_power_enable(struct iio_dev * indio_dev)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
st_sensors_power_disable(struct iio_dev * indio_dev)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
st_sensors_set_drdy_int_pin(struct iio_dev * indio_dev,struct st_sensors_platform_data * pdata)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
st_sensors_of_probe(struct device * dev,struct st_sensors_platform_data * defdata)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 */
st_sensors_of_name_probe(struct device * dev,const struct of_device_id * match,char * name,int len)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
st_sensors_of_probe(struct device * dev,struct st_sensors_platform_data * defdata)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
st_sensors_init_sensor(struct iio_dev * indio_dev,struct st_sensors_platform_data * pdata)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
st_sensors_set_dataready_irq(struct iio_dev * indio_dev,bool enable)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
st_sensors_set_fullscale_by_gain(struct iio_dev * indio_dev,int scale)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
st_sensors_read_axis_data(struct iio_dev * indio_dev,struct iio_chan_spec const * ch,int * data)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
st_sensors_read_info_raw(struct iio_dev * indio_dev,struct iio_chan_spec const * ch,int * val)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
st_sensors_init_interface_mode(struct iio_dev * indio_dev,const struct st_sensor_settings * sensor_settings)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
st_sensors_check_device_support(struct iio_dev * indio_dev,int num_sensors_list,const struct st_sensor_settings * sensor_settings)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
st_sensors_sysfs_sampling_frequency_avail(struct device * dev,struct device_attribute * attr,char * buf)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
st_sensors_sysfs_scale_avail(struct device * dev,struct device_attribute * attr,char * buf)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");
739