diff options
Diffstat (limited to 'drivers/hwmon')
39 files changed, 3222 insertions, 1026 deletions
diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig index 140d5f851a5..138dc50270e 100644 --- a/drivers/hwmon/Kconfig +++ b/drivers/hwmon/Kconfig @@ -12,12 +12,20 @@ config HWMON of a system. Most modern motherboards include such a device. It can include temperature sensors, voltage sensors, fan speed sensors and various additional features such as the ability to - control the speed of the fans. + control the speed of the fans. If you want this support you + should say Y here and also to the specific driver(s) for your + sensors chip(s) below. + + This support can also be built as a module. If so, the module + will be called hwmon. + +config HWMON_VID + tristate + default n config SENSORS_ADM1021 tristate "Analog Devices ADM1021 and compatibles" depends on HWMON && I2C - select I2C_SENSOR help If you say yes here you get support for Analog Devices ADM1021 and ADM1023 sensor chips and clones: Maxim MAX1617 and MAX1617A, @@ -30,7 +38,7 @@ config SENSORS_ADM1021 config SENSORS_ADM1025 tristate "Analog Devices ADM1025 and compatibles" depends on HWMON && I2C && EXPERIMENTAL - select I2C_SENSOR + select HWMON_VID help If you say yes here you get support for Analog Devices ADM1025 and Philips NE1619 sensor chips. @@ -41,7 +49,7 @@ config SENSORS_ADM1025 config SENSORS_ADM1026 tristate "Analog Devices ADM1026 and compatibles" depends on HWMON && I2C && EXPERIMENTAL - select I2C_SENSOR + select HWMON_VID help If you say yes here you get support for Analog Devices ADM1026 sensor chip. @@ -52,7 +60,6 @@ config SENSORS_ADM1026 config SENSORS_ADM1031 tristate "Analog Devices ADM1031 and compatibles" depends on HWMON && I2C && EXPERIMENTAL - select I2C_SENSOR help If you say yes here you get support for Analog Devices ADM1031 and ADM1030 sensor chips. @@ -63,7 +70,7 @@ config SENSORS_ADM1031 config SENSORS_ADM9240 tristate "Analog Devices ADM9240 and compatibles" depends on HWMON && I2C && EXPERIMENTAL - select I2C_SENSOR + select HWMON_VID help If you say yes here you get support for Analog Devices ADM9240, Dallas DS1780, National Semiconductor LM81 sensor chips. @@ -74,7 +81,7 @@ config SENSORS_ADM9240 config SENSORS_ASB100 tristate "Asus ASB100 Bach" depends on HWMON && I2C && EXPERIMENTAL - select I2C_SENSOR + select HWMON_VID help If you say yes here you get support for the ASB100 Bach sensor chip found on some Asus mainboards. @@ -85,7 +92,7 @@ config SENSORS_ASB100 config SENSORS_ATXP1 tristate "Attansic ATXP1 VID controller" depends on HWMON && I2C && EXPERIMENTAL - select I2C_SENSOR + select HWMON_VID help If you say yes here you get support for the Attansic ATXP1 VID controller. @@ -99,7 +106,6 @@ config SENSORS_ATXP1 config SENSORS_DS1621 tristate "Dallas Semiconductor DS1621 and DS1625" depends on HWMON && I2C && EXPERIMENTAL - select I2C_SENSOR help If you say yes here you get support for Dallas Semiconductor DS1621 and DS1625 sensor chips. @@ -110,7 +116,6 @@ config SENSORS_DS1621 config SENSORS_FSCHER tristate "FSC Hermes" depends on HWMON && I2C && EXPERIMENTAL - select I2C_SENSOR help If you say yes here you get support for Fujitsu Siemens Computers Hermes sensor chips. @@ -121,7 +126,6 @@ config SENSORS_FSCHER config SENSORS_FSCPOS tristate "FSC Poseidon" depends on HWMON && I2C && EXPERIMENTAL - select I2C_SENSOR help If you say yes here you get support for Fujitsu Siemens Computers Poseidon sensor chips. @@ -132,7 +136,6 @@ config SENSORS_FSCPOS config SENSORS_GL518SM tristate "Genesys Logic GL518SM" depends on HWMON && I2C - select I2C_SENSOR help If you say yes here you get support for Genesys Logic GL518SM sensor chips. @@ -143,7 +146,7 @@ config SENSORS_GL518SM config SENSORS_GL520SM tristate "Genesys Logic GL520SM" depends on HWMON && I2C && EXPERIMENTAL - select I2C_SENSOR + select HWMON_VID help If you say yes here you get support for Genesys Logic GL520SM sensor chips. @@ -154,7 +157,8 @@ config SENSORS_GL520SM config SENSORS_IT87 tristate "ITE IT87xx and compatibles" depends on HWMON && I2C - select I2C_SENSOR + select I2C_ISA + select HWMON_VID help If you say yes here you get support for ITE IT87xx sensor chips and clones: SiS960. @@ -165,7 +169,6 @@ config SENSORS_IT87 config SENSORS_LM63 tristate "National Semiconductor LM63" depends on HWMON && I2C && EXPERIMENTAL - select I2C_SENSOR help If you say yes here you get support for the National Semiconductor LM63 remote diode digital temperature sensor with integrated fan @@ -178,7 +181,6 @@ config SENSORS_LM63 config SENSORS_LM75 tristate "National Semiconductor LM75 and compatibles" depends on HWMON && I2C - select I2C_SENSOR help If you say yes here you get support for National Semiconductor LM75 sensor chips and clones: Dallas Semiconductor DS75 and DS1775 (in @@ -194,7 +196,6 @@ config SENSORS_LM75 config SENSORS_LM77 tristate "National Semiconductor LM77" depends on HWMON && I2C && EXPERIMENTAL - select I2C_SENSOR help If you say yes here you get support for National Semiconductor LM77 sensor chips. @@ -205,7 +206,8 @@ config SENSORS_LM77 config SENSORS_LM78 tristate "National Semiconductor LM78 and compatibles" depends on HWMON && I2C && EXPERIMENTAL - select I2C_SENSOR + select I2C_ISA + select HWMON_VID help If you say yes here you get support for National Semiconductor LM78, LM78-J and LM79. @@ -216,7 +218,6 @@ config SENSORS_LM78 config SENSORS_LM80 tristate "National Semiconductor LM80" depends on HWMON && I2C && EXPERIMENTAL - select I2C_SENSOR help If you say yes here you get support for National Semiconductor LM80 sensor chips. @@ -227,7 +228,6 @@ config SENSORS_LM80 config SENSORS_LM83 tristate "National Semiconductor LM83" depends on HWMON && I2C - select I2C_SENSOR help If you say yes here you get support for National Semiconductor LM83 sensor chips. @@ -238,7 +238,7 @@ config SENSORS_LM83 config SENSORS_LM85 tristate "National Semiconductor LM85 and compatibles" depends on HWMON && I2C && EXPERIMENTAL - select I2C_SENSOR + select HWMON_VID help If you say yes here you get support for National Semiconductor LM85 sensor chips and clones: ADT7463, EMC6D100, EMC6D102 and ADM1027. @@ -249,7 +249,7 @@ config SENSORS_LM85 config SENSORS_LM87 tristate "National Semiconductor LM87" depends on HWMON && I2C && EXPERIMENTAL - select I2C_SENSOR + select HWMON_VID help If you say yes here you get support for National Semiconductor LM87 sensor chips. @@ -260,7 +260,6 @@ config SENSORS_LM87 config SENSORS_LM90 tristate "National Semiconductor LM90 and compatibles" depends on HWMON && I2C - select I2C_SENSOR help If you say yes here you get support for National Semiconductor LM90, LM86, LM89 and LM99, Analog Devices ADM1032 and Maxim MAX6657 and @@ -275,7 +274,6 @@ config SENSORS_LM90 config SENSORS_LM92 tristate "National Semiconductor LM92 and compatibles" depends on HWMON && I2C && EXPERIMENTAL - select I2C_SENSOR help If you say yes here you get support for National Semiconductor LM92 and Maxim MAX6635 sensor chips. @@ -286,7 +284,6 @@ config SENSORS_LM92 config SENSORS_MAX1619 tristate "Maxim MAX1619 sensor chip" depends on HWMON && I2C && EXPERIMENTAL - select I2C_SENSOR help If you say yes here you get support for MAX1619 sensor chip. @@ -296,8 +293,8 @@ config SENSORS_MAX1619 config SENSORS_PC87360 tristate "National Semiconductor PC87360 family" depends on HWMON && I2C && EXPERIMENTAL - select I2C_SENSOR select I2C_ISA + select HWMON_VID help If you say yes here you get access to the hardware monitoring functions of the National Semiconductor PC8736x Super-I/O chips. @@ -311,7 +308,6 @@ config SENSORS_PC87360 config SENSORS_SIS5595 tristate "Silicon Integrated Systems Corp. SiS5595" depends on HWMON && I2C && PCI && EXPERIMENTAL - select I2C_SENSOR select I2C_ISA help If you say yes here you get support for the integrated sensors in @@ -323,7 +319,6 @@ config SENSORS_SIS5595 config SENSORS_SMSC47M1 tristate "SMSC LPC47M10x and compatibles" depends on HWMON && I2C && EXPERIMENTAL - select I2C_SENSOR select I2C_ISA help If you say yes here you get support for the integrated fan @@ -336,7 +331,6 @@ config SENSORS_SMSC47M1 config SENSORS_SMSC47B397 tristate "SMSC LPC47B397-NC" depends on HWMON && I2C && EXPERIMENTAL - select I2C_SENSOR select I2C_ISA help If you say yes here you get support for the SMSC LPC47B397-NC @@ -348,7 +342,6 @@ config SENSORS_SMSC47B397 config SENSORS_VIA686A tristate "VIA686A" depends on HWMON && I2C && PCI - select I2C_SENSOR select I2C_ISA help If you say yes here you get support for the integrated sensors in @@ -360,7 +353,8 @@ config SENSORS_VIA686A config SENSORS_W83781D tristate "Winbond W83781D, W83782D, W83783S, W83627HF, Asus AS99127F" depends on HWMON && I2C - select I2C_SENSOR + select I2C_ISA + select HWMON_VID help If you say yes here you get support for the Winbond W8378x series of sensor chips: the W83781D, W83782D, W83783S and W83627HF, @@ -369,10 +363,18 @@ config SENSORS_W83781D This driver can also be built as a module. If so, the module will be called w83781d. +config SENSORS_W83792D + tristate "Winbond W83792D" + depends on HWMON && I2C && EXPERIMENTAL + help + If you say yes here you get support for the Winbond W83792D chip. + + This driver can also be built as a module. If so, the module + will be called w83792d. + config SENSORS_W83L785TS tristate "Winbond W83L785TS-S" depends on HWMON && I2C && EXPERIMENTAL - select I2C_SENSOR help If you say yes here you get support for the Winbond W83L785TS-S sensor chip, which is used on the Asus A7N8X, among other @@ -384,8 +386,8 @@ config SENSORS_W83L785TS config SENSORS_W83627HF tristate "Winbond W83627HF, W83627THF, W83637HF, W83697HF" depends on HWMON && I2C && EXPERIMENTAL - select I2C_SENSOR select I2C_ISA + select HWMON_VID help If you say yes here you get support for the Winbond W836X7 series of sensor chips: the W83627HF, W83627THF, W83637HF, and the W83697HF @@ -396,7 +398,6 @@ config SENSORS_W83627HF config SENSORS_W83627EHF tristate "Winbond W83627EHF" depends on HWMON && I2C && EXPERIMENTAL - select I2C_SENSOR select I2C_ISA help If you say yes here you get preliminary support for the hardware @@ -404,6 +405,9 @@ config SENSORS_W83627EHF Only fan and temperature inputs are supported at the moment, while the chip does much more than that. + This driver also supports the W83627EHG, which is the lead-free + version of the W83627EHF. + This driver can also be built as a module. If so, the module will be called w83627ehf. diff --git a/drivers/hwmon/Makefile b/drivers/hwmon/Makefile index 2781403a023..381f1bf04cc 100644 --- a/drivers/hwmon/Makefile +++ b/drivers/hwmon/Makefile @@ -2,9 +2,13 @@ # Makefile for sensor chip drivers. # +obj-$(CONFIG_HWMON) += hwmon.o +obj-$(CONFIG_HWMON_VID) += hwmon-vid.o + # asb100, then w83781d go first, as they can override other drivers' addresses. obj-$(CONFIG_SENSORS_ASB100) += asb100.o obj-$(CONFIG_SENSORS_W83627HF) += w83627hf.o +obj-$(CONFIG_SENSORS_W83792D) += w83792d.o obj-$(CONFIG_SENSORS_W83781D) += w83781d.o obj-$(CONFIG_SENSORS_ADM1021) += adm1021.o diff --git a/drivers/hwmon/adm1021.c b/drivers/hwmon/adm1021.c index d2c774c32f4..e928cdb041c 100644 --- a/drivers/hwmon/adm1021.c +++ b/drivers/hwmon/adm1021.c @@ -24,7 +24,8 @@ #include <linux/slab.h> #include <linux/jiffies.h> #include <linux/i2c.h> -#include <linux/i2c-sensor.h> +#include <linux/hwmon.h> +#include <linux/err.h> /* Addresses to scan */ @@ -32,10 +33,9 @@ static unsigned short normal_i2c[] = { 0x18, 0x19, 0x1a, 0x29, 0x2a, 0x2b, 0x4c, 0x4d, 0x4e, I2C_CLIENT_END }; -static unsigned int normal_isa[] = { I2C_CLIENT_ISA_END }; /* Insmod parameters */ -SENSORS_INSMOD_8(adm1021, adm1023, max1617, max1617a, thmc10, lm84, gl523sm, mc1066); +I2C_CLIENT_INSMOD_8(adm1021, adm1023, max1617, max1617a, thmc10, lm84, gl523sm, mc1066); /* adm1021 constants specified below */ @@ -89,6 +89,7 @@ clearing it. Weird, ey? --Phil */ /* Each client has this additional data */ struct adm1021_data { struct i2c_client client; + struct class_device *class_dev; enum chips type; struct semaphore update_lock; @@ -185,7 +186,7 @@ static int adm1021_attach_adapter(struct i2c_adapter *adapter) { if (!(adapter->class & I2C_CLASS_HWMON)) return 0; - return i2c_detect(adapter, &addr_data, adm1021_detect); + return i2c_probe(adapter, &addr_data, adm1021_detect); } static int adm1021_detect(struct i2c_adapter *adapter, int address, int kind) @@ -196,15 +197,6 @@ static int adm1021_detect(struct i2c_adapter *adapter, int address, int kind) int err = 0; const char *type_name = ""; - /* Make sure we aren't probing the ISA bus!! This is just a safety check - at this moment; i2c_detect really won't call us. */ -#ifdef DEBUG - if (i2c_is_isa_adapter(adapter)) { - dev_dbg(&adapter->dev, "adm1021_detect called for an ISA bus adapter?!?\n"); - return 0; - } -#endif - if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) goto error0; @@ -295,6 +287,12 @@ static int adm1021_detect(struct i2c_adapter *adapter, int address, int kind) adm1021_init_client(new_client); /* Register sysfs hooks */ + data->class_dev = hwmon_device_register(&new_client->dev); + if (IS_ERR(data->class_dev)) { + err = PTR_ERR(data->class_dev); + goto error2; + } + device_create_file(&new_client->dev, &dev_attr_temp1_max); device_create_file(&new_client->dev, &dev_attr_temp1_min); device_create_file(&new_client->dev, &dev_attr_temp1_input); @@ -305,6 +303,8 @@ static int adm1021_detect(struct i2c_adapter *adapter, int address, int kind) return 0; +error2: + i2c_detach_client(new_client); error1: kfree(data); error0: @@ -322,14 +322,15 @@ static void adm1021_init_client(struct i2c_client *client) static int adm1021_detach_client(struct i2c_client *client) { + struct adm1021_data *data = i2c_get_clientdata(client); int err; - if ((err = i2c_detach_client(client))) { - dev_err(&client->dev, "Client deregistration failed, client not detached.\n"); + hwmon_device_unregister(data->class_dev); + + if ((err = i2c_detach_client(client))) return err; - } - kfree(i2c_get_clientdata(client)); + kfree(data); return 0; } diff --git a/drivers/hwmon/adm1025.c b/drivers/hwmon/adm1025.c index e452d0daf90..526b7ff179e 100644 --- a/drivers/hwmon/adm1025.c +++ b/drivers/hwmon/adm1025.c @@ -50,8 +50,9 @@ #include <linux/slab.h> #include <linux/jiffies.h> #include <linux/i2c.h> -#include <linux/i2c-sensor.h> -#include <linux/i2c-vid.h> +#include <linux/hwmon.h> +#include <linux/hwmon-vid.h> +#include <linux/err.h> /* * Addresses to scan @@ -60,13 +61,12 @@ */ static unsigned short normal_i2c[] = { 0x2c, 0x2d, 0x2e, I2C_CLIENT_END }; -static unsigned int normal_isa[] = { I2C_CLIENT_ISA_END }; /* * Insmod parameters */ -SENSORS_INSMOD_2(adm1025, ne1619); +I2C_CLIENT_INSMOD_2(adm1025, ne1619); /* * The ADM1025 registers @@ -132,6 +132,7 @@ static struct i2c_driver adm1025_driver = { struct adm1025_data { struct i2c_client client; + struct class_device *class_dev; struct semaphore update_lock; char valid; /* zero until following fields are valid */ unsigned long last_updated; /* in jiffies */ @@ -312,7 +313,7 @@ static int adm1025_attach_adapter(struct i2c_adapter *adapter) { if (!(adapter->class & I2C_CLASS_HWMON)) return 0; - return i2c_detect(adapter, &addr_data, adm1025_detect); + return i2c_probe(adapter, &addr_data, adm1025_detect); } /* @@ -416,6 +417,12 @@ static int adm1025_detect(struct i2c_adapter *adapter, int address, int kind) adm1025_init_client(new_client); /* Register sysfs hooks */ + data->class_dev = hwmon_device_register(&new_client->dev); + if (IS_ERR(data->class_dev)) { + err = PTR_ERR(data->class_dev); + goto exit_detach; + } + device_create_file(&new_client->dev, &dev_attr_in0_input); device_create_file(&new_client->dev, &dev_attr_in1_input); device_create_file(&new_client->dev, &dev_attr_in2_input); @@ -452,6 +459,8 @@ static int adm1025_detect(struct i2c_adapter *adapter, int address, int kind) return 0; +exit_detach: + i2c_detach_client(new_client); exit_free: kfree(data); exit: @@ -464,7 +473,7 @@ static void adm1025_init_client(struct i2c_client *client) struct adm1025_data *data = i2c_get_clientdata(client); int i; - data->vrm = i2c_which_vrm(); + data->vrm = vid_which_vrm(); /* * Set high limits @@ -502,15 +511,15 @@ static void adm1025_init_client(struct i2c_client *client) static int adm1025_detach_client(struct i2c_client *client) { + struct adm1025_data *data = i2c_get_clientdata(client); int err; - if ((err = i2c_detach_client(client))) { - dev_err(&client->dev, "Client deregistration failed, " - "client not detached.\n"); + hwmon_device_unregister(data->class_dev); + + if ((err = i2c_detach_client(client))) return err; - } - kfree(i2c_get_clientdata(client)); + kfree(data); return 0; } diff --git a/drivers/hwmon/adm1026.c b/drivers/hwmon/adm1026.c index c8a7f47911f..625158110fd 100644 --- a/drivers/hwmon/adm1026.c +++ b/drivers/hwmon/adm1026.c @@ -28,16 +28,16 @@ #include <linux/slab.h> #include <linux/jiffies.h> #include <linux/i2c.h> -#include <linux/i2c-sensor.h> -#include <linux/i2c-vid.h> +#include <linux/hwmon.h> #include <linux/hwmon-sysfs.h> +#include <linux/hwmon-vid.h> +#include <linux/err.h> /* Addresses to scan */ static unsigned short normal_i2c[] = { 0x2c, 0x2d, 0x2e, I2C_CLIENT_END }; -static unsigned int normal_isa[] = { I2C_CLIENT_ISA_END }; /* Insmod parameters */ -SENSORS_INSMOD_1(adm1026); +I2C_CLIENT_INSMOD_1(adm1026); static int gpio_input[17] = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }; @@ -259,6 +259,7 @@ struct pwm_data { struct adm1026_data { struct i2c_client client; + struct class_device *class_dev; struct semaphore lock; enum chips type; @@ -319,13 +320,15 @@ int adm1026_attach_adapter(struct i2c_adapter *adapter) if (!(adapter->class & I2C_CLASS_HWMON)) { return 0; } - return i2c_detect(adapter, &addr_data, adm1026_detect); + return i2c_probe(adapter, &addr_data, adm1026_detect); } int adm1026_detach_client(struct i2c_client *client) { + struct adm1026_data *data = i2c_get_clientdata(client); + hwmon_device_unregister(data->class_dev); i2c_detach_client(client); - kfree(i2c_get_clientdata(client)); + kfree(data); return 0; } @@ -1549,12 +1552,18 @@ int adm1026_detect(struct i2c_adapter *adapter, int address, goto exitfree; /* Set the VRM version */ - data->vrm = i2c_which_vrm(); + data->vrm = vid_which_vrm(); /* Initialize the ADM1026 chip */ adm1026_init_client(new_client); /* Register sysfs hooks */ + data->class_dev = hwmon_device_register(&new_client->dev); + if (IS_ERR(data->class_dev)) { + err = PTR_ERR(data->class_dev); + goto exitdetach; + } + device_create_file(&new_client->dev, &sensor_dev_attr_in0_input.dev_attr); device_create_file(&new_client->dev, &sensor_dev_attr_in0_max.dev_attr); device_create_file(&new_client->dev, &sensor_dev_attr_in0_min.dev_attr); @@ -1690,6 +1699,8 @@ int adm1026_detect(struct i2c_adapter *adapter, int address, return 0; /* Error out and cleanup code */ +exitdetach: + i2c_detach_client(new_client); exitfree: kfree(data); exit: diff --git a/drivers/hwmon/adm1031.c b/drivers/hwmon/adm1031.c index 93625095727..58338ed7c8a 100644 --- a/drivers/hwmon/adm1031.c +++ b/drivers/hwmon/adm1031.c @@ -26,7 +26,8 @@ #include <linux/slab.h> #include <linux/jiffies.h> #include <linux/i2c.h> -#include <linux/i2c-sensor.h> +#include <linux/hwmon.h> +#include <linux/err.h> /* Following macros takes channel parameter starting from 0 to 2 */ #define ADM1031_REG_FAN_SPEED(nr) (0x08 + (nr)) @@ -59,16 +60,16 @@ /* Addresses to scan */ static unsigned short normal_i2c[] = { 0x2c, 0x2d, 0x2e, I2C_CLIENT_END }; -static unsigned int normal_isa[] = { I2C_CLIENT_ISA_END }; /* Insmod parameters */ -SENSORS_INSMOD_2(adm1030, adm1031); +I2C_CLIENT_INSMOD_2(adm1030, adm1031); typedef u8 auto_chan_table_t[8][2]; /* Each client has this additional data */ struct adm1031_data { struct i2c_client client; + struct class_device *class_dev; struct semaphore update_lock; int chip_type; char valid; /* !=0 if following fields are valid */ @@ -725,10 +726,10 @@ static int adm1031_attach_adapter(struct i2c_adapter *adapter) { if (!(adapter->class & I2C_CLASS_HWMON)) return 0; - return i2c_detect(adapter, &addr_data, adm1031_detect); + return i2c_probe(adapter, &addr_data, adm1031_detect); } -/* This function is called by i2c_detect */ +/* This function is called by i2c_probe */ static int adm1031_detect(struct i2c_adapter *adapter, int address, int kind) { struct i2c_client *new_client; @@ -788,6 +789,12 @@ static int adm1031_detect(struct i2c_adapter *adapter, int address, int kind) adm1031_init_client(new_client); /* Register sysfs hooks */ + data->class_dev = hwmon_device_register(&new_client->dev); + if (IS_ERR(data->class_dev)) { + err = PTR_ERR(data->class_dev); + goto exit_detach; + } + device_create_file(&new_client->dev, &dev_attr_fan1_input); device_create_file(&new_client->dev, &dev_attr_fan1_div); device_create_file(&new_client->dev, &dev_attr_fan1_min); @@ -833,6 +840,8 @@ static int adm1031_detect(struct i2c_adapter *adapter, int address, int kind) return 0; +exit_detach: + i2c_detach_client(new_client); exit_free: kfree(data); exit: @@ -841,11 +850,14 @@ exit: static int adm1031_detach_client(struct i2c_client *client) { + struct adm1031_data *data = i2c_get_clientdata(client); int ret; + + hwmon_device_unregister(data->class_dev); if ((ret = i2c_detach_client(client)) != 0) { return ret; } - kfree(i2c_get_clientdata(client)); + kfree(data); return 0; } diff --git a/drivers/hwmon/adm9240.c b/drivers/hwmon/adm9240.c index ce2a6eb93f6..bc7faef162f 100644 --- a/drivers/hwmon/adm9240.c +++ b/drivers/hwmon/adm9240.c @@ -45,17 +45,16 @@ #include <linux/module.h> #include <linux/slab.h> #include <linux/i2c.h> -#include <linux/i2c-sensor.h> -#include <linux/i2c-vid.h> +#include <linux/hwmon.h> +#include <linux/hwmon-vid.h> +#include <linux/err.h> /* Addresses to scan */ static unsigned short normal_i2c[] = { 0x2c, 0x2d, 0x2e, 0x2f, I2C_CLIENT_END }; -static unsigned int normal_isa[] = { I2C_CLIENT_ISA_END }; - /* Insmod parameters */ -SENSORS_INSMOD_3(adm9240, ds1780, lm81); +I2C_CLIENT_INSMOD_3(adm9240, ds1780, lm81); /* ADM9240 registers */ #define ADM9240_REG_MAN_ID 0x3e @@ -150,6 +149,7 @@ static struct i2c_driver adm9240_driver = { struct adm9240_data { enum chips type; struct i2c_client client; + struct class_device *class_dev; struct semaphore update_lock; char valid; unsigned long last_updated_measure; @@ -582,6 +582,12 @@ static int adm9240_detect(struct i2c_adapter *adapter, int address, int kind) adm9240_init_client(new_client); /* populate sysfs filesystem */ + data->class_dev = hwmon_device_register(&new_client->dev); + if (IS_ERR(data->class_dev)) { + err = PTR_ERR(data->class_dev); + goto exit_detach; + } + device_create_file(&new_client->dev, &dev_attr_in0_input); device_create_file(&new_client->dev, &dev_attr_in0_min); device_create_file(&new_client->dev, &dev_attr_in0_max); @@ -615,6 +621,9 @@ static int adm9240_detect(struct i2c_adapter *adapter, int address, int kind) device_create_file(&new_client->dev, &dev_attr_cpu0_vid); return 0; + +exit_detach: + i2c_detach_client(new_client); exit_free: kfree(data); exit: @@ -625,20 +634,20 @@ static int adm9240_attach_adapter(struct i2c_adapter *adapter) { if (!(adapter->class & I2C_CLASS_HWMON)) return 0; - return i2c_detect(adapter, &addr_data, adm9240_detect); + return i2c_probe(adapter, &addr_data, adm9240_detect); } static int adm9240_detach_client(struct i2c_client *client) { + struct adm9240_data *data = i2c_get_clientdata(client); int err; - if ((err = i2c_detach_client(client))) { - dev_err(&client->dev, "Client deregistration failed, " - "client not detached.\n"); + hwmon_device_unregister(data->class_dev); + + if ((err = i2c_detach_client(client))) return err; - } - kfree(i2c_get_clientdata(client)); + kfree(data); return 0; } @@ -648,7 +657,7 @@ static void adm9240_init_client(struct i2c_client *client) u8 conf = adm9240_read_value(client, ADM9240_REG_CONFIG); u8 mode = adm9240_read_value(client, ADM9240_REG_TEMP_CONF) & 3; |