a bit - except if there could be more than one SMBus. Groan. No solution
for this yet. */
-/* This module may seem overly long and complicated. In fact, it is not so
- bad. Quite a lot of bookkeeping is done. A real driver can often cut
- some corners. */
-
-/* For each registered W83781D, we need to keep some data in memory. That
- data is pointed to by w83781d_list[NR]->data. The structure itself is
- dynamically allocated, at the same time when a new w83781d client is
- allocated. */
+/* For each registered chip, we need to keep some data in memory.
+ The structure is dynamically allocated. */
struct w83781d_data {
struct i2c_client client;
struct class_device *class_dev;
bank. */
if (kind < 0) {
if (w83781d_read_value(client, W83781D_REG_CONFIG) & 0x80) {
- dev_dbg(dev, "Detection failed at step 3\n");
+ dev_dbg(&adapter->dev, "Detection of w83781d chip "
+ "failed at step 3\n");
err = -ENODEV;
goto ERROR2;
}
if ((!(val1 & 0x07)) &&
(((!(val1 & 0x80)) && (val2 != 0xa3) && (val2 != 0xc3))
|| ((val1 & 0x80) && (val2 != 0x5c) && (val2 != 0x12)))) {
- dev_dbg(dev, "Detection failed at step 4\n");
+ dev_dbg(&adapter->dev, "Detection of w83781d chip "
+ "failed at step 4\n");
err = -ENODEV;
goto ERROR2;
}
((val1 & 0x80) && (val2 == 0x5c)))) {
if (w83781d_read_value
(client, W83781D_REG_I2C_ADDR) != address) {
- dev_dbg(dev, "Detection failed at step 5\n");
+ dev_dbg(&adapter->dev, "Detection of w83781d "
+ "chip failed at step 5\n");
err = -ENODEV;
goto ERROR2;
}
else if (val2 == 0x12)
vendid = asus;
else {
- dev_dbg(dev, "Chip was made by neither "
- "Winbond nor Asus?\n");
+ dev_dbg(&adapter->dev, "w83781d chip vendor is "
+ "neither Winbond nor Asus\n");
err = -ENODEV;
goto ERROR2;
}
kind = as99127f;
else {
if (kind == 0)
- dev_warn(dev, "Ignoring 'force' "
+ dev_warn(&adapter->dev, "Ignoring 'force' "
"parameter for unknown chip at "
- "adapter %d, address 0x%02x\n",
- i2c_adapter_id(adapter), address);
+ "address 0x%02x\n", address);
err = -EINVAL;
goto ERROR2;
}
if (res)
return res;
- res = i2c_isa_add_driver(&w83781d_isa_driver);
- if (res) {
- i2c_del_driver(&w83781d_driver);
- return res;
- }
+ /* Don't exit if this one fails, we still want the I2C variants
+ to work! */
+ if (i2c_isa_add_driver(&w83781d_isa_driver))
+ isa_address = 0;
return 0;
}
static void __exit
sensors_w83781d_exit(void)
{
- i2c_isa_del_driver(&w83781d_isa_driver);
+ if (isa_address)
+ i2c_isa_del_driver(&w83781d_isa_driver);
i2c_del_driver(&w83781d_driver);
}