Re: [PATCH] i2c driver changes for 2.5.70

From: Greg KH (greg@kroah.com)
Date: Thu Jun 05 2003 - 15:55:59 EST


ChangeSet 1.1259.3.2, 2003/06/05 12:45:04-07:00, mhoffman@lightlink.com

[PATCH] I2C: more w83781d fixes

This patch fixes the various return values in the w83781d_detect()
error paths. It also cleans up some formatting here and there.
It should be applied on top of the previous one.

It works for me; same caveat as above w.r.t. ISA.

 drivers/i2c/chips/w83781d.c | 62 +++++++++++++++++++++++++++++++-------------
 1 files changed, 44 insertions(+), 18 deletions(-)

diff -Nru a/drivers/i2c/chips/w83781d.c b/drivers/i2c/chips/w83781d.c
--- a/drivers/i2c/chips/w83781d.c Thu Jun 5 13:50:10 2003
+++ b/drivers/i2c/chips/w83781d.c Thu Jun 5 13:50:10 2003
@@ -1039,7 +1039,7 @@
                 struct i2c_client *new_client)
 {
         int i, val1 = 0, id;
- int err = 0;
+ int err;
         const char *client_name;
         struct w83781d_data *data = i2c_get_clientdata(new_client);
 
@@ -1058,7 +1058,8 @@
                             force_subclients[i] > 0x4f) {
                                 dev_err(&new_client->dev, "Invalid subclient "
                                         "address %d; must be 0x48-0x4f\n",
- force_subclients[i]);
+ force_subclients[i]);
+ err = -EINVAL;
                                 goto ERROR_SC_1;
                         }
                 }
@@ -1082,6 +1083,7 @@
                         dev_err(&new_client->dev,
                                "Duplicate addresses 0x%x for subclients.\n",
                                data->lm75[0].addr);
+ err = -EBUSY;
                         goto ERROR_SC_1;
                 }
         }
@@ -1119,7 +1121,7 @@
                         break;
         }
 
- return err;
+ return 0;
 
 /* Undo inits in case of errors */
 ERROR_SC_2:
@@ -1136,18 +1138,22 @@
         int i = 0, val1 = 0, val2;
         struct i2c_client *new_client;
         struct w83781d_data *data;
- int err = 0;
+ int err;
         const char *client_name = "";
         int is_isa = i2c_is_isa_adapter(adapter);
         enum vendor { winbond, asus } vendid;
 
         if (!is_isa
- && !i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
+ && !i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) {
+ err = -EINVAL;
                 goto ERROR0;
+ }
 
         if (is_isa)
- if (!request_region(address, W83781D_EXTENT, "w83781d"))
+ if (!request_region(address, W83781D_EXTENT, "w83781d")) {
+ err = -EBUSY;
                         goto ERROR0;
+ }
 
         /* Probe whether there is anything available on this address. Already
            done for SMBus clients */
@@ -1155,15 +1161,21 @@
                 if (is_isa) {
 
 #define REALLY_SLOW_IO
- /* We need the timeouts for at least some LM78-like chips. But only
- if we read 'undefined' registers. */
+ /* We need the timeouts for at least some LM78-like
+ chips. But only if we read 'undefined' registers. */
                         i = inb_p(address + 1);
- if (inb_p(address + 2) != i)
+ if (inb_p(address + 2) != i) {
+ err = -ENODEV;
                                 goto ERROR1;
- if (inb_p(address + 3) != i)
+ }
+ if (inb_p(address + 3) != i) {
+ err = -ENODEV;
                                 goto ERROR1;
- if (inb_p(address + 7) != i)
+ }
+ if (inb_p(address + 7) != i) {
+ err = -ENODEV;
                                 goto ERROR1;
+ }
 #undef REALLY_SLOW_IO
 
                         /* Let's just hope nothing breaks here */
@@ -1171,7 +1183,8 @@
                         outb_p(~i & 0x7f, address + 5);
                         if ((inb_p(address + 5) & 0x7f) != (~i & 0x7f)) {
                                 outb_p(i, address + 5);
- return 0;
+ err = -ENODEV;
+ goto ERROR1;
                         }
                 }
         }
@@ -1204,8 +1217,10 @@
            force_*=... parameter, and the Winbond will be reset to the right
            bank. */
         if (kind < 0) {
- if (w83781d_read_value(new_client, W83781D_REG_CONFIG) & 0x80)
+ if (w83781d_read_value(new_client, W83781D_REG_CONFIG) & 0x80){
+ err = -ENODEV;
                         goto ERROR2;
+ }
                 val1 = w83781d_read_value(new_client, W83781D_REG_BANK);
                 val2 = w83781d_read_value(new_client, W83781D_REG_CHIPMAN);
                 /* Check for Winbond or Asus ID if in bank 0 */
@@ -1213,14 +1228,19 @@
                     (((!(val1 & 0x80)) && (val2 != 0xa3) && (val2 != 0xc3)
                       && (val2 != 0x94))
                      || ((val1 & 0x80) && (val2 != 0x5c) && (val2 != 0x12)
- && (val2 != 0x06))))
+ && (val2 != 0x06)))) {
+ err = -ENODEV;
                         goto ERROR2;
- /* If Winbond SMBus, check address at 0x48. Asus doesn't support */
+ }
+ /* If Winbond SMBus, check address at 0x48.
+ Asus doesn't support */
                 if ((!is_isa) && (((!(val1 & 0x80)) && (val2 == 0xa3)) ||
                                   ((val1 & 0x80) && (val2 == 0x5c)))) {
                         if (w83781d_read_value
- (new_client, W83781D_REG_I2C_ADDR) != address)
+ (new_client, W83781D_REG_I2C_ADDR) != address) {
+ err = -ENODEV;
                                 goto ERROR2;
+ }
                 }
         }
 
@@ -1239,8 +1259,11 @@
                         vendid = winbond;
                 else if ((val2 == 0x12) || (val2 == 0x06))
                         vendid = asus;
- else
+ else {
+ err = -ENODEV;
                         goto ERROR2;
+ }
+
                 /* mask off lower bit, not reliable */
                 val1 =
                     w83781d_read_value(new_client, W83781D_REG_WCHIPID) & 0xfe;
@@ -1262,6 +1285,7 @@
                                        "Ignoring 'force' parameter for unknown chip at"
                                        "adapter %d, address 0x%02x\n",
                                        i2c_adapter_id(adapter), address);
+ err = -EINVAL;
                         goto ERROR2;
                 }
         }
@@ -1279,7 +1303,9 @@
         } else if (kind == w83697hf) {
                 client_name = "W83697HF chip";
         } else {
- dev_err(&new_client->dev, "Internal error: unknown kind (%d)?!?", kind);
+ dev_err(&new_client->dev, "Internal error: unknown "
+ "kind (%d)?!?", kind);
+ err = -ENODEV;
                 goto ERROR2;
         }
 

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Sat Jun 07 2003 - 22:00:28 EST