The calibration function calls i2c_smbus_write_byte() and
i2c_smbus_read_byte(). These two function calls are replaced with a
single call to i2c_smbus_read_byte_data() by this patch. This patch
also removes an unnecessary call that reads the CNTRL register
a second time. One of the error paths returned -1 if the ADC was not
enabled and this patch changes that return value to -EINVAL.

Signed-off-by: Brian Masney <masn...@onstation.org>
---
 drivers/staging/iio/light/tsl2x7x.c | 34 ++++++++++++----------------------
 1 file changed, 12 insertions(+), 22 deletions(-)

diff --git a/drivers/staging/iio/light/tsl2x7x.c 
b/drivers/staging/iio/light/tsl2x7x.c
index 6c9f06b..5734628 100644
--- a/drivers/staging/iio/light/tsl2x7x.c
+++ b/drivers/staging/iio/light/tsl2x7x.c
@@ -542,39 +542,29 @@ static void tsl2x7x_defaults(struct tsl2X7X_chip *chip)
 static int tsl2x7x_als_calibrate(struct iio_dev *indio_dev)
 {
        struct tsl2X7X_chip *chip = iio_priv(indio_dev);
-       u8 reg_val;
        int gain_trim_val;
        int ret;
        int lux_val;
 
-       ret = i2c_smbus_write_byte(chip->client,
-                                  (TSL2X7X_CMD_REG | TSL2X7X_CNTRL));
+       ret = i2c_smbus_read_byte_data(chip->client,
+                                      TSL2X7X_CMD_REG | TSL2X7X_CNTRL);
        if (ret < 0) {
                dev_err(&chip->client->dev,
-                       "failed to write CNTRL register, ret=%d\n", ret);
+                       "%s: failed to read from the CNTRL register\n",
+                       __func__);
                return ret;
        }
 
-       reg_val = i2c_smbus_read_byte(chip->client);
-       if ((reg_val & (TSL2X7X_CNTL_ADC_ENBL | TSL2X7X_CNTL_PWR_ON))
-               != (TSL2X7X_CNTL_ADC_ENBL | TSL2X7X_CNTL_PWR_ON)) {
-               dev_err(&chip->client->dev,
-                       "%s: failed: ADC not enabled\n", __func__);
-               return -1;
-       }
-
-       ret = i2c_smbus_write_byte(chip->client,
-                                  (TSL2X7X_CMD_REG | TSL2X7X_CNTRL));
-       if (ret < 0) {
+       if ((ret & (TSL2X7X_CNTL_ADC_ENBL | TSL2X7X_CNTL_PWR_ON))
+                       != (TSL2X7X_CNTL_ADC_ENBL | TSL2X7X_CNTL_PWR_ON)) {
                dev_err(&chip->client->dev,
-                       "failed to write ctrl reg: ret=%d\n", ret);
-               return ret;
-       }
-
-       reg_val = i2c_smbus_read_byte(chip->client);
-       if ((reg_val & TSL2X7X_STA_ADC_VALID) != TSL2X7X_STA_ADC_VALID) {
+                       "%s: Device is not powered on and/or ADC is not 
enabled\n",
+                       __func__);
+               return -EINVAL;
+       } else if ((ret & TSL2X7X_STA_ADC_VALID) != TSL2X7X_STA_ADC_VALID) {
                dev_err(&chip->client->dev,
-                       "%s: failed: STATUS - ADC not valid.\n", __func__);
+                       "%s: The two ADC channels have not completed an 
integration cycle\n",
+                       __func__);
                return -ENODATA;
        }
 
-- 
2.9.4

Reply via email to