aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hwmon/adm1031.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/hwmon/adm1031.c')
-rw-r--r--drivers/hwmon/adm1031.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/drivers/hwmon/adm1031.c b/drivers/hwmon/adm1031.c
index 936250957270..ac3b1542556e 100644
--- a/drivers/hwmon/adm1031.c
+++ b/drivers/hwmon/adm1031.c
@@ -27,6 +27,8 @@
27#include <linux/jiffies.h> 27#include <linux/jiffies.h>
28#include <linux/i2c.h> 28#include <linux/i2c.h>
29#include <linux/i2c-sensor.h> 29#include <linux/i2c-sensor.h>
30#include <linux/hwmon.h>
31#include <linux/err.h>
30 32
31/* Following macros takes channel parameter starting from 0 to 2 */ 33/* Following macros takes channel parameter starting from 0 to 2 */
32#define ADM1031_REG_FAN_SPEED(nr) (0x08 + (nr)) 34#define ADM1031_REG_FAN_SPEED(nr) (0x08 + (nr))
@@ -69,6 +71,7 @@ typedef u8 auto_chan_table_t[8][2];
69/* Each client has this additional data */ 71/* Each client has this additional data */
70struct adm1031_data { 72struct adm1031_data {
71 struct i2c_client client; 73 struct i2c_client client;
74 struct class_device *class_dev;
72 struct semaphore update_lock; 75 struct semaphore update_lock;
73 int chip_type; 76 int chip_type;
74 char valid; /* !=0 if following fields are valid */ 77 char valid; /* !=0 if following fields are valid */
@@ -788,6 +791,12 @@ static int adm1031_detect(struct i2c_adapter *adapter, int address, int kind)
788 adm1031_init_client(new_client); 791 adm1031_init_client(new_client);
789 792
790 /* Register sysfs hooks */ 793 /* Register sysfs hooks */
794 data->class_dev = hwmon_device_register(&new_client->dev);
795 if (IS_ERR(data->class_dev)) {
796 err = PTR_ERR(data->class_dev);
797 goto exit_detach;
798 }
799
791 device_create_file(&new_client->dev, &dev_attr_fan1_input); 800 device_create_file(&new_client->dev, &dev_attr_fan1_input);
792 device_create_file(&new_client->dev, &dev_attr_fan1_div); 801 device_create_file(&new_client->dev, &dev_attr_fan1_div);
793 device_create_file(&new_client->dev, &dev_attr_fan1_min); 802 device_create_file(&new_client->dev, &dev_attr_fan1_min);
@@ -833,6 +842,8 @@ static int adm1031_detect(struct i2c_adapter *adapter, int address, int kind)
833 842
834 return 0; 843 return 0;
835 844
845exit_detach:
846 i2c_detach_client(new_client);
836exit_free: 847exit_free:
837 kfree(data); 848 kfree(data);
838exit: 849exit:
@@ -841,11 +852,14 @@ exit:
841 852
842static int adm1031_detach_client(struct i2c_client *client) 853static int adm1031_detach_client(struct i2c_client *client)
843{ 854{
855 struct adm1031_data *data = i2c_get_clientdata(client);
844 int ret; 856 int ret;
857
858 hwmon_device_unregister(data->class_dev);
845 if ((ret = i2c_detach_client(client)) != 0) { 859 if ((ret = i2c_detach_client(client)) != 0) {
846 return ret; 860 return ret;
847 } 861 }
848 kfree(i2c_get_clientdata(client)); 862 kfree(data);
849 return 0; 863 return 0;
850} 864}
851 865