aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hwmon/it87.c
diff options
context:
space:
mode:
authorJean Delvare <khali@linux-fr.org>2007-02-14 15:15:03 -0500
committerJean Delvare <khali@arrakis.delvare>2007-02-14 15:15:03 -0500
commit7f999aa726ded3fd10d7619945e8b7d7e39833b3 (patch)
treecb99dfde0b69cf076810eb3c0d46aac54449e5e1 /drivers/hwmon/it87.c
parent6a0b1013c61396e588540713c8389038e7d0fead (diff)
hwmon: Simplify the locking model of two drivers
Many hardware monitoring drivers use two different mutexes, one to protect their per-device data structure, and one to protect the access to the device registers. These mutexes are essentially redundant, as the drivers are transfering values between the device registers and the data cache, so they almost always end up holding both mutexes at the same time. Using a single mutex will make the code more simple and faster. I am changing only two of the affected drivers here, the authors of the other affected drivers are welcome to submit similar patches if they want. Signed-off-by: Jean Delvare <khali@linux-fr.org>
Diffstat (limited to 'drivers/hwmon/it87.c')
-rw-r--r--drivers/hwmon/it87.c22
1 files changed, 5 insertions, 17 deletions
diff --git a/drivers/hwmon/it87.c b/drivers/hwmon/it87.c
index bb16668ad2bd..18bb44d18e89 100644
--- a/drivers/hwmon/it87.c
+++ b/drivers/hwmon/it87.c
@@ -221,7 +221,6 @@ static const unsigned int pwm_freq[8] = {
221struct it87_data { 221struct it87_data {
222 struct i2c_client client; 222 struct i2c_client client;
223 struct class_device *class_dev; 223 struct class_device *class_dev;
224 struct mutex lock;
225 enum chips type; 224 enum chips type;
226 225
227 struct mutex update_lock; 226 struct mutex update_lock;
@@ -548,9 +547,10 @@ static ssize_t set_fan_min(struct device *dev, struct device_attribute *attr,
548 struct i2c_client *client = to_i2c_client(dev); 547 struct i2c_client *client = to_i2c_client(dev);
549 struct it87_data *data = i2c_get_clientdata(client); 548 struct it87_data *data = i2c_get_clientdata(client);
550 int val = simple_strtol(buf, NULL, 10); 549 int val = simple_strtol(buf, NULL, 10);
551 u8 reg = it87_read_value(client, IT87_REG_FAN_DIV); 550 u8 reg;
552 551
553 mutex_lock(&data->update_lock); 552 mutex_lock(&data->update_lock);
553 reg = it87_read_value(client, IT87_REG_FAN_DIV);
554 switch (nr) { 554 switch (nr) {
555 case 0: data->fan_div[nr] = reg & 0x07; break; 555 case 0: data->fan_div[nr] = reg & 0x07; break;
556 case 1: data->fan_div[nr] = (reg >> 3) & 0x07; break; 556 case 1: data->fan_div[nr] = (reg >> 3) & 0x07; break;
@@ -949,7 +949,6 @@ static int it87_detect(struct i2c_adapter *adapter)
949 } 949 }
950 950
951 new_client = &data->client; 951 new_client = &data->client;
952 mutex_init(&data->lock);
953 i2c_set_clientdata(new_client, data); 952 i2c_set_clientdata(new_client, data);
954 new_client->addr = isa_address; 953 new_client->addr = isa_address;
955 new_client->adapter = adapter; 954 new_client->adapter = adapter;
@@ -1127,33 +1126,22 @@ static int it87_detach_client(struct i2c_client *client)
1127 return 0; 1126 return 0;
1128} 1127}
1129 1128
1130/* ISA access must be locked explicitly! 1129/* Must be called with data->update_lock held, except during initialization.
1131 We ignore the IT87 BUSY flag at this moment - it could lead to deadlocks, 1130 We ignore the IT87 BUSY flag at this moment - it could lead to deadlocks,
1132 would slow down the IT87 access and should not be necessary. */ 1131 would slow down the IT87 access and should not be necessary. */
1133static int it87_read_value(struct i2c_client *client, u8 reg) 1132static int it87_read_value(struct i2c_client *client, u8 reg)
1134{ 1133{
1135 struct it87_data *data = i2c_get_clientdata(client);
1136 int res;
1137
1138 mutex_lock(&data->lock);
1139 outb_p(reg, client->addr + IT87_ADDR_REG_OFFSET); 1134 outb_p(reg, client->addr + IT87_ADDR_REG_OFFSET);
1140 res = inb_p(client->addr + IT87_DATA_REG_OFFSET); 1135 return inb_p(client->addr + IT87_DATA_REG_OFFSET);
1141 mutex_unlock(&data->lock);
1142
1143 return res;
1144} 1136}
1145 1137
1146/* ISA access must be locked explicitly! 1138/* Must be called with data->update_lock held, except during initialization.
1147 We ignore the IT87 BUSY flag at this moment - it could lead to deadlocks, 1139 We ignore the IT87 BUSY flag at this moment - it could lead to deadlocks,
1148 would slow down the IT87 access and should not be necessary. */ 1140 would slow down the IT87 access and should not be necessary. */
1149static void it87_write_value(struct i2c_client *client, u8 reg, u8 value) 1141static void it87_write_value(struct i2c_client *client, u8 reg, u8 value)
1150{ 1142{
1151 struct it87_data *data = i2c_get_clientdata(client);
1152
1153 mutex_lock(&data->lock);
1154 outb_p(reg, client->addr + IT87_ADDR_REG_OFFSET); 1143 outb_p(reg, client->addr + IT87_ADDR_REG_OFFSET);
1155 outb_p(value, client->addr + IT87_DATA_REG_OFFSET); 1144 outb_p(value, client->addr + IT87_DATA_REG_OFFSET);
1156 mutex_unlock(&data->lock);
1157} 1145}
1158 1146
1159/* Return 1 if and only if the PWM interface is safe to use */ 1147/* Return 1 if and only if the PWM interface is safe to use */