]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
hwmon: (max31790) Rely on subsystem locking
authorGuenter Roeck <linux@roeck-us.net>
Sun, 7 Sep 2025 21:05:28 +0000 (14:05 -0700)
committerGuenter Roeck <linux@roeck-us.net>
Wed, 15 Oct 2025 18:02:43 +0000 (11:02 -0700)
Attribute access is now serialized in the hardware monitoring core,
so locking in the driver code is no longer necessary. Drop it.

Signed-off-by: Guenter Roeck <linux@roeck-us.net>
drivers/hwmon/max31790.c

index f5691332700432be2ddeeaae8c1dae718198d1f8..4f6171a17d9f1f62bc5244137b31c29be29d53f9 100644 (file)
@@ -57,7 +57,6 @@
  */
 struct max31790_data {
        struct i2c_client *client;
-       struct mutex update_lock;
        bool valid; /* zero until following fields are valid */
        unsigned long last_updated; /* in jiffies */
 
@@ -74,30 +73,27 @@ static struct max31790_data *max31790_update_device(struct device *dev)
 {
        struct max31790_data *data = dev_get_drvdata(dev);
        struct i2c_client *client = data->client;
-       struct max31790_data *ret = data;
-       int i;
-       int rv;
-
-       mutex_lock(&data->update_lock);
+       int i, rv;
 
        if (time_after(jiffies, data->last_updated + HZ) || !data->valid) {
+               data->valid = false;
                rv = i2c_smbus_read_byte_data(client,
                                MAX31790_REG_FAN_FAULT_STATUS1);
                if (rv < 0)
-                       goto abort;
+                       return ERR_PTR(rv);
                data->fault_status |= rv & 0x3F;
 
                rv = i2c_smbus_read_byte_data(client,
                                MAX31790_REG_FAN_FAULT_STATUS2);
                if (rv < 0)
-                       goto abort;
+                       return ERR_PTR(rv);
                data->fault_status |= (rv & 0x3F) << 6;
 
                for (i = 0; i < NR_CHANNEL; i++) {
                        rv = i2c_smbus_read_word_swapped(client,
                                        MAX31790_REG_TACH_COUNT(i));
                        if (rv < 0)
-                               goto abort;
+                               return ERR_PTR(rv);
                        data->tach[i] = rv;
 
                        if (data->fan_config[i]
@@ -106,19 +102,19 @@ static struct max31790_data *max31790_update_device(struct device *dev)
                                        MAX31790_REG_TACH_COUNT(NR_CHANNEL
                                                                + i));
                                if (rv < 0)
-                                       goto abort;
+                                       return ERR_PTR(rv);
                                data->tach[NR_CHANNEL + i] = rv;
                        } else {
                                rv = i2c_smbus_read_word_swapped(client,
                                                MAX31790_REG_PWM_DUTY_CYCLE(i));
                                if (rv < 0)
-                                       goto abort;
+                                       return ERR_PTR(rv);
                                data->pwm[i] = rv;
 
                                rv = i2c_smbus_read_word_swapped(client,
                                                MAX31790_REG_TARGET_COUNT(i));
                                if (rv < 0)
-                                       goto abort;
+                                       return ERR_PTR(rv);
                                data->target_count[i] = rv;
                        }
                }
@@ -126,16 +122,7 @@ static struct max31790_data *max31790_update_device(struct device *dev)
                data->last_updated = jiffies;
                data->valid = true;
        }
-       goto done;
-
-abort:
-       data->valid = false;
-       ret = ERR_PTR(rv);
-
-done:
-       mutex_unlock(&data->update_lock);
-
-       return ret;
+       return data;
 }
 
 static const u8 tach_period[8] = { 1, 2, 4, 8, 16, 32, 32, 32 };
@@ -189,7 +176,6 @@ static int max31790_read_fan(struct device *dev, u32 attr, int channel,
                *val = rpm;
                return 0;
        case hwmon_fan_fault:
-               mutex_lock(&data->update_lock);
                *val = !!(data->fault_status & (1 << channel));
                data->fault_status &= ~(1 << channel);
                /*
@@ -200,10 +186,9 @@ static int max31790_read_fan(struct device *dev, u32 attr, int channel,
                if (*val) {
                        int reg = MAX31790_REG_TARGET_COUNT(channel % NR_CHANNEL);
 
-                       i2c_smbus_write_byte_data(data->client, reg,
-                                                 data->target_count[channel % NR_CHANNEL] >> 8);
+                       return i2c_smbus_write_byte_data(data->client, reg,
+                                               data->target_count[channel % NR_CHANNEL] >> 8);
                }
-               mutex_unlock(&data->update_lock);
                return 0;
        case hwmon_fan_enable:
                *val = !!(data->fan_config[channel] & MAX31790_FAN_CFG_TACH_INPUT_EN);
@@ -223,8 +208,6 @@ static int max31790_write_fan(struct device *dev, u32 attr, int channel,
        u8 bits, fan_config;
        int sr;
 
-       mutex_lock(&data->update_lock);
-
        switch (attr) {
        case hwmon_fan_target:
                val = clamp_val(val, FAN_RPM_MIN, FAN_RPM_MAX);
@@ -270,9 +253,6 @@ static int max31790_write_fan(struct device *dev, u32 attr, int channel,
                err = -EOPNOTSUPP;
                break;
        }
-
-       mutex_unlock(&data->update_lock);
-
        return err;
 }
 
@@ -338,8 +318,6 @@ static int max31790_write_pwm(struct device *dev, u32 attr, int channel,
        u8 fan_config;
        int err = 0;
 
-       mutex_lock(&data->update_lock);
-
        switch (attr) {
        case hwmon_pwm_input:
                if (val < 0 || val > 255) {
@@ -389,9 +367,6 @@ static int max31790_write_pwm(struct device *dev, u32 attr, int channel,
                err = -EOPNOTSUPP;
                break;
        }
-
-       mutex_unlock(&data->update_lock);
-
        return err;
 }
 
@@ -525,7 +500,6 @@ static int max31790_probe(struct i2c_client *client)
                return -ENOMEM;
 
        data->client = client;
-       mutex_init(&data->update_lock);
 
        /*
         * Initialize the max31790 chip