diff options
Diffstat (limited to 'drivers/hwmon/w83627hf.c')
-rw-r--r-- | drivers/hwmon/w83627hf.c | 57 |
1 files changed, 29 insertions, 28 deletions
diff --git a/drivers/hwmon/w83627hf.c b/drivers/hwmon/w83627hf.c index 7ea441d4da63..3d4888c178c9 100644 --- a/drivers/hwmon/w83627hf.c +++ b/drivers/hwmon/w83627hf.c | |||
@@ -46,6 +46,7 @@ | |||
46 | #include <linux/hwmon.h> | 46 | #include <linux/hwmon.h> |
47 | #include <linux/hwmon-vid.h> | 47 | #include <linux/hwmon-vid.h> |
48 | #include <linux/err.h> | 48 | #include <linux/err.h> |
49 | #include <linux/mutex.h> | ||
49 | #include <asm/io.h> | 50 | #include <asm/io.h> |
50 | #include "lm75.h" | 51 | #include "lm75.h" |
51 | 52 | ||
@@ -285,10 +286,10 @@ static inline u8 DIV_TO_REG(long val) | |||
285 | struct w83627hf_data { | 286 | struct w83627hf_data { |
286 | struct i2c_client client; | 287 | struct i2c_client client; |
287 | struct class_device *class_dev; | 288 | struct class_device *class_dev; |
288 | struct semaphore lock; | 289 | struct mutex lock; |
289 | enum chips type; | 290 | enum chips type; |
290 | 291 | ||
291 | struct semaphore update_lock; | 292 | struct mutex update_lock; |
292 | char valid; /* !=0 if following fields are valid */ | 293 | char valid; /* !=0 if following fields are valid */ |
293 | unsigned long last_updated; /* In jiffies */ | 294 | unsigned long last_updated; /* In jiffies */ |
294 | 295 | ||
@@ -360,12 +361,12 @@ store_in_##reg (struct device *dev, const char *buf, size_t count, int nr) \ | |||
360 | \ | 361 | \ |
361 | val = simple_strtoul(buf, NULL, 10); \ | 362 | val = simple_strtoul(buf, NULL, 10); \ |
362 | \ | 363 | \ |
363 | down(&data->update_lock); \ | 364 | mutex_lock(&data->update_lock); \ |
364 | data->in_##reg[nr] = IN_TO_REG(val); \ | 365 | data->in_##reg[nr] = IN_TO_REG(val); \ |
365 | w83627hf_write_value(client, W83781D_REG_IN_##REG(nr), \ | 366 | w83627hf_write_value(client, W83781D_REG_IN_##REG(nr), \ |
366 | data->in_##reg[nr]); \ | 367 | data->in_##reg[nr]); \ |
367 | \ | 368 | \ |
368 | up(&data->update_lock); \ | 369 | mutex_unlock(&data->update_lock); \ |
369 | return count; \ | 370 | return count; \ |
370 | } | 371 | } |
371 | store_in_reg(MIN, min) | 372 | store_in_reg(MIN, min) |
@@ -451,7 +452,7 @@ static ssize_t store_regs_in_min0(struct device *dev, struct device_attribute *a | |||
451 | 452 | ||
452 | val = simple_strtoul(buf, NULL, 10); | 453 | val = simple_strtoul(buf, NULL, 10); |
453 | 454 | ||
454 | down(&data->update_lock); | 455 | mutex_lock(&data->update_lock); |
455 | 456 | ||
456 | if ((data->vrm_ovt & 0x01) && | 457 | if ((data->vrm_ovt & 0x01) && |
457 | (w83627thf == data->type || w83637hf == data->type)) | 458 | (w83627thf == data->type || w83637hf == data->type)) |
@@ -465,7 +466,7 @@ static ssize_t store_regs_in_min0(struct device *dev, struct device_attribute *a | |||
465 | data->in_min[0] = IN_TO_REG(val); | 466 | data->in_min[0] = IN_TO_REG(val); |
466 | 467 | ||
467 | w83627hf_write_value(client, W83781D_REG_IN_MIN(0), data->in_min[0]); | 468 | w83627hf_write_value(client, W83781D_REG_IN_MIN(0), data->in_min[0]); |
468 | up(&data->update_lock); | 469 | mutex_unlock(&data->update_lock); |
469 | return count; | 470 | return count; |
470 | } | 471 | } |
471 | 472 | ||
@@ -478,7 +479,7 @@ static ssize_t store_regs_in_max0(struct device *dev, struct device_attribute *a | |||
478 | 479 | ||
479 | val = simple_strtoul(buf, NULL, 10); | 480 | val = simple_strtoul(buf, NULL, 10); |
480 | 481 | ||
481 | down(&data->update_lock); | 482 | mutex_lock(&data->update_lock); |
482 | 483 | ||
483 | if ((data->vrm_ovt & 0x01) && | 484 | if ((data->vrm_ovt & 0x01) && |
484 | (w83627thf == data->type || w83637hf == data->type)) | 485 | (w83627thf == data->type || w83637hf == data->type)) |
@@ -492,7 +493,7 @@ static ssize_t store_regs_in_max0(struct device *dev, struct device_attribute *a | |||
492 | data->in_max[0] = IN_TO_REG(val); | 493 | data->in_max[0] = IN_TO_REG(val); |
493 | 494 | ||
494 | w83627hf_write_value(client, W83781D_REG_IN_MAX(0), data->in_max[0]); | 495 | w83627hf_write_value(client, W83781D_REG_IN_MAX(0), data->in_max[0]); |
495 | up(&data->update_lock); | 496 | mutex_unlock(&data->update_lock); |
496 | return count; | 497 | return count; |
497 | } | 498 | } |
498 | 499 | ||
@@ -529,13 +530,13 @@ store_fan_min(struct device *dev, const char *buf, size_t count, int nr) | |||
529 | 530 | ||
530 | val = simple_strtoul(buf, NULL, 10); | 531 | val = simple_strtoul(buf, NULL, 10); |
531 | 532 | ||
532 | down(&data->update_lock); | 533 | mutex_lock(&data->update_lock); |
533 | data->fan_min[nr - 1] = | 534 | data->fan_min[nr - 1] = |
534 | FAN_TO_REG(val, DIV_FROM_REG(data->fan_div[nr - 1])); | 535 | FAN_TO_REG(val, DIV_FROM_REG(data->fan_div[nr - 1])); |
535 | w83627hf_write_value(client, W83781D_REG_FAN_MIN(nr), | 536 | w83627hf_write_value(client, W83781D_REG_FAN_MIN(nr), |
536 | data->fan_min[nr - 1]); | 537 | data->fan_min[nr - 1]); |
537 | 538 | ||
538 | up(&data->update_lock); | 539 | mutex_unlock(&data->update_lock); |
539 | return count; | 540 | return count; |
540 | } | 541 | } |
541 | 542 | ||
@@ -597,7 +598,7 @@ store_temp_##reg (struct device *dev, const char *buf, size_t count, int nr) \ | |||
597 | \ | 598 | \ |
598 | val = simple_strtoul(buf, NULL, 10); \ | 599 | val = simple_strtoul(buf, NULL, 10); \ |
599 | \ | 600 | \ |
600 | down(&data->update_lock); \ | 601 | mutex_lock(&data->update_lock); \ |
601 | \ | 602 | \ |
602 | if (nr >= 2) { /* TEMP2 and TEMP3 */ \ | 603 | if (nr >= 2) { /* TEMP2 and TEMP3 */ \ |
603 | data->temp_##reg##_add[nr-2] = LM75_TEMP_TO_REG(val); \ | 604 | data->temp_##reg##_add[nr-2] = LM75_TEMP_TO_REG(val); \ |
@@ -609,7 +610,7 @@ store_temp_##reg (struct device *dev, const char *buf, size_t count, int nr) \ | |||
609 | data->temp_##reg); \ | 610 | data->temp_##reg); \ |
610 | } \ | 611 | } \ |
611 | \ | 612 | \ |
612 | up(&data->update_lock); \ | 613 | mutex_unlock(&data->update_lock); \ |
613 | return count; \ | 614 | return count; \ |
614 | } | 615 | } |
615 | store_temp_reg(OVER, max); | 616 | store_temp_reg(OVER, max); |
@@ -718,7 +719,7 @@ store_beep_reg(struct device *dev, const char *buf, size_t count, | |||
718 | 719 | ||
719 | val = simple_strtoul(buf, NULL, 10); | 720 | val = simple_strtoul(buf, NULL, 10); |
720 | 721 | ||
721 | down(&data->update_lock); | 722 | mutex_lock(&data->update_lock); |
722 | 723 | ||
723 | if (update_mask == BEEP_MASK) { /* We are storing beep_mask */ | 724 | if (update_mask == BEEP_MASK) { /* We are storing beep_mask */ |
724 | data->beep_mask = BEEP_MASK_TO_REG(val); | 725 | data->beep_mask = BEEP_MASK_TO_REG(val); |
@@ -736,7 +737,7 @@ store_beep_reg(struct device *dev, const char *buf, size_t count, | |||
736 | w83627hf_write_value(client, W83781D_REG_BEEP_INTS2, | 737 | w83627hf_write_value(client, W83781D_REG_BEEP_INTS2, |
737 | val2 | data->beep_enable << 7); | 738 | val2 | data->beep_enable << 7); |
738 | 739 | ||
739 | up(&data->update_lock); | 740 | mutex_unlock(&data->update_lock); |
740 | return count; | 741 | return count; |
741 | } | 742 | } |
742 | 743 | ||
@@ -783,7 +784,7 @@ store_fan_div_reg(struct device *dev, const char *buf, size_t count, int nr) | |||
783 | u8 reg; | 784 | u8 reg; |
784 | unsigned long val = simple_strtoul(buf, NULL, 10); | 785 | unsigned long val = simple_strtoul(buf, NULL, 10); |
785 | 786 | ||
786 | down(&data->update_lock); | 787 | mutex_lock(&data->update_lock); |
787 | 788 | ||
788 | /* Save fan_min */ | 789 | /* Save fan_min */ |
789 | min = FAN_FROM_REG(data->fan_min[nr], | 790 | min = FAN_FROM_REG(data->fan_min[nr], |
@@ -805,7 +806,7 @@ store_fan_div_reg(struct device *dev, const char *buf, size_t count, int nr) | |||
805 | data->fan_min[nr] = FAN_TO_REG(min, DIV_FROM_REG(data->fan_div[nr])); | 806 | data->fan_min[nr] = FAN_TO_REG(min, DIV_FROM_REG(data->fan_div[nr])); |
806 | w83627hf_write_value(client, W83781D_REG_FAN_MIN(nr+1), data->fan_min[nr]); | 807 | w83627hf_write_value(client, W83781D_REG_FAN_MIN(nr+1), data->fan_min[nr]); |
807 | 808 | ||
808 | up(&data->update_lock); | 809 | mutex_unlock(&data->update_lock); |
809 | return count; | 810 | return count; |
810 | } | 811 | } |
811 | 812 | ||
@@ -848,7 +849,7 @@ store_pwm_reg(struct device *dev, const char *buf, size_t count, int nr) | |||
848 | 849 | ||
849 | val = simple_strtoul(buf, NULL, 10); | 850 | val = simple_strtoul(buf, NULL, 10); |
850 | 851 | ||
851 | down(&data->update_lock); | 852 | mutex_lock(&data->update_lock); |
852 | 853 | ||
853 | if (data->type == w83627thf) { | 854 | if (data->type == w83627thf) { |
854 | /* bits 0-3 are reserved in 627THF */ | 855 | /* bits 0-3 are reserved in 627THF */ |
@@ -865,7 +866,7 @@ store_pwm_reg(struct device *dev, const char *buf, size_t count, int nr) | |||
865 | data->pwm[nr - 1]); | 866 | data->pwm[nr - 1]); |
866 | } | 867 | } |
867 | 868 | ||
868 | up(&data->update_lock); | 869 | mutex_unlock(&data->update_lock); |
869 | return count; | 870 | return count; |
870 | } | 871 | } |
871 | 872 | ||
@@ -907,7 +908,7 @@ store_sensor_reg(struct device *dev, const char *buf, size_t count, int nr) | |||
907 | 908 | ||
908 | val = simple_strtoul(buf, NULL, 10); | 909 | val = simple_strtoul(buf, NULL, 10); |
909 | 910 | ||
910 | down(&data->update_lock); | 911 | mutex_lock(&data->update_lock); |
911 | 912 | ||
912 | switch (val) { | 913 | switch (val) { |
913 | case 1: /* PII/Celeron diode */ | 914 | case 1: /* PII/Celeron diode */ |
@@ -941,7 +942,7 @@ store_sensor_reg(struct device *dev, const char *buf, size_t count, int nr) | |||
941 | break; | 942 | break; |
942 | } | 943 | } |
943 | 944 | ||
944 | up(&data->update_lock); | 945 | mutex_unlock(&data->update_lock); |
945 | return count; | 946 | return count; |
946 | } | 947 | } |
947 | 948 | ||
@@ -1057,7 +1058,7 @@ static int w83627hf_detect(struct i2c_adapter *adapter) | |||
1057 | new_client = &data->client; | 1058 | new_client = &data->client; |
1058 | i2c_set_clientdata(new_client, data); | 1059 | i2c_set_clientdata(new_client, data); |
1059 | new_client->addr = address; | 1060 | new_client->addr = address; |
1060 | init_MUTEX(&data->lock); | 1061 | mutex_init(&data->lock); |
1061 | new_client->adapter = adapter; | 1062 | new_client->adapter = adapter; |
1062 | new_client->driver = &w83627hf_driver; | 1063 | new_client->driver = &w83627hf_driver; |
1063 | new_client->flags = 0; | 1064 | new_client->flags = 0; |
@@ -1077,7 +1078,7 @@ static int w83627hf_detect(struct i2c_adapter *adapter) | |||
1077 | strlcpy(new_client->name, client_name, I2C_NAME_SIZE); | 1078 | strlcpy(new_client->name, client_name, I2C_NAME_SIZE); |
1078 | data->type = kind; | 1079 | data->type = kind; |
1079 | data->valid = 0; | 1080 | data->valid = 0; |
1080 | init_MUTEX(&data->update_lock); | 1081 | mutex_init(&data->update_lock); |
1081 | 1082 | ||
1082 | /* Tell the I2C layer a new client has arrived */ | 1083 | /* Tell the I2C layer a new client has arrived */ |
1083 | if ((err = i2c_attach_client(new_client))) | 1084 | if ((err = i2c_attach_client(new_client))) |
@@ -1187,7 +1188,7 @@ static int w83627hf_read_value(struct i2c_client *client, u16 reg) | |||
1187 | struct w83627hf_data *data = i2c_get_clientdata(client); | 1188 | struct w83627hf_data *data = i2c_get_clientdata(client); |
1188 | int res, word_sized; | 1189 | int res, word_sized; |
1189 | 1190 | ||
1190 | down(&data->lock); | 1191 | mutex_lock(&data->lock); |
1191 | word_sized = (((reg & 0xff00) == 0x100) | 1192 | word_sized = (((reg & 0xff00) == 0x100) |
1192 | || ((reg & 0xff00) == 0x200)) | 1193 | || ((reg & 0xff00) == 0x200)) |
1193 | && (((reg & 0x00ff) == 0x50) | 1194 | && (((reg & 0x00ff) == 0x50) |
@@ -1213,7 +1214,7 @@ static int w83627hf_read_value(struct i2c_client *client, u16 reg) | |||
1213 | client->addr + W83781D_ADDR_REG_OFFSET); | 1214 | client->addr + W83781D_ADDR_REG_OFFSET); |
1214 | outb_p(0, client->addr + W83781D_DATA_REG_OFFSET); | 1215 | outb_p(0, client->addr + W83781D_DATA_REG_OFFSET); |
1215 | } | 1216 | } |
1216 | up(&data->lock); | 1217 | mutex_unlock(&data->lock); |
1217 | return res; | 1218 | return res; |
1218 | } | 1219 | } |
1219 | 1220 | ||
@@ -1252,7 +1253,7 @@ static int w83627hf_write_value(struct i2c_client *client, u16 reg, u16 value) | |||
1252 | struct w83627hf_data *data = i2c_get_clientdata(client); | 1253 | struct w83627hf_data *data = i2c_get_clientdata(client); |
1253 | int word_sized; | 1254 | int word_sized; |
1254 | 1255 | ||
1255 | down(&data->lock); | 1256 | mutex_lock(&data->lock); |
1256 | word_sized = (((reg & 0xff00) == 0x100) | 1257 | word_sized = (((reg & 0xff00) == 0x100) |
1257 | || ((reg & 0xff00) == 0x200)) | 1258 | || ((reg & 0xff00) == 0x200)) |
1258 | && (((reg & 0x00ff) == 0x53) | 1259 | && (((reg & 0x00ff) == 0x53) |
@@ -1277,7 +1278,7 @@ static int w83627hf_write_value(struct i2c_client *client, u16 reg, u16 value) | |||
1277 | client->addr + W83781D_ADDR_REG_OFFSET); | 1278 | client->addr + W83781D_ADDR_REG_OFFSET); |
1278 | outb_p(0, client->addr + W83781D_DATA_REG_OFFSET); | 1279 | outb_p(0, client->addr + W83781D_DATA_REG_OFFSET); |
1279 | } | 1280 | } |
1280 | up(&data->lock); | 1281 | mutex_unlock(&data->lock); |
1281 | return 0; | 1282 | return 0; |
1282 | } | 1283 | } |
1283 | 1284 | ||
@@ -1387,7 +1388,7 @@ static struct w83627hf_data *w83627hf_update_device(struct device *dev) | |||
1387 | struct w83627hf_data *data = i2c_get_clientdata(client); | 1388 | struct w83627hf_data *data = i2c_get_clientdata(client); |
1388 | int i; | 1389 | int i; |
1389 | 1390 | ||
1390 | down(&data->update_lock); | 1391 | mutex_lock(&data->update_lock); |
1391 | 1392 | ||
1392 | if (time_after(jiffies, data->last_updated + HZ + HZ / 2) | 1393 | if (time_after(jiffies, data->last_updated + HZ + HZ / 2) |
1393 | || !data->valid) { | 1394 | || !data->valid) { |
@@ -1470,7 +1471,7 @@ static struct w83627hf_data *w83627hf_update_device(struct device *dev) | |||
1470 | data->valid = 1; | 1471 | data->valid = 1; |
1471 | } | 1472 | } |
1472 | 1473 | ||
1473 | up(&data->update_lock); | 1474 | mutex_unlock(&data->update_lock); |
1474 | 1475 | ||
1475 | return data; | 1476 | return data; |
1476 | } | 1477 | } |