Skip to content

Commit

Permalink
i2c-algo-pcf: Add adapter hooks around xfer begin and end
Browse files Browse the repository at this point in the history
Some I2C bus implementations need to synchronize with external
entities, such as system firmware, which might also be programming the
same I2C bus.

In order to facilitate this add ->xfer_begin() and ->xfer_end() hooks
which are invoked around pcf_xfer().

[JD: Make these hooks optional.]

Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Jean Delvare <khali@linux-fr.org>
  • Loading branch information
David Miller authored and Jean Delvare committed Oct 22, 2008
1 parent 08e5338 commit 3009140
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 4 deletions.
17 changes: 13 additions & 4 deletions drivers/i2c/algos/i2c-algo-pcf.c
Original file line number Diff line number Diff line change
Expand Up @@ -331,13 +331,16 @@ static int pcf_xfer(struct i2c_adapter *i2c_adap,
int i;
int ret=0, timeout, status;

if (adap->xfer_begin)
adap->xfer_begin(adap->data);

/* Check for bus busy */
timeout = wait_for_bb(adap);
if (timeout) {
DEB2(printk(KERN_ERR "i2c-algo-pcf.o: "
"Timeout waiting for BB in pcf_xfer\n");)
return -EIO;
i = -EIO;
goto out;
}

for (i = 0;ret >= 0 && i < num; i++) {
Expand All @@ -359,20 +362,23 @@ static int pcf_xfer(struct i2c_adapter *i2c_adap,
if (timeout) {
if (timeout == -EINTR) {
/* arbitration lost */
return (-EINTR);
i = -EINTR;
goto out;
}
i2c_stop(adap);
DEB2(printk(KERN_ERR "i2c-algo-pcf.o: Timeout waiting "
"for PIN(1) in pcf_xfer\n");)
return (-EREMOTEIO);
i = -EREMOTEIO;
goto out;
}

#ifndef STUB_I2C
/* Check LRB (last rcvd bit - slave ack) */
if (status & I2C_PCF_LRB) {
i2c_stop(adap);
DEB2(printk(KERN_ERR "i2c-algo-pcf.o: No LRB(1) in pcf_xfer\n");)
return (-EREMOTEIO);
i = -EREMOTEIO;
goto out;
}
#endif

Expand Down Expand Up @@ -404,6 +410,9 @@ static int pcf_xfer(struct i2c_adapter *i2c_adap,
}
}

out:
if (adap->xfer_end)
adap->xfer_end(adap->data);
return (i);
}

Expand Down
3 changes: 3 additions & 0 deletions include/linux/i2c-algo-pcf.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,9 @@ struct i2c_algo_pcf_data {
int (*getclock) (void *data);
void (*waitforpin) (void *data);

void (*xfer_begin) (void *data);
void (*xfer_end) (void *data);

/* Multi-master lost arbitration back-off delay (msecs)
* This should be set by the bus adapter or knowledgable client
* if bus is multi-mastered, else zero
Expand Down

0 comments on commit 3009140

Please sign in to comment.