diff options
author | David Brownell <david-b@pacbell.net> | 2008-07-14 16:38:25 -0400 |
---|---|---|
committer | Jean Delvare <khali@mahadeva.delvare> | 2008-07-14 16:38:25 -0400 |
commit | 97140342e69d479a3ad82bfd4c154c0b08fe3eea (patch) | |
tree | 2ee2ad225c7e4850a30bc57c4bf07251c1da1085 /drivers/i2c | |
parent | 6ea438ec8da4ec56bf415f5ea360e6b0cb59c6c3 (diff) |
i2c: Bus drivers return -Errno not -1
Tighten error paths used by various i2c adapters (mostly x86) so
they return real fault/errno codes instead of a "-1" (which is
most often interpreted as "-EPERM"). Build tested, with eyeball
review.
One minor initial goal is to have adapters consistently return
the code "-ENXIO" when addressing a device doesn't get an ACK
response, at least in the probe paths where they are already
good at stifling related logspam.
Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
Signed-off-by: Jean Delvare <khali@linux-fr.org>
Diffstat (limited to 'drivers/i2c')
-rw-r--r-- | drivers/i2c/algos/i2c-algo-bit.c | 4 | ||||
-rw-r--r-- | drivers/i2c/busses/i2c-ali1535.c | 22 | ||||
-rw-r--r-- | drivers/i2c/busses/i2c-ali1563.c | 23 | ||||
-rw-r--r-- | drivers/i2c/busses/i2c-ali15x3.c | 19 | ||||
-rw-r--r-- | drivers/i2c/busses/i2c-amd756-s4882.c | 4 | ||||
-rw-r--r-- | drivers/i2c/busses/i2c-amd756.c | 18 | ||||
-rw-r--r-- | drivers/i2c/busses/i2c-amd8111.c | 47 | ||||
-rw-r--r-- | drivers/i2c/busses/i2c-i801.c | 44 | ||||
-rw-r--r-- | drivers/i2c/busses/i2c-nforce2.c | 25 | ||||
-rw-r--r-- | drivers/i2c/busses/i2c-piix4.c | 20 | ||||
-rw-r--r-- | drivers/i2c/busses/i2c-sis5595.c | 19 | ||||
-rw-r--r-- | drivers/i2c/busses/i2c-sis630.c | 47 | ||||
-rw-r--r-- | drivers/i2c/busses/i2c-sis96x.c | 23 | ||||
-rw-r--r-- | drivers/i2c/busses/i2c-stub.c | 4 | ||||
-rw-r--r-- | drivers/i2c/busses/i2c-viapro.c | 20 |
15 files changed, 191 insertions, 148 deletions
diff --git a/drivers/i2c/algos/i2c-algo-bit.c b/drivers/i2c/algos/i2c-algo-bit.c index 35812823787b..eb8f72ca02f4 100644 --- a/drivers/i2c/algos/i2c-algo-bit.c +++ b/drivers/i2c/algos/i2c-algo-bit.c | |||
@@ -320,7 +320,7 @@ static int try_address(struct i2c_adapter *i2c_adap, | |||
320 | unsigned char addr, int retries) | 320 | unsigned char addr, int retries) |
321 | { | 321 | { |
322 | struct i2c_algo_bit_data *adap = i2c_adap->algo_data; | 322 | struct i2c_algo_bit_data *adap = i2c_adap->algo_data; |
323 | int i, ret = -1; | 323 | int i, ret = 0; |
324 | 324 | ||
325 | for (i = 0; i <= retries; i++) { | 325 | for (i = 0; i <= retries; i++) { |
326 | ret = i2c_outb(i2c_adap, addr); | 326 | ret = i2c_outb(i2c_adap, addr); |
@@ -508,7 +508,7 @@ static int bit_doAddress(struct i2c_adapter *i2c_adap, struct i2c_msg *msg) | |||
508 | addr ^= 1; | 508 | addr ^= 1; |
509 | ret = try_address(i2c_adap, addr, retries); | 509 | ret = try_address(i2c_adap, addr, retries); |
510 | if ((ret != 1) && !nak_ok) | 510 | if ((ret != 1) && !nak_ok) |
511 | return -EREMOTEIO; | 511 | return -ENXIO; |
512 | } | 512 | } |
513 | 513 | ||
514 | return 0; | 514 | return 0; |
diff --git a/drivers/i2c/busses/i2c-ali1535.c b/drivers/i2c/busses/i2c-ali1535.c index f14372ac2fc5..c21e4d96382e 100644 --- a/drivers/i2c/busses/i2c-ali1535.c +++ b/drivers/i2c/busses/i2c-ali1535.c | |||
@@ -259,7 +259,7 @@ static int ali1535_transaction(struct i2c_adapter *adap) | |||
259 | dev_err(&adap->dev, | 259 | dev_err(&adap->dev, |
260 | "SMBus reset failed! (0x%02x) - controller or " | 260 | "SMBus reset failed! (0x%02x) - controller or " |
261 | "device on bus is probably hung\n", temp); | 261 | "device on bus is probably hung\n", temp); |
262 | return -1; | 262 | return -EBUSY; |
263 | } | 263 | } |
264 | } else { | 264 | } else { |
265 | /* check and clear done bit */ | 265 | /* check and clear done bit */ |
@@ -281,12 +281,12 @@ static int ali1535_transaction(struct i2c_adapter *adap) | |||
281 | 281 | ||
282 | /* If the SMBus is still busy, we give up */ | 282 | /* If the SMBus is still busy, we give up */ |
283 | if (timeout >= MAX_TIMEOUT) { | 283 | if (timeout >= MAX_TIMEOUT) { |
284 | result = -1; | 284 | result = -ETIMEDOUT; |
285 | dev_err(&adap->dev, "SMBus Timeout!\n"); | 285 | dev_err(&adap->dev, "SMBus Timeout!\n"); |
286 | } | 286 | } |
287 | 287 | ||
288 | if (temp & ALI1535_STS_FAIL) { | 288 | if (temp & ALI1535_STS_FAIL) { |
289 | result = -1; | 289 | result = -EIO; |
290 | dev_dbg(&adap->dev, "Error: Failed bus transaction\n"); | 290 | dev_dbg(&adap->dev, "Error: Failed bus transaction\n"); |
291 | } | 291 | } |
292 | 292 | ||
@@ -295,7 +295,7 @@ static int ali1535_transaction(struct i2c_adapter *adap) | |||
295 | * do a printk. This means that bus collisions go unreported. | 295 | * do a printk. This means that bus collisions go unreported. |
296 | */ | 296 | */ |
297 | if (temp & ALI1535_STS_BUSERR) { | 297 | if (temp & ALI1535_STS_BUSERR) { |
298 | result = -1; | 298 | result = -ENXIO; |
299 | dev_dbg(&adap->dev, | 299 | dev_dbg(&adap->dev, |
300 | "Error: no response or bus collision ADD=%02x\n", | 300 | "Error: no response or bus collision ADD=%02x\n", |
301 | inb_p(SMBHSTADD)); | 301 | inb_p(SMBHSTADD)); |
@@ -303,13 +303,13 @@ static int ali1535_transaction(struct i2c_adapter *adap) | |||
303 | 303 | ||
304 | /* haven't ever seen this */ | 304 | /* haven't ever seen this */ |
305 | if (temp & ALI1535_STS_DEV) { | 305 | if (temp & ALI1535_STS_DEV) { |
306 | result = -1; | 306 | result = -EIO; |
307 | dev_err(&adap->dev, "Error: device error\n"); | 307 | dev_err(&adap->dev, "Error: device error\n"); |
308 | } | 308 | } |
309 | 309 | ||
310 | /* check to see if the "command complete" indication is set */ | 310 | /* check to see if the "command complete" indication is set */ |
311 | if (!(temp & ALI1535_STS_DONE)) { | 311 | if (!(temp & ALI1535_STS_DONE)) { |
312 | result = -1; | 312 | result = -ETIMEDOUT; |
313 | dev_err(&adap->dev, "Error: command never completed\n"); | 313 | dev_err(&adap->dev, "Error: command never completed\n"); |
314 | } | 314 | } |
315 | 315 | ||
@@ -332,7 +332,7 @@ static int ali1535_transaction(struct i2c_adapter *adap) | |||
332 | return result; | 332 | return result; |
333 | } | 333 | } |
334 | 334 | ||
335 | /* Return -1 on error. */ | 335 | /* Return negative errno on error. */ |
336 | static s32 ali1535_access(struct i2c_adapter *adap, u16 addr, | 336 | static s32 ali1535_access(struct i2c_adapter *adap, u16 addr, |
337 | unsigned short flags, char read_write, u8 command, | 337 | unsigned short flags, char read_write, u8 command, |
338 | int size, union i2c_smbus_data *data) | 338 | int size, union i2c_smbus_data *data) |
@@ -359,7 +359,7 @@ static s32 ali1535_access(struct i2c_adapter *adap, u16 addr, | |||
359 | switch (size) { | 359 | switch (size) { |
360 | case I2C_SMBUS_PROC_CALL: | 360 | case I2C_SMBUS_PROC_CALL: |
361 | dev_err(&adap->dev, "I2C_SMBUS_PROC_CALL not supported!\n"); | 361 | dev_err(&adap->dev, "I2C_SMBUS_PROC_CALL not supported!\n"); |
362 | result = -1; | 362 | result = -EOPNOTSUPP; |
363 | goto EXIT; | 363 | goto EXIT; |
364 | case I2C_SMBUS_QUICK: | 364 | case I2C_SMBUS_QUICK: |
365 | outb_p(((addr & 0x7f) << 1) | (read_write & 0x01), | 365 | outb_p(((addr & 0x7f) << 1) | (read_write & 0x01), |
@@ -420,11 +420,9 @@ static s32 ali1535_access(struct i2c_adapter *adap, u16 addr, | |||
420 | break; | 420 | break; |
421 | } | 421 | } |
422 | 422 | ||
423 | if (ali1535_transaction(adap)) { | 423 | result = ali1535_transaction(adap); |
424 | /* Error in transaction */ | 424 | if (result) |
425 | result = -1; | ||
426 | goto EXIT; | 425 | goto EXIT; |
427 | } | ||
428 | 426 | ||
429 | if ((read_write == I2C_SMBUS_WRITE) || (size == ALI1535_QUICK)) { | 427 | if ((read_write == I2C_SMBUS_WRITE) || (size == ALI1535_QUICK)) { |
430 | result = 0; | 428 | result = 0; |
diff --git a/drivers/i2c/busses/i2c-ali1563.c b/drivers/i2c/busses/i2c-ali1563.c index 6b68074e518a..30bd3ee70386 100644 --- a/drivers/i2c/busses/i2c-ali1563.c +++ b/drivers/i2c/busses/i2c-ali1563.c | |||
@@ -67,6 +67,7 @@ static int ali1563_transaction(struct i2c_adapter * a, int size) | |||
67 | { | 67 | { |
68 | u32 data; | 68 | u32 data; |
69 | int timeout; | 69 | int timeout; |
70 | int status = -EIO; | ||
70 | 71 | ||
71 | dev_dbg(&a->dev, "Transaction (pre): STS=%02x, CNTL1=%02x, " | 72 | dev_dbg(&a->dev, "Transaction (pre): STS=%02x, CNTL1=%02x, " |
72 | "CNTL2=%02x, CMD=%02x, ADD=%02x, DAT0=%02x, DAT1=%02x\n", | 73 | "CNTL2=%02x, CMD=%02x, ADD=%02x, DAT0=%02x, DAT1=%02x\n", |
@@ -103,13 +104,15 @@ static int ali1563_transaction(struct i2c_adapter * a, int size) | |||
103 | /* Issue 'kill' to host controller */ | 104 | /* Issue 'kill' to host controller */ |
104 | outb_p(HST_CNTL2_KILL,SMB_HST_CNTL2); | 105 | outb_p(HST_CNTL2_KILL,SMB_HST_CNTL2); |
105 | data = inb_p(SMB_HST_STS); | 106 | data = inb_p(SMB_HST_STS); |
107 | status = -ETIMEDOUT; | ||
106 | } | 108 | } |
107 | 109 | ||
108 | /* device error - no response, ignore the autodetection case */ | 110 | /* device error - no response, ignore the autodetection case */ |
109 | if ((data & HST_STS_DEVERR) && (size != HST_CNTL2_QUICK)) { | 111 | if (data & HST_STS_DEVERR) { |
110 | dev_err(&a->dev, "Device error!\n"); | 112 | if (size != HST_CNTL2_QUICK) |
113 | dev_err(&a->dev, "Device error!\n"); | ||
114 | status = -ENXIO; | ||
111 | } | 115 | } |
112 | |||
113 | /* bus collision */ | 116 | /* bus collision */ |
114 | if (data & HST_STS_BUSERR) { | 117 | if (data & HST_STS_BUSERR) { |
115 | dev_err(&a->dev, "Bus collision!\n"); | 118 | dev_err(&a->dev, "Bus collision!\n"); |
@@ -122,13 +125,14 @@ static int ali1563_transaction(struct i2c_adapter * a, int size) | |||
122 | outb_p(0x0,SMB_HST_CNTL2); | 125 | outb_p(0x0,SMB_HST_CNTL2); |
123 | } | 126 | } |
124 | 127 | ||
125 | return -1; | 128 | return status; |
126 | } | 129 | } |
127 | 130 | ||
128 | static int ali1563_block_start(struct i2c_adapter * a) | 131 | static int ali1563_block_start(struct i2c_adapter * a) |
129 | { | 132 | { |
130 | u32 data; | 133 | u32 data; |
131 | int timeout; | 134 | int timeout; |
135 | int status = -EIO; | ||
132 | 136 | ||
133 | dev_dbg(&a->dev, "Block (pre): STS=%02x, CNTL1=%02x, " | 137 | dev_dbg(&a->dev, "Block (pre): STS=%02x, CNTL1=%02x, " |
134 | "CNTL2=%02x, CMD=%02x, ADD=%02x, DAT0=%02x, DAT1=%02x\n", | 138 | "CNTL2=%02x, CMD=%02x, ADD=%02x, DAT0=%02x, DAT1=%02x\n", |
@@ -164,13 +168,20 @@ static int ali1563_block_start(struct i2c_adapter * a) | |||
164 | 168 | ||
165 | if (timeout && !(data & HST_STS_BAD)) | 169 | if (timeout && !(data & HST_STS_BAD)) |
166 | return 0; | 170 | return 0; |
171 | |||
172 | if (timeout == 0) | ||
173 | status = -ETIMEDOUT; | ||
174 | |||
175 | if (data & HST_STS_DEVERR) | ||
176 | status = -ENXIO; | ||
177 | |||
167 | dev_err(&a->dev, "SMBus Error: %s%s%s%s%s\n", | 178 | dev_err(&a->dev, "SMBus Error: %s%s%s%s%s\n", |
168 | timeout ? "Timeout " : "", | 179 | timeout ? "" : "Timeout ", |
169 | data & HST_STS_FAIL ? "Transaction Failed " : "", | 180 | data & HST_STS_FAIL ? "Transaction Failed " : "", |
170 | data & HST_STS_BUSERR ? "No response or Bus Collision " : "", | 181 | data & HST_STS_BUSERR ? "No response or Bus Collision " : "", |
171 | data & HST_STS_DEVERR ? "Device Error " : "", | 182 | data & HST_STS_DEVERR ? "Device Error " : "", |
172 | !(data & HST_STS_DONE) ? "Transaction Never Finished " : ""); | 183 | !(data & HST_STS_DONE) ? "Transaction Never Finished " : ""); |
173 | return -1; | 184 | return status; |
174 | } | 185 | } |
175 | 186 | ||
176 | static int ali1563_block(struct i2c_adapter * a, union i2c_smbus_data * data, u8 rw) | 187 | static int ali1563_block(struct i2c_adapter * a, union i2c_smbus_data * data, u8 rw) |
diff --git a/drivers/i2c/busses/i2c-ali15x3.c b/drivers/i2c/busses/i2c-ali15x3.c index 93bf87d70961..3d752561dc37 100644 --- a/drivers/i2c/busses/i2c-ali15x3.c +++ b/drivers/i2c/busses/i2c-ali15x3.c | |||
@@ -282,7 +282,7 @@ static int ali15x3_transaction(struct i2c_adapter *adap) | |||
282 | dev_err(&adap->dev, "SMBus reset failed! (0x%02x) - " | 282 | dev_err(&adap->dev, "SMBus reset failed! (0x%02x) - " |
283 | "controller or device on bus is probably hung\n", | 283 | "controller or device on bus is probably hung\n", |
284 | temp); | 284 | temp); |
285 | return -1; | 285 | return -EBUSY; |
286 | } | 286 | } |
287 | } else { | 287 | } else { |
288 | /* check and clear done bit */ | 288 | /* check and clear done bit */ |
@@ -304,12 +304,12 @@ static int ali15x3_transaction(struct i2c_adapter *adap) | |||
304 | 304 | ||
305 | /* If the SMBus is still busy, we give up */ | 305 | /* If the SMBus is still busy, we give up */ |
306 | if (timeout >= MAX_TIMEOUT) { | 306 | if (timeout >= MAX_TIMEOUT) { |
307 | result = -1; | 307 | result = -ETIMEDOUT; |
308 | dev_err(&adap->dev, "SMBus Timeout!\n"); | 308 | dev_err(&adap->dev, "SMBus Timeout!\n"); |
309 | } | 309 | } |
310 | 310 | ||
311 | if (temp & ALI15X3_STS_TERM) { | 311 | if (temp & ALI15X3_STS_TERM) { |
312 | result = -1; | 312 | result = -EIO; |
313 | dev_dbg(&adap->dev, "Error: Failed bus transaction\n"); | 313 | dev_dbg(&adap->dev, "Error: Failed bus transaction\n"); |
314 | } | 314 | } |
315 | 315 | ||
@@ -320,7 +320,7 @@ static int ali15x3_transaction(struct i2c_adapter *adap) | |||
320 | This means that bus collisions go unreported. | 320 | This means that bus collisions go unreported. |
321 | */ | 321 | */ |
322 | if (temp & ALI15X3_STS_COLL) { | 322 | if (temp & ALI15X3_STS_COLL) { |
323 | result = -1; | 323 | result = -ENXIO; |
324 | dev_dbg(&adap->dev, | 324 | dev_dbg(&adap->dev, |
325 | "Error: no response or bus collision ADD=%02x\n", | 325 | "Error: no response or bus collision ADD=%02x\n", |
326 | inb_p(SMBHSTADD)); | 326 | inb_p(SMBHSTADD)); |
@@ -328,7 +328,7 @@ static int ali15x3_transaction(struct i2c_adapter *adap) | |||
328 | 328 | ||
329 | /* haven't ever seen this */ | 329 | /* haven't ever seen this */ |
330 | if (temp & ALI15X3_STS_DEV) { | 330 | if (temp & ALI15X3_STS_DEV) { |
331 | result = -1; | 331 | result = -EIO; |
332 | dev_err(&adap->dev, "Error: device error\n"); | 332 | dev_err(&adap->dev, "Error: device error\n"); |
333 | } | 333 | } |
334 | dev_dbg(&adap->dev, "Transaction (post): STS=%02x, CNT=%02x, CMD=%02x, " | 334 | dev_dbg(&adap->dev, "Transaction (post): STS=%02x, CNT=%02x, CMD=%02x, " |
@@ -338,7 +338,7 @@ static int ali15x3_transaction(struct i2c_adapter *adap) | |||
338 | return result; | 338 | return result; |
339 | } | 339 | } |
340 | 340 | ||
341 | /* Return -1 on error. */ | 341 | /* Return negative errno on error. */ |
342 | static s32 ali15x3_access(struct i2c_adapter * adap, u16 addr, | 342 | static s32 ali15x3_access(struct i2c_adapter * adap, u16 addr, |
343 | unsigned short flags, char read_write, u8 command, | 343 | unsigned short flags, char read_write, u8 command, |
344 | int size, union i2c_smbus_data * data) | 344 | int size, union i2c_smbus_data * data) |
@@ -364,7 +364,7 @@ static s32 ali15x3_access(struct i2c_adapter * adap, u16 addr, | |||
364 | switch (size) { | 364 | switch (size) { |
365 | case I2C_SMBUS_PROC_CALL: | 365 | case I2C_SMBUS_PROC_CALL: |
366 | dev_err(&adap->dev, "I2C_SMBUS_PROC_CALL not supported!\n"); | 366 | dev_err(&adap->dev, "I2C_SMBUS_PROC_CALL not supported!\n"); |
367 | return -1; | 367 | return -EOPNOTSUPP; |
368 | case I2C_SMBUS_QUICK: | 368 | case I2C_SMBUS_QUICK: |
369 | outb_p(((addr & 0x7f) << 1) | (read_write & 0x01), | 369 | outb_p(((addr & 0x7f) << 1) | (read_write & 0x01), |
370 | SMBHSTADD); | 370 | SMBHSTADD); |
@@ -421,8 +421,9 @@ static s32 ali15x3_access(struct i2c_adapter * adap, u16 addr, | |||
421 | 421 | ||
422 | outb_p(size, SMBHSTCNT); /* output command */ | 422 | outb_p(size, SMBHSTCNT); /* output command */ |
423 | 423 | ||
424 | if (ali15x3_transaction(adap)) /* Error in transaction */ | 424 | temp = ali15x3_transaction(adap); |
425 | return -1; | 425 | if (temp) |
426 | return temp; | ||
426 | 427 | ||
427 | if ((read_write == I2C_SMBUS_WRITE) || (size == ALI15X3_QUICK)) | 428 | if ((read_write == I2C_SMBUS_WRITE) || (size == ALI15X3_QUICK)) |
428 | return 0; | 429 | return 0; |
diff --git a/drivers/i2c/busses/i2c-amd756-s4882.c b/drivers/i2c/busses/i2c-amd756-s4882.c index c38a0a112208..2f150e33c74c 100644 --- a/drivers/i2c/busses/i2c-amd756-s4882.c +++ b/drivers/i2c/busses/i2c-amd756-s4882.c | |||
@@ -58,7 +58,7 @@ static s32 amd756_access_virt0(struct i2c_adapter * adap, u16 addr, | |||
58 | /* We exclude the multiplexed addresses */ | 58 | /* We exclude the multiplexed addresses */ |
59 | if (addr == 0x4c || (addr & 0xfc) == 0x50 || (addr & 0xfc) == 0x30 | 59 | if (addr == 0x4c || (addr & 0xfc) == 0x50 || (addr & 0xfc) == 0x30 |
60 | || addr == 0x18) | 60 | || addr == 0x18) |
61 | return -1; | 61 | return -ENXIO; |
62 | 62 | ||
63 | mutex_lock(&amd756_lock); | 63 | mutex_lock(&amd756_lock); |
64 | 64 | ||
@@ -86,7 +86,7 @@ static inline s32 amd756_access_channel(struct i2c_adapter * adap, u16 addr, | |||
86 | 86 | ||
87 | /* We exclude the non-multiplexed addresses */ | 87 | /* We exclude the non-multiplexed addresses */ |
88 | if (addr != 0x4c && (addr & 0xfc) != 0x50 && (addr & 0xfc) != 0x30) | 88 | if (addr != 0x4c && (addr & 0xfc) != 0x50 && (addr & 0xfc) != 0x30) |
89 | return -1; | 89 | return -ENXIO; |
90 | 90 | ||
91 | mutex_lock(&amd756_lock); | 91 | mutex_lock(&amd756_lock); |
92 | 92 | ||
diff --git a/drivers/i2c/busses/i2c-amd756.c b/drivers/i2c/busses/i2c-amd756.c index 43508d61eb7c..3d5bcb65e9e0 100644 --- a/drivers/i2c/busses/i2c-amd756.c +++ b/drivers/i2c/busses/i2c-amd756.c | |||
@@ -151,17 +151,17 @@ static int amd756_transaction(struct i2c_adapter *adap) | |||
151 | } | 151 | } |
152 | 152 | ||
153 | if (temp & GS_PRERR_STS) { | 153 | if (temp & GS_PRERR_STS) { |
154 | result = -1; | 154 | result = -ENXIO; |
155 | dev_dbg(&adap->dev, "SMBus Protocol error (no response)!\n"); | 155 | dev_dbg(&adap->dev, "SMBus Protocol error (no response)!\n"); |
156 | } | 156 | } |
157 | 157 | ||
158 | if (temp & GS_COL_STS) { | 158 | if (temp & GS_COL_STS) { |
159 | result = -1; | 159 | result = -EIO; |
160 | dev_warn(&adap->dev, "SMBus collision!\n"); | 160 | dev_warn(&adap->dev, "SMBus collision!\n"); |
161 | } | 161 | } |
162 | 162 | ||
163 | if (temp & GS_TO_STS) { | 163 | if (temp & GS_TO_STS) { |
164 | result = -1; | 164 | result = -ETIMEDOUT; |
165 | dev_dbg(&adap->dev, "SMBus protocol timeout!\n"); | 165 | dev_dbg(&adap->dev, "SMBus protocol timeout!\n"); |
166 | } | 166 | } |
167 | 167 | ||
@@ -189,22 +189,23 @@ static int amd756_transaction(struct i2c_adapter *adap) | |||
189 | outw_p(inw(SMB_GLOBAL_ENABLE) | GE_ABORT, SMB_GLOBAL_ENABLE); | 189 | outw_p(inw(SMB_GLOBAL_ENABLE) | GE_ABORT, SMB_GLOBAL_ENABLE); |
190 | msleep(100); | 190 | msleep(100); |
191 | outw_p(GS_CLEAR_STS, SMB_GLOBAL_STATUS); | 191 | outw_p(GS_CLEAR_STS, SMB_GLOBAL_STATUS); |
192 | return -1; | 192 | return -EIO; |
193 | } | 193 | } |
194 | 194 | ||
195 | /* Return -1 on error. */ | 195 | /* Return negative errno on error. */ |
196 | static s32 amd756_access(struct i2c_adapter * adap, u16 addr, | 196 | static s32 amd756_access(struct i2c_adapter * adap, u16 addr, |
197 | unsigned short flags, char read_write, | 197 | unsigned short flags, char read_write, |
198 | u8 command, int size, union i2c_smbus_data * data) | 198 | u8 command, int size, union i2c_smbus_data * data) |
199 | { | 199 | { |
200 | int i, len; | 200 | int i, len; |
201 | int status; | ||
201 | 202 | ||
202 | /** TODO: Should I supporte the 10-bit transfers? */ | 203 | /** TODO: Should I supporte the 10-bit transfers? */ |
203 | switch (size) { | 204 | switch (size) { |
204 | case I2C_SMBUS_PROC_CALL: | 205 | case I2C_SMBUS_PROC_CALL: |
205 | dev_dbg(&adap->dev, "I2C_SMBUS_PROC_CALL not supported!\n"); | 206 | dev_dbg(&adap->dev, "I2C_SMBUS_PROC_CALL not supported!\n"); |
206 | /* TODO: Well... It is supported, I'm just not sure what to do here... */ | 207 | /* TODO: Well... It is supported, I'm just not sure what to do here... */ |
207 | return -1; | 208 | return -EOPNOTSUPP; |
208 | case I2C_SMBUS_QUICK: | 209 | case I2C_SMBUS_QUICK: |
209 | outw_p(((addr & 0x7f) << 1) | (read_write & 0x01), | 210 | outw_p(((addr & 0x7f) << 1) | (read_write & 0x01), |
210 | SMB_HOST_ADDRESS); | 211 | SMB_HOST_ADDRESS); |
@@ -256,8 +257,9 @@ static s32 amd756_access(struct i2c_adapter * adap, u16 addr, | |||
256 | /* How about enabling interrupts... */ | 257 | /* How about enabling interrupts... */ |
257 | outw_p(size & GE_CYC_TYPE_MASK, SMB_GLOBAL_ENABLE); | 258 | outw_p(size & GE_CYC_TYPE_MASK, SMB_GLOBAL_ENABLE); |
258 | 259 | ||
259 | if (amd756_transaction(adap)) /* Error in transaction */ | 260 | status = amd756_transaction(adap); |
260 | return -1; | 261 | if (status) |
262 | return status; | ||
261 | 263 | ||
262 | if ((read_write == I2C_SMBUS_WRITE) || (size == AMD756_QUICK)) | 264 | if ((read_write == I2C_SMBUS_WRITE) || (size == AMD756_QUICK)) |
263 | return 0; | 265 | return 0; |
diff --git a/drivers/i2c/busses/i2c-amd8111.c b/drivers/i2c/busses/i2c-amd8111.c index 5d1a27ef2504..a4f687915de1 100644 --- a/drivers/i2c/busses/i2c-amd8111.c +++ b/drivers/i2c/busses/i2c-amd8111.c | |||
@@ -77,7 +77,7 @@ static unsigned int amd_ec_wait_write(struct amd_smbus *smbus) | |||
77 | if (!timeout) { | 77 | if (!timeout) { |
78 | dev_warn(&smbus->dev->dev, | 78 | dev_warn(&smbus->dev->dev, |
79 | "Timeout while waiting for IBF to clear\n"); | 79 | "Timeout while waiting for IBF to clear\n"); |
80 | return -1; | 80 | return -ETIMEDOUT; |
81 | } | 81 | } |
82 | 82 | ||
83 | return 0; | 83 | return 0; |
@@ -93,7 +93,7 @@ static unsigned int amd_ec_wait_read(struct amd_smbus *smbus) | |||
93 | if (!timeout) { | 93 | if (!timeout) { |
94 | dev_warn(&smbus->dev->dev, | 94 | dev_warn(&smbus->dev->dev, |
95 | "Timeout while waiting for OBF to set\n"); | 95 | "Timeout while waiting for OBF to set\n"); |
96 | return -1; | 96 | return -ETIMEDOUT; |
97 | } | 97 | } |
98 | 98 | ||
99 | return 0; | 99 | return 0; |
@@ -102,16 +102,21 @@ static unsigned int amd_ec_wait_read(struct amd_smbus *smbus) | |||
102 | static unsigned int amd_ec_read(struct amd_smbus *smbus, unsigned char address, | 102 | static unsigned int amd_ec_read(struct amd_smbus *smbus, unsigned char address, |
103 | unsigned char *data) | 103 | unsigned char *data) |
104 | { | 104 | { |
105 | if (amd_ec_wait_write(smbus)) | 105 | int status; |
106 | return -1; | 106 | |
107 | status = amd_ec_wait_write(smbus); | ||
108 | if (status) | ||
109 | return status; | ||
107 | outb(AMD_EC_CMD_RD, smbus->base + AMD_EC_CMD); | 110 | outb(AMD_EC_CMD_RD, smbus->base + AMD_EC_CMD); |
108 | 111 | ||
109 | if (amd_ec_wait_write(smbus)) | 112 | status = amd_ec_wait_write(smbus); |
110 | return -1; | 113 | if (status) |
114 | return status; | ||
111 | outb(address, smbus->base + AMD_EC_DATA); | 115 | outb(address, smbus->base + AMD_EC_DATA); |
112 | 116 | ||
113 | if (amd_ec_wait_read(smbus)) | 117 | status = amd_ec_wait_read(smbus); |
114 | return -1; | 118 | if (status) |
119 | return status; | ||
115 | *data = inb(smbus->base + AMD_EC_DATA); | 120 | *data = inb(smbus->base + AMD_EC_DATA); |
116 | 121 | ||
117 | return 0; | 122 | return 0; |
@@ -120,16 +125,21 @@ static unsigned int amd_ec_read(struct amd_smbus *smbus, unsigned char address, | |||
120 | static unsigned int amd_ec_write(struct amd_smbus *smbus, unsigned char address, | 125 | static unsigned int amd_ec_write(struct amd_smbus *smbus, unsigned char address, |
121 | unsigned char data) | 126 | unsigned char data) |
122 | { | 127 | { |
123 | if (amd_ec_wait_write(smbus)) | 128 | int status; |
124 | return -1; | 129 | |
130 | status = amd_ec_wait_write(smbus); | ||
131 | if (status) | ||
132 | return status; | ||
125 | outb(AMD_EC_CMD_WR, smbus->base + AMD_EC_CMD); | 133 | outb(AMD_EC_CMD_WR, smbus->base + AMD_EC_CMD); |
126 | 134 | ||
127 | if (amd_ec_wait_write(smbus)) | 135 | status = amd_ec_wait_write(smbus); |
128 | return -1; | 136 | if (status) |
137 | return status; | ||
129 | outb(address, smbus->base + AMD_EC_DATA); | 138 | outb(address, smbus->base + AMD_EC_DATA); |
130 | 139 | ||
131 | if (amd_ec_wait_write(smbus)) | 140 | status = amd_ec_wait_write(smbus); |
132 | return -1; | 141 | if (status) |
142 | return status; | ||
133 | outb(data, smbus->base + AMD_EC_DATA); | 143 | outb(data, smbus->base + AMD_EC_DATA); |
134 | 144 | ||
135 | return 0; | 145 | return 0; |
@@ -267,12 +277,17 @@ static s32 amd8111_access(struct i2c_adapter * adap, u16 addr, | |||
267 | 277 | ||
268 | default: | 278 | default: |
269 | dev_warn(&adap->dev, "Unsupported transaction %d\n", size); | 279 | dev_warn(&adap->dev, "Unsupported transaction %d\n", size); |
270 | return -1; | 280 | return -EOPNOTSUPP; |
271 | } | 281 | } |
272 | 282 | ||
273 | amd_ec_write(smbus, AMD_SMB_ADDR, addr << 1); | 283 | amd_ec_write(smbus, AMD_SMB_ADDR, addr << 1); |
274 | amd_ec_write(smbus, AMD_SMB_PRTCL, protocol); | 284 | amd_ec_write(smbus, AMD_SMB_PRTCL, protocol); |
275 | 285 | ||
286 | /* FIXME this discards status from ec_read(); so temp[0] will | ||
287 | * hold stack garbage ... the rest of this routine will act | ||
288 | * nonsensically. Ignored ec_write() status might explain | ||
289 | * some such failures... | ||
290 | */ | ||
276 | amd_ec_read(smbus, AMD_SMB_STS, temp + 0); | 291 | amd_ec_read(smbus, AMD_SMB_STS, temp + 0); |
277 | 292 | ||
278 | if (~temp[0] & AMD_SMB_STS_DONE) { | 293 | if (~temp[0] & AMD_SMB_STS_DONE) { |
@@ -286,7 +301,7 @@ static s32 amd8111_access(struct i2c_adapter * adap, u16 addr, | |||
286 | } | 301 | } |
287 | 302 | ||
288 | if ((~temp[0] & AMD_SMB_STS_DONE) || (temp[0] & AMD_SMB_STS_STATUS)) | 303 | if ((~temp[0] & AMD_SMB_STS_DONE) || (temp[0] & AMD_SMB_STS_STATUS)) |
289 | return -1; | 304 | return -EIO; |
290 | 305 | ||
291 | if (read_write == I2C_SMBUS_WRITE) | 306 | if (read_write == I2C_SMBUS_WRITE) |
292 | return 0; | 307 | return 0; |
diff --git a/drivers/i2c/busses/i2c-i801.c b/drivers/i2c/busses/i2c-i801.c index b0f771fe4326..7d6d9dfcc58a 100644 --- a/drivers/i2c/busses/i2c-i801.c +++ b/drivers/i2c/busses/i2c-i801.c | |||
@@ -151,7 +151,7 @@ static int i801_transaction(int xact) | |||
151 | outb_p(temp, SMBHSTSTS); | 151 | outb_p(temp, SMBHSTSTS); |
152 | if ((temp = (0x1f & inb_p(SMBHSTSTS))) != 0x00) { | 152 | if ((temp = (0x1f & inb_p(SMBHSTSTS))) != 0x00) { |
153 | dev_dbg(&I801_dev->dev, "Failed! (%02x)\n", temp); | 153 | dev_dbg(&I801_dev->dev, "Failed! (%02x)\n", temp); |
154 | return -1; | 154 | return -EBUSY; |
155 | } else { | 155 | } else { |
156 | dev_dbg(&I801_dev->dev, "Successful!\n"); | 156 | dev_dbg(&I801_dev->dev, "Successful!\n"); |
157 | } | 157 | } |
@@ -170,7 +170,7 @@ static int i801_transaction(int xact) | |||
170 | /* If the SMBus is still busy, we give up */ | 170 | /* If the SMBus is still busy, we give up */ |
171 | if (timeout >= MAX_TIMEOUT) { | 171 | if (timeout >= MAX_TIMEOUT) { |
172 | dev_dbg(&I801_dev->dev, "SMBus Timeout!\n"); | 172 | dev_dbg(&I801_dev->dev, "SMBus Timeout!\n"); |
173 | result = -1; | 173 | result = -ETIMEDOUT; |
174 | /* try to stop the current command */ | 174 | /* try to stop the current command */ |
175 | dev_dbg(&I801_dev->dev, "Terminating the current operation\n"); | 175 | dev_dbg(&I801_dev->dev, "Terminating the current operation\n"); |
176 | outb_p(inb_p(SMBHSTCNT) | SMBHSTCNT_KILL, SMBHSTCNT); | 176 | outb_p(inb_p(SMBHSTCNT) | SMBHSTCNT_KILL, SMBHSTCNT); |
@@ -179,19 +179,19 @@ static int i801_transaction(int xact) | |||
179 | } | 179 | } |
180 | 180 | ||
181 | if (temp & SMBHSTSTS_FAILED) { | 181 | if (temp & SMBHSTSTS_FAILED) { |
182 | result = -1; | 182 | result = -EIO; |
183 | dev_dbg(&I801_dev->dev, "Error: Failed bus transaction\n"); | 183 | dev_dbg(&I801_dev->dev, "Error: Failed bus transaction\n"); |
184 | } | 184 | } |
185 | 185 | ||
186 | if (temp & SMBHSTSTS_BUS_ERR) { | 186 | if (temp & SMBHSTSTS_BUS_ERR) { |
187 | result = -1; | 187 | result = -EIO; |
188 | dev_err(&I801_dev->dev, "Bus collision! SMBus may be locked " | 188 | dev_err(&I801_dev->dev, "Bus collision! SMBus may be locked " |
189 | "until next hard reset. (sorry!)\n"); | 189 | "until next hard reset. (sorry!)\n"); |
190 | /* Clock stops and slave is stuck in mid-transmission */ | 190 | /* Clock stops and slave is stuck in mid-transmission */ |
191 | } | 191 | } |
192 | 192 | ||
193 | if (temp & SMBHSTSTS_DEV_ERR) { | 193 | if (temp & SMBHSTSTS_DEV_ERR) { |
194 | result = -1; | 194 | result = -ENXIO; |
195 | dev_dbg(&I801_dev->dev, "Error: no response!\n"); | 195 | dev_dbg(&I801_dev->dev, "Error: no response!\n"); |
196 | } | 196 | } |
197 | 197 | ||
@@ -231,6 +231,7 @@ static int i801_block_transaction_by_block(union i2c_smbus_data *data, | |||
231 | char read_write, int hwpec) | 231 | char read_write, int hwpec) |
232 | { | 232 | { |
233 | int i, len; | 233 | int i, len; |
234 | int status; | ||
234 | 235 | ||
235 | inb_p(SMBHSTCNT); /* reset the data buffer index */ | 236 | inb_p(SMBHSTCNT); /* reset the data buffer index */ |
236 | 237 | ||
@@ -242,14 +243,15 @@ static int i801_block_transaction_by_block(union i2c_smbus_data *data, | |||
242 | outb_p(data->block[i+1], SMBBLKDAT); | 243 | outb_p(data->block[i+1], SMBBLKDAT); |
243 | } | 244 | } |
244 | 245 | ||
245 | if (i801_transaction(I801_BLOCK_DATA | ENABLE_INT9 | | 246 | status = i801_transaction(I801_BLOCK_DATA | ENABLE_INT9 | |
246 | I801_PEC_EN * hwpec)) | 247 | I801_PEC_EN * hwpec); |
247 | return -1; | 248 | if (status) |
249 | return status; | ||
248 | 250 | ||
249 | if (read_write == I2C_SMBUS_READ) { | 251 | if (read_write == I2C_SMBUS_READ) { |
250 | len = inb_p(SMBHSTDAT0); | 252 | len = inb_p(SMBHSTDAT0); |
251 | if (len < 1 || len > I2C_SMBUS_BLOCK_MAX) | 253 | if (len < 1 || len > I2C_SMBUS_BLOCK_MAX) |
252 | return -1; | 254 | return -EPROTO; |
253 | 255 | ||
254 | data->block[0] = len; | 256 | data->block[0] = len; |
255 | for (i = 0; i < len; i++) | 257 | for (i = 0; i < len; i++) |
@@ -314,11 +316,11 @@ static int i801_block_transaction_byte_by_byte(union i2c_smbus_data *data, | |||
314 | if (((temp = inb_p(SMBHSTSTS)) & errmask) != 0x00) { | 316 | if (((temp = inb_p(SMBHSTSTS)) & errmask) != 0x00) { |
315 | dev_err(&I801_dev->dev, | 317 | dev_err(&I801_dev->dev, |
316 | "Reset failed! (%02x)\n", temp); | 318 | "Reset failed! (%02x)\n", temp); |
317 | return -1; | 319 | return -EBUSY; |
318 | } | 320 | } |
319 | if (i != 1) | 321 | if (i != 1) |
320 | /* if die in middle of block transaction, fail */ | 322 | /* if die in middle of block transaction, fail */ |
321 | return -1; | 323 | return -EIO; |
322 | } | 324 | } |
323 | 325 | ||
324 | if (i == 1) | 326 | if (i == 1) |
@@ -342,19 +344,19 @@ static int i801_block_transaction_byte_by_byte(union i2c_smbus_data *data, | |||
342 | msleep(1); | 344 | msleep(1); |
343 | outb_p(inb_p(SMBHSTCNT) & (~SMBHSTCNT_KILL), | 345 | outb_p(inb_p(SMBHSTCNT) & (~SMBHSTCNT_KILL), |
344 | SMBHSTCNT); | 346 | SMBHSTCNT); |
345 | result = -1; | 347 | result = -ETIMEDOUT; |
346 | dev_dbg(&I801_dev->dev, "SMBus Timeout!\n"); | 348 | dev_dbg(&I801_dev->dev, "SMBus Timeout!\n"); |
347 | } | 349 | } |
348 | 350 | ||
349 | if (temp & SMBHSTSTS_FAILED) { | 351 | if (temp & SMBHSTSTS_FAILED) { |
350 | result = -1; | 352 | result = -EIO; |
351 | dev_dbg(&I801_dev->dev, | 353 | dev_dbg(&I801_dev->dev, |
352 | "Error: Failed bus transaction\n"); | 354 | "Error: Failed bus transaction\n"); |
353 | } else if (temp & SMBHSTSTS_BUS_ERR) { | 355 | } else if (temp & SMBHSTSTS_BUS_ERR) { |
354 | result = -1; | 356 | result = -EIO; |
355 | dev_err(&I801_dev->dev, "Bus collision!\n"); | 357 | dev_err(&I801_dev->dev, "Bus collision!\n"); |
356 | } else if (temp & SMBHSTSTS_DEV_ERR) { | 358 | } else if (temp & SMBHSTSTS_DEV_ERR) { |
357 | result = -1; | 359 | result = -ENXIO; |
358 | dev_dbg(&I801_dev->dev, "Error: no response!\n"); | 360 | dev_dbg(&I801_dev->dev, "Error: no response!\n"); |
359 | } | 361 | } |
360 | 362 | ||
@@ -362,7 +364,7 @@ static int i801_block_transaction_byte_by_byte(union i2c_smbus_data *data, | |||
362 | && command != I2C_SMBUS_I2C_BLOCK_DATA) { | 364 | && command != I2C_SMBUS_I2C_BLOCK_DATA) { |
363 | len = inb_p(SMBHSTDAT0); | 365 | len = inb_p(SMBHSTDAT0); |
364 | if (len < 1 || len > I2C_SMBUS_BLOCK_MAX) | 366 | if (len < 1 || len > I2C_SMBUS_BLOCK_MAX) |
365 | return -1; | 367 | return -EPROTO; |
366 | data->block[0] = len; | 368 | data->block[0] = len; |
367 | } | 369 | } |
368 | 370 | ||
@@ -394,7 +396,7 @@ static int i801_set_block_buffer_mode(void) | |||
394 | { | 396 | { |
395 | outb_p(inb_p(SMBAUXCTL) | SMBAUXCTL_E32B, SMBAUXCTL); | 397 | outb_p(inb_p(SMBAUXCTL) | SMBAUXCTL_E32B, SMBAUXCTL); |
396 | if ((inb_p(SMBAUXCTL) & SMBAUXCTL_E32B) == 0) | 398 | if ((inb_p(SMBAUXCTL) & SMBAUXCTL_E32B) == 0) |
397 | return -1; | 399 | return -EIO; |
398 | return 0; | 400 | return 0; |
399 | } | 401 | } |
400 | 402 | ||
@@ -414,7 +416,7 @@ static int i801_block_transaction(union i2c_smbus_data *data, char read_write, | |||
414 | } else if (!(i801_features & FEATURE_I2C_BLOCK_READ)) { | 416 | } else if (!(i801_features & FEATURE_I2C_BLOCK_READ)) { |
415 | dev_err(&I801_dev->dev, | 417 | dev_err(&I801_dev->dev, |
416 | "I2C block read is unsupported!\n"); | 418 | "I2C block read is unsupported!\n"); |
417 | return -1; | 419 | return -EOPNOTSUPP; |
418 | } | 420 | } |
419 | } | 421 | } |
420 | 422 | ||
@@ -449,7 +451,7 @@ static int i801_block_transaction(union i2c_smbus_data *data, char read_write, | |||
449 | return result; | 451 | return result; |
450 | } | 452 | } |
451 | 453 | ||
452 | /* Return -1 on error. */ | 454 | /* Return negative errno on error. */ |
453 | static s32 i801_access(struct i2c_adapter * adap, u16 addr, | 455 | static s32 i801_access(struct i2c_adapter * adap, u16 addr, |
454 | unsigned short flags, char read_write, u8 command, | 456 | unsigned short flags, char read_write, u8 command, |
455 | int size, union i2c_smbus_data * data) | 457 | int size, union i2c_smbus_data * data) |
@@ -514,7 +516,7 @@ static s32 i801_access(struct i2c_adapter * adap, u16 addr, | |||
514 | case I2C_SMBUS_PROC_CALL: | 516 | case I2C_SMBUS_PROC_CALL: |
515 | default: | 517 | default: |
516 | dev_err(&I801_dev->dev, "Unsupported transaction %d\n", size); | 518 | dev_err(&I801_dev->dev, "Unsupported transaction %d\n", size); |
517 | return -1; | 519 | return -EOPNOTSUPP; |
518 | } | 520 | } |
519 | 521 | ||
520 | if (hwpec) /* enable/disable hardware PEC */ | 522 | if (hwpec) /* enable/disable hardware PEC */ |
@@ -537,7 +539,7 @@ static s32 i801_access(struct i2c_adapter * adap, u16 addr, | |||
537 | if(block) | 539 | if(block) |
538 | return ret; | 540 | return ret; |
539 | if(ret) | 541 | if(ret) |
540 | return -1; | 542 | return ret; |
541 | if ((read_write == I2C_SMBUS_WRITE) || (xact == I801_QUICK)) | 543 | if ((read_write == I2C_SMBUS_WRITE) || (xact == I801_QUICK)) |
542 | return 0; | 544 | return 0; |
543 | 545 | ||
diff --git a/drivers/i2c/busses/i2c-nforce2.c b/drivers/i2c/busses/i2c-nforce2.c index f95efff9b3d1..081fdf3393f4 100644 --- a/drivers/i2c/busses/i2c-nforce2.c +++ b/drivers/i2c/busses/i2c-nforce2.c | |||
@@ -172,16 +172,16 @@ static int nforce2_check_status(struct i2c_adapter *adap) | |||
172 | dev_dbg(&adap->dev, "SMBus Timeout!\n"); | 172 | dev_dbg(&adap->dev, "SMBus Timeout!\n"); |
173 | if (smbus->can_abort) | 173 | if (smbus->can_abort) |
174 | nforce2_abort(adap); | 174 | nforce2_abort(adap); |
175 | return -1; | 175 | return -ETIMEDOUT; |
176 | } | 176 | } |
177 | if (!(temp & NVIDIA_SMB_STS_DONE) || (temp & NVIDIA_SMB_STS_STATUS)) { | 177 | if (!(temp & NVIDIA_SMB_STS_DONE) || (temp & NVIDIA_SMB_STS_STATUS)) { |
178 | dev_dbg(&adap->dev, "Transaction failed (0x%02x)!\n", temp); | 178 | dev_dbg(&adap->dev, "Transaction failed (0x%02x)!\n", temp); |
179 | return -1; | 179 | return -EIO; |
180 | } | 180 | } |
181 | return 0; | 181 | return 0; |
182 | } | 182 | } |
183 | 183 | ||
184 | /* Return -1 on error */ | 184 | /* Return negative errno on error */ |
185 | static s32 nforce2_access(struct i2c_adapter * adap, u16 addr, | 185 | static s32 nforce2_access(struct i2c_adapter * adap, u16 addr, |
186 | unsigned short flags, char read_write, | 186 | unsigned short flags, char read_write, |
187 | u8 command, int size, union i2c_smbus_data * data) | 187 | u8 command, int size, union i2c_smbus_data * data) |
@@ -189,7 +189,7 @@ static s32 nforce2_access(struct i2c_adapter * adap, u16 addr, | |||
189 | struct nforce2_smbus *smbus = adap->algo_data; | 189 | struct nforce2_smbus *smbus = adap->algo_data; |
190 | unsigned char protocol, pec; | 190 | unsigned char protocol, pec; |
191 | u8 len; | 191 | u8 len; |
192 | int i; | 192 | int i, status; |
193 | 193 | ||
194 | protocol = (read_write == I2C_SMBUS_READ) ? NVIDIA_SMB_PRTCL_READ : | 194 | protocol = (read_write == I2C_SMBUS_READ) ? NVIDIA_SMB_PRTCL_READ : |
195 | NVIDIA_SMB_PRTCL_WRITE; | 195 | NVIDIA_SMB_PRTCL_WRITE; |
@@ -233,7 +233,7 @@ static s32 nforce2_access(struct i2c_adapter * adap, u16 addr, | |||
233 | "Transaction failed " | 233 | "Transaction failed " |
234 | "(requested block size: %d)\n", | 234 | "(requested block size: %d)\n", |
235 | len); | 235 | len); |
236 | return -1; | 236 | return -EINVAL; |
237 | } | 237 | } |
238 | outb_p(len, NVIDIA_SMB_BCNT); | 238 | outb_p(len, NVIDIA_SMB_BCNT); |
239 | for (i = 0; i < I2C_SMBUS_BLOCK_MAX; i++) | 239 | for (i = 0; i < I2C_SMBUS_BLOCK_MAX; i++) |
@@ -245,14 +245,15 @@ static s32 nforce2_access(struct i2c_adapter * adap, u16 addr, | |||
245 | 245 | ||
246 | default: | 246 | default: |
247 | dev_err(&adap->dev, "Unsupported transaction %d\n", size); | 247 | dev_err(&adap->dev, "Unsupported transaction %d\n", size); |
248 | return -1; | 248 | return -EOPNOTSUPP; |
249 | } | 249 | } |
250 | 250 | ||
251 | outb_p((addr & 0x7f) << 1, NVIDIA_SMB_ADDR); | 251 | outb_p((addr & 0x7f) << 1, NVIDIA_SMB_ADDR); |
252 | outb_p(protocol, NVIDIA_SMB_PRTCL); | 252 | outb_p(protocol, NVIDIA_SMB_PRTCL); |
253 | 253 | ||
254 | if (nforce2_check_status(adap)) | 254 | status = nforce2_check_status(adap); |
255 | return -1; | 255 | if (status) |
256 | return status; | ||
256 | 257 | ||
257 | if (read_write == I2C_SMBUS_WRITE) | 258 | if (read_write == I2C_SMBUS_WRITE) |
258 | return 0; | 259 | return 0; |
@@ -274,7 +275,7 @@ static s32 nforce2_access(struct i2c_adapter * adap, u16 addr, | |||
274 | dev_err(&adap->dev, "Transaction failed " | 275 | dev_err(&adap->dev, "Transaction failed " |
275 | "(received block size: 0x%02x)\n", | 276 | "(received block size: 0x%02x)\n", |
276 | len); | 277 | len); |
277 | return -1; | 278 | return -EPROTO; |
278 | } | 279 | } |
279 | for (i = 0; i < len; i++) | 280 | for (i = 0; i < len; i++) |
280 | data->block[i+1] = inb_p(NVIDIA_SMB_DATA + i); | 281 | data->block[i+1] = inb_p(NVIDIA_SMB_DATA + i); |
@@ -335,7 +336,7 @@ static int __devinit nforce2_probe_smb (struct pci_dev *dev, int bar, | |||
335 | != PCIBIOS_SUCCESSFUL) { | 336 | != PCIBIOS_SUCCESSFUL) { |
336 | dev_err(&dev->dev, "Error reading PCI config for %s\n", | 337 | dev_err(&dev->dev, "Error reading PCI config for %s\n", |
337 | name); | 338 | name); |
338 | return -1; | 339 | return -EIO; |
339 | } | 340 | } |
340 | 341 | ||
341 | smbus->base = iobase & PCI_BASE_ADDRESS_IO_MASK; | 342 | smbus->base = iobase & PCI_BASE_ADDRESS_IO_MASK; |
@@ -345,7 +346,7 @@ static int __devinit nforce2_probe_smb (struct pci_dev *dev, int bar, | |||
345 | if (!request_region(smbus->base, smbus->size, nforce2_driver.name)) { | 346 | if (!request_region(smbus->base, smbus->size, nforce2_driver.name)) { |
346 | dev_err(&smbus->adapter.dev, "Error requesting region %02x .. %02X for %s\n", | 347 | dev_err(&smbus->adapter.dev, "Error requesting region %02x .. %02X for %s\n", |
347 | smbus->base, smbus->base+smbus->size-1, name); | 348 | smbus->base, smbus->base+smbus->size-1, name); |
348 | return -1; | 349 | return -EBUSY; |
349 | } | 350 | } |
350 | smbus->adapter.owner = THIS_MODULE; | 351 | smbus->adapter.owner = THIS_MODULE; |
351 | smbus->adapter.id = I2C_HW_SMBUS_NFORCE2; | 352 | smbus->adapter.id = I2C_HW_SMBUS_NFORCE2; |
@@ -360,7 +361,7 @@ static int __devinit nforce2_probe_smb (struct pci_dev *dev, int bar, | |||
360 | if (error) { | 361 | if (error) { |
361 | dev_err(&smbus->adapter.dev, "Failed to register adapter.\n"); | 362 | dev_err(&smbus->adapter.dev, "Failed to register adapter.\n"); |
362 | release_region(smbus->base, smbus->size); | 363 | release_region(smbus->base, smbus->size); |
363 | return -1; | 364 | return error; |
364 | } | 365 | } |
365 | dev_info(&smbus->adapter.dev, "nForce2 SMBus adapter at %#x\n", smbus->base); | 366 | dev_info(&smbus->adapter.dev, "nForce2 SMBus adapter at %#x\n", smbus->base); |
366 | return 0; | 367 | return 0; |
diff --git a/drivers/i2c/busses/i2c-piix4.c b/drivers/i2c/busses/i2c-piix4.c index ac9165968587..dc76c0e2dc65 100644 --- a/drivers/i2c/busses/i2c-piix4.c +++ b/drivers/i2c/busses/i2c-piix4.c | |||
@@ -253,7 +253,7 @@ static int piix4_transaction(void) | |||
253 | outb_p(temp, SMBHSTSTS); | 253 | outb_p(temp, SMBHSTSTS); |
254 | if ((temp = inb_p(SMBHSTSTS)) != 0x00) { | 254 | if ((temp = inb_p(SMBHSTSTS)) != 0x00) { |
255 | dev_err(&piix4_adapter.dev, "Failed! (%02x)\n", temp); | 255 | dev_err(&piix4_adapter.dev, "Failed! (%02x)\n", temp); |
256 | return -1; | 256 | return -EBUSY; |
257 | } else { | 257 | } else { |
258 | dev_dbg(&piix4_adapter.dev, "Successful!\n"); | 258 | dev_dbg(&piix4_adapter.dev, "Successful!\n"); |
259 | } | 259 | } |
@@ -275,23 +275,23 @@ static int piix4_transaction(void) | |||
275 | /* If the SMBus is still busy, we give up */ | 275 | /* If the SMBus is still busy, we give up */ |
276 | if (timeout >= MAX_TIMEOUT) { | 276 | if (timeout >= MAX_TIMEOUT) { |
277 | dev_err(&piix4_adapter.dev, "SMBus Timeout!\n"); | 277 | dev_err(&piix4_adapter.dev, "SMBus Timeout!\n"); |
278 | result = -1; | 278 | result = -ETIMEDOUT; |
279 | } | 279 | } |
280 | 280 | ||
281 | if (temp & 0x10) { | 281 | if (temp & 0x10) { |
282 | result = -1; | 282 | result = -EIO; |
283 | dev_err(&piix4_adapter.dev, "Error: Failed bus transaction\n"); | 283 | dev_err(&piix4_adapter.dev, "Error: Failed bus transaction\n"); |
284 | } | 284 | } |
285 | 285 | ||
286 | if (temp & 0x08) { | 286 | if (temp & 0x08) { |
287 | result = -1; | 287 | result = -EIO; |
288 | dev_dbg(&piix4_adapter.dev, "Bus collision! SMBus may be " | 288 | dev_dbg(&piix4_adapter.dev, "Bus collision! SMBus may be " |
289 | "locked until next hard reset. (sorry!)\n"); | 289 | "locked until next hard reset. (sorry!)\n"); |
290 | /* Clock stops and slave is stuck in mid-transmission */ | 290 | /* Clock stops and slave is stuck in mid-transmission */ |
291 | } | 291 | } |
292 | 292 | ||
293 | if (temp & 0x04) { | 293 | if (temp & 0x04) { |
294 | result = -1; | 294 | result = -ENXIO; |
295 | dev_dbg(&piix4_adapter.dev, "Error: no response!\n"); | 295 | dev_dbg(&piix4_adapter.dev, "Error: no response!\n"); |
296 | } | 296 | } |
297 | 297 | ||
@@ -309,17 +309,18 @@ static int piix4_transaction(void) | |||
309 | return result; | 309 | return result; |
310 | } | 310 | } |
311 | 311 | ||
312 | /* Return -1 on error. */ | 312 | /* Return negative errno on error. */ |
313 | static s32 piix4_access(struct i2c_adapter * adap, u16 addr, | 313 | static s32 piix4_access(struct i2c_adapter * adap, u16 addr, |
314 | unsigned short flags, char read_write, | 314 | unsigned short flags, char read_write, |
315 | u8 command, int size, union i2c_smbus_data * data) | 315 | u8 command, int size, union i2c_smbus_data * data) |
316 | { | 316 | { |
317 | int i, len; | 317 | int i, len; |
318 | int status; | ||
318 | 319 | ||
319 | switch (size) { | 320 | switch (size) { |
320 | case I2C_SMBUS_PROC_CALL: | 321 | case I2C_SMBUS_PROC_CALL: |
321 | dev_err(&adap->dev, "I2C_SMBUS_PROC_CALL not supported!\n"); | 322 | dev_err(&adap->dev, "I2C_SMBUS_PROC_CALL not supported!\n"); |
322 | return -1; | 323 | return -EOPNOTSUPP; |
323 | case I2C_SMBUS_QUICK: | 324 | case I2C_SMBUS_QUICK: |
324 | outb_p(((addr & 0x7f) << 1) | (read_write & 0x01), | 325 | outb_p(((addr & 0x7f) << 1) | (read_write & 0x01), |
325 | SMBHSTADD); | 326 | SMBHSTADD); |
@@ -371,8 +372,9 @@ static s32 piix4_access(struct i2c_adapter * adap, u16 addr, | |||
371 | 372 | ||
372 | outb_p((size & 0x1C) + (ENABLE_INT9 & 1), SMBHSTCNT); | 373 | outb_p((size & 0x1C) + (ENABLE_INT9 & 1), SMBHSTCNT); |
373 | 374 | ||
374 | if (piix4_transaction()) /* Error in transaction */ | 375 | status = piix4_transaction(); |
375 | return -1; | 376 | if (status) |
377 | return status; | ||
376 | 378 | ||
377 | if ((read_write == I2C_SMBUS_WRITE) || (size == PIIX4_QUICK)) | 379 | if ((read_write == I2C_SMBUS_WRITE) || (size == PIIX4_QUICK)) |
378 | return 0; | 380 | return 0; |
diff --git a/drivers/i2c/busses/i2c-sis5595.c b/drivers/i2c/busses/i2c-sis5595.c index 9ca8f9155f95..328441bb5470 100644 --- a/drivers/i2c/busses/i2c-sis5595.c +++ b/drivers/i2c/busses/i2c-sis5595.c | |||
@@ -236,7 +236,7 @@ static int sis5595_transaction(struct i2c_adapter *adap) | |||
236 | sis5595_write(SMB_STS_HI, temp >> 8); | 236 | sis5595_write(SMB_STS_HI, temp >> 8); |
237 | if ((temp = sis5595_read(SMB_STS_LO) + (sis5595_read(SMB_STS_HI) << 8)) != 0x00) { | 237 | if ((temp = sis5595_read(SMB_STS_LO) + (sis5595_read(SMB_STS_HI) << 8)) != 0x00) { |
238 | dev_dbg(&adap->dev, "Failed! (%02x)\n", temp); | 238 | dev_dbg(&adap->dev, "Failed! (%02x)\n", temp); |
239 | return -1; | 239 | return -EBUSY; |
240 | } else { | 240 | } else { |
241 | dev_dbg(&adap->dev, "Successful!\n"); | 241 | dev_dbg(&adap->dev, "Successful!\n"); |
242 | } | 242 | } |
@@ -254,19 +254,19 @@ static int sis5595_transaction(struct i2c_adapter *adap) | |||
254 | /* If the SMBus is still busy, we give up */ | 254 | /* If the SMBus is still busy, we give up */ |
255 | if (timeout >= MAX_TIMEOUT) { | 255 | if (timeout >= MAX_TIMEOUT) { |
256 | dev_dbg(&adap->dev, "SMBus Timeout!\n"); | 256 | dev_dbg(&adap->dev, "SMBus Timeout!\n"); |
257 | result = -1; | 257 | result = -ETIMEDOUT; |
258 | } | 258 | } |
259 | 259 | ||
260 | if (temp & 0x10) { | 260 | if (temp & 0x10) { |
261 | dev_dbg(&adap->dev, "Error: Failed bus transaction\n"); | 261 | dev_dbg(&adap->dev, "Error: Failed bus transaction\n"); |
262 | result = -1; | 262 | result = -ENXIO; |
263 | } | 263 | } |
264 | 264 | ||
265 | if (temp & 0x20) { | 265 | if (temp & 0x20) { |
266 | dev_err(&adap->dev, "Bus collision! SMBus may be locked until " | 266 | dev_err(&adap->dev, "Bus collision! SMBus may be locked until " |
267 | "next hard reset (or not...)\n"); | 267 | "next hard reset (or not...)\n"); |
268 | /* Clock stops and slave is stuck in mid-transmission */ | 268 | /* Clock stops and slave is stuck in mid-transmission */ |
269 | result = -1; | 269 | result = -EIO; |
270 | } | 270 | } |
271 | 271 | ||
272 | temp = sis5595_read(SMB_STS_LO) + (sis5595_read(SMB_STS_HI) << 8); | 272 | temp = sis5595_read(SMB_STS_LO) + (sis5595_read(SMB_STS_HI) << 8); |
@@ -282,11 +282,13 @@ static int sis5595_transaction(struct i2c_adapter *adap) | |||
282 | return result; | 282 | return result; |
283 | } | 283 | } |
284 | 284 | ||
285 | /* Return -1 on error. */ | 285 | /* Return negative errno on error. */ |
286 | static s32 sis5595_access(struct i2c_adapter *adap, u16 addr, | 286 | static s32 sis5595_access(struct i2c_adapter *adap, u16 addr, |
287 | unsigned short flags, char read_write, | 287 | unsigned short flags, char read_write, |
288 | u8 command, int size, union i2c_smbus_data *data) | 288 | u8 command, int size, union i2c_smbus_data *data) |
289 | { | 289 | { |
290 | int status; | ||
291 | |||
290 | switch (size) { | 292 | switch (size) { |
291 | case I2C_SMBUS_QUICK: | 293 | case I2C_SMBUS_QUICK: |
292 | sis5595_write(SMB_ADDR, ((addr & 0x7f) << 1) | (read_write & 0x01)); | 294 | sis5595_write(SMB_ADDR, ((addr & 0x7f) << 1) | (read_write & 0x01)); |
@@ -318,13 +320,14 @@ static s32 sis5595_access(struct i2c_adapter *adap, u16 addr, | |||
318 | break; | 320 | break; |
319 | default: | 321 | default: |
320 | dev_warn(&adap->dev, "Unsupported transaction %d\n", size); | 322 | dev_warn(&adap->dev, "Unsupported transaction %d\n", size); |
321 | return -1; | 323 | return -EOPNOTSUPP; |
322 | } | 324 | } |
323 | 325 | ||
324 | sis5595_write(SMB_CTL_LO, ((size & 0x0E))); | 326 | sis5595_write(SMB_CTL_LO, ((size & 0x0E))); |
325 | 327 | ||
326 | if (sis5595_transaction(adap)) | 328 | status = sis5595_transaction(adap); |
327 | return -1; | 329 | if (status) |
330 | return status; | ||
328 | 331 | ||
329 | if ((size != SIS5595_PROC_CALL) && | 332 | if ((size != SIS5595_PROC_CALL) && |
330 | ((read_write == I2C_SMBUS_WRITE) || (size == SIS5595_QUICK))) | 333 | ((read_write == I2C_SMBUS_WRITE) || (size == SIS5595_QUICK))) |
diff --git a/drivers/i2c/busses/i2c-sis630.c b/drivers/i2c/busses/i2c-sis630.c index 3765dd7f450f..c4cc5eddf50d 100644 --- a/drivers/i2c/busses/i2c-sis630.c +++ b/drivers/i2c/busses/i2c-sis630.c | |||
@@ -134,7 +134,7 @@ static int sis630_transaction_start(struct i2c_adapter *adap, int size, u8 *oldc | |||
134 | 134 | ||
135 | if ((temp = sis630_read(SMB_CNT) & 0x03) != 0x00) { | 135 | if ((temp = sis630_read(SMB_CNT) & 0x03) != 0x00) { |
136 | dev_dbg(&adap->dev, "Failed! (%02x)\n", temp); | 136 | dev_dbg(&adap->dev, "Failed! (%02x)\n", temp); |
137 | return -1; | 137 | return -EBUSY; |
138 | } else { | 138 | } else { |
139 | dev_dbg(&adap->dev, "Successful!\n"); | 139 | dev_dbg(&adap->dev, "Successful!\n"); |
140 | } | 140 | } |
@@ -177,17 +177,17 @@ static int sis630_transaction_wait(struct i2c_adapter *adap, int size) | |||
177 | /* If the SMBus is still busy, we give up */ | 177 | /* If the SMBus is still busy, we give up */ |
178 | if (timeout >= MAX_TIMEOUT) { | 178 | if (timeout >= MAX_TIMEOUT) { |
179 | dev_dbg(&adap->dev, "SMBus Timeout!\n"); | 179 | dev_dbg(&adap->dev, "SMBus Timeout!\n"); |
180 | result = -1; | 180 | result = -ETIMEDOUT; |
181 | } | 181 | } |
182 | 182 | ||
183 | if (temp & 0x02) { | 183 | if (temp & 0x02) { |
184 | dev_dbg(&adap->dev, "Error: Failed bus transaction\n"); | 184 | dev_dbg(&adap->dev, "Error: Failed bus transaction\n"); |
185 | result = -1; | 185 | result = -ENXIO; |
186 | } | 186 | } |
187 | 187 | ||
188 | if (temp & 0x04) { | 188 | if (temp & 0x04) { |
189 | dev_err(&adap->dev, "Bus collision!\n"); | 189 | dev_err(&adap->dev, "Bus collision!\n"); |
190 | result = -1; | 190 | result = -EIO; |
191 | /* | 191 | /* |
192 | TBD: Datasheet say: | 192 | TBD: Datasheet say: |
193 | the software should clear this bit and restart SMBUS operation. | 193 | the software should clear this bit and restart SMBUS operation. |
@@ -250,8 +250,10 @@ static int sis630_block_data(struct i2c_adapter *adap, union i2c_smbus_data *dat | |||
250 | if (i==8 || (len<8 && i==len)) { | 250 | if (i==8 || (len<8 && i==len)) { |
251 | dev_dbg(&adap->dev, "start trans len=%d i=%d\n",len ,i); | 251 | dev_dbg(&adap->dev, "start trans len=%d i=%d\n",len ,i); |
252 | /* first transaction */ | 252 | /* first transaction */ |
253 | if (sis630_transaction_start(adap, SIS630_BLOCK_DATA, &oldclock)) | 253 | rc = sis630_transaction_start(adap, |
254 | return -1; | 254 | SIS630_BLOCK_DATA, &oldclock); |
255 | if (rc) | ||
256 | return rc; | ||
255 | } | 257 | } |
256 | else if ((i-1)%8 == 7 || i==len) { | 258 | else if ((i-1)%8 == 7 || i==len) { |
257 | dev_dbg(&adap->dev, "trans_wait len=%d i=%d\n",len,i); | 259 | dev_dbg(&adap->dev, "trans_wait len=%d i=%d\n",len,i); |
@@ -264,9 +266,10 @@ static int sis630_block_data(struct i2c_adapter *adap, union i2c_smbus_data *dat | |||
264 | */ | 266 | */ |
265 | sis630_write(SMB_STS,0x10); | 267 | sis630_write(SMB_STS,0x10); |
266 | } | 268 | } |
267 | if (sis630_transaction_wait(adap, SIS630_BLOCK_DATA)) { | 269 | rc = sis630_transaction_wait(adap, |
270 | SIS630_BLOCK_DATA); | ||
271 | if (rc) { | ||
268 | dev_dbg(&adap->dev, "trans_wait failed\n"); | 272 | dev_dbg(&adap->dev, "trans_wait failed\n"); |
269 | rc = -1; | ||
270 | break; | 273 | break; |
271 | } | 274 | } |
272 | } | 275 | } |
@@ -275,13 +278,14 @@ static int sis630_block_data(struct i2c_adapter *adap, union i2c_smbus_data *dat | |||
275 | else { | 278 | else { |
276 | /* read request */ | 279 | /* read request */ |
277 | data->block[0] = len = 0; | 280 | data->block[0] = len = 0; |
278 | if (sis630_transaction_start(adap, SIS630_BLOCK_DATA, &oldclock)) { | 281 | rc = sis630_transaction_start(adap, |
279 | return -1; | 282 | SIS630_BLOCK_DATA, &oldclock); |
280 | } | 283 | if (rc) |
284 | return rc; | ||
281 | do { | 285 | do { |
282 | if (sis630_transaction_wait(adap, SIS630_BLOCK_DATA)) { | 286 | rc = sis630_transaction_wait(adap, SIS630_BLOCK_DATA); |
287 | if (rc) { | ||
283 | dev_dbg(&adap->dev, "trans_wait failed\n"); | 288 | dev_dbg(&adap->dev, "trans_wait failed\n"); |
284 | rc = -1; | ||
285 | break; | 289 | break; |
286 | } | 290 | } |
287 | /* if this first transaction then read byte count */ | 291 | /* if this first transaction then read byte count */ |
@@ -311,11 +315,13 @@ static int sis630_block_data(struct i2c_adapter *adap, union i2c_smbus_data *dat | |||
311 | return rc; | 315 | return rc; |
312 | } | 316 | } |
313 | 317 | ||
314 | /* Return -1 on error. */ | 318 | /* Return negative errno on error. */ |
315 | static s32 sis630_access(struct i2c_adapter *adap, u16 addr, | 319 | static s32 sis630_access(struct i2c_adapter *adap, u16 addr, |
316 | unsigned short flags, char read_write, | 320 | unsigned short flags, char read_write, |
317 | u8 command, int size, union i2c_smbus_data *data) | 321 | u8 command, int size, union i2c_smbus_data *data) |
318 | { | 322 | { |
323 | int status; | ||
324 | |||
319 | switch (size) { | 325 | switch (size) { |
320 | case I2C_SMBUS_QUICK: | 326 | case I2C_SMBUS_QUICK: |
321 | sis630_write(SMB_ADDR, ((addr & 0x7f) << 1) | (read_write & 0x01)); | 327 | sis630_write(SMB_ADDR, ((addr & 0x7f) << 1) | (read_write & 0x01)); |
@@ -350,13 +356,13 @@ static s32 sis630_access(struct i2c_adapter *adap, u16 addr, | |||
350 | size = SIS630_BLOCK_DATA; | 356 | size = SIS630_BLOCK_DATA; |
351 | return sis630_block_data(adap, data, read_write); | 357 | return sis630_block_data(adap, data, read_write); |
352 | default: | 358 | default: |
353 | printk("Unsupported I2C size\n"); | 359 | printk("Unsupported SMBus operation\n"); |
354 | return -1; | 360 | return -EOPNOTSUPP; |
355 | break; | ||
356 | } | 361 | } |
357 | 362 | ||
358 | if (sis630_transaction(adap, size)) | 363 | status = sis630_transaction(adap, size); |
359 | return -1; | 364 | if (status) |
365 | return status; | ||
360 | 366 | ||
361 | if ((size != SIS630_PCALL) && | 367 | if ((size != SIS630_PCALL) && |
362 | ((read_write == I2C_SMBUS_WRITE) || (size == SIS630_QUICK))) { | 368 | ((read_write == I2C_SMBUS_WRITE) || (size == SIS630_QUICK))) { |
@@ -373,8 +379,7 @@ static s32 sis630_access(struct i2c_adapter *adap, u16 addr, | |||
373 | data->word = sis630_read(SMB_BYTE) + (sis630_read(SMB_BYTE + 1) << 8); | 379 | data->word = sis630_read(SMB_BYTE) + (sis630_read(SMB_BYTE + 1) << 8); |
374 | break; | 380 | break; |
375 | default: | 381 | default: |
376 | return -1; | 382 | return -EOPNOTSUPP; |
377 | break; | ||
378 | } | 383 | } |
379 | 384 | ||
380 | return 0; | 385 | return 0; |
diff --git a/drivers/i2c/busses/i2c-sis96x.c b/drivers/i2c/busses/i2c-sis96x.c index dc235bb8e24d..29757b2e11dd 100644 --- a/drivers/i2c/busses/i2c-sis96x.c +++ b/drivers/i2c/busses/i2c-sis96x.c | |||
@@ -111,7 +111,7 @@ static int sis96x_transaction(int size) | |||
111 | /* check it again */ | 111 | /* check it again */ |
112 | if (((temp = sis96x_read(SMB_CNT)) & 0x03) != 0x00) { | 112 | if (((temp = sis96x_read(SMB_CNT)) & 0x03) != 0x00) { |
113 | dev_dbg(&sis96x_adapter.dev, "Failed (0x%02x)\n", temp); | 113 | dev_dbg(&sis96x_adapter.dev, "Failed (0x%02x)\n", temp); |
114 | return -1; | 114 | return -EBUSY; |
115 | } else { | 115 | } else { |
116 | dev_dbg(&sis96x_adapter.dev, "Successful\n"); | 116 | dev_dbg(&sis96x_adapter.dev, "Successful\n"); |
117 | } | 117 | } |
@@ -136,19 +136,19 @@ static int sis96x_transaction(int size) | |||
136 | /* If the SMBus is still busy, we give up */ | 136 | /* If the SMBus is still busy, we give up */ |
137 | if (timeout >= MAX_TIMEOUT) { | 137 | if (timeout >= MAX_TIMEOUT) { |
138 | dev_dbg(&sis96x_adapter.dev, "SMBus Timeout! (0x%02x)\n", temp); | 138 | dev_dbg(&sis96x_adapter.dev, "SMBus Timeout! (0x%02x)\n", temp); |
139 | result = -1; | 139 | result = -ETIMEDOUT; |
140 | } | 140 | } |
141 | 141 | ||
142 | /* device error - probably missing ACK */ | 142 | /* device error - probably missing ACK */ |
143 | if (temp & 0x02) { | 143 | if (temp & 0x02) { |
144 | dev_dbg(&sis96x_adapter.dev, "Failed bus transaction!\n"); | 144 | dev_dbg(&sis96x_adapter.dev, "Failed bus transaction!\n"); |
145 | result = -1; | 145 | result = -ENXIO; |
146 | } | 146 | } |
147 | 147 | ||
148 | /* bus collision */ | 148 | /* bus collision */ |
149 | if (temp & 0x04) { | 149 | if (temp & 0x04) { |
150 | dev_dbg(&sis96x_adapter.dev, "Bus collision!\n"); | 150 | dev_dbg(&sis96x_adapter.dev, "Bus collision!\n"); |
151 | result = -1; | 151 | result = -EIO; |
152 | } | 152 | } |
153 | 153 | ||
154 | /* Finish up by resetting the bus */ | 154 | /* Finish up by resetting the bus */ |
@@ -161,11 +161,12 @@ static int sis96x_transaction(int size) | |||
161 | return result; | 161 | return result; |
162 | } | 162 | } |
163 | 163 | ||
164 | /* Return -1 on error. */ | 164 | /* Return negative errno on error. */ |
165 | static s32 sis96x_access(struct i2c_adapter * adap, u16 addr, | 165 | static s32 sis96x_access(struct i2c_adapter * adap, u16 addr, |
166 | unsigned short flags, char read_write, | 166 | unsigned short flags, char read_write, |
167 | u8 command, int size, union i2c_smbus_data * data) | 167 | u8 command, int size, union i2c_smbus_data * data) |
168 | { | 168 | { |
169 | int status; | ||
169 | 170 | ||
170 | switch (size) { | 171 | switch (size) { |
171 | case I2C_SMBUS_QUICK: | 172 | case I2C_SMBUS_QUICK: |
@@ -203,17 +204,17 @@ static s32 sis96x_access(struct i2c_adapter * adap, u16 addr, | |||
203 | case I2C_SMBUS_BLOCK_DATA: | 204 | case I2C_SMBUS_BLOCK_DATA: |
204 | /* TO DO: */ | 205 | /* TO DO: */ |
205 | dev_info(&adap->dev, "SMBus block not implemented!\n"); | 206 | dev_info(&adap->dev, "SMBus block not implemented!\n"); |
206 | return -1; | 207 | return -EOPNOTSUPP; |
207 | break; | 208 | break; |
208 | 209 | ||
209 | default: | 210 | default: |
210 | dev_info(&adap->dev, "Unsupported I2C size\n"); | 211 | dev_info(&adap->dev, "Unsupported SMBus operation\n"); |
211 | return -1; | 212 | return -EOPNOTSUPP; |
212 | break; | ||
213 | } | 213 | } |
214 | 214 | ||
215 | if (sis96x_transaction(size)) | 215 | status = sis96x_transaction(size); |
216 | return -1; | 216 | if (status) |
217 | return status; | ||
217 | 218 | ||
218 | if ((size != SIS96x_PROC_CALL) && | 219 | if ((size != SIS96x_PROC_CALL) && |
219 | ((read_write == I2C_SMBUS_WRITE) || (size == SIS96x_QUICK))) | 220 | ((read_write == I2C_SMBUS_WRITE) || (size == SIS96x_QUICK))) |
diff --git a/drivers/i2c/busses/i2c-stub.c b/drivers/i2c/busses/i2c-stub.c index d08eeec53913..e37ccd80f77a 100644 --- a/drivers/i2c/busses/i2c-stub.c +++ b/drivers/i2c/busses/i2c-stub.c | |||
@@ -43,7 +43,7 @@ struct stub_chip { | |||
43 | 43 | ||
44 | static struct stub_chip *stub_chips; | 44 | static struct stub_chip *stub_chips; |
45 | 45 | ||
46 | /* Return -1 on error. */ | 46 | /* Return negative errno on error. */ |
47 | static s32 stub_xfer(struct i2c_adapter * adap, u16 addr, unsigned short flags, | 47 | static s32 stub_xfer(struct i2c_adapter * adap, u16 addr, unsigned short flags, |
48 | char read_write, u8 command, int size, union i2c_smbus_data * data) | 48 | char read_write, u8 command, int size, union i2c_smbus_data * data) |
49 | { | 49 | { |
@@ -120,7 +120,7 @@ static s32 stub_xfer(struct i2c_adapter * adap, u16 addr, unsigned short flags, | |||
120 | 120 | ||
121 | default: | 121 | default: |
122 | dev_dbg(&adap->dev, "Unsupported I2C/SMBus command\n"); | 122 | dev_dbg(&adap->dev, "Unsupported I2C/SMBus command\n"); |
123 | ret = -1; | 123 | ret = -EOPNOTSUPP; |
124 | break; | 124 | break; |
125 | } /* switch (size) */ | 125 | } /* switch (size) */ |
126 | 126 | ||
diff --git a/drivers/i2c/busses/i2c-viapro.c b/drivers/i2c/busses/i2c-viapro.c index 77b13d027f86..7628fe8e0946 100644 --- a/drivers/i2c/busses/i2c-viapro.c +++ b/drivers/i2c/busses/i2c-viapro.c | |||
@@ -152,7 +152,7 @@ static int vt596_transaction(u8 size) | |||
152 | if ((temp = inb_p(SMBHSTSTS)) & 0x1F) { | 152 | if ((temp = inb_p(SMBHSTSTS)) & 0x1F) { |
153 | dev_err(&vt596_adapter.dev, "SMBus reset failed! " | 153 | dev_err(&vt596_adapter.dev, "SMBus reset failed! " |
154 | "(0x%02x)\n", temp); | 154 | "(0x%02x)\n", temp); |
155 | return -1; | 155 | return -EBUSY; |
156 | } | 156 | } |
157 | } | 157 | } |
158 | 158 | ||
@@ -167,24 +167,24 @@ static int vt596_transaction(u8 size) | |||
167 | 167 | ||
168 | /* If the SMBus is still busy, we give up */ | 168 | /* If the SMBus is still busy, we give up */ |
169 | if (timeout >= MAX_TIMEOUT) { | 169 | if (timeout >= MAX_TIMEOUT) { |
170 | result = -1; | 170 | result = -ETIMEDOUT; |
171 | dev_err(&vt596_adapter.dev, "SMBus timeout!\n"); | 171 | dev_err(&vt596_adapter.dev, "SMBus timeout!\n"); |
172 | } | 172 | } |
173 | 173 | ||
174 | if (temp & 0x10) { | 174 | if (temp & 0x10) { |
175 | result = -1; | 175 | result = -EIO; |
176 | dev_err(&vt596_adapter.dev, "Transaction failed (0x%02x)\n", | 176 | dev_err(&vt596_adapter.dev, "Transaction failed (0x%02x)\n", |
177 | size); | 177 | size); |
178 | } | 178 | } |
179 | 179 | ||
180 | if (temp & 0x08) { | 180 | if (temp & 0x08) { |
181 | result = -1; | 181 | result = -EIO; |
182 | dev_err(&vt596_adapter.dev, "SMBus collision!\n"); | 182 | dev_err(&vt596_adapter.dev, "SMBus collision!\n"); |
183 | } | 183 | } |
184 | 184 | ||
185 | if (temp & 0x04) { | 185 | if (temp & 0x04) { |
186 | int read = inb_p(SMBHSTADD) & 0x01; | 186 | int read = inb_p(SMBHSTADD) & 0x01; |
187 | result = -1; | 187 | result = -ENXIO; |
188 | /* The quick and receive byte commands are used to probe | 188 | /* The quick and receive byte commands are used to probe |
189 | for chips, so errors are expected, and we don't want | 189 | for chips, so errors are expected, and we don't want |
190 | to frighten the user. */ | 190 | to frighten the user. */ |
@@ -202,12 +202,13 @@ static int vt596_transaction(u8 size) | |||
202 | return result; | 202 | return result; |
203 | } | 203 | } |
204 | 204 | ||
205 | /* Return -1 on error, 0 on success */ | 205 | /* Return negative errno on error, 0 on success */ |
206 | static s32 vt596_access(struct i2c_adapter *adap, u16 addr, | 206 | static s32 vt596_access(struct i2c_adapter *adap, u16 addr, |
207 | unsigned short flags, char read_write, u8 command, | 207 | unsigned short flags, char read_write, u8 command, |
208 | int size, union i2c_smbus_data *data) | 208 | int size, union i2c_smbus_data *data) |
209 | { | 209 | { |
210 | int i; | 210 | int i; |
211 | int status; | ||
211 | 212 | ||
212 | switch (size) { | 213 | switch (size) { |
213 | case I2C_SMBUS_QUICK: | 214 | case I2C_SMBUS_QUICK: |
@@ -258,8 +259,9 @@ static s32 vt596_access(struct i2c_adapter *adap, u16 addr, | |||
258 | 259 | ||
259 | outb_p(((addr & 0x7f) << 1) | read_write, SMBHSTADD); | 260 | outb_p(((addr & 0x7f) << 1) | read_write, SMBHSTADD); |
260 | 261 | ||
261 | if (vt596_transaction(size)) /* Error in transaction */ | 262 | status = vt596_transaction(size); |
262 | return -1; | 263 | if (status) |
264 | return status; | ||
263 | 265 | ||
264 | if ((read_write == I2C_SMBUS_WRITE) || (size == VT596_QUICK)) | 266 | if ((read_write == I2C_SMBUS_WRITE) || (size == VT596_QUICK)) |
265 | return 0; | 267 | return 0; |
@@ -287,7 +289,7 @@ static s32 vt596_access(struct i2c_adapter *adap, u16 addr, | |||
287 | exit_unsupported: | 289 | exit_unsupported: |
288 | dev_warn(&vt596_adapter.dev, "Unsupported command invoked! (0x%02x)\n", | 290 | dev_warn(&vt596_adapter.dev, "Unsupported command invoked! (0x%02x)\n", |
289 | size); | 291 | size); |
290 | return -1; | 292 | return -EOPNOTSUPP; |
291 | } | 293 | } |
292 | 294 | ||
293 | static u32 vt596_func(struct i2c_adapter *adapter) | 295 | static u32 vt596_func(struct i2c_adapter *adapter) |