hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/drivers/iio/accel/st_accel_i2c.c
....@@ -1,11 +1,10 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * STMicroelectronics accelerometers driver
34 *
45 * Copyright 2012-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>
....@@ -19,7 +18,6 @@
1918 #include <linux/iio/common/st_sensors_i2c.h>
2019 #include "st_accel.h"
2120
22
-#ifdef CONFIG_OF
2321 static const struct of_device_id st_accel_of_match[] = {
2422 {
2523 /* An older compatible */
....@@ -98,12 +96,21 @@
9896 .compatible = "st,lis2dw12",
9997 .data = LIS2DW12_ACCEL_DEV_NAME,
10098 },
99
+ {
100
+ .compatible = "st,lis3de",
101
+ .data = LIS3DE_ACCEL_DEV_NAME,
102
+ },
103
+ {
104
+ .compatible = "st,lis2de12",
105
+ .data = LIS2DE12_ACCEL_DEV_NAME,
106
+ },
107
+ {
108
+ .compatible = "st,lis2hh12",
109
+ .data = LIS2HH12_ACCEL_DEV_NAME,
110
+ },
101111 {},
102112 };
103113 MODULE_DEVICE_TABLE(of, st_accel_of_match);
104
-#else
105
-#define st_accel_of_match NULL
106
-#endif
107114
108115 #ifdef CONFIG_ACPI
109116 static const struct acpi_device_id st_accel_acpi_match[] = {
....@@ -112,8 +119,6 @@
112119 { },
113120 };
114121 MODULE_DEVICE_TABLE(acpi, st_accel_acpi_match);
115
-#else
116
-#define st_accel_acpi_match NULL
117122 #endif
118123
119124 static const struct i2c_device_id st_accel_id_table[] = {
....@@ -135,39 +140,63 @@
135140 { LIS331DL_ACCEL_DEV_NAME },
136141 { LIS3LV02DL_ACCEL_DEV_NAME },
137142 { LIS2DW12_ACCEL_DEV_NAME },
143
+ { LIS3DE_ACCEL_DEV_NAME },
144
+ { LIS2DE12_ACCEL_DEV_NAME },
145
+ { LIS2HH12_ACCEL_DEV_NAME },
138146 {},
139147 };
140148 MODULE_DEVICE_TABLE(i2c, st_accel_id_table);
141149
142150 static int st_accel_i2c_probe(struct i2c_client *client)
143151 {
144
- struct iio_dev *indio_dev;
152
+ const struct st_sensor_settings *settings;
145153 struct st_sensor_data *adata;
146
- const char *match;
154
+ struct iio_dev *indio_dev;
147155 int ret;
156
+
157
+ st_sensors_dev_name_probe(&client->dev, client->name, sizeof(client->name));
158
+
159
+ settings = st_accel_get_settings(client->name);
160
+ if (!settings) {
161
+ dev_err(&client->dev, "device name %s not recognized.\n",
162
+ client->name);
163
+ return -ENODEV;
164
+ }
148165
149166 indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*adata));
150167 if (!indio_dev)
151168 return -ENOMEM;
152169
153170 adata = iio_priv(indio_dev);
171
+ adata->sensor_settings = (struct st_sensor_settings *)settings;
154172
155
- match = device_get_match_data(&client->dev);
156
- if (match)
157
- strlcpy(client->name, match, sizeof(client->name));
158
-
159
- st_sensors_i2c_configure(indio_dev, client, adata);
160
-
161
- ret = st_accel_common_probe(indio_dev);
173
+ ret = st_sensors_i2c_configure(indio_dev, client);
162174 if (ret < 0)
163175 return ret;
164176
177
+ ret = st_sensors_power_enable(indio_dev);
178
+ if (ret)
179
+ return ret;
180
+
181
+ ret = st_accel_common_probe(indio_dev);
182
+ if (ret < 0)
183
+ goto st_accel_power_off;
184
+
165185 return 0;
186
+
187
+st_accel_power_off:
188
+ st_sensors_power_disable(indio_dev);
189
+
190
+ return ret;
166191 }
167192
168193 static int st_accel_i2c_remove(struct i2c_client *client)
169194 {
170
- st_accel_common_remove(i2c_get_clientdata(client));
195
+ struct iio_dev *indio_dev = i2c_get_clientdata(client);
196
+
197
+ st_accel_common_remove(indio_dev);
198
+
199
+ st_sensors_power_disable(indio_dev);
171200
172201 return 0;
173202 }
....@@ -175,7 +204,7 @@
175204 static struct i2c_driver st_accel_driver = {
176205 .driver = {
177206 .name = "st-accel-i2c",
178
- .of_match_table = of_match_ptr(st_accel_of_match),
207
+ .of_match_table = st_accel_of_match,
179208 .acpi_match_table = ACPI_PTR(st_accel_acpi_match),
180209 },
181210 .probe_new = st_accel_i2c_probe,