iio: light: vcnl4000: Check type with switch case
authorAstrid Rost <astrid.rost@axis.com>
Tue, 13 Jun 2023 13:50:19 +0000 (15:50 +0200)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Thu, 20 Jul 2023 18:21:29 +0000 (19:21 +0100)
Check IIO_PROXIMITY  with switch case in order to make it easier
to add further types like light.
Add check for IIO_EV_INFO_VALUE for writing rising or falling events.

Signed-off-by: Astrid Rost <astrid.rost@axis.com>
Link: https://lore.kernel.org/r/20230613135025.2596641-4-astrid.rost@axis.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/light/vcnl4000.c

index 6936beacedecd6f26995f1de5cefee8c853d2566..54d04f4edfa4778521cac7a654ba5bbb8e253c46 100644 (file)
@@ -600,9 +600,13 @@ static int vcnl4000_read_raw(struct iio_dev *indio_dev,
                *val2 = data->al_scale;
                return IIO_VAL_INT_PLUS_MICRO;
        case IIO_CHAN_INFO_INT_TIME:
-               if (chan->type != IIO_PROXIMITY)
+               switch (chan->type) {
+               case IIO_PROXIMITY:
+                       ret = vcnl4040_read_ps_it(data, val, val2);
+                       break;
+               default:
                        return -EINVAL;
-               ret = vcnl4040_read_ps_it(data, val, val2);
+               }
                if (ret < 0)
                        return ret;
                return IIO_VAL_INT_PLUS_MICRO;
@@ -621,9 +625,12 @@ static int vcnl4040_write_raw(struct iio_dev *indio_dev,
        case IIO_CHAN_INFO_INT_TIME:
                if (val != 0)
                        return -EINVAL;
-               if (chan->type != IIO_PROXIMITY)
+               switch (chan->type) {
+               case IIO_PROXIMITY:
+                       return vcnl4040_write_ps_it(data, val2);
+               default:
                        return -EINVAL;
-               return vcnl4040_write_ps_it(data, val2);
+               }
        default:
                return -EINVAL;
        }
@@ -638,9 +645,15 @@ static int vcnl4040_read_avail(struct iio_dev *indio_dev,
 
        switch (mask) {
        case IIO_CHAN_INFO_INT_TIME:
-               *vals = (int *)(*data->chip_spec->ps_it_times);
+               switch (chan->type) {
+               case IIO_PROXIMITY:
+                       *vals = (int *)(*data->chip_spec->ps_it_times);
+                       *length = 2 * data->chip_spec->num_ps_it_times;
+                       break;
+               default:
+                       return -EINVAL;
+               }
                *type = IIO_VAL_INT_PLUS_MICRO;
-               *length = 2 * data->chip_spec->num_ps_it_times;
                return IIO_AVAIL_LIST;
        default:
                return -EINVAL;
@@ -836,24 +849,34 @@ static int vcnl4040_read_event(struct iio_dev *indio_dev,
        int ret;
        struct vcnl4000_data *data = iio_priv(indio_dev);
 
-       switch (dir) {
-       case IIO_EV_DIR_RISING:
-               ret = i2c_smbus_read_word_data(data->client,
-                                              VCNL4040_PS_THDH_LM);
-               if (ret < 0)
-                       return ret;
-               *val = ret;
-               return IIO_VAL_INT;
-       case IIO_EV_DIR_FALLING:
-               ret = i2c_smbus_read_word_data(data->client,
-                                              VCNL4040_PS_THDL_LM);
-               if (ret < 0)
-                       return ret;
-               *val = ret;
-               return IIO_VAL_INT;
+       switch (chan->type) {
+       case IIO_PROXIMITY:
+               switch (info) {
+               case IIO_EV_INFO_VALUE:
+                       switch (dir) {
+                       case IIO_EV_DIR_RISING:
+                               ret = i2c_smbus_read_word_data(data->client,
+                                                              VCNL4040_PS_THDH_LM);
+                               break;
+                       case IIO_EV_DIR_FALLING:
+                               ret = i2c_smbus_read_word_data(data->client,
+                                                              VCNL4040_PS_THDL_LM);
+                               break;
+                       default:
+                               return -EINVAL;
+                       }
+                       break;
+               default:
+                       return -EINVAL;
+               }
+               break;
        default:
                return -EINVAL;
        }
+       if (ret < 0)
+               return ret;
+       *val = ret;
+       return IIO_VAL_INT;
 }
 
 static int vcnl4040_write_event(struct iio_dev *indio_dev,
@@ -866,22 +889,35 @@ static int vcnl4040_write_event(struct iio_dev *indio_dev,
        int ret;
        struct vcnl4000_data *data = iio_priv(indio_dev);
 
-       switch (dir) {
-       case IIO_EV_DIR_RISING:
-               ret = i2c_smbus_write_word_data(data->client,
-                                               VCNL4040_PS_THDH_LM, val);
-               if (ret < 0)
-                       return ret;
-               return IIO_VAL_INT;
-       case IIO_EV_DIR_FALLING:
-               ret = i2c_smbus_write_word_data(data->client,
-                                               VCNL4040_PS_THDL_LM, val);
-               if (ret < 0)
-                       return ret;
-               return IIO_VAL_INT;
+       switch (chan->type) {
+       case IIO_PROXIMITY:
+               switch (info) {
+               case IIO_EV_INFO_VALUE:
+                       switch (dir) {
+                       case IIO_EV_DIR_RISING:
+                               ret = i2c_smbus_write_word_data(data->client,
+                                                               VCNL4040_PS_THDH_LM,
+                                                               val);
+                               break;
+                       case IIO_EV_DIR_FALLING:
+                               ret = i2c_smbus_write_word_data(data->client,
+                                                               VCNL4040_PS_THDL_LM,
+                                                               val);
+                               break;
+                       default:
+                               return -EINVAL;
+                       }
+                       break;
+               default:
+                       return -EINVAL;
+               }
+               break;
        default:
                return -EINVAL;
        }
+       if (ret < 0)
+               return ret;
+       return IIO_VAL_INT;
 }
 
 static bool vcnl4010_is_thr_enabled(struct vcnl4000_data *data)
@@ -974,15 +1010,20 @@ static int vcnl4040_read_event_config(struct iio_dev *indio_dev,
        int ret;
        struct vcnl4000_data *data = iio_priv(indio_dev);
 
-       ret = i2c_smbus_read_word_data(data->client, VCNL4200_PS_CONF1);
-       if (ret < 0)
-               return ret;
+       switch (chan->type) {
+       case IIO_PROXIMITY:
+               ret = i2c_smbus_read_word_data(data->client, VCNL4200_PS_CONF1);
+               if (ret < 0)
+                       return ret;
 
-       data->ps_int = FIELD_GET(VCNL4040_PS_CONF2_PS_INT, ret);
+               data->ps_int = FIELD_GET(VCNL4040_PS_CONF2_PS_INT, ret);
 
-       return (dir == IIO_EV_DIR_RISING) ?
-               FIELD_GET(VCNL4040_PS_IF_AWAY, ret) :
-               FIELD_GET(VCNL4040_PS_IF_CLOSE, ret);
+               return (dir == IIO_EV_DIR_RISING) ?
+                       FIELD_GET(VCNL4040_PS_IF_AWAY, ret) :
+                       FIELD_GET(VCNL4040_PS_IF_CLOSE, ret);
+       default:
+               return -EINVAL;
+       }
 }
 
 static int vcnl4040_write_event_config(struct iio_dev *indio_dev,
@@ -990,25 +1031,32 @@ static int vcnl4040_write_event_config(struct iio_dev *indio_dev,
                                       enum iio_event_type type,
                                       enum iio_event_direction dir, int state)
 {
-       int ret;
+       int ret = -EINVAL;
        u16 val, mask;
        struct vcnl4000_data *data = iio_priv(indio_dev);
 
        mutex_lock(&data->vcnl4000_lock);
 
-       ret = i2c_smbus_read_word_data(data->client, VCNL4200_PS_CONF1);
-       if (ret < 0)
-               goto out;
+       switch (chan->type) {
+       case IIO_PROXIMITY:
+               ret = i2c_smbus_read_word_data(data->client, VCNL4200_PS_CONF1);
+               if (ret < 0)
+                       goto out;
 
-       if (dir == IIO_EV_DIR_RISING)
-               mask = VCNL4040_PS_IF_AWAY;
-       else
-               mask = VCNL4040_PS_IF_CLOSE;
+               if (dir == IIO_EV_DIR_RISING)
+                       mask = VCNL4040_PS_IF_AWAY;
+               else
+                       mask = VCNL4040_PS_IF_CLOSE;
 
-       val = state ? (ret | mask) : (ret & ~mask);
+               val = state ? (ret | mask) : (ret & ~mask);
 
-       data->ps_int = FIELD_GET(VCNL4040_PS_CONF2_PS_INT, val);
-       ret = i2c_smbus_write_word_data(data->client, VCNL4200_PS_CONF1, val);
+               data->ps_int = FIELD_GET(VCNL4040_PS_CONF2_PS_INT, val);
+               ret = i2c_smbus_write_word_data(data->client, VCNL4200_PS_CONF1,
+                                               val);
+               break;
+       default:
+               break;
+       }
 
 out:
        mutex_unlock(&data->vcnl4000_lock);