Commit d20a7f72 authored by Mauro Carvalho Chehab's avatar Mauro Carvalho Chehab

[media] az6007: Fix the I2C code in order to handle mt2063

mt2063 uses a one-byte transfer. This requires a special handling
inside the i2c code. Fix it to properly accept i2c reads. This
is needed to make the mt2063 to be detected.
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent caa1a700
...@@ -42,7 +42,7 @@ struct az6007_device_state { ...@@ -42,7 +42,7 @@ struct az6007_device_state {
struct drxk_config terratec_h7_drxk = { struct drxk_config terratec_h7_drxk = {
.adr = 0x29, .adr = 0x29,
.single_master = 1, .single_master = 1,
.no_i2c_bridge = 1, .no_i2c_bridge = 0,
.microcode_name = "dvb-usb-terratec-h5-drxk.fw", .microcode_name = "dvb-usb-terratec-h5-drxk.fw",
}; };
...@@ -451,7 +451,6 @@ static int az6007_i2c_xfer(struct i2c_adapter *adap,struct i2c_msg msgs[],int nu ...@@ -451,7 +451,6 @@ static int az6007_i2c_xfer(struct i2c_adapter *adap,struct i2c_msg msgs[],int nu
for (i = 0; i < num; i++) { for (i = 0; i < num; i++) {
addr = msgs[i].addr << 1; addr = msgs[i].addr << 1;
if (((i + 1) < num) if (((i + 1) < num)
&& (msgs[i].len == 1) && (msgs[i].len == 1)
&& (!msgs[i].flags & I2C_M_RD) && (!msgs[i].flags & I2C_M_RD)
...@@ -462,44 +461,55 @@ static int az6007_i2c_xfer(struct i2c_adapter *adap,struct i2c_msg msgs[],int nu ...@@ -462,44 +461,55 @@ static int az6007_i2c_xfer(struct i2c_adapter *adap,struct i2c_msg msgs[],int nu
* the first xfer has just 1 byte length. * the first xfer has just 1 byte length.
* Need to join both into one operation * Need to join both into one operation
*/ */
printk("az6007 I2C xfer write+read addr=0x%x len=%d/%d: ", if (dvb_usb_az6007_debug & 2)
addr, msgs[i].len, msgs[i + 1].len); printk(KERN_DEBUG
"az6007 I2C xfer write+read addr=0x%x len=%d/%d: ",
addr, msgs[i].len, msgs[i + 1].len);
req = 0xb9; req = 0xb9;
index = 0; index = msgs[i].buf[0];
value = addr; value = addr | (1 << 8);
for (j = 0; j < msgs[i].len; j++)
data[j] = msgs[i].buf[j];
length = 6 + msgs[i + 1].len; length = 6 + msgs[i + 1].len;
len = msgs[i + 1].len; len = msgs[i + 1].len;
ret = az6007_usb_in_op(d,req,value,index,data,length); ret = az6007_usb_in_op(d,req,value,index,data,length);
if (ret >= len) { if (ret >= len) {
for (j = 0; j < len; j++) { for (j = 0; j < len; j++) {
msgs[i + 1].buf[j] = data[j + 5]; msgs[i + 1].buf[j] = data[j + 5];
printk("0x%02x ", msgs[i + 1].buf[j]); if (dvb_usb_az6007_debug & 2)
printk(KERN_CONT
"0x%02x ",
msgs[i + 1].buf[j]);
} }
} else } else
ret = -EIO; ret = -EIO;
i++; i++;
} else if (!(msgs[i].flags & I2C_M_RD)) { } else if (!(msgs[i].flags & I2C_M_RD)) {
/* write bytes */ /* write bytes */
// printk("az6007 I2C xfer write addr=0x%x len=%d: ", if (dvb_usb_az6007_debug & 2)
// addr, msgs[i].len); printk(KERN_DEBUG
"az6007 I2C xfer write addr=0x%x len=%d: ",
addr, msgs[i].len);
req = 0xbd; req = 0xbd;
index = msgs[i].buf[0]; index = msgs[i].buf[0];
value = addr | (1 << 8); value = addr | (1 << 8);
length = msgs[i].len - 1; length = msgs[i].len - 1;
len = msgs[i].len - 1; len = msgs[i].len - 1;
// printk("(0x%02x) ", msgs[i].buf[0]); if (dvb_usb_az6007_debug & 2)
printk(KERN_CONT
"(0x%02x) ", msgs[i].buf[0]);
for (j = 0; j < len; j++) for (j = 0; j < len; j++)
{ {
data[j] = msgs[i].buf[j + 1]; data[j] = msgs[i].buf[j + 1];
// printk("0x%02x ", data[j]); if (dvb_usb_az6007_debug & 2)
printk(KERN_CONT
"0x%02x ", data[j]);
} }
ret = az6007_usb_out_op(d,req,value,index,data,length); ret = az6007_usb_out_op(d,req,value,index,data,length);
} else { } else {
/* read bytes */ /* read bytes */
// printk("az6007 I2C xfer read addr=0x%x len=%d: ", if (dvb_usb_az6007_debug & 2)
// addr, msgs[i].len); printk(KERN_DEBUG
"az6007 I2C xfer read addr=0x%x len=%d: ",
addr, msgs[i].len);
req = 0xb9; req = 0xb9;
index = msgs[i].buf[0]; index = msgs[i].buf[0];
value = addr; value = addr;
...@@ -509,10 +519,13 @@ static int az6007_i2c_xfer(struct i2c_adapter *adap,struct i2c_msg msgs[],int nu ...@@ -509,10 +519,13 @@ static int az6007_i2c_xfer(struct i2c_adapter *adap,struct i2c_msg msgs[],int nu
for (j = 0; j < len; j++) for (j = 0; j < len; j++)
{ {
msgs[i].buf[j] = data[j + 5]; msgs[i].buf[j] = data[j + 5];
// printk("0x%02x ", data[j + 5]); if (dvb_usb_az6007_debug & 2)
printk(KERN_CONT
"0x%02x ", data[j + 5]);
} }
} }
// printk("\n"); if (dvb_usb_az6007_debug & 2)
printk(KERN_CONT "\n");
if (ret < 0) if (ret < 0)
goto err; goto err;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment