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