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

hwmon: pmbus: max15301: Use generic code



Use the generic pmbus bus access delay.

Signed-off-by: default avatarPatrick Rudolph <patrick.rudolph@9elements.com>
Message-ID: <20240902075319.585656-2-patrick.rudolph@9elements.com>
Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
parent 21d9e601
Loading
Loading
Loading
Loading
+1 −91
Original line number Diff line number Diff line
@@ -31,8 +31,6 @@ MODULE_DEVICE_TABLE(i2c, max15301_id);

struct max15301_data {
	int id;
	ktime_t access;		/* Chip access time */
	int delay;		/* Delay between chip accesses in us */
	struct pmbus_driver_info info;
};

@@ -55,89 +53,6 @@ static struct max15301_data max15301_data = {
	}
};

/* This chip needs a delay between accesses */
static inline void max15301_wait(const struct max15301_data *data)
{
	if (data->delay) {
		s64 delta = ktime_us_delta(ktime_get(), data->access);

		if (delta < data->delay)
			udelay(data->delay - delta);
	}
}

static int max15301_read_word_data(struct i2c_client *client, int page,
				   int phase, int reg)
{
	const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
	struct max15301_data *data = to_max15301_data(info);
	int ret;

	if (page > 0)
		return -ENXIO;

	if (reg >= PMBUS_VIRT_BASE)
		return -ENXIO;

	max15301_wait(data);
	ret = pmbus_read_word_data(client, page, phase, reg);
	data->access = ktime_get();

	return ret;
}

static int max15301_read_byte_data(struct i2c_client *client, int page, int reg)
{
	const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
	struct max15301_data *data = to_max15301_data(info);
	int ret;

	if (page > 0)
		return -ENXIO;

	max15301_wait(data);
	ret = pmbus_read_byte_data(client, page, reg);
	data->access = ktime_get();

	return ret;
}

static int max15301_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 max15301_data *data = to_max15301_data(info);
	int ret;

	if (page > 0)
		return -ENXIO;

	if (reg >= PMBUS_VIRT_BASE)
		return -ENXIO;

	max15301_wait(data);
	ret = pmbus_write_word_data(client, page, reg, word);
	data->access = ktime_get();

	return ret;
}

static int max15301_write_byte(struct i2c_client *client, int page, u8 value)
{
	const struct pmbus_driver_info *info = pmbus_get_driver_info(client);
	struct max15301_data *data = to_max15301_data(info);
	int ret;

	if (page > 0)
		return -ENXIO;

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

	return ret;
}

static int max15301_probe(struct i2c_client *client)
{
	int status;
@@ -164,12 +79,7 @@ static int max15301_probe(struct i2c_client *client)
		return -ENODEV;
	}

	max15301_data.delay = delay;

	info->read_byte_data = max15301_read_byte_data;
	info->read_word_data = max15301_read_word_data;
	info->write_byte = max15301_write_byte;
	info->write_word_data = max15301_write_word_data;
	info->access_delay = delay;

	return pmbus_do_probe(client, info);
}