Hi Igor, Em 01-02-2011 20:40, Igor M. Liplianin escreveu: > Variable 'retune' does not make sense. > Loop is not needed for only one try. > Remove unnecessary dprintk's. > > Signed-off-by: Igor M. Liplianin <liplianin@xxxxx> This patch didn't apply. Please fix and resend. Thanks! Mauro. > --- > drivers/media/dvb/frontends/ds3000.c | 442 +++++++++++++++++----------------- > 1 files changed, 216 insertions(+), 226 deletions(-) > > diff --git a/drivers/media/dvb/frontends/ds3000.c b/drivers/media/dvb/frontends/ds3000.c > index 3373890..7c61936 100644 > --- a/drivers/media/dvb/frontends/ds3000.c > +++ b/drivers/media/dvb/frontends/ds3000.c > @@ -1049,7 +1049,7 @@ static int ds3000_tune(struct dvb_frontend *fe, > struct ds3000_state *state = fe->demodulator_priv; > struct dtv_frontend_properties *c = &fe->dtv_property_cache; > > - int ret = 0, retune, i; > + int ret = 0, i; > u8 status, mlpf, mlpf_new, mlpf_max, mlpf_min, nlpf; > u16 value, ndiv; > u32 f3db; > @@ -1072,249 +1072,239 @@ static int ds3000_tune(struct dvb_frontend *fe, > /* discard the 'current' tuning parameters and prepare to tune */ > ds3000_clone_params(fe); > > - retune = 1; /* try 1 times */ > - dprintk("%s: retune = %d\n", __func__, retune); > - dprintk("%s: frequency = %d\n", __func__, state->dcur.frequency); > - dprintk("%s: symbol_rate = %d\n", __func__, state->dcur.symbol_rate); > - dprintk("%s: FEC = %d \n", __func__, > - state->dcur.fec); > - dprintk("%s: Inversion = %d\n", __func__, state->dcur.inversion); > - > - do { > - /* Reset status register */ > - status = 0; > - /* Tune */ > - /* unknown */ > - ds3000_tuner_writereg(state, 0x07, 0x02); > - ds3000_tuner_writereg(state, 0x10, 0x00); > - ds3000_tuner_writereg(state, 0x60, 0x79); > - ds3000_tuner_writereg(state, 0x08, 0x01); > - ds3000_tuner_writereg(state, 0x00, 0x01); > - /* calculate and set freq divider */ > - if (state->dcur.frequency < 1146000) { > - ds3000_tuner_writereg(state, 0x10, 0x11); > - ndiv = ((state->dcur.frequency * (6 + 8) * 4) + > - (DS3000_XTAL_FREQ / 2)) / > - DS3000_XTAL_FREQ - 1024; > - } else { > - ds3000_tuner_writereg(state, 0x10, 0x01); > - ndiv = ((state->dcur.frequency * (6 + 8) * 2) + > - (DS3000_XTAL_FREQ / 2)) / > - DS3000_XTAL_FREQ - 1024; > - } > + /* Reset status register */ > + status = 0; > + /* Tune */ > + /* unknown */ > + ds3000_tuner_writereg(state, 0x07, 0x02); > + ds3000_tuner_writereg(state, 0x10, 0x00); > + ds3000_tuner_writereg(state, 0x60, 0x79); > + ds3000_tuner_writereg(state, 0x08, 0x01); > + ds3000_tuner_writereg(state, 0x00, 0x01); > + /* calculate and set freq divider */ > + if (state->dcur.frequency < 1146000) { > + ds3000_tuner_writereg(state, 0x10, 0x11); > + ndiv = ((state->dcur.frequency * (6 + 8) * 4) + > + (DS3000_XTAL_FREQ / 2)) / > + DS3000_XTAL_FREQ - 1024; > + } else { > + ds3000_tuner_writereg(state, 0x10, 0x01); > + ndiv = ((state->dcur.frequency * (6 + 8) * 2) + > + (DS3000_XTAL_FREQ / 2)) / > + DS3000_XTAL_FREQ - 1024; > + } > > - ds3000_tuner_writereg(state, 0x01, (ndiv & 0x0f00) >> 8); > - ds3000_tuner_writereg(state, 0x02, ndiv & 0x00ff); > - > - /* set pll */ > - ds3000_tuner_writereg(state, 0x03, 0x06); > - ds3000_tuner_writereg(state, 0x51, 0x0f); > - ds3000_tuner_writereg(state, 0x51, 0x1f); > - ds3000_tuner_writereg(state, 0x50, 0x10); > - ds3000_tuner_writereg(state, 0x50, 0x00); > - msleep(5); > - > - /* unknown */ > - ds3000_tuner_writereg(state, 0x51, 0x17); > - ds3000_tuner_writereg(state, 0x51, 0x1f); > - ds3000_tuner_writereg(state, 0x50, 0x08); > - ds3000_tuner_writereg(state, 0x50, 0x00); > - msleep(5); > - > - value = ds3000_tuner_readreg(state, 0x3d); > - value &= 0x0f; > - if ((value > 4) && (value < 15)) { > - value -= 3; > - if (value < 4) > - value = 4; > - value = ((value << 3) | 0x01) & 0x79; > - } > + ds3000_tuner_writereg(state, 0x01, (ndiv & 0x0f00) >> 8); > + ds3000_tuner_writereg(state, 0x02, ndiv & 0x00ff); > + > + /* set pll */ > + ds3000_tuner_writereg(state, 0x03, 0x06); > + ds3000_tuner_writereg(state, 0x51, 0x0f); > + ds3000_tuner_writereg(state, 0x51, 0x1f); > + ds3000_tuner_writereg(state, 0x50, 0x10); > + ds3000_tuner_writereg(state, 0x50, 0x00); > + msleep(5); > + > + /* unknown */ > + ds3000_tuner_writereg(state, 0x51, 0x17); > + ds3000_tuner_writereg(state, 0x51, 0x1f); > + ds3000_tuner_writereg(state, 0x50, 0x08); > + ds3000_tuner_writereg(state, 0x50, 0x00); > + msleep(5); > + > + value = ds3000_tuner_readreg(state, 0x3d); > + value &= 0x0f; > + if ((value > 4) && (value < 15)) { > + value -= 3; > + if (value < 4) > + value = 4; > + value = ((value << 3) | 0x01) & 0x79; > + } > > - ds3000_tuner_writereg(state, 0x60, value); > - ds3000_tuner_writereg(state, 0x51, 0x17); > - ds3000_tuner_writereg(state, 0x51, 0x1f); > - ds3000_tuner_writereg(state, 0x50, 0x08); > - ds3000_tuner_writereg(state, 0x50, 0x00); > - > - /* set low-pass filter period */ > - ds3000_tuner_writereg(state, 0x04, 0x2e); > - ds3000_tuner_writereg(state, 0x51, 0x1b); > - ds3000_tuner_writereg(state, 0x51, 0x1f); > - ds3000_tuner_writereg(state, 0x50, 0x04); > - ds3000_tuner_writereg(state, 0x50, 0x00); > - msleep(5); > - > - f3db = ((state->dcur.symbol_rate / 1000) << 2) / 5 + 2000; > - if ((state->dcur.symbol_rate / 1000) < 5000) > - f3db += 3000; > - if (f3db < 7000) > - f3db = 7000; > - if (f3db > 40000) > - f3db = 40000; > - > - /* set low-pass filter baseband */ > - value = ds3000_tuner_readreg(state, 0x26); > - mlpf = 0x2e * 207 / ((value << 1) + 151); > - mlpf_max = mlpf * 135 / 100; > - mlpf_min = mlpf * 78 / 100; > - if (mlpf_max > 63) > - mlpf_max = 63; > - > - /* rounded to the closest integer */ > - nlpf = ((mlpf * f3db * 1000) + (2766 * DS3000_XTAL_FREQ / 2)) > - / (2766 * DS3000_XTAL_FREQ); > - if (nlpf > 23) > - nlpf = 23; > - if (nlpf < 1) > - nlpf = 1; > - > - /* rounded to the closest integer */ > + ds3000_tuner_writereg(state, 0x60, value); > + ds3000_tuner_writereg(state, 0x51, 0x17); > + ds3000_tuner_writereg(state, 0x51, 0x1f); > + ds3000_tuner_writereg(state, 0x50, 0x08); > + ds3000_tuner_writereg(state, 0x50, 0x00); > + > + /* set low-pass filter period */ > + ds3000_tuner_writereg(state, 0x04, 0x2e); > + ds3000_tuner_writereg(state, 0x51, 0x1b); > + ds3000_tuner_writereg(state, 0x51, 0x1f); > + ds3000_tuner_writereg(state, 0x50, 0x04); > + ds3000_tuner_writereg(state, 0x50, 0x00); > + msleep(5); > + > + f3db = ((state->dcur.symbol_rate / 1000) << 2) / 5 + 2000; > + if ((state->dcur.symbol_rate / 1000) < 5000) > + f3db += 3000; > + if (f3db < 7000) > + f3db = 7000; > + if (f3db > 40000) > + f3db = 40000; > + > + /* set low-pass filter baseband */ > + value = ds3000_tuner_readreg(state, 0x26); > + mlpf = 0x2e * 207 / ((value << 1) + 151); > + mlpf_max = mlpf * 135 / 100; > + mlpf_min = mlpf * 78 / 100; > + if (mlpf_max > 63) > + mlpf_max = 63; > + > + /* rounded to the closest integer */ > + nlpf = ((mlpf * f3db * 1000) + (2766 * DS3000_XTAL_FREQ / 2)) > + / (2766 * DS3000_XTAL_FREQ); > + if (nlpf > 23) > + nlpf = 23; > + if (nlpf < 1) > + nlpf = 1; > + > + /* rounded to the closest integer */ > + mlpf_new = ((DS3000_XTAL_FREQ * nlpf * 2766) + > + (1000 * f3db / 2)) / (1000 * f3db); > + > + if (mlpf_new < mlpf_min) { > + nlpf++; > mlpf_new = ((DS3000_XTAL_FREQ * nlpf * 2766) + > (1000 * f3db / 2)) / (1000 * f3db); > + } > > - if (mlpf_new < mlpf_min) { > - nlpf++; > - mlpf_new = ((DS3000_XTAL_FREQ * nlpf * 2766) + > - (1000 * f3db / 2)) / (1000 * f3db); > - } > + if (mlpf_new > mlpf_max) > + mlpf_new = mlpf_max; > + > + ds3000_tuner_writereg(state, 0x04, mlpf_new); > + ds3000_tuner_writereg(state, 0x06, nlpf); > + ds3000_tuner_writereg(state, 0x51, 0x1b); > + ds3000_tuner_writereg(state, 0x51, 0x1f); > + ds3000_tuner_writereg(state, 0x50, 0x04); > + ds3000_tuner_writereg(state, 0x50, 0x00); > + msleep(5); > + > + /* unknown */ > + ds3000_tuner_writereg(state, 0x51, 0x1e); > + ds3000_tuner_writereg(state, 0x51, 0x1f); > + ds3000_tuner_writereg(state, 0x50, 0x01); > + ds3000_tuner_writereg(state, 0x50, 0x00); > + msleep(60); > + > + /* ds3000 global reset */ > + ds3000_writereg(state, 0x07, 0x80); > + ds3000_writereg(state, 0x07, 0x00); > + /* ds3000 build-in uC reset */ > + ds3000_writereg(state, 0xb2, 0x01); > + /* ds3000 software reset */ > + ds3000_writereg(state, 0x00, 0x01); > + > + switch (c->delivery_system) { > + case SYS_DVBS: > + /* initialise the demod in DVB-S mode */ > + for (i = 0; i < sizeof(ds3000_dvbs_init_tab); i += 2) > + ds3000_writereg(state, > + ds3000_dvbs_init_tab[i], > + ds3000_dvbs_init_tab[i + 1]); > + value = ds3000_readreg(state, 0xfe); > + value &= 0xc0; > + value |= 0x1b; > + ds3000_writereg(state, 0xfe, value); > + break; > + case SYS_DVBS2: > + /* initialise the demod in DVB-S2 mode */ > + for (i = 0; i < sizeof(ds3000_dvbs2_init_tab); i += 2) > + ds3000_writereg(state, > + ds3000_dvbs2_init_tab[i], > + ds3000_dvbs2_init_tab[i + 1]); > + ds3000_writereg(state, 0xfe, 0x98); > + break; > + default: > + return 1; > + } > > - if (mlpf_new > mlpf_max) > - mlpf_new = mlpf_max; > - > - ds3000_tuner_writereg(state, 0x04, mlpf_new); > - ds3000_tuner_writereg(state, 0x06, nlpf); > - ds3000_tuner_writereg(state, 0x51, 0x1b); > - ds3000_tuner_writereg(state, 0x51, 0x1f); > - ds3000_tuner_writereg(state, 0x50, 0x04); > - ds3000_tuner_writereg(state, 0x50, 0x00); > - msleep(5); > - > - /* unknown */ > - ds3000_tuner_writereg(state, 0x51, 0x1e); > - ds3000_tuner_writereg(state, 0x51, 0x1f); > - ds3000_tuner_writereg(state, 0x50, 0x01); > - ds3000_tuner_writereg(state, 0x50, 0x00); > - msleep(60); > - > - /* ds3000 global reset */ > - ds3000_writereg(state, 0x07, 0x80); > - ds3000_writereg(state, 0x07, 0x00); > - /* ds3000 build-in uC reset */ > - ds3000_writereg(state, 0xb2, 0x01); > - /* ds3000 software reset */ > - ds3000_writereg(state, 0x00, 0x01); > + /* enable 27MHz clock output */ > + ds3000_writereg(state, 0x29, 0x80); > + /* enable ac coupling */ > + ds3000_writereg(state, 0x25, 0x8a); > + > + /* enhance symbol rate performance */ > + if ((state->dcur.symbol_rate / 1000) <= 5000) { > + value = 29777 / (state->dcur.symbol_rate / 1000) + 1; > + if (value % 2 != 0) > + value++; > + ds3000_writereg(state, 0xc3, 0x0d); > + ds3000_writereg(state, 0xc8, value); > + ds3000_writereg(state, 0xc4, 0x10); > + ds3000_writereg(state, 0xc7, 0x0e); > + } else if ((state->dcur.symbol_rate / 1000) <= 10000) { > + value = 92166 / (state->dcur.symbol_rate / 1000) + 1; > + if (value % 2 != 0) > + value++; > + ds3000_writereg(state, 0xc3, 0x07); > + ds3000_writereg(state, 0xc8, value); > + ds3000_writereg(state, 0xc4, 0x09); > + ds3000_writereg(state, 0xc7, 0x12); > + } else if ((state->dcur.symbol_rate / 1000) <= 20000) { > + value = 64516 / (state->dcur.symbol_rate / 1000) + 1; > + ds3000_writereg(state, 0xc3, value); > + ds3000_writereg(state, 0xc8, 0x0e); > + ds3000_writereg(state, 0xc4, 0x07); > + ds3000_writereg(state, 0xc7, 0x18); > + } else { > + value = 129032 / (state->dcur.symbol_rate / 1000) + 1; > + ds3000_writereg(state, 0xc3, value); > + ds3000_writereg(state, 0xc8, 0x0a); > + ds3000_writereg(state, 0xc4, 0x05); > + ds3000_writereg(state, 0xc7, 0x24); > + } > + > + /* normalized symbol rate rounded to the closest integer */ > + value = (((state->dcur.symbol_rate / 1000) << 16) + > + (DS3000_SAMPLE_RATE / 2)) / DS3000_SAMPLE_RATE; > + ds3000_writereg(state, 0x61, value & 0x00ff); > + ds3000_writereg(state, 0x62, (value & 0xff00) >> 8); > + > + /* co-channel interference cancellation disabled */ > + ds3000_writereg(state, 0x56, 0x00); > + > + /* equalizer disabled */ > + ds3000_writereg(state, 0x76, 0x00); > + > + /*ds3000_writereg(state, 0x08, 0x03); > + ds3000_writereg(state, 0xfd, 0x22); > + ds3000_writereg(state, 0x08, 0x07); > + ds3000_writereg(state, 0xfd, 0x42); > + ds3000_writereg(state, 0x08, 0x07);*/ > > + if (state->config->ci_mode) { > switch (c->delivery_system) { > case SYS_DVBS: > - /* initialise the demod in DVB-S mode */ > - for (i = 0; i < sizeof(ds3000_dvbs_init_tab); i += 2) > - ds3000_writereg(state, > - ds3000_dvbs_init_tab[i], > - ds3000_dvbs_init_tab[i + 1]); > - value = ds3000_readreg(state, 0xfe); > - value &= 0xc0; > - value |= 0x1b; > - ds3000_writereg(state, 0xfe, value); > - break; > + default: > + ds3000_writereg(state, 0xfd, 0x80); > + break; > case SYS_DVBS2: > - /* initialise the demod in DVB-S2 mode */ > - for (i = 0; i < sizeof(ds3000_dvbs2_init_tab); i += 2) > - ds3000_writereg(state, > - ds3000_dvbs2_init_tab[i], > - ds3000_dvbs2_init_tab[i + 1]); > - ds3000_writereg(state, 0xfe, 0x98); > + ds3000_writereg(state, 0xfd, 0x01); > break; > - default: > - return 1; > } > + } > > - /* enable 27MHz clock output */ > - ds3000_writereg(state, 0x29, 0x80); > - /* enable ac coupling */ > - ds3000_writereg(state, 0x25, 0x8a); > - > - /* enhance symbol rate performance */ > - if ((state->dcur.symbol_rate / 1000) <= 5000) { > - value = 29777 / (state->dcur.symbol_rate / 1000) + 1; > - if (value % 2 != 0) > - value++; > - ds3000_writereg(state, 0xc3, 0x0d); > - ds3000_writereg(state, 0xc8, value); > - ds3000_writereg(state, 0xc4, 0x10); > - ds3000_writereg(state, 0xc7, 0x0e); > - } else if ((state->dcur.symbol_rate / 1000) <= 10000) { > - value = 92166 / (state->dcur.symbol_rate / 1000) + 1; > - if (value % 2 != 0) > - value++; > - ds3000_writereg(state, 0xc3, 0x07); > - ds3000_writereg(state, 0xc8, value); > - ds3000_writereg(state, 0xc4, 0x09); > - ds3000_writereg(state, 0xc7, 0x12); > - } else if ((state->dcur.symbol_rate / 1000) <= 20000) { > - value = 64516 / (state->dcur.symbol_rate / 1000) + 1; > - ds3000_writereg(state, 0xc3, value); > - ds3000_writereg(state, 0xc8, 0x0e); > - ds3000_writereg(state, 0xc4, 0x07); > - ds3000_writereg(state, 0xc7, 0x18); > - } else { > - value = 129032 / (state->dcur.symbol_rate / 1000) + 1; > - ds3000_writereg(state, 0xc3, value); > - ds3000_writereg(state, 0xc8, 0x0a); > - ds3000_writereg(state, 0xc4, 0x05); > - ds3000_writereg(state, 0xc7, 0x24); > - } > + /* ds3000 out of software reset */ > + ds3000_writereg(state, 0x00, 0x00); > + /* start ds3000 build-in uC */ > + ds3000_writereg(state, 0xb2, 0x00); > > - /* normalized symbol rate rounded to the closest integer */ > - value = (((state->dcur.symbol_rate / 1000) << 16) + > - (DS3000_SAMPLE_RATE / 2)) / DS3000_SAMPLE_RATE; > - ds3000_writereg(state, 0x61, value & 0x00ff); > - ds3000_writereg(state, 0x62, (value & 0xff00) >> 8); > - > - /* co-channel interference cancellation disabled */ > - ds3000_writereg(state, 0x56, 0x00); > - > - /* equalizer disabled */ > - ds3000_writereg(state, 0x76, 0x00); > - > - /*ds3000_writereg(state, 0x08, 0x03); > - ds3000_writereg(state, 0xfd, 0x22); > - ds3000_writereg(state, 0x08, 0x07); > - ds3000_writereg(state, 0xfd, 0x42); > - ds3000_writereg(state, 0x08, 0x07);*/ > - > - if (state->config->ci_mode) { > - switch (c->delivery_system) { > - case SYS_DVBS: > - default: > - ds3000_writereg(state, 0xfd, 0x80); > - break; > - case SYS_DVBS2: > - ds3000_writereg(state, 0xfd, 0x01); > - break; > - } > - } > + /* TODO: calculate and set carrier offset */ > > - /* ds3000 out of software reset */ > - ds3000_writereg(state, 0x00, 0x00); > - /* start ds3000 build-in uC */ > - ds3000_writereg(state, 0xb2, 0x00); > - > - /* TODO: calculate and set carrier offset */ > - > - /* wait before retrying */ > - for (i = 0; i < 30 ; i++) { > - if (ds3000_is_tuned(fe)) { > - dprintk("%s: Tuned\n", __func__); > - ds3000_dump_registers(fe); > - goto tuned; > - } > - msleep(1); > + /* wait before retrying */ > + for (i = 0; i < 30 ; i++) { > + if (ds3000_is_tuned(fe)) { > + dprintk("%s: Tuned\n", __func__); > + ds3000_dump_registers(fe); > + goto tuned; > } > + msleep(1); > + } > > - dprintk("%s: Not tuned\n", __func__); > - ds3000_dump_registers(fe); > + dprintk("%s: Not tuned\n", __func__); > + ds3000_dump_registers(fe); > > - } while (--retune); > > tuned: > return ret; -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html