On 27/07/15 12:47, Sifan Naeem wrote: > Remove start bit detected status after it is handled, > doing so will prevent this condition being hit for > every interrupt on a particular transfer. > > Fixes: 27bce4 ("i2c: img-scb: Add Imagination Technologies I2C SCB driver") > Signed-off-by: Sifan Naeem <sifan.naeem@xxxxxxxxxx> > Cc: Stable kernel (v3.19+) <stable@xxxxxxxxxxxxxxx> > --- > drivers/i2c/busses/i2c-img-scb.c | 16 ++++++++++++---- > 1 file changed, 12 insertions(+), 4 deletions(-) > > diff --git a/drivers/i2c/busses/i2c-img-scb.c b/drivers/i2c/busses/i2c-img-scb.c > index 653f9bd..341130e 100644 > --- a/drivers/i2c/busses/i2c-img-scb.c > +++ b/drivers/i2c/busses/i2c-img-scb.c > @@ -871,10 +871,18 @@ static unsigned int img_i2c_auto(struct img_i2c *i2c, > } > > /* Enable transaction halt on start bit */ > - if (!i2c->last_msg && i2c->line_status & LINESTAT_START_BIT_DET) { i2c->line_status accumulates the line status bits that have been seen with each interrupt. If we're only interested in that bit from the current interrupt, should it just be referring to line_status (the argument to img_i2c_auto) instead of i2c->line_status? Cheers James > - img_i2c_transaction_halt(i2c, true); > - /* we're no longer interested in the slave event */ > - i2c->int_enable &= ~INT_SLAVE_EVENT; > + if (i2c->line_status & LINESTAT_START_BIT_DET) { > + if (!i2c->last_msg) { > + img_i2c_transaction_halt(i2c, true); > + /* we're no longer interested in the slave event */ > + i2c->int_enable &= ~INT_SLAVE_EVENT; > + } > + /* > + * Remove start bit detected status after it is handled, > + * doing so will prevent this condition being hit for > + * every interrupt on a particular transfer. > + */ > + i2c->line_status &= ~LINESTAT_START_BIT_DET; > } > > mod_timer(&i2c->check_timer, jiffies + msecs_to_jiffies(1)); >
Attachment:
signature.asc
Description: OpenPGP digital signature