X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Fmedia%2Fdvb%2Ffrontends%2Fcx22702.c;h=f4aa44136c7ced10a677e46dbde06cf39a1f9fe2;hb=f7f1b0f1e2fbadeab12d24236000e778aa9b1ead;hp=15ae90316c1f58b61b18cc2e48fd0125a2f9c74a;hpb=e3f6fb6212a7102bdb56ba38fa1e98fe72950475;p=linux-2.6.git diff --git a/drivers/media/dvb/frontends/cx22702.c b/drivers/media/dvb/frontends/cx22702.c index 15ae90316..f4aa44136 100644 --- a/drivers/media/dvb/frontends/cx22702.c +++ b/drivers/media/dvb/frontends/cx22702.c @@ -32,6 +32,7 @@ #include #include #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; }