linux 2.6.16.38 w/ vs2.0.3-rc1
[linux-2.6.git] / drivers / media / dvb / frontends / tda10021.c
index 9cbd164..21255ca 100644 (file)
@@ -21,6 +21,7 @@
     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */
 
+#include <linux/config.h>
 #include <linux/delay.h>
 #include <linux/errno.h>
 #include <linux/init.h>
@@ -35,6 +36,7 @@
 
 struct tda10021_state {
        struct i2c_adapter* i2c;
+       struct dvb_frontend_ops ops;
        /* configuration settings */
        const struct tda10021_config* config;
        struct dvb_frontend frontend;
@@ -88,14 +90,6 @@ static int tda10021_writereg (struct tda10021_state* state, u8 reg, u8 data)
        return (ret != 1) ? -EREMOTEIO : 0;
 }
 
-int tda10021_write_byte(struct dvb_frontend* fe, int reg, int data)
-{
-       struct tda10021_state* state = fe->demodulator_priv;
-
-       return tda10021_writereg(state, reg, data);
-}
-EXPORT_SYMBOL(tda10021_write_byte);
-
 static u8 tda10021_readreg (struct tda10021_state* state, u8 reg)
 {
        u8 b0 [] = { reg };
@@ -231,6 +225,13 @@ static int tda10021_init (struct dvb_frontend *fe)
 
        //Activate PLL
        tda10021_writereg(state, 0x2a, tda10021_inittab[0x2a] & 0xef);
+
+       if (state->config->pll_init) {
+               lock_tuner(state);
+               state->config->pll_init(fe);
+               unlock_tuner(state);
+       }
+
        return 0;
 }
 
@@ -258,10 +259,9 @@ static int tda10021_set_parameters (struct dvb_frontend *fe,
 
        //printk("tda10021: set frequency to %d qam=%d symrate=%d\n", p->frequency,qam,p->u.qam.symbol_rate);
 
-       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);
-       }
+       lock_tuner(state);
+       state->config->pll_set(fe, p);
+       unlock_tuner(state);
 
        tda10021_set_symbolrate (state, p->u.qam.symbol_rate);
        tda10021_writereg (state, 0x34, state->pwm);
@@ -376,18 +376,6 @@ static int tda10021_get_frontend(struct dvb_frontend* fe, struct dvb_frontend_pa
        return 0;
 }
 
-static int tda10021_i2c_gate_ctrl(struct dvb_frontend* fe, int enable)
-{
-       struct tda10021_state* state = fe->demodulator_priv;
-
-       if (enable) {
-               lock_tuner(state);
-       } else {
-               unlock_tuner(state);
-       }
-       return 0;
-}
-
 static int tda10021_sleep(struct dvb_frontend* fe)
 {
        struct tda10021_state* state = fe->demodulator_priv;
@@ -419,6 +407,7 @@ struct dvb_frontend* tda10021_attach(const struct tda10021_config* config,
        /* setup the state */
        state->config = config;
        state->i2c = i2c;
+       memcpy(&state->ops, &tda10021_ops, sizeof(struct dvb_frontend_ops));
        state->pwm = pwm;
        state->reg0 = tda10021_inittab[0];
 
@@ -426,7 +415,7 @@ struct dvb_frontend* tda10021_attach(const struct tda10021_config* config,
        if ((tda10021_readreg(state, 0x1a) & 0xf0) != 0x70) goto error;
 
        /* create dvb_frontend */
-       memcpy(&state->frontend.ops, &tda10021_ops, sizeof(struct dvb_frontend_ops));
+       state->frontend.ops = &state->ops;
        state->frontend.demodulator_priv = state;
        return &state->frontend;
 
@@ -459,7 +448,6 @@ static struct dvb_frontend_ops tda10021_ops = {
 
        .init = tda10021_init,
        .sleep = tda10021_sleep,
-       .i2c_gate_ctrl = tda10021_i2c_gate_ctrl,
 
        .set_frontend = tda10021_set_parameters,
        .get_frontend = tda10021_get_frontend,