Message ID | 20090619125002.GA17067@gandalf.sssup.it (mailing list archive) |
---|---|
State | RFC, archived |
Delegated to: | Kumar Gala |
Headers | show |
Hi Michael, > This happen because though the wait_event_interruptible_timeout takes the > signals into account, the driver does not handle them. > We propose to change the wait_event_interruptible_timeout with > wait_event_timeout, leaving the signals to be handled in other points > on the upper layers. Makes sense. I2C transactions better shouldn't be interrupted or data loss might happen. > Signed-off-by: Bruno Morelli <bruno@evidence.eu.com> > Signed-off-by: Michael Trimarchi <michael@evidence.eu.com> Acked-by: Jochen Friedrich <jochen@scram.de> Thanks, Jochen
diff --git a/drivers/i2c/busses/i2c-cpm.c b/drivers/i2c/busses/i2c-cpm.c index b5db8b8..9c2e100 100644 --- a/drivers/i2c/busses/i2c-cpm.c +++ b/drivers/i2c/busses/i2c-cpm.c @@ -140,7 +140,7 @@ static irqreturn_t cpm_i2c_interrupt(int irq, void *dev_id) dev_dbg(&adap->dev, "Interrupt: %x\n", i); - wake_up_interruptible(&cpm->i2c_wait); + wake_up(&cpm->i2c_wait); return i ? IRQ_HANDLED : IRQ_NONE; } @@ -364,12 +364,12 @@ static int cpm_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num) dev_dbg(&adap->dev, "test ready.\n"); pmsg = &msgs[tptr]; if (pmsg->flags & I2C_M_RD) - ret = wait_event_interruptible_timeout(cpm->i2c_wait, + ret = wait_event_timeout(cpm->i2c_wait, (in_be16(&tbdf[tptr].cbd_sc) & BD_SC_NAK) || !(in_be16(&rbdf[rptr].cbd_sc) & BD_SC_EMPTY), 1 * HZ); else - ret = wait_event_interruptible_timeout(cpm->i2c_wait, + ret = wait_event_timeout(cpm->i2c_wait, !(in_be16(&tbdf[tptr].cbd_sc) & BD_SC_READY), 1 * HZ); if (ret == 0) {