| .. | .. |
|---|
| 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); |
|---|