| .. | .. |
|---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-only |
|---|
| 1 | 2 | /* |
|---|
| 2 | 3 | * si1145.c - Support for Silabs SI1132 and SI1141/2/3/5/6/7 combined ambient |
|---|
| 3 | 4 | * light, UV index and proximity sensors |
|---|
| 4 | 5 | * |
|---|
| 5 | 6 | * Copyright 2014-16 Peter Meerwald-Stadler <pmeerw@pmeerw.net> |
|---|
| 6 | 7 | * Copyright 2016 Crestez Dan Leonard <leonard.crestez@intel.com> |
|---|
| 7 | | - * |
|---|
| 8 | | - * This file is subject to the terms and conditions of version 2 of |
|---|
| 9 | | - * the GNU General Public License. See the file COPYING in the main |
|---|
| 10 | | - * directory of this archive for more details. |
|---|
| 11 | 8 | * |
|---|
| 12 | 9 | * SI1132 (7-bit I2C slave address 0x60) |
|---|
| 13 | 10 | * SI1141/2/3 (7-bit I2C slave address 0x5a) |
|---|
| .. | .. |
|---|
| 20 | 17 | #include <linux/slab.h> |
|---|
| 21 | 18 | #include <linux/delay.h> |
|---|
| 22 | 19 | #include <linux/irq.h> |
|---|
| 23 | | -#include <linux/gpio.h> |
|---|
| 24 | 20 | |
|---|
| 25 | 21 | #include <linux/iio/iio.h> |
|---|
| 26 | 22 | #include <linux/iio/sysfs.h> |
|---|
| .. | .. |
|---|
| 194 | 190 | u8 buffer[24] __aligned(8); |
|---|
| 195 | 191 | }; |
|---|
| 196 | 192 | |
|---|
| 197 | | -/** |
|---|
| 193 | +/* |
|---|
| 198 | 194 | * __si1145_command_reset() - Send CMD_NOP and wait for response 0 |
|---|
| 199 | 195 | * |
|---|
| 200 | 196 | * Does not modify data->rsp_seq |
|---|
| .. | .. |
|---|
| 228 | 224 | } |
|---|
| 229 | 225 | } |
|---|
| 230 | 226 | |
|---|
| 231 | | -/** |
|---|
| 227 | +/* |
|---|
| 232 | 228 | * si1145_command() - Execute a command and poll the response register |
|---|
| 233 | 229 | * |
|---|
| 234 | 230 | * All conversion overflows are reported as -EOVERFLOW |
|---|
| .. | .. |
|---|
| 1049 | 1045 | SI1145_LED_CURRENT_45mA); |
|---|
| 1050 | 1046 | if (ret < 0) |
|---|
| 1051 | 1047 | return ret; |
|---|
| 1052 | | - /* fallthrough */ |
|---|
| 1048 | + fallthrough; |
|---|
| 1053 | 1049 | case 2: |
|---|
| 1054 | 1050 | ret = i2c_smbus_write_byte_data(client, |
|---|
| 1055 | 1051 | SI1145_REG_PS_LED21, |
|---|
| .. | .. |
|---|
| 1178 | 1174 | |
|---|
| 1179 | 1175 | static const struct iio_buffer_setup_ops si1145_buffer_setup_ops = { |
|---|
| 1180 | 1176 | .preenable = si1145_buffer_preenable, |
|---|
| 1181 | | - .postenable = iio_triggered_buffer_postenable, |
|---|
| 1182 | | - .predisable = iio_triggered_buffer_predisable, |
|---|
| 1183 | 1177 | .validate_scan_mask = si1145_validate_scan_mask, |
|---|
| 1184 | 1178 | }; |
|---|
| 1185 | 1179 | |
|---|
| 1186 | | -/** |
|---|
| 1180 | +/* |
|---|
| 1187 | 1181 | * si1145_trigger_set_state() - Set trigger state |
|---|
| 1188 | 1182 | * |
|---|
| 1189 | 1183 | * When not using triggers interrupts are disabled and measurement rate is |
|---|
| .. | .. |
|---|
| 1267 | 1261 | return ret; |
|---|
| 1268 | 1262 | } |
|---|
| 1269 | 1263 | |
|---|
| 1270 | | - ret = iio_trigger_register(trig); |
|---|
| 1264 | + ret = devm_iio_trigger_register(&client->dev, trig); |
|---|
| 1271 | 1265 | if (ret) |
|---|
| 1272 | 1266 | return ret; |
|---|
| 1273 | 1267 | |
|---|
| .. | .. |
|---|
| 1275 | 1269 | indio_dev->trig = iio_trigger_get(data->trig); |
|---|
| 1276 | 1270 | |
|---|
| 1277 | 1271 | return 0; |
|---|
| 1278 | | -} |
|---|
| 1279 | | - |
|---|
| 1280 | | -static void si1145_remove_trigger(struct iio_dev *indio_dev) |
|---|
| 1281 | | -{ |
|---|
| 1282 | | - struct si1145_data *data = iio_priv(indio_dev); |
|---|
| 1283 | | - |
|---|
| 1284 | | - if (data->trig) { |
|---|
| 1285 | | - iio_trigger_unregister(data->trig); |
|---|
| 1286 | | - data->trig = NULL; |
|---|
| 1287 | | - } |
|---|
| 1288 | 1272 | } |
|---|
| 1289 | 1273 | |
|---|
| 1290 | 1274 | static int si1145_probe(struct i2c_client *client, |
|---|
| .. | .. |
|---|
| 1324 | 1308 | return -ENODEV; |
|---|
| 1325 | 1309 | } |
|---|
| 1326 | 1310 | |
|---|
| 1327 | | - indio_dev->dev.parent = &client->dev; |
|---|
| 1328 | 1311 | indio_dev->name = id->name; |
|---|
| 1329 | 1312 | indio_dev->channels = data->part_info->channels; |
|---|
| 1330 | 1313 | indio_dev->num_channels = data->part_info->num_channels; |
|---|
| .. | .. |
|---|
| 1338 | 1321 | if (ret < 0) |
|---|
| 1339 | 1322 | return ret; |
|---|
| 1340 | 1323 | |
|---|
| 1341 | | - ret = iio_triggered_buffer_setup(indio_dev, NULL, |
|---|
| 1324 | + ret = devm_iio_triggered_buffer_setup(&client->dev, |
|---|
| 1325 | + indio_dev, NULL, |
|---|
| 1342 | 1326 | si1145_trigger_handler, &si1145_buffer_setup_ops); |
|---|
| 1343 | 1327 | if (ret < 0) |
|---|
| 1344 | 1328 | return ret; |
|---|
| .. | .. |
|---|
| 1346 | 1330 | if (client->irq) { |
|---|
| 1347 | 1331 | ret = si1145_probe_trigger(indio_dev); |
|---|
| 1348 | 1332 | if (ret < 0) |
|---|
| 1349 | | - goto error_free_buffer; |
|---|
| 1333 | + return ret; |
|---|
| 1350 | 1334 | } else { |
|---|
| 1351 | 1335 | dev_info(&client->dev, "no irq, using polling\n"); |
|---|
| 1352 | 1336 | } |
|---|
| 1353 | 1337 | |
|---|
| 1354 | | - ret = iio_device_register(indio_dev); |
|---|
| 1355 | | - if (ret < 0) |
|---|
| 1356 | | - goto error_free_trigger; |
|---|
| 1357 | | - |
|---|
| 1358 | | - return 0; |
|---|
| 1359 | | - |
|---|
| 1360 | | -error_free_trigger: |
|---|
| 1361 | | - si1145_remove_trigger(indio_dev); |
|---|
| 1362 | | -error_free_buffer: |
|---|
| 1363 | | - iio_triggered_buffer_cleanup(indio_dev); |
|---|
| 1364 | | - |
|---|
| 1365 | | - return ret; |
|---|
| 1338 | + return devm_iio_device_register(&client->dev, indio_dev); |
|---|
| 1366 | 1339 | } |
|---|
| 1367 | 1340 | |
|---|
| 1368 | 1341 | static const struct i2c_device_id si1145_ids[] = { |
|---|
| .. | .. |
|---|
| 1377 | 1350 | }; |
|---|
| 1378 | 1351 | MODULE_DEVICE_TABLE(i2c, si1145_ids); |
|---|
| 1379 | 1352 | |
|---|
| 1380 | | -static int si1145_remove(struct i2c_client *client) |
|---|
| 1381 | | -{ |
|---|
| 1382 | | - struct iio_dev *indio_dev = i2c_get_clientdata(client); |
|---|
| 1383 | | - |
|---|
| 1384 | | - iio_device_unregister(indio_dev); |
|---|
| 1385 | | - si1145_remove_trigger(indio_dev); |
|---|
| 1386 | | - iio_triggered_buffer_cleanup(indio_dev); |
|---|
| 1387 | | - |
|---|
| 1388 | | - return 0; |
|---|
| 1389 | | -} |
|---|
| 1390 | | - |
|---|
| 1391 | 1353 | static struct i2c_driver si1145_driver = { |
|---|
| 1392 | 1354 | .driver = { |
|---|
| 1393 | 1355 | .name = "si1145", |
|---|
| 1394 | 1356 | }, |
|---|
| 1395 | 1357 | .probe = si1145_probe, |
|---|
| 1396 | | - .remove = si1145_remove, |
|---|
| 1397 | 1358 | .id_table = si1145_ids, |
|---|
| 1398 | 1359 | }; |
|---|
| 1399 | 1360 | |
|---|