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

iio: light: vcnl4000: Add missing locking

Signed-off-by: Peter Meerwald-Stadler <pmeerw@pmeerw.net>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>

authored by

Peter Meerwald-Stadler and committed by
Jonathan Cameron
ff34ed6d 5d693139

+14 -4
+14 -4
drivers/iio/light/vcnl4000.c
··· 48 48 49 49 struct vcnl4000_data { 50 50 struct i2c_client *client; 51 + struct mutex lock; 51 52 }; 52 53 53 54 static const struct i2c_device_id vcnl4000_id[] = { ··· 64 63 __be16 buf; 65 64 int ret; 66 65 66 + mutex_lock(&data->lock); 67 + 67 68 ret = i2c_smbus_write_byte_data(data->client, VCNL4000_COMMAND, 68 69 req_mask); 69 70 if (ret < 0) 70 - return ret; 71 + goto fail; 71 72 72 73 /* wait for data to become ready */ 73 74 while (tries--) { 74 75 ret = i2c_smbus_read_byte_data(data->client, VCNL4000_COMMAND); 75 76 if (ret < 0) 76 - return ret; 77 + goto fail; 77 78 if (ret & rdy_mask) 78 79 break; 79 80 msleep(20); /* measurement takes up to 100 ms */ ··· 84 81 if (tries < 0) { 85 82 dev_err(&data->client->dev, 86 83 "vcnl4000_measure() failed, data not ready\n"); 87 - return -EIO; 84 + ret = -EIO; 85 + goto fail; 88 86 } 89 87 90 88 ret = i2c_smbus_read_i2c_block_data(data->client, 91 89 data_reg, sizeof(buf), (u8 *) &buf); 92 90 if (ret < 0) 93 - return ret; 91 + goto fail; 94 92 93 + mutex_unlock(&data->lock); 95 94 *val = be16_to_cpu(buf); 96 95 97 96 return 0; 97 + 98 + fail: 99 + mutex_unlock(&data->lock); 100 + return ret; 98 101 } 99 102 100 103 static const struct iio_chan_spec vcnl4000_channels[] = { ··· 172 163 data = iio_priv(indio_dev); 173 164 i2c_set_clientdata(client, indio_dev); 174 165 data->client = client; 166 + mutex_init(&data->lock); 175 167 176 168 ret = i2c_smbus_read_byte_data(data->client, VCNL4000_PROD_REV); 177 169 if (ret < 0)