On Sat, Nov 15, 2014 at 05:20:51AM +0400, Alexander Kochetkov wrote: > commit 1d7afc95946487945cc7f5019b41255b72224b70 (i2c: omap: ack IRQ in parts) > changed the interrupt handler to complete transfers without clearing > XRDY (AL case) and ARDY (NACK case) flags. XRDY or ARDY interrupt will be > fired again (in parallel with omap_i2c_xfer_msg). Interrupt handler will > complete transfers second time. As a result, NACK and AL transfers > terminates with "transfer timeout" and sometimes client code segfault. > > The patch restore original logic of handling NACK and AL interrupts and > fix race between interrupt handler and omap_i2c_xfer_msg (for AL and > NACK case only). > > Tested on Beagleboard XM C. > Assuming this is really correct (I haven't tested), you need to add: Fixes: 1d7afc9 i2c: omap: ack IRQ in parts Cc: <stable@xxxxxxxxxxxxxxx> # v3.7+ here and resend, so it gets backported to older kernels. > Signed-off-by: Alexander Kochetkov <al.kochet@xxxxxxxxx> > --- > drivers/i2c/busses/i2c-omap.c | 2 -- > 1 file changed, 2 deletions(-) > > diff --git a/drivers/i2c/busses/i2c-omap.c b/drivers/i2c/busses/i2c-omap.c > index 90dcc2e..9af7095 100644 > --- a/drivers/i2c/busses/i2c-omap.c > +++ b/drivers/i2c/busses/i2c-omap.c > @@ -926,14 +926,12 @@ omap_i2c_isr_thread(int this_irq, void *dev_id) > if (stat & OMAP_I2C_STAT_NACK) { > err |= OMAP_I2C_STAT_NACK; > omap_i2c_ack_stat(dev, OMAP_I2C_STAT_NACK); > - break; > } > > if (stat & OMAP_I2C_STAT_AL) { > dev_err(dev->dev, "Arbitration lost\n"); > err |= OMAP_I2C_STAT_AL; > omap_i2c_ack_stat(dev, OMAP_I2C_STAT_AL); > - break; > } > > /* > -- > 1.7.9.5 > -- balbi
Attachment:
signature.asc
Description: Digital signature