diff options
Diffstat (limited to 'drivers/hwmon/w83627hf.c')
-rw-r--r-- | drivers/hwmon/w83627hf.c | 80 |
1 files changed, 33 insertions, 47 deletions
diff --git a/drivers/hwmon/w83627hf.c b/drivers/hwmon/w83627hf.c index bd87a42e068..02bd5c0239a 100644 --- a/drivers/hwmon/w83627hf.c +++ b/drivers/hwmon/w83627hf.c @@ -42,8 +42,10 @@ #include <linux/slab.h> #include <linux/jiffies.h> #include <linux/i2c.h> -#include <linux/i2c-sensor.h> -#include <linux/i2c-vid.h> +#include <linux/i2c-isa.h> +#include <linux/hwmon.h> +#include <linux/hwmon-vid.h> +#include <linux/err.h> #include <asm/io.h> #include "lm75.h" @@ -56,12 +58,11 @@ module_param(force_i2c, byte, 0); MODULE_PARM_DESC(force_i2c, "Initialize the i2c address of the sensors"); -/* Addresses to scan */ -static unsigned short normal_i2c[] = { I2C_CLIENT_END }; -static unsigned int normal_isa[] = { 0, I2C_CLIENT_ISA_END }; +/* The actual ISA address is read from Super-I/O configuration space */ +static unsigned short address; /* Insmod parameters */ -SENSORS_INSMOD_4(w83627hf, w83627thf, w83697hf, w83637hf); +enum chips { any_chip, w83627hf, w83627thf, w83697hf, w83637hf }; static int init = 1; module_param(init, bool, 0); @@ -277,6 +278,7 @@ static inline u8 DIV_TO_REG(long val) dynamically allocated, at the same time when a new client is allocated. */ struct w83627hf_data { struct i2c_client client; + struct class_device *class_dev; struct semaphore lock; enum chips type; @@ -314,9 +316,7 @@ struct w83627hf_data { }; -static int w83627hf_attach_adapter(struct i2c_adapter *adapter); -static int w83627hf_detect(struct i2c_adapter *adapter, int address, - int kind); +static int w83627hf_detect(struct i2c_adapter *adapter); static int w83627hf_detach_client(struct i2c_client *client); static int w83627hf_read_value(struct i2c_client *client, u16 register); @@ -328,9 +328,7 @@ static void w83627hf_init_client(struct i2c_client *client); static struct i2c_driver w83627hf_driver = { .owner = THIS_MODULE, .name = "w83627hf", - .id = I2C_DRIVERID_W83627HF, - .flags = I2C_DF_NOTIFY, - .attach_adapter = w83627hf_attach_adapter, + .attach_adapter = w83627hf_detect, .detach_client = w83627hf_detach_client, }; @@ -959,16 +957,7 @@ device_create_file(&client->dev, &dev_attr_temp##offset##_type); \ } while (0) -/* This function is called when: - * w83627hf_driver is inserted (when this module is loaded), for each - available adapter - * when a new adapter is inserted (and w83627hf_driver is still present) */ -static int w83627hf_attach_adapter(struct i2c_adapter *adapter) -{ - return i2c_detect(adapter, &addr_data, w83627hf_detect); -} - -static int w83627hf_find(int sioaddr, int *address) +static int __init w83627hf_find(int sioaddr, unsigned short *addr) { u16 val; @@ -988,32 +977,24 @@ static int w83627hf_find(int sioaddr, int *address) superio_select(W83627HF_LD_HWM); val = (superio_inb(WINB_BASE_REG) << 8) | superio_inb(WINB_BASE_REG + 1); - *address = val & ~(WINB_EXTENT - 1); - if (*address == 0 && force_addr == 0) { + *addr = val & ~(WINB_EXTENT - 1); + if (*addr == 0 && force_addr == 0) { superio_exit(); return -ENODEV; } - if (force_addr) - *address = force_addr; /* so detect will get called */ superio_exit(); return 0; } -int w83627hf_detect(struct i2c_adapter *adapter, int address, - int kind) +static int w83627hf_detect(struct i2c_adapter *adapter) { - int val; + int val, kind; struct i2c_client *new_client; struct w83627hf_data *data; int err = 0; const char *client_name = ""; - if (!i2c_is_isa_adapter(adapter)) { - err = -ENODEV; - goto ERROR0; - } - if(force_addr) address = force_addr & ~(WINB_EXTENT - 1); @@ -1102,6 +1083,12 @@ int w83627hf_detect(struct i2c_adapter *adapter, int address, data->fan_min[2] = w83627hf_read_value(new_client, W83781D_REG_FAN_MIN(3)); /* 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 ERROR3; + } + device_create_file_in(new_client, 0); if (kind != w83697hf) device_create_file_in(new_client, 1); @@ -1152,6 +1139,8 @@ int w83627hf_detect(struct i2c_adapter *adapter, int address, return 0; + ERROR3: + i2c_detach_client(new_client); ERROR2: kfree(data); ERROR1: @@ -1162,16 +1151,16 @@ int w83627hf_detect(struct i2c_adapter *adapter, int address, static int w83627hf_detach_client(struct i2c_client *client) { + struct w83627hf_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; - } release_region(client->addr, WINB_EXTENT); - kfree(i2c_get_clientdata(client)); + kfree(data); return 0; } @@ -1327,7 +1316,7 @@ static void w83627hf_init_client(struct i2c_client *client) data->vrm = (data->vrm_ovt & 0x01) ? 90 : 82; } else { /* Convert VID to voltage based on default VRM */ - data->vrm = i2c_which_vrm(); + data->vrm = vid_which_vrm(); } tmp = w83627hf_read_value(client, W83781D_REG_SCFG1); @@ -1485,20 +1474,17 @@ static struct w83627hf_data *w83627hf_update_device(struct device *dev) static int __init sensors_w83627hf_init(void) { - int addr; - - if (w83627hf_find(0x2e, &addr) - && w83627hf_find(0x4e, &addr)) { + if (w83627hf_find(0x2e, &address) + && w83627hf_find(0x4e, &address)) { return -ENODEV; } - normal_isa[0] = addr; - return i2c_add_driver(&w83627hf_driver); + return i2c_isa_add_driver(&w83627hf_driver); } static void __exit sensors_w83627hf_exit(void) { - i2c_del_driver(&w83627hf_driver); + i2c_isa_del_driver(&w83627hf_driver); } MODULE_AUTHOR("Frodo Looijaard <frodol@dds.nl>, " |