bk://kernel.bkbits.net/gregkh/linux/i2c-2.6
ebs@ebshome.net|ChangeSet|20041022195213|64685 ebs

# This is a BitKeeper generated diff -Nru style patch.
#
# ChangeSet
#   2004/10/22 12:52:13-07:00 ebs@ebshome.net 
#   [PATCH] I2C: fix recently introduced race in IBM PPC4xx I2C driver
#   
#   On Tue, Oct 19, 2004 at 10:21:08PM -0700, Eugene Surovegin wrote:
#   [snip]
#   > It looks like this change added race I tried to avoid here.
#   >
#   > This code is modeled after __wait_event_interruptible_timeout, where
#   > "prepare_to_wait" is done _before_ checking completion status. This
#   > change breaks this, e.g. if IRQ happens right after we check iic->sts,
#   > but before calling msleep_interruptible(). In this case we'll sleep
#   > much more than required (seconds instead of microseconds)
#   >
#   > Greg, if my analysis is correct, please rollback this change.
#   >
#   > Nishanth, I'd be nice if you CC'ed me with this patch, my e-mail is at
#   > the top of that source file.
#   
#   Oh, well. I should have used wait_event_interruptible_timeout when I
#   ported this driver to 2.6.
#   
#   This patch fixes recently introduced race and also cleans ups some
#   2.4-ism.
#   
#   
#   Signed-off-by: Eugene Surovegin <ebs@ebshome.net>
#   Signed-off-by: Greg Kroah-Hartman <greg@kroah.com>
# 
# drivers/i2c/busses/i2c-ibm_iic.c
#   2004/10/19 23:18:16-07:00 ebs@ebshome.net +5 -11
#   I2C: fix recently introduced race in IBM PPC4xx I2C driver
# 
# ChangeSet
#   2004/10/22 12:51:52-07:00 ben@fluff.org 
#   [PATCH] I2C: Fix compile of drivers/i2c/busses/i2c-s3c2410.c
#   
#   Signed-off-by: Greg Kroah-Hartman <greg@kroah.com>
# 
# drivers/i2c/busses/i2c-s3c2410.c
#   2004/10/20 08:29:03-07:00 ben@fluff.org +1 -2
#   I2C: Fix compile of drivers/i2c/busses/i2c-s3c2410.c
# 
diff -Nru a/drivers/i2c/busses/i2c-ibm_iic.c b/drivers/i2c/busses/i2c-ibm_iic.c
--- a/drivers/i2c/busses/i2c-ibm_iic.c	2004-11-04 20:06:14 -08:00
+++ b/drivers/i2c/busses/i2c-ibm_iic.c	2004-11-04 20:06:14 -08:00
@@ -412,18 +412,12 @@
 	
 	if (dev->irq >= 0){
 		/* Interrupt mode */
-		wait_queue_t wait;
-    		init_waitqueue_entry(&wait, current);
-		
-		add_wait_queue(&dev->wq, &wait);
-		if (in_8(&iic->sts) & STS_PT)
-			msleep_interruptible(dev->adap.timeout * 1000);
-		remove_wait_queue(&dev->wq, &wait);
-		
-		if (unlikely(signal_pending(current))){
+		ret = wait_event_interruptible_timeout(dev->wq, 
+			!(in_8(&iic->sts) & STS_PT), dev->adap.timeout * HZ);
+
+		if (unlikely(ret < 0))
 			DBG("%d: wait interrupted\n", dev->idx);
-			ret = -ERESTARTSYS;
-		} else if (unlikely(in_8(&iic->sts) & STS_PT)){
+		else if (unlikely(in_8(&iic->sts) & STS_PT)){
 			DBG("%d: wait timeout\n", dev->idx);
 			ret = -ETIMEDOUT;
 		}
diff -Nru a/drivers/i2c/busses/i2c-s3c2410.c b/drivers/i2c/busses/i2c-s3c2410.c
--- a/drivers/i2c/busses/i2c-s3c2410.c	2004-11-04 20:06:14 -08:00
+++ b/drivers/i2c/busses/i2c-s3c2410.c	2004-11-04 20:06:14 -08:00
@@ -36,6 +36,7 @@
 
 #include <asm/hardware.h>
 #include <asm/irq.h>
+#include <asm/io.h>
 
 #include <asm/hardware/clock.h>
 #include <asm/arch/regs-gpio.h>
@@ -534,7 +535,6 @@
 
 static struct i2c_algorithm s3c24xx_i2c_algorithm = {
 	.name			= "S3C2410-I2C-Algorithm",
-	.id			= I2C_ALGO_S3C2410,
 	.master_xfer		= s3c24xx_i2c_xfer,
 };
 
@@ -543,7 +543,6 @@
 	.wait	= __WAIT_QUEUE_HEAD_INITIALIZER(s3c24xx_i2c.wait),
 	.adap	= {
 		.name			= "s3c2410-i2c",
-		.id			= I2C_ALGO_S3C2410,
 		.algo			= &s3c24xx_i2c_algorithm,
 		.retries		= 2,
 	},