}
};
-static int us5182d_get_als(struct us5182d_data *data)
-{
- int ret;
- unsigned long result;
-
- ret = i2c_smbus_read_word_data(data->client,
- US5182D_REG_ADL);
- if (ret < 0)
- return ret;
-
- result = ret * data->ga / US5182D_GA_RESOLUTION;
- if (result > 0xffff)
- result = 0xffff;
-
- return result;
-}
-
static int us5182d_oneshot_en(struct us5182d_data *data)
{
int ret;
return 0;
}
+static int us5182d_get_als(struct us5182d_data *data)
+{
+ int ret;
+ unsigned long result;
+
+ ret = us5182d_als_enable(data);
+ if (ret < 0)
+ return ret;
+
+ ret = i2c_smbus_read_word_data(data->client,
+ US5182D_REG_ADL);
+ if (ret < 0)
+ return ret;
+
+ result = ret * data->ga / US5182D_GA_RESOLUTION;
+ if (result > 0xffff)
+ result = 0xffff;
+
+ return result;
+}
+
+static int us5182d_get_px(struct us5182d_data *data)
+{
+ int ret;
+
+ ret = us5182d_px_enable(data);
+ if (ret < 0)
+ return ret;
+
+ return i2c_smbus_read_word_data(data->client,
+ US5182D_REG_PDL);
+}
+
static int us5182d_shutdown_en(struct us5182d_data *data, u8 state)
{
int ret;
return ret;
}
+static int us5182d_read_value(struct us5182d_data *data,
+ struct iio_chan_spec const *chan)
+{
+ int ret, value;
+
+ mutex_lock(&data->lock);
+
+ if (data->power_mode == US5182D_ONESHOT) {
+ ret = us5182d_oneshot_en(data);
+ if (ret < 0)
+ goto out_err;
+ }
+
+ ret = us5182d_set_power_state(data, true);
+ if (ret < 0)
+ goto out_err;
+
+ if (chan->type == IIO_LIGHT)
+ ret = us5182d_get_als(data);
+ else
+ ret = us5182d_get_px(data);
+ if (ret < 0)
+ goto out_poweroff;
+
+ value = ret;
+
+ ret = us5182d_set_power_state(data, false);
+ if (ret < 0)
+ goto out_err;
+
+ mutex_unlock(&data->lock);
+ return value;
+
+out_poweroff:
+ us5182d_set_power_state(data, false);
+out_err:
+ mutex_unlock(&data->lock);
+ return ret;
+}
+
static int us5182d_read_raw(struct iio_dev *indio_dev,
struct iio_chan_spec const *chan, int *val,
int *val2, long mask)
switch (mask) {
case IIO_CHAN_INFO_RAW:
- switch (chan->type) {
- case IIO_LIGHT:
- mutex_lock(&data->lock);
- if (data->power_mode == US5182D_ONESHOT) {
- ret = us5182d_oneshot_en(data);
- if (ret < 0)
- goto out_err;
- }
- ret = us5182d_set_power_state(data, true);
- if (ret < 0)
- goto out_err;
- ret = us5182d_als_enable(data);
- if (ret < 0)
- goto out_poweroff;
- ret = us5182d_get_als(data);
- if (ret < 0)
- goto out_poweroff;
- *val = ret;
- ret = us5182d_set_power_state(data, false);
- if (ret < 0)
- goto out_err;
- mutex_unlock(&data->lock);
- return IIO_VAL_INT;
- case IIO_PROXIMITY:
- mutex_lock(&data->lock);
- if (data->power_mode == US5182D_ONESHOT) {
- ret = us5182d_oneshot_en(data);
- if (ret < 0)
- goto out_err;
- }
- ret = us5182d_set_power_state(data, true);
- if (ret < 0)
- goto out_err;
- ret = us5182d_px_enable(data);
- if (ret < 0)
- goto out_poweroff;
- ret = i2c_smbus_read_word_data(data->client,
- US5182D_REG_PDL);
- if (ret < 0)
- goto out_poweroff;
- *val = ret;
- ret = us5182d_set_power_state(data, false);
- if (ret < 0)
- goto out_err;
- mutex_unlock(&data->lock);
- return IIO_VAL_INT;
- default:
- return -EINVAL;
- }
-
+ ret = us5182d_read_value(data, chan);
+ if (ret < 0)
+ return ret;
+ *val = ret;
+ return IIO_VAL_INT;
case IIO_CHAN_INFO_SCALE:
ret = i2c_smbus_read_byte_data(data->client, US5182D_REG_CFG1);
if (ret < 0)
return ret;
-
*val = 0;
*val2 = us5182d_scales[ret & US5182D_AGAIN_MASK];
-
return IIO_VAL_INT_PLUS_MICRO;
default:
return -EINVAL;
}
-
- return -EINVAL;
-
-out_poweroff:
- us5182d_set_power_state(data, false);
-out_err:
- mutex_unlock(&data->lock);
- return ret;
}
/**