.. | .. |
---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-only |
---|
1 | 2 | /* |
---|
2 | 3 | * STMicroelectronics magnetometers driver |
---|
3 | 4 | * |
---|
4 | 5 | * Copyright 2012-2013 STMicroelectronics Inc. |
---|
5 | 6 | * |
---|
6 | 7 | * Denis Ciocca <denis.ciocca@st.com> |
---|
7 | | - * |
---|
8 | | - * Licensed under the GPL-2. |
---|
9 | 8 | */ |
---|
10 | 9 | |
---|
11 | 10 | #include <linux/kernel.h> |
---|
.. | .. |
---|
13 | 12 | #include <linux/slab.h> |
---|
14 | 13 | #include <linux/errno.h> |
---|
15 | 14 | #include <linux/types.h> |
---|
16 | | -#include <linux/mutex.h> |
---|
17 | 15 | #include <linux/interrupt.h> |
---|
18 | 16 | #include <linux/i2c.h> |
---|
19 | | -#include <linux/gpio.h> |
---|
20 | 17 | #include <linux/irq.h> |
---|
21 | 18 | #include <linux/delay.h> |
---|
22 | 19 | #include <linux/iio/iio.h> |
---|
.. | .. |
---|
29 | 26 | #define ST_MAGN_NUMBER_DATA_CHANNELS 3 |
---|
30 | 27 | |
---|
31 | 28 | /* DEFAULT VALUE FOR SENSORS */ |
---|
32 | | -#define ST_MAGN_DEFAULT_OUT_X_H_ADDR 0X03 |
---|
33 | | -#define ST_MAGN_DEFAULT_OUT_Y_H_ADDR 0X07 |
---|
34 | | -#define ST_MAGN_DEFAULT_OUT_Z_H_ADDR 0X05 |
---|
| 29 | +#define ST_MAGN_DEFAULT_OUT_X_H_ADDR 0x03 |
---|
| 30 | +#define ST_MAGN_DEFAULT_OUT_Y_H_ADDR 0x07 |
---|
| 31 | +#define ST_MAGN_DEFAULT_OUT_Z_H_ADDR 0x05 |
---|
35 | 32 | |
---|
36 | 33 | /* FULLSCALE */ |
---|
37 | 34 | #define ST_MAGN_FS_AVL_1300MG 1300 |
---|
.. | .. |
---|
267 | 264 | .wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS, |
---|
268 | 265 | .sensors_supported = { |
---|
269 | 266 | [0] = LIS3MDL_MAGN_DEV_NAME, |
---|
| 267 | + [1] = LSM9DS1_MAGN_DEV_NAME, |
---|
270 | 268 | }, |
---|
271 | 269 | .ch = (struct iio_chan_spec *)st_magn_2_16bit_channels, |
---|
272 | 270 | .odr = { |
---|
.. | .. |
---|
314 | 312 | .gain = 584, |
---|
315 | 313 | }, |
---|
316 | 314 | }, |
---|
| 315 | + }, |
---|
| 316 | + .bdu = { |
---|
| 317 | + .addr = 0x24, |
---|
| 318 | + .mask = 0x40, |
---|
317 | 319 | }, |
---|
318 | 320 | .drdy_irq = { |
---|
319 | 321 | /* drdy line is routed drdy pin */ |
---|
.. | .. |
---|
466 | 468 | #define ST_MAGN_TRIGGER_OPS NULL |
---|
467 | 469 | #endif |
---|
468 | 470 | |
---|
| 471 | +/* |
---|
| 472 | + * st_magn_get_settings() - get sensor settings from device name |
---|
| 473 | + * @name: device name buffer reference. |
---|
| 474 | + * |
---|
| 475 | + * Return: valid reference on success, NULL otherwise. |
---|
| 476 | + */ |
---|
| 477 | +const struct st_sensor_settings *st_magn_get_settings(const char *name) |
---|
| 478 | +{ |
---|
| 479 | + int index = st_sensors_get_settings_index(name, |
---|
| 480 | + st_magn_sensors_settings, |
---|
| 481 | + ARRAY_SIZE(st_magn_sensors_settings)); |
---|
| 482 | + if (index < 0) |
---|
| 483 | + return NULL; |
---|
| 484 | + |
---|
| 485 | + return &st_magn_sensors_settings[index]; |
---|
| 486 | +} |
---|
| 487 | +EXPORT_SYMBOL(st_magn_get_settings); |
---|
| 488 | + |
---|
469 | 489 | int st_magn_common_probe(struct iio_dev *indio_dev) |
---|
470 | 490 | { |
---|
471 | 491 | struct st_sensor_data *mdata = iio_priv(indio_dev); |
---|
472 | | - int irq = mdata->get_irq_data_ready(indio_dev); |
---|
473 | 492 | int err; |
---|
474 | 493 | |
---|
475 | 494 | indio_dev->modes = INDIO_DIRECT_MODE; |
---|
476 | 495 | indio_dev->info = &magn_info; |
---|
477 | | - mutex_init(&mdata->tb.buf_lock); |
---|
478 | 496 | |
---|
479 | | - err = st_sensors_power_enable(indio_dev); |
---|
480 | | - if (err) |
---|
| 497 | + err = st_sensors_verify_id(indio_dev); |
---|
| 498 | + if (err < 0) |
---|
481 | 499 | return err; |
---|
482 | 500 | |
---|
483 | | - err = st_sensors_check_device_support(indio_dev, |
---|
484 | | - ARRAY_SIZE(st_magn_sensors_settings), |
---|
485 | | - st_magn_sensors_settings); |
---|
486 | | - if (err < 0) |
---|
487 | | - goto st_magn_power_off; |
---|
488 | | - |
---|
489 | 501 | mdata->num_data_channels = ST_MAGN_NUMBER_DATA_CHANNELS; |
---|
490 | | - mdata->multiread_bit = mdata->sensor_settings->multi_read_bit; |
---|
491 | 502 | indio_dev->channels = mdata->sensor_settings->ch; |
---|
492 | 503 | indio_dev->num_channels = ST_SENSORS_NUMBER_ALL_CHANNELS; |
---|
493 | 504 | |
---|
494 | | - mdata->current_fullscale = (struct st_sensor_fullscale_avl *) |
---|
495 | | - &mdata->sensor_settings->fs.fs_avl[0]; |
---|
| 505 | + mdata->current_fullscale = &mdata->sensor_settings->fs.fs_avl[0]; |
---|
496 | 506 | mdata->odr = mdata->sensor_settings->odr.odr_avl[0].hz; |
---|
497 | 507 | |
---|
498 | 508 | err = st_sensors_init_sensor(indio_dev, NULL); |
---|
499 | 509 | if (err < 0) |
---|
500 | | - goto st_magn_power_off; |
---|
| 510 | + return err; |
---|
501 | 511 | |
---|
502 | 512 | err = st_magn_allocate_ring(indio_dev); |
---|
503 | 513 | if (err < 0) |
---|
504 | | - goto st_magn_power_off; |
---|
| 514 | + return err; |
---|
505 | 515 | |
---|
506 | | - if (irq > 0) { |
---|
| 516 | + if (mdata->irq > 0) { |
---|
507 | 517 | err = st_sensors_allocate_trigger(indio_dev, |
---|
508 | 518 | ST_MAGN_TRIGGER_OPS); |
---|
509 | 519 | if (err < 0) |
---|
.. | .. |
---|
520 | 530 | return 0; |
---|
521 | 531 | |
---|
522 | 532 | st_magn_device_register_error: |
---|
523 | | - if (irq > 0) |
---|
| 533 | + if (mdata->irq > 0) |
---|
524 | 534 | st_sensors_deallocate_trigger(indio_dev); |
---|
525 | 535 | st_magn_probe_trigger_error: |
---|
526 | 536 | st_magn_deallocate_ring(indio_dev); |
---|
527 | | -st_magn_power_off: |
---|
528 | | - st_sensors_power_disable(indio_dev); |
---|
529 | | - |
---|
530 | 537 | return err; |
---|
531 | 538 | } |
---|
532 | 539 | EXPORT_SYMBOL(st_magn_common_probe); |
---|
.. | .. |
---|
535 | 542 | { |
---|
536 | 543 | struct st_sensor_data *mdata = iio_priv(indio_dev); |
---|
537 | 544 | |
---|
538 | | - st_sensors_power_disable(indio_dev); |
---|
539 | | - |
---|
540 | 545 | iio_device_unregister(indio_dev); |
---|
541 | | - if (mdata->get_irq_data_ready(indio_dev) > 0) |
---|
| 546 | + if (mdata->irq > 0) |
---|
542 | 547 | st_sensors_deallocate_trigger(indio_dev); |
---|
543 | 548 | |
---|
544 | 549 | st_magn_deallocate_ring(indio_dev); |
---|