* [PATCH] i2c: tegra: Add delay before reset the controller
@ 2012-03-30 12:06 Alok Chauhan
[not found] ` <1333109179-12445-1-git-send-email-alokc-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
0 siblings, 1 reply; 6+ 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] 6+ messages in thread[parent not found: <1333109179-12445-1-git-send-email-alokc-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>]
* Re: [PATCH] i2c: tegra: Add delay before reset the controller [not found] ` <1333109179-12445-1-git-send-email-alokc-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org> @ 2012-03-30 15:54 ` Stephen Warren 0 siblings, 0 replies; 6+ 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] 6+ messages in thread
* [PATCH] i2c: tegra: Add delay before reset the controller
@ 2011-12-22 10:41 Alok Chauhan
[not found] ` <1324550480-26308-1-git-send-email-alokc-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
0 siblings, 1 reply; 6+ 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] 6+ messages in thread[parent not found: <1324550480-26308-1-git-send-email-alokc-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>]
* Re: [PATCH] i2c: tegra: Add delay before reset the controller [not found] ` <1324550480-26308-1-git-send-email-alokc-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org> @ 2011-12-22 21:17 ` Olof Johansson [not found] ` <CAOesGMire-13yiA9gVQYFWdTa6ZLJLbTW8qoRoPMRQ1ExavVUQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org> 0 siblings, 1 reply; 6+ 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] 6+ messages in thread
[parent not found: <CAOesGMire-13yiA9gVQYFWdTa6ZLJLbTW8qoRoPMRQ1ExavVUQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>]
* RE: [PATCH] i2c: tegra: Add delay before reset the controller [not found] ` <CAOesGMire-13yiA9gVQYFWdTa6ZLJLbTW8qoRoPMRQ1ExavVUQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org> @ 2011-12-23 11:15 ` Alok Chauhan [not found] ` <7A0BFCFE3DA5CD47B0FB7984326F201A134F2CCC73-kdsAE/FnitNDw2glCA4ptUEOCMrvLtNR@public.gmane.org> 0 siblings, 1 reply; 6+ messages in thread From: Alok Chauhan @ 2011-12-23 11:15 UTC (permalink / raw) To: Olof Johansson 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, 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] 6+ messages in thread
[parent not found: <7A0BFCFE3DA5CD47B0FB7984326F201A134F2CCC73-kdsAE/FnitNDw2glCA4ptUEOCMrvLtNR@public.gmane.org>]
* RE: [PATCH] i2c: tegra: Add delay before reset the controller [not found] ` <7A0BFCFE3DA5CD47B0FB7984326F201A134F2CCC73-kdsAE/FnitNDw2glCA4ptUEOCMrvLtNR@public.gmane.org> @ 2011-12-23 11:20 ` Laxman Dewangan 0 siblings, 0 replies; 6+ messages in thread From: Laxman Dewangan @ 2011-12-23 11:20 UTC (permalink / raw) To: Alok Chauhan, Olof Johansson 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 > -----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] 6+ messages in thread
end of thread, other threads:[~2012-03-30 15:54 UTC | newest]
Thread overview: 6+ 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
[not found] ` <1333109179-12445-1-git-send-email-alokc-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2012-03-30 15:54 ` Stephen Warren
-- strict thread matches above, loose matches on Subject: below --
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
[not found] ` <CAOesGMire-13yiA9gVQYFWdTa6ZLJLbTW8qoRoPMRQ1ExavVUQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2011-12-23 11:15 ` Alok Chauhan
[not found] ` <7A0BFCFE3DA5CD47B0FB7984326F201A134F2CCC73-kdsAE/FnitNDw2glCA4ptUEOCMrvLtNR@public.gmane.org>
2011-12-23 11:20 ` Laxman Dewangan
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).