linux 2.6.16.38 w/ vs2.0.3-rc1
[linux-2.6.git] / drivers / media / dvb / frontends / cx22702.c
index 4106d46..0fc899f 100644 (file)
@@ -40,6 +40,8 @@ struct cx22702_state {
 
        struct i2c_adapter* i2c;
 
+       struct dvb_frontend_ops ops;
+
        /* configuration settings */
        const struct cx22702_config* config;
 
@@ -209,10 +211,22 @@ static int cx22702_set_tps (struct dvb_frontend* fe, struct dvb_frontend_paramet
        u8 val;
        struct cx22702_state* state = fe->demodulator_priv;
 
-       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);
+       /* set PLL */
+       cx22702_i2c_gate_ctrl(fe, 1);
+       if (state->config->pll_set) {
+               state->config->pll_set(fe, p);
+       } else if (state->config->pll_desc) {
+               u8 pllbuf[4];
+               struct i2c_msg msg = { .addr = state->config->pll_address,
+                                      .buf = pllbuf, .len = 4 };
+               dvb_pll_configure(state->config->pll_desc, pllbuf,
+                                 p->frequency,
+                                 p->u.ofdm.bandwidth);
+               i2c_transfer(state->i2c, &msg, 1);
+       } else {
+               BUG();
        }
+       cx22702_i2c_gate_ctrl(fe, 0);
 
        /* set inversion */
        cx22702_set_inversion (state, p->inversion);
@@ -344,6 +358,10 @@ static int cx22702_init (struct dvb_frontend* fe)
 
        cx22702_writereg (state, 0xf8, (state->config->output_mode << 1) & 0x02);
 
+       /* init PLL */
+       if (state->config->pll_init)
+               state->config->pll_init(fe);
+
        cx22702_i2c_gate_ctrl(fe, 0);
 
        return 0;
@@ -477,6 +495,7 @@ struct dvb_frontend* cx22702_attach(const struct cx22702_config* config,
        /* setup the state */
        state->config = config;
        state->i2c = i2c;
+       memcpy(&state->ops, &cx22702_ops, sizeof(struct dvb_frontend_ops));
        state->prevUCBlocks = 0;
 
        /* check if the demod is there */
@@ -484,7 +503,7 @@ struct dvb_frontend* cx22702_attach(const struct cx22702_config* config,
                goto error;
 
        /* create dvb_frontend */
-       memcpy(&state->frontend.ops, &cx22702_ops, sizeof(struct dvb_frontend_ops));
+       state->frontend.ops = &state->ops;
        state->frontend.demodulator_priv = state;
        return &state->frontend;
 
@@ -511,7 +530,6 @@ static struct dvb_frontend_ops cx22702_ops = {
        .release = cx22702_release,
 
        .init = cx22702_init,
-       .i2c_gate_ctrl = cx22702_i2c_gate_ctrl,
 
        .set_frontend = cx22702_set_tps,
        .get_frontend = cx22702_get_frontend,
@@ -522,6 +540,7 @@ static struct dvb_frontend_ops cx22702_ops = {
        .read_signal_strength = cx22702_read_signal_strength,
        .read_snr = cx22702_read_snr,
        .read_ucblocks = cx22702_read_ucblocks,
+       .i2c_gate_ctrl = cx22702_i2c_gate_ctrl,
 };
 
 module_param(debug, int, 0644);