Commit 5cf943ed authored by Tokunori Ikegami's avatar Tokunori Ikegami Committed by Guenter Roeck
Browse files

hwmon: (adt7475) Split device update function to measure and limits



The update function reads both measurement and limit values.
Those parts can be split so split them for a maintainability.

Signed-off-by: default avatarTokunori Ikegami <ikegami@allied-telesis.co.jp>
Cc: Guenter Roeck <linux@roeck-us.net>
Cc: Chris Packham <chris.packham@alliedtelesis.co.nz>
[groeck: Clarify description]
Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
parent cd6a2064
Loading
Loading
Loading
Loading
+109 −101
Original line number Diff line number Diff line
@@ -194,7 +194,6 @@ struct adt7475_data {
	struct mutex lock;

	unsigned long measure_updated;
	unsigned long limits_updated;
	char valid;

	u8 config4;
@@ -1385,6 +1384,65 @@ static void adt7475_remove_files(struct i2c_client *client,
		sysfs_remove_group(&client->dev.kobj, &vid_attr_group);
}

static void adt7475_update_limits(struct i2c_client *client)
{
	struct adt7475_data *data = i2c_get_clientdata(client);
	int i;

	data->config4 = adt7475_read(REG_CONFIG4);
	data->config5 = adt7475_read(REG_CONFIG5);

	for (i = 0; i < ADT7475_VOLTAGE_COUNT; i++) {
		if (!(data->has_voltage & (1 << i)))
			continue;
		/* Adjust values so they match the input precision */
		data->voltage[MIN][i] =
			adt7475_read(VOLTAGE_MIN_REG(i)) << 2;
		data->voltage[MAX][i] =
			adt7475_read(VOLTAGE_MAX_REG(i)) << 2;
	}

	if (data->has_voltage & (1 << 5)) {
		data->voltage[MIN][5] = adt7475_read(REG_VTT_MIN) << 2;
		data->voltage[MAX][5] = adt7475_read(REG_VTT_MAX) << 2;
	}

	for (i = 0; i < ADT7475_TEMP_COUNT; i++) {
		/* Adjust values so they match the input precision */
		data->temp[MIN][i] =
			adt7475_read(TEMP_MIN_REG(i)) << 2;
		data->temp[MAX][i] =
			adt7475_read(TEMP_MAX_REG(i)) << 2;
		data->temp[AUTOMIN][i] =
			adt7475_read(TEMP_TMIN_REG(i)) << 2;
		data->temp[THERM][i] =
			adt7475_read(TEMP_THERM_REG(i)) << 2;
		data->temp[OFFSET][i] =
			adt7475_read(TEMP_OFFSET_REG(i));
	}
	adt7475_read_hystersis(client);

	for (i = 0; i < ADT7475_TACH_COUNT; i++) {
		if (i == 3 && !data->has_fan4)
			continue;
		data->tach[MIN][i] =
			adt7475_read_word(client, TACH_MIN_REG(i));
	}

	for (i = 0; i < ADT7475_PWM_COUNT; i++) {
		if (i == 1 && !data->has_pwm2)
			continue;
		data->pwm[MAX][i] = adt7475_read(PWM_MAX_REG(i));
		data->pwm[MIN][i] = adt7475_read(PWM_MIN_REG(i));
		/* Set the channel and control information */
		adt7475_read_pwm(client, i);
	}

	data->range[0] = adt7475_read(TEMP_TRANGE_REG(0));
	data->range[1] = adt7475_read(TEMP_TRANGE_REG(1));
	data->range[2] = adt7475_read(TEMP_TRANGE_REG(2));
}

static int adt7475_probe(struct i2c_client *client,
			 const struct i2c_device_id *id)
{
@@ -1562,6 +1620,9 @@ static int adt7475_probe(struct i2c_client *client,
			 (data->bypass_attn & (1 << 3)) ? " in3" : "",
			 (data->bypass_attn & (1 << 4)) ? " in4" : "");

	/* Limits and settings, should never change update more than once */
	adt7475_update_limits(client);

	return 0;

eremove:
@@ -1658,18 +1719,13 @@ static void adt7475_read_pwm(struct i2c_client *client, int index)
	}
}

static struct adt7475_data *adt7475_update_device(struct device *dev)
static void adt7475_update_measure(struct device *dev)
{
	struct i2c_client *client = to_i2c_client(dev);
	struct adt7475_data *data = i2c_get_clientdata(client);
	u16 ext;
	int i;

	mutex_lock(&data->lock);

	/* Measurement values update every 2 seconds */
	if (time_after(jiffies, data->measure_updated + HZ * 2) ||
	    !data->valid) {
	data->alarms = adt7475_read(REG_STATUS2) << 8;
	data->alarms |= adt7475_read(REG_STATUS1);

@@ -1711,68 +1767,20 @@ static struct adt7475_data *adt7475_update_device(struct device *dev)

	if (data->has_vid)
		data->vid = adt7475_read(REG_VID) & 0x3f;

		data->measure_updated = jiffies;
	}

	/* Limits and settings, should never change update every 60 seconds */
	if (time_after(jiffies, data->limits_updated + HZ * 60) ||
	    !data->valid) {
		data->config4 = adt7475_read(REG_CONFIG4);
		data->config5 = adt7475_read(REG_CONFIG5);

		for (i = 0; i < ADT7475_VOLTAGE_COUNT; i++) {
			if (!(data->has_voltage & (1 << i)))
				continue;
			/* Adjust values so they match the input precision */
			data->voltage[MIN][i] =
				adt7475_read(VOLTAGE_MIN_REG(i)) << 2;
			data->voltage[MAX][i] =
				adt7475_read(VOLTAGE_MAX_REG(i)) << 2;
		}

		if (data->has_voltage & (1 << 5)) {
			data->voltage[MIN][5] = adt7475_read(REG_VTT_MIN) << 2;
			data->voltage[MAX][5] = adt7475_read(REG_VTT_MAX) << 2;
		}

		for (i = 0; i < ADT7475_TEMP_COUNT; i++) {
			/* Adjust values so they match the input precision */
			data->temp[MIN][i] =
				adt7475_read(TEMP_MIN_REG(i)) << 2;
			data->temp[MAX][i] =
				adt7475_read(TEMP_MAX_REG(i)) << 2;
			data->temp[AUTOMIN][i] =
				adt7475_read(TEMP_TMIN_REG(i)) << 2;
			data->temp[THERM][i] =
				adt7475_read(TEMP_THERM_REG(i)) << 2;
			data->temp[OFFSET][i] =
				adt7475_read(TEMP_OFFSET_REG(i));
		}
		adt7475_read_hystersis(client);

		for (i = 0; i < ADT7475_TACH_COUNT; i++) {
			if (i == 3 && !data->has_fan4)
				continue;
			data->tach[MIN][i] =
				adt7475_read_word(client, TACH_MIN_REG(i));
}

		for (i = 0; i < ADT7475_PWM_COUNT; i++) {
			if (i == 1 && !data->has_pwm2)
				continue;
			data->pwm[MAX][i] = adt7475_read(PWM_MAX_REG(i));
			data->pwm[MIN][i] = adt7475_read(PWM_MIN_REG(i));
			/* Set the channel and control information */
			adt7475_read_pwm(client, i);
		}
static struct adt7475_data *adt7475_update_device(struct device *dev)
{
	struct i2c_client *client = to_i2c_client(dev);
	struct adt7475_data *data = i2c_get_clientdata(client);

		data->range[0] = adt7475_read(TEMP_TRANGE_REG(0));
		data->range[1] = adt7475_read(TEMP_TRANGE_REG(1));
		data->range[2] = adt7475_read(TEMP_TRANGE_REG(2));
	mutex_lock(&data->lock);

		data->limits_updated = jiffies;
		data->valid = 1;
	/* Measurement values update every 2 seconds */
	if (time_after(jiffies, data->measure_updated + HZ * 2) ||
	    !data->valid) {
		adt7475_update_measure(dev);
		data->measure_updated = jiffies;
	}

	mutex_unlock(&data->lock);