fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / drivers / media / dvb / frontends / cx22700.c
index 26744e7..13ad1bf 100644 (file)
@@ -1,4 +1,4 @@
-#/*
+/*
     Conexant cx22700 DVB OFDM demodulator driver
 
     Copyright (C) 2001-2002 Convergence Integrated Media GmbH
@@ -34,8 +34,6 @@ struct cx22700_state {
 
        struct i2c_adapter* i2c;
 
-       struct dvb_frontend_ops ops;
-
        const struct cx22700_config* config;
 
        struct dvb_frontend frontend;
@@ -136,6 +134,7 @@ static int cx22700_set_tps (struct cx22700_state *state, struct dvb_ofdm_paramet
                return -EINVAL;
 
        if (p->code_rate_LP < FEC_1_2 || p->code_rate_LP > FEC_7_8)
+               return -EINVAL;
 
        if (p->code_rate_HP == FEC_4_5 || p->code_rate_LP == FEC_4_5)
                return -EINVAL;
@@ -230,19 +229,9 @@ static int cx22700_get_tps (struct cx22700_state* state, struct dvb_ofdm_paramet
        return 0;
 }
 
-
-
-
-
-
-
-
-
-
-
 static int cx22700_init (struct dvb_frontend* fe)
 
-{      struct cx22700_state* state = (struct cx22700_state*) fe->demodulator_priv;
+{      struct cx22700_state* state = fe->demodulator_priv;
        int i;
 
        dprintk("cx22700_init: init chip\n");
@@ -257,18 +246,12 @@ static int cx22700_init (struct dvb_frontend* fe)
 
        cx22700_writereg (state, 0x00, 0x01);
 
-       if (state->config->pll_init) {
-               cx22700_writereg (state, 0x0a, 0x00);  /* open i2c bus switch */
-               state->config->pll_init(fe);
-               cx22700_writereg (state, 0x0a, 0x01);  /* close i2c bus switch */
-       }
-
        return 0;
 }
 
 static int cx22700_read_status(struct dvb_frontend* fe, fe_status_t* status)
 {
-       struct cx22700_state* state = (struct cx22700_state*) fe->demodulator_priv;
+       struct cx22700_state* state = fe->demodulator_priv;
 
        u16 rs_ber = (cx22700_readreg (state, 0x0d) << 9)
                   | (cx22700_readreg (state, 0x0e) << 1);
@@ -296,7 +279,7 @@ static int cx22700_read_status(struct dvb_frontend* fe, fe_status_t* status)
 
 static int cx22700_read_ber(struct dvb_frontend* fe, u32* ber)
 {
-       struct cx22700_state* state = (struct cx22700_state*) fe->demodulator_priv;
+       struct cx22700_state* state = fe->demodulator_priv;
 
        *ber = cx22700_readreg (state, 0x0c) & 0x7f;
        cx22700_writereg (state, 0x0c, 0x00);
@@ -306,7 +289,7 @@ static int cx22700_read_ber(struct dvb_frontend* fe, u32* ber)
 
 static int cx22700_read_signal_strength(struct dvb_frontend* fe, u16* signal_strength)
 {
-       struct cx22700_state* state = (struct cx22700_state*) fe->demodulator_priv;
+       struct cx22700_state* state = fe->demodulator_priv;
 
        u16 rs_ber = (cx22700_readreg (state, 0x0d) << 9)
                   | (cx22700_readreg (state, 0x0e) << 1);
@@ -317,7 +300,7 @@ static int cx22700_read_signal_strength(struct dvb_frontend* fe, u16* signal_str
 
 static int cx22700_read_snr(struct dvb_frontend* fe, u16* snr)
 {
-       struct cx22700_state* state = (struct cx22700_state*) fe->demodulator_priv;
+       struct cx22700_state* state = fe->demodulator_priv;
 
        u16 rs_ber = (cx22700_readreg (state, 0x0d) << 9)
                   | (cx22700_readreg (state, 0x0e) << 1);
@@ -328,7 +311,7 @@ static int cx22700_read_snr(struct dvb_frontend* fe, u16* snr)
 
 static int cx22700_read_ucblocks(struct dvb_frontend* fe, u32* ucblocks)
 {
-       struct cx22700_state* state = (struct cx22700_state*) fe->demodulator_priv;
+       struct cx22700_state* state = fe->demodulator_priv;
 
        *ucblocks = cx22700_readreg (state, 0x0f);
        cx22700_writereg (state, 0x0f, 0x00);
@@ -338,14 +321,16 @@ static int cx22700_read_ucblocks(struct dvb_frontend* fe, u32* ucblocks)
 
 static int cx22700_set_frontend(struct dvb_frontend* fe, struct dvb_frontend_parameters *p)
 {
-       struct cx22700_state* state = (struct cx22700_state*) fe->demodulator_priv;
+       struct cx22700_state* state = fe->demodulator_priv;
 
        cx22700_writereg (state, 0x00, 0x02); /* XXX CHECKME: soft reset*/
        cx22700_writereg (state, 0x00, 0x00);
 
-       cx22700_writereg (state, 0x0a, 0x00);  /* open i2c bus switch */
-       state->config->pll_set(fe, p);
-       cx22700_writereg (state, 0x0a, 0x01);  /* close i2c bus switch */
+       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);
+       }
+
        cx22700_set_inversion (state, p->inversion);
        cx22700_set_tps (state, &p->u.ofdm);
        cx22700_writereg (state, 0x37, 0x01);  /* PAL loop filter off */
@@ -356,24 +341,35 @@ static int cx22700_set_frontend(struct dvb_frontend* fe, struct dvb_frontend_par
 
 static int cx22700_get_frontend(struct dvb_frontend* fe, struct dvb_frontend_parameters *p)
 {
-       struct cx22700_state* state = (struct cx22700_state*) fe->demodulator_priv;
+       struct cx22700_state* state = fe->demodulator_priv;
        u8 reg09 = cx22700_readreg (state, 0x09);
 
        p->inversion = reg09 & 0x1 ? INVERSION_ON : INVERSION_OFF;
        return cx22700_get_tps (state, &p->u.ofdm);
 }
 
+static int cx22700_i2c_gate_ctrl(struct dvb_frontend* fe, int enable)
+{
+       struct cx22700_state* state = fe->demodulator_priv;
+
+       if (enable) {
+               return cx22700_writereg(state, 0x0a, 0x00);
+       } else {
+               return cx22700_writereg(state, 0x0a, 0x01);
+       }
+}
+
 static int cx22700_get_tune_settings(struct dvb_frontend* fe, struct dvb_frontend_tune_settings* fesettings)
 {
-        fesettings->min_delay_ms = 150;
-        fesettings->step_size = 166667;
-        fesettings->max_drift = 166667*2;
-        return 0;
+       fesettings->min_delay_ms = 150;
+       fesettings->step_size = 166667;
+       fesettings->max_drift = 166667*2;
+       return 0;
 }
 
 static void cx22700_release(struct dvb_frontend* fe)
 {
-       struct cx22700_state* state = (struct cx22700_state*) fe->demodulator_priv;
+       struct cx22700_state* state = fe->demodulator_priv;
        kfree(state);
 }
 
@@ -385,44 +381,44 @@ struct dvb_frontend* cx22700_attach(const struct cx22700_config* config,
        struct cx22700_state* state = NULL;
 
        /* allocate memory for the internal state */
-       state = (struct cx22700_state*) kmalloc(sizeof(struct cx22700_state), GFP_KERNEL);
+       state = kmalloc(sizeof(struct cx22700_state), GFP_KERNEL);
        if (state == NULL) goto error;
 
        /* setup the state */
        state->config = config;
        state->i2c = i2c;
-       memcpy(&state->ops, &cx22700_ops, sizeof(struct dvb_frontend_ops));
 
        /* check if the demod is there */
        if (cx22700_readreg(state, 0x07) < 0) goto error;
 
        /* create dvb_frontend */
-       state->frontend.ops = &state->ops;
+       memcpy(&state->frontend.ops, &cx22700_ops, sizeof(struct dvb_frontend_ops));
        state->frontend.demodulator_priv = state;
        return &state->frontend;
 
 error:
-       if (state) kfree(state);
+       kfree(state);
        return NULL;
 }
 
 static struct dvb_frontend_ops cx22700_ops = {
 
        .info = {
-               .name                   = "Conexant CX22700 DVB-T",
-               .type                   = FE_OFDM,
-               .frequency_min          = 470000000,
-               .frequency_max          = 860000000,
-               .frequency_stepsize     = 166667,
+               .name                   = "Conexant CX22700 DVB-T",
+               .type                   = FE_OFDM,
+               .frequency_min          = 470000000,
+               .frequency_max          = 860000000,
+               .frequency_stepsize     = 166667,
                .caps = FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
                      FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
                      FE_CAN_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_64 |
-                     FE_CAN_RECOVER
+                     FE_CAN_RECOVER
        },
 
        .release = cx22700_release,
 
        .init = cx22700_init,
+       .i2c_gate_ctrl = cx22700_i2c_gate_ctrl,
 
        .set_frontend = cx22700_set_frontend,
        .get_frontend = cx22700_get_frontend,