diff options
Diffstat (limited to 'drivers/hwmon/via686a.c')
-rw-r--r-- | drivers/hwmon/via686a.c | 83 |
1 files changed, 50 insertions, 33 deletions
diff --git a/drivers/hwmon/via686a.c b/drivers/hwmon/via686a.c index 95ae056e5a94..f8acada0537a 100644 --- a/drivers/hwmon/via686a.c +++ b/drivers/hwmon/via686a.c | |||
@@ -40,6 +40,7 @@ | |||
40 | #include <linux/err.h> | 40 | #include <linux/err.h> |
41 | #include <linux/init.h> | 41 | #include <linux/init.h> |
42 | #include <linux/mutex.h> | 42 | #include <linux/mutex.h> |
43 | #include <linux/sysfs.h> | ||
43 | #include <asm/io.h> | 44 | #include <asm/io.h> |
44 | 45 | ||
45 | 46 | ||
@@ -570,6 +571,48 @@ static ssize_t show_alarms(struct device *dev, struct device_attribute *attr, ch | |||
570 | } | 571 | } |
571 | static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL); | 572 | static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL); |
572 | 573 | ||
574 | static struct attribute *via686a_attributes[] = { | ||
575 | &dev_attr_in0_input.attr, | ||
576 | &dev_attr_in1_input.attr, | ||
577 | &dev_attr_in2_input.attr, | ||
578 | &dev_attr_in3_input.attr, | ||
579 | &dev_attr_in4_input.attr, | ||
580 | &dev_attr_in0_min.attr, | ||
581 | &dev_attr_in1_min.attr, | ||
582 | &dev_attr_in2_min.attr, | ||
583 | &dev_attr_in3_min.attr, | ||
584 | &dev_attr_in4_min.attr, | ||
585 | &dev_attr_in0_max.attr, | ||
586 | &dev_attr_in1_max.attr, | ||
587 | &dev_attr_in2_max.attr, | ||
588 | &dev_attr_in3_max.attr, | ||
589 | &dev_attr_in4_max.attr, | ||
590 | |||
591 | &dev_attr_temp1_input.attr, | ||
592 | &dev_attr_temp2_input.attr, | ||
593 | &dev_attr_temp3_input.attr, | ||
594 | &dev_attr_temp1_max.attr, | ||
595 | &dev_attr_temp2_max.attr, | ||
596 | &dev_attr_temp3_max.attr, | ||
597 | &dev_attr_temp1_max_hyst.attr, | ||
598 | &dev_attr_temp2_max_hyst.attr, | ||
599 | &dev_attr_temp3_max_hyst.attr, | ||
600 | |||
601 | &dev_attr_fan1_input.attr, | ||
602 | &dev_attr_fan2_input.attr, | ||
603 | &dev_attr_fan1_min.attr, | ||
604 | &dev_attr_fan2_min.attr, | ||
605 | &dev_attr_fan1_div.attr, | ||
606 | &dev_attr_fan2_div.attr, | ||
607 | |||
608 | &dev_attr_alarms.attr, | ||
609 | NULL | ||
610 | }; | ||
611 | |||
612 | static const struct attribute_group via686a_group = { | ||
613 | .attrs = via686a_attributes, | ||
614 | }; | ||
615 | |||
573 | /* The driver. I choose to use type i2c_driver, as at is identical to both | 616 | /* The driver. I choose to use type i2c_driver, as at is identical to both |
574 | smbus_driver and isa_driver, and clients could be of either kind */ | 617 | smbus_driver and isa_driver, and clients could be of either kind */ |
575 | static struct i2c_driver via686a_driver = { | 618 | static struct i2c_driver via686a_driver = { |
@@ -650,46 +693,19 @@ static int via686a_detect(struct i2c_adapter *adapter) | |||
650 | via686a_init_client(new_client); | 693 | via686a_init_client(new_client); |
651 | 694 | ||
652 | /* Register sysfs hooks */ | 695 | /* Register sysfs hooks */ |
696 | if ((err = sysfs_create_group(&new_client->dev.kobj, &via686a_group))) | ||
697 | goto exit_detach; | ||
698 | |||
653 | data->class_dev = hwmon_device_register(&new_client->dev); | 699 | data->class_dev = hwmon_device_register(&new_client->dev); |
654 | if (IS_ERR(data->class_dev)) { | 700 | if (IS_ERR(data->class_dev)) { |
655 | err = PTR_ERR(data->class_dev); | 701 | err = PTR_ERR(data->class_dev); |
656 | goto exit_detach; | 702 | goto exit_remove_files; |
657 | } | 703 | } |
658 | 704 | ||
659 | device_create_file(&new_client->dev, &dev_attr_in0_input); | ||
660 | device_create_file(&new_client->dev, &dev_attr_in1_input); | ||
661 | device_create_file(&new_client->dev, &dev_attr_in2_input); | ||
662 | device_create_file(&new_client->dev, &dev_attr_in3_input); | ||
663 | device_create_file(&new_client->dev, &dev_attr_in4_input); | ||
664 | device_create_file(&new_client->dev, &dev_attr_in0_min); | ||
665 | device_create_file(&new_client->dev, &dev_attr_in1_min); | ||
666 | device_create_file(&new_client->dev, &dev_attr_in2_min); | ||
667 | device_create_file(&new_client->dev, &dev_attr_in3_min); | ||
668 | device_create_file(&new_client->dev, &dev_attr_in4_min); | ||
669 | device_create_file(&new_client->dev, &dev_attr_in0_max); | ||
670 | device_create_file(&new_client->dev, &dev_attr_in1_max); | ||
671 | device_create_file(&new_client->dev, &dev_attr_in2_max); | ||
672 | device_create_file(&new_client->dev, &dev_attr_in3_max); | ||
673 | device_create_file(&new_client->dev, &dev_attr_in4_max); | ||
674 | device_create_file(&new_client->dev, &dev_attr_temp1_input); | ||
675 | device_create_file(&new_client->dev, &dev_attr_temp2_input); | ||
676 | device_create_file(&new_client->dev, &dev_attr_temp3_input); | ||
677 | device_create_file(&new_client->dev, &dev_attr_temp1_max); | ||
678 | device_create_file(&new_client->dev, &dev_attr_temp2_max); | ||
679 | device_create_file(&new_client->dev, &dev_attr_temp3_max); | ||
680 | device_create_file(&new_client->dev, &dev_attr_temp1_max_hyst); | ||
681 | device_create_file(&new_client->dev, &dev_attr_temp2_max_hyst); | ||
682 | device_create_file(&new_client->dev, &dev_attr_temp3_max_hyst); | ||
683 | device_create_file(&new_client->dev, &dev_attr_fan1_input); | ||
684 | device_create_file(&new_client->dev, &dev_attr_fan2_input); | ||
685 | device_create_file(&new_client->dev, &dev_attr_fan1_min); | ||
686 | device_create_file(&new_client->dev, &dev_attr_fan2_min); | ||
687 | device_create_file(&new_client->dev, &dev_attr_fan1_div); | ||
688 | device_create_file(&new_client->dev, &dev_attr_fan2_div); | ||
689 | device_create_file(&new_client->dev, &dev_attr_alarms); | ||
690 | |||
691 | return 0; | 705 | return 0; |
692 | 706 | ||
707 | exit_remove_files: | ||
708 | sysfs_remove_group(&new_client->dev.kobj, &via686a_group); | ||
693 | exit_detach: | 709 | exit_detach: |
694 | i2c_detach_client(new_client); | 710 | i2c_detach_client(new_client); |
695 | exit_free: | 711 | exit_free: |
@@ -705,6 +721,7 @@ static int via686a_detach_client(struct i2c_client *client) | |||
705 | int err; | 721 | int err; |
706 | 722 | ||
707 | hwmon_device_unregister(data->class_dev); | 723 | hwmon_device_unregister(data->class_dev); |
724 | sysfs_remove_group(&client->dev.kobj, &via686a_group); | ||
708 | 725 | ||
709 | if ((err = i2c_detach_client(client))) | 726 | if ((err = i2c_detach_client(client))) |
710 | return err; | 727 | return err; |