iio: pressure: dps310: introduce consistent error handling
authorThomas Haemmerle <thomas.haemmerle@leica-geosystems.com>
Mon, 15 Apr 2024 10:50:28 +0000 (12:50 +0200)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Sat, 20 Apr 2024 13:53:02 +0000 (14:53 +0100)
Align error handling with `dps310_calculate_temp`, where it's not
possible to differentiate between errors and valid calculations by
checking if the returned value is negative.

Signed-off-by: Thomas Haemmerle <thomas.haemmerle@leica-geosystems.com>
Link: https://lore.kernel.org/r/20240415105030.1161770-3-thomas.haemmerle@leica-geosystems.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/pressure/dps310.c

index d0a516d56da47617b639bfc142d5df6624a8ea04..3fc436f36fa7673be65141ffc365512562bd6657 100644 (file)
@@ -256,24 +256,24 @@ static int dps310_startup(struct dps310_data *data)
        return dps310_temp_workaround(data);
 }
 
-static int dps310_get_pres_precision(struct dps310_data *data)
+static int dps310_get_pres_precision(struct dps310_data *data, int *val)
 {
-       int rc;
-       int val;
+       int reg_val, rc;
 
-       rc = regmap_read(data->regmap, DPS310_PRS_CFG, &val);
+       rc = regmap_read(data->regmap, DPS310_PRS_CFG, &reg_val);
        if (rc < 0)
                return rc;
 
-       return BIT(val & GENMASK(2, 0));
+       *val = BIT(reg_val & GENMASK(2, 0));
+
+       return 0;
 }
 
-static int dps310_get_temp_precision(struct dps310_data *data)
+static int dps310_get_temp_precision(struct dps310_data *data, int *val)
 {
-       int rc;
-       int val;
+       int reg_val, rc;
 
-       rc = regmap_read(data->regmap, DPS310_TMP_CFG, &val);
+       rc = regmap_read(data->regmap, DPS310_TMP_CFG, &reg_val);
        if (rc < 0)
                return rc;
 
@@ -281,7 +281,9 @@ static int dps310_get_temp_precision(struct dps310_data *data)
         * Scale factor is bottom 4 bits of the register, but 1111 is
         * reserved so just grab bottom three
         */
-       return BIT(val & GENMASK(2, 0));
+       *val = BIT(reg_val & GENMASK(2, 0));
+
+       return 0;
 }
 
 /* Called with lock held */
@@ -350,48 +352,56 @@ static int dps310_set_temp_samp_freq(struct dps310_data *data, int freq)
                                  DPS310_TMP_RATE_BITS, val);
 }
 
-static int dps310_get_pres_samp_freq(struct dps310_data *data)
+static int dps310_get_pres_samp_freq(struct dps310_data *data, int *val)
 {
-       int rc;
-       int val;
+       int reg_val, rc;
 
-       rc = regmap_read(data->regmap, DPS310_PRS_CFG, &val);
+       rc = regmap_read(data->regmap, DPS310_PRS_CFG, &reg_val);
        if (rc < 0)
                return rc;
 
-       return BIT((val & DPS310_PRS_RATE_BITS) >> 4);
+       *val = BIT((reg_val & DPS310_PRS_RATE_BITS) >> 4);
+
+       return 0;
 }
 
-static int dps310_get_temp_samp_freq(struct dps310_data *data)
+static int dps310_get_temp_samp_freq(struct dps310_data *data, int *val)
 {
-       int rc;
-       int val;
+       int reg_val, rc;
 
-       rc = regmap_read(data->regmap, DPS310_TMP_CFG, &val);
+       rc = regmap_read(data->regmap, DPS310_TMP_CFG, &reg_val);
        if (rc < 0)
                return rc;
 
-       return BIT((val & DPS310_TMP_RATE_BITS) >> 4);
+       *val = BIT((reg_val & DPS310_TMP_RATE_BITS) >> 4);
+
+       return 0;
 }
 
-static int dps310_get_pres_k(struct dps310_data *data)
+static int dps310_get_pres_k(struct dps310_data *data, int *val)
 {
-       int rc = dps310_get_pres_precision(data);
+       int reg_val, rc;
 
-       if (rc < 0)
+       rc = dps310_get_pres_precision(data, &reg_val);
+       if (rc)
                return rc;
 
-       return scale_factors[ilog2(rc)];
+       *val = scale_factors[ilog2(reg_val)];
+
+       return 0;
 }
 
-static int dps310_get_temp_k(struct dps310_data *data)
+static int dps310_get_temp_k(struct dps310_data *data, int *val)
 {
-       int rc = dps310_get_temp_precision(data);
+       int reg_val, rc;
 
-       if (rc < 0)
+       rc = dps310_get_temp_precision(data, &reg_val);
+       if (rc)
                return rc;
 
-       return scale_factors[ilog2(rc)];
+       *val = scale_factors[ilog2(reg_val)];
+
+       return 0;
 }
 
 static int dps310_reset_wait(struct dps310_data *data)
@@ -464,7 +474,10 @@ static int dps310_read_pres_raw(struct dps310_data *data)
        if (mutex_lock_interruptible(&data->lock))
                return -EINTR;
 
-       rate = dps310_get_pres_samp_freq(data);
+       rc = dps310_get_pres_samp_freq(data, &rate);
+       if (rc)
+               goto done;
+
        timeout = DPS310_POLL_TIMEOUT_US(rate);
 
        /* Poll for sensor readiness; base the timeout upon the sample rate. */
@@ -510,7 +523,10 @@ static int dps310_read_temp_raw(struct dps310_data *data)
        if (mutex_lock_interruptible(&data->lock))
                return -EINTR;
 
-       rate = dps310_get_temp_samp_freq(data);
+       rc = dps310_get_temp_samp_freq(data, &rate);
+       if (rc)
+               goto done;
+
        timeout = DPS310_POLL_TIMEOUT_US(rate);
 
        /* Poll for sensor readiness; base the timeout upon the sample rate. */
@@ -612,13 +628,13 @@ static int dps310_write_raw(struct iio_dev *iio,
        return rc;
 }
 
-static int dps310_calculate_pressure(struct dps310_data *data)
+static int dps310_calculate_pressure(struct dps310_data *data, int *val)
 {
        int i;
        int rc;
        int t_ready;
-       int kpi = dps310_get_pres_k(data);
-       int kti = dps310_get_temp_k(data);
+       int kpi;
+       int kti;
        s64 rem = 0ULL;
        s64 pressure = 0ULL;
        s64 p;
@@ -629,11 +645,13 @@ static int dps310_calculate_pressure(struct dps310_data *data)
        s64 kp;
        s64 kt;
 
-       if (kpi < 0)
-               return kpi;
+       rc = dps310_get_pres_k(data, &kpi);
+       if (rc)
+               return rc;
 
-       if (kti < 0)
-               return kti;
+       rc = dps310_get_temp_k(data, &kti);
+       if (rc)
+               return rc;
 
        kp = (s64)kpi;
        kt = (s64)kti;
@@ -687,7 +705,9 @@ static int dps310_calculate_pressure(struct dps310_data *data)
        if (pressure < 0LL)
                return -ERANGE;
 
-       return (int)min_t(s64, pressure, INT_MAX);
+       *val = (int)min_t(s64, pressure, INT_MAX);
+
+       return 0;
 }
 
 static int dps310_read_pressure(struct dps310_data *data, int *val, int *val2,
@@ -697,11 +717,10 @@ static int dps310_read_pressure(struct dps310_data *data, int *val, int *val2,
 
        switch (mask) {
        case IIO_CHAN_INFO_SAMP_FREQ:
-               rc = dps310_get_pres_samp_freq(data);
-               if (rc < 0)
+               rc = dps310_get_pres_samp_freq(data, val);
+               if (rc)
                        return rc;
 
-               *val = rc;
                return IIO_VAL_INT;
 
        case IIO_CHAN_INFO_PROCESSED:
@@ -709,20 +728,17 @@ static int dps310_read_pressure(struct dps310_data *data, int *val, int *val2,
                if (rc)
                        return rc;
 
-               rc = dps310_calculate_pressure(data);
-               if (rc < 0)
+               rc = dps310_calculate_pressure(data, val);
+               if (rc)
                        return rc;
 
-               *val = rc;
                *val2 = 1000; /* Convert Pa to KPa per IIO ABI */
                return IIO_VAL_FRACTIONAL;
 
        case IIO_CHAN_INFO_OVERSAMPLING_RATIO:
-               rc = dps310_get_pres_precision(data);
-               if (rc < 0)
+               rc = dps310_get_pres_precision(data, val);
+               if (rc)
                        return rc;
-
-               *val = rc;
                return IIO_VAL_INT;
 
        default:
@@ -734,10 +750,11 @@ static int dps310_calculate_temp(struct dps310_data *data, int *val)
 {
        s64 c0;
        s64 t;
-       int kt = dps310_get_temp_k(data);
+       int kt, rc;
 
-       if (kt < 0)
-               return kt;
+       rc = dps310_get_temp_k(data, &kt);
+       if (rc)
+               return rc;
 
        /* Obtain inverse-scaled offset */
        c0 = div_s64((s64)kt * (s64)data->c0, 2);
@@ -758,11 +775,10 @@ static int dps310_read_temp(struct dps310_data *data, int *val, int *val2,
 
        switch (mask) {
        case IIO_CHAN_INFO_SAMP_FREQ:
-               rc = dps310_get_temp_samp_freq(data);
-               if (rc < 0)
+               rc = dps310_get_temp_samp_freq(data, val);
+               if (rc)
                        return rc;
 
-               *val = rc;
                return IIO_VAL_INT;
 
        case IIO_CHAN_INFO_PROCESSED:
@@ -777,11 +793,10 @@ static int dps310_read_temp(struct dps310_data *data, int *val, int *val2,
                return IIO_VAL_INT;
 
        case IIO_CHAN_INFO_OVERSAMPLING_RATIO:
-               rc = dps310_get_temp_precision(data);
-               if (rc < 0)
+               rc = dps310_get_temp_precision(data, val);
+               if (rc)
                        return rc;
 
-               *val = rc;
                return IIO_VAL_INT;
 
        default: