hwmon: (pmbus) Use _pmbus_read_byte_data with callback
Some of the pmbus core functions uses pmbus_read_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 use _pmbus_read_byte_data with callback check. Signed-off-by: Mårten Lindahl <marten.lindahl@axis.com> Link: https://lore.kernel.org/r/20220428144039.2464667-3-marten.lindahl@axis.com Signed-off-by: Guenter Roeck <linux@roeck-us.net>
This commit is contained in:
Родитель
5de3e13f7f
Коммит
f0a5c83976
|
@ -294,6 +294,24 @@ static int _pmbus_write_byte_data(struct i2c_client *client, int page, int reg,
|
|||
return pmbus_write_byte_data(client, page, reg, value);
|
||||
}
|
||||
|
||||
/*
|
||||
* _pmbus_read_byte_data() is similar to pmbus_read_byte_data(), but checks if
|
||||
* a device specific mapping function exists and calls it if necessary.
|
||||
*/
|
||||
static int _pmbus_read_byte_data(struct i2c_client *client, int page, int reg)
|
||||
{
|
||||
struct pmbus_data *data = i2c_get_clientdata(client);
|
||||
const struct pmbus_driver_info *info = data->info;
|
||||
int status;
|
||||
|
||||
if (info->read_byte_data) {
|
||||
status = info->read_byte_data(client, page, reg);
|
||||
if (status != -ENODATA)
|
||||
return status;
|
||||
}
|
||||
return pmbus_read_byte_data(client, page, reg);
|
||||
}
|
||||
|
||||
int pmbus_update_fan(struct i2c_client *client, int page, int id,
|
||||
u8 config, u8 mask, u16 command)
|
||||
{
|
||||
|
@ -301,7 +319,7 @@ int pmbus_update_fan(struct i2c_client *client, int page, int id,
|
|||
int rv;
|
||||
u8 to;
|
||||
|
||||
from = pmbus_read_byte_data(client, page,
|
||||
from = _pmbus_read_byte_data(client, page,
|
||||
pmbus_fan_config_registers[id]);
|
||||
if (from < 0)
|
||||
return from;
|
||||
|
@ -408,7 +426,7 @@ int pmbus_update_byte_data(struct i2c_client *client, int page, u8 reg,
|
|||
unsigned int tmp;
|
||||
int rv;
|
||||
|
||||
rv = pmbus_read_byte_data(client, page, reg);
|
||||
rv = _pmbus_read_byte_data(client, page, reg);
|
||||
if (rv < 0)
|
||||
return rv;
|
||||
|
||||
|
@ -421,24 +439,6 @@ int pmbus_update_byte_data(struct i2c_client *client, int page, u8 reg,
|
|||
}
|
||||
EXPORT_SYMBOL_NS_GPL(pmbus_update_byte_data, PMBUS);
|
||||
|
||||
/*
|
||||
* _pmbus_read_byte_data() is similar to pmbus_read_byte_data(), but checks if
|
||||
* a device specific mapping function exists and calls it if necessary.
|
||||
*/
|
||||
static int _pmbus_read_byte_data(struct i2c_client *client, int page, int reg)
|
||||
{
|
||||
struct pmbus_data *data = i2c_get_clientdata(client);
|
||||
const struct pmbus_driver_info *info = data->info;
|
||||
int status;
|
||||
|
||||
if (info->read_byte_data) {
|
||||
status = info->read_byte_data(client, page, reg);
|
||||
if (status != -ENODATA)
|
||||
return status;
|
||||
}
|
||||
return pmbus_read_byte_data(client, page, reg);
|
||||
}
|
||||
|
||||
static struct pmbus_sensor *pmbus_find_sensor(struct pmbus_data *data, int page,
|
||||
int reg)
|
||||
{
|
||||
|
@ -473,7 +473,7 @@ static int pmbus_get_fan_rate(struct i2c_client *client, int page, int id,
|
|||
return s->data;
|
||||
}
|
||||
|
||||
config = pmbus_read_byte_data(client, page,
|
||||
config = _pmbus_read_byte_data(client, page,
|
||||
pmbus_fan_config_registers[id]);
|
||||
if (config < 0)
|
||||
return config;
|
||||
|
@ -2417,7 +2417,7 @@ static int pmbus_regulator_is_enabled(struct regulator_dev *rdev)
|
|||
int ret;
|
||||
|
||||
mutex_lock(&data->update_lock);
|
||||
ret = pmbus_read_byte_data(client, page, PMBUS_OPERATION);
|
||||
ret = _pmbus_read_byte_data(client, page, PMBUS_OPERATION);
|
||||
mutex_unlock(&data->update_lock);
|
||||
|
||||
if (ret < 0)
|
||||
|
@ -2516,7 +2516,7 @@ static int pmbus_regulator_get_error_flags(struct regulator_dev *rdev, unsigned
|
|||
if (!(func & cat->func))
|
||||
continue;
|
||||
|
||||
status = pmbus_read_byte_data(client, page, cat->reg);
|
||||
status = _pmbus_read_byte_data(client, page, cat->reg);
|
||||
if (status < 0) {
|
||||
mutex_unlock(&data->update_lock);
|
||||
return status;
|
||||
|
|
Загрузка…
Ссылка в новой задаче