diff options
Diffstat (limited to 'drivers/hwmon/w83627hf.c')
-rw-r--r-- | drivers/hwmon/w83627hf.c | 701 |
1 files changed, 342 insertions, 359 deletions
diff --git a/drivers/hwmon/w83627hf.c b/drivers/hwmon/w83627hf.c index a2ccf93521c1..996fc1ca3227 100644 --- a/drivers/hwmon/w83627hf.c +++ b/drivers/hwmon/w83627hf.c | |||
@@ -45,6 +45,7 @@ | |||
45 | #include <linux/jiffies.h> | 45 | #include <linux/jiffies.h> |
46 | #include <linux/platform_device.h> | 46 | #include <linux/platform_device.h> |
47 | #include <linux/hwmon.h> | 47 | #include <linux/hwmon.h> |
48 | #include <linux/hwmon-sysfs.h> | ||
48 | #include <linux/hwmon-vid.h> | 49 | #include <linux/hwmon-vid.h> |
49 | #include <linux/err.h> | 50 | #include <linux/err.h> |
50 | #include <linux/mutex.h> | 51 | #include <linux/mutex.h> |
@@ -218,7 +219,7 @@ static const u8 regpwm_627hf[] = { W83627HF_REG_PWM1, W83627HF_REG_PWM2 }; | |||
218 | static const u8 regpwm[] = { W83627THF_REG_PWM1, W83627THF_REG_PWM2, | 219 | static const u8 regpwm[] = { W83627THF_REG_PWM1, W83627THF_REG_PWM2, |
219 | W83627THF_REG_PWM3 }; | 220 | W83627THF_REG_PWM3 }; |
220 | #define W836X7HF_REG_PWM(type, nr) (((type) == w83627hf) ? \ | 221 | #define W836X7HF_REG_PWM(type, nr) (((type) == w83627hf) ? \ |
221 | regpwm_627hf[(nr) - 1] : regpwm[(nr) - 1]) | 222 | regpwm_627hf[nr] : regpwm[nr]) |
222 | 223 | ||
223 | #define W83627HF_REG_PWM_FREQ 0x5C /* Only for the 627HF */ | 224 | #define W83627HF_REG_PWM_FREQ 0x5C /* Only for the 627HF */ |
224 | 225 | ||
@@ -400,72 +401,71 @@ static struct platform_driver w83627hf_driver = { | |||
400 | .remove = __devexit_p(w83627hf_remove), | 401 | .remove = __devexit_p(w83627hf_remove), |
401 | }; | 402 | }; |
402 | 403 | ||
403 | /* following are the sysfs callback functions */ | 404 | static ssize_t |
404 | #define show_in_reg(reg) \ | 405 | show_in_input(struct device *dev, struct device_attribute *devattr, char *buf) |
405 | static ssize_t show_##reg (struct device *dev, char *buf, int nr) \ | 406 | { |
406 | { \ | 407 | int nr = to_sensor_dev_attr(devattr)->index; |
407 | struct w83627hf_data *data = w83627hf_update_device(dev); \ | 408 | struct w83627hf_data *data = w83627hf_update_device(dev); |
408 | return sprintf(buf,"%ld\n", (long)IN_FROM_REG(data->reg[nr])); \ | 409 | return sprintf(buf, "%ld\n", (long)IN_FROM_REG(data->in[nr])); |
409 | } | 410 | } |
410 | show_in_reg(in) | 411 | static ssize_t |
411 | show_in_reg(in_min) | 412 | show_in_min(struct device *dev, struct device_attribute *devattr, char *buf) |
412 | show_in_reg(in_max) | 413 | { |
413 | 414 | int nr = to_sensor_dev_attr(devattr)->index; | |
414 | #define store_in_reg(REG, reg) \ | 415 | struct w83627hf_data *data = w83627hf_update_device(dev); |
415 | static ssize_t \ | 416 | return sprintf(buf, "%ld\n", (long)IN_FROM_REG(data->in_min[nr])); |
416 | store_in_##reg (struct device *dev, const char *buf, size_t count, int nr) \ | 417 | } |
417 | { \ | 418 | static ssize_t |
418 | struct w83627hf_data *data = dev_get_drvdata(dev); \ | 419 | show_in_max(struct device *dev, struct device_attribute *devattr, char *buf) |
419 | u32 val; \ | 420 | { |
420 | \ | 421 | int nr = to_sensor_dev_attr(devattr)->index; |
421 | val = simple_strtoul(buf, NULL, 10); \ | 422 | struct w83627hf_data *data = w83627hf_update_device(dev); |
422 | \ | 423 | return sprintf(buf, "%ld\n", (long)IN_FROM_REG(data->in_max[nr])); |
423 | mutex_lock(&data->update_lock); \ | ||
424 | data->in_##reg[nr] = IN_TO_REG(val); \ | ||
425 | w83627hf_write_value(data, W83781D_REG_IN_##REG(nr), \ | ||
426 | data->in_##reg[nr]); \ | ||
427 | \ | ||
428 | mutex_unlock(&data->update_lock); \ | ||
429 | return count; \ | ||
430 | } | 424 | } |
431 | store_in_reg(MIN, min) | 425 | static ssize_t |
432 | store_in_reg(MAX, max) | 426 | store_in_min(struct device *dev, struct device_attribute *devattr, |
427 | const char *buf, size_t count) | ||
428 | { | ||
429 | int nr = to_sensor_dev_attr(devattr)->index; | ||
430 | struct w83627hf_data *data = dev_get_drvdata(dev); | ||
431 | long val = simple_strtol(buf, NULL, 10); | ||
433 | 432 | ||
434 | #define sysfs_in_offset(offset) \ | 433 | mutex_lock(&data->update_lock); |
435 | static ssize_t \ | 434 | data->in_min[nr] = IN_TO_REG(val); |
436 | show_regs_in_##offset (struct device *dev, struct device_attribute *attr, char *buf) \ | 435 | w83627hf_write_value(data, W83781D_REG_IN_MIN(nr), data->in_min[nr]); |
437 | { \ | 436 | mutex_unlock(&data->update_lock); |
438 | return show_in(dev, buf, offset); \ | 437 | return count; |
439 | } \ | 438 | } |
440 | static DEVICE_ATTR(in##offset##_input, S_IRUGO, show_regs_in_##offset, NULL); | 439 | static ssize_t |
440 | store_in_max(struct device *dev, struct device_attribute *devattr, | ||
441 | const char *buf, size_t count) | ||
442 | { | ||
443 | int nr = to_sensor_dev_attr(devattr)->index; | ||
444 | struct w83627hf_data *data = dev_get_drvdata(dev); | ||
445 | long val = simple_strtol(buf, NULL, 10); | ||
441 | 446 | ||
442 | #define sysfs_in_reg_offset(reg, offset) \ | 447 | mutex_lock(&data->update_lock); |
443 | static ssize_t show_regs_in_##reg##offset (struct device *dev, struct device_attribute *attr, char *buf) \ | 448 | data->in_max[nr] = IN_TO_REG(val); |
444 | { \ | 449 | w83627hf_write_value(data, W83781D_REG_IN_MAX(nr), data->in_max[nr]); |
445 | return show_in_##reg (dev, buf, offset); \ | 450 | mutex_unlock(&data->update_lock); |
446 | } \ | 451 | return count; |
447 | static ssize_t \ | 452 | } |
448 | store_regs_in_##reg##offset (struct device *dev, struct device_attribute *attr, \ | 453 | #define sysfs_vin_decl(offset) \ |
449 | const char *buf, size_t count) \ | 454 | static SENSOR_DEVICE_ATTR(in##offset##_input, S_IRUGO, \ |
450 | { \ | 455 | show_in_input, NULL, offset); \ |
451 | return store_in_##reg (dev, buf, count, offset); \ | 456 | static SENSOR_DEVICE_ATTR(in##offset##_min, S_IRUGO|S_IWUSR, \ |
452 | } \ | 457 | show_in_min, store_in_min, offset); \ |
453 | static DEVICE_ATTR(in##offset##_##reg, S_IRUGO| S_IWUSR, \ | 458 | static SENSOR_DEVICE_ATTR(in##offset##_max, S_IRUGO|S_IWUSR, \ |
454 | show_regs_in_##reg##offset, store_regs_in_##reg##offset); | 459 | show_in_max, store_in_max, offset); |
455 | 460 | ||
456 | #define sysfs_in_offsets(offset) \ | 461 | sysfs_vin_decl(1); |
457 | sysfs_in_offset(offset) \ | 462 | sysfs_vin_decl(2); |
458 | sysfs_in_reg_offset(min, offset) \ | 463 | sysfs_vin_decl(3); |
459 | sysfs_in_reg_offset(max, offset) | 464 | sysfs_vin_decl(4); |
460 | 465 | sysfs_vin_decl(5); | |
461 | sysfs_in_offsets(1); | 466 | sysfs_vin_decl(6); |
462 | sysfs_in_offsets(2); | 467 | sysfs_vin_decl(7); |
463 | sysfs_in_offsets(3); | 468 | sysfs_vin_decl(8); |
464 | sysfs_in_offsets(4); | ||
465 | sysfs_in_offsets(5); | ||
466 | sysfs_in_offsets(6); | ||
467 | sysfs_in_offsets(7); | ||
468 | sysfs_in_offsets(8); | ||
469 | 469 | ||
470 | /* use a different set of functions for in0 */ | 470 | /* use a different set of functions for in0 */ |
471 | static ssize_t show_in_0(struct w83627hf_data *data, char *buf, u8 reg) | 471 | static ssize_t show_in_0(struct w83627hf_data *data, char *buf, u8 reg) |
@@ -563,134 +563,148 @@ static DEVICE_ATTR(in0_min, S_IRUGO | S_IWUSR, | |||
563 | static DEVICE_ATTR(in0_max, S_IRUGO | S_IWUSR, | 563 | static DEVICE_ATTR(in0_max, S_IRUGO | S_IWUSR, |
564 | show_regs_in_max0, store_regs_in_max0); | 564 | show_regs_in_max0, store_regs_in_max0); |
565 | 565 | ||
566 | #define show_fan_reg(reg) \ | 566 | static ssize_t |
567 | static ssize_t show_##reg (struct device *dev, char *buf, int nr) \ | 567 | show_fan_input(struct device *dev, struct device_attribute *devattr, char *buf) |
568 | { \ | 568 | { |
569 | struct w83627hf_data *data = w83627hf_update_device(dev); \ | 569 | int nr = to_sensor_dev_attr(devattr)->index; |
570 | return sprintf(buf,"%ld\n", \ | 570 | struct w83627hf_data *data = w83627hf_update_device(dev); |
571 | FAN_FROM_REG(data->reg[nr-1], \ | 571 | return sprintf(buf, "%ld\n", FAN_FROM_REG(data->fan[nr], |
572 | (long)DIV_FROM_REG(data->fan_div[nr-1]))); \ | 572 | (long)DIV_FROM_REG(data->fan_div[nr]))); |
573 | } | ||
574 | static ssize_t | ||
575 | show_fan_min(struct device *dev, struct device_attribute *devattr, char *buf) | ||
576 | { | ||
577 | int nr = to_sensor_dev_attr(devattr)->index; | ||
578 | struct w83627hf_data *data = w83627hf_update_device(dev); | ||
579 | return sprintf(buf, "%ld\n", FAN_FROM_REG(data->fan_min[nr], | ||
580 | (long)DIV_FROM_REG(data->fan_div[nr]))); | ||
573 | } | 581 | } |
574 | show_fan_reg(fan); | ||
575 | show_fan_reg(fan_min); | ||
576 | |||
577 | static ssize_t | 582 | static ssize_t |
578 | store_fan_min(struct device *dev, const char *buf, size_t count, int nr) | 583 | store_fan_min(struct device *dev, struct device_attribute *devattr, |
584 | const char *buf, size_t count) | ||
579 | { | 585 | { |
586 | int nr = to_sensor_dev_attr(devattr)->index; | ||
580 | struct w83627hf_data *data = dev_get_drvdata(dev); | 587 | struct w83627hf_data *data = dev_get_drvdata(dev); |
581 | u32 val; | 588 | u32 val = simple_strtoul(buf, NULL, 10); |
582 | |||
583 | val = simple_strtoul(buf, NULL, 10); | ||
584 | 589 | ||
585 | mutex_lock(&data->update_lock); | 590 | mutex_lock(&data->update_lock); |
586 | data->fan_min[nr - 1] = | 591 | data->fan_min[nr] = FAN_TO_REG(val, DIV_FROM_REG(data->fan_div[nr])); |
587 | FAN_TO_REG(val, DIV_FROM_REG(data->fan_div[nr - 1])); | 592 | w83627hf_write_value(data, W83781D_REG_FAN_MIN(nr+1), |
588 | w83627hf_write_value(data, W83781D_REG_FAN_MIN(nr), | 593 | data->fan_min[nr]); |
589 | data->fan_min[nr - 1]); | ||
590 | 594 | ||
591 | mutex_unlock(&data->update_lock); | 595 | mutex_unlock(&data->update_lock); |
592 | return count; | 596 | return count; |
593 | } | 597 | } |
598 | #define sysfs_fan_decl(offset) \ | ||
599 | static SENSOR_DEVICE_ATTR(fan##offset##_input, S_IRUGO, \ | ||
600 | show_fan_input, NULL, offset - 1); \ | ||
601 | static SENSOR_DEVICE_ATTR(fan##offset##_min, S_IRUGO | S_IWUSR, \ | ||
602 | show_fan_min, store_fan_min, offset - 1); | ||
594 | 603 | ||
595 | #define sysfs_fan_offset(offset) \ | 604 | sysfs_fan_decl(1); |
596 | static ssize_t show_regs_fan_##offset (struct device *dev, struct device_attribute *attr, char *buf) \ | 605 | sysfs_fan_decl(2); |
597 | { \ | 606 | sysfs_fan_decl(3); |
598 | return show_fan(dev, buf, offset); \ | ||
599 | } \ | ||
600 | static DEVICE_ATTR(fan##offset##_input, S_IRUGO, show_regs_fan_##offset, NULL); | ||
601 | 607 | ||
602 | #define sysfs_fan_min_offset(offset) \ | 608 | static ssize_t |
603 | static ssize_t show_regs_fan_min##offset (struct device *dev, struct device_attribute *attr, char *buf) \ | 609 | show_temp(struct device *dev, struct device_attribute *devattr, char *buf) |
604 | { \ | 610 | { |
605 | return show_fan_min(dev, buf, offset); \ | 611 | int nr = to_sensor_dev_attr(devattr)->index; |
606 | } \ | 612 | struct w83627hf_data *data = w83627hf_update_device(dev); |
607 | static ssize_t \ | 613 | if (nr >= 2) { /* TEMP2 and TEMP3 */ |
608 | store_regs_fan_min##offset (struct device *dev, struct device_attribute *attr, const char *buf, size_t count) \ | 614 | return sprintf(buf, "%ld\n", |
609 | { \ | 615 | (long)LM75_TEMP_FROM_REG(data->temp_add[nr-2])); |
610 | return store_fan_min(dev, buf, count, offset); \ | 616 | } else { /* TEMP1 */ |
611 | } \ | 617 | return sprintf(buf, "%ld\n", (long)TEMP_FROM_REG(data->temp)); |
612 | static DEVICE_ATTR(fan##offset##_min, S_IRUGO | S_IWUSR, \ | 618 | } |
613 | show_regs_fan_min##offset, store_regs_fan_min##offset); | ||
614 | |||
615 | sysfs_fan_offset(1); | ||
616 | sysfs_fan_min_offset(1); | ||
617 | sysfs_fan_offset(2); | ||
618 | sysfs_fan_min_offset(2); | ||
619 | sysfs_fan_offset(3); | ||
620 | sysfs_fan_min_offset(3); | ||
621 | |||
622 | #define show_temp_reg(reg) \ | ||
623 | static ssize_t show_##reg (struct device *dev, char *buf, int nr) \ | ||
624 | { \ | ||
625 | struct w83627hf_data *data = w83627hf_update_device(dev); \ | ||
626 | if (nr >= 2) { /* TEMP2 and TEMP3 */ \ | ||
627 | return sprintf(buf,"%ld\n", \ | ||
628 | (long)LM75_TEMP_FROM_REG(data->reg##_add[nr-2])); \ | ||
629 | } else { /* TEMP1 */ \ | ||
630 | return sprintf(buf,"%ld\n", (long)TEMP_FROM_REG(data->reg)); \ | ||
631 | } \ | ||
632 | } | 619 | } |
633 | show_temp_reg(temp); | ||
634 | show_temp_reg(temp_max); | ||
635 | show_temp_reg(temp_max_hyst); | ||
636 | 620 | ||
637 | #define store_temp_reg(REG, reg) \ | 621 | static ssize_t |
638 | static ssize_t \ | 622 | show_temp_max(struct device *dev, struct device_attribute *devattr, |
639 | store_temp_##reg (struct device *dev, const char *buf, size_t count, int nr) \ | 623 | char *buf) |
640 | { \ | 624 | { |
641 | struct w83627hf_data *data = dev_get_drvdata(dev); \ | 625 | int nr = to_sensor_dev_attr(devattr)->index; |
642 | long val; \ | 626 | struct w83627hf_data *data = w83627hf_update_device(dev); |
643 | \ | 627 | if (nr >= 2) { /* TEMP2 and TEMP3 */ |
644 | val = simple_strtol(buf, NULL, 10); \ | 628 | return sprintf(buf, "%ld\n", |
645 | \ | 629 | (long)LM75_TEMP_FROM_REG(data->temp_max_add[nr-2])); |
646 | mutex_lock(&data->update_lock); \ | 630 | } else { /* TEMP1 */ |
647 | \ | 631 | return sprintf(buf, "%ld\n", |
648 | if (nr >= 2) { /* TEMP2 and TEMP3 */ \ | 632 | (long)TEMP_FROM_REG(data->temp_max)); |
649 | data->temp_##reg##_add[nr-2] = LM75_TEMP_TO_REG(val); \ | 633 | } |
650 | w83627hf_write_value(data, W83781D_REG_TEMP_##REG(nr), \ | ||
651 | data->temp_##reg##_add[nr-2]); \ | ||
652 | } else { /* TEMP1 */ \ | ||
653 | data->temp_##reg = TEMP_TO_REG(val); \ | ||
654 | w83627hf_write_value(data, W83781D_REG_TEMP_##REG(nr), \ | ||
655 | data->temp_##reg); \ | ||
656 | } \ | ||
657 | \ | ||
658 | mutex_unlock(&data->update_lock); \ | ||
659 | return count; \ | ||
660 | } | 634 | } |
661 | store_temp_reg(OVER, max); | ||
662 | store_temp_reg(HYST, max_hyst); | ||
663 | 635 | ||
664 | #define sysfs_temp_offset(offset) \ | 636 | static ssize_t |
665 | static ssize_t \ | 637 | show_temp_max_hyst(struct device *dev, struct device_attribute *devattr, |
666 | show_regs_temp_##offset (struct device *dev, struct device_attribute *attr, char *buf) \ | 638 | char *buf) |
667 | { \ | 639 | { |
668 | return show_temp(dev, buf, offset); \ | 640 | int nr = to_sensor_dev_attr(devattr)->index; |
669 | } \ | 641 | struct w83627hf_data *data = w83627hf_update_device(dev); |
670 | static DEVICE_ATTR(temp##offset##_input, S_IRUGO, show_regs_temp_##offset, NULL); | 642 | if (nr >= 2) { /* TEMP2 and TEMP3 */ |
643 | return sprintf(buf, "%ld\n", | ||
644 | (long)LM75_TEMP_FROM_REG(data->temp_max_hyst_add[nr-2])); | ||
645 | } else { /* TEMP1 */ | ||
646 | return sprintf(buf, "%ld\n", | ||
647 | (long)TEMP_FROM_REG(data->temp_max_hyst)); | ||
648 | } | ||
649 | } | ||
671 | 650 | ||
672 | #define sysfs_temp_reg_offset(reg, offset) \ | 651 | static ssize_t |
673 | static ssize_t show_regs_temp_##reg##offset (struct device *dev, struct device_attribute *attr, char *buf) \ | 652 | store_temp_max(struct device *dev, struct device_attribute *devattr, |
674 | { \ | 653 | const char *buf, size_t count) |
675 | return show_temp_##reg (dev, buf, offset); \ | 654 | { |
676 | } \ | 655 | int nr = to_sensor_dev_attr(devattr)->index; |
677 | static ssize_t \ | 656 | struct w83627hf_data *data = dev_get_drvdata(dev); |
678 | store_regs_temp_##reg##offset (struct device *dev, struct device_attribute *attr, \ | 657 | long val = simple_strtol(buf, NULL, 10); |
679 | const char *buf, size_t count) \ | ||
680 | { \ | ||
681 | return store_temp_##reg (dev, buf, count, offset); \ | ||
682 | } \ | ||
683 | static DEVICE_ATTR(temp##offset##_##reg, S_IRUGO| S_IWUSR, \ | ||
684 | show_regs_temp_##reg##offset, store_regs_temp_##reg##offset); | ||
685 | 658 | ||
686 | #define sysfs_temp_offsets(offset) \ | 659 | mutex_lock(&data->update_lock); |
687 | sysfs_temp_offset(offset) \ | ||
688 | sysfs_temp_reg_offset(max, offset) \ | ||
689 | sysfs_temp_reg_offset(max_hyst, offset) | ||
690 | 660 | ||
691 | sysfs_temp_offsets(1); | 661 | if (nr >= 2) { /* TEMP2 and TEMP3 */ |
692 | sysfs_temp_offsets(2); | 662 | data->temp_max_add[nr-2] = LM75_TEMP_TO_REG(val); |
693 | sysfs_temp_offsets(3); | 663 | w83627hf_write_value(data, W83781D_REG_TEMP_OVER(nr), |
664 | data->temp_max_add[nr-2]); | ||
665 | } else { /* TEMP1 */ | ||
666 | data->temp_max = TEMP_TO_REG(val); | ||
667 | w83627hf_write_value(data, W83781D_REG_TEMP_OVER(nr), | ||
668 | data->temp_max); | ||
669 | } | ||
670 | mutex_unlock(&data->update_lock); | ||
671 | return count; | ||
672 | } | ||
673 | |||
674 | static ssize_t | ||
675 | store_temp_max_hyst(struct device *dev, struct device_attribute *devattr, | ||
676 | const char *buf, size_t count) | ||
677 | { | ||
678 | int nr = to_sensor_dev_attr(devattr)->index; | ||
679 | struct w83627hf_data *data = dev_get_drvdata(dev); | ||
680 | long val = simple_strtol(buf, NULL, 10); | ||
681 | |||
682 | mutex_lock(&data->update_lock); | ||
683 | |||
684 | if (nr >= 2) { /* TEMP2 and TEMP3 */ | ||
685 | data->temp_max_hyst_add[nr-2] = LM75_TEMP_TO_REG(val); | ||
686 | w83627hf_write_value(data, W83781D_REG_TEMP_HYST(nr), | ||
687 | data->temp_max_hyst_add[nr-2]); | ||
688 | } else { /* TEMP1 */ | ||
689 | data->temp_max_hyst = TEMP_TO_REG(val); | ||
690 | w83627hf_write_value(data, W83781D_REG_TEMP_HYST(nr), | ||
691 | data->temp_max_hyst); | ||
692 | } | ||
693 | mutex_unlock(&data->update_lock); | ||
694 | return count; | ||
695 | } | ||
696 | |||
697 | #define sysfs_temp_decl(offset) \ | ||
698 | static SENSOR_DEVICE_ATTR(temp##offset##_input, S_IRUGO, \ | ||
699 | show_temp, NULL, offset); \ | ||
700 | static SENSOR_DEVICE_ATTR(temp##offset##_max, S_IRUGO|S_IWUSR, \ | ||
701 | show_temp_max, store_temp_max, offset); \ | ||
702 | static SENSOR_DEVICE_ATTR(temp##offset##_max_hyst, S_IRUGO|S_IWUSR, \ | ||
703 | show_temp_max_hyst, store_temp_max_hyst, offset); | ||
704 | |||
705 | sysfs_temp_decl(1); | ||
706 | sysfs_temp_decl(2); | ||
707 | sysfs_temp_decl(3); | ||
694 | 708 | ||
695 | static ssize_t | 709 | static ssize_t |
696 | show_vid_reg(struct device *dev, struct device_attribute *attr, char *buf) | 710 | show_vid_reg(struct device *dev, struct device_attribute *attr, char *buf) |
@@ -788,20 +802,22 @@ sysfs_beep(ENABLE, enable); | |||
788 | sysfs_beep(MASK, mask); | 802 | sysfs_beep(MASK, mask); |
789 | 803 | ||
790 | static ssize_t | 804 | static ssize_t |
791 | show_fan_div_reg(struct device *dev, char *buf, int nr) | 805 | show_fan_div(struct device *dev, struct device_attribute *devattr, char *buf) |
792 | { | 806 | { |
807 | int nr = to_sensor_dev_attr(devattr)->index; | ||
793 | struct w83627hf_data *data = w83627hf_update_device(dev); | 808 | struct w83627hf_data *data = w83627hf_update_device(dev); |
794 | return sprintf(buf, "%ld\n", | 809 | return sprintf(buf, "%ld\n", |
795 | (long) DIV_FROM_REG(data->fan_div[nr - 1])); | 810 | (long) DIV_FROM_REG(data->fan_div[nr])); |
796 | } | 811 | } |
797 | |||
798 | /* Note: we save and restore the fan minimum here, because its value is | 812 | /* Note: we save and restore the fan minimum here, because its value is |
799 | determined in part by the fan divisor. This follows the principle of | 813 | determined in part by the fan divisor. This follows the principle of |
800 | least surprise; the user doesn't expect the fan minimum to change just | 814 | least surprise; the user doesn't expect the fan minimum to change just |
801 | because the divisor changed. */ | 815 | because the divisor changed. */ |
802 | static ssize_t | 816 | static ssize_t |
803 | store_fan_div_reg(struct device *dev, const char *buf, size_t count, int nr) | 817 | store_fan_div(struct device *dev, struct device_attribute *devattr, |
818 | const char *buf, size_t count) | ||
804 | { | 819 | { |
820 | int nr = to_sensor_dev_attr(devattr)->index; | ||
805 | struct w83627hf_data *data = dev_get_drvdata(dev); | 821 | struct w83627hf_data *data = dev_get_drvdata(dev); |
806 | unsigned long min; | 822 | unsigned long min; |
807 | u8 reg; | 823 | u8 reg; |
@@ -833,92 +849,72 @@ store_fan_div_reg(struct device *dev, const char *buf, size_t count, int nr) | |||
833 | return count; | 849 | return count; |
834 | } | 850 | } |
835 | 851 | ||
836 | #define sysfs_fan_div(offset) \ | 852 | static SENSOR_DEVICE_ATTR(fan1_div, S_IRUGO|S_IWUSR, |
837 | static ssize_t show_regs_fan_div_##offset (struct device *dev, struct device_attribute *attr, char *buf) \ | 853 | show_fan_div, store_fan_div, 0); |
838 | { \ | 854 | static SENSOR_DEVICE_ATTR(fan2_div, S_IRUGO|S_IWUSR, |
839 | return show_fan_div_reg(dev, buf, offset); \ | 855 | show_fan_div, store_fan_div, 1); |
840 | } \ | 856 | static SENSOR_DEVICE_ATTR(fan3_div, S_IRUGO|S_IWUSR, |
841 | static ssize_t \ | 857 | show_fan_div, store_fan_div, 2); |
842 | store_regs_fan_div_##offset (struct device *dev, struct device_attribute *attr, \ | ||
843 | const char *buf, size_t count) \ | ||
844 | { \ | ||
845 | return store_fan_div_reg(dev, buf, count, offset - 1); \ | ||
846 | } \ | ||
847 | static DEVICE_ATTR(fan##offset##_div, S_IRUGO | S_IWUSR, \ | ||
848 | show_regs_fan_div_##offset, store_regs_fan_div_##offset); | ||
849 | |||
850 | sysfs_fan_div(1); | ||
851 | sysfs_fan_div(2); | ||
852 | sysfs_fan_div(3); | ||
853 | 858 | ||
854 | static ssize_t | 859 | static ssize_t |
855 | show_pwm_reg(struct device *dev, char *buf, int nr) | 860 | show_pwm(struct device *dev, struct device_attribute *devattr, char *buf) |
856 | { | 861 | { |
862 | int nr = to_sensor_dev_attr(devattr)->index; | ||
857 | struct w83627hf_data *data = w83627hf_update_device(dev); | 863 | struct w83627hf_data *data = w83627hf_update_device(dev); |
858 | return sprintf(buf, "%ld\n", (long) data->pwm[nr - 1]); | 864 | return sprintf(buf, "%ld\n", (long) data->pwm[nr]); |
859 | } | 865 | } |
860 | 866 | ||
861 | static ssize_t | 867 | static ssize_t |
862 | store_pwm_reg(struct device *dev, const char *buf, size_t count, int nr) | 868 | store_pwm(struct device *dev, struct device_attribute *devattr, |
869 | const char *buf, size_t count) | ||
863 | { | 870 | { |
871 | int nr = to_sensor_dev_attr(devattr)->index; | ||
864 | struct w83627hf_data *data = dev_get_drvdata(dev); | 872 | struct w83627hf_data *data = dev_get_drvdata(dev); |
865 | u32 val; | 873 | u32 val = simple_strtoul(buf, NULL, 10); |
866 | |||
867 | val = simple_strtoul(buf, NULL, 10); | ||
868 | 874 | ||
869 | mutex_lock(&data->update_lock); | 875 | mutex_lock(&data->update_lock); |
870 | 876 | ||
871 | if (data->type == w83627thf) { | 877 | if (data->type == w83627thf) { |
872 | /* bits 0-3 are reserved in 627THF */ | 878 | /* bits 0-3 are reserved in 627THF */ |
873 | data->pwm[nr - 1] = PWM_TO_REG(val) & 0xf0; | 879 | data->pwm[nr] = PWM_TO_REG(val) & 0xf0; |
874 | w83627hf_write_value(data, | 880 | w83627hf_write_value(data, |
875 | W836X7HF_REG_PWM(data->type, nr), | 881 | W836X7HF_REG_PWM(data->type, nr), |
876 | data->pwm[nr - 1] | | 882 | data->pwm[nr] | |
877 | (w83627hf_read_value(data, | 883 | (w83627hf_read_value(data, |
878 | W836X7HF_REG_PWM(data->type, nr)) & 0x0f)); | 884 | W836X7HF_REG_PWM(data->type, nr)) & 0x0f)); |
879 | } else { | 885 | } else { |
880 | data->pwm[nr - 1] = PWM_TO_REG(val); | 886 | data->pwm[nr] = PWM_TO_REG(val); |
881 | w83627hf_write_value(data, | 887 | w83627hf_write_value(data, |
882 | W836X7HF_REG_PWM(data->type, nr), | 888 | W836X7HF_REG_PWM(data->type, nr), |
883 | data->pwm[nr - 1]); | 889 | data->pwm[nr]); |
884 | } | 890 | } |
885 | 891 | ||
886 | mutex_unlock(&data->update_lock); | 892 | mutex_unlock(&data->update_lock); |
887 | return count; | 893 | return count; |
888 | } | 894 | } |
889 | 895 | ||
890 | #define sysfs_pwm(offset) \ | 896 | static SENSOR_DEVICE_ATTR(pwm1, S_IRUGO|S_IWUSR, show_pwm, store_pwm, 0); |
891 | static ssize_t show_regs_pwm_##offset (struct device *dev, struct device_attribute *attr, char *buf) \ | 897 | static SENSOR_DEVICE_ATTR(pwm2, S_IRUGO|S_IWUSR, show_pwm, store_pwm, 1); |
892 | { \ | 898 | static SENSOR_DEVICE_ATTR(pwm3, S_IRUGO|S_IWUSR, show_pwm, store_pwm, 2); |
893 | return show_pwm_reg(dev, buf, offset); \ | ||
894 | } \ | ||
895 | static ssize_t \ | ||
896 | store_regs_pwm_##offset (struct device *dev, struct device_attribute *attr, const char *buf, size_t count) \ | ||
897 | { \ | ||
898 | return store_pwm_reg(dev, buf, count, offset); \ | ||
899 | } \ | ||
900 | static DEVICE_ATTR(pwm##offset, S_IRUGO | S_IWUSR, \ | ||
901 | show_regs_pwm_##offset, store_regs_pwm_##offset); | ||
902 | |||
903 | sysfs_pwm(1); | ||
904 | sysfs_pwm(2); | ||
905 | sysfs_pwm(3); | ||
906 | 899 | ||
907 | static ssize_t | 900 | static ssize_t |
908 | show_pwm_freq_reg(struct device *dev, char *buf, int nr) | 901 | show_pwm_freq(struct device *dev, struct device_attribute *devattr, char *buf) |
909 | { | 902 | { |
903 | int nr = to_sensor_dev_attr(devattr)->index; | ||
910 | struct w83627hf_data *data = w83627hf_update_device(dev); | 904 | struct w83627hf_data *data = w83627hf_update_device(dev); |
911 | if (data->type == w83627hf) | 905 | if (data->type == w83627hf) |
912 | return sprintf(buf, "%ld\n", | 906 | return sprintf(buf, "%ld\n", |
913 | pwm_freq_from_reg_627hf(data->pwm_freq[nr - 1])); | 907 | pwm_freq_from_reg_627hf(data->pwm_freq[nr])); |
914 | else | 908 | else |
915 | return sprintf(buf, "%ld\n", | 909 | return sprintf(buf, "%ld\n", |
916 | pwm_freq_from_reg(data->pwm_freq[nr - 1])); | 910 | pwm_freq_from_reg(data->pwm_freq[nr])); |
917 | } | 911 | } |
918 | 912 | ||
919 | static ssize_t | 913 | static ssize_t |
920 | store_pwm_freq_reg(struct device *dev, const char *buf, size_t count, int nr) | 914 | store_pwm_freq(struct device *dev, struct device_attribute *devattr, |
915 | const char *buf, size_t count) | ||
921 | { | 916 | { |
917 | int nr = to_sensor_dev_attr(devattr)->index; | ||
922 | struct w83627hf_data *data = dev_get_drvdata(dev); | 918 | struct w83627hf_data *data = dev_get_drvdata(dev); |
923 | static const u8 mask[]={0xF8, 0x8F}; | 919 | static const u8 mask[]={0xF8, 0x8F}; |
924 | u32 val; | 920 | u32 val; |
@@ -928,50 +924,42 @@ store_pwm_freq_reg(struct device *dev, const char *buf, size_t count, int nr) | |||
928 | mutex_lock(&data->update_lock); | 924 | mutex_lock(&data->update_lock); |
929 | 925 | ||
930 | if (data->type == w83627hf) { | 926 | if (data->type == w83627hf) { |
931 | data->pwm_freq[nr - 1] = pwm_freq_to_reg_627hf(val); | 927 | data->pwm_freq[nr] = pwm_freq_to_reg_627hf(val); |
932 | w83627hf_write_value(data, W83627HF_REG_PWM_FREQ, | 928 | w83627hf_write_value(data, W83627HF_REG_PWM_FREQ, |
933 | (data->pwm_freq[nr - 1] << ((nr - 1)*4)) | | 929 | (data->pwm_freq[nr] << (nr*4)) | |
934 | (w83627hf_read_value(data, | 930 | (w83627hf_read_value(data, |
935 | W83627HF_REG_PWM_FREQ) & mask[nr - 1])); | 931 | W83627HF_REG_PWM_FREQ) & mask[nr])); |
936 | } else { | 932 | } else { |
937 | data->pwm_freq[nr - 1] = pwm_freq_to_reg(val); | 933 | data->pwm_freq[nr] = pwm_freq_to_reg(val); |
938 | w83627hf_write_value(data, W83637HF_REG_PWM_FREQ[nr - 1], | 934 | w83627hf_write_value(data, W83637HF_REG_PWM_FREQ[nr], |
939 | data->pwm_freq[nr - 1]); | 935 | data->pwm_freq[nr]); |
940 | } | 936 | } |
941 | 937 | ||
942 | mutex_unlock(&data->update_lock); | 938 | mutex_unlock(&data->update_lock); |
943 | return count; | 939 | return count; |
944 | } | 940 | } |
945 | 941 | ||
946 | #define sysfs_pwm_freq(offset) \ | 942 | static SENSOR_DEVICE_ATTR(pwm1_freq, S_IRUGO|S_IWUSR, |
947 | static ssize_t show_regs_pwm_freq_##offset(struct device *dev, \ | 943 | show_pwm_freq, store_pwm_freq, 0); |
948 | struct device_attribute *attr, char *buf) \ | 944 | static SENSOR_DEVICE_ATTR(pwm2_freq, S_IRUGO|S_IWUSR, |
949 | { \ | 945 | show_pwm_freq, store_pwm_freq, 1); |
950 | return show_pwm_freq_reg(dev, buf, offset); \ | 946 | static SENSOR_DEVICE_ATTR(pwm3_freq, S_IRUGO|S_IWUSR, |
951 | } \ | 947 | show_pwm_freq, store_pwm_freq, 2); |
952 | static ssize_t \ | ||
953 | store_regs_pwm_freq_##offset(struct device *dev, \ | ||
954 | struct device_attribute *attr, const char *buf, size_t count) \ | ||
955 | { \ | ||
956 | return store_pwm_freq_reg(dev, buf, count, offset); \ | ||
957 | } \ | ||
958 | static DEVICE_ATTR(pwm##offset##_freq, S_IRUGO | S_IWUSR, \ | ||
959 | show_regs_pwm_freq_##offset, store_regs_pwm_freq_##offset); | ||
960 | |||
961 | sysfs_pwm_freq(1); | ||
962 | sysfs_pwm_freq(2); | ||
963 | sysfs_pwm_freq(3); | ||
964 | 948 | ||
965 | static ssize_t | 949 | static ssize_t |
966 | show_sensor_reg(struct device *dev, char *buf, int nr) | 950 | show_temp_type(struct device *dev, struct device_attribute *devattr, |
951 | char *buf) | ||
967 | { | 952 | { |
953 | int nr = to_sensor_dev_attr(devattr)->index; | ||
968 | struct w83627hf_data *data = w83627hf_update_device(dev); | 954 | struct w83627hf_data *data = w83627hf_update_device(dev); |
969 | return sprintf(buf, "%ld\n", (long) data->sens[nr - 1]); | 955 | return sprintf(buf, "%ld\n", (long) data->sens[nr]); |
970 | } | 956 | } |
971 | 957 | ||
972 | static ssize_t | 958 | static ssize_t |
973 | store_sensor_reg(struct device *dev, const char *buf, size_t count, int nr) | 959 | store_temp_type(struct device *dev, struct device_attribute *devattr, |
960 | const char *buf, size_t count) | ||
974 | { | 961 | { |
962 | int nr = to_sensor_dev_attr(devattr)->index; | ||
975 | struct w83627hf_data *data = dev_get_drvdata(dev); | 963 | struct w83627hf_data *data = dev_get_drvdata(dev); |
976 | u32 val, tmp; | 964 | u32 val, tmp; |
977 | 965 | ||
@@ -983,20 +971,20 @@ store_sensor_reg(struct device *dev, const char *buf, size_t count, int nr) | |||
983 | case 1: /* PII/Celeron diode */ | 971 | case 1: /* PII/Celeron diode */ |
984 | tmp = w83627hf_read_value(data, W83781D_REG_SCFG1); | 972 | tmp = w83627hf_read_value(data, W83781D_REG_SCFG1); |
985 | w83627hf_write_value(data, W83781D_REG_SCFG1, | 973 | w83627hf_write_value(data, W83781D_REG_SCFG1, |
986 | tmp | BIT_SCFG1[nr - 1]); | 974 | tmp | BIT_SCFG1[nr]); |
987 | tmp = w83627hf_read_value(data, W83781D_REG_SCFG2); | 975 | tmp = w83627hf_read_value(data, W83781D_REG_SCFG2); |
988 | w83627hf_write_value(data, W83781D_REG_SCFG2, | 976 | w83627hf_write_value(data, W83781D_REG_SCFG2, |
989 | tmp | BIT_SCFG2[nr - 1]); | 977 | tmp | BIT_SCFG2[nr]); |
990 | data->sens[nr - 1] = val; | 978 | data->sens[nr] = val; |
991 | break; | 979 | break; |
992 | case 2: /* 3904 */ | 980 | case 2: /* 3904 */ |
993 | tmp = w83627hf_read_value(data, W83781D_REG_SCFG1); | 981 | tmp = w83627hf_read_value(data, W83781D_REG_SCFG1); |
994 | w83627hf_write_value(data, W83781D_REG_SCFG1, | 982 | w83627hf_write_value(data, W83781D_REG_SCFG1, |
995 | tmp | BIT_SCFG1[nr - 1]); | 983 | tmp | BIT_SCFG1[nr]); |
996 | tmp = w83627hf_read_value(data, W83781D_REG_SCFG2); | 984 | tmp = w83627hf_read_value(data, W83781D_REG_SCFG2); |
997 | w83627hf_write_value(data, W83781D_REG_SCFG2, | 985 | w83627hf_write_value(data, W83781D_REG_SCFG2, |
998 | tmp & ~BIT_SCFG2[nr - 1]); | 986 | tmp & ~BIT_SCFG2[nr]); |
999 | data->sens[nr - 1] = val; | 987 | data->sens[nr] = val; |
1000 | break; | 988 | break; |
1001 | case W83781D_DEFAULT_BETA: | 989 | case W83781D_DEFAULT_BETA: |
1002 | dev_warn(dev, "Sensor type %d is deprecated, please use 4 " | 990 | dev_warn(dev, "Sensor type %d is deprecated, please use 4 " |
@@ -1005,8 +993,8 @@ store_sensor_reg(struct device *dev, const char *buf, size_t count, int nr) | |||
1005 | case 4: /* thermistor */ | 993 | case 4: /* thermistor */ |
1006 | tmp = w83627hf_read_value(data, W83781D_REG_SCFG1); | 994 | tmp = w83627hf_read_value(data, W83781D_REG_SCFG1); |
1007 | w83627hf_write_value(data, W83781D_REG_SCFG1, | 995 | w83627hf_write_value(data, W83781D_REG_SCFG1, |
1008 | tmp & ~BIT_SCFG1[nr - 1]); | 996 | tmp & ~BIT_SCFG1[nr]); |
1009 | data->sens[nr - 1] = val; | 997 | data->sens[nr] = val; |
1010 | break; | 998 | break; |
1011 | default: | 999 | default: |
1012 | dev_err(dev, | 1000 | dev_err(dev, |
@@ -1019,25 +1007,16 @@ store_sensor_reg(struct device *dev, const char *buf, size_t count, int nr) | |||
1019 | return count; | 1007 | return count; |
1020 | } | 1008 | } |
1021 | 1009 | ||
1022 | #define sysfs_sensor(offset) \ | 1010 | #define sysfs_temp_type(offset) \ |
1023 | static ssize_t show_regs_sensor_##offset (struct device *dev, struct device_attribute *attr, char *buf) \ | 1011 | static SENSOR_DEVICE_ATTR(temp##offset##_type, S_IRUGO | S_IWUSR, \ |
1024 | { \ | 1012 | show_temp_type, store_temp_type, offset - 1); |
1025 | return show_sensor_reg(dev, buf, offset); \ | ||
1026 | } \ | ||
1027 | static ssize_t \ | ||
1028 | store_regs_sensor_##offset (struct device *dev, struct device_attribute *attr, const char *buf, size_t count) \ | ||
1029 | { \ | ||
1030 | return store_sensor_reg(dev, buf, count, offset); \ | ||
1031 | } \ | ||
1032 | static DEVICE_ATTR(temp##offset##_type, S_IRUGO | S_IWUSR, \ | ||
1033 | show_regs_sensor_##offset, store_regs_sensor_##offset); | ||
1034 | 1013 | ||
1035 | sysfs_sensor(1); | 1014 | sysfs_temp_type(1); |
1036 | sysfs_sensor(2); | 1015 | sysfs_temp_type(2); |
1037 | sysfs_sensor(3); | 1016 | sysfs_temp_type(3); |
1038 | 1017 | ||
1039 | static ssize_t show_name(struct device *dev, struct device_attribute | 1018 | static ssize_t |
1040 | *devattr, char *buf) | 1019 | show_name(struct device *dev, struct device_attribute *devattr, char *buf) |
1041 | { | 1020 | { |
1042 | struct w83627hf_data *data = dev_get_drvdata(dev); | 1021 | struct w83627hf_data *data = dev_get_drvdata(dev); |
1043 | 1022 | ||
@@ -1119,49 +1098,44 @@ static int __init w83627hf_find(int sioaddr, unsigned short *addr, | |||
1119 | return err; | 1098 | return err; |
1120 | } | 1099 | } |
1121 | 1100 | ||
1101 | #define VIN_UNIT_ATTRS(_X_) \ | ||
1102 | &sensor_dev_attr_in##_X_##_input.dev_attr.attr, \ | ||
1103 | &sensor_dev_attr_in##_X_##_min.dev_attr.attr, \ | ||
1104 | &sensor_dev_attr_in##_X_##_max.dev_attr.attr | ||
1105 | |||
1106 | #define FAN_UNIT_ATTRS(_X_) \ | ||
1107 | &sensor_dev_attr_fan##_X_##_input.dev_attr.attr, \ | ||
1108 | &sensor_dev_attr_fan##_X_##_min.dev_attr.attr, \ | ||
1109 | &sensor_dev_attr_fan##_X_##_div.dev_attr.attr | ||
1110 | |||
1111 | #define TEMP_UNIT_ATTRS(_X_) \ | ||
1112 | &sensor_dev_attr_temp##_X_##_input.dev_attr.attr, \ | ||
1113 | &sensor_dev_attr_temp##_X_##_max.dev_attr.attr, \ | ||
1114 | &sensor_dev_attr_temp##_X_##_max_hyst.dev_attr.attr, \ | ||
1115 | &sensor_dev_attr_temp##_X_##_type.dev_attr.attr | ||
1116 | |||
1122 | static struct attribute *w83627hf_attributes[] = { | 1117 | static struct attribute *w83627hf_attributes[] = { |
1123 | &dev_attr_in0_input.attr, | 1118 | &dev_attr_in0_input.attr, |
1124 | &dev_attr_in0_min.attr, | 1119 | &dev_attr_in0_min.attr, |
1125 | &dev_attr_in0_max.attr, | 1120 | &dev_attr_in0_max.attr, |
1126 | &dev_attr_in2_input.attr, | 1121 | VIN_UNIT_ATTRS(2), |
1127 | &dev_attr_in2_min.attr, | 1122 | VIN_UNIT_ATTRS(3), |
1128 | &dev_attr_in2_max.attr, | 1123 | VIN_UNIT_ATTRS(4), |
1129 | &dev_attr_in3_input.attr, | 1124 | VIN_UNIT_ATTRS(7), |
1130 | &dev_attr_in3_min.attr, | 1125 | VIN_UNIT_ATTRS(8), |
1131 | &dev_attr_in3_max.attr, | 1126 | |
1132 | &dev_attr_in4_input.attr, | 1127 | FAN_UNIT_ATTRS(1), |
1133 | &dev_attr_in4_min.attr, | 1128 | FAN_UNIT_ATTRS(2), |
1134 | &dev_attr_in4_max.attr, | 1129 | |
1135 | &dev_attr_in7_input.attr, | 1130 | TEMP_UNIT_ATTRS(1), |
1136 | &dev_attr_in7_min.attr, | 1131 | TEMP_UNIT_ATTRS(2), |
1137 | &dev_attr_in7_max.attr, | ||
1138 | &dev_attr_in8_input.attr, | ||
1139 | &dev_attr_in8_min.attr, | ||
1140 | &dev_attr_in8_max.attr, | ||
1141 | |||
1142 | &dev_attr_fan1_input.attr, | ||
1143 | &dev_attr_fan1_min.attr, | ||
1144 | &dev_attr_fan1_div.attr, | ||
1145 | &dev_attr_fan2_input.attr, | ||
1146 | &dev_attr_fan2_min.attr, | ||
1147 | &dev_attr_fan2_div.attr, | ||
1148 | |||
1149 | &dev_attr_temp1_input.attr, | ||
1150 | &dev_attr_temp1_max.attr, | ||
1151 | &dev_attr_temp1_max_hyst.attr, | ||
1152 | &dev_attr_temp1_type.attr, | ||
1153 | &dev_attr_temp2_input.attr, | ||
1154 | &dev_attr_temp2_max.attr, | ||
1155 | &dev_attr_temp2_max_hyst.attr, | ||
1156 | &dev_attr_temp2_type.attr, | ||
1157 | 1132 | ||
1158 | &dev_attr_alarms.attr, | 1133 | &dev_attr_alarms.attr, |
1159 | &dev_attr_beep_enable.attr, | 1134 | &dev_attr_beep_enable.attr, |
1160 | &dev_attr_beep_mask.attr, | 1135 | &dev_attr_beep_mask.attr, |
1161 | 1136 | ||
1162 | &dev_attr_pwm1.attr, | 1137 | &sensor_dev_attr_pwm1.dev_attr.attr, |
1163 | &dev_attr_pwm2.attr, | 1138 | &sensor_dev_attr_pwm2.dev_attr.attr, |
1164 | |||
1165 | &dev_attr_name.attr, | 1139 | &dev_attr_name.attr, |
1166 | NULL | 1140 | NULL |
1167 | }; | 1141 | }; |
@@ -1171,30 +1145,17 @@ static const struct attribute_group w83627hf_group = { | |||
1171 | }; | 1145 | }; |
1172 | 1146 | ||
1173 | static struct attribute *w83627hf_attributes_opt[] = { | 1147 | static struct attribute *w83627hf_attributes_opt[] = { |
1174 | &dev_attr_in1_input.attr, | 1148 | VIN_UNIT_ATTRS(1), |
1175 | &dev_attr_in1_min.attr, | 1149 | VIN_UNIT_ATTRS(5), |
1176 | &dev_attr_in1_max.attr, | 1150 | VIN_UNIT_ATTRS(6), |
1177 | &dev_attr_in5_input.attr, | 1151 | |
1178 | &dev_attr_in5_min.attr, | 1152 | FAN_UNIT_ATTRS(3), |
1179 | &dev_attr_in5_max.attr, | 1153 | TEMP_UNIT_ATTRS(3), |
1180 | &dev_attr_in6_input.attr, | 1154 | &sensor_dev_attr_pwm3.dev_attr.attr, |
1181 | &dev_attr_in6_min.attr, | 1155 | |
1182 | &dev_attr_in6_max.attr, | 1156 | &sensor_dev_attr_pwm1_freq.dev_attr.attr, |
1183 | 1157 | &sensor_dev_attr_pwm2_freq.dev_attr.attr, | |
1184 | &dev_attr_fan3_input.attr, | 1158 | &sensor_dev_attr_pwm3_freq.dev_attr.attr, |
1185 | &dev_attr_fan3_min.attr, | ||
1186 | &dev_attr_fan3_div.attr, | ||
1187 | |||
1188 | &dev_attr_temp3_input.attr, | ||
1189 | &dev_attr_temp3_max.attr, | ||
1190 | &dev_attr_temp3_max_hyst.attr, | ||
1191 | &dev_attr_temp3_type.attr, | ||
1192 | |||
1193 | &dev_attr_pwm3.attr, | ||
1194 | |||
1195 | &dev_attr_pwm1_freq.attr, | ||
1196 | &dev_attr_pwm2_freq.attr, | ||
1197 | &dev_attr_pwm3_freq.attr, | ||
1198 | NULL | 1159 | NULL |
1199 | }; | 1160 | }; |
1200 | 1161 | ||
@@ -1252,27 +1213,45 @@ static int __devinit w83627hf_probe(struct platform_device *pdev) | |||
1252 | 1213 | ||
1253 | /* Register chip-specific device attributes */ | 1214 | /* Register chip-specific device attributes */ |
1254 | if (data->type == w83627hf || data->type == w83697hf) | 1215 | if (data->type == w83627hf || data->type == w83697hf) |
1255 | if ((err = device_create_file(dev, &dev_attr_in5_input)) | 1216 | if ((err = device_create_file(dev, |
1256 | || (err = device_create_file(dev, &dev_attr_in5_min)) | 1217 | &sensor_dev_attr_in5_input.dev_attr)) |
1257 | || (err = device_create_file(dev, &dev_attr_in5_max)) | 1218 | || (err = device_create_file(dev, |
1258 | || (err = device_create_file(dev, &dev_attr_in6_input)) | 1219 | &sensor_dev_attr_in5_min.dev_attr)) |
1259 | || (err = device_create_file(dev, &dev_attr_in6_min)) | 1220 | || (err = device_create_file(dev, |
1260 | || (err = device_create_file(dev, &dev_attr_in6_max)) | 1221 | &sensor_dev_attr_in5_max.dev_attr)) |
1261 | || (err = device_create_file(dev, &dev_attr_pwm1_freq)) | 1222 | || (err = device_create_file(dev, |
1262 | || (err = device_create_file(dev, &dev_attr_pwm2_freq))) | 1223 | &sensor_dev_attr_in6_input.dev_attr)) |
1224 | || (err = device_create_file(dev, | ||
1225 | &sensor_dev_attr_in6_min.dev_attr)) | ||
1226 | || (err = device_create_file(dev, | ||
1227 | &sensor_dev_attr_in6_max.dev_attr)) | ||
1228 | || (err = device_create_file(dev, | ||
1229 | &sensor_dev_attr_pwm1_freq.dev_attr)) | ||
1230 | || (err = device_create_file(dev, | ||
1231 | &sensor_dev_attr_pwm2_freq.dev_attr))) | ||
1263 | goto ERROR4; | 1232 | goto ERROR4; |
1264 | 1233 | ||
1265 | if (data->type != w83697hf) | 1234 | if (data->type != w83697hf) |
1266 | if ((err = device_create_file(dev, &dev_attr_in1_input)) | 1235 | if ((err = device_create_file(dev, |
1267 | || (err = device_create_file(dev, &dev_attr_in1_min)) | 1236 | &sensor_dev_attr_in1_input.dev_attr)) |
1268 | || (err = device_create_file(dev, &dev_attr_in1_max)) | 1237 | || (err = device_create_file(dev, |
1269 | || (err = device_create_file(dev, &dev_attr_fan3_input)) | 1238 | &sensor_dev_attr_in1_min.dev_attr)) |
1270 | || (err = device_create_file(dev, &dev_attr_fan3_min)) | 1239 | || (err = device_create_file(dev, |
1271 | || (err = device_create_file(dev, &dev_attr_fan3_div)) | 1240 | &sensor_dev_attr_in1_max.dev_attr)) |
1272 | || (err = device_create_file(dev, &dev_attr_temp3_input)) | 1241 | || (err = device_create_file(dev, |
1273 | || (err = device_create_file(dev, &dev_attr_temp3_max)) | 1242 | &sensor_dev_attr_fan3_input.dev_attr)) |
1274 | || (err = device_create_file(dev, &dev_attr_temp3_max_hyst)) | 1243 | || (err = device_create_file(dev, |
1275 | || (err = device_create_file(dev, &dev_attr_temp3_type))) | 1244 | &sensor_dev_attr_fan3_min.dev_attr)) |
1245 | || (err = device_create_file(dev, | ||
1246 | &sensor_dev_attr_fan3_div.dev_attr)) | ||
1247 | || (err = device_create_file(dev, | ||
1248 | &sensor_dev_attr_temp3_input.dev_attr)) | ||
1249 | || (err = device_create_file(dev, | ||
1250 | &sensor_dev_attr_temp3_max.dev_attr)) | ||
1251 | || (err = device_create_file(dev, | ||
1252 | &sensor_dev_attr_temp3_max_hyst.dev_attr)) | ||
1253 | || (err = device_create_file(dev, | ||
1254 | &sensor_dev_attr_temp3_type.dev_attr))) | ||
1276 | goto ERROR4; | 1255 | goto ERROR4; |
1277 | 1256 | ||
1278 | if (data->type != w83697hf && data->vid != 0xff) { | 1257 | if (data->type != w83697hf && data->vid != 0xff) { |
@@ -1286,13 +1265,17 @@ static int __devinit w83627hf_probe(struct platform_device *pdev) | |||
1286 | 1265 | ||
1287 | if (data->type == w83627thf || data->type == w83637hf | 1266 | if (data->type == w83627thf || data->type == w83637hf |
1288 | || data->type == w83687thf) | 1267 | || data->type == w83687thf) |
1289 | if ((err = device_create_file(dev, &dev_attr_pwm3))) | 1268 | if ((err = device_create_file(dev, |
1269 | &sensor_dev_attr_pwm3.dev_attr))) | ||
1290 | goto ERROR4; | 1270 | goto ERROR4; |
1291 | 1271 | ||
1292 | if (data->type == w83637hf || data->type == w83687thf) | 1272 | if (data->type == w83637hf || data->type == w83687thf) |
1293 | if ((err = device_create_file(dev, &dev_attr_pwm1_freq)) | 1273 | if ((err = device_create_file(dev, |
1294 | || (err = device_create_file(dev, &dev_attr_pwm2_freq)) | 1274 | &sensor_dev_attr_pwm1_freq.dev_attr)) |
1295 | || (err = device_create_file(dev, &dev_attr_pwm3_freq))) | 1275 | || (err = device_create_file(dev, |
1276 | &sensor_dev_attr_pwm2_freq.dev_attr)) | ||
1277 | || (err = device_create_file(dev, | ||
1278 | &sensor_dev_attr_pwm3_freq.dev_attr))) | ||
1296 | goto ERROR4; | 1279 | goto ERROR4; |
1297 | 1280 | ||
1298 | data->hwmon_dev = hwmon_device_register(dev); | 1281 | data->hwmon_dev = hwmon_device_register(dev); |
@@ -1588,15 +1571,15 @@ static struct w83627hf_data *w83627hf_update_device(struct device *dev) | |||
1588 | w83627hf_read_value(data, | 1571 | w83627hf_read_value(data, |
1589 | W83781D_REG_FAN_MIN(i)); | 1572 | W83781D_REG_FAN_MIN(i)); |
1590 | } | 1573 | } |
1591 | for (i = 1; i <= 3; i++) { | 1574 | for (i = 0; i <= 2; i++) { |
1592 | u8 tmp = w83627hf_read_value(data, | 1575 | u8 tmp = w83627hf_read_value(data, |
1593 | W836X7HF_REG_PWM(data->type, i)); | 1576 | W836X7HF_REG_PWM(data->type, i)); |
1594 | /* bits 0-3 are reserved in 627THF */ | 1577 | /* bits 0-3 are reserved in 627THF */ |
1595 | if (data->type == w83627thf) | 1578 | if (data->type == w83627thf) |
1596 | tmp &= 0xf0; | 1579 | tmp &= 0xf0; |
1597 | data->pwm[i - 1] = tmp; | 1580 | data->pwm[i] = tmp; |
1598 | if(i == 2 && | 1581 | if (i == 1 && |
1599 | (data->type == w83627hf || data->type == w83697hf)) | 1582 | (data->type == w83627hf || data->type == w83697hf)) |
1600 | break; | 1583 | break; |
1601 | } | 1584 | } |
1602 | if (data->type == w83627hf) { | 1585 | if (data->type == w83627hf) { |