Merge git://git.kernel.org/pub/scm/linux/kernel/git/sfrench/cifs-2.6
[pandora-kernel.git] / drivers / media / dvb / ttpci / av7110_v4l.c
index 603a22e..6405546 100644 (file)
 int msp_writereg(struct av7110 *av7110, u8 dev, u16 reg, u16 val)
 {
        u8 msg[5] = { dev, reg >> 8, reg & 0xff, val >> 8 , val & 0xff };
-       struct i2c_msg msgs = { .flags = 0, .addr = 0x40, .len = 5, .buf = msg };
+       struct i2c_msg msgs = { .flags = 0, .len = 5, .buf = msg };
+
+       switch (av7110->adac_type) {
+       case DVB_ADAC_MSP34x0:
+               msgs.addr = 0x40;
+               break;
+       case DVB_ADAC_MSP34x5:
+               msgs.addr = 0x42;
+               break;
+       default:
+               return 0;
+       }
 
        if (i2c_transfer(&av7110->i2c_adap, &msgs, 1) != 1) {
                dprintk(1, "dvb-ttpci: failed @ card %d, %u = %u\n",
@@ -57,10 +68,23 @@ static int msp_readreg(struct av7110 *av7110, u8 dev, u16 reg, u16 *val)
        u8 msg1[3] = { dev, reg >> 8, reg & 0xff };
        u8 msg2[2];
        struct i2c_msg msgs[2] = {
-               { .flags = 0,        .addr = 0x40, .len = 3, .buf = msg1 },
-               { .flags = I2C_M_RD, .addr = 0x40, .len = 2, .buf = msg2 }
+               { .flags = 0       , .len = 3, .buf = msg1 },
+               { .flags = I2C_M_RD, .len = 2, .buf = msg2 }
        };
 
+       switch (av7110->adac_type) {
+       case DVB_ADAC_MSP34x0:
+               msgs[0].addr = 0x40;
+               msgs[1].addr = 0x40;
+               break;
+       case DVB_ADAC_MSP34x5:
+               msgs[0].addr = 0x42;
+               msgs[1].addr = 0x42;
+               break;
+       default:
+               return 0;
+       }
+
        if (i2c_transfer(&av7110->i2c_adap, &msgs[0], 2) != 2) {
                dprintk(1, "dvb-ttpci: failed @ card %d, %u\n",
                       av7110->dvb_adapter.num, reg);
@@ -678,17 +702,23 @@ int av7110_init_analog_module(struct av7110 *av7110)
 {
        u16 version1, version2;
 
-       if (i2c_writereg(av7110, 0x80, 0x0, 0x80) != 1
-           || i2c_writereg(av7110, 0x80, 0x0, 0) != 1)
+       if (i2c_writereg(av7110, 0x80, 0x0, 0x80) == 1 &&
+           i2c_writereg(av7110, 0x80, 0x0, 0) == 1) {
+               printk("dvb-ttpci: DVB-C analog module @ card %d detected, initializing MSP3400\n",
+                       av7110->dvb_adapter.num);
+               av7110->adac_type = DVB_ADAC_MSP34x0;
+       } else if (i2c_writereg(av7110, 0x84, 0x0, 0x80) == 1 &&
+                  i2c_writereg(av7110, 0x84, 0x0, 0) == 1) {
+               printk("dvb-ttpci: DVB-C analog module @ card %d detected, initializing MSP3415\n",
+                       av7110->dvb_adapter.num);
+               av7110->adac_type = DVB_ADAC_MSP34x5;
+       } else
                return -ENODEV;
 
-       printk("dvb-ttpci: DVB-C analog module @ card %d detected, initializing MSP3400\n",
-               av7110->dvb_adapter.num);
-       av7110->adac_type = DVB_ADAC_MSP34x0;
        msleep(100); // the probing above resets the msp...
        msp_readreg(av7110, MSP_RD_DSP, 0x001e, &version1);
        msp_readreg(av7110, MSP_RD_DSP, 0x001f, &version2);
-       dprintk(1, "dvb-ttpci: @ card %d MSP3400 version 0x%04x 0x%04x\n",
+       dprintk(1, "dvb-ttpci: @ card %d MSP34xx version 0x%04x 0x%04x\n",
                av7110->dvb_adapter.num, version1, version2);
        msp_writereg(av7110, MSP_WR_DSP, 0x0013, 0x0c00);
        msp_writereg(av7110, MSP_WR_DSP, 0x0000, 0x7f00); // loudspeaker + headphone
@@ -697,7 +727,7 @@ int av7110_init_analog_module(struct av7110 *av7110)
        msp_writereg(av7110, MSP_WR_DSP, 0x0004, 0x7f00); // loudspeaker volume
        msp_writereg(av7110, MSP_WR_DSP, 0x000a, 0x0220); // SCART 1 source
        msp_writereg(av7110, MSP_WR_DSP, 0x0007, 0x7f00); // SCART 1 volume
-       msp_writereg(av7110, MSP_WR_DSP, 0x000d, 0x4800); // prescale SCART
+       msp_writereg(av7110, MSP_WR_DSP, 0x000d, 0x1900); // prescale SCART
 
        if (i2c_writereg(av7110, 0x48, 0x01, 0x00)!=1) {
                INFO(("saa7113 not accessible.\n"));