diff options
Diffstat (limited to 'drivers/iio/light/tcs3472.c')
-rw-r--r-- | drivers/iio/light/tcs3472.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/drivers/iio/light/tcs3472.c b/drivers/iio/light/tcs3472.c index fe063a0a21cd..752569985d1d 100644 --- a/drivers/iio/light/tcs3472.c +++ b/drivers/iio/light/tcs3472.c | |||
@@ -52,6 +52,7 @@ | |||
52 | 52 | ||
53 | struct tcs3472_data { | 53 | struct tcs3472_data { |
54 | struct i2c_client *client; | 54 | struct i2c_client *client; |
55 | struct mutex lock; | ||
55 | u8 enable; | 56 | u8 enable; |
56 | u8 control; | 57 | u8 control; |
57 | u8 atime; | 58 | u8 atime; |
@@ -116,10 +117,17 @@ static int tcs3472_read_raw(struct iio_dev *indio_dev, | |||
116 | 117 | ||
117 | switch (mask) { | 118 | switch (mask) { |
118 | case IIO_CHAN_INFO_RAW: | 119 | case IIO_CHAN_INFO_RAW: |
120 | if (iio_buffer_enabled(indio_dev)) | ||
121 | return -EBUSY; | ||
122 | |||
123 | mutex_lock(&data->lock); | ||
119 | ret = tcs3472_req_data(data); | 124 | ret = tcs3472_req_data(data); |
120 | if (ret < 0) | 125 | if (ret < 0) { |
126 | mutex_unlock(&data->lock); | ||
121 | return ret; | 127 | return ret; |
128 | } | ||
122 | ret = i2c_smbus_read_word_data(data->client, chan->address); | 129 | ret = i2c_smbus_read_word_data(data->client, chan->address); |
130 | mutex_unlock(&data->lock); | ||
123 | if (ret < 0) | 131 | if (ret < 0) |
124 | return ret; | 132 | return ret; |
125 | *val = ret; | 133 | *val = ret; |
@@ -255,6 +263,7 @@ static int tcs3472_probe(struct i2c_client *client, | |||
255 | data = iio_priv(indio_dev); | 263 | data = iio_priv(indio_dev); |
256 | i2c_set_clientdata(client, indio_dev); | 264 | i2c_set_clientdata(client, indio_dev); |
257 | data->client = client; | 265 | data->client = client; |
266 | mutex_init(&data->lock); | ||
258 | 267 | ||
259 | indio_dev->dev.parent = &client->dev; | 268 | indio_dev->dev.parent = &client->dev; |
260 | indio_dev->info = &tcs3472_info; | 269 | indio_dev->info = &tcs3472_info; |