linux-i2c.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/2][RESEND] omap i2c interrupt handler fixes
@ 2009-12-16 14:02 Alexander Shishkin
       [not found] ` <1260972144-31593-1-git-send-email-virtuoso-0lOfPCoBze7YtjvyW6yDsg@public.gmane.org>
  2009-12-16 14:54 ` OMAP3 I2C driver timing problem with multiple messages transfer Weng, Wending
  0 siblings, 2 replies; 23+ messages in thread
From: Alexander Shishkin @ 2009-12-16 14:02 UTC (permalink / raw)
  To: ben-linux-elnMNo+KYs3YtjvyW6yDsg
  Cc: linux-omap-u79uwXL29TY76Z2rM5mHXA,
	linux-i2c-u79uwXL29TY76Z2rM5mHXA

Hi,

This is the second version of the patch that I've sent to linux-omap to
address this issue. This time I've moved the whole errata workaround bit
to a separate function to get rid of too long lines and a couple of extra
levels of indentation.

The actual fix is the same as the first time, it adds a timeout to a busy
loop which happens to take place in an interrupt handler and is capable
of hanging the kernel.

Regards,
--
Alex

^ permalink raw reply	[flat|nested] 23+ messages in thread
* [PATCH 1/2] omap i2c: make errata 1.153 workaround a separate function
@ 2009-12-16 13:43 Alexander Shishkin
       [not found] ` <1260970986-26613-3-git-send-email-virtuoso-0lOfPCoBze7YtjvyW6yDsg@public.gmane.org>
  0 siblings, 1 reply; 23+ messages in thread
From: Alexander Shishkin @ 2009-12-16 13:43 UTC (permalink / raw)
  To: ben-linux; +Cc: linux-omap, linux-i2c, Alexander Shishkin

From: Alexander Shishkin <ext-alexander.shishkin@nokia.com>

This is to avoid insanely long lines and levels of indentation.

Signed-off-by: Alexander Shishkin <ext-alexander.shishkin@nokia.com>
---
 drivers/i2c/busses/i2c-omap.c |   43 ++++++++++++++++++++++------------------
 1 files changed, 24 insertions(+), 19 deletions(-)

diff --git a/drivers/i2c/busses/i2c-omap.c b/drivers/i2c/busses/i2c-omap.c
index 75bf3ad..ad8242a 100644
--- a/drivers/i2c/busses/i2c-omap.c
+++ b/drivers/i2c/busses/i2c-omap.c
@@ -671,6 +671,27 @@ omap_i2c_rev1_isr(int this_irq, void *dev_id)
 #define omap_i2c_rev1_isr		NULL
 #endif
 
+/*
+ * OMAP3430 Errata 1.153: When an XRDY/XDR is hit, wait for XUDF before writing
+ * data to DATA_REG. Otherwise some data bytes can be lost while transferring
+ * them from the memory to the I2C interface.
+ */
+static int omap3430_workaround(struct omap_i2c_dev *dev, u16 *stat, int *err)
+{
+	while (!(*stat & OMAP_I2C_STAT_XUDF)) {
+		if (*stat & (OMAP_I2C_STAT_NACK | OMAP_I2C_STAT_AL)) {
+			omap_i2c_ack_stat(dev, *stat & (OMAP_I2C_STAT_XRDY |
+							OMAP_I2C_STAT_XDR));
+			*err |= OMAP_I2C_STAT_XUDF;
+			return -1;
+		}
+		cpu_relax();
+		*stat = omap_i2c_read_reg(dev, OMAP_I2C_STAT_REG);
+	}
+
+	return 0;
+}
+
 static irqreturn_t
 omap_i2c_isr(int this_irq, void *dev_id)
 {
@@ -794,25 +815,9 @@ complete:
 					break;
 				}
 
-				/*
-				 * OMAP3430 Errata 1.153: When an XRDY/XDR
-				 * is hit, wait for XUDF before writing data
-				 * to DATA_REG. Otherwise some data bytes can
-				 * be lost while transferring them from the
-				 * memory to the I2C interface.
-				 */
-
-				if (dev->rev <= OMAP_I2C_REV_ON_3430) {
-						while (!(stat & OMAP_I2C_STAT_XUDF)) {
-							if (stat & (OMAP_I2C_STAT_NACK | OMAP_I2C_STAT_AL)) {
-								omap_i2c_ack_stat(dev, stat & (OMAP_I2C_STAT_XRDY | OMAP_I2C_STAT_XDR));
-								err |= OMAP_I2C_STAT_XUDF;
-								goto complete;
-							}
-							cpu_relax();
-							stat = omap_i2c_read_reg(dev, OMAP_I2C_STAT_REG);
-						}
-				}
+				if (dev->rev <= OMAP_I2C_REV_ON_3430 &&
+				    omap3430_workaround(dev, &stat, &err))
+					goto complete;
 
 				omap_i2c_write_reg(dev, OMAP_I2C_DATA_REG, w);
 			}
-- 
1.6.3.3


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

end of thread, other threads:[~2010-05-10 10:02 UTC | newest]

Thread overview: 23+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-12-16 14:02 [PATCH 0/2][RESEND] omap i2c interrupt handler fixes Alexander Shishkin
     [not found] ` <1260972144-31593-1-git-send-email-virtuoso-0lOfPCoBze7YtjvyW6yDsg@public.gmane.org>
2009-12-16 14:02   ` [PATCH 1/2] omap i2c: make errata 1.153 workaround a separate function Alexander Shishkin
2009-12-16 14:02     ` [PATCH 2/2] omap i2c: add a timeout to the busy waiting Alexander Shishkin
2009-12-17  3:08       ` Menon, Nishanth
     [not found]         ` <4B29A0B7.1020908-l0cyMroinI0@public.gmane.org>
2009-12-17 13:31           ` Alexander Shishkin
     [not found]             ` <20091217133113.GC29059-rKUxRSusx2MF9cI+BDt40OTW4wlIGRCZ@public.gmane.org>
2009-12-17 13:59               ` Menon, Nishanth
     [not found]             ` <4B2A3926.9090800@ti.com>
     [not found]               ` <4B2A3926.9090800-l0cyMroinI0@public.gmane.org>
2009-12-17 22:46                 ` Sonasath, Moiz
     [not found]                   ` <CD8CC2B65FEE304DA95744A5472698F202A9A04FC6-UmuGNrFEPrGIQmiDNMet8wC/G2K4zDHf@public.gmane.org>
2009-12-18 13:33                     ` Aaro Koskinen
     [not found]     ` <1260972144-31593-2-git-send-email-virtuoso-0lOfPCoBze7YtjvyW6yDsg@public.gmane.org>
2009-12-17  3:06       ` [PATCH 1/2] omap i2c: make errata 1.153 workaround a separate function Menon, Nishanth
     [not found]         ` <4B29A036.2040807-l0cyMroinI0@public.gmane.org>
2009-12-17 12:48           ` Alexander Shishkin
2009-12-17 13:18             ` Menon, Nishanth
2010-03-16 11:27       ` Alexander Shishkin
     [not found]         ` <20100316112741.GA13389-rKUxRSusx2MF9cI+BDt40OTW4wlIGRCZ@public.gmane.org>
2010-03-16 14:30           ` Tony Lindgren
     [not found]             ` <20100316143025.GR2900-4v6yS6AI5VpBDgjK7y7TUQ@public.gmane.org>
2010-03-25  9:52               ` Alexander Shishkin
2010-03-25  9:52               ` [PATCH v2 2/2] omap i2c: add a timeout to the busy waiting Alexander Shishkin
     [not found]                 ` <1269510757-8119-3-git-send-email-virtuoso-0lOfPCoBze7YtjvyW6yDsg@public.gmane.org>
2010-03-25 14:38                   ` Aaro Koskinen
     [not found]                     ` <4BAB7551.6040203-xNZwKgViW5gAvxtiuMwx3w@public.gmane.org>
2010-03-25 15:02                       ` Alexander Shishkin
2010-05-10 10:02                     ` [PATCH v3] " Alexander Shishkin
2010-03-25  9:52             ` [PATCH v2 1/2] omap i2c: make errata 1.153 workaround a separate function Alexander Shishkin
2009-12-16 14:54 ` OMAP3 I2C driver timing problem with multiple messages transfer Weng, Wending
2009-12-16 15:57   ` Sonasath, Moiz
     [not found]     ` <CD8CC2B65FEE304DA95744A5472698F202A9A04B66-UmuGNrFEPrGIQmiDNMet8wC/G2K4zDHf@public.gmane.org>
2009-12-16 17:34       ` Weng, Wending
  -- strict thread matches above, loose matches on Subject: below --
2009-12-16 13:43 [PATCH 1/2] omap i2c: make errata 1.153 workaround a separate function Alexander Shishkin
     [not found] ` <1260970986-26613-3-git-send-email-virtuoso-0lOfPCoBze7YtjvyW6yDsg@public.gmane.org>
2009-12-16 13:46   ` [PATCH 2/2] omap i2c: add a timeout to the busy waiting Alexander Shishkin

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).