diff options
author | Jean Delvare <khali@linux-fr.org> | 2005-07-19 17:56:35 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2005-09-05 12:14:10 -0400 |
commit | 2d8672c5a6ba0d3f1d8d3ad61ef67868941364f0 (patch) | |
tree | f01f038198bad63fee4c7d23af806ad0ab4e5071 /drivers/hwmon/w83627hf.c | |
parent | 5042c7d752fe72c6924037058367f63902e68c5c (diff) |
[PATCH] I2C: Separate non-i2c hwmon drivers from i2c-core (5/9)
Call the ISA chip drivers detection function directly instead of relying
on i2c_detect. The net effect is that address lists won't be handled
anymore, but they were mostly useless in the ISA case anyway (pc87360,
smsc47m1, smsc47b397 had already dropped them).
We don't need to handle multiple devices, all we may need is a way to
force a given address instead of the original one (some drivers already
do: sis5595, via686a, w83627hf), and, for drivers supporting multiple
chips, a way to force one given kind. All this may be added later on
demand, but I actually don't think there will be much demand.
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/hwmon/w83627hf.c')
-rw-r--r-- | drivers/hwmon/w83627hf.c | 49 |
1 files changed, 12 insertions, 37 deletions
diff --git a/drivers/hwmon/w83627hf.c b/drivers/hwmon/w83627hf.c index a2c7cea502cb..9e31f5559ccc 100644 --- a/drivers/hwmon/w83627hf.c +++ b/drivers/hwmon/w83627hf.c | |||
@@ -59,12 +59,11 @@ module_param(force_i2c, byte, 0); | |||
59 | MODULE_PARM_DESC(force_i2c, | 59 | MODULE_PARM_DESC(force_i2c, |
60 | "Initialize the i2c address of the sensors"); | 60 | "Initialize the i2c address of the sensors"); |
61 | 61 | ||
62 | /* Addresses to scan */ | 62 | /* The actual ISA address is read from Super-I/O configuration space */ |
63 | static unsigned short normal_i2c[] = { I2C_CLIENT_END }; | 63 | static unsigned short address; |
64 | static unsigned int normal_isa[] = { 0, I2C_CLIENT_ISA_END }; | ||
65 | 64 | ||
66 | /* Insmod parameters */ | 65 | /* Insmod parameters */ |
67 | SENSORS_INSMOD_4(w83627hf, w83627thf, w83697hf, w83637hf); | 66 | enum chips { any_chip, w83627hf, w83627thf, w83697hf, w83637hf }; |
68 | 67 | ||
69 | static int init = 1; | 68 | static int init = 1; |
70 | module_param(init, bool, 0); | 69 | module_param(init, bool, 0); |
@@ -318,9 +317,7 @@ struct w83627hf_data { | |||
318 | }; | 317 | }; |
319 | 318 | ||
320 | 319 | ||
321 | static int w83627hf_attach_adapter(struct i2c_adapter *adapter); | 320 | static int w83627hf_detect(struct i2c_adapter *adapter); |
322 | static int w83627hf_detect(struct i2c_adapter *adapter, int address, | ||
323 | int kind); | ||
324 | static int w83627hf_detach_client(struct i2c_client *client); | 321 | static int w83627hf_detach_client(struct i2c_client *client); |
325 | 322 | ||
326 | static int w83627hf_read_value(struct i2c_client *client, u16 register); | 323 | static int w83627hf_read_value(struct i2c_client *client, u16 register); |
@@ -332,9 +329,7 @@ static void w83627hf_init_client(struct i2c_client *client); | |||
332 | static struct i2c_driver w83627hf_driver = { | 329 | static struct i2c_driver w83627hf_driver = { |
333 | .owner = THIS_MODULE, | 330 | .owner = THIS_MODULE, |
334 | .name = "w83627hf", | 331 | .name = "w83627hf", |
335 | .id = I2C_DRIVERID_W83627HF, | 332 | .attach_adapter = w83627hf_detect, |
336 | .flags = I2C_DF_NOTIFY, | ||
337 | .attach_adapter = w83627hf_attach_adapter, | ||
338 | .detach_client = w83627hf_detach_client, | 333 | .detach_client = w83627hf_detach_client, |
339 | }; | 334 | }; |
340 | 335 | ||
@@ -963,16 +958,7 @@ device_create_file(&client->dev, &dev_attr_temp##offset##_type); \ | |||
963 | } while (0) | 958 | } while (0) |
964 | 959 | ||
965 | 960 | ||
966 | /* This function is called when: | 961 | static int w83627hf_find(int sioaddr, unsigned short *addr) |
967 | * w83627hf_driver is inserted (when this module is loaded), for each | ||
968 | available adapter | ||
969 | * when a new adapter is inserted (and w83627hf_driver is still present) */ | ||
970 | static int w83627hf_attach_adapter(struct i2c_adapter *adapter) | ||
971 | { | ||
972 | return i2c_detect(adapter, &addr_data, w83627hf_detect); | ||
973 | } | ||
974 | |||
975 | static int w83627hf_find(int sioaddr, int *address) | ||
976 | { | 962 | { |
977 | u16 val; | 963 | u16 val; |
978 | 964 | ||
@@ -992,32 +978,24 @@ static int w83627hf_find(int sioaddr, int *address) | |||
992 | superio_select(W83627HF_LD_HWM); | 978 | superio_select(W83627HF_LD_HWM); |
993 | val = (superio_inb(WINB_BASE_REG) << 8) | | 979 | val = (superio_inb(WINB_BASE_REG) << 8) | |
994 | superio_inb(WINB_BASE_REG + 1); | 980 | superio_inb(WINB_BASE_REG + 1); |
995 | *address = val & ~(WINB_EXTENT - 1); | 981 | *addr = val & ~(WINB_EXTENT - 1); |
996 | if (*address == 0 && force_addr == 0) { | 982 | if (*addr == 0 && force_addr == 0) { |
997 | superio_exit(); | 983 | superio_exit(); |
998 | return -ENODEV; | 984 | return -ENODEV; |
999 | } | 985 | } |
1000 | if (force_addr) | ||
1001 | *address = force_addr; /* so detect will get called */ | ||
1002 | 986 | ||
1003 | superio_exit(); | 987 | superio_exit(); |
1004 | return 0; | 988 | return 0; |
1005 | } | 989 | } |
1006 | 990 | ||
1007 | int w83627hf_detect(struct i2c_adapter *adapter, int address, | 991 | static int w83627hf_detect(struct i2c_adapter *adapter) |
1008 | int kind) | ||
1009 | { | 992 | { |
1010 | int val; | 993 | int val, kind; |
1011 | struct i2c_client *new_client; | 994 | struct i2c_client *new_client; |
1012 | struct w83627hf_data *data; | 995 | struct w83627hf_data *data; |
1013 | int err = 0; | 996 | int err = 0; |
1014 | const char *client_name = ""; | 997 | const char *client_name = ""; |
1015 | 998 | ||
1016 | if (!i2c_is_isa_adapter(adapter)) { | ||
1017 | err = -ENODEV; | ||
1018 | goto ERROR0; | ||
1019 | } | ||
1020 | |||
1021 | if(force_addr) | 999 | if(force_addr) |
1022 | address = force_addr & ~(WINB_EXTENT - 1); | 1000 | address = force_addr & ~(WINB_EXTENT - 1); |
1023 | 1001 | ||
@@ -1500,13 +1478,10 @@ static struct w83627hf_data *w83627hf_update_device(struct device *dev) | |||
1500 | 1478 | ||
1501 | static int __init sensors_w83627hf_init(void) | 1479 | static int __init sensors_w83627hf_init(void) |
1502 | { | 1480 | { |
1503 | int addr; | 1481 | if (w83627hf_find(0x2e, &address) |
1504 | 1482 | && w83627hf_find(0x4e, &address)) { | |
1505 | if (w83627hf_find(0x2e, &addr) | ||
1506 | && w83627hf_find(0x4e, &addr)) { | ||
1507 | return -ENODEV; | 1483 | return -ENODEV; |
1508 | } | 1484 | } |
1509 | normal_isa[0] = addr; | ||
1510 | 1485 | ||
1511 | return i2c_isa_add_driver(&w83627hf_driver); | 1486 | return i2c_isa_add_driver(&w83627hf_driver); |
1512 | } | 1487 | } |