forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-05-10 37f49e37ab4cb5d0bc4c60eb5c6d4dd57db767bb
kernel/drivers/iio/pressure/st_pressure_core.c
....@@ -1,11 +1,10 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * STMicroelectronics pressures driver
34 *
45 * Copyright 2013 STMicroelectronics Inc.
56 *
67 * Denis Ciocca <denis.ciocca@st.com>
7
- *
8
- * Licensed under the GPL-2.
98 */
109
1110 #include <linux/kernel.h>
....@@ -13,10 +12,8 @@
1312 #include <linux/slab.h>
1413 #include <linux/errno.h>
1514 #include <linux/types.h>
16
-#include <linux/mutex.h>
1715 #include <linux/interrupt.h>
1816 #include <linux/i2c.h>
19
-#include <linux/gpio.h>
2017 #include <linux/irq.h>
2118 #include <linux/delay.h>
2219 #include <linux/iio/iio.h>
....@@ -492,6 +489,75 @@
492489 .multi_read_bit = false,
493490 .bootime = 2,
494491 },
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
+ },
495561 };
496562
497563 static int st_press_write_raw(struct iio_dev *indio_dev,
....@@ -596,27 +662,36 @@
596662 #define ST_PRESS_TRIGGER_OPS NULL
597663 #endif
598664
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
+
599683 int st_press_common_probe(struct iio_dev *indio_dev)
600684 {
601685 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);
605687 int err;
606688
607689 indio_dev->modes = INDIO_DIRECT_MODE;
608690 indio_dev->info = &press_info;
609
- mutex_init(&press_data->tb.buf_lock);
610691
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);
618693 if (err < 0)
619
- goto st_press_power_off;
694
+ return err;
620695
621696 /*
622697 * Skip timestamping channel while declaring available channels to
....@@ -625,13 +700,10 @@
625700 * element.
626701 */
627702 press_data->num_data_channels = press_data->sensor_settings->num_ch - 1;
628
- press_data->multiread_bit = press_data->sensor_settings->multi_read_bit;
629703 indio_dev->channels = press_data->sensor_settings->ch;
630704 indio_dev->num_channels = press_data->sensor_settings->num_ch;
631705
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];
635707
636708 press_data->odr = press_data->sensor_settings->odr.odr_avl[0].hz;
637709
....@@ -642,13 +714,13 @@
642714
643715 err = st_sensors_init_sensor(indio_dev, pdata);
644716 if (err < 0)
645
- goto st_press_power_off;
717
+ return err;
646718
647719 err = st_press_allocate_ring(indio_dev);
648720 if (err < 0)
649
- goto st_press_power_off;
721
+ return err;
650722
651
- if (irq > 0) {
723
+ if (press_data->irq > 0) {
652724 err = st_sensors_allocate_trigger(indio_dev,
653725 ST_PRESS_TRIGGER_OPS);
654726 if (err < 0)
....@@ -665,13 +737,10 @@
665737 return err;
666738
667739 st_press_device_register_error:
668
- if (irq > 0)
740
+ if (press_data->irq > 0)
669741 st_sensors_deallocate_trigger(indio_dev);
670742 st_press_probe_trigger_error:
671743 st_press_deallocate_ring(indio_dev);
672
-st_press_power_off:
673
- st_sensors_power_disable(indio_dev);
674
-
675744 return err;
676745 }
677746 EXPORT_SYMBOL(st_press_common_probe);
....@@ -680,10 +749,8 @@
680749 {
681750 struct st_sensor_data *press_data = iio_priv(indio_dev);
682751
683
- st_sensors_power_disable(indio_dev);
684
-
685752 iio_device_unregister(indio_dev);
686
- if (press_data->get_irq_data_ready(indio_dev) > 0)
753
+ if (press_data->irq > 0)
687754 st_sensors_deallocate_trigger(indio_dev);
688755
689756 st_press_deallocate_ring(indio_dev);