diff -r 3f6e9ce1887c linux/drivers/media/dvb/dvb-usb/pctv452e.c --- a/linux/drivers/media/dvb/dvb-usb/pctv452e.c Fri Oct 17 19:45:55 2008 +0300 +++ b/linux/drivers/media/dvb/dvb-usb/pctv452e.c Sat Oct 18 13:45:45 2008 +0200 @@ -84,7 +84,7 @@ }; -#if 0 +#if 1 static struct stb0899_postproc pctv45e_postproc[] = { {PCTV_LED_GPIO, STB0899_GPIOPULLUP}, {0, 0} @@ -1261,7 +1261,7 @@ .tuner_set_rfsiggain = NULL, /* helper for switching LED green/orange */ -// .postproc = pctv45e_postproc + .postproc = pctv45e_postproc }; static struct stb6100_config stb6100_config = { diff -r 3f6e9ce1887c linux/drivers/media/dvb/frontends/lnbp22.c --- a/linux/drivers/media/dvb/frontends/lnbp22.c Fri Oct 17 19:45:55 2008 +0300 +++ b/linux/drivers/media/dvb/frontends/lnbp22.c Sat Oct 18 13:45:45 2008 +0200 @@ -36,6 +36,13 @@ #include "dvb_frontend.h" #include "lnbp22.h" +static int debug = 0; +module_param(debug, int, 0644); +MODULE_PARM_DESC(debug, "Turn on/off debugging (default:off)."); + + +#define dprintk(lvl, arg...) if (debug >= (lvl)) printk(arg) + struct lnbp22 { u8 config[4]; struct i2c_adapter *i2c; @@ -47,7 +54,7 @@ .buf = (char*)&lnbp22->config, .len = sizeof(lnbp22->config) }; - printk("%s: %d (18V=%d 13V=%d)\n", __FUNCTION__, voltage, + dprintk(1, "%s: %d (18V=%d 13V=%d)\n", __FUNCTION__, voltage, SEC_VOLTAGE_18, SEC_VOLTAGE_13); lnbp22->config[3] = 0x60; // Power down @@ -64,7 +71,7 @@ return -EINVAL; }; - printk("%s: 0x%02x)\n", __FUNCTION__, lnbp22->config[3]); + dprintk(1, "%s: 0x%02x)\n", __FUNCTION__, lnbp22->config[3]); return (i2c_transfer(lnbp22->i2c, &msg, 1) == 1) ? 0 : -EIO; } @@ -74,7 +81,7 @@ .buf = (char*)&lnbp22->config, .len = sizeof(lnbp22->config) }; - printk("%s: %d\n", __FUNCTION__, (int)arg); + dprintk(1, "%s: %d\n", __FUNCTION__, (int)arg); if (arg) lnbp22->config[3] |= LNBP22_LLC; else @@ -86,7 +93,7 @@ static void lnbp22_release(struct dvb_frontend *fe) { - printk("%s\n", __FUNCTION__); + dprintk(1, "%s\n", __FUNCTION__); /* LNBP power off */ lnbp22_set_voltage(fe, SEC_VOLTAGE_OFF); @@ -111,7 +118,7 @@ /* detect if it is present or not */ if (lnbp22_set_voltage(fe, SEC_VOLTAGE_OFF)) { - printk("%s LNBP22 not found\n", __FUNCTION__); + dprintk(0, "%s LNBP22 not found\n", __FUNCTION__); kfree(lnbp22); fe->sec_priv = NULL; return NULL; diff -r 3f6e9ce1887c linux/drivers/media/dvb/frontends/stb0899_algo.c --- a/linux/drivers/media/dvb/frontends/stb0899_algo.c Fri Oct 17 19:45:55 2008 +0300 +++ b/linux/drivers/media/dvb/frontends/stb0899_algo.c Sat Oct 18 13:45:45 2008 +0200 @@ -48,6 +48,41 @@ tmp >>= 24; return tmp; +} + +s32 stb0899_get_frequency_offset(struct stb0899_state *state) { + s32 offset = 0; + s16 w; + u8 cfr[2]; + + struct stb0899_internal *internal = &state->internal; + switch (state->delsys) { + case SYS_DVBS: + /* get derotator frequency */ + stb0899_read_regs(state, STB0899_CFRM, cfr, 2); + w = MAKEWORD16(cfr[0], cfr[1]); + /* don't why it is * 3/2 here */ + offset = w * 3/2; + break; + case SYS_DVBS2: + offset = STB0899_READ_S2REG(STB0899_S2DEMOD, CRL_FREQ); + if (offset & 0x20000000) { + /* sign extension */ + offset |= 0xc0000000; + } + /* + * what is the range of offsetfreq here: assume +- 20MHz as sane range + * 1MHz -> offsetfreq = 1000kHz * (2^30/1000) / 99 = 10 845 877 + * offset/kHz = offsetfreq * mclk / 1e6 / 2^30 * 1e3 + * = (((offsetfreq / 1024) * 1000) * (mclk/1e6)) / 2^20 + */ + offset = ((((offset / 1024) * 1000) / (1<<7)) * (s32)(internal->master_clk/1000000)) / (s32)(1<<13); + break; + default: + printk("TODO: %s DVBFE_DELSYS_DSS not yet implemented\n", __FUNCTION__); + break; + } + return offset; } /* @@ -132,35 +167,6 @@ return (internal->srate + (internal->srate * internal->rolloff) / 100); } -/* - * stb0899_first_subrange - * Compute the first subrange of the search - */ -static void stb0899_first_subrange(struct stb0899_state *state) -{ - struct stb0899_internal *internal = &state->internal; - struct stb0899_params *params = &state->params; - struct stb0899_config *config = state->config; - - int range = 0; - u32 bandwidth = 0; - - if (config->tuner_get_bandwidth) { - stb0899_i2c_gate_ctrl(&state->frontend, 1); - config->tuner_get_bandwidth(&state->frontend, &bandwidth); - stb0899_i2c_gate_ctrl(&state->frontend, 0); - range = bandwidth - stb0899_carr_width(state) / 2; - } - - if (range > 0) - internal->sub_range = MIN(internal->srch_range, range); - else - internal->sub_range = 0; - - internal->freq = params->freq; - internal->tuner_offst = 0L; - internal->sub_dir = 1; -} /* * stb0899_check_tmg @@ -212,7 +218,7 @@ internal->status = NOTIMING; /* timing loop computation & symbol rate optimisation */ - derot_limit = (internal->sub_range / 2L) / internal->mclk; + derot_limit = 0;//(internal->sub_range / 2L) / internal->mclk; derot_step = (params->srate / 2L) / internal->mclk; while ((stb0899_check_tmg(state) != TIMINGOK) && next_loop) { @@ -248,8 +254,6 @@ struct stb0899_internal *internal = &state->internal; u8 reg; - msleep(internal->t_derot); /* wait for derotator ok */ - reg = stb0899_read_reg(state, STB0899_CFD); STB0899_SETFIELD_VAL(CFD_ON, reg, 1); stb0899_write_reg(state, STB0899_CFD, reg); @@ -262,62 +266,6 @@ } else { internal->status = NOCARRIER; dprintk(state->verbose, FE_DEBUG, 1, "-------------> NOCARRIER !"); - } - - return internal->status; -} - -/* - * stb0899_search_carrier - * Search for a QPSK carrier with the derotator - */ -static enum stb0899_status stb0899_search_carrier(struct stb0899_state *state) -{ - struct stb0899_internal *internal = &state->internal; - - short int derot_freq = 0, last_derot_freq = 0, derot_limit, next_loop = 3; - int index = 0; - u8 cfr[2]; - u8 reg; - - internal->status = NOCARRIER; - derot_limit = (internal->sub_range / 2L) / internal->mclk; - derot_freq = internal->derot_freq; - - reg = stb0899_read_reg(state, STB0899_CFD); - STB0899_SETFIELD_VAL(CFD_ON, reg, 1); - stb0899_write_reg(state, STB0899_CFD, reg); - - do { - dprintk(state->verbose, FE_DEBUG, 1, "Derot Freq=%d, mclk=%d", derot_freq, internal->mclk); - if (stb0899_check_carrier(state) == NOCARRIER) { - index++; - last_derot_freq = derot_freq; - derot_freq += index * internal->direction * internal->derot_step; /* next zig zag derotator position */ - - if(ABS(derot_freq) > derot_limit) - next_loop--; - - if (next_loop) { - reg = stb0899_read_reg(state, STB0899_CFD); - STB0899_SETFIELD_VAL(CFD_ON, reg, 1); - stb0899_write_reg(state, STB0899_CFD, reg); - - STB0899_SETFIELD_VAL(CFRM, cfr[0], MSB(state->config->inversion * derot_freq)); - STB0899_SETFIELD_VAL(CFRL, cfr[1], LSB(state->config->inversion * derot_freq)); - stb0899_write_regs(state, STB0899_CFRM, cfr, 2); /* derotator frequency */ - } - } - - internal->direction = -internal->direction; /* Change zigzag direction */ - } while ((internal->status != CARRIEROK) && next_loop); - - if (internal->status == CARRIEROK) { - stb0899_read_regs(state, STB0899_CFRM, cfr, 2); /* get derotator frequency */ - internal->derot_freq = state->config->inversion * MAKEWORD16(cfr[0], cfr[1]); - dprintk(state->verbose, FE_DEBUG, 1, "----> CARRIER OK !, Derot Freq=%d", internal->derot_freq); - } else { - internal->derot_freq = last_derot_freq; } return internal->status; @@ -337,7 +285,7 @@ internal->status = NODATA; - /* RESET FEC */ + /* RESET FEC */ reg = stb0899_read_reg(state, STB0899_TSTRES); STB0899_SETFIELD_VAL(FRESACS, reg, 1); stb0899_write_reg(state, STB0899_TSTRES, reg); @@ -367,7 +315,8 @@ index++; } - if (lock) { /* DATA LOCK indicator */ + if (lock) { + /* DATA LOCK indicator */ internal->status = DATAOK; dprintk(state->verbose, FE_DEBUG, 1, "-----------------> DATA OK !"); } @@ -381,44 +330,38 @@ */ static enum stb0899_status stb0899_search_data(struct stb0899_state *state) { - short int derot_freq, derot_step, derot_limit, next_loop = 3; + short int derot_freq, derot_step, next_loop = 9; u8 cfr[2]; u8 reg; int index = 1; + int dir = 1; struct stb0899_internal *internal = &state->internal; - struct stb0899_params *params = &state->params; - derot_step = (params->srate / 4L) / internal->mclk; - derot_limit = (internal->sub_range / 2L) / internal->mclk; - derot_freq = internal->derot_freq; + /* auto detection range is about 2000 */ + derot_step = 2000; - do { - if ((internal->status != CARRIEROK) || (stb0899_check_data(state) != DATAOK)) { + while ((stb0899_check_data(state) != DATAOK) && next_loop){ + derot_freq = (index>>1) * dir * derot_step; /* next zig zag derotator position */ - derot_freq += index * internal->direction * derot_step; /* next zig zag derotator position */ - if (ABS(derot_freq) > derot_limit) - next_loop--; + dprintk(state->verbose, FE_DEBUG, 1, "Derot freq=%d, mclk=%d", derot_freq, internal->mclk); + reg = stb0899_read_reg(state, STB0899_CFD); + STB0899_SETFIELD_VAL(CFD_ON, reg, 1); + stb0899_write_reg(state, STB0899_CFD, reg); - if (next_loop) { - dprintk(state->verbose, FE_DEBUG, 1, "Derot freq=%d, mclk=%d", derot_freq, internal->mclk); - reg = stb0899_read_reg(state, STB0899_CFD); - STB0899_SETFIELD_VAL(CFD_ON, reg, 1); - stb0899_write_reg(state, STB0899_CFD, reg); + STB0899_SETFIELD_VAL(CFRM, cfr[0], MSB(state->config->inversion * derot_freq)); + STB0899_SETFIELD_VAL(CFRL, cfr[1], LSB(state->config->inversion * derot_freq)); + stb0899_write_regs(state, STB0899_CFRM, cfr, 2); /* derotator frequency */ - STB0899_SETFIELD_VAL(CFRM, cfr[0], MSB(state->config->inversion * derot_freq)); - STB0899_SETFIELD_VAL(CFRL, cfr[1], LSB(state->config->inversion * derot_freq)); - stb0899_write_regs(state, STB0899_CFRM, cfr, 2); /* derotator frequency */ - - stb0899_check_carrier(state); - index++; - } + index++; + if (index & 1) { + dir = -dir; } - internal->direction = -internal->direction; /* change zig zag direction */ - } while ((internal->status != DATAOK) && next_loop); + next_loop--; + } if (internal->status == DATAOK) { - stb0899_read_regs(state, STB0899_CFRM, cfr, 2); /* get derotator frequency */ + stb0899_read_regs(state, STB0899_CFRM, cfr, 2); internal->derot_freq = state->config->inversion * MAKEWORD16(cfr[0], cfr[1]); dprintk(state->verbose, FE_DEBUG, 1, "------> DATAOK ! Derot Freq=%d", internal->derot_freq); } @@ -426,57 +369,6 @@ return internal->status; } -/* - * stb0899_check_range - * check if the found frequency is in the correct range - */ -static enum stb0899_status stb0899_check_range(struct stb0899_state *state) -{ - struct stb0899_internal *internal = &state->internal; - struct stb0899_params *params = &state->params; - - int range_offst, tp_freq; - - range_offst = internal->srch_range / 2000; - tp_freq = internal->freq + (internal->derot_freq * internal->mclk) / 1000; - - if ((tp_freq >= params->freq - range_offst) && (tp_freq <= params->freq + range_offst)) { - internal->status = RANGEOK; - dprintk(state->verbose, FE_DEBUG, 1, "----> RANGEOK !"); - } else { - internal->status = OUTOFRANGE; - dprintk(state->verbose, FE_DEBUG, 1, "----> OUT OF RANGE !"); - } - - return internal->status; -} - -/* - * NextSubRange - * Compute the next subrange of the search - */ -static void next_sub_range(struct stb0899_state *state) -{ - struct stb0899_internal *internal = &state->internal; - struct stb0899_params *params = &state->params; - - long old_sub_range; - - if (internal->sub_dir > 0) { - old_sub_range = internal->sub_range; - internal->sub_range = MIN((internal->srch_range / 2) - - (internal->tuner_offst + internal->sub_range / 2), - internal->sub_range); - - if (internal->sub_range < 0) - internal->sub_range = 0; - - internal->tuner_offst += (old_sub_range + internal->sub_range) / 2; - } - - internal->freq = params->freq + (internal->sub_dir * internal->tuner_offst) / 1000; - internal->sub_dir = -internal->sub_dir; -} /* * stb0899_dvbs_algo @@ -494,10 +386,11 @@ u8 eq_const[10]; s32 clnI = 3; u32 bandwidth = 0; + int count; /* BETA values rated @ 99MHz */ s32 betaTab[5][4] = { - /* 5 10 20 30MBps */ + /* 5 10 20 30MBps */ { 37, 34, 32, 31 }, /* QPSK 1/2 */ { 37, 35, 33, 31 }, /* QPSK 2/3 */ { 37, 35, 33, 31 }, /* QPSK 3/4 */ @@ -549,13 +442,13 @@ dprintk(state->verbose, FE_DEBUG, 1, "Derot Percent=%d Srate=%d mclk=%d", internal->derot_percent, params->srate, internal->mclk); - /* Initial calculations */ - internal->derot_step = internal->derot_percent * (params->srate / 1000L) / internal->mclk; /* DerotStep/1000 * Fsymbol */ + /* Initial calculations */ + internal->derot_step = internal->derot_percent * (params->srate / 1000L) / internal->mclk; /* DerotStep/1000 * Fsymbol */ internal->t_derot = stb0899_calc_derot_time(params->srate); internal->t_data = 500; dprintk(state->verbose, FE_DEBUG, 1, "RESET stream merger"); - /* RESET Stream merger */ + /* RESET Stream merger */ reg = stb0899_read_reg(state, STB0899_TSTRES); STB0899_SETFIELD_VAL(FRESRS, reg, 1); stb0899_write_reg(state, STB0899_TSTRES, reg); @@ -571,7 +464,9 @@ stb0899_write_reg(state, STB0899_EQON, 0x01); /* Equalizer OFF while acquiring */ stb0899_write_reg(state, STB0899_VITSYNC, 0x19); - stb0899_first_subrange(state); + /* start where the user told us.... we add our derotator frequency if we have signal locked */ + internal->freq = params->freq; + count = 0; do { /* Initialisations */ cfr[0] = cfr[1] = 0; @@ -589,7 +484,7 @@ stb0899_i2c_gate_ctrl(&state->frontend, 1); /* Move tuner to frequency */ - dprintk(state->verbose, FE_DEBUG, 1, "Tuner set frequency"); + dprintk(state->verbose, FE_DEBUG, 1, "Tuner set frequency: %d", internal->freq); if (state->config->tuner_set_frequency) state->config->tuner_set_frequency(&state->frontend, internal->freq); @@ -597,7 +492,6 @@ state->config->tuner_get_frequency(&state->frontend, &internal->freq); msleep(internal->t_agc1 + internal->t_agc2 + internal->t_derot); /* AGC1, AGC2 and timing loop */ - dprintk(state->verbose, FE_DEBUG, 1, "current derot freq=%d", internal->derot_freq); internal->status = AGC1OK; /* There is signal in the band */ @@ -608,48 +502,44 @@ stb0899_i2c_gate_ctrl(&state->frontend, 0); if (params->srate <= bandwidth / 2) - stb0899_search_tmg(state); /* For low rates (SCPC) */ + stb0899_search_tmg(state); /* For low rates (SCPC) */ else - stb0899_check_tmg(state); /* For high rates (MCPC) */ + stb0899_check_tmg(state); /* For high rates (MCPC) */ if (internal->status == TIMINGOK) { - dprintk(state->verbose, FE_DEBUG, 1, - "TIMING OK ! Derot freq=%d, mclk=%d", - internal->derot_freq, internal->mclk); + dprintk(state->verbose, FE_DEBUG, 1, "TIMING OK ! Derot freq=%d, mclk=%d", internal->derot_freq, internal->mclk); - if (stb0899_search_carrier(state) == CARRIEROK) { /* Search for carrier */ - dprintk(state->verbose, FE_DEBUG, 1, - "CARRIER OK ! Derot freq=%d, mclk=%d", - internal->derot_freq, internal->mclk); + /* check for carrier. if it hasn't been found here it wont be found */ + if (stb0899_check_carrier(state) == CARRIEROK) { + dprintk(state->verbose, FE_DEBUG, 1, "CARRIER OK ! Derot freq=%d, mclk=%d", internal->derot_freq, internal->mclk); - if (stb0899_search_data(state) == DATAOK) { /* Check for data */ - dprintk(state->verbose, FE_DEBUG, 1, - "DATA OK ! Derot freq=%d, mclk=%d", - internal->derot_freq, internal->mclk); + /* Check for data */ + if (stb0899_search_data(state) == DATAOK) { + dprintk(state->verbose, FE_DEBUG, 1, "DATA OK ! Derot freq=%d, mclk=%d", internal->derot_freq, internal->mclk); - if (stb0899_check_range(state) == RANGEOK) { - dprintk(state->verbose, FE_DEBUG, 1, - "RANGE OK ! derot freq=%d, mclk=%d", - internal->derot_freq, internal->mclk); + internal->status = RANGEOK; + dprintk(state->verbose, FE_DEBUG, 1, "RANGE OK ! derot freq=%d, mclk=%d", internal->derot_freq, internal->mclk); - internal->freq = params->freq + ((internal->derot_freq * internal->mclk) / 1000); - reg = stb0899_read_reg(state, STB0899_PLPARM); - internal->fecrate = STB0899_GETFIELD(VITCURPUN, reg); - dprintk(state->verbose, FE_DEBUG, 1, - "freq=%d, internal resultant freq=%d", - params->freq, internal->freq); + internal->freq = params->freq + stb0899_get_frequency_offset(state); + dprintk(state->verbose, FE_DEBUG, 1, "param freq=%d, internal freq=%d", params->freq, internal->freq); - dprintk(state->verbose, FE_DEBUG, 1, - "internal puncture rate=%d", - internal->fecrate); - } + reg = stb0899_read_reg(state, STB0899_PLPARM); + internal->fecrate = STB0899_GETFIELD(VITCURPUN, reg); + dprintk(state->verbose, FE_DEBUG, 1, "internal puncture rate=%d", internal->fecrate); } } } - if (internal->status != RANGEOK) - next_sub_range(state); - } while (internal->sub_range && internal->status != RANGEOK); + /* avoid infinite loop */ + count++; + } while ((count < 3) && (internal->status != RANGEOK)); + + if (count == 3) { + /* RESET derotator frequency in case we did not find any signal */ + u8 cfr[2]; + cfr[0] = cfr[1] = 0; + stb0899_write_regs(state, STB0899_CFRM, cfr, 2); + } /* Set the timing loop to tracking */ stb0899_write_reg(state, STB0899_RTC, 0x33); @@ -1442,10 +1332,6 @@ i++; } } -/* - if (pParams->DVBS2State == FE_DVBS2_FEC_LOCKED) - pParams->IQLocked = !iqSpectrum; -*/ } } if (internal->status == DVBS2_FEC_LOCK) { @@ -1491,16 +1377,8 @@ STB0899_SETFIELD_VAL(EQ_SHIFT, reg, 0x02); stb0899_write_s2reg(state, STB0899_S2DEMOD, STB0899_BASE_EQ_CNTRL, STB0899_OFF0_EQ_CNTRL, reg); - /* Store signal parameters */ - offsetfreq = STB0899_READ_S2REG(STB0899_S2DEMOD, CRL_FREQ); - - offsetfreq = offsetfreq / ((1 << 30) / 1000); - offsetfreq *= (internal->master_clk / 1000000); - reg = STB0899_READ_S2REG(STB0899_S2DEMOD, DMD_CNTRL2); - if (STB0899_GETFIELD(SPECTRUM_INVERT, reg)) - offsetfreq *= -1; - - internal->freq = internal->freq - offsetfreq; + /* store acutal frequency */ + internal->freq = internal->freq + stb0899_get_frequency_offset(state); internal->srate = stb0899_dvbs2_get_srate(state); reg = STB0899_READ_S2REG(STB0899_S2DEMOD, UWP_STAT2); diff -r 3f6e9ce1887c linux/drivers/media/dvb/frontends/stb0899_drv.c --- a/linux/drivers/media/dvb/frontends/stb0899_drv.c Fri Oct 17 19:45:55 2008 +0300 +++ b/linux/drivers/media/dvb/frontends/stb0899_drv.c Sat Oct 18 13:45:45 2008 +0200 @@ -468,7 +468,7 @@ if (status != 2) { if (status != -ERESTARTSYS) printk(KERN_ERR "%s Read error, Reg=[0x%04x], Count=%u, Status=%d\n", - __func__, reg, count, status); + __func__, reg, (u32)count, status); goto err; } /* @@ -587,6 +587,9 @@ /* post process event */ if (postproc) { + if (postproc[ctl].gpio == 0) { + return 0; + } if (enable) { if (postproc[ctl].level == STB0899_GPIOPULLUP) stb0899_write_reg(state, postproc[ctl].gpio, 0x02); @@ -665,12 +668,7 @@ internal->av_frame_coarse = 10; internal->av_frame_fine = 20; internal->step_size = 2; -/* - if ((pParams->SpectralInv == FE_IQ_NORMAL) || (pParams->SpectralInv == FE_IQ_AUTO)) - pParams->IQLocked = 0; - else - pParams->IQLocked = 1; -*/ + } static int stb0899_wait_diseqc_fifo_empty(struct stb0899_state *state, int timeout) @@ -823,15 +821,10 @@ static int stb0899_diseqc_init(struct stb0899_state *state) { struct dvb_diseqc_master_cmd tx_data; - struct dvb_diseqc_slave_reply rx_data; u8 f22_tx, f22_rx, reg; - u32 mclk, tx_freq = 22000, count = 0, i; - - u32 trial = 0; /* try max = 2 (try 20khz and 17.5 khz) */ - u32 ret_1 = 0; /* 20 Khz status */ - u32 ret_2 = 0; /* 17.5 Khz status */ + u32 mclk, tx_freq = 22000; tx_data.msg[0] = 0xe2; tx_data.msg_len = 3; @@ -854,49 +847,12 @@ state->rx_freq = 20000; f22_rx = mclk / (state->rx_freq * 32); -#if 0 - while ((count < 5) && (trial < 2)) { - stb0899_write_reg(state, STB0899_DISF22RX, f22_rx); /* 2 possible values 17.5k/20k */ - - for (i = 0; i < 5; i++) { - msleep(50); - stb0899_send_diseqc_msg(&state->frontend, &tx_data); - msleep(100); - stb0899_recv_slave_reply(&state->frontend, &rx_data); - if (rx_data.msg_len >= 1) { - if ((rx_data.msg[0] == 0xe4) || (rx_data.msg[0] == 0xe5)) - count++; - } - } - if (trial == 0) - ret_1 = count; - else - ret_2 = count; - - trial++; - state->rx_freq = 17500; - f22_rx = mclk / (state->rx_freq * 32); - } - if (ret_1 > ret_2) { - state->rx_freq = 20000; - f22_rx = mclk / (state->rx_freq * 32); - } else { - state->rx_freq = 17500; - f22_rx = mclk / (state->rx_freq * 32); - } - - stb0899_write_reg(state, STB0899_DISF22RX, f22_rx); - if ((ret_1 == 0) && (ret_2 == 0)) - state->rx_freq = 0; /* no DiSEqC 2.0 slave */ - -#endif return 0; } static int stb0899_sleep(struct dvb_frontend *fe) { struct stb0899_state *state = fe->demodulator_priv; - u8 reg; dprintk(state->verbose, FE_DEBUG, 1, "Going to Sleep .. (Really tired .. :-))"); #if 0 @@ -936,7 +892,6 @@ struct stb0899_config *config = state->config; dprintk(state->verbose, FE_DEBUG, 1, "Initializing STB0899 ... "); -// mutex_init(&state->search_lock); /* init device */ dprintk(state->verbose, FE_DEBUG, 1, "init device"); @@ -971,6 +926,9 @@ stb0899_init_calc(state); stb0899_diseqc_init(state); + + /* post process event */ + stb0899_postproc(state, STB0899_POSTPROC_GPIO_POWER, 1); return 0; } @@ -1121,7 +1079,7 @@ reg = stb0899_read_reg(state, STB0899_VSTATUS); if (STB0899_GETFIELD(VSTATUS_LOCKEDVIT, reg)) { dprintk(state->verbose, FE_DEBUG, 1, "--------> FE_HAS_CARRIER | FE_HAS_LOCK"); - *status |= FE_HAS_CARRIER | FE_HAS_LOCK; + *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER | FE_HAS_LOCK; reg = stb0899_read_reg(state, STB0899_PLPARM); if (STB0899_GETFIELD(VITCURPUN, reg)) { @@ -1138,7 +1096,7 @@ if (internal->lock) { reg = STB0899_READ_S2REG(STB0899_S2DEMOD, DMD_STAT2); if (STB0899_GETFIELD(UWP_LOCK, reg) && STB0899_GETFIELD(CSM_LOCK, reg)) { - *status |= FE_HAS_CARRIER; + *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER; dprintk(state->verbose, FE_DEBUG, 1, "UWP & CSM Lock ! ---> DVB-S2 FE_HAS_CARRIER"); @@ -1183,7 +1141,6 @@ struct stb0899_internal *internal = &state->internal; u8 lsb, msb; - u32 i; *ber = 0; @@ -1193,14 +1150,9 @@ case SYS_DSS: #endif if (internal->lock) { - /* average 5 BER values */ - for (i = 0; i < 5; i++) { - msleep(100); lsb = stb0899_read_reg(state, STB0899_ECNT1L); msb = stb0899_read_reg(state, STB0899_ECNT1M); *ber += MAKEWORD16(msb, lsb); - } - *ber /= 5; /* Viterbi Check */ if (STB0899_GETFIELD(VSTATUS_PRFVIT, internal->v_status)) { /* Error Rate */ @@ -1213,13 +1165,9 @@ break; case SYS_DVBS2: if (internal->lock) { - /* Average 5 PER values */ - for (i = 0; i < 5; i++) { - msleep(100); lsb = stb0899_read_reg(state, STB0899_ECNT1L); msb = stb0899_read_reg(state, STB0899_ECNT1M); *ber += MAKEWORD16(msb, lsb); - } /* ber = ber * 10 ^ 7 */ *ber *= 10000000; *ber /= (-1 + (1 << (4 + 2 * STB0899_GETFIELD(NOE, internal->err_ctrl)))); @@ -1357,97 +1305,7 @@ return 0; } -#if 0 -static const struct dvbfe_info dvbs_info = { - .name = "STB0899 DVB-S", - .delsys = { - .dvbs.modulation = QPSK, - .dvbs.fec = FEC_1_2 | FEC_2_3 | - FEC_3_4 | FEC_5_6 | - FEC_6_7 - }, - .frequency_min = 950000, - .frequency_max = 2150000, - .frequency_step = 0, - .symbol_rate_min = 1000000, - .symbol_rate_max = 45000000, - .symbol_rate_tolerance = 0 -}; - -static const struct dvbfe_info dss_info = { - .name = "STB0899 DSS", - .delsys = { - .dss.modulation = DVBFE_MOD_BPSK | QPSK, - .dss.fec = FEC_1_2 | FEC_2_3 | - FEC_3_4 | FEC_5_6 | - FEC_6_7 - }, - - .frequency_min = 950000, - .frequency_max = 2150000, - .frequency_step = 0, - .symbol_rate_min = 1000000, - .symbol_rate_max = 45000000, - .symbol_rate_tolerance = 0 -}; - -static const struct dvbfe_info dvbs2_info = { - .name = "STB0899 DVB-S2", - .delsys = { - .dvbs2.modulation = QPSK | _8PSK | - _16PSK | _32PSK, - - .dvbs2.fec = FEC_1_4 | FEC_1_3 | - FEC_2_5 | FEC_1_2 | - FEC_3_5 | FEC_2_3 | - FEC_3_4 | FEC_4_5 | - FEC_5_6 | FEC_8_9 | - FEC_9_10, - }, - - .frequency_min = 950000, - .frequency_max = 2150000, - .frequency_step = 0, - .symbol_rate_min = 1000000, - .symbol_rate_max = 45000000, - .symbol_rate_tolerance = 0 -}; - -static int stb0899_get_info(struct dvb_frontend *fe, struct dvbfe_info *fe_info) -{ - struct stb0899_state *state = fe->demodulator_priv; - - dprintk(state->verbose, FE_DEBUG, 1, "Get Info"); - - switch (state->delsys) { - case SYS_DVBS: - dprintk(state->verbose, FE_ERROR, 1, "Querying DVB-S info"); - memcpy(fe_info, &dvbs_info, sizeof (struct dvbfe_info)); - break; - case SYS_DSS: - dprintk(state->verbose, FE_ERROR, 1, "Querying DSS info"); - memcpy(fe_info, &dss_info, sizeof (struct dvbfe_info)); - break; - case SYS_DVBS2: - dprintk(state->verbose, FE_ERROR, 1, "Querying DVB-S2 info"); - memcpy(fe_info, &dvbs2_info, sizeof (struct dvbfe_info)); - break; - default: - dprintk(state->verbose, FE_ERROR, 1, "Unsupported delivery system"); - return -EINVAL; - } - dprintk(state->verbose, FE_DEBUG, 1, "delivery system=%d", state->delsys); - - return 0; -} -#endif -static int stb0899_get_delsys(struct dvb_frontend *fe, enum fe_delivery_system *fe_delsys) -{ - *fe_delsys = SYS_DVBS2; - - return 0; -} static void stb0899_set_delivery(struct stb0899_state *state) { @@ -1586,11 +1444,20 @@ static int stb0899_get_property(struct dvb_frontend *fe, struct dtv_property* tvp) { struct stb0899_state *state = fe->demodulator_priv; + struct stb0899_params *intparams = &state->params; dprintk(state->verbose, FE_ERROR, 1, "%s(..)\n", __func__); + + /* update actual frequency */ + switch(tvp->cmd) { + case DTV_FREQUENCY: + fe->dtv_property_cache.frequency = intparams->freq + stb0899_get_frequency_offset(state); + break; + } + return 0; } -/*static enum dvbfe_search stb0899_search(struct dvb_frontend *fe, struct dvbfe_params *params)*/ + static int stb0899_set_frontend(struct dvb_frontend *fe, struct dvb_frontend_parameters *p) { struct stb0899_state *state = fe->demodulator_priv; @@ -1684,12 +1551,6 @@ dprintk(state->verbose, FE_DEBUG, 1, "-------------------------------------> DVB-S LOCK !"); -// stb0899_write_reg(state, STB0899_ERRCTRL1, 0x3d); /* Viterbi Errors */ -// internal->v_status = stb0899_read_reg(state, STB0899_VSTATUS); -// internal->err_ctrl = stb0899_read_reg(state, STB0899_ERRCTRL1); -// dprintk(state->verbose, FE_DEBUG, 1, "VSTATUS=0x%02x", internal->v_status); -// dprintk(state->verbose, FE_DEBUG, 1, "ERR_CTRL=0x%02x", internal->err_ctrl); - return 0; } else { internal->lock = 0; @@ -1713,8 +1574,6 @@ /* disable tuner I/O */ stb0899_i2c_gate_ctrl(&state->frontend, 0); -// pParams->SpectralInv = pSearch->IQ_Inversion; - /* Set DVB-S2 AGC */ stb0899_write_reg(state, STB0899_AGCRFCFG, 0x1c); @@ -1727,10 +1586,6 @@ internal->lock = 1; dprintk(state->verbose, FE_DEBUG, 1, "-------------------------------------> DVB-S2 LOCK !"); - -// stb0899_write_reg(state, STB0899_ERRCTRL1, 0xb6); /* Packet Errors */ -// internal->v_status = stb0899_read_reg(state, STB0899_VSTATUS); -// internal->err_ctrl = stb0899_read_reg(state, STB0899_ERRCTRL1); return 0; } else { @@ -1748,320 +1603,19 @@ return -1; } -static enum stb0899_status stb0899_track_carrier(struct stb0899_state *state) -{ - u8 reg; - reg = stb0899_read_reg(state, STB0899_DSTATUS); - dprintk(state->verbose, FE_DEBUG, 1, "--------------------> STB0899_DSTATUS=[0x%02x]", reg); - if (STB0899_GETFIELD(CARRIER_FOUND, reg)) { - dprintk(state->verbose, FE_DEBUG, 1, "-------------> CARRIEROK !"); - return CARRIEROK; - } else { - dprintk(state->verbose, FE_DEBUG, 1, "-------------> NOCARRIER !"); - return NOCARRIER; - } - - return NOCARRIER; -} - -static enum stb0899_status stb0899_get_ifagc(struct stb0899_state *state) -{ - u8 reg; - - reg = STB0899_READ_S2REG(STB0899_S2DEMOD, DMD_STATUS); - dprintk(state->verbose, FE_DEBUG, 1, "DMD_STATUS=[0x%02x]", reg); - if (STB0899_GETFIELD(IF_AGC_LOCK, reg)) { - dprintk(state->verbose, FE_DEBUG, 1, "------------->IF AGC LOCKED !"); - return AGC1OK; - } else { - dprintk(state->verbose, FE_DEBUG, 1, "------------->IF AGC LOCK LOST !"); - return NOAGC1; - } - - return NOAGC1; -} - -static int stb0899_get_s1fec(struct stb0899_internal *internal, enum fe_code_rate *fec) -{ - switch (internal->fecrate) { - case STB0899_FEC_1_2: - *fec = FEC_1_2; - break; - case STB0899_FEC_2_3: - *fec = FEC_2_3; - break; - case STB0899_FEC_3_4: - *fec = FEC_3_4; - break; - case STB0899_FEC_5_6: - *fec = FEC_5_6; - break; - case STB0899_FEC_6_7: - *fec = FEC_6_7; - break; - case STB0899_FEC_7_8: - *fec = FEC_7_8; - break; - default: - return -EINVAL; - } - - return 0; -} -#if 0 -static int stb0899_get_modcod(struct stb0899_internal *internal, struct dvbs2_params *params) -{ - switch (internal->modcod) { - case STB0899_DUMMY_PLF: - params->modulation = QPSK; - params->fec = FEC_NONE; - break; - case STB0899_QPSK_14: - params->modulation = QPSK; - params->fec = FEC_1_4; - break; - case STB0899_QPSK_13: - params->modulation = QPSK; - params->fec = FEC_1_3; - break; - case STB0899_QPSK_25: - params->modulation = QPSK; - params->fec = FEC_2_5; - break; - case STB0899_QPSK_12: - params->modulation = QPSK; - params->fec = FEC_1_2; - break; - case STB0899_QPSK_35: - params->modulation = QPSK; - params->fec = FEC_3_5; - break; - case STB0899_QPSK_23: - params->modulation = QPSK; - params->fec = FEC_2_3; - break; - case STB0899_QPSK_34: - params->modulation = QPSK; - params->fec = FEC_3_4; - break; - case STB0899_QPSK_45: - params->modulation = QPSK; - params->fec = FEC_4_5; - break; - case STB0899_QPSK_56: - params->modulation = QPSK; - params->fec = FEC_5_6; - break; - case STB0899_QPSK_89: - params->modulation = QPSK; - params->fec = FEC_8_9; - break; - case STB0899_QPSK_910: - params->modulation = QPSK; - params->fec = FEC_9_10; - break; - case STB0899_8PSK_35: - params->modulation = _8PSK; - params->fec = FEC_3_5; - break; - case STB0899_8PSK_23: - params->modulation = _8PSK; - params->fec = FEC_2_3; - break; - case STB0899_8PSK_34: - params->modulation = _8PSK; - params->fec = FEC_3_4; - break; - case STB0899_8PSK_56: - params->modulation = _8PSK; - params->fec = FEC_5_6; - break; - case STB0899_8PSK_89: - params->modulation = _8PSK; - params->fec = FEC_8_9; - break; - case STB0899_8PSK_910: - params->modulation = _8PSK; - params->fec = FEC_9_10; - break; - case STB0899_16APSK_23: - params->modulation = _16PSK; - params->fec = FEC_2_3; - break; - case STB0899_16APSK_34: - params->modulation = _16PSK; - params->fec = FEC_3_4; - break; - case STB0899_16APSK_45: - params->modulation = _16PSK; - params->fec = FEC_4_5; - break; - case STB0899_16APSK_56: - params->modulation = _16PSK; - params->fec = FEC_5_6; - break; - case STB0899_16APSK_89: - params->modulation = _16PSK; - params->fec = FEC_8_9; - break; - case STB0899_16APSK_910: - params->modulation = _16PSK; - params->fec = FEC_9_10; - break; - case STB0899_32APSK_34: - params->modulation = _32PSK; - params->fec = FEC_3_4; - break; - case STB0899_32APSK_45: - params->modulation = _32PSK; - params->fec = FEC_4_5; - break; - case STB0899_32APSK_56: - params->modulation = _32PSK; - params->fec = FEC_5_6; - break; - case STB0899_32APSK_89: - params->modulation = _32PSK; - params->fec = FEC_8_9; - break; - case STB0899_32APSK_910: - params->modulation = _32PSK; - params->fec = FEC_9_10; - break; - default: - return -EINVAL; - } - - return 0; -} -#endif -/* - * stb0899_track - * periodically check the signal level against a specified - * threshold level and perform derotator centering. - * called once we have a lock from a succesful search - * event. - * - * Will be called periodically called to maintain the - * lock. - * - * Will be used to get parameters as well as info from - * the decoded baseband header - * - * Once a new lock has established, the internal state - * frequency (internal->freq) is updated - */ -static int stb0899_track(struct dvb_frontend *fe, struct dvb_frontend_parameters *params, int *delay) -{ - u32 lock_lost; - - struct stb0899_state *state = fe->demodulator_priv; - struct stb0899_internal *internal = &state->internal; - -#if 0 - switch (state->delsys) { - case SYS_DVBS: - dprintk(state->verbose, FE_DEBUG, 1, "Tracking DVB-S state"); - if (stb0899_track_carrier(state) == CARRIEROK) { - params->frequency = internal->freq; - params->inversion = internal->inversion; - params->delivery = state->delsys; - params->delsys.dvbs.symbol_rate = internal->srate; - params->delsys.dvbs.modulation = QPSK; - stb0899_get_s1fec(internal, ¶ms->delsys.dvbs.fec); - } - break; - case SYS_DSS: - dprintk(state->verbose, FE_DEBUG, 1, "Tracking DSS state"); - if (stb0899_track_carrier(state) == CARRIEROK) { - params->frequency = internal->freq; - params->inversion = internal->inversion; - params->delivery = state->delsys; - params->delsys.dss.symbol_rate = internal->srate; - params->delsys.dss.modulation = QPSK; - stb0899_get_s1fec(internal, ¶ms->delsys.dss.fec); - } - break; - case SYS_DVBS2: - dprintk(state->verbose, FE_DEBUG, 1, "Tracking DVB-S2 state"); - if (stb0899_get_ifagc(state) == AGC1OK) { - params->frequency = internal->freq; - params->inversion = internal->inversion; - params->delivery = state->delsys; - params->delsys.dvbs2.symbol_rate = internal->srate; - stb0899_get_modcod(internal, ¶ms->delsys.dvbs2); - params->delsys.dvbs2.rolloff = internal->rolloff; - params->delsys.dvbs2.matype_1 = stb0899_read_reg(state, STB0899_MATSTRL); - params->delsys.dvbs2.matype_2 = stb0899_read_reg(state, STB0899_MATSTRM); - params->delsys.dvbs2.upl_1 = stb0899_read_reg(state, STB0899_UPLSTRL); - params->delsys.dvbs2.upl_2 = stb0899_read_reg(state, STB0899_UPLSTRM); - params->delsys.dvbs2.dfl_1 = stb0899_read_reg(state, STB0899_DFLSTRL); - params->delsys.dvbs2.dfl_2 = stb0899_read_reg(state, STB0899_DFLSTRM); - params->delsys.dvbs2.sync = stb0899_read_reg(state, STB0899_SYNCSTR); - params->delsys.dvbs2.syncd_1 = stb0899_read_reg(state, STB0899_SYNCDSTRL); - params->delsys.dvbs2.syncd_2 = stb0899_read_reg(state, STB0899_SYNCDSTRM); - } - lock_lost = STB0899_READ_S2REG(STB0899_S2DEMOD, LOCK_LOST); - dprintk(state->verbose, FE_DEBUG, 1, "Lock Lost=[0x%02x]\n", lock_lost); - if (STB0899_GETFIELD(LOCK_LOST, lock_lost)) - dprintk(state->verbose, FE_ERROR, 1, "Demodulator LOST LOCK !\n"); - break; - default: - dprintk(state->verbose, FE_ERROR, 1, "Unsupported delivery system"); - return -EINVAL; - } -#endif - - *delay = HZ/10; - - return 0; -} -#if 0 -static int stb0899_get_params(struct dvb_frontend *fe, struct dvb_frontend_parameters *params) +static int stb0899_get_frontend(struct dvb_frontend *fe, struct dvb_frontend_parameters *params) { struct stb0899_state *state = fe->demodulator_priv; - struct stb0899_internal *internal = &state->internal; + struct stb0899_params *intparams = &state->params; - params->frequency = internal->freq; - params->inversion = internal->inversion; - params->delivery = state->delsys; - switch (state->delsys) { - case SYS_DVBS: - dprintk(state->verbose, FE_DEBUG, 1, "Get DVB-S params"); - params->delsys.dvbs.symbol_rate = internal->srate; - params->delsys.dvbs.modulation = QPSK; - break; - case SYS_DSS: - dprintk(state->verbose, FE_DEBUG, 1, "Get DSS params"); - params->delsys.dss.symbol_rate = internal->srate; - params->delsys.dss.modulation = QPSK; - break; - case SYS_DVBS2: - dprintk(state->verbose, FE_DEBUG, 1, "Get DVB-S2 params"); - params->delsys.dvbs2.symbol_rate = internal->srate; - break; - default: - dprintk(state->verbose, FE_ERROR, 1, "Unsupported delivery system"); - return -EINVAL; - } + params->frequency = intparams->freq + stb0899_get_frequency_offset(state); + /* TODO: other params */ return 0; } -static enum dvbfe_algo stb0899_frontend_algo(struct dvb_frontend *fe) -{ - return DVBFE_ALGO_CUSTOM; -} -static int stb0899_set_delsys(struct dvb_frontend *fe, enum dvbfe_delsys delsys) -{ - struct stb0899_state *state = fe->demodulator_priv; - - state->delsys = delsys; - return 0; -} -#endif static struct dvb_frontend_ops stb0899_ops = { .info = { @@ -2072,24 +1626,14 @@ .release = stb0899_release, .init = stb0899_init, .sleep = stb0899_sleep, -// .wakeup = stb0899_wakeup, .i2c_gate_ctrl = stb0899_i2c_gate_ctrl, -#if 0 - .get_info = stb0899_get_info, - .get_delsys = stb0899_get_delsys, - .set_delsys = stb0899_set_delsys, - .get_frontend_algo = stb0899_frontend_algo, - .search = stb0899_search, -#endif .set_property = stb0899_set_property, .get_property = stb0899_get_property, .set_frontend = stb0899_set_frontend, -#if 0 - .track = stb0899_track, - .get_params = stb0899_get_params, -#endif + .get_frontend = stb0899_get_frontend, + .read_status = stb0899_read_status, .read_snr = stb0899_read_snr, .read_signal_strength = stb0899_read_signal_strength, diff -r 3f6e9ce1887c linux/drivers/media/dvb/frontends/stb0899_drv.h --- a/linux/drivers/media/dvb/frontends/stb0899_drv.h Fri Oct 17 19:45:55 2008 +0300 +++ b/linux/drivers/media/dvb/frontends/stb0899_drv.h Sat Oct 18 13:45:45 2008 +0200 @@ -83,7 +83,7 @@ * 1. POWER ON/OFF (index 0) * 2. FE_HAS_LOCK/LOCK_LOSS (index 1) * - * @gpio = one of the above listed GPIO's + * @gpio = one of the above listed GPIO's (set to 0 to ignore this entry) * @level = output state: pulled up or low */ struct stb0899_postproc { diff -r 3f6e9ce1887c linux/drivers/media/dvb/frontends/stb0899_priv.h --- a/linux/drivers/media/dvb/frontends/stb0899_priv.h Fri Oct 17 19:45:55 2008 +0300 +++ b/linux/drivers/media/dvb/frontends/stb0899_priv.h Sat Oct 18 13:45:45 2008 +0200 @@ -165,13 +165,11 @@ struct stb0899_internal { u32 master_clk; - u32 freq; /* Demod internal Frequency */ + u32 freq; /* Demod internal Frequency (kHz) */ u32 srate; /* Demod internal Symbol rate */ enum stb0899_fec fecrate; /* Demod internal FEC rate */ - u32 srch_range; /* Demod internal Search Range */ - u32 sub_range; /* Demod current sub range (Hz) */ + u32 srch_range; /* Demod internal Search Range (Hz) */ u32 tuner_step; /* Tuner step (Hz) */ - u32 tuner_offst; /* Relative offset to carrier (Hz) */ u32 tuner_bw; /* Current bandwidth of the tuner (Hz) */ s32 mclk; /* Masterclock Divider factor (binary) */ @@ -184,7 +182,6 @@ s16 derot_step; /* Derotator step (binary value) */ s16 t_derot; /* Derotator time constant (ms) */ s16 t_data; /* Data recovery time constant (ms) */ - s16 sub_dir; /* Direction of the next sub range */ s16 t_agc1; /* Agc1 time constant (ms) */ s16 t_agc2; /* Agc2 time constant (ms) */ @@ -270,5 +267,11 @@ extern enum stb0899_status stb0899_dvbs_algo(struct stb0899_state *state); extern enum stb0899_status stb0899_dvbs2_algo(struct stb0899_state *state); extern long stb0899_carr_width(struct stb0899_state *state); +/* + * read offset registers and + * calculate frequency offset in kHz + * according to the currently selected standard + */ +extern s32 stb0899_get_frequency_offset(struct stb0899_state *state); #endif //__STB0899_PRIV_H diff -r 3f6e9ce1887c linux/drivers/media/dvb/frontends/stb6100.c --- a/linux/drivers/media/dvb/frontends/stb6100.c Fri Oct 17 19:45:55 2008 +0300 +++ b/linux/drivers/media/dvb/frontends/stb6100.c Sat Oct 18 13:45:45 2008 +0200 @@ -27,7 +27,7 @@ #include "dvb_frontend.h" #include "stb6100.h" -static unsigned int verbose; +static unsigned int verbose = 0; module_param(verbose, int, 0644); @@ -392,7 +392,7 @@ if ((rc = stb6100_write_reg(state, STB6100_VCO, regs[STB6100_VCO])) < 0) return rc; - msleep(10); /* wait for LO to lock */ + msleep(5); /* wait for LO to lock */ regs[STB6100_VCO] &= ~STB6100_VCO_OSCH; /* vco search disabled */ regs[STB6100_VCO] |= STB6100_VCO_OCK; /* search clock off */ if ((rc = stb6100_write_reg(state, STB6100_VCO, regs[STB6100_VCO])) < 0) @@ -421,12 +421,12 @@ status->ifreq = 0; status->refclock = 27000000; /* Hz */ status->iqsense = 1; - status->bandwidth = 36000; /* kHz */ - state->bandwidth = status->bandwidth * 1000; /* MHz */ + status->bandwidth = 42000; /* kHz */ + state->bandwidth = status->bandwidth * 1000; /* Hz */ state->reference = status->refclock / 1000; /* kHz */ /* Set default bandwidth. */ - return stb6100_set_bandwidth(fe, status->bandwidth); + return stb6100_set_bandwidth(fe, state->bandwidth); } #if 0 static int stb6100_get_state(struct dvb_frontend *fe, diff -r 3f6e9ce1887c linux/drivers/media/dvb/frontends/stb6100.h --- a/linux/drivers/media/dvb/frontends/stb6100.h Fri Oct 17 19:45:55 2008 +0300 +++ b/linux/drivers/media/dvb/frontends/stb6100.h Sat Oct 18 13:45:45 2008 +0200 @@ -95,11 +95,15 @@ const struct stb6100_config *config; struct dvb_tuner_ops ops; struct dvb_frontend *frontend; + /* + * Frequency in ? + * BandWidth in kHz + */ struct tuner_state status; - u32 frequency; + u32 frequency; /* kHz */ u32 srate; - u32 bandwidth; + u32 bandwidth; /* Hz */ u32 reference; }; diff -r 3f6e9ce1887c linux/drivers/media/dvb/frontends/stb6100_cfg.h --- a/linux/drivers/media/dvb/frontends/stb6100_cfg.h Fri Oct 17 19:45:55 2008 +0300 +++ b/linux/drivers/media/dvb/frontends/stb6100_cfg.h Sat Oct 18 13:45:45 2008 +0200 @@ -36,8 +36,6 @@ return err; } freq = *frequency; - printk("%s: Frequency=%d\n", __func__, freq); - } return 0; } @@ -57,7 +55,6 @@ printk("%s: Invalid parameter\n", __func__); return err; } - printk("%s: Frequency=%d\n", __func__, frequency); } return 0; } @@ -80,7 +77,6 @@ } band = *bandwidth; } - printk("%s: Bandwidth=%d\n", __func__, band); return 0; } @@ -99,7 +95,6 @@ printk("%s: Invalid parameter\n", __func__); return err; } - printk("%s: Bandwidth=%d\n", __func__, bandwidth); } return 0; } diff -r 3f6e9ce1887c linux/include/linux/dvb/frontend.h --- a/linux/include/linux/dvb/frontend.h Fri Oct 17 19:45:55 2008 +0300 +++ b/linux/include/linux/dvb/frontend.h Sat Oct 18 13:45:45 2008 +0200 @@ -299,7 +299,6 @@ #define DTV_ISDB_LAYERC_SEGMENT_WIDTH 33 #define DTV_ISDB_LAYERC_TIME_INTERLEAVING 34 #endif -#define DTV_API_VERSION 35 #define DTV_API_VERSION 35 #define DTV_CODE_RATE_HP 36 #define DTV_CODE_RATE_LP 37