Message ID | 1548220918-950-1-git-send-email-shubhrajyoti.datta@gmail.com |
---|---|
State | Superseded |
Headers | show |
Series | [PATCHv4] i2c: cadence: Fix the hold bit setting | expand |
On Wed, Jan 23, 2019 at 10:51:58AM +0530, shubhrajyoti.datta@gmail.com wrote: > From: Shubhrajyoti Datta <shubhrajyoti.datta@xilinx.com> > > In case the hold bit is not needed we are carring the old values > fix the same by resetting the bit when not needed. Typo: s/carring/carrying/. Also missing a period after "values." > > Fixes the sporadic i2c bus lockups on National Instruments > Zynq-based devices. > > Fixes: df8eb5691c48 ("i2c: Add driver for Cadence I2C controller") > Acked-by: Michal Simek <michal.simek@xilinx.com> > Reported-and-tested-by: Kyle Roeschley <kyle.roeschley@ni.com> > Signed-off-by: Shubhrajyoti Datta <shubhrajyoti.datta@xilinx.com> > --- > v4: > update fixes tag > v3: > Add fixes and Ack > v2: > Update commit log > Also check if the hold_flag > > drivers/i2c/busses/i2c-cadence.c | 9 +++++++-- > 1 file changed, 7 insertions(+), 2 deletions(-) > > diff --git a/drivers/i2c/busses/i2c-cadence.c b/drivers/i2c/busses/i2c-cadence.c > index b136057..b2b3df1 100644 > --- a/drivers/i2c/busses/i2c-cadence.c > +++ b/drivers/i2c/busses/i2c-cadence.c > @@ -382,8 +382,10 @@ static void cdns_i2c_mrecv(struct cdns_i2c *id) > * Check for the message size against FIFO depth and set the > * 'hold bus' bit if it is greater than FIFO depth. > */ > - if (id->recv_count > CDNS_I2C_FIFO_DEPTH) > + if (id->recv_count > CDNS_I2C_FIFO_DEPTH || id->bus_hold_flag) > ctrl_reg |= CDNS_I2C_CR_HOLD; > + else > + ctrl_reg = ctrl_reg & ~CDNS_I2C_CR_HOLD; > > cdns_i2c_writereg(ctrl_reg, CDNS_I2C_CR_OFFSET); > > @@ -440,8 +442,11 @@ static void cdns_i2c_msend(struct cdns_i2c *id) > * Check for the message size against FIFO depth and set the > * 'hold bus' bit if it is greater than FIFO depth. > */ > - if (id->send_count > CDNS_I2C_FIFO_DEPTH) > + if (id->recv_count > CDNS_I2C_FIFO_DEPTH || id->bus_hold_flag) This should be checking send_count, not recv_count. > ctrl_reg |= CDNS_I2C_CR_HOLD; > + else > + ctrl_reg = ctrl_reg & ~CDNS_I2C_CR_HOLD; > + > cdns_i2c_writereg(ctrl_reg, CDNS_I2C_CR_OFFSET); > > /* Clear the interrupts in interrupt status register. */
On 2019-02-04 22:41, Kyle Roeschley wrote: > On Wed, Jan 23, 2019 at 10:51:58AM +0530, shubhrajyoti.datta@gmail.com wrote: >> From: Shubhrajyoti Datta <shubhrajyoti.datta@xilinx.com> >> >> In case the hold bit is not needed we are carring the old values >> fix the same by resetting the bit when not needed. > > Typo: s/carring/carrying/. Also missing a period after "values." > >> >> Fixes the sporadic i2c bus lockups on National Instruments >> Zynq-based devices. >> >> Fixes: df8eb5691c48 ("i2c: Add driver for Cadence I2C controller") >> Acked-by: Michal Simek <michal.simek@xilinx.com> >> Reported-and-tested-by: Kyle Roeschley <kyle.roeschley@ni.com> >> Signed-off-by: Shubhrajyoti Datta <shubhrajyoti.datta@xilinx.com> >> --- >> v4: >> update fixes tag >> v3: >> Add fixes and Ack >> v2: >> Update commit log >> Also check if the hold_flag >> >> drivers/i2c/busses/i2c-cadence.c | 9 +++++++-- >> 1 file changed, 7 insertions(+), 2 deletions(-) >> >> diff --git a/drivers/i2c/busses/i2c-cadence.c b/drivers/i2c/busses/i2c-cadence.c >> index b136057..b2b3df1 100644 >> --- a/drivers/i2c/busses/i2c-cadence.c >> +++ b/drivers/i2c/busses/i2c-cadence.c >> @@ -382,8 +382,10 @@ static void cdns_i2c_mrecv(struct cdns_i2c *id) >> * Check for the message size against FIFO depth and set the >> * 'hold bus' bit if it is greater than FIFO depth. >> */ >> - if (id->recv_count > CDNS_I2C_FIFO_DEPTH) >> + if (id->recv_count > CDNS_I2C_FIFO_DEPTH || id->bus_hold_flag) >> ctrl_reg |= CDNS_I2C_CR_HOLD; >> + else >> + ctrl_reg = ctrl_reg & ~CDNS_I2C_CR_HOLD; >> >> cdns_i2c_writereg(ctrl_reg, CDNS_I2C_CR_OFFSET); >> >> @@ -440,8 +442,11 @@ static void cdns_i2c_msend(struct cdns_i2c *id) >> * Check for the message size against FIFO depth and set the >> * 'hold bus' bit if it is greater than FIFO depth. >> */ >> - if (id->send_count > CDNS_I2C_FIFO_DEPTH) >> + if (id->recv_count > CDNS_I2C_FIFO_DEPTH || id->bus_hold_flag) > > This should be checking send_count, not recv_count. Also, only one space before || (applies above as well). Cheers, Peter >> ctrl_reg |= CDNS_I2C_CR_HOLD; >> + else >> + ctrl_reg = ctrl_reg & ~CDNS_I2C_CR_HOLD; >> + >> cdns_i2c_writereg(ctrl_reg, CDNS_I2C_CR_OFFSET); >> >> /* Clear the interrupts in interrupt status register. */ >
diff --git a/drivers/i2c/busses/i2c-cadence.c b/drivers/i2c/busses/i2c-cadence.c index b136057..b2b3df1 100644 --- a/drivers/i2c/busses/i2c-cadence.c +++ b/drivers/i2c/busses/i2c-cadence.c @@ -382,8 +382,10 @@ static void cdns_i2c_mrecv(struct cdns_i2c *id) * Check for the message size against FIFO depth and set the * 'hold bus' bit if it is greater than FIFO depth. */ - if (id->recv_count > CDNS_I2C_FIFO_DEPTH) + if (id->recv_count > CDNS_I2C_FIFO_DEPTH || id->bus_hold_flag) ctrl_reg |= CDNS_I2C_CR_HOLD; + else + ctrl_reg = ctrl_reg & ~CDNS_I2C_CR_HOLD; cdns_i2c_writereg(ctrl_reg, CDNS_I2C_CR_OFFSET); @@ -440,8 +442,11 @@ static void cdns_i2c_msend(struct cdns_i2c *id) * Check for the message size against FIFO depth and set the * 'hold bus' bit if it is greater than FIFO depth. */ - if (id->send_count > CDNS_I2C_FIFO_DEPTH) + if (id->recv_count > CDNS_I2C_FIFO_DEPTH || id->bus_hold_flag) ctrl_reg |= CDNS_I2C_CR_HOLD; + else + ctrl_reg = ctrl_reg & ~CDNS_I2C_CR_HOLD; + cdns_i2c_writereg(ctrl_reg, CDNS_I2C_CR_OFFSET); /* Clear the interrupts in interrupt status register. */