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

hwmon: (adt7411) 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>
Reviewed-by: Nuno Sá <nuno.sa@analog.com>

+16 -43
+16 -43
drivers/hwmon/adt7411.c
··· 11 11 #include <linux/module.h> 12 12 #include <linux/init.h> 13 13 #include <linux/err.h> 14 - #include <linux/mutex.h> 15 14 #include <linux/jiffies.h> 16 15 #include <linux/i2c.h> 17 16 #include <linux/hwmon.h> ··· 98 99 }; 99 100 100 101 struct adt7411_data { 101 - struct mutex device_lock; /* for "atomic" device accesses */ 102 - struct mutex update_lock; 103 102 unsigned long next_update; 104 103 long vref_cached; 105 104 struct i2c_client *client; ··· 107 110 /* 108 111 * When reading a register containing (up to 4) lsb, all associated 109 112 * msb-registers get locked by the hardware. After _one_ of those msb is read, 110 - * _all_ are unlocked. In order to use this locking correctly, reading lsb/msb 111 - * is protected here with a mutex, too. 113 + * _all_ are unlocked. 112 114 */ 113 115 static int adt7411_read_10_bit(struct i2c_client *client, u8 lsb_reg, 114 - u8 msb_reg, u8 lsb_shift) 116 + u8 msb_reg, u8 lsb_shift) 115 117 { 116 - struct adt7411_data *data = i2c_get_clientdata(client); 117 118 int val, tmp; 118 - 119 - mutex_lock(&data->device_lock); 120 119 121 120 val = i2c_smbus_read_byte_data(client, lsb_reg); 122 121 if (val < 0) 123 - goto exit_unlock; 122 + return val; 124 123 125 124 tmp = (val >> lsb_shift) & 3; 126 125 val = i2c_smbus_read_byte_data(client, msb_reg); 126 + if (val < 0) 127 + return val; 127 128 128 - if (val >= 0) 129 - val = (val << 2) | tmp; 130 - 131 - exit_unlock: 132 - mutex_unlock(&data->device_lock); 133 - 129 + val = (val << 2) | tmp; 134 130 return val; 135 131 } 136 132 137 133 static int adt7411_modify_bit(struct i2c_client *client, u8 reg, u8 bit, 138 - bool flag) 134 + bool flag) 139 135 { 140 - struct adt7411_data *data = i2c_get_clientdata(client); 141 136 int ret, val; 142 - 143 - mutex_lock(&data->device_lock); 144 137 145 138 ret = i2c_smbus_read_byte_data(client, reg); 146 139 if (ret < 0) 147 - goto exit_unlock; 140 + return ret; 148 141 149 142 if (flag) 150 143 val = ret | bit; 151 144 else 152 145 val = ret & ~bit; 153 146 154 - ret = i2c_smbus_write_byte_data(client, reg, val); 155 - 156 - exit_unlock: 157 - mutex_unlock(&data->device_lock); 158 - return ret; 147 + return i2c_smbus_write_byte_data(client, reg, val); 159 148 } 160 149 161 150 static ssize_t adt7411_show_bit(struct device *dev, ··· 169 186 if (ret || flag > 1) 170 187 return -EINVAL; 171 188 189 + hwmon_lock(dev); 172 190 ret = adt7411_modify_bit(client, s_attr2->index, s_attr2->nr, flag); 173 - 174 191 /* force update */ 175 - mutex_lock(&data->update_lock); 176 192 data->next_update = jiffies; 177 - mutex_unlock(&data->update_lock); 193 + hwmon_unlock(dev); 178 194 179 195 return ret < 0 ? ret : count; 180 196 } ··· 276 294 int reg, lsb_reg, lsb_shift; 277 295 int nr = channel - 1; 278 296 279 - mutex_lock(&data->update_lock); 280 297 ret = adt7411_update_vref(dev); 281 298 if (ret < 0) 282 - goto exit_unlock; 299 + return ret; 283 300 284 301 switch (attr) { 285 302 case hwmon_in_input: ··· 288 307 ADT7411_REG_EXT_TEMP_AIN1_MSB + nr, 289 308 lsb_shift); 290 309 if (ret < 0) 291 - goto exit_unlock; 310 + return ret; 292 311 *val = ret * data->vref_cached / 1024; 293 312 ret = 0; 294 313 break; ··· 299 318 : ADT7411_REG_IN_HIGH(channel); 300 319 ret = i2c_smbus_read_byte_data(client, reg); 301 320 if (ret < 0) 302 - goto exit_unlock; 321 + return ret; 303 322 *val = ret * data->vref_cached / 256; 304 323 ret = 0; 305 324 break; ··· 310 329 ret = -EOPNOTSUPP; 311 330 break; 312 331 } 313 - exit_unlock: 314 - mutex_unlock(&data->update_lock); 315 332 return ret; 316 333 } 317 334 ··· 436 457 struct i2c_client *client = data->client; 437 458 int ret, reg; 438 459 439 - mutex_lock(&data->update_lock); 440 460 ret = adt7411_update_vref(dev); 441 461 if (ret < 0) 442 - goto exit_unlock; 462 + return ret; 443 463 val = clamp_val(val, 0, 255 * data->vref_cached / 256); 444 464 val = DIV_ROUND_CLOSEST(val * 256, data->vref_cached); 445 465 ··· 450 472 reg = ADT7411_REG_IN_HIGH(channel); 451 473 break; 452 474 default: 453 - ret = -EOPNOTSUPP; 454 - goto exit_unlock; 475 + return -EOPNOTSUPP; 455 476 } 456 477 457 478 ret = i2c_smbus_write_byte_data(client, reg, val); 458 - exit_unlock: 459 - mutex_unlock(&data->update_lock); 460 479 return ret; 461 480 } 462 481 ··· 654 679 655 680 i2c_set_clientdata(client, data); 656 681 data->client = client; 657 - mutex_init(&data->device_lock); 658 - mutex_init(&data->update_lock); 659 682 660 683 ret = adt7411_init_device(data); 661 684 if (ret < 0)