forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-05-10 37f49e37ab4cb5d0bc4c60eb5c6d4dd57db767bb
kernel/drivers/iio/magnetometer/st_magn_i2c.c
....@@ -1,11 +1,10 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * STMicroelectronics magnetometers 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>
....@@ -18,7 +17,6 @@
1817 #include <linux/iio/common/st_sensors_i2c.h>
1918 #include "st_magn.h"
2019
21
-#ifdef CONFIG_OF
2220 static const struct of_device_id st_magn_of_match[] = {
2321 {
2422 .compatible = "st,lsm303dlh-magn",
....@@ -44,41 +42,65 @@
4442 .compatible = "st,lis2mdl",
4543 .data = LIS2MDL_MAGN_DEV_NAME,
4644 },
45
+ {
46
+ .compatible = "st,lsm9ds1-magn",
47
+ .data = LSM9DS1_MAGN_DEV_NAME,
48
+ },
4749 {},
4850 };
4951 MODULE_DEVICE_TABLE(of, st_magn_of_match);
50
-#else
51
-#define st_magn_of_match NULL
52
-#endif
5352
5453 static int st_magn_i2c_probe(struct i2c_client *client,
55
- const struct i2c_device_id *id)
54
+ const struct i2c_device_id *id)
5655 {
57
- struct iio_dev *indio_dev;
56
+ const struct st_sensor_settings *settings;
5857 struct st_sensor_data *mdata;
58
+ struct iio_dev *indio_dev;
5959 int err;
60
+
61
+ st_sensors_dev_name_probe(&client->dev, client->name, sizeof(client->name));
62
+
63
+ settings = st_magn_get_settings(client->name);
64
+ if (!settings) {
65
+ dev_err(&client->dev, "device name %s not recognized.\n",
66
+ client->name);
67
+ return -ENODEV;
68
+ }
6069
6170 indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*mdata));
6271 if (!indio_dev)
6372 return -ENOMEM;
6473
6574 mdata = iio_priv(indio_dev);
66
- st_sensors_of_name_probe(&client->dev, st_magn_of_match,
67
- client->name, sizeof(client->name));
75
+ mdata->sensor_settings = (struct st_sensor_settings *)settings;
6876
69
- st_sensors_i2c_configure(indio_dev, client, mdata);
70
-
71
- err = st_magn_common_probe(indio_dev);
77
+ err = st_sensors_i2c_configure(indio_dev, client);
7278 if (err < 0)
7379 return err;
7480
81
+ err = st_sensors_power_enable(indio_dev);
82
+ if (err)
83
+ return err;
84
+
85
+ err = st_magn_common_probe(indio_dev);
86
+ if (err < 0)
87
+ goto st_magn_power_off;
88
+
7589 return 0;
90
+
91
+st_magn_power_off:
92
+ st_sensors_power_disable(indio_dev);
93
+
94
+ return err;
7695 }
7796
7897 static int st_magn_i2c_remove(struct i2c_client *client)
7998 {
8099 struct iio_dev *indio_dev = i2c_get_clientdata(client);
100
+
81101 st_magn_common_remove(indio_dev);
102
+
103
+ st_sensors_power_disable(indio_dev);
82104
83105 return 0;
84106 }
....@@ -90,6 +112,7 @@
90112 { LIS3MDL_MAGN_DEV_NAME },
91113 { LSM303AGR_MAGN_DEV_NAME },
92114 { LIS2MDL_MAGN_DEV_NAME },
115
+ { LSM9DS1_MAGN_DEV_NAME },
93116 {},
94117 };
95118 MODULE_DEVICE_TABLE(i2c, st_magn_id_table);
....@@ -97,7 +120,7 @@
97120 static struct i2c_driver st_magn_driver = {
98121 .driver = {
99122 .name = "st-magn-i2c",
100
- .of_match_table = of_match_ptr(st_magn_of_match),
123
+ .of_match_table = st_magn_of_match,
101124 },
102125 .probe = st_magn_i2c_probe,
103126 .remove = st_magn_i2c_remove,