iio: light: apds9306: Improve apds9306_write_event_config()
authorSubhajit Ghosh <subhajit.ghosh@tweaklogic.com>
Fri, 5 Apr 2024 10:46:41 +0000 (21:16 +1030)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Sat, 6 Apr 2024 15:52:45 +0000 (16:52 +0100)
Simplify event configuration flow.

Suggested-by: Jonathan Cameron <jic23@kernel.org>
Link: https://lore.kernel.org/all/20240310124237.52fa8a56@jic23-huawei/
Signed-off-by: Subhajit Ghosh <subhajit.ghosh@tweaklogic.com>
Link: https://lore.kernel.org/r/20240405104641.29478-1-subhajit.ghosh@tweaklogic.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/light/apds9306.c

index 49fa6b7d5170b89c477f4744e307c34ebfe35493..46c647ccd44c51c133b52cda508ef2a423e8a95b 100644 (file)
@@ -1075,14 +1075,16 @@ static int apds9306_write_event_config(struct iio_dev *indio_dev,
 {
        struct apds9306_data *data = iio_priv(indio_dev);
        struct apds9306_regfields *rf = &data->rf;
-       int ret, val;
-
-       state = !!state;
+       int ret, enabled;
 
        switch (type) {
        case IIO_EV_TYPE_THRESH: {
                guard(mutex)(&data->mutex);
 
+               ret = regmap_field_read(rf->int_en, &enabled);
+               if (ret)
+                       return ret;
+
                /*
                 * If interrupt is enabled, the channel is set before enabling
                 * the interrupt. In case of disable, no need to switch
@@ -1091,38 +1093,42 @@ static int apds9306_write_event_config(struct iio_dev *indio_dev,
                 */
                if (state) {
                        if (chan->type == IIO_LIGHT)
-                               val = 1;
+                               ret = regmap_field_write(rf->int_src, 1);
                        else if (chan->type == IIO_INTENSITY)
-                               val = 0;
+                               ret = regmap_field_write(rf->int_src, 0);
                        else
                                return -EINVAL;
 
-                       ret = regmap_field_write(rf->int_src, val);
                        if (ret)
                                return ret;
-               }
 
-               ret = regmap_field_read(rf->int_en, &val);
-               if (ret)
-                       return ret;
-
-               if (val == state)
-                       return 0;
+                       if (enabled)
+                               return 0;
 
-               ret = regmap_field_write(rf->int_en, state);
-               if (ret)
-                       return ret;
+                       ret = regmap_field_write(rf->int_en, 1);
+                       if (ret)
+                               return ret;
 
-               if (state)
                        return pm_runtime_resume_and_get(data->dev);
+               } else {
+                       if (!enabled)
+                               return 0;
 
-               pm_runtime_mark_last_busy(data->dev);
-               pm_runtime_put_autosuspend(data->dev);
+                       ret = regmap_field_write(rf->int_en, 0);
+                       if (ret)
+                               return ret;
 
-               return 0;
+                       pm_runtime_mark_last_busy(data->dev);
+                       pm_runtime_put_autosuspend(data->dev);
+
+                       return 0;
+               }
        }
        case IIO_EV_TYPE_THRESH_ADAPTIVE:
-               return regmap_field_write(rf->int_thresh_var_en, state);
+               if (state)
+                       return regmap_field_write(rf->int_thresh_var_en, 1);
+               else
+                       return regmap_field_write(rf->int_thresh_var_en, 0);
        default:
                return -EINVAL;
        }