Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+44 −4
Original line number Diff line number Diff line
@@ -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;

+1 −1
Original line number Diff line number Diff line
@@ -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);

+12 −12
Original line number Diff line number Diff line
@@ -110,22 +110,22 @@ static int iio_hwmon_probe(struct platform_device *pdev)

		switch (type) {
		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_i++);
			break;
		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_i++);
			break;
		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_i++);
			break;
		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_i++);
			break;
+4 −2
Original line number Diff line number Diff line
@@ -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);

+8 −6
Original line number Diff line number Diff line
@@ -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,
Loading