All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] i2c: tegra: Add delay before reset the controller
@ 2012-03-30 12:06 ` Alok Chauhan
  0 siblings, 0 replies; 12+ messages in thread
From: Alok Chauhan @ 2012-03-30 12:06 UTC (permalink / raw)
  To: khali-PUYAD+kWke1g9hUCZPvPmw, ben-linux-elnMNo+KYs3YtjvyW6yDsg,
	w.sang-bIcnvbaLZ9MEGnE8C9+IrQ, swarren-DDmLM1+adcrQT0dZR+AlfA,
	olof-nZhT3qVonbNeoWH0uzbU5w, bones-s3s/WqlpOiPyB63q8FvJNQ,
	omaplinuxkernel-Re5JQEeQqe8AvxtiuMwx3w,
	ccross-z5hGa2qSFaRBDgjK7y7TUQ, ldewangan-DDmLM1+adcrQT0dZR+AlfA,
	linux-tegra-u79uwXL29TY76Z2rM5mHXA,
	linux-i2c-u79uwXL29TY76Z2rM5mHXA, dgreid-F7+t8E8rja9g9hUCZPvPmw
  Cc: alokc-DDmLM1+adcrQT0dZR+AlfA, linux-kernel-u79uwXL29TY76Z2rM5mHXA

In NACK error condition, I2C controller violates
clock-to-data setup time before stop. In Software,
because of this reset of controller is happening
before I2C controller could complete STOP condition.

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

Signed-off-by: Alok Chauhan <alokc-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
---
delay will be calculated based on clock frequency of the bus.
 drivers/i2c/busses/i2c-tegra.c |    8 ++++++++
 1 files changed, 8 insertions(+), 0 deletions(-)

diff --git a/drivers/i2c/busses/i2c-tegra.c b/drivers/i2c/busses/i2c-tegra.c
index e978635..344282e 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;
 
+	/*
+	 * In NACK error condition resetting of I2C controller happens
+	 * before STOP condition is properly completed by I2C controller,
+	 * so wait for 2 clock cycle to complete STOP condition.
+	 */
+	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)
-- 
1.7.4.1

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH] i2c: tegra: Add delay before reset the controller
@ 2012-03-30 12:06 ` Alok Chauhan
  0 siblings, 0 replies; 12+ messages in thread
From: Alok Chauhan @ 2012-03-30 12:06 UTC (permalink / raw)
  To: khali, ben-linux, w.sang, swarren, olof, bones, omaplinuxkernel,
	ccross, ldewangan, linux-tegra, linux-i2c, dgreid
  Cc: alokc, linux-kernel

In NACK error condition, I2C controller violates
clock-to-data setup time before stop. In Software,
because of this reset of controller is happening
before I2C controller could complete STOP condition.

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

Signed-off-by: Alok Chauhan <alokc@nvidia.com>
---
delay will be calculated based on clock frequency of the bus.
 drivers/i2c/busses/i2c-tegra.c |    8 ++++++++
 1 files changed, 8 insertions(+), 0 deletions(-)

diff --git a/drivers/i2c/busses/i2c-tegra.c b/drivers/i2c/busses/i2c-tegra.c
index e978635..344282e 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;
 
+	/*
+	 * In NACK error condition resetting of I2C controller happens
+	 * before STOP condition is properly completed by I2C controller,
+	 * so wait for 2 clock cycle to complete STOP condition.
+	 */
+	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)
-- 
1.7.4.1


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* Re: [PATCH] i2c: tegra: Add delay before reset the controller
  2012-03-30 12:06 ` Alok Chauhan
@ 2012-03-30 15:54     ` Stephen Warren
  -1 siblings, 0 replies; 12+ messages in thread
From: Stephen Warren @ 2012-03-30 15:54 UTC (permalink / raw)
  To: Alok Chauhan
  Cc: khali-PUYAD+kWke1g9hUCZPvPmw, ben-linux-elnMNo+KYs3YtjvyW6yDsg,
	w.sang-bIcnvbaLZ9MEGnE8C9+IrQ, swarren-DDmLM1+adcrQT0dZR+AlfA,
	olof-nZhT3qVonbNeoWH0uzbU5w, bones-s3s/WqlpOiPyB63q8FvJNQ,
	omaplinuxkernel-Re5JQEeQqe8AvxtiuMwx3w,
	ccross-z5hGa2qSFaRBDgjK7y7TUQ, ldewangan-DDmLM1+adcrQT0dZR+AlfA,
	linux-tegra-u79uwXL29TY76Z2rM5mHXA,
	linux-i2c-u79uwXL29TY76Z2rM5mHXA, dgreid-F7+t8E8rja9g9hUCZPvPmw,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA

On 03/30/2012 06:06 AM, Alok Chauhan wrote:
> In NACK error condition, I2C controller violates
> clock-to-data setup time before stop. In Software,
> because of this reset of controller is happening
> before I2C controller could complete STOP condition.

I'm not quite sure this description is correct. Surely what's happening
is simply that the controller raises the NACK interrupt as soon as it
detects a NACK condition. Then, the controller generates the STOP
condition on the bus correctly. The issue is that if software resets the
controller as soon as the NACK interrupt is raised, this will happen
before the controller has completely delivered the STOP condition onto
the bus, so we need to pause and wait for that?

I think the commit description and comment in the code should be
reworded to describe what I wrote above, assuming it's accurate.

Is there really no idle bit we can poll in the I2C controller to
determine when the STOP has completed, rather than just delaying a
"hard-coded" time? Can I2C SCL clock-stretching affect the amount of
time that must be delayed?

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH] i2c: tegra: Add delay before reset the controller
@ 2012-03-30 15:54     ` Stephen Warren
  0 siblings, 0 replies; 12+ messages in thread
From: Stephen Warren @ 2012-03-30 15:54 UTC (permalink / raw)
  To: Alok Chauhan
  Cc: khali, ben-linux, w.sang, swarren, olof, bones, omaplinuxkernel,
	ccross, ldewangan, linux-tegra, linux-i2c, dgreid, linux-kernel

On 03/30/2012 06:06 AM, Alok Chauhan wrote:
> In NACK error condition, I2C controller violates
> clock-to-data setup time before stop. In Software,
> because of this reset of controller is happening
> before I2C controller could complete STOP condition.

I'm not quite sure this description is correct. Surely what's happening
is simply that the controller raises the NACK interrupt as soon as it
detects a NACK condition. Then, the controller generates the STOP
condition on the bus correctly. The issue is that if software resets the
controller as soon as the NACK interrupt is raised, this will happen
before the controller has completely delivered the STOP condition onto
the bus, so we need to pause and wait for that?

I think the commit description and comment in the code should be
reworded to describe what I wrote above, assuming it's accurate.

Is there really no idle bit we can poll in the I2C controller to
determine when the STOP has completed, rather than just delaying a
"hard-coded" time? Can I2C SCL clock-stretching affect the amount of
time that must be delayed?

^ permalink raw reply	[flat|nested] 12+ messages in thread

* RE: [PATCH] i2c: tegra: Add delay before reset the controller
  2011-12-23 11:15         ` Alok Chauhan
@ 2011-12-23 11:20             ` Laxman Dewangan
  -1 siblings, 0 replies; 12+ messages in thread
From: Laxman Dewangan @ 2011-12-23 11:20 UTC (permalink / raw)
  To: Alok Chauhan, Olof Johansson
  Cc: khali-PUYAD+kWke1g9hUCZPvPmw, ben-linux-elnMNo+KYs3YtjvyW6yDsg,
	Stephen Warren, bones-s3s/WqlpOiPyB63q8FvJNQ,
	paul.gortmaker-CWA4WttNNZF54TAoqtyWWQ,
	linux-i2c-u79uwXL29TY76Z2rM5mHXA,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA,
	linux-tegra-u79uwXL29TY76Z2rM5mHXA,
	dgreid-hpIqsD4AKlfQT0dZR+AlfA

> -----Original Message-----
> From: Alok Chauhan
> 
> Hi,
> 
> (Adding Laxman Dewangan)
> 
> >This change causes problems systems with some models of i2c TPMs, since the
> first transaction to them will always time out (TPM quirk), and the delay
> means that the tpm will have time to go back to sleep and thus timeout >even
> on the retry. So you'll never make progress.
> Working on this.
> 
> -Alok
> 
> 
> -----Original Message-----
> From: Olof Johansson [mailto:olof-nZhT3qVonbNeoWH0uzbU5w@public.gmane.org]
> Sent: Friday, December 23, 2011 2:48 AM
> To: Alok Chauhan
> Cc: khali-PUYAD+kWke1g9hUCZPvPmw@public.gmane.org; ben-linux-elnMNo+KYs3YtjvyW6yDsg@public.gmane.org; Stephen Warren;
> bones-s3s/WqlpOiPyB63q8FvJNQ@public.gmane.org; paul.gortmaker-CWA4WttNNZF54TAoqtyWWQ@public.gmane.org; linux-i2c-u79uwXL29TY76Z2rM5mHXA@public.gmane.org;
> linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org; linux-tegra-u79uwXL29TY76Z2rM5mHXA@public.gmane.org; dgreid-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org
> Subject: Re: [PATCH] i2c: tegra: Add delay before reset the controller
> 
> Hi,
> 
> (Adding linux-tegra and Dylan Reid who was debugging this before)
> 
> On Thu, Dec 22, 2011 at 2:41 AM, Alok Chauhan <alokc-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org> wrote:
> > From: Alok Chauhan <alokc-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
> >
> > In NACK error condition, I2C controller violates clock-to-data setup
> > time before stop. In Software, because of this reset of controller is
> > happening before I2C controller could complete STOP condition.
> >
> > Added worst case delay of 1 ms (assuming lowest clock frequency will
> > be 1 KHZ) before reset the controller in case of NACK error.
> 
> This change causes problems systems with some models of i2c TPMs, since the
> first transaction to them will always time out (TPM quirk), and the delay
> means that the tpm will have time to go back to sleep and thus timeout even on
> the retry. So you'll never make progress.
> 
> In other words: this patch will break some systems and thus shouldn't be
> applied.
> 
I think the  delay should be calculated based on speed. So if it is 100KHz, then
delay is 10mcro second for 1 bit. We should wait for 2 bit (ack clock to be complete and
stop pulse to be transmitted).
This patch will make sure that i2c driver will not break the specs i.e. in case of NACK error, the stop
signal should be completed by i2c controller before resetting controller.
I will prefer of having the udelay(2*1000000/speed).

> 
> -Olof

^ permalink raw reply	[flat|nested] 12+ messages in thread

* RE: [PATCH] i2c: tegra: Add delay before reset the controller
@ 2011-12-23 11:20             ` Laxman Dewangan
  0 siblings, 0 replies; 12+ messages in thread
From: Laxman Dewangan @ 2011-12-23 11:20 UTC (permalink / raw)
  To: Alok Chauhan, Olof Johansson
  Cc: khali, ben-linux, Stephen Warren, bones, paul.gortmaker,
	linux-i2c, linux-kernel, linux-tegra, dgreid

> -----Original Message-----
> From: Alok Chauhan
> 
> Hi,
> 
> (Adding Laxman Dewangan)
> 
> >This change causes problems systems with some models of i2c TPMs, since the
> first transaction to them will always time out (TPM quirk), and the delay
> means that the tpm will have time to go back to sleep and thus timeout >even
> on the retry. So you'll never make progress.
> Working on this.
> 
> -Alok
> 
> 
> -----Original Message-----
> From: Olof Johansson [mailto:olof@lixom.net]
> Sent: Friday, December 23, 2011 2:48 AM
> To: Alok Chauhan
> Cc: khali@linux-fr.org; ben-linux@fluff.org; Stephen Warren;
> bones@secretlab.ca; paul.gortmaker@windriver.com; linux-i2c@vger.kernel.org;
> linux-kernel@vger.kernel.org; linux-tegra@vger.kernel.org; dgreid@google.com
> Subject: Re: [PATCH] i2c: tegra: Add delay before reset the controller
> 
> Hi,
> 
> (Adding linux-tegra and Dylan Reid who was debugging this before)
> 
> On Thu, Dec 22, 2011 at 2:41 AM, Alok Chauhan <alokc@nvidia.com> wrote:
> > From: Alok Chauhan <alokc@nvidia.com>
> >
> > In NACK error condition, I2C controller violates clock-to-data setup
> > time before stop. In Software, because of this reset of controller is
> > happening before I2C controller could complete STOP condition.
> >
> > Added worst case delay of 1 ms (assuming lowest clock frequency will
> > be 1 KHZ) before reset the controller in case of NACK error.
> 
> This change causes problems systems with some models of i2c TPMs, since the
> first transaction to them will always time out (TPM quirk), and the delay
> means that the tpm will have time to go back to sleep and thus timeout even on
> the retry. So you'll never make progress.
> 
> In other words: this patch will break some systems and thus shouldn't be
> applied.
> 
I think the  delay should be calculated based on speed. So if it is 100KHz, then
delay is 10mcro second for 1 bit. We should wait for 2 bit (ack clock to be complete and
stop pulse to be transmitted).
This patch will make sure that i2c driver will not break the specs i.e. in case of NACK error, the stop
signal should be completed by i2c controller before resetting controller.
I will prefer of having the udelay(2*1000000/speed).

> 
> -Olof

^ permalink raw reply	[flat|nested] 12+ messages in thread

* RE: [PATCH] i2c: tegra: Add delay before reset the controller
  2011-12-22 21:17     ` Olof Johansson
@ 2011-12-23 11:15         ` Alok Chauhan
  -1 siblings, 0 replies; 12+ messages in thread
From: Alok Chauhan @ 2011-12-23 11:15 UTC (permalink / raw)
  To: Olof Johansson
  Cc: khali-PUYAD+kWke1g9hUCZPvPmw, ben-linux-elnMNo+KYs3YtjvyW6yDsg,
	Stephen Warren, bones-s3s/WqlpOiPyB63q8FvJNQ,
	paul.gortmaker-CWA4WttNNZF54TAoqtyWWQ,
	linux-i2c-u79uwXL29TY76Z2rM5mHXA,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA,
	linux-tegra-u79uwXL29TY76Z2rM5mHXA,
	dgreid-hpIqsD4AKlfQT0dZR+AlfA, Laxman Dewangan

Hi,

(Adding Laxman Dewangan)

>This change causes problems systems with some models of i2c TPMs, since the first transaction to them will always time out (TPM quirk), and the delay means that the tpm will have time to go back to sleep and thus timeout >even on the retry. So you'll never make progress.
Working on this.

-Alok


-----Original Message-----
From: Olof Johansson [mailto:olof-nZhT3qVonbNeoWH0uzbU5w@public.gmane.org] 
Sent: Friday, December 23, 2011 2:48 AM
To: Alok Chauhan
Cc: khali-PUYAD+kWke1g9hUCZPvPmw@public.gmane.org; ben-linux-elnMNo+KYs3YtjvyW6yDsg@public.gmane.org; Stephen Warren; bones-s3s/WqlpOiPyB63q8FvJNQ@public.gmane.org; paul.gortmaker-CWA4WttNNZF54TAoqtyWWQ@public.gmane.org; linux-i2c-u79uwXL29TY76Z2rM5mHXA@public.gmane.org; linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org; linux-tegra-u79uwXL29TY76Z2rM5mHXA@public.gmane.org; dgreid-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org
Subject: Re: [PATCH] i2c: tegra: Add delay before reset the controller

Hi,

(Adding linux-tegra and Dylan Reid who was debugging this before)

On Thu, Dec 22, 2011 at 2:41 AM, Alok Chauhan <alokc-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org> wrote:
> From: Alok Chauhan <alokc-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
>
> In NACK error condition, I2C controller violates clock-to-data setup 
> time before stop. In Software, because of this reset of controller is 
> happening before I2C controller could complete STOP condition.
>
> Added worst case delay of 1 ms (assuming lowest clock frequency will 
> be 1 KHZ) before reset the controller in case of NACK error.

This change causes problems systems with some models of i2c TPMs, since the first transaction to them will always time out (TPM quirk), and the delay means that the tpm will have time to go back to sleep and thus timeout even on the retry. So you'll never make progress.

In other words: this patch will break some systems and thus shouldn't be applied.


-Olof

^ permalink raw reply	[flat|nested] 12+ messages in thread

* RE: [PATCH] i2c: tegra: Add delay before reset the controller
@ 2011-12-23 11:15         ` Alok Chauhan
  0 siblings, 0 replies; 12+ messages in thread
From: Alok Chauhan @ 2011-12-23 11:15 UTC (permalink / raw)
  To: Olof Johansson
  Cc: khali, ben-linux, Stephen Warren, bones, paul.gortmaker,
	linux-i2c, linux-kernel, linux-tegra, dgreid, Laxman Dewangan

Hi,

(Adding Laxman Dewangan)

>This change causes problems systems with some models of i2c TPMs, since the first transaction to them will always time out (TPM quirk), and the delay means that the tpm will have time to go back to sleep and thus timeout >even on the retry. So you'll never make progress.
Working on this.

-Alok


-----Original Message-----
From: Olof Johansson [mailto:olof@lixom.net] 
Sent: Friday, December 23, 2011 2:48 AM
To: Alok Chauhan
Cc: khali@linux-fr.org; ben-linux@fluff.org; Stephen Warren; bones@secretlab.ca; paul.gortmaker@windriver.com; linux-i2c@vger.kernel.org; linux-kernel@vger.kernel.org; linux-tegra@vger.kernel.org; dgreid@google.com
Subject: Re: [PATCH] i2c: tegra: Add delay before reset the controller

Hi,

(Adding linux-tegra and Dylan Reid who was debugging this before)

On Thu, Dec 22, 2011 at 2:41 AM, Alok Chauhan <alokc@nvidia.com> wrote:
> From: Alok Chauhan <alokc@nvidia.com>
>
> In NACK error condition, I2C controller violates clock-to-data setup 
> time before stop. In Software, because of this reset of controller is 
> happening before I2C controller could complete STOP condition.
>
> Added worst case delay of 1 ms (assuming lowest clock frequency will 
> be 1 KHZ) before reset the controller in case of NACK error.

This change causes problems systems with some models of i2c TPMs, since the first transaction to them will always time out (TPM quirk), and the delay means that the tpm will have time to go back to sleep and thus timeout even on the retry. So you'll never make progress.

In other words: this patch will break some systems and thus shouldn't be applied.


-Olof

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH] i2c: tegra: Add delay before reset the controller
  2011-12-22 10:41 ` Alok Chauhan
@ 2011-12-22 21:17     ` Olof Johansson
  -1 siblings, 0 replies; 12+ messages in thread
From: Olof Johansson @ 2011-12-22 21:17 UTC (permalink / raw)
  To: Alok Chauhan
  Cc: khali-PUYAD+kWke1g9hUCZPvPmw, ben-linux-elnMNo+KYs3YtjvyW6yDsg,
	swarren-DDmLM1+adcrQT0dZR+AlfA, bones-s3s/WqlpOiPyB63q8FvJNQ,
	paul.gortmaker-CWA4WttNNZF54TAoqtyWWQ,
	linux-i2c-u79uwXL29TY76Z2rM5mHXA,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA,
	linux-tegra-u79uwXL29TY76Z2rM5mHXA,
	dgreid-hpIqsD4AKlfQT0dZR+AlfA

Hi,

(Adding linux-tegra and Dylan Reid who was debugging this before)

On Thu, Dec 22, 2011 at 2:41 AM, Alok Chauhan <alokc-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org> wrote:
> From: Alok Chauhan <alokc-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
>
> In NACK error condition, I2C controller violates
> clock-to-data setup time before stop. In Software,
> because of this reset of controller is happening
> before I2C controller could complete STOP condition.
>
> Added worst case delay of 1 ms (assuming lowest
> clock frequency will be 1 KHZ) before reset the
> controller in case of NACK error.

This change causes problems systems with some models of i2c TPMs, since
the first transaction to them will always time out (TPM quirk), and the delay
means that the tpm will have time to go back to sleep and thus timeout
even on the retry. So you'll never make progress.

In other words: this patch will break some systems and thus shouldn't be
applied.


-Olof

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH] i2c: tegra: Add delay before reset the controller
@ 2011-12-22 21:17     ` Olof Johansson
  0 siblings, 0 replies; 12+ messages in thread
From: Olof Johansson @ 2011-12-22 21:17 UTC (permalink / raw)
  To: Alok Chauhan
  Cc: khali, ben-linux, swarren, bones, paul.gortmaker, linux-i2c,
	linux-kernel, linux-tegra, dgreid

Hi,

(Adding linux-tegra and Dylan Reid who was debugging this before)

On Thu, Dec 22, 2011 at 2:41 AM, Alok Chauhan <alokc@nvidia.com> wrote:
> From: Alok Chauhan <alokc@nvidia.com>
>
> In NACK error condition, I2C controller violates
> clock-to-data setup time before stop. In Software,
> because of this reset of controller is happening
> before I2C controller could complete STOP condition.
>
> Added worst case delay of 1 ms (assuming lowest
> clock frequency will be 1 KHZ) before reset the
> controller in case of NACK error.

This change causes problems systems with some models of i2c TPMs, since
the first transaction to them will always time out (TPM quirk), and the delay
means that the tpm will have time to go back to sleep and thus timeout
even on the retry. So you'll never make progress.

In other words: this patch will break some systems and thus shouldn't be
applied.


-Olof

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH] i2c: tegra: Add delay before reset the controller
@ 2011-12-22 10:41 ` Alok Chauhan
  0 siblings, 0 replies; 12+ messages in thread
From: Alok Chauhan @ 2011-12-22 10:41 UTC (permalink / raw)
  To: khali, ben-linux, swarren, olof, bones, paul.gortmaker
  Cc: linux-i2c, linux-kernel, Alok Chauhan

From: Alok Chauhan <alokc@nvidia.com>

In NACK error condition, I2C controller violates
clock-to-data setup time before stop. In Software,
because of this reset of controller is happening
before I2C controller could complete STOP condition.

Added worst case delay of 1 ms (assuming lowest
clock frequency will be 1 KHZ) before reset the
controller in case of NACK error.

Signed-off-by: Alok Chauhan <alokc@nvidia.com>
---
 drivers/i2c/busses/i2c-tegra.c |    9 +++++++++
 1 files changed, 9 insertions(+), 0 deletions(-)

diff --git a/drivers/i2c/busses/i2c-tegra.c b/drivers/i2c/busses/i2c-tegra.c
index 6381604..b731499 100644
--- a/drivers/i2c/busses/i2c-tegra.c
+++ b/drivers/i2c/busses/i2c-tegra.c
@@ -517,6 +517,15 @@ static int tegra_i2c_xfer_msg(struct tegra_i2c_dev *i2c_dev,
 	if (likely(i2c_dev->msg_err == I2C_ERR_NONE))
 		return 0;
 
+	/*
+	 * In NACK error condition resetting of I2C controller happens
+	 * before STOP condition is properly completed by I2C controller,
+	 * so wait for worst case delay of 1 ms (assuming lowest clock
+	 * frequency will be 1 KHz) to complete STOP condition.
+	 */
+	if (i2c_dev->msg_err == I2C_ERR_NO_ACK)
+		mdelay(1);
+
 	tegra_i2c_init(i2c_dev);
 	if (i2c_dev->msg_err == I2C_ERR_NO_ACK) {
 		if (msg->flags & I2C_M_IGNORE_NAK)
-- 
1.7.4.1


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH] i2c: tegra: Add delay before reset the controller
@ 2011-12-22 10:41 ` Alok Chauhan
  0 siblings, 0 replies; 12+ messages in thread
From: Alok Chauhan @ 2011-12-22 10:41 UTC (permalink / raw)
  To: khali-PUYAD+kWke1g9hUCZPvPmw, ben-linux-elnMNo+KYs3YtjvyW6yDsg,
	swarren-DDmLM1+adcrQT0dZR+AlfA, olof-nZhT3qVonbNeoWH0uzbU5w,
	bones-s3s/WqlpOiPyB63q8FvJNQ,
	paul.gortmaker-CWA4WttNNZF54TAoqtyWWQ
  Cc: linux-i2c-u79uwXL29TY76Z2rM5mHXA,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA, Alok Chauhan

From: Alok Chauhan <alokc-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>

In NACK error condition, I2C controller violates
clock-to-data setup time before stop. In Software,
because of this reset of controller is happening
before I2C controller could complete STOP condition.

Added worst case delay of 1 ms (assuming lowest
clock frequency will be 1 KHZ) before reset the
controller in case of NACK error.

Signed-off-by: Alok Chauhan <alokc-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
---
 drivers/i2c/busses/i2c-tegra.c |    9 +++++++++
 1 files changed, 9 insertions(+), 0 deletions(-)

diff --git a/drivers/i2c/busses/i2c-tegra.c b/drivers/i2c/busses/i2c-tegra.c
index 6381604..b731499 100644
--- a/drivers/i2c/busses/i2c-tegra.c
+++ b/drivers/i2c/busses/i2c-tegra.c
@@ -517,6 +517,15 @@ static int tegra_i2c_xfer_msg(struct tegra_i2c_dev *i2c_dev,
 	if (likely(i2c_dev->msg_err == I2C_ERR_NONE))
 		return 0;
 
+	/*
+	 * In NACK error condition resetting of I2C controller happens
+	 * before STOP condition is properly completed by I2C controller,
+	 * so wait for worst case delay of 1 ms (assuming lowest clock
+	 * frequency will be 1 KHz) to complete STOP condition.
+	 */
+	if (i2c_dev->msg_err == I2C_ERR_NO_ACK)
+		mdelay(1);
+
 	tegra_i2c_init(i2c_dev);
 	if (i2c_dev->msg_err == I2C_ERR_NO_ACK) {
 		if (msg->flags & I2C_M_IGNORE_NAK)
-- 
1.7.4.1

^ permalink raw reply related	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2012-03-30 15:54 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-03-30 12:06 [PATCH] i2c: tegra: Add delay before reset the controller Alok Chauhan
2012-03-30 12:06 ` Alok Chauhan
     [not found] ` <1333109179-12445-1-git-send-email-alokc-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2012-03-30 15:54   ` Stephen Warren
2012-03-30 15:54     ` Stephen Warren
  -- strict thread matches above, loose matches on Subject: below --
2011-12-22 10:41 Alok Chauhan
2011-12-22 10:41 ` Alok Chauhan
     [not found] ` <1324550480-26308-1-git-send-email-alokc-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2011-12-22 21:17   ` Olof Johansson
2011-12-22 21:17     ` Olof Johansson
     [not found]     ` <CAOesGMire-13yiA9gVQYFWdTa6ZLJLbTW8qoRoPMRQ1ExavVUQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2011-12-23 11:15       ` Alok Chauhan
2011-12-23 11:15         ` Alok Chauhan
     [not found]         ` <7A0BFCFE3DA5CD47B0FB7984326F201A134F2CCC73-kdsAE/FnitNDw2glCA4ptUEOCMrvLtNR@public.gmane.org>
2011-12-23 11:20           ` Laxman Dewangan
2011-12-23 11:20             ` Laxman Dewangan

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.