Commit 2790aed0 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'hwmon-for-linus-v4.8-2' of...

Merge tag 'hwmon-for-linus-v4.8-2' of git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging

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
parents f38d2e53 601807bb
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
#define ADT7411_REG_CFG1 0x18 #define ADT7411_REG_CFG1 0x18
#define ADT7411_CFG1_START_MONITOR (1 << 0) #define ADT7411_CFG1_START_MONITOR (1 << 0)
#define ADT7411_CFG1_RESERVED_BIT1 (1 << 1)
#define ADT7411_CFG1_RESERVED_BIT3 (1 << 3) #define ADT7411_CFG1_RESERVED_BIT3 (1 << 3)
#define ADT7411_REG_CFG2 0x19 #define ADT7411_REG_CFG2 0x19
...@@ -37,6 +38,9 @@ ...@@ -37,6 +38,9 @@
#define ADT7411_REG_CFG3 0x1a #define ADT7411_REG_CFG3 0x1a
#define ADT7411_CFG3_ADC_CLK_225 (1 << 0) #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_CFG3_REF_VDD (1 << 4)
#define ADT7411_REG_DEVICE_ID 0x4d #define ADT7411_REG_DEVICE_ID 0x4d
...@@ -280,6 +284,45 @@ static int adt7411_detect(struct i2c_client *client, ...@@ -280,6 +284,45 @@ static int adt7411_detect(struct i2c_client *client,
return 0; 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, static int adt7411_probe(struct i2c_client *client,
const struct i2c_device_id *id) const struct i2c_device_id *id)
{ {
...@@ -297,10 +340,7 @@ static int adt7411_probe(struct i2c_client *client, ...@@ -297,10 +340,7 @@ static int adt7411_probe(struct i2c_client *client,
mutex_init(&data->device_lock); mutex_init(&data->device_lock);
mutex_init(&data->update_lock); mutex_init(&data->update_lock);
/* According to the datasheet, we must only write 1 to bit 3 */ ret = adt7411_init_device(data);
ret = adt7411_modify_bit(client, ADT7411_REG_CFG1,
ADT7411_CFG1_RESERVED_BIT3
| ADT7411_CFG1_START_MONITOR, 1);
if (ret < 0) if (ret < 0)
return ret; return ret;
......
...@@ -242,7 +242,7 @@ static int fts_wd_set_resolution(struct fts_data *data, ...@@ -242,7 +242,7 @@ static int fts_wd_set_resolution(struct fts_data *data,
} }
if (resolution == seconds) if (resolution == seconds)
set_bit(1, (unsigned long *)&ret); ret |= BIT(1);
else else
ret &= ~BIT(1); ret &= ~BIT(1);
......
...@@ -110,22 +110,22 @@ static int iio_hwmon_probe(struct platform_device *pdev) ...@@ -110,22 +110,22 @@ static int iio_hwmon_probe(struct platform_device *pdev)
switch (type) { switch (type) {
case IIO_VOLTAGE: case IIO_VOLTAGE:
a->dev_attr.attr.name = kasprintf(GFP_KERNEL, a->dev_attr.attr.name = devm_kasprintf(dev, GFP_KERNEL,
"in%d_input", "in%d_input",
in_i++); in_i++);
break; break;
case IIO_TEMP: case IIO_TEMP:
a->dev_attr.attr.name = kasprintf(GFP_KERNEL, a->dev_attr.attr.name = devm_kasprintf(dev, GFP_KERNEL,
"temp%d_input", "temp%d_input",
temp_i++); temp_i++);
break; break;
case IIO_CURRENT: case IIO_CURRENT:
a->dev_attr.attr.name = kasprintf(GFP_KERNEL, a->dev_attr.attr.name = devm_kasprintf(dev, GFP_KERNEL,
"curr%d_input", "curr%d_input",
curr_i++); curr_i++);
break; break;
case IIO_HUMIDITYRELATIVE: case IIO_HUMIDITYRELATIVE:
a->dev_attr.attr.name = kasprintf(GFP_KERNEL, a->dev_attr.attr.name = devm_kasprintf(dev, GFP_KERNEL,
"humidity%d_input", "humidity%d_input",
humidity_i++); humidity_i++);
break; break;
......
...@@ -220,7 +220,7 @@ lm75_probe(struct i2c_client *client, const struct i2c_device_id *id) ...@@ -220,7 +220,7 @@ lm75_probe(struct i2c_client *client, const struct i2c_device_id *id)
struct device *dev = &client->dev; struct device *dev = &client->dev;
struct device *hwmon_dev; struct device *hwmon_dev;
struct lm75_data *data; struct lm75_data *data;
int status; int status, err;
u8 set_mask, clr_mask; u8 set_mask, clr_mask;
int new; int new;
enum lm75_type kind = id->driver_data; enum lm75_type kind = id->driver_data;
...@@ -331,7 +331,9 @@ lm75_probe(struct i2c_client *client, const struct i2c_device_id *id) ...@@ -331,7 +331,9 @@ lm75_probe(struct i2c_client *client, const struct i2c_device_id *id)
if (status != new) if (status != new)
i2c_smbus_write_byte_data(client, LM75_REG_CONF, 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); dev_dbg(dev, "Config %02x\n", new);
......
...@@ -529,7 +529,7 @@ static int lm90_update_limits(struct device *dev) ...@@ -529,7 +529,7 @@ static int lm90_update_limits(struct device *dev)
return val; return val;
data->temp_hyst = 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) if (val < 0)
return val; return val;
data->temp11[REMOTE_LOW] = val << 8; data->temp11[REMOTE_LOW] = val << 8;
...@@ -1551,9 +1551,7 @@ static int lm90_init_client(struct i2c_client *client, struct lm90_data *data) ...@@ -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 */ if (config != data->config_orig) /* Only write if changed */
i2c_smbus_write_byte_data(client, LM90_REG_W_CONFIG1, config); i2c_smbus_write_byte_data(client, LM90_REG_W_CONFIG1, config);
devm_add_action(&client->dev, lm90_restore_conf, data); return devm_add_action_or_reset(&client->dev, lm90_restore_conf, data);
return 0;
} }
static bool lm90_is_tripped(struct i2c_client *client, u16 *status) static bool lm90_is_tripped(struct i2c_client *client, u16 *status)
...@@ -1640,7 +1638,9 @@ static int lm90_probe(struct i2c_client *client, ...@@ -1640,7 +1638,9 @@ static int lm90_probe(struct i2c_client *client,
return err; 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); data = devm_kzalloc(dev, sizeof(struct lm90_data), GFP_KERNEL);
if (!data) if (!data)
...@@ -1696,7 +1696,9 @@ static int lm90_probe(struct i2c_client *client, ...@@ -1696,7 +1696,9 @@ static int lm90_probe(struct i2c_client *client,
err = device_create_file(dev, &dev_attr_pec); err = device_create_file(dev, &dev_attr_pec);
if (err) if (err)
return 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, hwmon_dev = devm_hwmon_device_register_with_groups(dev, client->name,
......
...@@ -720,7 +720,7 @@ static int sht3x_probe(struct i2c_client *client, ...@@ -720,7 +720,7 @@ static int sht3x_probe(struct i2c_client *client,
data->setup.blocking_io = false; data->setup.blocking_io = false;
data->setup.high_precision = true; data->setup.high_precision = true;
data->mode = 0; data->mode = 0;
data->last_update = 0; data->last_update = jiffies - msecs_to_jiffies(3000);
data->client = client; data->client = client;
crc8_populate_msb(sht3x_crc8_table, SHT3X_CRC8_POLYNOMIAL); crc8_populate_msb(sht3x_crc8_table, SHT3X_CRC8_POLYNOMIAL);
......
...@@ -227,7 +227,9 @@ static int tmp102_probe(struct i2c_client *client, ...@@ -227,7 +227,9 @@ static int tmp102_probe(struct i2c_client *client,
tmp102->config_orig = regval; 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_CLEAR;
regval |= TMP102_CONFIG_SET; regval |= TMP102_CONFIG_SET;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment