vserver 2.0 rc7
[linux-2.6.git] / drivers / media / dvb / frontends / cx22702.c
index 15ae903..f4aa441 100644 (file)
@@ -32,6 +32,7 @@
 #include <linux/slab.h>
 #include <linux/delay.h>
 #include "dvb_frontend.h"
+#include "dvb-pll.h"
 #include "cx22702.h"
 
 
@@ -186,7 +187,7 @@ static int cx22702_get_tps (struct cx22702_state *state, struct dvb_ofdm_paramet
                case 1: p->guard_interval = GUARD_INTERVAL_1_16; break;
                case 2: p->guard_interval =  GUARD_INTERVAL_1_8; break;
                case 3: p->guard_interval =  GUARD_INTERVAL_1_4; break;
-}
+       }
        switch( val&0x03 ) {
                case 0: p->transmission_mode = TRANSMISSION_MODE_2K; break;
                case 1: p->transmission_mode = TRANSMISSION_MODE_8K; break;
@@ -195,27 +196,27 @@ static int cx22702_get_tps (struct cx22702_state *state, struct dvb_ofdm_paramet
        return 0;
 }
 
-
-
-
-
-
-
-
-
-
-
-
-
 /* Talk to the demod, set the FEC, GUARD, QAM settings etc */
 static int cx22702_set_tps (struct dvb_frontend* fe, struct dvb_frontend_parameters *p)
 {
        u8 val;
-       struct cx22702_state* state = (struct cx22702_state*) fe->demodulator_priv;
+       struct cx22702_state* state = fe->demodulator_priv;
 
        /* set PLL */
         cx22702_writereg (state, 0x0D, cx22702_readreg(state,0x0D) &0xfe);
-       state->config->pll_set(fe, p);
+       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_writereg (state, 0x0D, cx22702_readreg(state,0x0D) | 1);
 
        /* set inversion */
@@ -259,7 +260,7 @@ static int cx22702_set_tps (struct dvb_frontend* fe, struct dvb_frontend_paramet
                return 0;
        }
 
-       /* manually programmed values */
+       /* manually programmed values */
        val=0;
        switch(p->u.ofdm.constellation) {
                case   QPSK: val = (val&0xe7); break;
@@ -332,13 +333,12 @@ static int cx22702_set_tps (struct dvb_frontend* fe, struct dvb_frontend_paramet
        return 0;
 }
 
-
 /* Reset the demod hardware and reset all of the configuration registers
    to a default state. */
 static int cx22702_init (struct dvb_frontend* fe)
 {
        int i;
-       struct cx22702_state* state = (struct cx22702_state*) fe->demodulator_priv;
+       struct cx22702_state* state = fe->demodulator_priv;
 
        cx22702_writereg (state, 0x00, 0x02);
 
@@ -360,53 +360,53 @@ static int cx22702_init (struct dvb_frontend* fe)
 
 static int cx22702_read_status(struct dvb_frontend* fe, fe_status_t* status)
 {
-       struct cx22702_state* state = (struct cx22702_state*) fe->demodulator_priv;
+       struct cx22702_state* state = fe->demodulator_priv;
        u8 reg0A;
        u8 reg23;
 
-                       *status = 0;
+       *status = 0;
 
        reg0A = cx22702_readreg (state, 0x0A);
        reg23 = cx22702_readreg (state, 0x23);
 
-                       dprintk ("%s: status demod=0x%02x agc=0x%02x\n"
-                               ,__FUNCTION__,reg0A,reg23);
+       dprintk ("%s: status demod=0x%02x agc=0x%02x\n"
+               ,__FUNCTION__,reg0A,reg23);
 
-                       if(reg0A & 0x10) {
-                               *status |= FE_HAS_LOCK;
-                               *status |= FE_HAS_VITERBI;
-                               *status |= FE_HAS_SYNC;
-                       }
+       if(reg0A & 0x10) {
+               *status |= FE_HAS_LOCK;
+               *status |= FE_HAS_VITERBI;
+               *status |= FE_HAS_SYNC;
+       }
 
-                       if(reg0A & 0x20)
-                               *status |= FE_HAS_CARRIER;
+       if(reg0A & 0x20)
+               *status |= FE_HAS_CARRIER;
 
-                       if(reg23 < 0xf0)
-                               *status |= FE_HAS_SIGNAL;
+       if(reg23 < 0xf0)
+               *status |= FE_HAS_SIGNAL;
 
        return 0;
-                       }
+}
 
 static int cx22702_read_ber(struct dvb_frontend* fe, u32* ber)
-               {
-       struct cx22702_state* state = (struct cx22702_state*) fe->demodulator_priv;
+{
+       struct cx22702_state* state = fe->demodulator_priv;
 
        if(cx22702_readreg (state, 0xE4) & 0x02) {
-                               /* Realtime statistics */
+               /* Realtime statistics */
                *ber = (cx22702_readreg (state, 0xDE) & 0x7F) << 7
                        | (cx22702_readreg (state, 0xDF)&0x7F);
-                       } else {
+       } else {
                /* Averagtine statistics */
                *ber = (cx22702_readreg (state, 0xDE) & 0x7F) << 7
                        | cx22702_readreg (state, 0xDF);
-               }
+       }
 
        return 0;
-               }
+}
 
 static int cx22702_read_signal_strength(struct dvb_frontend* fe, u16* signal_strength)
-               {
-       struct cx22702_state* state = (struct cx22702_state*) fe->demodulator_priv;
+{
+       struct cx22702_state* state = fe->demodulator_priv;
 
        *signal_strength = cx22702_readreg (state, 0x23);
 
@@ -415,7 +415,7 @@ static int cx22702_read_signal_strength(struct dvb_frontend* fe, u16* signal_str
 
 static int cx22702_read_snr(struct dvb_frontend* fe, u16* snr)
 {
-       struct cx22702_state* state = (struct cx22702_state*) fe->demodulator_priv;
+       struct cx22702_state* state = fe->demodulator_priv;
 
        u16 rs_ber=0;
        if(cx22702_readreg (state, 0xE4) & 0x02) {
@@ -434,7 +434,7 @@ static int cx22702_read_snr(struct dvb_frontend* fe, u16* snr)
 
 static int cx22702_read_ucblocks(struct dvb_frontend* fe, u32* ucblocks)
 {
-       struct cx22702_state* state = (struct cx22702_state*) fe->demodulator_priv;
+       struct cx22702_state* state = fe->demodulator_priv;
 
        u8 _ucblocks;
 
@@ -449,7 +449,7 @@ static int cx22702_read_ucblocks(struct dvb_frontend* fe, u32* ucblocks)
 
 static int cx22702_get_frontend(struct dvb_frontend* fe, struct dvb_frontend_parameters *p)
 {
-       struct cx22702_state* state = (struct cx22702_state*) fe->demodulator_priv;
+       struct cx22702_state* state = fe->demodulator_priv;
 
        u8 reg0C = cx22702_readreg (state, 0x0C);
 
@@ -459,9 +459,9 @@ static int cx22702_get_frontend(struct dvb_frontend* fe, struct dvb_frontend_par
 
 static void cx22702_release(struct dvb_frontend* fe)
 {
-       struct cx22702_state* state = (struct cx22702_state*) fe->demodulator_priv;
-               kfree(state);
-       }
+       struct cx22702_state* state = fe->demodulator_priv;
+       kfree(state);
+}
 
 static struct dvb_frontend_ops cx22702_ops;
 
@@ -471,7 +471,7 @@ struct dvb_frontend* cx22702_attach(const struct cx22702_config* config,
        struct cx22702_state* state = NULL;
 
        /* allocate memory for the internal state */
-       state = (struct cx22702_state*) kmalloc(sizeof(struct cx22702_state), GFP_KERNEL);
+       state = kmalloc(sizeof(struct cx22702_state), GFP_KERNEL);
        if (state == NULL) goto error;
 
        /* setup the state */
@@ -489,7 +489,7 @@ struct dvb_frontend* cx22702_attach(const struct cx22702_config* config,
        return &state->frontend;
 
 error:
-       if (state) kfree(state);
+       kfree(state);
        return NULL;
 }