hwmon: (pmbus) Introduce and use write_byte_data callback

Some of the pmbus core functions uses pmbus_write_byte_data, which does
not support driver callbacks for chip specific write operations. This
could potentially influence some specific regulator chips that for
example need a time delay before each data access.

Lets add support for driver callback with _pmbus_write_byte_data.

Signed-off-by: Mårten Lindahl <marten.lindahl@axis.com>
Link: https://lore.kernel.org/r/20220428144039.2464667-2-marten.lindahl@axis.com
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
This commit is contained in:
Mårten Lindahl 2022-04-28 16:40:36 +02:00 committed by Guenter Roeck
parent edd969aa9a
commit 5de3e13f7f
2 changed files with 23 additions and 3 deletions

View File

@ -438,6 +438,8 @@ struct pmbus_driver_info {
int (*read_byte_data)(struct i2c_client *client, int page, int reg); int (*read_byte_data)(struct i2c_client *client, int page, int reg);
int (*read_word_data)(struct i2c_client *client, int page, int phase, int (*read_word_data)(struct i2c_client *client, int page, int phase,
int reg); int reg);
int (*write_byte_data)(struct i2c_client *client, int page, int reg,
u8 byte);
int (*write_word_data)(struct i2c_client *client, int page, int reg, int (*write_word_data)(struct i2c_client *client, int page, int reg,
u16 word); u16 word);
int (*write_byte)(struct i2c_client *client, int page, u8 value); int (*write_byte)(struct i2c_client *client, int page, u8 value);

View File

@ -276,6 +276,24 @@ static int _pmbus_write_word_data(struct i2c_client *client, int page, int reg,
return pmbus_write_word_data(client, page, reg, word); return pmbus_write_word_data(client, page, reg, word);
} }
/*
* _pmbus_write_byte_data() is similar to pmbus_write_byte_data(), but checks if
* a device specific mapping function exists and calls it if necessary.
*/
static int _pmbus_write_byte_data(struct i2c_client *client, int page, int reg, u8 value)
{
struct pmbus_data *data = i2c_get_clientdata(client);
const struct pmbus_driver_info *info = data->info;
int status;
if (info->write_byte_data) {
status = info->write_byte_data(client, page, reg, value);
if (status != -ENODATA)
return status;
}
return pmbus_write_byte_data(client, page, reg, value);
}
int pmbus_update_fan(struct i2c_client *client, int page, int id, int pmbus_update_fan(struct i2c_client *client, int page, int id,
u8 config, u8 mask, u16 command) u8 config, u8 mask, u16 command)
{ {
@ -290,7 +308,7 @@ int pmbus_update_fan(struct i2c_client *client, int page, int id,
to = (from & ~mask) | (config & mask); to = (from & ~mask) | (config & mask);
if (to != from) { if (to != from) {
rv = pmbus_write_byte_data(client, page, rv = _pmbus_write_byte_data(client, page,
pmbus_fan_config_registers[id], to); pmbus_fan_config_registers[id], to);
if (rv < 0) if (rv < 0)
return rv; return rv;
@ -397,7 +415,7 @@ int pmbus_update_byte_data(struct i2c_client *client, int page, u8 reg,
tmp = (rv & ~mask) | (value & mask); tmp = (rv & ~mask) | (value & mask);
if (tmp != rv) if (tmp != rv)
rv = pmbus_write_byte_data(client, page, reg, tmp); rv = _pmbus_write_byte_data(client, page, reg, tmp);
return rv; return rv;
} }
@ -912,7 +930,7 @@ static int pmbus_get_boolean(struct i2c_client *client, struct pmbus_boolean *b,
regval = status & mask; regval = status & mask;
if (regval) { if (regval) {
ret = pmbus_write_byte_data(client, page, reg, regval); ret = _pmbus_write_byte_data(client, page, reg, regval);
if (ret) if (ret)
goto unlock; goto unlock;
} }