[PATCH] m920x fixes [1/10]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Implement m920x i2c as suggested by Pierre Willenbrock.

This patch does not change the way m920x interacts with hardware.

Signed-of-by: Aapo Tahkola <aet@xxxxxxxxxxxxxx>

-- 
Aapo Tahkola
diff -r 3556fab363b5 linux/drivers/media/dvb/dvb-usb/m920x.c
--- a/linux/drivers/media/dvb/dvb-usb/m920x.c	Sat Feb 24 09:05:23 2007 -0200
+++ b/linux/drivers/media/dvb/dvb-usb/m920x.c	Thu Mar 01 14:50:25 2007 +0100
@@ -145,51 +165,72 @@ static int m9206_i2c_xfer(struct i2c_ada
 {
 	struct dvb_usb_device *d = i2c_get_adapdata(adap);
 	struct m9206_state *m = d->priv;
-	int i;
+	int i, j;
 	int ret = 0;
 
 	if (mutex_lock_interruptible(&d->i2c_mutex) < 0)
 		return -EAGAIN;
 
-	if (num > 2)
-		return -EINVAL;
+/*
+sequences found in logs:
+[index value]
+0x80 write addr
+(0x00 out byte)*
+0x40 out byte
+
+0x80 write addr
+(0x00 out byte)*
+0x80 read addr
+(0x21 in byte)*
+0x60 in byte
+
+this sequence works:
+0x80 read addr
+(0x21 in byte)*
+0x60 in byte
+
+_my guess_:
+0x80: begin i2c transfer using address. value=address<<1|(reading?1:0)
+0x00: write byte
+0x21: read byte, more to follow
+0x40: write last byte of message sequence
+0x60: read last byte of message sequence
+ */
+
 
 	for (i = 0; i < num; i++) {
-		if ((ret = m9206_write(d->udev, M9206_I2C, msg[i].addr, 0x80)) != 0)
-			goto unlock;
-
-		if ((ret = m9206_write(d->udev, M9206_I2C, msg[i].buf[0], 0x0)) != 0)
-			goto unlock;
-
-		if (i + 1 < num && msg[i + 1].flags & I2C_M_RD) {
-			int i2c_i;
-
-			for (i2c_i = 0; i2c_i < M9206_I2C_MAX; i2c_i++)
-				if (msg[i].addr == m->i2c_r[i2c_i].addr)
-					break;
-
-			if (i2c_i >= M9206_I2C_MAX) {
-				deb_rc("No magic for i2c addr!\n");
-				ret = -EINVAL;
+		if (msg[i].flags & I2C_M_RD) {
+
+			if ((ret = m9206_write(d->udev, M9206_I2C, msg[i].addr | 0x01, 0x80)) != 0)
 				goto unlock;
+
+			for(j = 0; j < msg[i].len; j++) {
+				if (j + 1 == msg[i].len && i + 1== num) {
+					if ((ret = m9206_read(d->udev, M9206_I2C, 0x0, 0x60, &msg[i].buf[j], msg[i].len)) != 0)
+						goto unlock;
+				} else {
+					if ((ret = m9206_read(d->udev, M9206_I2C, 0x0, 0x21, &msg[i].buf[j], msg[i].len)) != 0)
+						goto unlock;
+				}
 			}
 
-			if ((ret = m9206_write(d->udev, M9206_I2C, m->i2c_r[i2c_i].magic, 0x80)) != 0)
+		} else {
+			if ((ret = m9206_write(d->udev, M9206_I2C, msg[i].addr, 0x80)) != 0)
 				goto unlock;
-
-			if ((ret = m9206_read(d->udev, M9206_I2C, 0x0, 0x60, msg[i + 1].buf, msg[i + 1].len)) != 0)
-				goto unlock;
-
-			i++;
-		} else {
-			if (msg[i].len != 2)
-				return -EINVAL;
-
-			if ((ret = m9206_write(d->udev, M9206_I2C, msg[i].buf[1], 0x40)) != 0)
-				goto unlock;
-		}
-	}
-	ret = i;
+		
+			for(j = 0; j < msg[i].len; j++) {
+				if (j + 1 == msg[i].len && i + 1== num) {
+					if ((ret = m9206_write(d->udev, M9206_I2C, msg[i].buf[j], 0x40)) != 0)
+						goto unlock;
+					
+				} else {
+					if ((ret = m9206_write(d->udev, M9206_I2C, msg[i].buf[j], 0x0)) != 0)
+						goto unlock;
+				}
+			}
+		}
+	}
+	ret = num;
 	unlock:
 	mutex_unlock(&d->i2c_mutex);
 
_______________________________________________
linux-dvb mailing list
linux-dvb@xxxxxxxxxxx
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb

[Index of Archives]     [Linux Media]     [Video 4 Linux]     [Asterisk]     [Samba]     [Xorg]     [Xfree86]     [Linux USB]

  Powered by Linux