linux 2.6.16.38 w/ vs2.0.3-rc1
[linux-2.6.git] / drivers / media / dvb / frontends / stv0297.c
index 1ca6424..eb15676 100644 (file)
@@ -32,6 +32,7 @@
 
 struct stv0297_state {
        struct i2c_adapter *i2c;
+       struct dvb_frontend_ops ops;
        const struct stv0297_config *config;
        struct dvb_frontend frontend;
 
@@ -67,25 +68,19 @@ static int stv0297_readreg(struct stv0297_state *state, u8 reg)
        int ret;
        u8 b0[] = { reg };
        u8 b1[] = { 0 };
-       struct i2c_msg msg[] = { {.addr = state->config->demod_address,.flags = 0,.buf = b0,.len = 1},
-                                {.addr = state->config->demod_address,.flags = I2C_M_RD,.buf = b1,.len = 1}
-                              };
+       struct i2c_msg msg[] = { {.addr = state->config->demod_address,.flags = 0,.buf = b0,.len =
+                                 1},
+       {.addr = state->config->demod_address,.flags = I2C_M_RD,.buf = b1,.len = 1}
+       };
 
        // this device needs a STOP between the register and data
-       if (state->config->stop_during_read) {
-               if ((ret = i2c_transfer(state->i2c, &msg[0], 1)) != 1) {
-                       dprintk("%s: readreg error (reg == 0x%02x, ret == %i)\n", __FUNCTION__, reg, ret);
-                       return -1;
-               }
-               if ((ret = i2c_transfer(state->i2c, &msg[1], 1)) != 1) {
-                       dprintk("%s: readreg error (reg == 0x%02x, ret == %i)\n", __FUNCTION__, reg, ret);
-                       return -1;
-               }
-       } else {
-               if ((ret = i2c_transfer(state->i2c, msg, 2)) != 2) {
-                       dprintk("%s: readreg error (reg == 0x%02x, ret == %i)\n", __FUNCTION__, reg, ret);
-                       return -1;
-               }
+       if ((ret = i2c_transfer(state->i2c, &msg[0], 1)) != 1) {
+               dprintk("%s: readreg error (reg == 0x%02x, ret == %i)\n", __FUNCTION__, reg, ret);
+               return -1;
+       }
+       if ((ret = i2c_transfer(state->i2c, &msg[1], 1)) != 1) {
+               dprintk("%s: readreg error (reg == 0x%02x, ret == %i)\n", __FUNCTION__, reg, ret);
+               return -1;
        }
 
        return b1[0];
@@ -112,20 +107,13 @@ static int stv0297_readregs(struct stv0297_state *state, u8 reg1, u8 * b, u8 len
        };
 
        // this device needs a STOP between the register and data
-       if (state->config->stop_during_read) {
-               if ((ret = i2c_transfer(state->i2c, &msg[0], 1)) != 1) {
-                       dprintk("%s: readreg error (reg == 0x%02x, ret == %i)\n", __FUNCTION__, reg1, ret);
-                       return -1;
-               }
-               if ((ret = i2c_transfer(state->i2c, &msg[1], 1)) != 1) {
-                       dprintk("%s: readreg error (reg == 0x%02x, ret == %i)\n", __FUNCTION__, reg1, ret);
-                       return -1;
-               }
-       } else {
-               if ((ret = i2c_transfer(state->i2c, msg, 2)) != 2) {
-                       dprintk("%s: readreg error (reg == 0x%02x, ret == %i)\n", __FUNCTION__, reg1, ret);
-                       return -1;
-               }
+       if ((ret = i2c_transfer(state->i2c, &msg[0], 1)) != 1) {
+               dprintk("%s: readreg error (reg == 0x%02x, ret == %i)\n", __FUNCTION__, reg1, ret);
+               return -1;
+       }
+       if ((ret = i2c_transfer(state->i2c, &msg[1], 1)) != 1) {
+               dprintk("%s: readreg error (reg == 0x%02x, ret == %i)\n", __FUNCTION__, reg1, ret);
+               return -1;
        }
 
        return 0;
@@ -288,14 +276,12 @@ static int stv0297_set_inversion(struct stv0297_state *state, fe_spectral_invers
        return 0;
 }
 
-static int stv0297_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
+int stv0297_enable_plli2c(struct dvb_frontend *fe)
 {
        struct stv0297_state *state = fe->demodulator_priv;
 
-       if (enable) {
-               stv0297_writereg(state, 0x87, 0x78);
-               stv0297_writereg(state, 0x86, 0xc8);
-       }
+       stv0297_writereg(state, 0x87, 0x78);
+       stv0297_writereg(state, 0x86, 0xc8);
 
        return 0;
 }
@@ -310,6 +296,9 @@ static int stv0297_init(struct dvb_frontend *fe)
                stv0297_writereg(state, state->config->inittab[i], state->config->inittab[i+1]);
        msleep(200);
 
+       if (state->config->pll_init)
+               state->config->pll_init(fe);
+
        return 0;
 }
 
@@ -400,7 +389,7 @@ static int stv0297_set_frontend(struct dvb_frontend *fe, struct dvb_frontend_par
        case QAM_32:
        case QAM_64:
                delay = 100;
-               sweeprate = 1000;
+               sweeprate = 1500;
                break;
 
        case QAM_128:
@@ -432,10 +421,7 @@ static int stv0297_set_frontend(struct dvb_frontend *fe, struct dvb_frontend_par
        }
 
        stv0297_init(fe);
-       if (fe->ops.tuner_ops.set_params) {
-               fe->ops.tuner_ops.set_params(fe, p);
-               if (fe->ops.i2c_gate_ctrl) fe->ops.i2c_gate_ctrl(fe, 0);
-       }
+       state->config->pll_set(fe, p);
 
        /* clear software interrupts */
        stv0297_writereg(state, 0x82, 0x0);
@@ -648,6 +634,7 @@ struct dvb_frontend *stv0297_attach(const struct stv0297_config *config,
        /* setup the state */
        state->config = config;
        state->i2c = i2c;
+       memcpy(&state->ops, &stv0297_ops, sizeof(struct dvb_frontend_ops));
        state->base_freq = 0;
 
        /* check if the demod is there */
@@ -655,7 +642,7 @@ struct dvb_frontend *stv0297_attach(const struct stv0297_config *config,
                goto error;
 
        /* create dvb_frontend */
-       memcpy(&state->frontend.ops, &stv0297_ops, sizeof(struct dvb_frontend_ops));
+       state->frontend.ops = &state->ops;
        state->frontend.demodulator_priv = state;
        return &state->frontend;
 
@@ -681,7 +668,6 @@ static struct dvb_frontend_ops stv0297_ops = {
 
        .init = stv0297_init,
        .sleep = stv0297_sleep,
-       .i2c_gate_ctrl = stv0297_i2c_gate_ctrl,
 
        .set_frontend = stv0297_set_frontend,
        .get_frontend = stv0297_get_frontend,
@@ -698,3 +684,4 @@ MODULE_AUTHOR("Dennis Noermann and Andrew de Quincey");
 MODULE_LICENSE("GPL");
 
 EXPORT_SYMBOL(stv0297_attach);
+EXPORT_SYMBOL(stv0297_enable_plli2c);