forked from ~ljy/RK356X_SDK_RELEASE

hc
2023-12-11 072de836f53be56a70cecf70b43ae43b7ce17376
kernel/drivers/iio/pressure/st_pressure_spi.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>
....@@ -18,7 +17,6 @@
1817 #include <linux/iio/common/st_sensors_spi.h>
1918 #include "st_pressure.h"
2019
21
-#ifdef CONFIG_OF
2220 /*
2321 * For new single-chip sensors use <device_name> as compatible string.
2422 * For old single-chip devices keep <device_name>-press to maintain
....@@ -49,39 +47,64 @@
4947 .compatible = "st,lps35hw",
5048 .data = LPS35HW_PRESS_DEV_NAME,
5149 },
50
+ {
51
+ .compatible = "st,lps22hh",
52
+ .data = LPS22HH_PRESS_DEV_NAME,
53
+ },
5254 {},
5355 };
5456 MODULE_DEVICE_TABLE(of, st_press_of_match);
55
-#else
56
-#define st_press_of_match NULL
57
-#endif
5857
5958 static int st_press_spi_probe(struct spi_device *spi)
6059 {
61
- struct iio_dev *indio_dev;
60
+ const struct st_sensor_settings *settings;
6261 struct st_sensor_data *press_data;
62
+ struct iio_dev *indio_dev;
6363 int err;
6464
65
+ st_sensors_dev_name_probe(&spi->dev, spi->modalias, sizeof(spi->modalias));
66
+
67
+ settings = st_press_get_settings(spi->modalias);
68
+ if (!settings) {
69
+ dev_err(&spi->dev, "device name %s not recognized.\n",
70
+ spi->modalias);
71
+ return -ENODEV;
72
+ }
73
+
6574 indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*press_data));
66
- if (indio_dev == NULL)
75
+ if (!indio_dev)
6776 return -ENOMEM;
6877
6978 press_data = iio_priv(indio_dev);
79
+ press_data->sensor_settings = (struct st_sensor_settings *)settings;
7080
71
- st_sensors_of_name_probe(&spi->dev, st_press_of_match,
72
- spi->modalias, sizeof(spi->modalias));
73
- st_sensors_spi_configure(indio_dev, spi, press_data);
74
-
75
- err = st_press_common_probe(indio_dev);
81
+ err = st_sensors_spi_configure(indio_dev, spi);
7682 if (err < 0)
7783 return err;
7884
85
+ err = st_sensors_power_enable(indio_dev);
86
+ if (err)
87
+ return err;
88
+
89
+ err = st_press_common_probe(indio_dev);
90
+ if (err < 0)
91
+ goto st_press_power_off;
92
+
7993 return 0;
94
+
95
+st_press_power_off:
96
+ st_sensors_power_disable(indio_dev);
97
+
98
+ return err;
8099 }
81100
82101 static int st_press_spi_remove(struct spi_device *spi)
83102 {
84
- st_press_common_remove(spi_get_drvdata(spi));
103
+ struct iio_dev *indio_dev = spi_get_drvdata(spi);
104
+
105
+ st_press_common_remove(indio_dev);
106
+
107
+ st_sensors_power_disable(indio_dev);
85108
86109 return 0;
87110 }
....@@ -93,6 +116,7 @@
93116 { LPS22HB_PRESS_DEV_NAME },
94117 { LPS33HW_PRESS_DEV_NAME },
95118 { LPS35HW_PRESS_DEV_NAME },
119
+ { LPS22HH_PRESS_DEV_NAME },
96120 {},
97121 };
98122 MODULE_DEVICE_TABLE(spi, st_press_id_table);
....@@ -100,7 +124,7 @@
100124 static struct spi_driver st_press_driver = {
101125 .driver = {
102126 .name = "st-press-spi",
103
- .of_match_table = of_match_ptr(st_press_of_match),
127
+ .of_match_table = st_press_of_match,
104128 },
105129 .probe = st_press_spi_probe,
106130 .remove = st_press_spi_remove,