diff options
Diffstat (limited to 'drivers/hwmon/lm80.c')
-rw-r--r-- | drivers/hwmon/lm80.c | 27 |
1 files changed, 14 insertions, 13 deletions
diff --git a/drivers/hwmon/lm80.c b/drivers/hwmon/lm80.c index c9a7cdea7bd7..f72120d08c4c 100644 --- a/drivers/hwmon/lm80.c +++ b/drivers/hwmon/lm80.c | |||
@@ -28,6 +28,7 @@ | |||
28 | #include <linux/i2c.h> | 28 | #include <linux/i2c.h> |
29 | #include <linux/hwmon.h> | 29 | #include <linux/hwmon.h> |
30 | #include <linux/err.h> | 30 | #include <linux/err.h> |
31 | #include <linux/mutex.h> | ||
31 | 32 | ||
32 | /* Addresses to scan */ | 33 | /* Addresses to scan */ |
33 | static unsigned short normal_i2c[] = { 0x28, 0x29, 0x2a, 0x2b, 0x2c, | 34 | static unsigned short normal_i2c[] = { 0x28, 0x29, 0x2a, 0x2b, 0x2c, |
@@ -108,7 +109,7 @@ static inline long TEMP_FROM_REG(u16 temp) | |||
108 | struct lm80_data { | 109 | struct lm80_data { |
109 | struct i2c_client client; | 110 | struct i2c_client client; |
110 | struct class_device *class_dev; | 111 | struct class_device *class_dev; |
111 | struct semaphore update_lock; | 112 | struct mutex update_lock; |
112 | char valid; /* !=0 if following fields are valid */ | 113 | char valid; /* !=0 if following fields are valid */ |
113 | unsigned long last_updated; /* In jiffies */ | 114 | unsigned long last_updated; /* In jiffies */ |
114 | 115 | ||
@@ -191,10 +192,10 @@ static ssize_t set_in_##suffix(struct device *dev, struct device_attribute *attr | |||
191 | struct lm80_data *data = i2c_get_clientdata(client); \ | 192 | struct lm80_data *data = i2c_get_clientdata(client); \ |
192 | long val = simple_strtol(buf, NULL, 10); \ | 193 | long val = simple_strtol(buf, NULL, 10); \ |
193 | \ | 194 | \ |
194 | down(&data->update_lock);\ | 195 | mutex_lock(&data->update_lock);\ |
195 | data->value = IN_TO_REG(val); \ | 196 | data->value = IN_TO_REG(val); \ |
196 | lm80_write_value(client, reg, data->value); \ | 197 | lm80_write_value(client, reg, data->value); \ |
197 | up(&data->update_lock);\ | 198 | mutex_unlock(&data->update_lock);\ |
198 | return count; \ | 199 | return count; \ |
199 | } | 200 | } |
200 | set_in(min0, in_min[0], LM80_REG_IN_MIN(0)); | 201 | set_in(min0, in_min[0], LM80_REG_IN_MIN(0)); |
@@ -241,10 +242,10 @@ static ssize_t set_fan_##suffix(struct device *dev, struct device_attribute *att | |||
241 | struct lm80_data *data = i2c_get_clientdata(client); \ | 242 | struct lm80_data *data = i2c_get_clientdata(client); \ |
242 | long val = simple_strtoul(buf, NULL, 10); \ | 243 | long val = simple_strtoul(buf, NULL, 10); \ |
243 | \ | 244 | \ |
244 | down(&data->update_lock);\ | 245 | mutex_lock(&data->update_lock);\ |
245 | data->value = FAN_TO_REG(val, DIV_FROM_REG(data->div)); \ | 246 | data->value = FAN_TO_REG(val, DIV_FROM_REG(data->div)); \ |
246 | lm80_write_value(client, reg, data->value); \ | 247 | lm80_write_value(client, reg, data->value); \ |
247 | up(&data->update_lock);\ | 248 | mutex_unlock(&data->update_lock);\ |
248 | return count; \ | 249 | return count; \ |
249 | } | 250 | } |
250 | set_fan(min1, fan_min[0], LM80_REG_FAN_MIN(1), fan_div[0]); | 251 | set_fan(min1, fan_min[0], LM80_REG_FAN_MIN(1), fan_div[0]); |
@@ -263,7 +264,7 @@ static ssize_t set_fan_div(struct device *dev, const char *buf, | |||
263 | u8 reg; | 264 | u8 reg; |
264 | 265 | ||
265 | /* Save fan_min */ | 266 | /* Save fan_min */ |
266 | down(&data->update_lock); | 267 | mutex_lock(&data->update_lock); |
267 | min = FAN_FROM_REG(data->fan_min[nr], | 268 | min = FAN_FROM_REG(data->fan_min[nr], |
268 | DIV_FROM_REG(data->fan_div[nr])); | 269 | DIV_FROM_REG(data->fan_div[nr])); |
269 | 270 | ||
@@ -275,7 +276,7 @@ static ssize_t set_fan_div(struct device *dev, const char *buf, | |||
275 | default: | 276 | default: |
276 | dev_err(&client->dev, "fan_div value %ld not " | 277 | dev_err(&client->dev, "fan_div value %ld not " |
277 | "supported. Choose one of 1, 2, 4 or 8!\n", val); | 278 | "supported. Choose one of 1, 2, 4 or 8!\n", val); |
278 | up(&data->update_lock); | 279 | mutex_unlock(&data->update_lock); |
279 | return -EINVAL; | 280 | return -EINVAL; |
280 | } | 281 | } |
281 | 282 | ||
@@ -286,7 +287,7 @@ static ssize_t set_fan_div(struct device *dev, const char *buf, | |||
286 | /* Restore fan_min */ | 287 | /* Restore fan_min */ |
287 | data->fan_min[nr] = FAN_TO_REG(min, DIV_FROM_REG(data->fan_div[nr])); | 288 | data->fan_min[nr] = FAN_TO_REG(min, DIV_FROM_REG(data->fan_div[nr])); |
288 | lm80_write_value(client, LM80_REG_FAN_MIN(nr + 1), data->fan_min[nr]); | 289 | lm80_write_value(client, LM80_REG_FAN_MIN(nr + 1), data->fan_min[nr]); |
289 | up(&data->update_lock); | 290 | mutex_unlock(&data->update_lock); |
290 | 291 | ||
291 | return count; | 292 | return count; |
292 | } | 293 | } |
@@ -325,10 +326,10 @@ static ssize_t set_temp_##suffix(struct device *dev, struct device_attribute *at | |||
325 | struct lm80_data *data = i2c_get_clientdata(client); \ | 326 | struct lm80_data *data = i2c_get_clientdata(client); \ |
326 | long val = simple_strtoul(buf, NULL, 10); \ | 327 | long val = simple_strtoul(buf, NULL, 10); \ |
327 | \ | 328 | \ |
328 | down(&data->update_lock); \ | 329 | mutex_lock(&data->update_lock); \ |
329 | data->value = TEMP_LIMIT_TO_REG(val); \ | 330 | data->value = TEMP_LIMIT_TO_REG(val); \ |
330 | lm80_write_value(client, reg, data->value); \ | 331 | lm80_write_value(client, reg, data->value); \ |
331 | up(&data->update_lock); \ | 332 | mutex_unlock(&data->update_lock); \ |
332 | return count; \ | 333 | return count; \ |
333 | } | 334 | } |
334 | set_temp(hot_max, temp_hot_max, LM80_REG_TEMP_HOT_MAX); | 335 | set_temp(hot_max, temp_hot_max, LM80_REG_TEMP_HOT_MAX); |
@@ -437,7 +438,7 @@ static int lm80_detect(struct i2c_adapter *adapter, int address, int kind) | |||
437 | /* Fill in the remaining client fields and put it into the global list */ | 438 | /* Fill in the remaining client fields and put it into the global list */ |
438 | strlcpy(new_client->name, name, I2C_NAME_SIZE); | 439 | strlcpy(new_client->name, name, I2C_NAME_SIZE); |
439 | data->valid = 0; | 440 | data->valid = 0; |
440 | init_MUTEX(&data->update_lock); | 441 | mutex_init(&data->update_lock); |
441 | 442 | ||
442 | /* Tell the I2C layer a new client has arrived */ | 443 | /* Tell the I2C layer a new client has arrived */ |
443 | if ((err = i2c_attach_client(new_client))) | 444 | if ((err = i2c_attach_client(new_client))) |
@@ -545,7 +546,7 @@ static struct lm80_data *lm80_update_device(struct device *dev) | |||
545 | struct lm80_data *data = i2c_get_clientdata(client); | 546 | struct lm80_data *data = i2c_get_clientdata(client); |
546 | int i; | 547 | int i; |
547 | 548 | ||
548 | down(&data->update_lock); | 549 | mutex_lock(&data->update_lock); |
549 | 550 | ||
550 | if (time_after(jiffies, data->last_updated + 2 * HZ) || !data->valid) { | 551 | if (time_after(jiffies, data->last_updated + 2 * HZ) || !data->valid) { |
551 | dev_dbg(&client->dev, "Starting lm80 update\n"); | 552 | dev_dbg(&client->dev, "Starting lm80 update\n"); |
@@ -585,7 +586,7 @@ static struct lm80_data *lm80_update_device(struct device *dev) | |||
585 | data->valid = 1; | 586 | data->valid = 1; |
586 | } | 587 | } |
587 | 588 | ||
588 | up(&data->update_lock); | 589 | mutex_unlock(&data->update_lock); |
589 | 590 | ||
590 | return data; | 591 | return data; |
591 | } | 592 | } |