.. | .. |
---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-only |
---|
1 | 2 | /* |
---|
2 | 3 | * STMicroelectronics accelerometers driver |
---|
3 | 4 | * |
---|
4 | 5 | * Copyright 2012-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> |
---|
.. | .. |
---|
19 | 18 | #include <linux/iio/common/st_sensors_i2c.h> |
---|
20 | 19 | #include "st_accel.h" |
---|
21 | 20 | |
---|
22 | | -#ifdef CONFIG_OF |
---|
23 | 21 | static const struct of_device_id st_accel_of_match[] = { |
---|
24 | 22 | { |
---|
25 | 23 | /* An older compatible */ |
---|
.. | .. |
---|
98 | 96 | .compatible = "st,lis2dw12", |
---|
99 | 97 | .data = LIS2DW12_ACCEL_DEV_NAME, |
---|
100 | 98 | }, |
---|
| 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 | + }, |
---|
101 | 111 | {}, |
---|
102 | 112 | }; |
---|
103 | 113 | MODULE_DEVICE_TABLE(of, st_accel_of_match); |
---|
104 | | -#else |
---|
105 | | -#define st_accel_of_match NULL |
---|
106 | | -#endif |
---|
107 | 114 | |
---|
108 | 115 | #ifdef CONFIG_ACPI |
---|
109 | 116 | static const struct acpi_device_id st_accel_acpi_match[] = { |
---|
.. | .. |
---|
112 | 119 | { }, |
---|
113 | 120 | }; |
---|
114 | 121 | MODULE_DEVICE_TABLE(acpi, st_accel_acpi_match); |
---|
115 | | -#else |
---|
116 | | -#define st_accel_acpi_match NULL |
---|
117 | 122 | #endif |
---|
118 | 123 | |
---|
119 | 124 | static const struct i2c_device_id st_accel_id_table[] = { |
---|
.. | .. |
---|
135 | 140 | { LIS331DL_ACCEL_DEV_NAME }, |
---|
136 | 141 | { LIS3LV02DL_ACCEL_DEV_NAME }, |
---|
137 | 142 | { LIS2DW12_ACCEL_DEV_NAME }, |
---|
| 143 | + { LIS3DE_ACCEL_DEV_NAME }, |
---|
| 144 | + { LIS2DE12_ACCEL_DEV_NAME }, |
---|
| 145 | + { LIS2HH12_ACCEL_DEV_NAME }, |
---|
138 | 146 | {}, |
---|
139 | 147 | }; |
---|
140 | 148 | MODULE_DEVICE_TABLE(i2c, st_accel_id_table); |
---|
141 | 149 | |
---|
142 | 150 | static int st_accel_i2c_probe(struct i2c_client *client) |
---|
143 | 151 | { |
---|
144 | | - struct iio_dev *indio_dev; |
---|
| 152 | + const struct st_sensor_settings *settings; |
---|
145 | 153 | struct st_sensor_data *adata; |
---|
146 | | - const char *match; |
---|
| 154 | + struct iio_dev *indio_dev; |
---|
147 | 155 | 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 | + } |
---|
148 | 165 | |
---|
149 | 166 | indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*adata)); |
---|
150 | 167 | if (!indio_dev) |
---|
151 | 168 | return -ENOMEM; |
---|
152 | 169 | |
---|
153 | 170 | adata = iio_priv(indio_dev); |
---|
| 171 | + adata->sensor_settings = (struct st_sensor_settings *)settings; |
---|
154 | 172 | |
---|
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); |
---|
162 | 174 | if (ret < 0) |
---|
163 | 175 | return ret; |
---|
164 | 176 | |
---|
| 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 | + |
---|
165 | 185 | return 0; |
---|
| 186 | + |
---|
| 187 | +st_accel_power_off: |
---|
| 188 | + st_sensors_power_disable(indio_dev); |
---|
| 189 | + |
---|
| 190 | + return ret; |
---|
166 | 191 | } |
---|
167 | 192 | |
---|
168 | 193 | static int st_accel_i2c_remove(struct i2c_client *client) |
---|
169 | 194 | { |
---|
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); |
---|
171 | 200 | |
---|
172 | 201 | return 0; |
---|
173 | 202 | } |
---|
.. | .. |
---|
175 | 204 | static struct i2c_driver st_accel_driver = { |
---|
176 | 205 | .driver = { |
---|
177 | 206 | .name = "st-accel-i2c", |
---|
178 | | - .of_match_table = of_match_ptr(st_accel_of_match), |
---|
| 207 | + .of_match_table = st_accel_of_match, |
---|
179 | 208 | .acpi_match_table = ACPI_PTR(st_accel_acpi_match), |
---|
180 | 209 | }, |
---|
181 | 210 | .probe_new = st_accel_i2c_probe, |
---|