aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/hwmon/f71805f.c218
1 files changed, 103 insertions, 115 deletions
diff --git a/drivers/hwmon/f71805f.c b/drivers/hwmon/f71805f.c
index e029e0a94ecc..8e810f05d0ae 100644
--- a/drivers/hwmon/f71805f.c
+++ b/drivers/hwmon/f71805f.c
@@ -384,10 +384,6 @@ static ssize_t set_in0_min(struct device *dev, struct device_attribute
384 return count; 384 return count;
385} 385}
386 386
387static DEVICE_ATTR(in0_input, S_IRUGO, show_in0, NULL);
388static DEVICE_ATTR(in0_max, S_IRUGO| S_IWUSR, show_in0_max, set_in0_max);
389static DEVICE_ATTR(in0_min, S_IRUGO| S_IWUSR, show_in0_min, set_in0_min);
390
391static ssize_t show_in(struct device *dev, struct device_attribute *devattr, 387static ssize_t show_in(struct device *dev, struct device_attribute *devattr,
392 char *buf) 388 char *buf)
393{ 389{
@@ -450,23 +446,6 @@ static ssize_t set_in_min(struct device *dev, struct device_attribute
450 return count; 446 return count;
451} 447}
452 448
453#define sysfs_in(offset) \
454static SENSOR_DEVICE_ATTR(in##offset##_input, S_IRUGO, \
455 show_in, NULL, offset); \
456static SENSOR_DEVICE_ATTR(in##offset##_max, S_IRUGO | S_IWUSR, \
457 show_in_max, set_in_max, offset); \
458static SENSOR_DEVICE_ATTR(in##offset##_min, S_IRUGO | S_IWUSR, \
459 show_in_min, set_in_min, offset)
460
461sysfs_in(1);
462sysfs_in(2);
463sysfs_in(3);
464sysfs_in(4);
465sysfs_in(5);
466sysfs_in(6);
467sysfs_in(7);
468sysfs_in(8);
469
470static ssize_t show_fan(struct device *dev, struct device_attribute *devattr, 449static ssize_t show_fan(struct device *dev, struct device_attribute *devattr,
471 char *buf) 450 char *buf)
472{ 451{
@@ -503,16 +482,6 @@ static ssize_t set_fan_min(struct device *dev, struct device_attribute
503 return count; 482 return count;
504} 483}
505 484
506#define sysfs_fan(offset) \
507static SENSOR_DEVICE_ATTR(fan##offset##_input, S_IRUGO, \
508 show_fan, NULL, offset - 1); \
509static SENSOR_DEVICE_ATTR(fan##offset##_min, S_IRUGO | S_IWUSR, \
510 show_fan_min, set_fan_min, offset - 1)
511
512sysfs_fan(1);
513sysfs_fan(2);
514sysfs_fan(3);
515
516static ssize_t show_temp(struct device *dev, struct device_attribute *devattr, 485static ssize_t show_temp(struct device *dev, struct device_attribute *devattr,
517 char *buf) 486 char *buf)
518{ 487{
@@ -586,20 +555,6 @@ static ssize_t set_temp_hyst(struct device *dev, struct device_attribute
586 return count; 555 return count;
587} 556}
588 557
589#define sysfs_temp(offset) \
590static SENSOR_DEVICE_ATTR(temp##offset##_input, S_IRUGO, \
591 show_temp, NULL, offset - 1); \
592static SENSOR_DEVICE_ATTR(temp##offset##_max, S_IRUGO | S_IWUSR, \
593 show_temp_max, set_temp_max, offset - 1); \
594static SENSOR_DEVICE_ATTR(temp##offset##_max_hyst, S_IRUGO | S_IWUSR, \
595 show_temp_hyst, set_temp_hyst, offset - 1); \
596static SENSOR_DEVICE_ATTR(temp##offset##_type, S_IRUGO, \
597 show_temp_type, NULL, offset - 1)
598
599sysfs_temp(1);
600sysfs_temp(2);
601sysfs_temp(3);
602
603static ssize_t show_alarms_in(struct device *dev, struct device_attribute 558static ssize_t show_alarms_in(struct device *dev, struct device_attribute
604 *devattr, char *buf) 559 *devattr, char *buf)
605{ 560{
@@ -625,10 +580,6 @@ static ssize_t show_alarms_temp(struct device *dev, struct device_attribute
625 return sprintf(buf, "%d\n", (data->alarms[1] >> 3) & 0x07); 580 return sprintf(buf, "%d\n", (data->alarms[1] >> 3) & 0x07);
626} 581}
627 582
628static DEVICE_ATTR(alarms_in, S_IRUGO, show_alarms_in, NULL);
629static DEVICE_ATTR(alarms_fan, S_IRUGO, show_alarms_fan, NULL);
630static DEVICE_ATTR(alarms_temp, S_IRUGO, show_alarms_temp, NULL);
631
632static ssize_t show_name(struct device *dev, struct device_attribute 583static ssize_t show_name(struct device *dev, struct device_attribute
633 *devattr, char *buf) 584 *devattr, char *buf)
634{ 585{
@@ -637,7 +588,89 @@ static ssize_t show_name(struct device *dev, struct device_attribute
637 return sprintf(buf, "%s\n", data->name); 588 return sprintf(buf, "%s\n", data->name);
638} 589}
639 590
640static DEVICE_ATTR(name, S_IRUGO, show_name, NULL); 591static struct device_attribute f71805f_dev_attr[] = {
592 __ATTR(in0_input, S_IRUGO, show_in0, NULL),
593 __ATTR(in0_max, S_IRUGO| S_IWUSR, show_in0_max, set_in0_max),
594 __ATTR(in0_min, S_IRUGO| S_IWUSR, show_in0_min, set_in0_min),
595 __ATTR(alarms_in, S_IRUGO, show_alarms_in, NULL),
596 __ATTR(alarms_fan, S_IRUGO, show_alarms_fan, NULL),
597 __ATTR(alarms_temp, S_IRUGO, show_alarms_temp, NULL),
598 __ATTR(name, S_IRUGO, show_name, NULL),
599};
600
601static struct sensor_device_attribute f71805f_sensor_attr[] = {
602 SENSOR_ATTR(in1_input, S_IRUGO, show_in, NULL, 1),
603 SENSOR_ATTR(in1_max, S_IRUGO | S_IWUSR,
604 show_in_max, set_in_max, 1),
605 SENSOR_ATTR(in1_min, S_IRUGO | S_IWUSR,
606 show_in_min, set_in_min, 1),
607 SENSOR_ATTR(in2_input, S_IRUGO, show_in, NULL, 2),
608 SENSOR_ATTR(in2_max, S_IRUGO | S_IWUSR,
609 show_in_max, set_in_max, 2),
610 SENSOR_ATTR(in2_min, S_IRUGO | S_IWUSR,
611 show_in_min, set_in_min, 2),
612 SENSOR_ATTR(in3_input, S_IRUGO, show_in, NULL, 3),
613 SENSOR_ATTR(in3_max, S_IRUGO | S_IWUSR,
614 show_in_max, set_in_max, 3),
615 SENSOR_ATTR(in3_min, S_IRUGO | S_IWUSR,
616 show_in_min, set_in_min, 3),
617 SENSOR_ATTR(in4_input, S_IRUGO, show_in, NULL, 4),
618 SENSOR_ATTR(in4_max, S_IRUGO | S_IWUSR,
619 show_in_max, set_in_max, 4),
620 SENSOR_ATTR(in4_min, S_IRUGO | S_IWUSR,
621 show_in_min, set_in_min, 4),
622 SENSOR_ATTR(in5_input, S_IRUGO, show_in, NULL, 5),
623 SENSOR_ATTR(in5_max, S_IRUGO | S_IWUSR,
624 show_in_max, set_in_max, 5),
625 SENSOR_ATTR(in5_min, S_IRUGO | S_IWUSR,
626 show_in_min, set_in_min, 5),
627 SENSOR_ATTR(in6_input, S_IRUGO, show_in, NULL, 6),
628 SENSOR_ATTR(in6_max, S_IRUGO | S_IWUSR,
629 show_in_max, set_in_max, 6),
630 SENSOR_ATTR(in6_min, S_IRUGO | S_IWUSR,
631 show_in_min, set_in_min, 6),
632 SENSOR_ATTR(in7_input, S_IRUGO, show_in, NULL, 7),
633 SENSOR_ATTR(in7_max, S_IRUGO | S_IWUSR,
634 show_in_max, set_in_max, 7),
635 SENSOR_ATTR(in7_min, S_IRUGO | S_IWUSR,
636 show_in_min, set_in_min, 7),
637 SENSOR_ATTR(in8_input, S_IRUGO, show_in, NULL, 8),
638 SENSOR_ATTR(in8_max, S_IRUGO | S_IWUSR,
639 show_in_max, set_in_max, 8),
640 SENSOR_ATTR(in8_min, S_IRUGO | S_IWUSR,
641 show_in_min, set_in_min, 8),
642
643 SENSOR_ATTR(temp1_input, S_IRUGO, show_temp, NULL, 0),
644 SENSOR_ATTR(temp1_max, S_IRUGO | S_IWUSR,
645 show_temp_max, set_temp_max, 0),
646 SENSOR_ATTR(temp1_max_hyst, S_IRUGO | S_IWUSR,
647 show_temp_hyst, set_temp_hyst, 0),
648 SENSOR_ATTR(temp1_type, S_IRUGO, show_temp_type, NULL, 0),
649 SENSOR_ATTR(temp2_input, S_IRUGO, show_temp, NULL, 1),
650 SENSOR_ATTR(temp2_max, S_IRUGO | S_IWUSR,
651 show_temp_max, set_temp_max, 1),
652 SENSOR_ATTR(temp2_max_hyst, S_IRUGO | S_IWUSR,
653 show_temp_hyst, set_temp_hyst, 1),
654 SENSOR_ATTR(temp2_type, S_IRUGO, show_temp_type, NULL, 1),
655 SENSOR_ATTR(temp3_input, S_IRUGO, show_temp, NULL, 2),
656 SENSOR_ATTR(temp3_max, S_IRUGO | S_IWUSR,
657 show_temp_max, set_temp_max, 2),
658 SENSOR_ATTR(temp3_max_hyst, S_IRUGO | S_IWUSR,
659 show_temp_hyst, set_temp_hyst, 2),
660 SENSOR_ATTR(temp3_type, S_IRUGO, show_temp_type, NULL, 2),
661};
662
663static struct sensor_device_attribute f71805f_fan_attr[] = {
664 SENSOR_ATTR(fan1_input, S_IRUGO, show_fan, NULL, 0),
665 SENSOR_ATTR(fan1_min, S_IRUGO | S_IWUSR,
666 show_fan_min, set_fan_min, 0),
667 SENSOR_ATTR(fan2_input, S_IRUGO, show_fan, NULL, 1),
668 SENSOR_ATTR(fan2_min, S_IRUGO | S_IWUSR,
669 show_fan_min, set_fan_min, 1),
670 SENSOR_ATTR(fan3_input, S_IRUGO, show_fan, NULL, 2),
671 SENSOR_ATTR(fan3_min, S_IRUGO | S_IWUSR,
672 show_fan_min, set_fan_min, 2),
673};
641 674
642/* 675/*
643 * Device registration and initialization 676 * Device registration and initialization
@@ -668,7 +701,7 @@ static int __devinit f71805f_probe(struct platform_device *pdev)
668{ 701{
669 struct f71805f_data *data; 702 struct f71805f_data *data;
670 struct resource *res; 703 struct resource *res;
671 int err; 704 int i, err;
672 705
673 if (!(data = kzalloc(sizeof(struct f71805f_data), GFP_KERNEL))) { 706 if (!(data = kzalloc(sizeof(struct f71805f_data), GFP_KERNEL))) {
674 err = -ENOMEM; 707 err = -ENOMEM;
@@ -695,76 +728,31 @@ static int __devinit f71805f_probe(struct platform_device *pdev)
695 f71805f_init_device(data); 728 f71805f_init_device(data);
696 729
697 /* Register sysfs interface files */ 730 /* Register sysfs interface files */
698 device_create_file(&pdev->dev, &dev_attr_in0_input); 731 for (i = 0; i < ARRAY_SIZE(f71805f_dev_attr); i++) {
699 device_create_file(&pdev->dev, &dev_attr_in0_max); 732 err = device_create_file(&pdev->dev, &f71805f_dev_attr[i]);
700 device_create_file(&pdev->dev, &dev_attr_in0_min); 733 if (err)
701 device_create_file(&pdev->dev, &sensor_dev_attr_in1_input.dev_attr); 734 goto exit_class;
702 device_create_file(&pdev->dev, &sensor_dev_attr_in2_input.dev_attr);
703 device_create_file(&pdev->dev, &sensor_dev_attr_in3_input.dev_attr);
704 device_create_file(&pdev->dev, &sensor_dev_attr_in4_input.dev_attr);
705 device_create_file(&pdev->dev, &sensor_dev_attr_in5_input.dev_attr);
706 device_create_file(&pdev->dev, &sensor_dev_attr_in6_input.dev_attr);
707 device_create_file(&pdev->dev, &sensor_dev_attr_in7_input.dev_attr);
708 device_create_file(&pdev->dev, &sensor_dev_attr_in8_input.dev_attr);
709 device_create_file(&pdev->dev, &sensor_dev_attr_in1_max.dev_attr);
710 device_create_file(&pdev->dev, &sensor_dev_attr_in2_max.dev_attr);
711 device_create_file(&pdev->dev, &sensor_dev_attr_in3_max.dev_attr);
712 device_create_file(&pdev->dev, &sensor_dev_attr_in4_max.dev_attr);
713 device_create_file(&pdev->dev, &sensor_dev_attr_in5_max.dev_attr);
714 device_create_file(&pdev->dev, &sensor_dev_attr_in6_max.dev_attr);
715 device_create_file(&pdev->dev, &sensor_dev_attr_in7_max.dev_attr);
716 device_create_file(&pdev->dev, &sensor_dev_attr_in8_max.dev_attr);
717 device_create_file(&pdev->dev, &sensor_dev_attr_in1_min.dev_attr);
718 device_create_file(&pdev->dev, &sensor_dev_attr_in2_min.dev_attr);
719 device_create_file(&pdev->dev, &sensor_dev_attr_in3_min.dev_attr);
720 device_create_file(&pdev->dev, &sensor_dev_attr_in4_min.dev_attr);
721 device_create_file(&pdev->dev, &sensor_dev_attr_in5_min.dev_attr);
722 device_create_file(&pdev->dev, &sensor_dev_attr_in6_min.dev_attr);
723 device_create_file(&pdev->dev, &sensor_dev_attr_in7_min.dev_attr);
724 device_create_file(&pdev->dev, &sensor_dev_attr_in8_min.dev_attr);
725 if (data->fan_enabled & (1 << 0)) {
726 device_create_file(&pdev->dev,
727 &sensor_dev_attr_fan1_input.dev_attr);
728 device_create_file(&pdev->dev,
729 &sensor_dev_attr_fan1_min.dev_attr);
730 } 735 }
731 if (data->fan_enabled & (1 << 1)) { 736 for (i = 0; i < ARRAY_SIZE(f71805f_sensor_attr); i++) {
732 device_create_file(&pdev->dev, 737 err = device_create_file(&pdev->dev,
733 &sensor_dev_attr_fan2_input.dev_attr); 738 &f71805f_sensor_attr[i].dev_attr);
734 device_create_file(&pdev->dev, 739 if (err)
735 &sensor_dev_attr_fan2_min.dev_attr); 740 goto exit_class;
736 } 741 }
737 if (data->fan_enabled & (1 << 2)) { 742 for (i = 0; i < ARRAY_SIZE(f71805f_fan_attr); i++) {
738 device_create_file(&pdev->dev, 743 if (!(data->fan_enabled & (1 << (i / 2))))
739 &sensor_dev_attr_fan3_input.dev_attr); 744 continue;
740 device_create_file(&pdev->dev, 745 err = device_create_file(&pdev->dev,
741 &sensor_dev_attr_fan3_min.dev_attr); 746 &f71805f_fan_attr[i].dev_attr);
747 if (err)
748 goto exit_class;
742 } 749 }
743 device_create_file(&pdev->dev,
744 &sensor_dev_attr_temp1_input.dev_attr);
745 device_create_file(&pdev->dev,
746 &sensor_dev_attr_temp2_input.dev_attr);
747 device_create_file(&pdev->dev,
748 &sensor_dev_attr_temp3_input.dev_attr);
749 device_create_file(&pdev->dev, &sensor_dev_attr_temp1_max.dev_attr);
750 device_create_file(&pdev->dev, &sensor_dev_attr_temp2_max.dev_attr);
751 device_create_file(&pdev->dev, &sensor_dev_attr_temp3_max.dev_attr);
752 device_create_file(&pdev->dev,
753 &sensor_dev_attr_temp1_max_hyst.dev_attr);
754 device_create_file(&pdev->dev,
755 &sensor_dev_attr_temp2_max_hyst.dev_attr);
756 device_create_file(&pdev->dev,
757 &sensor_dev_attr_temp3_max_hyst.dev_attr);
758 device_create_file(&pdev->dev, &sensor_dev_attr_temp1_type.dev_attr);
759 device_create_file(&pdev->dev, &sensor_dev_attr_temp2_type.dev_attr);
760 device_create_file(&pdev->dev, &sensor_dev_attr_temp3_type.dev_attr);
761 device_create_file(&pdev->dev, &dev_attr_alarms_in);
762 device_create_file(&pdev->dev, &dev_attr_alarms_fan);
763 device_create_file(&pdev->dev, &dev_attr_alarms_temp);
764 device_create_file(&pdev->dev, &dev_attr_name);
765 750
766 return 0; 751 return 0;
767 752
753exit_class:
754 dev_err(&pdev->dev, "Sysfs interface creation failed\n");
755 hwmon_device_unregister(data->class_dev);
768exit_free: 756exit_free:
769 kfree(data); 757 kfree(data);
770exit: 758exit: