diff options
Diffstat (limited to 'drivers/i2c/algos/i2c-algo-pcf.c')
-rw-r--r-- | drivers/i2c/algos/i2c-algo-pcf.c | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/drivers/i2c/algos/i2c-algo-pcf.c b/drivers/i2c/algos/i2c-algo-pcf.c index 1e328d19cd6d..3e01992230b8 100644 --- a/drivers/i2c/algos/i2c-algo-pcf.c +++ b/drivers/i2c/algos/i2c-algo-pcf.c | |||
@@ -135,7 +135,7 @@ static int wait_for_pin(struct i2c_algo_pcf_data *adap, int *status) { | |||
135 | *status = get_pcf(adap, 1); | 135 | *status = get_pcf(adap, 1); |
136 | #ifndef STUB_I2C | 136 | #ifndef STUB_I2C |
137 | while (timeout-- && (*status & I2C_PCF_PIN)) { | 137 | while (timeout-- && (*status & I2C_PCF_PIN)) { |
138 | adap->waitforpin(); | 138 | adap->waitforpin(adap->data); |
139 | *status = get_pcf(adap, 1); | 139 | *status = get_pcf(adap, 1); |
140 | } | 140 | } |
141 | if (*status & I2C_PCF_LAB) { | 141 | if (*status & I2C_PCF_LAB) { |
@@ -208,7 +208,7 @@ static int pcf_init_8584 (struct i2c_algo_pcf_data *adap) | |||
208 | return -ENXIO; | 208 | return -ENXIO; |
209 | } | 209 | } |
210 | 210 | ||
211 | printk(KERN_DEBUG "i2c-algo-pcf.o: deteted and initialized PCF8584.\n"); | 211 | printk(KERN_DEBUG "i2c-algo-pcf.o: detected and initialized PCF8584.\n"); |
212 | 212 | ||
213 | return 0; | 213 | return 0; |
214 | } | 214 | } |
@@ -331,13 +331,16 @@ static int pcf_xfer(struct i2c_adapter *i2c_adap, | |||
331 | int i; | 331 | int i; |
332 | int ret=0, timeout, status; | 332 | int ret=0, timeout, status; |
333 | 333 | ||
334 | if (adap->xfer_begin) | ||
335 | adap->xfer_begin(adap->data); | ||
334 | 336 | ||
335 | /* Check for bus busy */ | 337 | /* Check for bus busy */ |
336 | timeout = wait_for_bb(adap); | 338 | timeout = wait_for_bb(adap); |
337 | if (timeout) { | 339 | if (timeout) { |
338 | DEB2(printk(KERN_ERR "i2c-algo-pcf.o: " | 340 | DEB2(printk(KERN_ERR "i2c-algo-pcf.o: " |
339 | "Timeout waiting for BB in pcf_xfer\n");) | 341 | "Timeout waiting for BB in pcf_xfer\n");) |
340 | return -EIO; | 342 | i = -EIO; |
343 | goto out; | ||
341 | } | 344 | } |
342 | 345 | ||
343 | for (i = 0;ret >= 0 && i < num; i++) { | 346 | for (i = 0;ret >= 0 && i < num; i++) { |
@@ -359,12 +362,14 @@ static int pcf_xfer(struct i2c_adapter *i2c_adap, | |||
359 | if (timeout) { | 362 | if (timeout) { |
360 | if (timeout == -EINTR) { | 363 | if (timeout == -EINTR) { |
361 | /* arbitration lost */ | 364 | /* arbitration lost */ |
362 | return (-EINTR); | 365 | i = -EINTR; |
366 | goto out; | ||
363 | } | 367 | } |
364 | i2c_stop(adap); | 368 | i2c_stop(adap); |
365 | DEB2(printk(KERN_ERR "i2c-algo-pcf.o: Timeout waiting " | 369 | DEB2(printk(KERN_ERR "i2c-algo-pcf.o: Timeout waiting " |
366 | "for PIN(1) in pcf_xfer\n");) | 370 | "for PIN(1) in pcf_xfer\n");) |
367 | return (-EREMOTEIO); | 371 | i = -EREMOTEIO; |
372 | goto out; | ||
368 | } | 373 | } |
369 | 374 | ||
370 | #ifndef STUB_I2C | 375 | #ifndef STUB_I2C |
@@ -372,7 +377,8 @@ static int pcf_xfer(struct i2c_adapter *i2c_adap, | |||
372 | if (status & I2C_PCF_LRB) { | 377 | if (status & I2C_PCF_LRB) { |
373 | i2c_stop(adap); | 378 | i2c_stop(adap); |
374 | DEB2(printk(KERN_ERR "i2c-algo-pcf.o: No LRB(1) in pcf_xfer\n");) | 379 | DEB2(printk(KERN_ERR "i2c-algo-pcf.o: No LRB(1) in pcf_xfer\n");) |
375 | return (-EREMOTEIO); | 380 | i = -EREMOTEIO; |
381 | goto out; | ||
376 | } | 382 | } |
377 | #endif | 383 | #endif |
378 | 384 | ||
@@ -404,6 +410,9 @@ static int pcf_xfer(struct i2c_adapter *i2c_adap, | |||
404 | } | 410 | } |
405 | } | 411 | } |
406 | 412 | ||
413 | out: | ||
414 | if (adap->xfer_end) | ||
415 | adap->xfer_end(adap->data); | ||
407 | return (i); | 416 | return (i); |
408 | } | 417 | } |
409 | 418 | ||