Merge tag 'hwmon-for-linus-v4.8-2' of git://git.kernel.org/pub/scm/linux/kernel/git...
authorLinus Torvalds <torvalds@linux-foundation.org>
Mon, 1 Aug 2016 20:49:13 +0000 (16:49 -0400)
committerLinus Torvalds <torvalds@linux-foundation.org>
Mon, 1 Aug 2016 20:49:13 +0000 (16:49 -0400)
Pull more hwmon updates from Guenter Roeck:

 - Improved error handling in tmp102, lm75, and lm90 drivers

 - Bug fixes in sht3x, ftsteutates, iio_hwmon, and adt7411 drivers

* tag 'hwmon-for-linus-v4.8-2' of git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging:
  hwmon: (adt7411) set sane values for CFG1 and CFG3
  hwmon: (iio_hwmon) fix memory leak in name attribute
  hwmon: (ftsteutates) Fix potential memory access error
  hwmon: (tmp102) Improve error handling
  hwmon: (lm75) Improve error handling
  hwmon: (lm90) Improve error handling
  hwmon: (lm90) Add missing assignment
  hwmon: (sht3x) set initial jiffies to last_update

drivers/hwmon/adt7411.c
drivers/hwmon/ftsteutates.c
drivers/hwmon/iio_hwmon.c
drivers/hwmon/lm75.c
drivers/hwmon/lm90.c
drivers/hwmon/sht3x.c
drivers/hwmon/tmp102.c

index a7f8869..fc1e65a 100644 (file)
@@ -30,6 +30,7 @@
 
 #define ADT7411_REG_CFG1                       0x18
 #define ADT7411_CFG1_START_MONITOR             (1 << 0)
+#define ADT7411_CFG1_RESERVED_BIT1             (1 << 1)
 #define ADT7411_CFG1_RESERVED_BIT3             (1 << 3)
 
 #define ADT7411_REG_CFG2                       0x19
@@ -37,6 +38,9 @@
 
 #define ADT7411_REG_CFG3                       0x1a
 #define ADT7411_CFG3_ADC_CLK_225               (1 << 0)
+#define ADT7411_CFG3_RESERVED_BIT1             (1 << 1)
+#define ADT7411_CFG3_RESERVED_BIT2             (1 << 2)
+#define ADT7411_CFG3_RESERVED_BIT3             (1 << 3)
 #define ADT7411_CFG3_REF_VDD                   (1 << 4)
 
 #define ADT7411_REG_DEVICE_ID                  0x4d
@@ -280,6 +284,45 @@ static int adt7411_detect(struct i2c_client *client,
        return 0;
 }
 
+static int adt7411_init_device(struct adt7411_data *data)
+{
+       int ret;
+       u8 val;
+
+       ret = i2c_smbus_read_byte_data(data->client, ADT7411_REG_CFG3);
+       if (ret < 0)
+               return ret;
+
+       /*
+        * We must only write zero to bit 1 and bit 2 and only one to bit 3
+        * according to the datasheet.
+        */
+       val = ret;
+       val &= ~(ADT7411_CFG3_RESERVED_BIT1 | ADT7411_CFG3_RESERVED_BIT2);
+       val |= ADT7411_CFG3_RESERVED_BIT3;
+
+       ret = i2c_smbus_write_byte_data(data->client, ADT7411_REG_CFG3, val);
+       if (ret < 0)
+               return ret;
+
+       ret = i2c_smbus_read_byte_data(data->client, ADT7411_REG_CFG1);
+       if (ret < 0)
+               return ret;
+
+       /*
+        * We must only write zero to bit 1 and only one to bit 3 according to
+        * the datasheet.
+        */
+       val = ret;
+       val &= ~ADT7411_CFG1_RESERVED_BIT1;
+       val |= ADT7411_CFG1_RESERVED_BIT3;
+
+       /* enable monitoring */
+       val |= ADT7411_CFG1_START_MONITOR;
+
+       return i2c_smbus_write_byte_data(data->client, ADT7411_REG_CFG1, val);
+}
+
 static int adt7411_probe(struct i2c_client *client,
                                   const struct i2c_device_id *id)
 {
@@ -297,10 +340,7 @@ static int adt7411_probe(struct i2c_client *client,
        mutex_init(&data->device_lock);
        mutex_init(&data->update_lock);
 
-       /* According to the datasheet, we must only write 1 to bit 3 */
-       ret = adt7411_modify_bit(client, ADT7411_REG_CFG1,
-                                ADT7411_CFG1_RESERVED_BIT3
-                                | ADT7411_CFG1_START_MONITOR, 1);
+       ret = adt7411_init_device(data);
        if (ret < 0)
                return ret;
 
index 2b2ff67..48633e5 100644 (file)
@@ -242,7 +242,7 @@ static int fts_wd_set_resolution(struct fts_data *data,
        }
 
        if (resolution == seconds)
-               set_bit(1, (unsigned long *)&ret);
+               ret |= BIT(1);
        else
                ret &= ~BIT(1);
 
index b550ba5..8944987 100644 (file)
@@ -110,24 +110,24 @@ static int iio_hwmon_probe(struct platform_device *pdev)
 
                switch (type) {
                case IIO_VOLTAGE:
-                       a->dev_attr.attr.name = kasprintf(GFP_KERNEL,
-                                                         "in%d_input",
-                                                         in_i++);
+                       a->dev_attr.attr.name = devm_kasprintf(dev, GFP_KERNEL,
+                                                              "in%d_input",
+                                                              in_i++);
                        break;
                case IIO_TEMP:
-                       a->dev_attr.attr.name = kasprintf(GFP_KERNEL,
-                                                         "temp%d_input",
-                                                         temp_i++);
+                       a->dev_attr.attr.name = devm_kasprintf(dev, GFP_KERNEL,
+                                                              "temp%d_input",
+                                                              temp_i++);
                        break;
                case IIO_CURRENT:
-                       a->dev_attr.attr.name = kasprintf(GFP_KERNEL,
-                                                         "curr%d_input",
-                                                         curr_i++);
+                       a->dev_attr.attr.name = devm_kasprintf(dev, GFP_KERNEL,
+                                                              "curr%d_input",
+                                                              curr_i++);
                        break;
                case IIO_HUMIDITYRELATIVE:
-                       a->dev_attr.attr.name = kasprintf(GFP_KERNEL,
-                                                         "humidity%d_input",
-                                                         humidity_i++);
+                       a->dev_attr.attr.name = devm_kasprintf(dev, GFP_KERNEL,
+                                                              "humidity%d_input",
+                                                              humidity_i++);
                        break;
                default:
                        ret = -EINVAL;
index 547a9c8..92f9d4b 100644 (file)
@@ -220,7 +220,7 @@ lm75_probe(struct i2c_client *client, const struct i2c_device_id *id)
        struct device *dev = &client->dev;
        struct device *hwmon_dev;
        struct lm75_data *data;
-       int status;
+       int status, err;
        u8 set_mask, clr_mask;
        int new;
        enum lm75_type kind = id->driver_data;
@@ -331,7 +331,9 @@ lm75_probe(struct i2c_client *client, const struct i2c_device_id *id)
        if (status != new)
                i2c_smbus_write_byte_data(client, LM75_REG_CONF, new);
 
-       devm_add_action(dev, lm75_remove, data);
+       err = devm_add_action_or_reset(dev, lm75_remove, data);
+       if (err)
+               return err;
 
        dev_dbg(dev, "Config %02x\n", new);
 
index 1e82374..496e771 100644 (file)
@@ -529,7 +529,7 @@ static int lm90_update_limits(struct device *dev)
                return val;
        data->temp_hyst = val;
 
-       lm90_read_reg(client, LM90_REG_R_REMOTE_LOWH);
+       val = lm90_read_reg(client, LM90_REG_R_REMOTE_LOWH);
        if (val < 0)
                return val;
        data->temp11[REMOTE_LOW] = val << 8;
@@ -1551,9 +1551,7 @@ static int lm90_init_client(struct i2c_client *client, struct lm90_data *data)
        if (config != data->config_orig) /* Only write if changed */
                i2c_smbus_write_byte_data(client, LM90_REG_W_CONFIG1, config);
 
-       devm_add_action(&client->dev, lm90_restore_conf, data);
-
-       return 0;
+       return devm_add_action_or_reset(&client->dev, lm90_restore_conf, data);
 }
 
 static bool lm90_is_tripped(struct i2c_client *client, u16 *status)
@@ -1640,7 +1638,9 @@ static int lm90_probe(struct i2c_client *client,
                return err;
        }
 
-       devm_add_action(dev, lm90_regulator_disable, regulator);
+       err = devm_add_action_or_reset(dev, lm90_regulator_disable, regulator);
+       if (err)
+               return err;
 
        data = devm_kzalloc(dev, sizeof(struct lm90_data), GFP_KERNEL);
        if (!data)
@@ -1696,7 +1696,9 @@ static int lm90_probe(struct i2c_client *client,
                err = device_create_file(dev, &dev_attr_pec);
                if (err)
                        return err;
-               devm_add_action(dev, lm90_remove_pec, dev);
+               err = devm_add_action_or_reset(dev, lm90_remove_pec, dev);
+               if (err)
+                       return err;
        }
 
        hwmon_dev = devm_hwmon_device_register_with_groups(dev, client->name,
index b73a488..6ea99cd 100644 (file)
@@ -720,7 +720,7 @@ static int sht3x_probe(struct i2c_client *client,
        data->setup.blocking_io = false;
        data->setup.high_precision = true;
        data->mode = 0;
-       data->last_update = 0;
+       data->last_update = jiffies - msecs_to_jiffies(3000);
        data->client = client;
        crc8_populate_msb(sht3x_crc8_table, SHT3X_CRC8_POLYNOMIAL);
 
index a942a25..8479ac5 100644 (file)
@@ -227,7 +227,9 @@ static int tmp102_probe(struct i2c_client *client,
 
        tmp102->config_orig = regval;
 
-       devm_add_action(dev, tmp102_restore_config, tmp102);
+       err = devm_add_action_or_reset(dev, tmp102_restore_config, tmp102);
+       if (err)
+               return err;
 
        regval &= ~TMP102_CONFIG_CLEAR;
        regval |= TMP102_CONFIG_SET;