| .. | .. |
|---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-only |
|---|
| 1 | 2 | /* |
|---|
| 2 | 3 | * STMicroelectronics pressures driver |
|---|
| 3 | 4 | * |
|---|
| 4 | 5 | * Copyright 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> |
|---|
| .. | .. |
|---|
| 492 | 489 | .multi_read_bit = false, |
|---|
| 493 | 490 | .bootime = 2, |
|---|
| 494 | 491 | }, |
|---|
| 492 | + { |
|---|
| 493 | + /* |
|---|
| 494 | + * CUSTOM VALUES FOR LPS22HH SENSOR |
|---|
| 495 | + * See LPS22HH datasheet: |
|---|
| 496 | + * http://www2.st.com/resource/en/datasheet/lps22hh.pdf |
|---|
| 497 | + */ |
|---|
| 498 | + .wai = 0xb3, |
|---|
| 499 | + .wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS, |
|---|
| 500 | + .sensors_supported = { |
|---|
| 501 | + [0] = LPS22HH_PRESS_DEV_NAME, |
|---|
| 502 | + }, |
|---|
| 503 | + .ch = (struct iio_chan_spec *)st_press_lps22hb_channels, |
|---|
| 504 | + .num_ch = ARRAY_SIZE(st_press_lps22hb_channels), |
|---|
| 505 | + .odr = { |
|---|
| 506 | + .addr = 0x10, |
|---|
| 507 | + .mask = 0x70, |
|---|
| 508 | + .odr_avl = { |
|---|
| 509 | + { .hz = 1, .value = 0x01 }, |
|---|
| 510 | + { .hz = 10, .value = 0x02 }, |
|---|
| 511 | + { .hz = 25, .value = 0x03 }, |
|---|
| 512 | + { .hz = 50, .value = 0x04 }, |
|---|
| 513 | + { .hz = 75, .value = 0x05 }, |
|---|
| 514 | + { .hz = 100, .value = 0x06 }, |
|---|
| 515 | + { .hz = 200, .value = 0x07 }, |
|---|
| 516 | + }, |
|---|
| 517 | + }, |
|---|
| 518 | + .pw = { |
|---|
| 519 | + .addr = 0x10, |
|---|
| 520 | + .mask = 0x70, |
|---|
| 521 | + .value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE, |
|---|
| 522 | + }, |
|---|
| 523 | + .fs = { |
|---|
| 524 | + .fs_avl = { |
|---|
| 525 | + /* |
|---|
| 526 | + * Pressure and temperature sensitivity values |
|---|
| 527 | + * as defined in table 3 of LPS22HH datasheet. |
|---|
| 528 | + */ |
|---|
| 529 | + [0] = { |
|---|
| 530 | + .num = ST_PRESS_FS_AVL_1260MB, |
|---|
| 531 | + .gain = ST_PRESS_KPASCAL_NANO_SCALE, |
|---|
| 532 | + .gain2 = ST_PRESS_LPS22HB_LSB_PER_CELSIUS, |
|---|
| 533 | + }, |
|---|
| 534 | + }, |
|---|
| 535 | + }, |
|---|
| 536 | + .bdu = { |
|---|
| 537 | + .addr = 0x10, |
|---|
| 538 | + .mask = BIT(1), |
|---|
| 539 | + }, |
|---|
| 540 | + .drdy_irq = { |
|---|
| 541 | + .int1 = { |
|---|
| 542 | + .addr = 0x12, |
|---|
| 543 | + .mask = BIT(2), |
|---|
| 544 | + .addr_od = 0x11, |
|---|
| 545 | + .mask_od = BIT(5), |
|---|
| 546 | + }, |
|---|
| 547 | + .addr_ihl = 0x11, |
|---|
| 548 | + .mask_ihl = BIT(6), |
|---|
| 549 | + .stat_drdy = { |
|---|
| 550 | + .addr = ST_SENSORS_DEFAULT_STAT_ADDR, |
|---|
| 551 | + .mask = 0x03, |
|---|
| 552 | + }, |
|---|
| 553 | + }, |
|---|
| 554 | + .sim = { |
|---|
| 555 | + .addr = 0x10, |
|---|
| 556 | + .value = BIT(0), |
|---|
| 557 | + }, |
|---|
| 558 | + .multi_read_bit = false, |
|---|
| 559 | + .bootime = 2, |
|---|
| 560 | + }, |
|---|
| 495 | 561 | }; |
|---|
| 496 | 562 | |
|---|
| 497 | 563 | static int st_press_write_raw(struct iio_dev *indio_dev, |
|---|
| .. | .. |
|---|
| 596 | 662 | #define ST_PRESS_TRIGGER_OPS NULL |
|---|
| 597 | 663 | #endif |
|---|
| 598 | 664 | |
|---|
| 665 | +/* |
|---|
| 666 | + * st_press_get_settings() - get sensor settings from device name |
|---|
| 667 | + * @name: device name buffer reference. |
|---|
| 668 | + * |
|---|
| 669 | + * Return: valid reference on success, NULL otherwise. |
|---|
| 670 | + */ |
|---|
| 671 | +const struct st_sensor_settings *st_press_get_settings(const char *name) |
|---|
| 672 | +{ |
|---|
| 673 | + int index = st_sensors_get_settings_index(name, |
|---|
| 674 | + st_press_sensors_settings, |
|---|
| 675 | + ARRAY_SIZE(st_press_sensors_settings)); |
|---|
| 676 | + if (index < 0) |
|---|
| 677 | + return NULL; |
|---|
| 678 | + |
|---|
| 679 | + return &st_press_sensors_settings[index]; |
|---|
| 680 | +} |
|---|
| 681 | +EXPORT_SYMBOL(st_press_get_settings); |
|---|
| 682 | + |
|---|
| 599 | 683 | int st_press_common_probe(struct iio_dev *indio_dev) |
|---|
| 600 | 684 | { |
|---|
| 601 | 685 | struct st_sensor_data *press_data = iio_priv(indio_dev); |
|---|
| 602 | | - struct st_sensors_platform_data *pdata = |
|---|
| 603 | | - (struct st_sensors_platform_data *)press_data->dev->platform_data; |
|---|
| 604 | | - int irq = press_data->get_irq_data_ready(indio_dev); |
|---|
| 686 | + struct st_sensors_platform_data *pdata = dev_get_platdata(press_data->dev); |
|---|
| 605 | 687 | int err; |
|---|
| 606 | 688 | |
|---|
| 607 | 689 | indio_dev->modes = INDIO_DIRECT_MODE; |
|---|
| 608 | 690 | indio_dev->info = &press_info; |
|---|
| 609 | | - mutex_init(&press_data->tb.buf_lock); |
|---|
| 610 | 691 | |
|---|
| 611 | | - err = st_sensors_power_enable(indio_dev); |
|---|
| 612 | | - if (err) |
|---|
| 613 | | - return err; |
|---|
| 614 | | - |
|---|
| 615 | | - err = st_sensors_check_device_support(indio_dev, |
|---|
| 616 | | - ARRAY_SIZE(st_press_sensors_settings), |
|---|
| 617 | | - st_press_sensors_settings); |
|---|
| 692 | + err = st_sensors_verify_id(indio_dev); |
|---|
| 618 | 693 | if (err < 0) |
|---|
| 619 | | - goto st_press_power_off; |
|---|
| 694 | + return err; |
|---|
| 620 | 695 | |
|---|
| 621 | 696 | /* |
|---|
| 622 | 697 | * Skip timestamping channel while declaring available channels to |
|---|
| .. | .. |
|---|
| 625 | 700 | * element. |
|---|
| 626 | 701 | */ |
|---|
| 627 | 702 | press_data->num_data_channels = press_data->sensor_settings->num_ch - 1; |
|---|
| 628 | | - press_data->multiread_bit = press_data->sensor_settings->multi_read_bit; |
|---|
| 629 | 703 | indio_dev->channels = press_data->sensor_settings->ch; |
|---|
| 630 | 704 | indio_dev->num_channels = press_data->sensor_settings->num_ch; |
|---|
| 631 | 705 | |
|---|
| 632 | | - press_data->current_fullscale = |
|---|
| 633 | | - (struct st_sensor_fullscale_avl *) |
|---|
| 634 | | - &press_data->sensor_settings->fs.fs_avl[0]; |
|---|
| 706 | + press_data->current_fullscale = &press_data->sensor_settings->fs.fs_avl[0]; |
|---|
| 635 | 707 | |
|---|
| 636 | 708 | press_data->odr = press_data->sensor_settings->odr.odr_avl[0].hz; |
|---|
| 637 | 709 | |
|---|
| .. | .. |
|---|
| 642 | 714 | |
|---|
| 643 | 715 | err = st_sensors_init_sensor(indio_dev, pdata); |
|---|
| 644 | 716 | if (err < 0) |
|---|
| 645 | | - goto st_press_power_off; |
|---|
| 717 | + return err; |
|---|
| 646 | 718 | |
|---|
| 647 | 719 | err = st_press_allocate_ring(indio_dev); |
|---|
| 648 | 720 | if (err < 0) |
|---|
| 649 | | - goto st_press_power_off; |
|---|
| 721 | + return err; |
|---|
| 650 | 722 | |
|---|
| 651 | | - if (irq > 0) { |
|---|
| 723 | + if (press_data->irq > 0) { |
|---|
| 652 | 724 | err = st_sensors_allocate_trigger(indio_dev, |
|---|
| 653 | 725 | ST_PRESS_TRIGGER_OPS); |
|---|
| 654 | 726 | if (err < 0) |
|---|
| .. | .. |
|---|
| 665 | 737 | return err; |
|---|
| 666 | 738 | |
|---|
| 667 | 739 | st_press_device_register_error: |
|---|
| 668 | | - if (irq > 0) |
|---|
| 740 | + if (press_data->irq > 0) |
|---|
| 669 | 741 | st_sensors_deallocate_trigger(indio_dev); |
|---|
| 670 | 742 | st_press_probe_trigger_error: |
|---|
| 671 | 743 | st_press_deallocate_ring(indio_dev); |
|---|
| 672 | | -st_press_power_off: |
|---|
| 673 | | - st_sensors_power_disable(indio_dev); |
|---|
| 674 | | - |
|---|
| 675 | 744 | return err; |
|---|
| 676 | 745 | } |
|---|
| 677 | 746 | EXPORT_SYMBOL(st_press_common_probe); |
|---|
| .. | .. |
|---|
| 680 | 749 | { |
|---|
| 681 | 750 | struct st_sensor_data *press_data = iio_priv(indio_dev); |
|---|
| 682 | 751 | |
|---|
| 683 | | - st_sensors_power_disable(indio_dev); |
|---|
| 684 | | - |
|---|
| 685 | 752 | iio_device_unregister(indio_dev); |
|---|
| 686 | | - if (press_data->get_irq_data_ready(indio_dev) > 0) |
|---|
| 753 | + if (press_data->irq > 0) |
|---|
| 687 | 754 | st_sensors_deallocate_trigger(indio_dev); |
|---|
| 688 | 755 | |
|---|
| 689 | 756 | st_press_deallocate_ring(indio_dev); |
|---|