forked from luck/tmp_suning_uos_patched
V4L/DVB (6656): zl10353: store frequencies in 0.1kHz to eliminate rounding errors
Whilst reanalysing my formulas I realised it was no longer possible to get the right values for a 36.1667MHz IF due to rounding problems. Storing frequencies in units of 0.1kHz makes it possible to calculate these again correctly. Signed-off-by: Chris Pascoe <c.pascoe@itee.uq.edu.au> Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
This commit is contained in:
parent
702a67624e
commit
a1dcd9de64
@ -435,7 +435,7 @@ static struct mt352_config cxusb_mt352_config = {
|
||||
|
||||
static struct zl10353_config cxusb_zl10353_xc3028_config = {
|
||||
.demod_address = 0x0f,
|
||||
.if2 = 4560,
|
||||
.if2 = 45600,
|
||||
.no_tuner = 1,
|
||||
.parallel_ts = 1,
|
||||
};
|
||||
|
@ -123,9 +123,10 @@ static void zl10353_calc_nominal_rate(struct dvb_frontend *fe,
|
||||
enum fe_bandwidth bandwidth,
|
||||
u16 *nominal_rate)
|
||||
{
|
||||
u32 adc_clock = 45056; /* 45.056 MHz */
|
||||
u8 bw;
|
||||
struct zl10353_state *state = fe->demodulator_priv;
|
||||
u32 adc_clock = 450560; /* 45.056 MHz */
|
||||
u64 value;
|
||||
u8 bw;
|
||||
|
||||
if (state->config.adc_clock)
|
||||
adc_clock = state->config.adc_clock;
|
||||
@ -143,7 +144,9 @@ static void zl10353_calc_nominal_rate(struct dvb_frontend *fe,
|
||||
break;
|
||||
}
|
||||
|
||||
*nominal_rate = (bw * (1 << 23) / 7 * 125 + adc_clock / 2) / adc_clock;
|
||||
value = (bw * (u64)10 * (1 << 23) / 7 * 125 + adc_clock / 2);
|
||||
do_div(value, adc_clock);
|
||||
*nominal_rate = value;
|
||||
|
||||
dprintk("%s: bw %d, adc_clock %d => 0x%x\n",
|
||||
__FUNCTION__, bw, adc_clock, *nominal_rate);
|
||||
@ -153,8 +156,8 @@ static void zl10353_calc_input_freq(struct dvb_frontend *fe,
|
||||
u16 *input_freq)
|
||||
{
|
||||
struct zl10353_state *state = fe->demodulator_priv;
|
||||
u32 adc_clock = 45056; /* 45.056 MHz */
|
||||
int if2 = 36167; /* 36.167 MHz */
|
||||
u32 adc_clock = 450560; /* 45.056 MHz */
|
||||
int if2 = 361667; /* 36.1667 MHz */
|
||||
int ife;
|
||||
u64 value;
|
||||
|
||||
@ -170,7 +173,7 @@ static void zl10353_calc_input_freq(struct dvb_frontend *fe,
|
||||
if (ife > adc_clock / 2)
|
||||
ife = adc_clock - ife;
|
||||
}
|
||||
value = 65536ULL * ife + adc_clock / 2;
|
||||
value = (u64)65536 * ife + adc_clock / 2;
|
||||
do_div(value, adc_clock);
|
||||
*input_freq = -value;
|
||||
|
||||
|
@ -29,9 +29,9 @@ struct zl10353_config
|
||||
/* demodulator's I2C address */
|
||||
u8 demod_address;
|
||||
|
||||
/* frequencies in kHz */
|
||||
int adc_clock; /* default: 45056 */
|
||||
int if2; /* default: 36167 */
|
||||
/* frequencies in units of 0.1kHz */
|
||||
int adc_clock; /* default: 450560 (45.056 MHz) */
|
||||
int if2; /* default: 361667 (36.1667 MHz) */
|
||||
|
||||
/* set if no pll is connected to the secondary i2c bus */
|
||||
int no_tuner;
|
||||
@ -50,6 +50,6 @@ static inline struct dvb_frontend* zl10353_attach(const struct zl10353_config *c
|
||||
printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __FUNCTION__);
|
||||
return NULL;
|
||||
}
|
||||
#endif // CONFIG_DVB_ZL10353
|
||||
#endif /* CONFIG_DVB_ZL10353 */
|
||||
|
||||
#endif /* ZL10353_H */
|
||||
|
Loading…
Reference in New Issue
Block a user