hwmon: (pmbus) Use _pmbus_read_byte_data with callback
authorMårten Lindahl <marten.lindahl@axis.com>
Thu, 28 Apr 2022 14:40:37 +0000 (16:40 +0200)
committerGuenter Roeck <linux@roeck-us.net>
Fri, 20 May 2022 17:57:06 +0000 (10:57 -0700)
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>
drivers/hwmon/pmbus/pmbus_core.c

index e7235d526e99abefc13d4d335a50cb240d5d6f79..d2913c8a3896101711c653f511848508a6299df0 100644 (file)
@@ -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;