From: Jean Delvare <khali@linux-fr.org>

While working on the saa7110 driver I found a problem with the way various
video drivers (found on Zoran-based boards) prepare i2c messages to be used
by i2c_transfer.  The drivers improperly copy the i2c client flags as the
message flags, while both sets are mostly unrelated.  The net effect in
this case is to trigger an I2C block read instead of the expected I2C block
write.  The fix is simply not to pass any flag, because none are needed.

I think this patch qualifies hands down as a "critical bug fix" to be
included in whatever bug-fix-only trees exist these days.  As far as I can
see, all Zoran-based boards are broken in 2.6.11 without this patch.

Signed-off-by: Jean Delvare <khali@linux-fr.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
---

 25-akpm/drivers/media/video/adv7170.c |    2 +-
 25-akpm/drivers/media/video/adv7175.c |    2 +-
 25-akpm/drivers/media/video/bt819.c   |    2 +-
 25-akpm/drivers/media/video/saa7114.c |    2 +-
 25-akpm/drivers/media/video/saa7185.c |    2 +-
 5 files changed, 5 insertions(+), 5 deletions(-)

diff -puN drivers/media/video/adv7170.c~fix-i2c-messsage-flags-in-video-drivers drivers/media/video/adv7170.c
--- 25/drivers/media/video/adv7170.c~fix-i2c-messsage-flags-in-video-drivers	2005-03-09 15:08:53.000000000 -0800
+++ 25-akpm/drivers/media/video/adv7170.c	2005-03-09 15:08:53.000000000 -0800
@@ -130,7 +130,7 @@ adv7170_write_block (struct i2c_client *
 		u8 block_data[32];
 
 		msg.addr = client->addr;
-		msg.flags = client->flags;
+		msg.flags = 0;
 		while (len >= 2) {
 			msg.buf = (char *) block_data;
 			msg.len = 0;
diff -puN drivers/media/video/adv7175.c~fix-i2c-messsage-flags-in-video-drivers drivers/media/video/adv7175.c
--- 25/drivers/media/video/adv7175.c~fix-i2c-messsage-flags-in-video-drivers	2005-03-09 15:08:53.000000000 -0800
+++ 25-akpm/drivers/media/video/adv7175.c	2005-03-09 15:08:53.000000000 -0800
@@ -126,7 +126,7 @@ adv7175_write_block (struct i2c_client *
 		u8 block_data[32];
 
 		msg.addr = client->addr;
-		msg.flags = client->flags;
+		msg.flags = 0;
 		while (len >= 2) {
 			msg.buf = (char *) block_data;
 			msg.len = 0;
diff -puN drivers/media/video/bt819.c~fix-i2c-messsage-flags-in-video-drivers drivers/media/video/bt819.c
--- 25/drivers/media/video/bt819.c~fix-i2c-messsage-flags-in-video-drivers	2005-03-09 15:08:53.000000000 -0800
+++ 25-akpm/drivers/media/video/bt819.c	2005-03-09 15:08:53.000000000 -0800
@@ -146,7 +146,7 @@ bt819_write_block (struct i2c_client *cl
 		u8 block_data[32];
 
 		msg.addr = client->addr;
-		msg.flags = client->flags;
+		msg.flags = 0;
 		while (len >= 2) {
 			msg.buf = (char *) block_data;
 			msg.len = 0;
diff -puN drivers/media/video/saa7114.c~fix-i2c-messsage-flags-in-video-drivers drivers/media/video/saa7114.c
--- 25/drivers/media/video/saa7114.c~fix-i2c-messsage-flags-in-video-drivers	2005-03-09 15:08:53.000000000 -0800
+++ 25-akpm/drivers/media/video/saa7114.c	2005-03-09 15:08:53.000000000 -0800
@@ -163,7 +163,7 @@ saa7114_write_block (struct i2c_client *
 		u8 block_data[32];
 
 		msg.addr = client->addr;
-		msg.flags = client->flags;
+		msg.flags = 0;
 		while (len >= 2) {
 			msg.buf = (char *) block_data;
 			msg.len = 0;
diff -puN drivers/media/video/saa7185.c~fix-i2c-messsage-flags-in-video-drivers drivers/media/video/saa7185.c
--- 25/drivers/media/video/saa7185.c~fix-i2c-messsage-flags-in-video-drivers	2005-03-09 15:08:53.000000000 -0800
+++ 25-akpm/drivers/media/video/saa7185.c	2005-03-09 15:08:53.000000000 -0800
@@ -118,7 +118,7 @@ saa7185_write_block (struct i2c_client *
 		u8 block_data[32];
 
 		msg.addr = client->addr;
-		msg.flags = client->flags;
+		msg.flags = 0;
 		while (len >= 2) {
 			msg.buf = (char *) block_data;
 			msg.len = 0;
_