diff mbox

[v2] i2c: tegra: Add delay before reset the controller

Message ID 1333345982-16595-1-git-send-email-alokc@nvidia.com
State Not Applicable, archived
Headers show

Commit Message

Alok Chauhan April 2, 2012, 5:53 a.m. UTC
NACK interrupt generated before I2C controller generates
the STOP condition on bus. In Software, because of this
reset of controller is happening before I2C controller could
complete STOP condition. So wait for some time before resetting
the controller so that STOP condition has delivered properly on bus.

Added delay of 2 clock period before reset the
controller in case of NACK error.

Signed-off-by: Alok Chauhan <alokc@nvidia.com>
---
Added the more descriptive commit message about issue in case
of NACK error condition. Changed the comment in code also

 drivers/i2c/busses/i2c-tegra.c |    8 ++++++++
 1 files changed, 8 insertions(+), 0 deletions(-)

Comments

Stephen Warren April 2, 2012, 7:58 p.m. UTC | #1
On 04/01/2012 11:53 PM, Alok Chauhan wrote:
> NACK interrupt generated before I2C controller generates
> the STOP condition on bus. In Software, because of this
> reset of controller is happening before I2C controller could
> complete STOP condition. So wait for some time before resetting
> the controller so that STOP condition has delivered properly on bus.
> 
> Added delay of 2 clock period before reset the
> controller in case of NACK error.
> 
> Signed-off-by: Alok Chauhan <alokc@nvidia.com>

Acked-by: Stephen Warren <swarren@wwwdotorg.org>
--
To unsubscribe from this list: send the line "unsubscribe linux-tegra" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Stephen Warren April 13, 2012, 10:51 p.m. UTC | #2
On 04/02/2012 01:58 PM, Stephen Warren wrote:
> On 04/01/2012 11:53 PM, Alok Chauhan wrote:
>> NACK interrupt generated before I2C controller generates
>> the STOP condition on bus. In Software, because of this
>> reset of controller is happening before I2C controller could
>> complete STOP condition. So wait for some time before resetting
>> the controller so that STOP condition has delivered properly on bus.
>>
>> Added delay of 2 clock period before reset the
>> controller in case of NACK error.
>>
>> Signed-off-by: Alok Chauhan <alokc@nvidia.com>
> 
> Acked-by: Stephen Warren <swarren@wwwdotorg.org>

Wolfram, Ben, can this be picked up for 3.5?
--
To unsubscribe from this list: send the line "unsubscribe linux-tegra" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Wolfram Sang April 18, 2012, 2:27 p.m. UTC | #3
On Mon, Apr 02, 2012 at 11:23:02AM +0530, Alok Chauhan wrote:
> NACK interrupt generated before I2C controller generates
> the STOP condition on bus. In Software, because of this
> reset of controller is happening before I2C controller could
> complete STOP condition. So wait for some time before resetting
> the controller so that STOP condition has delivered properly on bus.
> 
> Added delay of 2 clock period before reset the
> controller in case of NACK error.
> 
> Signed-off-by: Alok Chauhan <alokc@nvidia.com>

Applied with Stephen's ACK and slightly reworded comment and commit msg.

Wondering a bit that you want it for 3.5, not for 3.4. Looks like a
bugfix to me.
Stephen Warren April 18, 2012, 8:02 p.m. UTC | #4
On 04/18/2012 08:27 AM, Wolfram Sang wrote:
> On Mon, Apr 02, 2012 at 11:23:02AM +0530, Alok Chauhan wrote:
>> NACK interrupt generated before I2C controller generates
>> the STOP condition on bus. In Software, because of this
>> reset of controller is happening before I2C controller could
>> complete STOP condition. So wait for some time before resetting
>> the controller so that STOP condition has delivered properly on bus.
>>
>> Added delay of 2 clock period before reset the
>> controller in case of NACK error.
>>
>> Signed-off-by: Alok Chauhan <alokc@nvidia.com>
> 
> Applied with Stephen's ACK and slightly reworded comment and commit msg.
> 
> Wondering a bit that you want it for 3.5, not for 3.4. Looks like a
> bugfix to me.

Yes, applying this to 3.4 would make sense. When I said "for 3.5"
earlier, I meant I'd like it to at least get into 3.5 not later.

Thanks.
--
To unsubscribe from this list: send the line "unsubscribe linux-tegra" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Wolfram Sang April 18, 2012, 8:20 p.m. UTC | #5
> > Applied with Stephen's ACK and slightly reworded comment and commit msg.
> > 
> > Wondering a bit that you want it for 3.5, not for 3.4. Looks like a
> > bugfix to me.
> 
> Yes, applying this to 3.4 would make sense. When I said "for 3.5"
> earlier, I meant I'd like it to at least get into 3.5 not later.

Done, thanks for clarifying.
diff mbox

Patch

diff --git a/drivers/i2c/busses/i2c-tegra.c b/drivers/i2c/busses/i2c-tegra.c
index e978635..dfb850a8 100644
--- a/drivers/i2c/busses/i2c-tegra.c
+++ b/drivers/i2c/busses/i2c-tegra.c
@@ -516,6 +516,14 @@  static int tegra_i2c_xfer_msg(struct tegra_i2c_dev *i2c_dev,
 	if (likely(i2c_dev->msg_err == I2C_ERR_NONE))
 		return 0;
 
+	/*
+	 * NACK interrupt generated before I2C controller generates the STOP
+	 * condition on bus. So wait for some time before reset the controller
+	 * so that STOP condition has delivered properly on bus.
+	 */
+	if (i2c_dev->msg_err == I2C_ERR_NO_ACK)
+		udelay(DIV_ROUND_UP(2 * 1000000, i2c_dev->bus_clk_rate));
+
 	tegra_i2c_init(i2c_dev);
 	if (i2c_dev->msg_err == I2C_ERR_NO_ACK) {
 		if (msg->flags & I2C_M_IGNORE_NAK)