aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hwmon/lm87.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/hwmon/lm87.c')
-rw-r--r--drivers/hwmon/lm87.c191
1 files changed, 139 insertions, 52 deletions
diff --git a/drivers/hwmon/lm87.c b/drivers/hwmon/lm87.c
index e6c1b638c971..3ce825489e34 100644
--- a/drivers/hwmon/lm87.c
+++ b/drivers/hwmon/lm87.c
@@ -542,6 +542,78 @@ static int lm87_attach_adapter(struct i2c_adapter *adapter)
542 return i2c_probe(adapter, &addr_data, lm87_detect); 542 return i2c_probe(adapter, &addr_data, lm87_detect);
543} 543}
544 544
545static struct attribute *lm87_attributes[] = {
546 &dev_attr_in1_input.attr,
547 &dev_attr_in1_min.attr,
548 &dev_attr_in1_max.attr,
549 &dev_attr_in2_input.attr,
550 &dev_attr_in2_min.attr,
551 &dev_attr_in2_max.attr,
552 &dev_attr_in3_input.attr,
553 &dev_attr_in3_min.attr,
554 &dev_attr_in3_max.attr,
555 &dev_attr_in4_input.attr,
556 &dev_attr_in4_min.attr,
557 &dev_attr_in4_max.attr,
558
559 &dev_attr_temp1_input.attr,
560 &dev_attr_temp1_max.attr,
561 &dev_attr_temp1_min.attr,
562 &dev_attr_temp1_crit.attr,
563 &dev_attr_temp2_input.attr,
564 &dev_attr_temp2_max.attr,
565 &dev_attr_temp2_min.attr,
566 &dev_attr_temp2_crit.attr,
567
568 &dev_attr_alarms.attr,
569 &dev_attr_aout_output.attr,
570
571 NULL
572};
573
574static const struct attribute_group lm87_group = {
575 .attrs = lm87_attributes,
576};
577
578static struct attribute *lm87_attributes_opt[] = {
579 &dev_attr_in6_input.attr,
580 &dev_attr_in6_min.attr,
581 &dev_attr_in6_max.attr,
582
583 &dev_attr_fan1_input.attr,
584 &dev_attr_fan1_min.attr,
585 &dev_attr_fan1_div.attr,
586
587 &dev_attr_in7_input.attr,
588 &dev_attr_in7_min.attr,
589 &dev_attr_in7_max.attr,
590
591 &dev_attr_fan2_input.attr,
592 &dev_attr_fan2_min.attr,
593 &dev_attr_fan2_div.attr,
594
595 &dev_attr_temp3_input.attr,
596 &dev_attr_temp3_max.attr,
597 &dev_attr_temp3_min.attr,
598 &dev_attr_temp3_crit.attr,
599
600 &dev_attr_in0_input.attr,
601 &dev_attr_in0_min.attr,
602 &dev_attr_in0_max.attr,
603 &dev_attr_in5_input.attr,
604 &dev_attr_in5_min.attr,
605 &dev_attr_in5_max.attr,
606
607 &dev_attr_cpu0_vid.attr,
608 &dev_attr_vrm.attr,
609
610 NULL
611};
612
613static const struct attribute_group lm87_group_opt = {
614 .attrs = lm87_attributes_opt,
615};
616
545/* 617/*
546 * The following function does more than just detection. If detection 618 * The following function does more than just detection. If detection
547 * succeeds, it also registers the new chip. 619 * succeeds, it also registers the new chip.
@@ -609,77 +681,90 @@ static int lm87_detect(struct i2c_adapter *adapter, int address, int kind)
609 data->in_scale[7] = 1875; 681 data->in_scale[7] = 1875;
610 682
611 /* Register sysfs hooks */ 683 /* Register sysfs hooks */
612 data->class_dev = hwmon_device_register(&new_client->dev); 684 if ((err = sysfs_create_group(&new_client->dev.kobj, &lm87_group)))
613 if (IS_ERR(data->class_dev)) {
614 err = PTR_ERR(data->class_dev);
615 goto exit_detach; 685 goto exit_detach;
616 }
617
618 device_create_file(&new_client->dev, &dev_attr_in1_input);
619 device_create_file(&new_client->dev, &dev_attr_in1_min);
620 device_create_file(&new_client->dev, &dev_attr_in1_max);
621 device_create_file(&new_client->dev, &dev_attr_in2_input);
622 device_create_file(&new_client->dev, &dev_attr_in2_min);
623 device_create_file(&new_client->dev, &dev_attr_in2_max);
624 device_create_file(&new_client->dev, &dev_attr_in3_input);
625 device_create_file(&new_client->dev, &dev_attr_in3_min);
626 device_create_file(&new_client->dev, &dev_attr_in3_max);
627 device_create_file(&new_client->dev, &dev_attr_in4_input);
628 device_create_file(&new_client->dev, &dev_attr_in4_min);
629 device_create_file(&new_client->dev, &dev_attr_in4_max);
630 686
631 if (data->channel & CHAN_NO_FAN(0)) { 687 if (data->channel & CHAN_NO_FAN(0)) {
632 device_create_file(&new_client->dev, &dev_attr_in6_input); 688 if ((err = device_create_file(&new_client->dev,
633 device_create_file(&new_client->dev, &dev_attr_in6_min); 689 &dev_attr_in6_input))
634 device_create_file(&new_client->dev, &dev_attr_in6_max); 690 || (err = device_create_file(&new_client->dev,
691 &dev_attr_in6_min))
692 || (err = device_create_file(&new_client->dev,
693 &dev_attr_in6_max)))
694 goto exit_remove;
635 } else { 695 } else {
636 device_create_file(&new_client->dev, &dev_attr_fan1_input); 696 if ((err = device_create_file(&new_client->dev,
637 device_create_file(&new_client->dev, &dev_attr_fan1_min); 697 &dev_attr_fan1_input))
638 device_create_file(&new_client->dev, &dev_attr_fan1_div); 698 || (err = device_create_file(&new_client->dev,
699 &dev_attr_fan1_min))
700 || (err = device_create_file(&new_client->dev,
701 &dev_attr_fan1_div)))
702 goto exit_remove;
639 } 703 }
704
640 if (data->channel & CHAN_NO_FAN(1)) { 705 if (data->channel & CHAN_NO_FAN(1)) {
641 device_create_file(&new_client->dev, &dev_attr_in7_input); 706 if ((err = device_create_file(&new_client->dev,
642 device_create_file(&new_client->dev, &dev_attr_in7_min); 707 &dev_attr_in7_input))
643 device_create_file(&new_client->dev, &dev_attr_in7_max); 708 || (err = device_create_file(&new_client->dev,
709 &dev_attr_in7_min))
710 || (err = device_create_file(&new_client->dev,
711 &dev_attr_in7_max)))
712 goto exit_remove;
644 } else { 713 } else {
645 device_create_file(&new_client->dev, &dev_attr_fan2_input); 714 if ((err = device_create_file(&new_client->dev,
646 device_create_file(&new_client->dev, &dev_attr_fan2_min); 715 &dev_attr_fan2_input))
647 device_create_file(&new_client->dev, &dev_attr_fan2_div); 716 || (err = device_create_file(&new_client->dev,
717 &dev_attr_fan2_min))
718 || (err = device_create_file(&new_client->dev,
719 &dev_attr_fan2_div)))
720 goto exit_remove;
648 } 721 }
649 722
650 device_create_file(&new_client->dev, &dev_attr_temp1_input);
651 device_create_file(&new_client->dev, &dev_attr_temp1_max);
652 device_create_file(&new_client->dev, &dev_attr_temp1_min);
653 device_create_file(&new_client->dev, &dev_attr_temp1_crit);
654 device_create_file(&new_client->dev, &dev_attr_temp2_input);
655 device_create_file(&new_client->dev, &dev_attr_temp2_max);
656 device_create_file(&new_client->dev, &dev_attr_temp2_min);
657 device_create_file(&new_client->dev, &dev_attr_temp2_crit);
658
659 if (data->channel & CHAN_TEMP3) { 723 if (data->channel & CHAN_TEMP3) {
660 device_create_file(&new_client->dev, &dev_attr_temp3_input); 724 if ((err = device_create_file(&new_client->dev,
661 device_create_file(&new_client->dev, &dev_attr_temp3_max); 725 &dev_attr_temp3_input))
662 device_create_file(&new_client->dev, &dev_attr_temp3_min); 726 || (err = device_create_file(&new_client->dev,
663 device_create_file(&new_client->dev, &dev_attr_temp3_crit); 727 &dev_attr_temp3_max))
728 || (err = device_create_file(&new_client->dev,
729 &dev_attr_temp3_min))
730 || (err = device_create_file(&new_client->dev,
731 &dev_attr_temp3_crit)))
732 goto exit_remove;
664 } else { 733 } else {
665 device_create_file(&new_client->dev, &dev_attr_in0_input); 734 if ((err = device_create_file(&new_client->dev,
666 device_create_file(&new_client->dev, &dev_attr_in0_min); 735 &dev_attr_in0_input))
667 device_create_file(&new_client->dev, &dev_attr_in0_max); 736 || (err = device_create_file(&new_client->dev,
668 device_create_file(&new_client->dev, &dev_attr_in5_input); 737 &dev_attr_in0_min))
669 device_create_file(&new_client->dev, &dev_attr_in5_min); 738 || (err = device_create_file(&new_client->dev,
670 device_create_file(&new_client->dev, &dev_attr_in5_max); 739 &dev_attr_in0_max))
740 || (err = device_create_file(&new_client->dev,
741 &dev_attr_in5_input))
742 || (err = device_create_file(&new_client->dev,
743 &dev_attr_in5_min))
744 || (err = device_create_file(&new_client->dev,
745 &dev_attr_in5_max)))
746 goto exit_remove;
671 } 747 }
672 748
673 if (!(data->channel & CHAN_NO_VID)) { 749 if (!(data->channel & CHAN_NO_VID)) {
674 device_create_file(&new_client->dev, &dev_attr_cpu0_vid); 750 if ((err = device_create_file(&new_client->dev,
675 device_create_file(&new_client->dev, &dev_attr_vrm); 751 &dev_attr_cpu0_vid))
752 || (err = device_create_file(&new_client->dev,
753 &dev_attr_vrm)))
754 goto exit_remove;
676 } 755 }
677 756
678 device_create_file(&new_client->dev, &dev_attr_alarms); 757 data->class_dev = hwmon_device_register(&new_client->dev);
679 device_create_file(&new_client->dev, &dev_attr_aout_output); 758 if (IS_ERR(data->class_dev)) {
759 err = PTR_ERR(data->class_dev);
760 goto exit_remove;
761 }
680 762
681 return 0; 763 return 0;
682 764
765exit_remove:
766 sysfs_remove_group(&new_client->dev.kobj, &lm87_group);
767 sysfs_remove_group(&new_client->dev.kobj, &lm87_group_opt);
683exit_detach: 768exit_detach:
684 i2c_detach_client(new_client); 769 i2c_detach_client(new_client);
685exit_free: 770exit_free:
@@ -732,6 +817,8 @@ static int lm87_detach_client(struct i2c_client *client)
732 int err; 817 int err;
733 818
734 hwmon_device_unregister(data->class_dev); 819 hwmon_device_unregister(data->class_dev);
820 sysfs_remove_group(&client->dev.kobj, &lm87_group);
821 sysfs_remove_group(&client->dev.kobj, &lm87_group_opt);
735 822
736 if ((err = i2c_detach_client(client))) 823 if ((err = i2c_detach_client(client)))
737 return err; 824 return err;