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>
count--;
} while (!(ret & 0x80) && count > 0);
count--;
} while (!(ret & 0x80) && count > 0);
+ if (count == 0) {
+ ret = -ETIMEDOUT;
ret = i2c_smbus_read_byte_data(client, STK8312_REG_OTPDATA);
if (ret == 0)
ret = i2c_smbus_read_byte_data(client, STK8312_REG_OTPDATA);
if (ret == 0)
goto exit_err;
msleep(150);
goto exit_err;
msleep(150);
exit_err:
dev_err(&client->dev, "failed to initialize sensor\n");
exit_err:
dev_err(&client->dev, "failed to initialize sensor\n");
return ret;
ret = i2c_smbus_write_byte_data(client, STK8312_REG_INTSU, int_mask);
return ret;
ret = i2c_smbus_write_byte_data(client, STK8312_REG_INTSU, int_mask);
dev_err(&client->dev, "failed to set interrupts\n");
dev_err(&client->dev, "failed to set interrupts\n");
+ stk8312_set_mode(data, mode);
+ return ret;
+ }
return stk8312_set_mode(data, mode);
}
return stk8312_set_mode(data, mode);
}
data->dready_trigger_on = state;
data->dready_trigger_on = state;
}
static const struct iio_trigger_ops stk8312_trigger_ops = {
}
static const struct iio_trigger_ops stk8312_trigger_ops = {
return ret;
ret = i2c_smbus_read_byte_data(client, STK8312_REG_SR);
return ret;
ret = i2c_smbus_read_byte_data(client, STK8312_REG_SR);
- if (ret < 0) {
- dev_err(&client->dev, "failed to set sampling rate\n");
- return ret;
- }
+ if (ret < 0)
+ goto err_activate;
masked_reg = (ret & (~STK8312_SR_MASK)) | rate;
ret = i2c_smbus_write_byte_data(client, STK8312_REG_SR, masked_reg);
if (ret < 0)
masked_reg = (ret & (~STK8312_SR_MASK)) | rate;
ret = i2c_smbus_write_byte_data(client, STK8312_REG_SR, masked_reg);
if (ret < 0)
- dev_err(&client->dev, "failed to set sampling rate\n");
- else
- data->sample_rate_idx = rate;
+ goto err_activate;
+
+ data->sample_rate_idx = rate;
return stk8312_set_mode(data, mode);
return stk8312_set_mode(data, mode);
+
+err_activate:
+ dev_err(&client->dev, "failed to set sampling rate\n");
+ stk8312_set_mode(data, mode);
+
+ return ret;
}
static int stk8312_set_range(struct stk8312_data *data, u8 range)
}
static int stk8312_set_range(struct stk8312_data *data, u8 range)
return ret;
ret = i2c_smbus_read_byte_data(client, STK8312_REG_STH);
return ret;
ret = i2c_smbus_read_byte_data(client, STK8312_REG_STH);
- if (ret < 0) {
- dev_err(&client->dev, "failed to change sensor range\n");
- return ret;
- }
+ if (ret < 0)
+ goto err_activate;
masked_reg = ret & (~STK8312_RNG_MASK);
masked_reg |= range << STK8312_RNG_SHIFT;
ret = i2c_smbus_write_byte_data(client, STK8312_REG_STH, masked_reg);
if (ret < 0)
masked_reg = ret & (~STK8312_RNG_MASK);
masked_reg |= range << STK8312_RNG_SHIFT;
ret = i2c_smbus_write_byte_data(client, STK8312_REG_STH, masked_reg);
if (ret < 0)
- dev_err(&client->dev, "failed to change sensor range\n");
- else
- data->range = range;
+ goto err_activate;
+
+ data->range = range;
return stk8312_set_mode(data, mode);
return stk8312_set_mode(data, mode);
+
+err_activate:
+ dev_err(&client->dev, "failed to change sensor range\n");
+ stk8312_set_mode(data, mode);
+
+ return ret;
}
static int stk8312_read_accel(struct stk8312_data *data, u8 address)
}
static int stk8312_read_accel(struct stk8312_data *data, u8 address)
ret = stk8312_set_mode(data, data->mode | STK8312_MODE_ACTIVE);
if (ret < 0) {
mutex_unlock(&data->lock);
ret = stk8312_set_mode(data, data->mode | STK8312_MODE_ACTIVE);
if (ret < 0) {
mutex_unlock(&data->lock);
}
ret = stk8312_read_accel(data, chan->address);
if (ret < 0) {
stk8312_set_mode(data,
data->mode & (~STK8312_MODE_ACTIVE));
mutex_unlock(&data->lock);
}
ret = stk8312_read_accel(data, chan->address);
if (ret < 0) {
stk8312_set_mode(data,
data->mode & (~STK8312_MODE_ACTIVE));
mutex_unlock(&data->lock);
}
*val = sign_extend32(ret, 7);
}
*val = sign_extend32(ret, 7);
- stk8312_set_mode(data, data->mode & (~STK8312_MODE_ACTIVE));
+ ret = stk8312_set_mode(data,
+ data->mode & (~STK8312_MODE_ACTIVE));
mutex_unlock(&data->lock);
mutex_unlock(&data->lock);
+ if (ret < 0)
+ return ret;
return IIO_VAL_INT;
case IIO_CHAN_INFO_SCALE:
*val = stk8312_scale_table[data->range - 1][0];
return IIO_VAL_INT;
case IIO_CHAN_INFO_SCALE:
*val = stk8312_scale_table[data->range - 1][0];
goto err_buffer_cleanup;
}
goto err_buffer_cleanup;
}
err_buffer_cleanup:
iio_triggered_buffer_cleanup(indio_dev);
err_buffer_cleanup:
iio_triggered_buffer_cleanup(indio_dev);