diff options
| author | Jean Delvare <khali@linux-fr.org> | 2010-03-13 14:56:56 -0500 |
|---|---|---|
| committer | Jean Delvare <khali@linux-fr.org> | 2010-03-13 14:56:56 -0500 |
| commit | 0a9c14751377a1407f5e35791e13651d2fc7801c (patch) | |
| tree | e4e524eafda521834d3d2a7fa8a6118e1bae3c32 | |
| parent | d07b56b3098b9f32ae6dedeacbc594bd01dcfcd1 (diff) | |
i2c-algo-bit: Add pre- and post-xfer hooks
Drivers might have to do random things before and/or after I2C
transfers. Add hooks to the i2c-algo-bit implementation to let them do
so.
Signed-off-by: Jean Delvare <khali@linux-fr.org>
Cc: Alex Deucher <alexdeucher@gmail.com>
| -rw-r--r-- | drivers/i2c/algos/i2c-algo-bit.c | 9 | ||||
| -rw-r--r-- | include/linux/i2c-algo-bit.h | 2 |
2 files changed, 11 insertions, 0 deletions
diff --git a/drivers/i2c/algos/i2c-algo-bit.c b/drivers/i2c/algos/i2c-algo-bit.c index e25e13980af3..e8d568c3fb09 100644 --- a/drivers/i2c/algos/i2c-algo-bit.c +++ b/drivers/i2c/algos/i2c-algo-bit.c | |||
| @@ -522,6 +522,12 @@ static int bit_xfer(struct i2c_adapter *i2c_adap, | |||
| 522 | int i, ret; | 522 | int i, ret; |
| 523 | unsigned short nak_ok; | 523 | unsigned short nak_ok; |
| 524 | 524 | ||
| 525 | if (adap->pre_xfer) { | ||
| 526 | ret = adap->pre_xfer(i2c_adap); | ||
| 527 | if (ret < 0) | ||
| 528 | return ret; | ||
| 529 | } | ||
| 530 | |||
| 525 | bit_dbg(3, &i2c_adap->dev, "emitting start condition\n"); | 531 | bit_dbg(3, &i2c_adap->dev, "emitting start condition\n"); |
| 526 | i2c_start(adap); | 532 | i2c_start(adap); |
| 527 | for (i = 0; i < num; i++) { | 533 | for (i = 0; i < num; i++) { |
| @@ -570,6 +576,9 @@ static int bit_xfer(struct i2c_adapter *i2c_adap, | |||
| 570 | bailout: | 576 | bailout: |
| 571 | bit_dbg(3, &i2c_adap->dev, "emitting stop condition\n"); | 577 | bit_dbg(3, &i2c_adap->dev, "emitting stop condition\n"); |
| 572 | i2c_stop(adap); | 578 | i2c_stop(adap); |
| 579 | |||
| 580 | if (adap->post_xfer) | ||
| 581 | adap->post_xfer(i2c_adap); | ||
| 573 | return ret; | 582 | return ret; |
| 574 | } | 583 | } |
| 575 | 584 | ||
diff --git a/include/linux/i2c-algo-bit.h b/include/linux/i2c-algo-bit.h index 111334f5b922..4f98148c11c3 100644 --- a/include/linux/i2c-algo-bit.h +++ b/include/linux/i2c-algo-bit.h | |||
| @@ -36,6 +36,8 @@ struct i2c_algo_bit_data { | |||
| 36 | void (*setscl) (void *data, int state); | 36 | void (*setscl) (void *data, int state); |
| 37 | int (*getsda) (void *data); | 37 | int (*getsda) (void *data); |
| 38 | int (*getscl) (void *data); | 38 | int (*getscl) (void *data); |
| 39 | int (*pre_xfer) (struct i2c_adapter *); | ||
| 40 | void (*post_xfer) (struct i2c_adapter *); | ||
| 39 | 41 | ||
| 40 | /* local settings */ | 42 | /* local settings */ |
| 41 | int udelay; /* half clock cycle time in us, | 43 | int udelay; /* half clock cycle time in us, |
