aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hwmon/via686a.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/hwmon/via686a.c')
-rw-r--r--drivers/hwmon/via686a.c83
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}
571static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL); 572static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL);
572 573
574static 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
612static 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 */
575static struct i2c_driver via686a_driver = { 618static 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
707exit_remove_files:
708 sysfs_remove_group(&new_client->dev.kobj, &via686a_group);
693exit_detach: 709exit_detach:
694 i2c_detach_client(new_client); 710 i2c_detach_client(new_client);
695exit_free: 711exit_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;