Merge to Fedora kernel-2.6.18-1.2224_FC5 patched with stable patch-2.6.18.1-vs2.0...
[linux-2.6.git] / drivers / media / dvb / frontends / nxt200x.c
index 9e35353..87c286e 100644 (file)
@@ -55,7 +55,6 @@
 struct nxt200x_state {
 
        struct i2c_adapter* i2c;
-       struct dvb_frontend_ops ops;
        const struct nxt200x_config* config;
        struct dvb_frontend frontend;
 
@@ -333,17 +332,17 @@ static int nxt200x_writetuner (struct nxt200x_state* state, u8* data)
 
        dprintk("%s\n", __FUNCTION__);
 
-       dprintk("Tuner Bytes: %02X %02X %02X %02X\n", data[0], data[1], data[2], data[3]);
+       dprintk("Tuner Bytes: %02X %02X %02X %02X\n", data[1], data[2], data[3], data[4]);
 
        /* if NXT2004, write directly to tuner. if NXT2002, write through NXT chip.
         * direct write is required for Philips TUV1236D and ALPS TDHU2 */
        switch (state->demod_chip) {
                case NXT2004:
-                       if (i2c_writebytes(state, state->config->pll_address, data, 4))
+                       if (i2c_writebytes(state, data[0], data+1, 4))
                                printk(KERN_WARNING "nxt200x: error writing to tuner\n");
                        /* wait until we have a lock */
                        while (count < 20) {
-                               i2c_readbytes(state, state->config->pll_address, &buf, 1);
+                               i2c_readbytes(state, data[0], &buf, 1);
                                if (buf & 0x40)
                                        return 0;
                                msleep(100);
@@ -361,10 +360,10 @@ static int nxt200x_writetuner (struct nxt200x_state* state, u8* data)
                        nxt200x_writebytes(state, 0x34, &buf, 1);
 
                        /* write actual tuner bytes */
-                       nxt200x_writebytes(state, 0x36, data, 4);
+                       nxt200x_writebytes(state, 0x36, data+1, 4);
 
                        /* set tuner i2c address */
-                       buf = state->config->pll_address;
+                       buf = data[0] << 1;
                        nxt200x_writebytes(state, 0x35, &buf, 1);
 
                        /* write UC Opmode to begin transfer */
@@ -534,7 +533,7 @@ static int nxt200x_setup_frontend_parameters (struct dvb_frontend* fe,
                                             struct dvb_frontend_parameters *p)
 {
        struct nxt200x_state* state = fe->demodulator_priv;
-       u8 buf[4];
+       u8 buf[5];
 
        /* stop the micro first */
        nxt200x_microcontroller_stop(state);
@@ -548,7 +547,9 @@ static int nxt200x_setup_frontend_parameters (struct dvb_frontend* fe,
        }
 
        /* get tuning information */
-       dvb_pll_configure(state->config->pll_desc, buf, p->frequency, 0);
+       if (fe->ops.tuner_ops.calc_regs) {
+               fe->ops.tuner_ops.calc_regs(fe, p, buf, 5);
+       }
 
        /* set additional params */
        switch (p->u.vsb.modulation) {
@@ -895,9 +896,9 @@ static int nxt2002_init(struct dvb_frontend* fe)
        }
 
        ret = nxt2002_load_firmware(fe, fw);
+       release_firmware(fw);
        if (ret) {
                printk("nxt2002: Writing firmware to device failed\n");
-               release_firmware(fw);
                return ret;
        }
        printk("nxt2002: Firmware upload complete\n");
@@ -959,9 +960,9 @@ static int nxt2004_init(struct dvb_frontend* fe)
        }
 
        ret = nxt2004_load_firmware(fe, fw);
+       release_firmware(fw);
        if (ret) {
                printk("nxt2004: Writing firmware to device failed\n");
-               release_firmware(fw);
                return ret;
        }
        printk("nxt2004: Firmware upload complete\n");
@@ -1159,7 +1160,6 @@ struct dvb_frontend* nxt200x_attach(const struct nxt200x_config* config,
        /* setup the state */
        state->config = config;
        state->i2c = i2c;
-       memcpy(&state->ops, &nxt200x_ops, sizeof(struct dvb_frontend_ops));
        state->initialised = 0;
 
        /* read card id */
@@ -1198,7 +1198,7 @@ struct dvb_frontend* nxt200x_attach(const struct nxt200x_config* config,
        }
 
        /* create dvb_frontend */
-       state->frontend.ops = &state->ops;
+       memcpy(&state->frontend.ops, &nxt200x_ops, sizeof(struct dvb_frontend_ops));
        state->frontend.demodulator_priv = state;
        return &state->frontend;