iio: light: us5182d: Refactor read_raw function
authorAdriana Reus <adriana.reus@intel.com>
Mon, 14 Dec 2015 12:24:47 +0000 (14:24 +0200)
committerJonathan Cameron <jic23@kernel.org>
Tue, 22 Dec 2015 18:07:08 +0000 (18:07 +0000)
A bit of refactoring for better readability.
Moved and slightly reorganized all the activity necessary for reading als
and proximity into a different function. This way the switch in read raw
becomes clearer and more compact.

Signed-off-by: Adriana Reus <adriana.reus@intel.com>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
drivers/iio/light/us5182d.c

index 213f778..45bc2f7 100644 (file)
@@ -203,23 +203,6 @@ static const struct iio_chan_spec us5182d_channels[] = {
        }
 };
 
-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;
@@ -324,6 +307,39 @@ static int us5182d_px_enable(struct us5182d_data *data)
        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;
@@ -370,6 +386,46 @@ static int us5182d_set_power_state(struct us5182d_data *data, bool on)
        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)
@@ -379,76 +435,21 @@ static int us5182d_read_raw(struct iio_dev *indio_dev,
 
        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;
 }
 
 /**