diff options
author | Hartmut Knaack <knaack.h@gmx.de> | 2015-07-29 17:39:36 -0400 |
---|---|---|
committer | Jonathan Cameron <jic23@kernel.org> | 2015-08-08 07:21:46 -0400 |
commit | 18422bb3c1d89b510bb7c590c716dd6ad8e1a1e4 (patch) | |
tree | fd558a1536a6b947113b0cbdde211c677d6425c7 | |
parent | b41e63cf83affa50a6141eba52be1fbd05f29b21 (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.c | 60 |
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 | ||
166 | exit_err: | 168 | exit_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 | ||
236 | static const struct iio_trigger_ops stk8312_trigger_ops = { | 241 | static 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 | |||
276 | err_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 | ||
274 | static int stk8312_set_range(struct stk8312_data *data, u8 range) | 283 | static 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 | |||
316 | err_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 | ||
310 | static int stk8312_read_accel(struct stk8312_data *data, u8 address) | 323 | static 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 | ||
613 | err_buffer_cleanup: | 629 | err_buffer_cleanup: |
614 | iio_triggered_buffer_cleanup(indio_dev); | 630 | iio_triggered_buffer_cleanup(indio_dev); |