[ARM] Fix i2c-pxa slave mode support
authorRussell King <rmk@dyn-67.arm.linux.org.uk>
Sat, 28 Oct 2006 21:30:17 +0000 (22:30 +0100)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Sat, 28 Oct 2006 21:30:17 +0000 (22:30 +0100)
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>
drivers/i2c/busses/i2c-pxa.c

index 81050d3c9b21935512f3db5f2a810245ebaafb4d..c95a6c154165d7bfcf940e94a2e2d5d51e575110 100644 (file)
@@ -272,7 +272,8 @@ static int i2c_pxa_wait_slave(struct pxa_i2c *i2c)
                        dev_dbg(&i2c->adap.dev, "%s: %ld: ISR=%08x, ICR=%08x, IBMR=%02x\n",
                                __func__, (long)jiffies, ISR, ICR, IBMR);
 
-               if ((ISR & (ISR_UB|ISR_IBB|ISR_SAD)) == ISR_SAD ||
+               if ((ISR & (ISR_UB|ISR_IBB)) == 0 ||
+                   (ISR & ISR_SAD) != 0 ||
                    (ICR & ICR_SCLE) == 0) {
                        if (i2c_debug > 1)
                                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)
        if (isr & ISR_BED) {
                /* what should we do here? */
        } else {
-               int ret = i2c->slave->read(i2c->slave->data);
+               int ret = 0;
+
+               if (i2c->slave != NULL)
+                       ret = i2c->slave->read(i2c->slave->data);
 
                IDBR = ret;
                ICR |= ICR_TB;   /* allow next byte */