hwmon: (max6650) Improve error handling in max6650_init_client
authorGuenter Roeck <linux@roeck-us.net>
Fri, 7 Jun 2019 17:23:18 +0000 (10:23 -0700)
committerGuenter Roeck <linux@roeck-us.net>
Mon, 24 Jun 2019 01:33:01 +0000 (18:33 -0700)
Do not overwrite errors reported from i2c functions, and don't ignore
any errors.

Cc: Jean-Francois Dagenais <jeff.dagenais@gmail.com>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
drivers/hwmon/max6650.c

index 461484e..caede4d 100644 (file)
@@ -604,8 +604,8 @@ static int max6650_init_client(struct max6650_data *data,
                               struct i2c_client *client)
 {
        struct device *dev = &client->dev;
-       int config;
-       int err = -EIO;
+       int reg;
+       int err;
        u32 voltage;
        u32 prescale;
        u32 target_rpm;
@@ -619,21 +619,20 @@ static int max6650_init_client(struct max6650_data *data,
                                 &prescale))
                prescale = prescaler;
 
-       config = i2c_smbus_read_byte_data(client, MAX6650_REG_CONFIG);
-
-       if (config < 0) {
-               dev_err(dev, "Error reading config, aborting.\n");
-               return err;
+       reg = i2c_smbus_read_byte_data(client, MAX6650_REG_CONFIG);
+       if (reg < 0) {
+               dev_err(dev, "Error reading config register, aborting.\n");
+               return reg;
        }
 
        switch (voltage) {
        case 0:
                break;
        case 5:
-               config &= ~MAX6650_CFG_V12;
+               reg &= ~MAX6650_CFG_V12;
                break;
        case 12:
-               config |= MAX6650_CFG_V12;
+               reg |= MAX6650_CFG_V12;
                break;
        default:
                dev_err(dev, "illegal value for fan_voltage (%d)\n", voltage);
@@ -643,22 +642,22 @@ static int max6650_init_client(struct max6650_data *data,
        case 0:
                break;
        case 1:
-               config &= ~MAX6650_CFG_PRESCALER_MASK;
+               reg &= ~MAX6650_CFG_PRESCALER_MASK;
                break;
        case 2:
-               config = (config & ~MAX6650_CFG_PRESCALER_MASK)
+               reg = (reg & ~MAX6650_CFG_PRESCALER_MASK)
                         | MAX6650_CFG_PRESCALER_2;
                break;
        case  4:
-               config = (config & ~MAX6650_CFG_PRESCALER_MASK)
+               reg = (reg & ~MAX6650_CFG_PRESCALER_MASK)
                         | MAX6650_CFG_PRESCALER_4;
                break;
        case  8:
-               config = (config & ~MAX6650_CFG_PRESCALER_MASK)
+               reg = (reg & ~MAX6650_CFG_PRESCALER_MASK)
                         | MAX6650_CFG_PRESCALER_8;
                break;
        case 16:
-               config = (config & ~MAX6650_CFG_PRESCALER_MASK)
+               reg = (reg & ~MAX6650_CFG_PRESCALER_MASK)
                         | MAX6650_CFG_PRESCALER_16;
                break;
        default:
@@ -666,16 +665,22 @@ static int max6650_init_client(struct max6650_data *data,
        }
 
        dev_info(dev, "Fan voltage: %dV, prescaler: %d.\n",
-                (config & MAX6650_CFG_V12) ? 12 : 5,
-                1 << (config & MAX6650_CFG_PRESCALER_MASK));
+                (reg & MAX6650_CFG_V12) ? 12 : 5,
+                1 << (reg & MAX6650_CFG_PRESCALER_MASK));
 
-       if (i2c_smbus_write_byte_data(client, MAX6650_REG_CONFIG, config)) {
+       err = i2c_smbus_write_byte_data(client, MAX6650_REG_CONFIG, reg);
+       if (err) {
                dev_err(dev, "Config write error, aborting.\n");
                return err;
        }
 
-       data->config = config;
-       data->count = i2c_smbus_read_byte_data(client, MAX6650_REG_COUNT);
+       data->config = reg;
+       reg = i2c_smbus_read_byte_data(client, MAX6650_REG_COUNT);
+       if (reg < 0) {
+               dev_err(dev, "Failed to read count register, aborting.\n");
+               return reg;
+       }
+       data->count = reg;
 
        if (!of_property_read_u32(client->dev.of_node, "maxim,fan-target-rpm",
                                  &target_rpm)) {