diff options
Diffstat (limited to 'drivers/hwmon/adm1031.c')
-rw-r--r-- | drivers/hwmon/adm1031.c | 49 |
1 files changed, 25 insertions, 24 deletions
diff --git a/drivers/hwmon/adm1031.c b/drivers/hwmon/adm1031.c index d06397966081..3bf2da621aed 100644 --- a/drivers/hwmon/adm1031.c +++ b/drivers/hwmon/adm1031.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 | /* Following macros takes channel parameter starting from 0 to 2 */ | 33 | /* Following macros takes channel parameter starting from 0 to 2 */ |
33 | #define ADM1031_REG_FAN_SPEED(nr) (0x08 + (nr)) | 34 | #define ADM1031_REG_FAN_SPEED(nr) (0x08 + (nr)) |
@@ -70,7 +71,7 @@ typedef u8 auto_chan_table_t[8][2]; | |||
70 | struct adm1031_data { | 71 | struct adm1031_data { |
71 | struct i2c_client client; | 72 | struct i2c_client client; |
72 | struct class_device *class_dev; | 73 | struct class_device *class_dev; |
73 | struct semaphore update_lock; | 74 | struct mutex update_lock; |
74 | int chip_type; | 75 | int chip_type; |
75 | char valid; /* !=0 if following fields are valid */ | 76 | char valid; /* !=0 if following fields are valid */ |
76 | unsigned long last_updated; /* In jiffies */ | 77 | unsigned long last_updated; /* In jiffies */ |
@@ -262,10 +263,10 @@ set_fan_auto_channel(struct device *dev, const char *buf, size_t count, int nr) | |||
262 | 263 | ||
263 | old_fan_mode = data->conf1; | 264 | old_fan_mode = data->conf1; |
264 | 265 | ||
265 | down(&data->update_lock); | 266 | mutex_lock(&data->update_lock); |
266 | 267 | ||
267 | if ((ret = get_fan_auto_nearest(data, nr, val, data->conf1, ®))) { | 268 | if ((ret = get_fan_auto_nearest(data, nr, val, data->conf1, ®))) { |
268 | up(&data->update_lock); | 269 | mutex_unlock(&data->update_lock); |
269 | return ret; | 270 | return ret; |
270 | } | 271 | } |
271 | if (((data->conf1 = FAN_CHAN_TO_REG(reg, data->conf1)) & ADM1031_CONF1_AUTO_MODE) ^ | 272 | if (((data->conf1 = FAN_CHAN_TO_REG(reg, data->conf1)) & ADM1031_CONF1_AUTO_MODE) ^ |
@@ -288,7 +289,7 @@ set_fan_auto_channel(struct device *dev, const char *buf, size_t count, int nr) | |||
288 | } | 289 | } |
289 | data->conf1 = FAN_CHAN_TO_REG(reg, data->conf1); | 290 | data->conf1 = FAN_CHAN_TO_REG(reg, data->conf1); |
290 | adm1031_write_value(client, ADM1031_REG_CONF1, data->conf1); | 291 | adm1031_write_value(client, ADM1031_REG_CONF1, data->conf1); |
291 | up(&data->update_lock); | 292 | mutex_unlock(&data->update_lock); |
292 | return count; | 293 | return count; |
293 | } | 294 | } |
294 | 295 | ||
@@ -329,11 +330,11 @@ set_auto_temp_min(struct device *dev, const char *buf, size_t count, int nr) | |||
329 | struct adm1031_data *data = i2c_get_clientdata(client); | 330 | struct adm1031_data *data = i2c_get_clientdata(client); |
330 | int val = simple_strtol(buf, NULL, 10); | 331 | int val = simple_strtol(buf, NULL, 10); |
331 | 332 | ||
332 | down(&data->update_lock); | 333 | mutex_lock(&data->update_lock); |
333 | data->auto_temp[nr] = AUTO_TEMP_MIN_TO_REG(val, data->auto_temp[nr]); | 334 | data->auto_temp[nr] = AUTO_TEMP_MIN_TO_REG(val, data->auto_temp[nr]); |
334 | adm1031_write_value(client, ADM1031_REG_AUTO_TEMP(nr), | 335 | adm1031_write_value(client, ADM1031_REG_AUTO_TEMP(nr), |
335 | data->auto_temp[nr]); | 336 | data->auto_temp[nr]); |
336 | up(&data->update_lock); | 337 | mutex_unlock(&data->update_lock); |
337 | return count; | 338 | return count; |
338 | } | 339 | } |
339 | static ssize_t show_auto_temp_max(struct device *dev, char *buf, int nr) | 340 | static ssize_t show_auto_temp_max(struct device *dev, char *buf, int nr) |
@@ -349,11 +350,11 @@ set_auto_temp_max(struct device *dev, const char *buf, size_t count, int nr) | |||
349 | struct adm1031_data *data = i2c_get_clientdata(client); | 350 | struct adm1031_data *data = i2c_get_clientdata(client); |
350 | int val = simple_strtol(buf, NULL, 10); | 351 | int val = simple_strtol(buf, NULL, 10); |
351 | 352 | ||
352 | down(&data->update_lock); | 353 | mutex_lock(&data->update_lock); |
353 | data->temp_max[nr] = AUTO_TEMP_MAX_TO_REG(val, data->auto_temp[nr], data->pwm[nr]); | 354 | data->temp_max[nr] = AUTO_TEMP_MAX_TO_REG(val, data->auto_temp[nr], data->pwm[nr]); |
354 | adm1031_write_value(client, ADM1031_REG_AUTO_TEMP(nr), | 355 | adm1031_write_value(client, ADM1031_REG_AUTO_TEMP(nr), |
355 | data->temp_max[nr]); | 356 | data->temp_max[nr]); |
356 | up(&data->update_lock); | 357 | mutex_unlock(&data->update_lock); |
357 | return count; | 358 | return count; |
358 | } | 359 | } |
359 | 360 | ||
@@ -405,11 +406,11 @@ set_pwm(struct device *dev, const char *buf, size_t count, int nr) | |||
405 | int val = simple_strtol(buf, NULL, 10); | 406 | int val = simple_strtol(buf, NULL, 10); |
406 | int reg; | 407 | int reg; |
407 | 408 | ||
408 | down(&data->update_lock); | 409 | mutex_lock(&data->update_lock); |
409 | if ((data->conf1 & ADM1031_CONF1_AUTO_MODE) && | 410 | if ((data->conf1 & ADM1031_CONF1_AUTO_MODE) && |
410 | (((val>>4) & 0xf) != 5)) { | 411 | (((val>>4) & 0xf) != 5)) { |
411 | /* In automatic mode, the only PWM accepted is 33% */ | 412 | /* In automatic mode, the only PWM accepted is 33% */ |
412 | up(&data->update_lock); | 413 | mutex_unlock(&data->update_lock); |
413 | return -EINVAL; | 414 | return -EINVAL; |
414 | } | 415 | } |
415 | data->pwm[nr] = PWM_TO_REG(val); | 416 | data->pwm[nr] = PWM_TO_REG(val); |
@@ -417,7 +418,7 @@ set_pwm(struct device *dev, const char *buf, size_t count, int nr) | |||
417 | adm1031_write_value(client, ADM1031_REG_PWM, | 418 | adm1031_write_value(client, ADM1031_REG_PWM, |
418 | nr ? ((data->pwm[nr] << 4) & 0xf0) | (reg & 0xf) | 419 | nr ? ((data->pwm[nr] << 4) & 0xf0) | (reg & 0xf) |
419 | : (data->pwm[nr] & 0xf) | (reg & 0xf0)); | 420 | : (data->pwm[nr] & 0xf) | (reg & 0xf0)); |
420 | up(&data->update_lock); | 421 | mutex_unlock(&data->update_lock); |
421 | return count; | 422 | return count; |
422 | } | 423 | } |
423 | 424 | ||
@@ -511,7 +512,7 @@ set_fan_min(struct device *dev, const char *buf, size_t count, int nr) | |||
511 | struct adm1031_data *data = i2c_get_clientdata(client); | 512 | struct adm1031_data *data = i2c_get_clientdata(client); |
512 | int val = simple_strtol(buf, NULL, 10); | 513 | int val = simple_strtol(buf, NULL, 10); |
513 | 514 | ||
514 | down(&data->update_lock); | 515 | mutex_lock(&data->update_lock); |
515 | if (val) { | 516 | if (val) { |
516 | data->fan_min[nr] = | 517 | data->fan_min[nr] = |
517 | FAN_TO_REG(val, FAN_DIV_FROM_REG(data->fan_div[nr])); | 518 | FAN_TO_REG(val, FAN_DIV_FROM_REG(data->fan_div[nr])); |
@@ -519,7 +520,7 @@ set_fan_min(struct device *dev, const char *buf, size_t count, int nr) | |||
519 | data->fan_min[nr] = 0xff; | 520 | data->fan_min[nr] = 0xff; |
520 | } | 521 | } |
521 | adm1031_write_value(client, ADM1031_REG_FAN_MIN(nr), data->fan_min[nr]); | 522 | adm1031_write_value(client, ADM1031_REG_FAN_MIN(nr), data->fan_min[nr]); |
522 | up(&data->update_lock); | 523 | mutex_unlock(&data->update_lock); |
523 | return count; | 524 | return count; |
524 | } | 525 | } |
525 | static ssize_t | 526 | static ssize_t |
@@ -540,7 +541,7 @@ set_fan_div(struct device *dev, const char *buf, size_t count, int nr) | |||
540 | if (tmp == 0xff) | 541 | if (tmp == 0xff) |
541 | return -EINVAL; | 542 | return -EINVAL; |
542 | 543 | ||
543 | down(&data->update_lock); | 544 | mutex_lock(&data->update_lock); |
544 | old_div = FAN_DIV_FROM_REG(data->fan_div[nr]); | 545 | old_div = FAN_DIV_FROM_REG(data->fan_div[nr]); |
545 | data->fan_div[nr] = (tmp & 0xC0) | (0x3f & data->fan_div[nr]); | 546 | data->fan_div[nr] = (tmp & 0xC0) | (0x3f & data->fan_div[nr]); |
546 | new_min = data->fan_min[nr] * old_div / | 547 | new_min = data->fan_min[nr] * old_div / |
@@ -553,7 +554,7 @@ set_fan_div(struct device *dev, const char *buf, size_t count, int nr) | |||
553 | data->fan_div[nr]); | 554 | data->fan_div[nr]); |
554 | adm1031_write_value(client, ADM1031_REG_FAN_MIN(nr), | 555 | adm1031_write_value(client, ADM1031_REG_FAN_MIN(nr), |
555 | data->fan_min[nr]); | 556 | data->fan_min[nr]); |
556 | up(&data->update_lock); | 557 | mutex_unlock(&data->update_lock); |
557 | return count; | 558 | return count; |
558 | } | 559 | } |
559 | 560 | ||
@@ -627,11 +628,11 @@ set_temp_min(struct device *dev, const char *buf, size_t count, int nr) | |||
627 | 628 | ||
628 | val = simple_strtol(buf, NULL, 10); | 629 | val = simple_strtol(buf, NULL, 10); |
629 | val = SENSORS_LIMIT(val, -55000, nr == 0 ? 127750 : 127875); | 630 | val = SENSORS_LIMIT(val, -55000, nr == 0 ? 127750 : 127875); |
630 | down(&data->update_lock); | 631 | mutex_lock(&data->update_lock); |
631 | data->temp_min[nr] = TEMP_TO_REG(val); | 632 | data->temp_min[nr] = TEMP_TO_REG(val); |
632 | adm1031_write_value(client, ADM1031_REG_TEMP_MIN(nr), | 633 | adm1031_write_value(client, ADM1031_REG_TEMP_MIN(nr), |
633 | data->temp_min[nr]); | 634 | data->temp_min[nr]); |
634 | up(&data->update_lock); | 635 | mutex_unlock(&data->update_lock); |
635 | return count; | 636 | return count; |
636 | } | 637 | } |
637 | static ssize_t | 638 | static ssize_t |
@@ -643,11 +644,11 @@ set_temp_max(struct device *dev, const char *buf, size_t count, int nr) | |||
643 | 644 | ||
644 | val = simple_strtol(buf, NULL, 10); | 645 | val = simple_strtol(buf, NULL, 10); |
645 | val = SENSORS_LIMIT(val, -55000, nr == 0 ? 127750 : 127875); | 646 | val = SENSORS_LIMIT(val, -55000, nr == 0 ? 127750 : 127875); |
646 | down(&data->update_lock); | 647 | mutex_lock(&data->update_lock); |
647 | data->temp_max[nr] = TEMP_TO_REG(val); | 648 | data->temp_max[nr] = TEMP_TO_REG(val); |
648 | adm1031_write_value(client, ADM1031_REG_TEMP_MAX(nr), | 649 | adm1031_write_value(client, ADM1031_REG_TEMP_MAX(nr), |
649 | data->temp_max[nr]); | 650 | data->temp_max[nr]); |
650 | up(&data->update_lock); | 651 | mutex_unlock(&data->update_lock); |
651 | return count; | 652 | return count; |
652 | } | 653 | } |
653 | static ssize_t | 654 | static ssize_t |
@@ -659,11 +660,11 @@ set_temp_crit(struct device *dev, const char *buf, size_t count, int nr) | |||
659 | 660 | ||
660 | val = simple_strtol(buf, NULL, 10); | 661 | val = simple_strtol(buf, NULL, 10); |
661 | val = SENSORS_LIMIT(val, -55000, nr == 0 ? 127750 : 127875); | 662 | val = SENSORS_LIMIT(val, -55000, nr == 0 ? 127750 : 127875); |
662 | down(&data->update_lock); | 663 | mutex_lock(&data->update_lock); |
663 | data->temp_crit[nr] = TEMP_TO_REG(val); | 664 | data->temp_crit[nr] = TEMP_TO_REG(val); |
664 | adm1031_write_value(client, ADM1031_REG_TEMP_CRIT(nr), | 665 | adm1031_write_value(client, ADM1031_REG_TEMP_CRIT(nr), |
665 | data->temp_crit[nr]); | 666 | data->temp_crit[nr]); |
666 | up(&data->update_lock); | 667 | mutex_unlock(&data->update_lock); |
667 | return count; | 668 | return count; |
668 | } | 669 | } |
669 | 670 | ||
@@ -778,7 +779,7 @@ static int adm1031_detect(struct i2c_adapter *adapter, int address, int kind) | |||
778 | 779 | ||
779 | strlcpy(new_client->name, name, I2C_NAME_SIZE); | 780 | strlcpy(new_client->name, name, I2C_NAME_SIZE); |
780 | data->valid = 0; | 781 | data->valid = 0; |
781 | init_MUTEX(&data->update_lock); | 782 | mutex_init(&data->update_lock); |
782 | 783 | ||
783 | /* Tell the I2C layer a new client has arrived */ | 784 | /* Tell the I2C layer a new client has arrived */ |
784 | if ((err = i2c_attach_client(new_client))) | 785 | if ((err = i2c_attach_client(new_client))) |
@@ -891,7 +892,7 @@ static struct adm1031_data *adm1031_update_device(struct device *dev) | |||
891 | struct adm1031_data *data = i2c_get_clientdata(client); | 892 | struct adm1031_data *data = i2c_get_clientdata(client); |
892 | int chan; | 893 | int chan; |
893 | 894 | ||
894 | down(&data->update_lock); | 895 | mutex_lock(&data->update_lock); |
895 | 896 | ||
896 | if (time_after(jiffies, data->last_updated + HZ + HZ / 2) | 897 | if (time_after(jiffies, data->last_updated + HZ + HZ / 2) |
897 | || !data->valid) { | 898 | || !data->valid) { |
@@ -965,7 +966,7 @@ static struct adm1031_data *adm1031_update_device(struct device *dev) | |||
965 | data->valid = 1; | 966 | data->valid = 1; |
966 | } | 967 | } |
967 | 968 | ||
968 | up(&data->update_lock); | 969 | mutex_unlock(&data->update_lock); |
969 | 970 | ||
970 | return data; | 971 | return data; |
971 | } | 972 | } |