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

hwmon: (ftsteutates) 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>

+25 -59
+25 -59
drivers/hwmon/ftsteutates.c
··· 12 12 #include <linux/jiffies.h> 13 13 #include <linux/math.h> 14 14 #include <linux/module.h> 15 - #include <linux/mutex.h> 16 15 #include <linux/slab.h> 17 16 #include <linux/watchdog.h> 18 17 ··· 61 62 62 63 struct fts_data { 63 64 struct i2c_client *client; 64 - /* update sensor data lock */ 65 - struct mutex update_lock; 66 - /* read/write register lock */ 67 - struct mutex access_lock; 68 65 unsigned long last_updated; /* in jiffies */ 69 66 struct watchdog_device wdd; 70 67 enum WATCHDOG_RESOLUTION resolution; ··· 93 98 { 94 99 int ret; 95 100 unsigned char page = reg >> 8; 96 - struct fts_data *data = dev_get_drvdata(&client->dev); 97 - 98 - mutex_lock(&data->access_lock); 99 101 100 102 dev_dbg(&client->dev, "page select - page: 0x%.02x\n", page); 101 103 ret = i2c_smbus_write_byte_data(client, FTS_PAGE_SELECT_REG, page); 102 104 if (ret < 0) 103 - goto error; 105 + return ret; 104 106 105 107 reg &= 0xFF; 106 108 ret = i2c_smbus_read_byte_data(client, reg); 107 109 dev_dbg(&client->dev, "read - reg: 0x%.02x: val: 0x%.02x\n", reg, ret); 108 - 109 - error: 110 - mutex_unlock(&data->access_lock); 111 110 return ret; 112 111 } 113 112 ··· 110 121 { 111 122 int ret; 112 123 unsigned char page = reg >> 8; 113 - struct fts_data *data = dev_get_drvdata(&client->dev); 114 - 115 - mutex_lock(&data->access_lock); 116 124 117 125 dev_dbg(&client->dev, "page select - page: 0x%.02x\n", page); 118 126 ret = i2c_smbus_write_byte_data(client, FTS_PAGE_SELECT_REG, page); 119 127 if (ret < 0) 120 - goto error; 128 + return ret; 121 129 122 130 reg &= 0xFF; 123 131 dev_dbg(&client->dev, 124 132 "write - reg: 0x%.02x: val: 0x%.02x\n", reg, value); 125 133 ret = i2c_smbus_write_byte_data(client, reg, value); 126 - 127 - error: 128 - mutex_unlock(&data->access_lock); 129 134 return ret; 130 135 } 131 136 ··· 128 145 /*****************************************************************************/ 129 146 static int fts_update_device(struct fts_data *data) 130 147 { 131 - int i; 132 - int err = 0; 148 + int i, err; 133 149 134 - mutex_lock(&data->update_lock); 135 150 if (!time_after(jiffies, data->last_updated + 2 * HZ) && data->valid) 136 - goto exit; 151 + return 0; 137 152 138 153 err = fts_read_byte(data->client, FTS_DEVICE_STATUS_REG); 139 154 if (err < 0) 140 - goto exit; 155 + return err; 141 156 142 157 data->valid = !!(err & 0x02); /* Data not ready yet */ 143 - if (unlikely(!data->valid)) { 144 - err = -EAGAIN; 145 - goto exit; 146 - } 158 + if (unlikely(!data->valid)) 159 + return -EAGAIN; 147 160 148 161 err = fts_read_byte(data->client, FTS_FAN_PRESENT_REG); 149 162 if (err < 0) 150 - goto exit; 163 + return err; 151 164 data->fan_present = err; 152 165 153 166 err = fts_read_byte(data->client, FTS_FAN_EVENT_REG); 154 167 if (err < 0) 155 - goto exit; 168 + return err; 156 169 data->fan_alarm = err; 157 170 158 171 for (i = 0; i < FTS_NO_FAN_SENSORS; i++) { 159 172 if (data->fan_present & BIT(i)) { 160 173 err = fts_read_byte(data->client, FTS_REG_FAN_INPUT(i)); 161 174 if (err < 0) 162 - goto exit; 175 + return err; 163 176 data->fan_input[i] = err; 164 177 165 178 err = fts_read_byte(data->client, 166 179 FTS_REG_FAN_SOURCE(i)); 167 180 if (err < 0) 168 - goto exit; 181 + return err; 169 182 data->fan_source[i] = err; 170 183 } else { 171 184 data->fan_input[i] = 0; ··· 171 192 172 193 err = fts_read_byte(data->client, FTS_SENSOR_EVENT_REG); 173 194 if (err < 0) 174 - goto exit; 195 + return err; 175 196 data->temp_alarm = err; 176 197 177 198 for (i = 0; i < FTS_NO_TEMP_SENSORS; i++) { 178 199 err = fts_read_byte(data->client, FTS_REG_TEMP_INPUT(i)); 179 200 if (err < 0) 180 - goto exit; 201 + return err; 181 202 data->temp_input[i] = err; 182 203 } 183 204 184 205 for (i = 0; i < FTS_NO_VOLT_SENSORS; i++) { 185 206 err = fts_read_byte(data->client, FTS_REG_VOLT(i)); 186 207 if (err < 0) 187 - goto exit; 208 + return err; 188 209 data->volt[i] = err; 189 210 } 190 211 data->last_updated = jiffies; 191 - err = 0; 192 - exit: 193 - mutex_unlock(&data->update_lock); 194 - return err; 212 + return 0; 195 213 } 196 214 197 215 /*****************************************************************************/ ··· 446 470 if (val) 447 471 return -EINVAL; 448 472 449 - mutex_lock(&data->update_lock); 450 473 ret = fts_read_byte(data->client, FTS_REG_TEMP_CONTROL(channel)); 451 - if (ret >= 0) 452 - ret = fts_write_byte(data->client, FTS_REG_TEMP_CONTROL(channel), 453 - ret | 0x1); 454 - if (ret >= 0) 455 - data->valid = false; 456 - 457 - mutex_unlock(&data->update_lock); 458 474 if (ret < 0) 459 475 return ret; 460 - 476 + ret = fts_write_byte(data->client, FTS_REG_TEMP_CONTROL(channel), 477 + ret | 0x1); 478 + if (ret < 0) 479 + return ret; 480 + data->valid = false; 461 481 return 0; 462 482 default: 463 483 break; ··· 465 493 if (val) 466 494 return -EINVAL; 467 495 468 - mutex_lock(&data->update_lock); 469 496 ret = fts_read_byte(data->client, FTS_REG_FAN_CONTROL(channel)); 470 - if (ret >= 0) 471 - ret = fts_write_byte(data->client, FTS_REG_FAN_CONTROL(channel), 472 - ret | 0x1); 473 - if (ret >= 0) 474 - data->valid = false; 475 - 476 - mutex_unlock(&data->update_lock); 477 497 if (ret < 0) 478 498 return ret; 479 - 499 + ret = fts_write_byte(data->client, FTS_REG_FAN_CONTROL(channel), 500 + ret | 0x1); 501 + if (ret < 0) 502 + return ret; 503 + data->valid = false; 480 504 return 0; 481 505 default: 482 506 break; ··· 616 648 if (!data) 617 649 return -ENOMEM; 618 650 619 - mutex_init(&data->update_lock); 620 - mutex_init(&data->access_lock); 621 651 data->client = client; 622 652 dev_set_drvdata(&client->dev, data); 623 653