aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHartmut Knaack <knaack.h@gmx.de>2015-07-29 17:39:36 -0400
committerJonathan Cameron <jic23@kernel.org>2015-08-08 07:21:46 -0400
commit18422bb3c1d89b510bb7c590c716dd6ad8e1a1e4 (patch)
treefd558a1536a6b947113b0cbdde211c677d6425c7
parentb41e63cf83affa50a6141eba52be1fbd05f29b21 (diff)
iio:accel:stk8312: improve error handling
Improve error handling in the following ways: - set return value on error condition to an appropriate error code - return error code immediately in case of an error (slightly changes code structure) - pass up real error code - add missing error handling - return 0 when error have been caught already - put device back in active mode after error occurs Signed-off-by: Hartmut Knaack <knaack.h@gmx.de> Signed-off-by: Jonathan Cameron <jic23@kernel.org>
-rw-r--r--drivers/iio/accel/stk8312.c60
1 files changed, 38 insertions, 22 deletions
diff --git a/drivers/iio/accel/stk8312.c b/drivers/iio/accel/stk8312.c
index 8280a37e0068..82ad283b8c60 100644
--- a/drivers/iio/accel/stk8312.c
+++ b/drivers/iio/accel/stk8312.c
@@ -146,8 +146,10 @@ static int stk8312_otp_init(struct stk8312_data *data)
146 count--; 146 count--;
147 } while (!(ret & 0x80) && count > 0); 147 } while (!(ret & 0x80) && count > 0);
148 148
149 if (count == 0) 149 if (count == 0) {
150 ret = -ETIMEDOUT;
150 goto exit_err; 151 goto exit_err;
152 }
151 153
152 ret = i2c_smbus_read_byte_data(client, STK8312_REG_OTPDATA); 154 ret = i2c_smbus_read_byte_data(client, STK8312_REG_OTPDATA);
153 if (ret == 0) 155 if (ret == 0)
@@ -161,7 +163,7 @@ static int stk8312_otp_init(struct stk8312_data *data)
161 goto exit_err; 163 goto exit_err;
162 msleep(150); 164 msleep(150);
163 165
164 return ret; 166 return 0;
165 167
166exit_err: 168exit_err:
167 dev_err(&client->dev, "failed to initialize sensor\n"); 169 dev_err(&client->dev, "failed to initialize sensor\n");
@@ -205,8 +207,11 @@ static int stk8312_set_interrupts(struct stk8312_data *data, u8 int_mask)
205 return ret; 207 return ret;
206 208
207 ret = i2c_smbus_write_byte_data(client, STK8312_REG_INTSU, int_mask); 209 ret = i2c_smbus_write_byte_data(client, STK8312_REG_INTSU, int_mask);
208 if (ret < 0) 210 if (ret < 0) {
209 dev_err(&client->dev, "failed to set interrupts\n"); 211 dev_err(&client->dev, "failed to set interrupts\n");
212 stk8312_set_mode(data, mode);
213 return ret;
214 }
210 215
211 return stk8312_set_mode(data, mode); 216 return stk8312_set_mode(data, mode);
212} 217}
@@ -230,7 +235,7 @@ static int stk8312_data_rdy_trigger_set_state(struct iio_trigger *trig,
230 235
231 data->dready_trigger_on = state; 236 data->dready_trigger_on = state;
232 237
233 return ret; 238 return 0;
234} 239}
235 240
236static const struct iio_trigger_ops stk8312_trigger_ops = { 241static const struct iio_trigger_ops stk8312_trigger_ops = {
@@ -255,20 +260,24 @@ static int stk8312_set_sample_rate(struct stk8312_data *data, int rate)
255 return ret; 260 return ret;
256 261
257 ret = i2c_smbus_read_byte_data(client, STK8312_REG_SR); 262 ret = i2c_smbus_read_byte_data(client, STK8312_REG_SR);
258 if (ret < 0) { 263 if (ret < 0)
259 dev_err(&client->dev, "failed to set sampling rate\n"); 264 goto err_activate;
260 return ret;
261 }
262 265
263 masked_reg = (ret & (~STK8312_SR_MASK)) | rate; 266 masked_reg = (ret & (~STK8312_SR_MASK)) | rate;
264 267
265 ret = i2c_smbus_write_byte_data(client, STK8312_REG_SR, masked_reg); 268 ret = i2c_smbus_write_byte_data(client, STK8312_REG_SR, masked_reg);
266 if (ret < 0) 269 if (ret < 0)
267 dev_err(&client->dev, "failed to set sampling rate\n"); 270 goto err_activate;
268 else 271
269 data->sample_rate_idx = rate; 272 data->sample_rate_idx = rate;
270 273
271 return stk8312_set_mode(data, mode); 274 return stk8312_set_mode(data, mode);
275
276err_activate:
277 dev_err(&client->dev, "failed to set sampling rate\n");
278 stk8312_set_mode(data, mode);
279
280 return ret;
272} 281}
273 282
274static int stk8312_set_range(struct stk8312_data *data, u8 range) 283static int stk8312_set_range(struct stk8312_data *data, u8 range)
@@ -290,21 +299,25 @@ static int stk8312_set_range(struct stk8312_data *data, u8 range)
290 return ret; 299 return ret;
291 300
292 ret = i2c_smbus_read_byte_data(client, STK8312_REG_STH); 301 ret = i2c_smbus_read_byte_data(client, STK8312_REG_STH);
293 if (ret < 0) { 302 if (ret < 0)
294 dev_err(&client->dev, "failed to change sensor range\n"); 303 goto err_activate;
295 return ret;
296 }
297 304
298 masked_reg = ret & (~STK8312_RNG_MASK); 305 masked_reg = ret & (~STK8312_RNG_MASK);
299 masked_reg |= range << STK8312_RNG_SHIFT; 306 masked_reg |= range << STK8312_RNG_SHIFT;
300 307
301 ret = i2c_smbus_write_byte_data(client, STK8312_REG_STH, masked_reg); 308 ret = i2c_smbus_write_byte_data(client, STK8312_REG_STH, masked_reg);
302 if (ret < 0) 309 if (ret < 0)
303 dev_err(&client->dev, "failed to change sensor range\n"); 310 goto err_activate;
304 else 311
305 data->range = range; 312 data->range = range;
306 313
307 return stk8312_set_mode(data, mode); 314 return stk8312_set_mode(data, mode);
315
316err_activate:
317 dev_err(&client->dev, "failed to change sensor range\n");
318 stk8312_set_mode(data, mode);
319
320 return ret;
308} 321}
309 322
310static int stk8312_read_accel(struct stk8312_data *data, u8 address) 323static int stk8312_read_accel(struct stk8312_data *data, u8 address)
@@ -337,18 +350,21 @@ static int stk8312_read_raw(struct iio_dev *indio_dev,
337 ret = stk8312_set_mode(data, data->mode | STK8312_MODE_ACTIVE); 350 ret = stk8312_set_mode(data, data->mode | STK8312_MODE_ACTIVE);
338 if (ret < 0) { 351 if (ret < 0) {
339 mutex_unlock(&data->lock); 352 mutex_unlock(&data->lock);
340 return -EINVAL; 353 return ret;
341 } 354 }
342 ret = stk8312_read_accel(data, chan->address); 355 ret = stk8312_read_accel(data, chan->address);
343 if (ret < 0) { 356 if (ret < 0) {
344 stk8312_set_mode(data, 357 stk8312_set_mode(data,
345 data->mode & (~STK8312_MODE_ACTIVE)); 358 data->mode & (~STK8312_MODE_ACTIVE));
346 mutex_unlock(&data->lock); 359 mutex_unlock(&data->lock);
347 return -EINVAL; 360 return ret;
348 } 361 }
349 *val = sign_extend32(ret, 7); 362 *val = sign_extend32(ret, 7);
350 stk8312_set_mode(data, data->mode & (~STK8312_MODE_ACTIVE)); 363 ret = stk8312_set_mode(data,
364 data->mode & (~STK8312_MODE_ACTIVE));
351 mutex_unlock(&data->lock); 365 mutex_unlock(&data->lock);
366 if (ret < 0)
367 return ret;
352 return IIO_VAL_INT; 368 return IIO_VAL_INT;
353 case IIO_CHAN_INFO_SCALE: 369 case IIO_CHAN_INFO_SCALE:
354 *val = stk8312_scale_table[data->range - 1][0]; 370 *val = stk8312_scale_table[data->range - 1][0];
@@ -608,7 +624,7 @@ static int stk8312_probe(struct i2c_client *client,
608 goto err_buffer_cleanup; 624 goto err_buffer_cleanup;
609 } 625 }
610 626
611 return ret; 627 return 0;
612 628
613err_buffer_cleanup: 629err_buffer_cleanup:
614 iio_triggered_buffer_cleanup(indio_dev); 630 iio_triggered_buffer_cleanup(indio_dev);