hwmon: (tmp464) Use multi-byte regmap operations
authorGuenter Roeck <linux@roeck-us.net>
Tue, 9 Jul 2024 21:07:19 +0000 (14:07 -0700)
committerGuenter Roeck <linux@roeck-us.net>
Wed, 31 Jul 2024 17:43:51 +0000 (10:43 -0700)
Use multi-byte regmap operations where possible to reduce code size
and the need for mutex protection.

No functional changes.

Reviewed-by: Tzung-Bi Shih <tzungbi@kernel.org>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
drivers/hwmon/tmp464.c

index 3ee1137533d632258d1223a52a9202387393fecd..0a7c0448835b4fcc561c2dda0784b67f401a0a7b 100644 (file)
@@ -147,11 +147,11 @@ static int tmp464_temp_read(struct device *dev, u32 attr, int channel, long *val
 {
        struct tmp464_data *data = dev_get_drvdata(dev);
        struct regmap *regmap = data->regmap;
-       unsigned int regval, regval2;
+       unsigned int regs[2];
+       unsigned int regval;
+       u16 regvals[2];
        int err = 0;
 
-       mutex_lock(&data->update_lock);
-
        switch (attr) {
        case hwmon_temp_max_alarm:
                err = regmap_read(regmap, TMP464_THERM_STATUS_REG, &regval);
@@ -172,26 +172,27 @@ static int tmp464_temp_read(struct device *dev, u32 attr, int channel, long *val
                 * complete. That means we have to cache the value internally
                 * for one measurement cycle and report the cached value.
                 */
+               mutex_lock(&data->update_lock);
                if (!data->valid || time_after(jiffies, data->last_updated +
                                               msecs_to_jiffies(data->update_interval))) {
                        err = regmap_read(regmap, TMP464_REMOTE_OPEN_REG, &regval);
                        if (err < 0)
-                               break;
+                               goto unlock;
                        data->open_reg = regval;
                        data->last_updated = jiffies;
                        data->valid = true;
                }
                *val = !!(data->open_reg & BIT(channel + 7));
+unlock:
+               mutex_unlock(&data->update_lock);
                break;
        case hwmon_temp_max_hyst:
-               err = regmap_read(regmap, TMP464_THERM_LIMIT[channel], &regval);
+               regs[0] = TMP464_THERM_LIMIT[channel];
+               regs[1] = TMP464_TEMP_HYST_REG;
+               err = regmap_multi_reg_read(regmap, regs, regvals, 2);
                if (err < 0)
                        break;
-               err = regmap_read(regmap, TMP464_TEMP_HYST_REG, &regval2);
-               if (err < 0)
-                       break;
-               regval -= regval2;
-               *val = temp_from_reg(regval);
+               *val = temp_from_reg(regvals[0] - regvals[1]);
                break;
        case hwmon_temp_max:
                err = regmap_read(regmap, TMP464_THERM_LIMIT[channel], &regval);
@@ -200,14 +201,12 @@ static int tmp464_temp_read(struct device *dev, u32 attr, int channel, long *val
                *val = temp_from_reg(regval);
                break;
        case hwmon_temp_crit_hyst:
-               err = regmap_read(regmap, TMP464_THERM2_LIMIT[channel], &regval);
-               if (err < 0)
-                       break;
-               err = regmap_read(regmap, TMP464_TEMP_HYST_REG, &regval2);
+               regs[0] = TMP464_THERM2_LIMIT[channel];
+               regs[1] = TMP464_TEMP_HYST_REG;
+               err = regmap_multi_reg_read(regmap, regs, regvals, 2);
                if (err < 0)
                        break;
-               regval -= regval2;
-               *val = temp_from_reg(regval);
+               *val = temp_from_reg(regvals[0] - regvals[1]);
                break;
        case hwmon_temp_crit:
                err = regmap_read(regmap, TMP464_THERM2_LIMIT[channel], &regval);
@@ -239,8 +238,6 @@ static int tmp464_temp_read(struct device *dev, u32 attr, int channel, long *val
                break;
        }
 
-       mutex_unlock(&data->update_lock);
-
        return err;
 }