Commit 9c4e6732 authored by Patrick Rudolph's avatar Patrick Rudolph Committed by Guenter Roeck
Browse files

hwmon: pmbus: zl6100: Use generic code



Use generic pmbus bus access delay.

Signed-off-by: default avatarPatrick Rudolph <patrick.rudolph@9elements.com>
Message-ID: <20240902075319.585656-4-patrick.rudolph@9elements.com>
Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
parent 106cfea5
Loading
Loading
Loading
Loading
+8 −58
Original line number Diff line number Diff line
@@ -22,8 +22,6 @@ enum chips { zl2004, zl2005, zl2006, zl2008, zl2105, zl2106, zl6100, zl6105,

struct zl6100_data {
	int id;
	ktime_t access;		/* chip access time */
	int delay;		/* Delay between chip accesses in uS */
	struct pmbus_driver_info info;
};

@@ -122,16 +120,6 @@ static u16 zl6100_d2l(long val)
	return (mantissa & 0x7ff) | ((exponent << 11) & 0xf800);
}

/* Some chips need a delay between accesses */
static inline void zl6100_wait(const struct zl6100_data *data)
{
	if (data->delay) {
		s64 delta = ktime_us_delta(ktime_get(), data->access);
		if (delta < data->delay)
			udelay(data->delay - delta);
	}
}

static int zl6100_read_word_data(struct i2c_client *client, int page,
				 int phase, int reg)
{
@@ -174,9 +162,7 @@ static int zl6100_read_word_data(struct i2c_client *client, int page,
		break;
	}

	zl6100_wait(data);
	ret = pmbus_read_word_data(client, page, phase, vreg);
	data->access = ktime_get();
	if (ret < 0)
		return ret;

@@ -195,14 +181,11 @@ static int zl6100_read_word_data(struct i2c_client *client, int page,
static int zl6100_read_byte_data(struct i2c_client *client, int page, int reg)
{
	const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
	struct zl6100_data *data = to_zl6100_data(info);
	int ret, status;

	if (page >= info->pages)
		return -ENXIO;

	zl6100_wait(data);

	switch (reg) {
	case PMBUS_VIRT_STATUS_VMON:
		ret = pmbus_read_byte_data(client, 0,
@@ -225,7 +208,6 @@ static int zl6100_read_byte_data(struct i2c_client *client, int page, int reg)
		ret = pmbus_read_byte_data(client, page, reg);
		break;
	}
	data->access = ktime_get();

	return ret;
}
@@ -234,8 +216,7 @@ static int zl6100_write_word_data(struct i2c_client *client, int page, int reg,
				  u16 word)
{
	const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
	struct zl6100_data *data = to_zl6100_data(info);
	int ret, vreg;
	int vreg;

	if (page >= info->pages)
		return -ENXIO;
@@ -265,27 +246,7 @@ static int zl6100_write_word_data(struct i2c_client *client, int page, int reg,
		vreg = reg;
	}

	zl6100_wait(data);
	ret = pmbus_write_word_data(client, page, vreg, word);
	data->access = ktime_get();

	return ret;
}

static int zl6100_write_byte(struct i2c_client *client, int page, u8 value)
{
	const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
	struct zl6100_data *data = to_zl6100_data(info);
	int ret;

	if (page >= info->pages)
		return -ENXIO;

	zl6100_wait(data);
	ret = pmbus_write_byte(client, page, value);
	data->access = ktime_get();

	return ret;
	return pmbus_write_word_data(client, page, vreg, word);
}

static const struct i2c_device_id zl6100_id[] = {
@@ -363,14 +324,7 @@ static int zl6100_probe(struct i2c_client *client)
	 * supported chips are known to require a wait time between I2C
	 * accesses.
	 */
	data->delay = delay;

	/*
	 * Since there was a direct I2C device access above, wait before
	 * accessing the chip again.
	 */
	data->access = ktime_get();
	zl6100_wait(data);
	udelay(delay);

	info = &data->info;

@@ -404,8 +358,7 @@ static int zl6100_probe(struct i2c_client *client)
		if (ret < 0)
			return ret;

		data->access = ktime_get();
		zl6100_wait(data);
		udelay(delay);

		if (ret & ZL8802_MFR_PHASES_MASK)
			info->func[1] |= PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT;
@@ -418,8 +371,7 @@ static int zl6100_probe(struct i2c_client *client)
			if (ret < 0)
				return ret;

			data->access = ktime_get();
			zl6100_wait(data);
			udelay(delay);

			ret = i2c_smbus_read_word_data(client, ZL8802_MFR_USER_CONFIG);
			if (ret < 0)
@@ -428,8 +380,7 @@ static int zl6100_probe(struct i2c_client *client)
			if (ret & ZL8802_MFR_XTEMP_ENABLE_2)
				info->func[i] |= PMBUS_HAVE_TEMP2;

			data->access = ktime_get();
			zl6100_wait(data);
			udelay(delay);
		}
		ret = i2c_smbus_read_word_data(client, ZL8802_MFR_USER_GLOBAL_CONFIG);
		if (ret < 0)
@@ -446,13 +397,12 @@ static int zl6100_probe(struct i2c_client *client)
			info->func[0] |= PMBUS_HAVE_TEMP2;
	}

	data->access = ktime_get();
	zl6100_wait(data);
	udelay(delay);

	info->access_delay = delay;
	info->read_word_data = zl6100_read_word_data;
	info->read_byte_data = zl6100_read_byte_data;
	info->write_word_data = zl6100_write_word_data;
	info->write_byte = zl6100_write_byte;

	return pmbus_do_probe(client, info);
}