diff options
| author | Russell King <rmk@dyn-67.arm.linux.org.uk> | 2006-10-28 17:30:17 -0400 |
|---|---|---|
| committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2006-10-28 17:30:17 -0400 |
| commit | 84b5abe69ff600a559e1a1fa29f1edad707d4e2f (patch) | |
| tree | 0a50664ab4b1eb1c5341e82ea0841951d193a818 | |
| parent | e0f205d9c656da9dad6340f75e33a96014b7d23f (diff) | |
[ARM] Fix i2c-pxa slave mode support
i2c-pxa times out when trying to enable slave mode due to an
incorrect test. Also, check that i2c->slave is non-NULL
before dereferencing it.
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
| -rw-r--r-- | drivers/i2c/busses/i2c-pxa.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/drivers/i2c/busses/i2c-pxa.c b/drivers/i2c/busses/i2c-pxa.c index 81050d3c9b21..c95a6c154165 100644 --- a/drivers/i2c/busses/i2c-pxa.c +++ b/drivers/i2c/busses/i2c-pxa.c | |||
| @@ -272,7 +272,8 @@ static int i2c_pxa_wait_slave(struct pxa_i2c *i2c) | |||
| 272 | dev_dbg(&i2c->adap.dev, "%s: %ld: ISR=%08x, ICR=%08x, IBMR=%02x\n", | 272 | dev_dbg(&i2c->adap.dev, "%s: %ld: ISR=%08x, ICR=%08x, IBMR=%02x\n", |
| 273 | __func__, (long)jiffies, ISR, ICR, IBMR); | 273 | __func__, (long)jiffies, ISR, ICR, IBMR); |
| 274 | 274 | ||
| 275 | if ((ISR & (ISR_UB|ISR_IBB|ISR_SAD)) == ISR_SAD || | 275 | if ((ISR & (ISR_UB|ISR_IBB)) == 0 || |
| 276 | (ISR & ISR_SAD) != 0 || | ||
| 276 | (ICR & ICR_SCLE) == 0) { | 277 | (ICR & ICR_SCLE) == 0) { |
| 277 | if (i2c_debug > 1) | 278 | if (i2c_debug > 1) |
| 278 | dev_dbg(&i2c->adap.dev, "%s: done\n", __func__); | 279 | dev_dbg(&i2c->adap.dev, "%s: done\n", __func__); |
| @@ -492,7 +493,10 @@ static void i2c_pxa_slave_txempty(struct pxa_i2c *i2c, u32 isr) | |||
| 492 | if (isr & ISR_BED) { | 493 | if (isr & ISR_BED) { |
| 493 | /* what should we do here? */ | 494 | /* what should we do here? */ |
| 494 | } else { | 495 | } else { |
| 495 | int ret = i2c->slave->read(i2c->slave->data); | 496 | int ret = 0; |
| 497 | |||
| 498 | if (i2c->slave != NULL) | ||
| 499 | ret = i2c->slave->read(i2c->slave->data); | ||
| 496 | 500 | ||
| 497 | IDBR = ret; | 501 | IDBR = ret; |
| 498 | ICR |= ICR_TB; /* allow next byte */ | 502 | ICR |= ICR_TB; /* allow next byte */ |
