Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

hwmon: (max31790) Rely on subsystem locking

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>

+11 -37
+11 -37
drivers/hwmon/max31790.c
··· 57 57 */ 58 58 struct max31790_data { 59 59 struct i2c_client *client; 60 - struct mutex update_lock; 61 60 bool valid; /* zero until following fields are valid */ 62 61 unsigned long last_updated; /* in jiffies */ 63 62 ··· 73 74 { 74 75 struct max31790_data *data = dev_get_drvdata(dev); 75 76 struct i2c_client *client = data->client; 76 - struct max31790_data *ret = data; 77 - int i; 78 - int rv; 79 - 80 - mutex_lock(&data->update_lock); 77 + int i, rv; 81 78 82 79 if (time_after(jiffies, data->last_updated + HZ) || !data->valid) { 80 + data->valid = false; 83 81 rv = i2c_smbus_read_byte_data(client, 84 82 MAX31790_REG_FAN_FAULT_STATUS1); 85 83 if (rv < 0) 86 - goto abort; 84 + return ERR_PTR(rv); 87 85 data->fault_status |= rv & 0x3F; 88 86 89 87 rv = i2c_smbus_read_byte_data(client, 90 88 MAX31790_REG_FAN_FAULT_STATUS2); 91 89 if (rv < 0) 92 - goto abort; 90 + return ERR_PTR(rv); 93 91 data->fault_status |= (rv & 0x3F) << 6; 94 92 95 93 for (i = 0; i < NR_CHANNEL; i++) { 96 94 rv = i2c_smbus_read_word_swapped(client, 97 95 MAX31790_REG_TACH_COUNT(i)); 98 96 if (rv < 0) 99 - goto abort; 97 + return ERR_PTR(rv); 100 98 data->tach[i] = rv; 101 99 102 100 if (data->fan_config[i] ··· 102 106 MAX31790_REG_TACH_COUNT(NR_CHANNEL 103 107 + i)); 104 108 if (rv < 0) 105 - goto abort; 109 + return ERR_PTR(rv); 106 110 data->tach[NR_CHANNEL + i] = rv; 107 111 } else { 108 112 rv = i2c_smbus_read_word_swapped(client, 109 113 MAX31790_REG_PWM_DUTY_CYCLE(i)); 110 114 if (rv < 0) 111 - goto abort; 115 + return ERR_PTR(rv); 112 116 data->pwm[i] = rv; 113 117 114 118 rv = i2c_smbus_read_word_swapped(client, 115 119 MAX31790_REG_TARGET_COUNT(i)); 116 120 if (rv < 0) 117 - goto abort; 121 + return ERR_PTR(rv); 118 122 data->target_count[i] = rv; 119 123 } 120 124 } ··· 122 126 data->last_updated = jiffies; 123 127 data->valid = true; 124 128 } 125 - goto done; 126 - 127 - abort: 128 - data->valid = false; 129 - ret = ERR_PTR(rv); 130 - 131 - done: 132 - mutex_unlock(&data->update_lock); 133 - 134 - return ret; 129 + return data; 135 130 } 136 131 137 132 static const u8 tach_period[8] = { 1, 2, 4, 8, 16, 32, 32, 32 }; ··· 176 189 *val = rpm; 177 190 return 0; 178 191 case hwmon_fan_fault: 179 - mutex_lock(&data->update_lock); 180 192 *val = !!(data->fault_status & (1 << channel)); 181 193 data->fault_status &= ~(1 << channel); 182 194 /* ··· 186 200 if (*val) { 187 201 int reg = MAX31790_REG_TARGET_COUNT(channel % NR_CHANNEL); 188 202 189 - i2c_smbus_write_byte_data(data->client, reg, 190 - data->target_count[channel % NR_CHANNEL] >> 8); 203 + return i2c_smbus_write_byte_data(data->client, reg, 204 + data->target_count[channel % NR_CHANNEL] >> 8); 191 205 } 192 - mutex_unlock(&data->update_lock); 193 206 return 0; 194 207 case hwmon_fan_enable: 195 208 *val = !!(data->fan_config[channel] & MAX31790_FAN_CFG_TACH_INPUT_EN); ··· 207 222 int err = 0; 208 223 u8 bits, fan_config; 209 224 int sr; 210 - 211 - mutex_lock(&data->update_lock); 212 225 213 226 switch (attr) { 214 227 case hwmon_fan_target: ··· 253 270 err = -EOPNOTSUPP; 254 271 break; 255 272 } 256 - 257 - mutex_unlock(&data->update_lock); 258 - 259 273 return err; 260 274 } 261 275 ··· 318 338 u8 fan_config; 319 339 int err = 0; 320 340 321 - mutex_lock(&data->update_lock); 322 - 323 341 switch (attr) { 324 342 case hwmon_pwm_input: 325 343 if (val < 0 || val > 255) { ··· 367 389 err = -EOPNOTSUPP; 368 390 break; 369 391 } 370 - 371 - mutex_unlock(&data->update_lock); 372 - 373 392 return err; 374 393 } 375 394 ··· 500 525 return -ENOMEM; 501 526 502 527 data->client = client; 503 - mutex_init(&data->update_lock); 504 528 505 529 /* 506 530 * Initialize the max31790 chip