Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

iio: light: vcnl4000: Switch to sparse friendly iio_device_claim/release_direct()

These new functions allow sparse to find failures to release
direct mode reducing chances of bugs over the claim_direct_mode()
functions that are deprecated.

To simplify the code whilst making the change (and avoid potential false
positives from sparse), split the enabling and disabling of thresholds
into separate functions. This could have been done in two steps
by splitting the functions first, but would have meant rewriting
the enable function twice.

Cc: Astrid Rost <astrid.rost@axis.com>
Tested-by: Per-Daniel Olsson <perdaniel.olsson@axis.com>
Reviewed-by: Per-Daniel Olsson <perdaniel.olsson@axis.com>
Reviewed-by: David Lechner <dlechner@baylibre.com>
Link: https://patch.msgid.link/20250309170633.1347476-18-jic23@kernel.org
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>

+44 -40
+44 -40
drivers/iio/light/vcnl4000.c
··· 1084 1084 switch (mask) { 1085 1085 case IIO_CHAN_INFO_RAW: 1086 1086 case IIO_CHAN_INFO_SCALE: 1087 - ret = iio_device_claim_direct_mode(indio_dev); 1088 - if (ret) 1089 - return ret; 1087 + if (!iio_device_claim_direct(indio_dev)) 1088 + return -EBUSY; 1090 1089 1091 1090 /* Protect against event capture. */ 1092 1091 if (vcnl4010_is_in_periodic_mode(data)) { ··· 1095 1096 mask); 1096 1097 } 1097 1098 1098 - iio_device_release_direct_mode(indio_dev); 1099 + iio_device_release_direct(indio_dev); 1099 1100 return ret; 1100 1101 case IIO_CHAN_INFO_SAMP_FREQ: 1101 1102 switch (chan->type) { ··· 1156 1157 int ret; 1157 1158 struct vcnl4000_data *data = iio_priv(indio_dev); 1158 1159 1159 - ret = iio_device_claim_direct_mode(indio_dev); 1160 - if (ret) 1161 - return ret; 1160 + if (!iio_device_claim_direct(indio_dev)) 1161 + return -EBUSY; 1162 1162 1163 1163 /* Protect against event capture. */ 1164 1164 if (vcnl4010_is_in_periodic_mode(data)) { ··· 1181 1183 } 1182 1184 1183 1185 end: 1184 - iio_device_release_direct_mode(indio_dev); 1186 + iio_device_release_direct(indio_dev); 1185 1187 return ret; 1186 1188 } 1187 1189 ··· 1408 1410 } 1409 1411 } 1410 1412 1413 + static int vcnl4010_config_threshold_enable(struct vcnl4000_data *data) 1414 + { 1415 + int ret; 1416 + 1417 + /* Enable periodic measurement of proximity data. */ 1418 + ret = i2c_smbus_write_byte_data(data->client, VCNL4000_COMMAND, 1419 + VCNL4000_SELF_TIMED_EN | VCNL4000_PROX_EN); 1420 + if (ret < 0) 1421 + return ret; 1422 + 1423 + /* 1424 + * Enable interrupts on threshold, for proximity data by 1425 + * default. 1426 + */ 1427 + return i2c_smbus_write_byte_data(data->client, VCNL4010_INT_CTRL, 1428 + VCNL4010_INT_THR_EN); 1429 + } 1430 + 1431 + static int vcnl4010_config_threshold_disable(struct vcnl4000_data *data) 1432 + { 1433 + int ret; 1434 + 1435 + if (!vcnl4010_is_thr_enabled(data)) 1436 + return 0; 1437 + 1438 + ret = i2c_smbus_write_byte_data(data->client, VCNL4000_COMMAND, 0); 1439 + if (ret < 0) 1440 + return ret; 1441 + 1442 + return i2c_smbus_write_byte_data(data->client, VCNL4010_INT_CTRL, 0); 1443 + } 1444 + 1411 1445 static int vcnl4010_config_threshold(struct iio_dev *indio_dev, bool state) 1412 1446 { 1413 1447 struct vcnl4000_data *data = iio_priv(indio_dev); 1414 1448 int ret; 1415 - int icr; 1416 - int command; 1417 1449 1418 1450 if (state) { 1419 - ret = iio_device_claim_direct_mode(indio_dev); 1420 - if (ret) 1421 - return ret; 1422 - 1423 - /* Enable periodic measurement of proximity data. */ 1424 - command = VCNL4000_SELF_TIMED_EN | VCNL4000_PROX_EN; 1425 - 1426 - /* 1427 - * Enable interrupts on threshold, for proximity data by 1428 - * default. 1429 - */ 1430 - icr = VCNL4010_INT_THR_EN; 1451 + if (!iio_device_claim_direct(indio_dev)) 1452 + return -EBUSY; 1453 + ret = vcnl4010_config_threshold_enable(data); 1454 + iio_device_release_direct(indio_dev); 1455 + return ret; 1431 1456 } else { 1432 - if (!vcnl4010_is_thr_enabled(data)) 1433 - return 0; 1434 - 1435 - command = 0; 1436 - icr = 0; 1457 + return vcnl4010_config_threshold_disable(data); 1437 1458 } 1438 - 1439 - ret = i2c_smbus_write_byte_data(data->client, VCNL4000_COMMAND, 1440 - command); 1441 - if (ret < 0) 1442 - goto end; 1443 - 1444 - ret = i2c_smbus_write_byte_data(data->client, VCNL4010_INT_CTRL, icr); 1445 - 1446 - end: 1447 - if (state) 1448 - iio_device_release_direct_mode(indio_dev); 1449 - 1450 - return ret; 1451 1459 } 1452 1460 1453 1461 static int vcnl4010_write_event_config(struct iio_dev *indio_dev,