hwmon: pmbus: zl6100: Use generic code
Use generic pmbus bus access delay. Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com> Message-ID: <20240902075319.585656-4-patrick.rudolph@9elements.com> Signed-off-by: Guenter Roeck <linux@roeck-us.net>
This commit is contained in:
committed by
Guenter Roeck
parent
106cfea5fa
commit
9c4e67320f
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user