1 // SPDX-License-Identifier: GPL-2.0-only
3 * Linux-DVB Driver for DiBcom's second generation DiB7000P (PC).
5 * Copyright (C) 2005-7 DiBcom (http://www.dibcom.fr/)
8 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
10 #include <linux/kernel.h>
11 #include <linux/slab.h>
12 #include <linux/i2c.h>
13 #include <linux/mutex.h>
14 #include <asm/div64.h>
16 #include <media/dvb_math.h>
17 #include <media/dvb_frontend.h>
22 module_param(debug, int, 0644);
23 MODULE_PARM_DESC(debug, "turn on debugging (default: 0)");
25 static int buggy_sfn_workaround;
26 module_param(buggy_sfn_workaround, int, 0644);
27 MODULE_PARM_DESC(buggy_sfn_workaround, "Enable work-around for buggy SFNs (default: 0)");
29 #define dprintk(fmt, arg...) do { \
31 printk(KERN_DEBUG pr_fmt("%s: " fmt), \
36 struct i2c_adapter *i2c_adap;
40 struct dib7000p_state {
41 struct dvb_frontend demod;
42 struct dib7000p_config cfg;
45 struct i2c_adapter *i2c_adap;
47 struct dibx000_i2c_master i2c_master;
52 u32 current_bandwidth;
53 struct dibx000_agc_config *current_agc;
65 u8 sfn_workaround_active:1;
67 #define SOC7090 0x7090
71 struct i2c_adapter dib7090_tuner_adap;
73 /* for the I2C transfer */
74 struct i2c_msg msg[2];
75 u8 i2c_write_buffer[4];
76 u8 i2c_read_buffer[2];
77 struct mutex i2c_buffer_lock;
83 unsigned long per_jiffies_stats;
84 unsigned long ber_jiffies_stats;
85 unsigned long get_stats_time;
88 enum dib7000p_power_mode {
89 DIB7000P_POWER_ALL = 0,
90 DIB7000P_POWER_ANALOG_ADC,
91 DIB7000P_POWER_INTERFACE_ONLY,
94 /* dib7090 specific functions */
95 static int dib7090_set_output_mode(struct dvb_frontend *fe, int mode);
96 static int dib7090_set_diversity_in(struct dvb_frontend *fe, int onoff);
97 static void dib7090_setDibTxMux(struct dib7000p_state *state, int mode);
98 static void dib7090_setHostBusMux(struct dib7000p_state *state, int mode);
100 static u16 dib7000p_read_word(struct dib7000p_state *state, u16 reg)
104 if (mutex_lock_interruptible(&state->i2c_buffer_lock) < 0) {
105 dprintk("could not acquire lock\n");
109 state->i2c_write_buffer[0] = reg >> 8;
110 state->i2c_write_buffer[1] = reg & 0xff;
112 memset(state->msg, 0, 2 * sizeof(struct i2c_msg));
113 state->msg[0].addr = state->i2c_addr >> 1;
114 state->msg[0].flags = 0;
115 state->msg[0].buf = state->i2c_write_buffer;
116 state->msg[0].len = 2;
117 state->msg[1].addr = state->i2c_addr >> 1;
118 state->msg[1].flags = I2C_M_RD;
119 state->msg[1].buf = state->i2c_read_buffer;
120 state->msg[1].len = 2;
122 if (i2c_transfer(state->i2c_adap, state->msg, 2) != 2)
123 dprintk("i2c read error on %d\n", reg);
125 ret = (state->i2c_read_buffer[0] << 8) | state->i2c_read_buffer[1];
126 mutex_unlock(&state->i2c_buffer_lock);
130 static int dib7000p_write_word(struct dib7000p_state *state, u16 reg, u16 val)
134 if (mutex_lock_interruptible(&state->i2c_buffer_lock) < 0) {
135 dprintk("could not acquire lock\n");
139 state->i2c_write_buffer[0] = (reg >> 8) & 0xff;
140 state->i2c_write_buffer[1] = reg & 0xff;
141 state->i2c_write_buffer[2] = (val >> 8) & 0xff;
142 state->i2c_write_buffer[3] = val & 0xff;
144 memset(&state->msg[0], 0, sizeof(struct i2c_msg));
145 state->msg[0].addr = state->i2c_addr >> 1;
146 state->msg[0].flags = 0;
147 state->msg[0].buf = state->i2c_write_buffer;
148 state->msg[0].len = 4;
150 ret = (i2c_transfer(state->i2c_adap, state->msg, 1) != 1 ?
152 mutex_unlock(&state->i2c_buffer_lock);
156 static void dib7000p_write_tab(struct dib7000p_state *state, u16 * buf)
165 dib7000p_write_word(state, r, *n++);
172 static int dib7000p_set_output_mode(struct dib7000p_state *state, int mode)
175 u16 outreg, fifo_threshold, smo_mode;
178 fifo_threshold = 1792;
179 smo_mode = (dib7000p_read_word(state, 235) & 0x0050) | (1 << 1);
181 dprintk("setting output mode for demod %p to %d\n", &state->demod, mode);
184 case OUTMODE_MPEG2_PAR_GATED_CLK:
185 outreg = (1 << 10); /* 0x0400 */
187 case OUTMODE_MPEG2_PAR_CONT_CLK:
188 outreg = (1 << 10) | (1 << 6); /* 0x0440 */
190 case OUTMODE_MPEG2_SERIAL:
191 outreg = (1 << 10) | (2 << 6) | (0 << 1); /* 0x0480 */
193 case OUTMODE_DIVERSITY:
194 if (state->cfg.hostbus_diversity)
195 outreg = (1 << 10) | (4 << 6); /* 0x0500 */
199 case OUTMODE_MPEG2_FIFO:
200 smo_mode |= (3 << 1);
201 fifo_threshold = 512;
202 outreg = (1 << 10) | (5 << 6);
204 case OUTMODE_ANALOG_ADC:
205 outreg = (1 << 10) | (3 << 6);
211 dprintk("Unhandled output_mode passed to be set for demod %p\n", &state->demod);
215 if (state->cfg.output_mpeg2_in_188_bytes)
216 smo_mode |= (1 << 5);
218 ret |= dib7000p_write_word(state, 235, smo_mode);
219 ret |= dib7000p_write_word(state, 236, fifo_threshold); /* synchronous fread */
220 if (state->version != SOC7090)
221 ret |= dib7000p_write_word(state, 1286, outreg); /* P_Div_active */
226 static int dib7000p_set_diversity_in(struct dvb_frontend *demod, int onoff)
228 struct dib7000p_state *state = demod->demodulator_priv;
230 if (state->div_force_off) {
231 dprintk("diversity combination deactivated - forced by COFDM parameters\n");
233 dib7000p_write_word(state, 207, 0);
235 dib7000p_write_word(state, 207, (state->div_sync_wait << 4) | (1 << 2) | (2 << 0));
237 state->div_state = (u8) onoff;
240 dib7000p_write_word(state, 204, 6);
241 dib7000p_write_word(state, 205, 16);
242 /* P_dvsy_sync_mode = 0, P_dvsy_sync_enable=1, P_dvcb_comb_mode=2 */
244 dib7000p_write_word(state, 204, 1);
245 dib7000p_write_word(state, 205, 0);
251 static int dib7000p_set_power_mode(struct dib7000p_state *state, enum dib7000p_power_mode mode)
253 /* by default everything is powered off */
254 u16 reg_774 = 0x3fff, reg_775 = 0xffff, reg_776 = 0x0007, reg_899 = 0x0003, reg_1280 = (0xfe00) | (dib7000p_read_word(state, 1280) & 0x01ff);
256 /* now, depending on the requested mode, we power on */
258 /* power up everything in the demod */
259 case DIB7000P_POWER_ALL:
264 if (state->version == SOC7090)
270 case DIB7000P_POWER_ANALOG_ADC:
271 /* dem, cfg, iqc, sad, agc */
272 reg_774 &= ~((1 << 15) | (1 << 14) | (1 << 11) | (1 << 10) | (1 << 9));
274 reg_776 &= ~((1 << 0));
276 if (state->version != SOC7090)
277 reg_1280 &= ~((1 << 11));
278 reg_1280 &= ~(1 << 6);
280 case DIB7000P_POWER_INTERFACE_ONLY:
281 /* just leave power on the control-interfaces: GPIO and (I2C or SDIO) */
282 /* TODO power up either SDIO or I2C */
283 if (state->version == SOC7090)
284 reg_1280 &= ~((1 << 7) | (1 << 5));
286 reg_1280 &= ~((1 << 14) | (1 << 13) | (1 << 12) | (1 << 10));
289 /* TODO following stuff is just converted from the dib7000-driver - check when is used what */
292 dib7000p_write_word(state, 774, reg_774);
293 dib7000p_write_word(state, 775, reg_775);
294 dib7000p_write_word(state, 776, reg_776);
295 dib7000p_write_word(state, 1280, reg_1280);
296 if (state->version != SOC7090)
297 dib7000p_write_word(state, 899, reg_899);
302 static void dib7000p_set_adc_state(struct dib7000p_state *state, enum dibx000_adc_states no)
304 u16 reg_908 = 0, reg_909 = 0;
307 if (state->version != SOC7090) {
308 reg_908 = dib7000p_read_word(state, 908);
309 reg_909 = dib7000p_read_word(state, 909);
313 case DIBX000_SLOW_ADC_ON:
314 if (state->version == SOC7090) {
315 reg = dib7000p_read_word(state, 1925);
317 dib7000p_write_word(state, 1925, reg | (1 << 4) | (1 << 2)); /* en_slowAdc = 1 & reset_sladc = 1 */
319 reg = dib7000p_read_word(state, 1925); /* read access to make it works... strange ... */
321 dib7000p_write_word(state, 1925, reg & ~(1 << 4)); /* en_slowAdc = 1 & reset_sladc = 0 */
323 reg = dib7000p_read_word(state, 72) & ~((0x3 << 14) | (0x3 << 12));
324 dib7000p_write_word(state, 72, reg | (1 << 14) | (3 << 12) | 524); /* ref = Vin1 => Vbg ; sel = Vin0 or Vin3 ; (Vin2 = Vcm) */
326 reg_909 |= (1 << 1) | (1 << 0);
327 dib7000p_write_word(state, 909, reg_909);
328 reg_909 &= ~(1 << 1);
332 case DIBX000_SLOW_ADC_OFF:
333 if (state->version == SOC7090) {
334 reg = dib7000p_read_word(state, 1925);
335 dib7000p_write_word(state, 1925, (reg & ~(1 << 2)) | (1 << 4)); /* reset_sladc = 1 en_slowAdc = 0 */
337 reg_909 |= (1 << 1) | (1 << 0);
345 case DIBX000_ADC_OFF:
346 reg_908 |= (1 << 14) | (1 << 13) | (1 << 12);
347 reg_909 |= (1 << 5) | (1 << 4) | (1 << 3) | (1 << 2);
350 case DIBX000_VBG_ENABLE:
351 reg_908 &= ~(1 << 15);
354 case DIBX000_VBG_DISABLE:
355 reg_908 |= (1 << 15);
362 // dprintk( "908: %x, 909: %x\n", reg_908, reg_909);
364 reg_909 |= (state->cfg.disable_sample_and_hold & 1) << 4;
365 reg_908 |= (state->cfg.enable_current_mirror & 1) << 7;
367 if (state->version != SOC7090) {
368 dib7000p_write_word(state, 908, reg_908);
369 dib7000p_write_word(state, 909, reg_909);
373 static int dib7000p_set_bandwidth(struct dib7000p_state *state, u32 bw)
377 // store the current bandwidth for later use
378 state->current_bandwidth = bw;
380 if (state->timf == 0) {
381 dprintk("using default timf\n");
382 timf = state->cfg.bw->timf;
384 dprintk("using updated timf\n");
388 timf = timf * (bw / 50) / 160;
390 dib7000p_write_word(state, 23, (u16) ((timf >> 16) & 0xffff));
391 dib7000p_write_word(state, 24, (u16) ((timf) & 0xffff));
396 static int dib7000p_sad_calib(struct dib7000p_state *state)
399 dib7000p_write_word(state, 73, (0 << 1) | (0 << 0));
401 if (state->version == SOC7090)
402 dib7000p_write_word(state, 74, 2048);
404 dib7000p_write_word(state, 74, 776);
406 /* do the calibration */
407 dib7000p_write_word(state, 73, (1 << 0));
408 dib7000p_write_word(state, 73, (0 << 0));
415 static int dib7000p_set_wbd_ref(struct dvb_frontend *demod, u16 value)
417 struct dib7000p_state *state = demod->demodulator_priv;
420 state->wbd_ref = value;
421 return dib7000p_write_word(state, 105, (dib7000p_read_word(state, 105) & 0xf000) | value);
424 static int dib7000p_get_agc_values(struct dvb_frontend *fe,
425 u16 *agc_global, u16 *agc1, u16 *agc2, u16 *wbd)
427 struct dib7000p_state *state = fe->demodulator_priv;
429 if (agc_global != NULL)
430 *agc_global = dib7000p_read_word(state, 394);
432 *agc1 = dib7000p_read_word(state, 392);
434 *agc2 = dib7000p_read_word(state, 393);
436 *wbd = dib7000p_read_word(state, 397);
441 static int dib7000p_set_agc1_min(struct dvb_frontend *fe, u16 v)
443 struct dib7000p_state *state = fe->demodulator_priv;
444 return dib7000p_write_word(state, 108, v);
447 static void dib7000p_reset_pll(struct dib7000p_state *state)
449 struct dibx000_bandwidth_config *bw = &state->cfg.bw[0];
452 if (state->version == SOC7090) {
453 dib7000p_write_word(state, 1856, (!bw->pll_reset << 13) | (bw->pll_range << 12) | (bw->pll_ratio << 6) | (bw->pll_prediv));
455 while (((dib7000p_read_word(state, 1856) >> 15) & 0x1) != 1)
458 dib7000p_write_word(state, 1857, dib7000p_read_word(state, 1857) | (!bw->pll_bypass << 15));
460 /* force PLL bypass */
461 clk_cfg0 = (1 << 15) | ((bw->pll_ratio & 0x3f) << 9) |
462 (bw->modulo << 7) | (bw->ADClkSrc << 6) | (bw->IO_CLK_en_core << 5) | (bw->bypclk_div << 2) | (bw->enable_refdiv << 1) | (0 << 0);
464 dib7000p_write_word(state, 900, clk_cfg0);
467 dib7000p_write_word(state, 903, (bw->pll_prediv << 5) | (((bw->pll_ratio >> 6) & 0x3) << 3) | (bw->pll_range << 1) | bw->pll_reset);
468 clk_cfg0 = (bw->pll_bypass << 15) | (clk_cfg0 & 0x7fff);
469 dib7000p_write_word(state, 900, clk_cfg0);
472 dib7000p_write_word(state, 18, (u16) (((bw->internal * 1000) >> 16) & 0xffff));
473 dib7000p_write_word(state, 19, (u16) ((bw->internal * 1000) & 0xffff));
474 dib7000p_write_word(state, 21, (u16) ((bw->ifreq >> 16) & 0xffff));
475 dib7000p_write_word(state, 22, (u16) ((bw->ifreq) & 0xffff));
477 dib7000p_write_word(state, 72, bw->sad_cfg);
480 static u32 dib7000p_get_internal_freq(struct dib7000p_state *state)
482 u32 internal = (u32) dib7000p_read_word(state, 18) << 16;
483 internal |= (u32) dib7000p_read_word(state, 19);
489 static int dib7000p_update_pll(struct dvb_frontend *fe, struct dibx000_bandwidth_config *bw)
491 struct dib7000p_state *state = fe->demodulator_priv;
492 u16 reg_1857, reg_1856 = dib7000p_read_word(state, 1856);
496 /* get back old values */
497 prediv = reg_1856 & 0x3f;
498 loopdiv = (reg_1856 >> 6) & 0x3f;
500 if ((bw != NULL) && (bw->pll_prediv != prediv || bw->pll_ratio != loopdiv)) {
501 dprintk("Updating pll (prediv: old = %d new = %d ; loopdiv : old = %d new = %d)\n", prediv, bw->pll_prediv, loopdiv, bw->pll_ratio);
503 reg_1857 = dib7000p_read_word(state, 1857);
504 dib7000p_write_word(state, 1857, reg_1857 & ~(1 << 15));
506 dib7000p_write_word(state, 1856, reg_1856 | ((bw->pll_ratio & 0x3f) << 6) | (bw->pll_prediv & 0x3f));
508 /* write new system clk into P_sec_len */
509 internal = dib7000p_get_internal_freq(state);
510 xtal = (internal / loopdiv) * prediv;
511 internal = 1000 * (xtal / bw->pll_prediv) * bw->pll_ratio; /* new internal */
512 dib7000p_write_word(state, 18, (u16) ((internal >> 16) & 0xffff));
513 dib7000p_write_word(state, 19, (u16) (internal & 0xffff));
515 dib7000p_write_word(state, 1857, reg_1857 | (1 << 15));
517 while (((dib7000p_read_word(state, 1856) >> 15) & 0x1) != 1)
518 dprintk("Waiting for PLL to lock\n");
525 static int dib7000p_reset_gpio(struct dib7000p_state *st)
527 /* reset the GPIOs */
528 dprintk("gpio dir: %x: val: %x, pwm_pos: %x\n", st->gpio_dir, st->gpio_val, st->cfg.gpio_pwm_pos);
530 dib7000p_write_word(st, 1029, st->gpio_dir);
531 dib7000p_write_word(st, 1030, st->gpio_val);
533 /* TODO 1031 is P_gpio_od */
535 dib7000p_write_word(st, 1032, st->cfg.gpio_pwm_pos);
537 dib7000p_write_word(st, 1037, st->cfg.pwm_freq_div);
541 static int dib7000p_cfg_gpio(struct dib7000p_state *st, u8 num, u8 dir, u8 val)
543 st->gpio_dir = dib7000p_read_word(st, 1029);
544 st->gpio_dir &= ~(1 << num); /* reset the direction bit */
545 st->gpio_dir |= (dir & 0x1) << num; /* set the new direction */
546 dib7000p_write_word(st, 1029, st->gpio_dir);
548 st->gpio_val = dib7000p_read_word(st, 1030);
549 st->gpio_val &= ~(1 << num); /* reset the direction bit */
550 st->gpio_val |= (val & 0x01) << num; /* set the new value */
551 dib7000p_write_word(st, 1030, st->gpio_val);
556 static int dib7000p_set_gpio(struct dvb_frontend *demod, u8 num, u8 dir, u8 val)
558 struct dib7000p_state *state = demod->demodulator_priv;
559 return dib7000p_cfg_gpio(state, num, dir, val);
562 static u16 dib7000p_defaults[] = {
563 // auto search configuration
566 (1<<3)|(1<<11)|(1<<12)|(1<<13),
567 0x0814, /* Equal Lock */
586 /* set ADC level to -16 */
588 (1 << 13) - 825 - 117,
589 (1 << 13) - 837 - 117,
590 (1 << 13) - 811 - 117,
591 (1 << 13) - 766 - 117,
592 (1 << 13) - 737 - 117,
593 (1 << 13) - 693 - 117,
594 (1 << 13) - 648 - 117,
595 (1 << 13) - 619 - 117,
596 (1 << 13) - 575 - 117,
597 (1 << 13) - 531 - 117,
598 (1 << 13) - 501 - 117,
603 /* disable power smoothing */
645 static void dib7000p_reset_stats(struct dvb_frontend *fe);
647 static int dib7000p_demod_reset(struct dib7000p_state *state)
649 dib7000p_set_power_mode(state, DIB7000P_POWER_ALL);
651 if (state->version == SOC7090)
652 dibx000_reset_i2c_master(&state->i2c_master);
654 dib7000p_set_adc_state(state, DIBX000_VBG_ENABLE);
656 /* restart all parts */
657 dib7000p_write_word(state, 770, 0xffff);
658 dib7000p_write_word(state, 771, 0xffff);
659 dib7000p_write_word(state, 772, 0x001f);
660 dib7000p_write_word(state, 1280, 0x001f - ((1 << 4) | (1 << 3)));
662 dib7000p_write_word(state, 770, 0);
663 dib7000p_write_word(state, 771, 0);
664 dib7000p_write_word(state, 772, 0);
665 dib7000p_write_word(state, 1280, 0);
667 if (state->version != SOC7090) {
668 dib7000p_write_word(state, 898, 0x0003);
669 dib7000p_write_word(state, 898, 0);
673 dib7000p_reset_pll(state);
675 if (dib7000p_reset_gpio(state) != 0)
676 dprintk("GPIO reset was not successful.\n");
678 if (state->version == SOC7090) {
679 dib7000p_write_word(state, 899, 0);
682 dib7000p_write_word(state, 42, (1<<5) | 3); /* P_iqc_thsat_ipc = 1 ; P_iqc_win2 = 3 */
683 dib7000p_write_word(state, 43, 0x2d4); /*-300 fag P_iqc_dect_min = -280 */
684 dib7000p_write_word(state, 44, 300); /* 300 fag P_iqc_dect_min = +280 */
685 dib7000p_write_word(state, 273, (0<<6) | 30);
687 if (dib7000p_set_output_mode(state, OUTMODE_HIGH_Z) != 0)
688 dprintk("OUTPUT_MODE could not be reset.\n");
690 dib7000p_set_adc_state(state, DIBX000_SLOW_ADC_ON);
691 dib7000p_sad_calib(state);
692 dib7000p_set_adc_state(state, DIBX000_SLOW_ADC_OFF);
694 /* unforce divstr regardless whether i2c enumeration was done or not */
695 dib7000p_write_word(state, 1285, dib7000p_read_word(state, 1285) & ~(1 << 1));
697 dib7000p_set_bandwidth(state, 8000);
699 if (state->version == SOC7090) {
700 dib7000p_write_word(state, 36, 0x0755);/* P_iqc_impnc_on =1 & P_iqc_corr_inh = 1 for impulsive noise */
702 if (state->cfg.tuner_is_baseband)
703 dib7000p_write_word(state, 36, 0x0755);
705 dib7000p_write_word(state, 36, 0x1f55);
708 dib7000p_write_tab(state, dib7000p_defaults);
709 if (state->version != SOC7090) {
710 dib7000p_write_word(state, 901, 0x0006);
711 dib7000p_write_word(state, 902, (3 << 10) | (1 << 6));
712 dib7000p_write_word(state, 905, 0x2c8e);
715 dib7000p_set_power_mode(state, DIB7000P_POWER_INTERFACE_ONLY);
720 static void dib7000p_pll_clk_cfg(struct dib7000p_state *state)
723 tmp = dib7000p_read_word(state, 903);
724 dib7000p_write_word(state, 903, (tmp | 0x1));
725 tmp = dib7000p_read_word(state, 900);
726 dib7000p_write_word(state, 900, (tmp & 0x7fff) | (1 << 6));
729 static void dib7000p_restart_agc(struct dib7000p_state *state)
731 // P_restart_iqc & P_restart_agc
732 dib7000p_write_word(state, 770, (1 << 11) | (1 << 9));
733 dib7000p_write_word(state, 770, 0x0000);
736 static int dib7000p_update_lna(struct dib7000p_state *state)
740 if (state->cfg.update_lna) {
741 dyn_gain = dib7000p_read_word(state, 394);
742 if (state->cfg.update_lna(&state->demod, dyn_gain)) {
743 dib7000p_restart_agc(state);
751 static int dib7000p_set_agc_config(struct dib7000p_state *state, u8 band)
753 struct dibx000_agc_config *agc = NULL;
755 if (state->current_band == band && state->current_agc != NULL)
757 state->current_band = band;
759 for (i = 0; i < state->cfg.agc_config_count; i++)
760 if (state->cfg.agc[i].band_caps & band) {
761 agc = &state->cfg.agc[i];
766 dprintk("no valid AGC configuration found for band 0x%02x\n", band);
770 state->current_agc = agc;
773 dib7000p_write_word(state, 75, agc->setup);
774 dib7000p_write_word(state, 76, agc->inv_gain);
775 dib7000p_write_word(state, 77, agc->time_stabiliz);
776 dib7000p_write_word(state, 100, (agc->alpha_level << 12) | agc->thlock);
778 // Demod AGC loop configuration
779 dib7000p_write_word(state, 101, (agc->alpha_mant << 5) | agc->alpha_exp);
780 dib7000p_write_word(state, 102, (agc->beta_mant << 6) | agc->beta_exp);
783 dprintk("WBD: ref: %d, sel: %d, active: %d, alpha: %d\n",
784 state->wbd_ref != 0 ? state->wbd_ref : agc->wbd_ref, agc->wbd_sel, !agc->perform_agc_softsplit, agc->wbd_sel);
786 if (state->wbd_ref != 0)
787 dib7000p_write_word(state, 105, (agc->wbd_inv << 12) | state->wbd_ref);
789 dib7000p_write_word(state, 105, (agc->wbd_inv << 12) | agc->wbd_ref);
791 dib7000p_write_word(state, 106, (agc->wbd_sel << 13) | (agc->wbd_alpha << 9) | (agc->perform_agc_softsplit << 8));
793 dib7000p_write_word(state, 107, agc->agc1_max);
794 dib7000p_write_word(state, 108, agc->agc1_min);
795 dib7000p_write_word(state, 109, agc->agc2_max);
796 dib7000p_write_word(state, 110, agc->agc2_min);
797 dib7000p_write_word(state, 111, (agc->agc1_pt1 << 8) | agc->agc1_pt2);
798 dib7000p_write_word(state, 112, agc->agc1_pt3);
799 dib7000p_write_word(state, 113, (agc->agc1_slope1 << 8) | agc->agc1_slope2);
800 dib7000p_write_word(state, 114, (agc->agc2_pt1 << 8) | agc->agc2_pt2);
801 dib7000p_write_word(state, 115, (agc->agc2_slope1 << 8) | agc->agc2_slope2);
805 static int dib7000p_set_dds(struct dib7000p_state *state, s32 offset_khz)
807 u32 internal = dib7000p_get_internal_freq(state);
808 s32 unit_khz_dds_val;
809 u32 abs_offset_khz = abs(offset_khz);
810 u32 dds = state->cfg.bw->ifreq & 0x1ffffff;
811 u8 invert = !!(state->cfg.bw->ifreq & (1 << 25));
813 pr_warn("DIB7000P: dib7000p_get_internal_freq returned 0\n");
816 /* 2**26 / Fsampling is the unit 1KHz offset */
817 unit_khz_dds_val = 67108864 / (internal);
819 dprintk("setting a frequency offset of %dkHz internal freq = %d invert = %d\n", offset_khz, internal, invert);
822 unit_khz_dds_val *= -1;
826 dds -= (abs_offset_khz * unit_khz_dds_val); /* /100 because of /100 on the unit_khz_dds_val line calc for better accuracy */
828 dds += (abs_offset_khz * unit_khz_dds_val);
830 if (abs_offset_khz <= (internal / 2)) { /* Max dds offset is the half of the demod freq */
831 dib7000p_write_word(state, 21, (u16) (((dds >> 16) & 0x1ff) | (0 << 10) | (invert << 9)));
832 dib7000p_write_word(state, 22, (u16) (dds & 0xffff));
837 static int dib7000p_agc_startup(struct dvb_frontend *demod)
839 struct dtv_frontend_properties *ch = &demod->dtv_property_cache;
840 struct dib7000p_state *state = demod->demodulator_priv;
842 u8 *agc_state = &state->agc_state;
845 u32 upd_demod_gain_period = 0x1000;
846 s32 frequency_offset = 0;
848 switch (state->agc_state) {
850 dib7000p_set_power_mode(state, DIB7000P_POWER_ALL);
851 if (state->version == SOC7090) {
852 reg = dib7000p_read_word(state, 0x79b) & 0xff00;
853 dib7000p_write_word(state, 0x79a, upd_demod_gain_period & 0xFFFF); /* lsb */
854 dib7000p_write_word(state, 0x79b, reg | (1 << 14) | ((upd_demod_gain_period >> 16) & 0xFF));
856 /* enable adc i & q */
857 reg = dib7000p_read_word(state, 0x780);
858 dib7000p_write_word(state, 0x780, (reg | (0x3)) & (~(1 << 7)));
860 dib7000p_set_adc_state(state, DIBX000_ADC_ON);
861 dib7000p_pll_clk_cfg(state);
864 if (dib7000p_set_agc_config(state, BAND_OF_FREQUENCY(ch->frequency / 1000)) != 0)
867 if (demod->ops.tuner_ops.get_frequency) {
870 demod->ops.tuner_ops.get_frequency(demod, &frequency_tuner);
871 frequency_offset = (s32)frequency_tuner / 1000 - ch->frequency / 1000;
874 if (dib7000p_set_dds(state, frequency_offset) < 0)
882 if (state->cfg.agc_control)
883 state->cfg.agc_control(&state->demod, 1);
885 dib7000p_write_word(state, 78, 32768);
886 if (!state->current_agc->perform_agc_softsplit) {
887 /* we are using the wbd - so slow AGC startup */
888 /* force 0 split on WBD and restart AGC */
889 dib7000p_write_word(state, 106, (state->current_agc->wbd_sel << 13) | (state->current_agc->wbd_alpha << 9) | (1 << 8));
893 /* default AGC startup */
895 /* wait AGC rough lock time */
899 dib7000p_restart_agc(state);
902 case 2: /* fast split search path after 5sec */
903 dib7000p_write_word(state, 75, state->current_agc->setup | (1 << 4)); /* freeze AGC loop */
904 dib7000p_write_word(state, 106, (state->current_agc->wbd_sel << 13) | (2 << 9) | (0 << 8)); /* fast split search 0.25kHz */
909 case 3: /* split search ended */
910 agc_split = (u8) dib7000p_read_word(state, 396); /* store the split value for the next time */
911 dib7000p_write_word(state, 78, dib7000p_read_word(state, 394)); /* set AGC gain start value */
913 dib7000p_write_word(state, 75, state->current_agc->setup); /* std AGC loop */
914 dib7000p_write_word(state, 106, (state->current_agc->wbd_sel << 13) | (state->current_agc->wbd_alpha << 9) | agc_split); /* standard split search */
916 dib7000p_restart_agc(state);
918 dprintk("SPLIT %p: %u\n", demod, agc_split);
924 case 4: /* LNA startup */
927 if (dib7000p_update_lna(state))
934 if (state->cfg.agc_control)
935 state->cfg.agc_control(&state->demod, 0);
944 static void dib7000p_update_timf(struct dib7000p_state *state)
946 u32 timf = (dib7000p_read_word(state, 427) << 16) | dib7000p_read_word(state, 428);
947 state->timf = timf * 160 / (state->current_bandwidth / 50);
948 dib7000p_write_word(state, 23, (u16) (timf >> 16));
949 dib7000p_write_word(state, 24, (u16) (timf & 0xffff));
950 dprintk("updated timf_frequency: %d (default: %d)\n", state->timf, state->cfg.bw->timf);
954 static u32 dib7000p_ctrl_timf(struct dvb_frontend *fe, u8 op, u32 timf)
956 struct dib7000p_state *state = fe->demodulator_priv;
961 case DEMOD_TIMF_UPDATE:
962 dib7000p_update_timf(state);
967 dib7000p_set_bandwidth(state, state->current_bandwidth);
971 static void dib7000p_set_channel(struct dib7000p_state *state,
972 struct dtv_frontend_properties *ch, u8 seq)
976 dib7000p_set_bandwidth(state, BANDWIDTH_TO_KHZ(ch->bandwidth_hz));
978 /* nfft, guard, qam, alpha */
980 switch (ch->transmission_mode) {
981 case TRANSMISSION_MODE_2K:
984 case TRANSMISSION_MODE_4K:
988 case TRANSMISSION_MODE_8K:
992 switch (ch->guard_interval) {
993 case GUARD_INTERVAL_1_32:
996 case GUARD_INTERVAL_1_16:
999 case GUARD_INTERVAL_1_4:
1003 case GUARD_INTERVAL_1_8:
1007 switch (ch->modulation) {
1019 switch (HIERARCHY_1) {
1031 dib7000p_write_word(state, 0, value);
1032 dib7000p_write_word(state, 5, (seq << 4) | 1); /* do not force tps, search list 0 */
1034 /* P_dintl_native, P_dintlv_inv, P_hrch, P_code_rate, P_select_hp */
1038 if (ch->hierarchy == 1)
1042 switch ((ch->hierarchy == 0 || 1 == 1) ? ch->code_rate_HP : ch->code_rate_LP) {
1060 dib7000p_write_word(state, 208, value);
1062 /* offset loop parameters */
1063 dib7000p_write_word(state, 26, 0x6680);
1064 dib7000p_write_word(state, 32, 0x0003);
1065 dib7000p_write_word(state, 29, 0x1273);
1066 dib7000p_write_word(state, 33, 0x0005);
1068 /* P_dvsy_sync_wait */
1069 switch (ch->transmission_mode) {
1070 case TRANSMISSION_MODE_8K:
1073 case TRANSMISSION_MODE_4K:
1076 case TRANSMISSION_MODE_2K:
1081 switch (ch->guard_interval) {
1082 case GUARD_INTERVAL_1_16:
1085 case GUARD_INTERVAL_1_8:
1088 case GUARD_INTERVAL_1_4:
1092 case GUARD_INTERVAL_1_32:
1096 if (state->cfg.diversity_delay == 0)
1097 state->div_sync_wait = (value * 3) / 2 + 48;
1099 state->div_sync_wait = (value * 3) / 2 + state->cfg.diversity_delay;
1101 /* deactivate the possibility of diversity reception if extended interleaver */
1102 state->div_force_off = !1 && ch->transmission_mode != TRANSMISSION_MODE_8K;
1103 dib7000p_set_diversity_in(&state->demod, state->div_state);
1105 /* channel estimation fine configuration */
1106 switch (ch->modulation) {
1108 est[0] = 0x0148; /* P_adp_regul_cnt 0.04 */
1109 est[1] = 0xfff0; /* P_adp_noise_cnt -0.002 */
1110 est[2] = 0x00a4; /* P_adp_regul_ext 0.02 */
1111 est[3] = 0xfff8; /* P_adp_noise_ext -0.001 */
1114 est[0] = 0x023d; /* P_adp_regul_cnt 0.07 */
1115 est[1] = 0xffdf; /* P_adp_noise_cnt -0.004 */
1116 est[2] = 0x00a4; /* P_adp_regul_ext 0.02 */
1117 est[3] = 0xfff0; /* P_adp_noise_ext -0.002 */
1120 est[0] = 0x099a; /* P_adp_regul_cnt 0.3 */
1121 est[1] = 0xffae; /* P_adp_noise_cnt -0.01 */
1122 est[2] = 0x0333; /* P_adp_regul_ext 0.1 */
1123 est[3] = 0xfff8; /* P_adp_noise_ext -0.002 */
1126 for (value = 0; value < 4; value++)
1127 dib7000p_write_word(state, 187 + value, est[value]);
1130 static int dib7000p_autosearch_start(struct dvb_frontend *demod)
1132 struct dtv_frontend_properties *ch = &demod->dtv_property_cache;
1133 struct dib7000p_state *state = demod->demodulator_priv;
1134 struct dtv_frontend_properties schan;
1136 u32 internal = dib7000p_get_internal_freq(state);
1139 schan.modulation = QAM_64;
1140 schan.guard_interval = GUARD_INTERVAL_1_32;
1141 schan.transmission_mode = TRANSMISSION_MODE_8K;
1142 schan.code_rate_HP = FEC_2_3;
1143 schan.code_rate_LP = FEC_3_4;
1144 schan.hierarchy = 0;
1146 dib7000p_set_channel(state, &schan, 7);
1148 factor = BANDWIDTH_TO_KHZ(ch->bandwidth_hz);
1149 if (factor >= 5000) {
1150 if (state->version == SOC7090)
1157 value = 30 * internal * factor;
1158 dib7000p_write_word(state, 6, (u16) ((value >> 16) & 0xffff));
1159 dib7000p_write_word(state, 7, (u16) (value & 0xffff));
1160 value = 100 * internal * factor;
1161 dib7000p_write_word(state, 8, (u16) ((value >> 16) & 0xffff));
1162 dib7000p_write_word(state, 9, (u16) (value & 0xffff));
1163 value = 500 * internal * factor;
1164 dib7000p_write_word(state, 10, (u16) ((value >> 16) & 0xffff));
1165 dib7000p_write_word(state, 11, (u16) (value & 0xffff));
1167 value = dib7000p_read_word(state, 0);
1168 dib7000p_write_word(state, 0, (u16) ((1 << 9) | value));
1169 dib7000p_read_word(state, 1284);
1170 dib7000p_write_word(state, 0, (u16) value);
1175 static int dib7000p_autosearch_is_irq(struct dvb_frontend *demod)
1177 struct dib7000p_state *state = demod->demodulator_priv;
1178 u16 irq_pending = dib7000p_read_word(state, 1284);
1180 if (irq_pending & 0x1)
1183 if (irq_pending & 0x2)
1189 static void dib7000p_spur_protect(struct dib7000p_state *state, u32 rf_khz, u32 bw)
1191 static s16 notch[] = { 16143, 14402, 12238, 9713, 6902, 3888, 759, -2392 };
1192 static u8 sine[] = { 0, 2, 3, 5, 6, 8, 9, 11, 13, 14, 16, 17, 19, 20, 22,
1193 24, 25, 27, 28, 30, 31, 33, 34, 36, 38, 39, 41, 42, 44, 45, 47, 48, 50, 51,
1194 53, 55, 56, 58, 59, 61, 62, 64, 65, 67, 68, 70, 71, 73, 74, 76, 77, 79, 80,
1195 82, 83, 85, 86, 88, 89, 91, 92, 94, 95, 97, 98, 99, 101, 102, 104, 105,
1196 107, 108, 109, 111, 112, 114, 115, 117, 118, 119, 121, 122, 123, 125, 126,
1197 128, 129, 130, 132, 133, 134, 136, 137, 138, 140, 141, 142, 144, 145, 146,
1198 147, 149, 150, 151, 152, 154, 155, 156, 157, 159, 160, 161, 162, 164, 165,
1199 166, 167, 168, 170, 171, 172, 173, 174, 175, 177, 178, 179, 180, 181, 182,
1200 183, 184, 185, 186, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198,
1201 199, 200, 201, 202, 203, 204, 205, 206, 207, 207, 208, 209, 210, 211, 212,
1202 213, 214, 215, 215, 216, 217, 218, 219, 220, 220, 221, 222, 223, 224, 224,
1203 225, 226, 227, 227, 228, 229, 229, 230, 231, 231, 232, 233, 233, 234, 235,
1204 235, 236, 237, 237, 238, 238, 239, 239, 240, 241, 241, 242, 242, 243, 243,
1205 244, 244, 245, 245, 245, 246, 246, 247, 247, 248, 248, 248, 249, 249, 249,
1206 250, 250, 250, 251, 251, 251, 252, 252, 252, 252, 253, 253, 253, 253, 254,
1207 254, 254, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
1208 255, 255, 255, 255, 255, 255
1211 u32 xtal = state->cfg.bw->xtal_hz / 1000;
1212 int f_rel = DIV_ROUND_CLOSEST(rf_khz, xtal) * xtal - rf_khz;
1214 int coef_re[8], coef_im[8];
1218 dprintk("relative position of the Spur: %dk (RF: %dk, XTAL: %dk)\n", f_rel, rf_khz, xtal);
1220 if (f_rel < -bw_khz / 2 || f_rel > bw_khz / 2)
1225 dib7000p_write_word(state, 142, 0x0610);
1227 for (k = 0; k < 8; k++) {
1228 pha = ((f_rel * (k + 1) * 112 * 80 / bw_khz) / 1000) & 0x3ff;
1233 } else if (pha < 256) {
1234 coef_re[k] = sine[256 - (pha & 0xff)];
1235 coef_im[k] = sine[pha & 0xff];
1236 } else if (pha == 256) {
1239 } else if (pha < 512) {
1240 coef_re[k] = -sine[pha & 0xff];
1241 coef_im[k] = sine[256 - (pha & 0xff)];
1242 } else if (pha == 512) {
1245 } else if (pha < 768) {
1246 coef_re[k] = -sine[256 - (pha & 0xff)];
1247 coef_im[k] = -sine[pha & 0xff];
1248 } else if (pha == 768) {
1252 coef_re[k] = sine[pha & 0xff];
1253 coef_im[k] = -sine[256 - (pha & 0xff)];
1256 coef_re[k] *= notch[k];
1257 coef_re[k] += (1 << 14);
1258 if (coef_re[k] >= (1 << 24))
1259 coef_re[k] = (1 << 24) - 1;
1260 coef_re[k] /= (1 << 15);
1262 coef_im[k] *= notch[k];
1263 coef_im[k] += (1 << 14);
1264 if (coef_im[k] >= (1 << 24))
1265 coef_im[k] = (1 << 24) - 1;
1266 coef_im[k] /= (1 << 15);
1268 dprintk("PALF COEF: %d re: %d im: %d\n", k, coef_re[k], coef_im[k]);
1270 dib7000p_write_word(state, 143, (0 << 14) | (k << 10) | (coef_re[k] & 0x3ff));
1271 dib7000p_write_word(state, 144, coef_im[k] & 0x3ff);
1272 dib7000p_write_word(state, 143, (1 << 14) | (k << 10) | (coef_re[k] & 0x3ff));
1274 dib7000p_write_word(state, 143, 0);
1277 static int dib7000p_tune(struct dvb_frontend *demod)
1279 struct dtv_frontend_properties *ch = &demod->dtv_property_cache;
1280 struct dib7000p_state *state = demod->demodulator_priv;
1284 dib7000p_set_channel(state, ch, 0);
1289 dib7000p_write_word(state, 770, 0x4000);
1290 dib7000p_write_word(state, 770, 0x0000);
1293 /* P_ctrl_inh_cor=0, P_ctrl_alpha_cor=4, P_ctrl_inh_isi=0, P_ctrl_alpha_isi=3, P_ctrl_inh_cor4=1, P_ctrl_alpha_cor4=3 */
1294 tmp = (0 << 14) | (4 << 10) | (0 << 9) | (3 << 5) | (1 << 4) | (0x3);
1295 if (state->sfn_workaround_active) {
1296 dprintk("SFN workaround is active\n");
1298 dib7000p_write_word(state, 166, 0x4000);
1300 dib7000p_write_word(state, 166, 0x0000);
1302 dib7000p_write_word(state, 29, tmp);
1304 // never achieved a lock with that bandwidth so far - wait for osc-freq to update
1305 if (state->timf == 0)
1308 /* offset loop parameters */
1310 /* P_timf_alpha, P_corm_alpha=6, P_corm_thres=0x80 */
1311 tmp = (6 << 8) | 0x80;
1312 switch (ch->transmission_mode) {
1313 case TRANSMISSION_MODE_2K:
1316 case TRANSMISSION_MODE_4K:
1320 case TRANSMISSION_MODE_8K:
1324 dib7000p_write_word(state, 26, tmp); /* timf_a(6xxx) */
1326 /* P_ctrl_freeze_pha_shift=0, P_ctrl_pha_off_max */
1328 switch (ch->transmission_mode) {
1329 case TRANSMISSION_MODE_2K:
1332 case TRANSMISSION_MODE_4K:
1336 case TRANSMISSION_MODE_8K:
1340 dib7000p_write_word(state, 32, tmp);
1342 /* P_ctrl_sfreq_inh=0, P_ctrl_sfreq_step */
1344 switch (ch->transmission_mode) {
1345 case TRANSMISSION_MODE_2K:
1348 case TRANSMISSION_MODE_4K:
1352 case TRANSMISSION_MODE_8K:
1356 dib7000p_write_word(state, 33, tmp);
1358 tmp = dib7000p_read_word(state, 509);
1359 if (!((tmp >> 6) & 0x1)) {
1360 /* restart the fec */
1361 tmp = dib7000p_read_word(state, 771);
1362 dib7000p_write_word(state, 771, tmp | (1 << 1));
1363 dib7000p_write_word(state, 771, tmp);
1365 tmp = dib7000p_read_word(state, 509);
1367 // we achieved a lock - it's time to update the osc freq
1368 if ((tmp >> 6) & 0x1) {
1369 dib7000p_update_timf(state);
1370 /* P_timf_alpha += 2 */
1371 tmp = dib7000p_read_word(state, 26);
1372 dib7000p_write_word(state, 26, (tmp & ~(0xf << 12)) | ((((tmp >> 12) & 0xf) + 5) << 12));
1375 if (state->cfg.spur_protect)
1376 dib7000p_spur_protect(state, ch->frequency / 1000, BANDWIDTH_TO_KHZ(ch->bandwidth_hz));
1378 dib7000p_set_bandwidth(state, BANDWIDTH_TO_KHZ(ch->bandwidth_hz));
1380 dib7000p_reset_stats(demod);
1385 static int dib7000p_wakeup(struct dvb_frontend *demod)
1387 struct dib7000p_state *state = demod->demodulator_priv;
1388 dib7000p_set_power_mode(state, DIB7000P_POWER_ALL);
1389 dib7000p_set_adc_state(state, DIBX000_SLOW_ADC_ON);
1390 if (state->version == SOC7090)
1391 dib7000p_sad_calib(state);
1395 static int dib7000p_sleep(struct dvb_frontend *demod)
1397 struct dib7000p_state *state = demod->demodulator_priv;
1398 if (state->version == SOC7090)
1399 return dib7000p_set_power_mode(state, DIB7000P_POWER_INTERFACE_ONLY);
1400 return dib7000p_set_output_mode(state, OUTMODE_HIGH_Z) | dib7000p_set_power_mode(state, DIB7000P_POWER_INTERFACE_ONLY);
1403 static int dib7000p_identify(struct dib7000p_state *st)
1406 dprintk("checking demod on I2C address: %d (%x)\n", st->i2c_addr, st->i2c_addr);
1408 if ((value = dib7000p_read_word(st, 768)) != 0x01b3) {
1409 dprintk("wrong Vendor ID (read=0x%x)\n", value);
1413 if ((value = dib7000p_read_word(st, 769)) != 0x4000) {
1414 dprintk("wrong Device ID (%x)\n", value);
1421 static int dib7000p_get_frontend(struct dvb_frontend *fe,
1422 struct dtv_frontend_properties *fep)
1424 struct dib7000p_state *state = fe->demodulator_priv;
1425 u16 tps = dib7000p_read_word(state, 463);
1427 fep->inversion = INVERSION_AUTO;
1429 fep->bandwidth_hz = BANDWIDTH_TO_HZ(state->current_bandwidth);
1431 switch ((tps >> 8) & 0x3) {
1433 fep->transmission_mode = TRANSMISSION_MODE_2K;
1436 fep->transmission_mode = TRANSMISSION_MODE_8K;
1438 /* case 2: fep->transmission_mode = TRANSMISSION_MODE_4K; break; */
1441 switch (tps & 0x3) {
1443 fep->guard_interval = GUARD_INTERVAL_1_32;
1446 fep->guard_interval = GUARD_INTERVAL_1_16;
1449 fep->guard_interval = GUARD_INTERVAL_1_8;
1452 fep->guard_interval = GUARD_INTERVAL_1_4;
1456 switch ((tps >> 14) & 0x3) {
1458 fep->modulation = QPSK;
1461 fep->modulation = QAM_16;
1465 fep->modulation = QAM_64;
1469 /* as long as the frontend_param structure is fixed for hierarchical transmission I refuse to use it */
1470 /* (tps >> 13) & 0x1 == hrch is used, (tps >> 10) & 0x7 == alpha */
1472 fep->hierarchy = HIERARCHY_NONE;
1473 switch ((tps >> 5) & 0x7) {
1475 fep->code_rate_HP = FEC_1_2;
1478 fep->code_rate_HP = FEC_2_3;
1481 fep->code_rate_HP = FEC_3_4;
1484 fep->code_rate_HP = FEC_5_6;
1488 fep->code_rate_HP = FEC_7_8;
1493 switch ((tps >> 2) & 0x7) {
1495 fep->code_rate_LP = FEC_1_2;
1498 fep->code_rate_LP = FEC_2_3;
1501 fep->code_rate_LP = FEC_3_4;
1504 fep->code_rate_LP = FEC_5_6;
1508 fep->code_rate_LP = FEC_7_8;
1512 /* native interleaver: (dib7000p_read_word(state, 464) >> 5) & 0x1 */
1517 static int dib7000p_set_frontend(struct dvb_frontend *fe)
1519 struct dtv_frontend_properties *fep = &fe->dtv_property_cache;
1520 struct dib7000p_state *state = fe->demodulator_priv;
1523 if (state->version == SOC7090)
1524 dib7090_set_diversity_in(fe, 0);
1526 dib7000p_set_output_mode(state, OUTMODE_HIGH_Z);
1528 /* maybe the parameter has been changed */
1529 state->sfn_workaround_active = buggy_sfn_workaround;
1531 if (fe->ops.tuner_ops.set_params)
1532 fe->ops.tuner_ops.set_params(fe);
1534 /* start up the AGC */
1535 state->agc_state = 0;
1537 time = dib7000p_agc_startup(fe);
1540 } while (time != -1);
1542 if (fep->transmission_mode == TRANSMISSION_MODE_AUTO ||
1543 fep->guard_interval == GUARD_INTERVAL_AUTO || fep->modulation == QAM_AUTO || fep->code_rate_HP == FEC_AUTO) {
1546 dib7000p_autosearch_start(fe);
1549 found = dib7000p_autosearch_is_irq(fe);
1550 } while (found == 0 && i--);
1552 dprintk("autosearch returns: %d\n", found);
1553 if (found == 0 || found == 1)
1556 dib7000p_get_frontend(fe, fep);
1559 ret = dib7000p_tune(fe);
1561 /* make this a config parameter */
1562 if (state->version == SOC7090) {
1563 dib7090_set_output_mode(fe, state->cfg.output_mode);
1564 if (state->cfg.enMpegOutput == 0) {
1565 dib7090_setDibTxMux(state, MPEG_ON_DIBTX);
1566 dib7090_setHostBusMux(state, DIBTX_ON_HOSTBUS);
1569 dib7000p_set_output_mode(state, state->cfg.output_mode);
1574 static int dib7000p_get_stats(struct dvb_frontend *fe, enum fe_status stat);
1576 static int dib7000p_read_status(struct dvb_frontend *fe, enum fe_status *stat)
1578 struct dib7000p_state *state = fe->demodulator_priv;
1579 u16 lock = dib7000p_read_word(state, 509);
1584 *stat |= FE_HAS_SIGNAL;
1586 *stat |= FE_HAS_CARRIER;
1588 *stat |= FE_HAS_VITERBI;
1590 *stat |= FE_HAS_SYNC;
1591 if ((lock & 0x0038) == 0x38)
1592 *stat |= FE_HAS_LOCK;
1594 dib7000p_get_stats(fe, *stat);
1599 static int dib7000p_read_ber(struct dvb_frontend *fe, u32 * ber)
1601 struct dib7000p_state *state = fe->demodulator_priv;
1602 *ber = (dib7000p_read_word(state, 500) << 16) | dib7000p_read_word(state, 501);
1606 static int dib7000p_read_unc_blocks(struct dvb_frontend *fe, u32 * unc)
1608 struct dib7000p_state *state = fe->demodulator_priv;
1609 *unc = dib7000p_read_word(state, 506);
1613 static int dib7000p_read_signal_strength(struct dvb_frontend *fe, u16 * strength)
1615 struct dib7000p_state *state = fe->demodulator_priv;
1616 u16 val = dib7000p_read_word(state, 394);
1617 *strength = 65535 - val;
1621 static u32 dib7000p_get_snr(struct dvb_frontend *fe)
1623 struct dib7000p_state *state = fe->demodulator_priv;
1625 s32 signal_mant, signal_exp, noise_mant, noise_exp;
1628 val = dib7000p_read_word(state, 479);
1629 noise_mant = (val >> 4) & 0xff;
1630 noise_exp = ((val & 0xf) << 2);
1631 val = dib7000p_read_word(state, 480);
1632 noise_exp += ((val >> 14) & 0x3);
1633 if ((noise_exp & 0x20) != 0)
1636 signal_mant = (val >> 6) & 0xFF;
1637 signal_exp = (val & 0x3F);
1638 if ((signal_exp & 0x20) != 0)
1641 if (signal_mant != 0)
1642 result = intlog10(2) * 10 * signal_exp + 10 * intlog10(signal_mant);
1644 result = intlog10(2) * 10 * signal_exp - 100;
1646 if (noise_mant != 0)
1647 result -= intlog10(2) * 10 * noise_exp + 10 * intlog10(noise_mant);
1649 result -= intlog10(2) * 10 * noise_exp - 100;
1654 static int dib7000p_read_snr(struct dvb_frontend *fe, u16 *snr)
1658 result = dib7000p_get_snr(fe);
1660 *snr = result / ((1 << 24) / 10);
1664 static void dib7000p_reset_stats(struct dvb_frontend *demod)
1666 struct dib7000p_state *state = demod->demodulator_priv;
1667 struct dtv_frontend_properties *c = &demod->dtv_property_cache;
1670 memset(&c->strength, 0, sizeof(c->strength));
1671 memset(&c->cnr, 0, sizeof(c->cnr));
1672 memset(&c->post_bit_error, 0, sizeof(c->post_bit_error));
1673 memset(&c->post_bit_count, 0, sizeof(c->post_bit_count));
1674 memset(&c->block_error, 0, sizeof(c->block_error));
1676 c->strength.len = 1;
1678 c->block_error.len = 1;
1679 c->block_count.len = 1;
1680 c->post_bit_error.len = 1;
1681 c->post_bit_count.len = 1;
1683 c->strength.stat[0].scale = FE_SCALE_DECIBEL;
1684 c->strength.stat[0].uvalue = 0;
1686 c->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
1687 c->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
1688 c->block_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
1689 c->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
1690 c->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
1692 dib7000p_read_unc_blocks(demod, &ucb);
1694 state->old_ucb = ucb;
1695 state->ber_jiffies_stats = 0;
1696 state->per_jiffies_stats = 0;
1699 struct linear_segments {
1705 * Table to estimate signal strength in dBm.
1706 * This table should be empirically determinated by measuring the signal
1707 * strength generated by a RF generator directly connected into
1709 * This table was determinated by measuring the signal strength generated
1710 * by a DTA-2111 RF generator directly connected into a dib7000p device
1711 * (a Hauppauge Nova-TD stick), using a good quality 3 meters length
1712 * RC6 cable and good RC6 connectors, connected directly to antenna 1.
1713 * As the minimum output power of DTA-2111 is -31dBm, a 16 dBm attenuator
1714 * were used, for the lower power values.
1715 * The real value can actually be on other devices, or even at the
1716 * second antena input, depending on several factors, like if LNA
1717 * is enabled or not, if diversity is enabled, type of connectors, etc.
1718 * Yet, it is better to use this measure in dB than a random non-linear
1719 * percentage value, especially for antenna adjustments.
1720 * On my tests, the precision of the measure using this table is about
1721 * 0.5 dB, with sounds reasonable enough to adjust antennas.
1723 #define DB_OFFSET 131000
1725 static struct linear_segments strength_to_db_table[] = {
1726 { 63630, DB_OFFSET - 20500},
1727 { 62273, DB_OFFSET - 21000},
1728 { 60162, DB_OFFSET - 22000},
1729 { 58730, DB_OFFSET - 23000},
1730 { 58294, DB_OFFSET - 24000},
1731 { 57778, DB_OFFSET - 25000},
1732 { 57320, DB_OFFSET - 26000},
1733 { 56779, DB_OFFSET - 27000},
1734 { 56293, DB_OFFSET - 28000},
1735 { 55724, DB_OFFSET - 29000},
1736 { 55145, DB_OFFSET - 30000},
1737 { 54680, DB_OFFSET - 31000},
1738 { 54293, DB_OFFSET - 32000},
1739 { 53813, DB_OFFSET - 33000},
1740 { 53427, DB_OFFSET - 34000},
1741 { 52981, DB_OFFSET - 35000},
1743 { 52636, DB_OFFSET - 36000},
1744 { 52014, DB_OFFSET - 37000},
1745 { 51674, DB_OFFSET - 38000},
1746 { 50692, DB_OFFSET - 39000},
1747 { 49824, DB_OFFSET - 40000},
1748 { 49052, DB_OFFSET - 41000},
1749 { 48436, DB_OFFSET - 42000},
1750 { 47836, DB_OFFSET - 43000},
1751 { 47368, DB_OFFSET - 44000},
1752 { 46468, DB_OFFSET - 45000},
1753 { 45597, DB_OFFSET - 46000},
1754 { 44586, DB_OFFSET - 47000},
1755 { 43667, DB_OFFSET - 48000},
1756 { 42673, DB_OFFSET - 49000},
1757 { 41816, DB_OFFSET - 50000},
1758 { 40876, DB_OFFSET - 51000},
1762 static u32 interpolate_value(u32 value, struct linear_segments *segments,
1770 if (value >= segments[0].x)
1771 return segments[0].y;
1772 if (value < segments[len-1].x)
1773 return segments[len-1].y;
1775 for (i = 1; i < len - 1; i++) {
1776 /* If value is identical, no need to interpolate */
1777 if (value == segments[i].x)
1778 return segments[i].y;
1779 if (value > segments[i].x)
1783 /* Linear interpolation between the two (x,y) points */
1784 dy = segments[i - 1].y - segments[i].y;
1785 dx = segments[i - 1].x - segments[i].x;
1787 tmp64 = value - segments[i].x;
1790 ret = segments[i].y + tmp64;
1795 /* FIXME: may require changes - this one was borrowed from dib8000 */
1796 static u32 dib7000p_get_time_us(struct dvb_frontend *demod)
1798 struct dtv_frontend_properties *c = &demod->dtv_property_cache;
1801 int guard, rate_num, rate_denum = 1, bits_per_symbol;
1802 int interleaving = 0, fft_div;
1804 switch (c->guard_interval) {
1805 case GUARD_INTERVAL_1_4:
1808 case GUARD_INTERVAL_1_8:
1811 case GUARD_INTERVAL_1_16:
1815 case GUARD_INTERVAL_1_32:
1820 switch (c->transmission_mode) {
1821 case TRANSMISSION_MODE_2K:
1824 case TRANSMISSION_MODE_4K:
1828 case TRANSMISSION_MODE_8K:
1833 switch (c->modulation) {
1836 bits_per_symbol = 2;
1839 bits_per_symbol = 4;
1843 bits_per_symbol = 6;
1847 switch ((c->hierarchy == 0 || 1 == 1) ? c->code_rate_HP : c->code_rate_LP) {
1871 denom = bits_per_symbol * rate_num * fft_div * 384;
1874 * FIXME: check if the math makes sense. If so, fill the
1878 /* If calculus gets wrong, wait for 1s for the next stats */
1882 /* Estimate the period for the total bit rate */
1883 time_us = rate_denum * (1008 * 1562500L);
1885 do_div(tmp64, guard);
1886 time_us = time_us + tmp64;
1887 time_us += denom / 2;
1888 do_div(time_us, denom);
1890 tmp = 1008 * 96 * interleaving;
1891 time_us += tmp + tmp / guard;
1896 static int dib7000p_get_stats(struct dvb_frontend *demod, enum fe_status stat)
1898 struct dib7000p_state *state = demod->demodulator_priv;
1899 struct dtv_frontend_properties *c = &demod->dtv_property_cache;
1900 int show_per_stats = 0;
1901 u32 time_us = 0, val, snr;
1906 /* Get Signal strength */
1907 dib7000p_read_signal_strength(demod, &strength);
1909 db = interpolate_value(val,
1910 strength_to_db_table,
1911 ARRAY_SIZE(strength_to_db_table)) - DB_OFFSET;
1912 c->strength.stat[0].svalue = db;
1914 /* UCB/BER/CNR measures require lock */
1915 if (!(stat & FE_HAS_LOCK)) {
1917 c->block_count.len = 1;
1918 c->block_error.len = 1;
1919 c->post_bit_error.len = 1;
1920 c->post_bit_count.len = 1;
1921 c->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
1922 c->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
1923 c->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
1924 c->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
1925 c->block_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
1929 /* Check if time for stats was elapsed */
1930 if (time_after(jiffies, state->per_jiffies_stats)) {
1931 state->per_jiffies_stats = jiffies + msecs_to_jiffies(1000);
1934 snr = dib7000p_get_snr(demod);
1936 snr = (1000L * snr) >> 24;
1939 c->cnr.stat[0].svalue = snr;
1940 c->cnr.stat[0].scale = FE_SCALE_DECIBEL;
1942 /* Get UCB measures */
1943 dib7000p_read_unc_blocks(demod, &val);
1944 ucb = val - state->old_ucb;
1945 if (val < state->old_ucb)
1946 ucb += 0x100000000LL;
1948 c->block_error.stat[0].scale = FE_SCALE_COUNTER;
1949 c->block_error.stat[0].uvalue = ucb;
1951 /* Estimate the number of packets based on bitrate */
1953 time_us = dib7000p_get_time_us(demod);
1956 blocks = 1250000ULL * 1000000ULL;
1957 do_div(blocks, time_us * 8 * 204);
1958 c->block_count.stat[0].scale = FE_SCALE_COUNTER;
1959 c->block_count.stat[0].uvalue += blocks;
1965 /* Get post-BER measures */
1966 if (time_after(jiffies, state->ber_jiffies_stats)) {
1967 time_us = dib7000p_get_time_us(demod);
1968 state->ber_jiffies_stats = jiffies + msecs_to_jiffies((time_us + 500) / 1000);
1970 dprintk("Next all layers stats available in %u us.\n", time_us);
1972 dib7000p_read_ber(demod, &val);
1973 c->post_bit_error.stat[0].scale = FE_SCALE_COUNTER;
1974 c->post_bit_error.stat[0].uvalue += val;
1976 c->post_bit_count.stat[0].scale = FE_SCALE_COUNTER;
1977 c->post_bit_count.stat[0].uvalue += 100000000;
1980 /* Get PER measures */
1981 if (show_per_stats) {
1982 dib7000p_read_unc_blocks(demod, &val);
1984 c->block_error.stat[0].scale = FE_SCALE_COUNTER;
1985 c->block_error.stat[0].uvalue += val;
1987 time_us = dib7000p_get_time_us(demod);
1989 blocks = 1250000ULL * 1000000ULL;
1990 do_div(blocks, time_us * 8 * 204);
1991 c->block_count.stat[0].scale = FE_SCALE_COUNTER;
1992 c->block_count.stat[0].uvalue += blocks;
1998 static int dib7000p_fe_get_tune_settings(struct dvb_frontend *fe, struct dvb_frontend_tune_settings *tune)
2000 tune->min_delay_ms = 1000;
2004 static void dib7000p_release(struct dvb_frontend *demod)
2006 struct dib7000p_state *st = demod->demodulator_priv;
2007 dibx000_exit_i2c_master(&st->i2c_master);
2008 i2c_del_adapter(&st->dib7090_tuner_adap);
2012 static int dib7000pc_detection(struct i2c_adapter *i2c_adap)
2015 struct i2c_msg msg[2] = {
2016 {.addr = 18 >> 1, .flags = 0, .len = 2},
2017 {.addr = 18 >> 1, .flags = I2C_M_RD, .len = 2},
2021 tx = kzalloc(2, GFP_KERNEL);
2024 rx = kzalloc(2, GFP_KERNEL);
2027 goto rx_memory_error;
2036 if (i2c_transfer(i2c_adap, msg, 2) == 2)
2037 if (rx[0] == 0x01 && rx[1] == 0xb3) {
2038 dprintk("-D- DiB7000PC detected\n");
2043 msg[0].addr = msg[1].addr = 0x40;
2045 if (i2c_transfer(i2c_adap, msg, 2) == 2)
2046 if (rx[0] == 0x01 && rx[1] == 0xb3) {
2047 dprintk("-D- DiB7000PC detected\n");
2052 dprintk("-D- DiB7000PC not detected\n");
2061 static struct i2c_adapter *dib7000p_get_i2c_master(struct dvb_frontend *demod, enum dibx000_i2c_interface intf, int gating)
2063 struct dib7000p_state *st = demod->demodulator_priv;
2064 return dibx000_get_i2c_adapter(&st->i2c_master, intf, gating);
2067 static int dib7000p_pid_filter_ctrl(struct dvb_frontend *fe, u8 onoff)
2069 struct dib7000p_state *state = fe->demodulator_priv;
2070 u16 val = dib7000p_read_word(state, 235) & 0xffef;
2071 val |= (onoff & 0x1) << 4;
2072 dprintk("PID filter enabled %d\n", onoff);
2073 return dib7000p_write_word(state, 235, val);
2076 static int dib7000p_pid_filter(struct dvb_frontend *fe, u8 id, u16 pid, u8 onoff)
2078 struct dib7000p_state *state = fe->demodulator_priv;
2079 dprintk("PID filter: index %x, PID %d, OnOff %d\n", id, pid, onoff);
2080 return dib7000p_write_word(state, 241 + id, onoff ? (1 << 13) | pid : 0);
2083 static int dib7000p_i2c_enumeration(struct i2c_adapter *i2c, int no_of_demods, u8 default_addr, struct dib7000p_config cfg[])
2085 struct dib7000p_state *dpst;
2089 dpst = kzalloc(sizeof(struct dib7000p_state), GFP_KERNEL);
2093 dpst->i2c_adap = i2c;
2094 mutex_init(&dpst->i2c_buffer_lock);
2096 for (k = no_of_demods - 1; k >= 0; k--) {
2099 /* designated i2c address */
2100 if (cfg[k].default_i2c_addr != 0)
2101 new_addr = cfg[k].default_i2c_addr + (k << 1);
2103 new_addr = (0x40 + k) << 1;
2104 dpst->i2c_addr = new_addr;
2105 dib7000p_write_word(dpst, 1287, 0x0003); /* sram lead in, rdy */
2106 if (dib7000p_identify(dpst) != 0) {
2107 dpst->i2c_addr = default_addr;
2108 dib7000p_write_word(dpst, 1287, 0x0003); /* sram lead in, rdy */
2109 if (dib7000p_identify(dpst) != 0) {
2110 dprintk("DiB7000P #%d: not identified\n", k);
2116 /* start diversity to pull_down div_str - just for i2c-enumeration */
2117 dib7000p_set_output_mode(dpst, OUTMODE_DIVERSITY);
2119 /* set new i2c address and force divstart */
2120 dib7000p_write_word(dpst, 1285, (new_addr << 2) | 0x2);
2122 dprintk("IC %d initialized (to i2c_address 0x%x)\n", k, new_addr);
2125 for (k = 0; k < no_of_demods; k++) {
2127 if (cfg[k].default_i2c_addr != 0)
2128 dpst->i2c_addr = (cfg[k].default_i2c_addr + k) << 1;
2130 dpst->i2c_addr = (0x40 + k) << 1;
2133 dib7000p_write_word(dpst, 1285, dpst->i2c_addr << 2);
2135 /* deactivate div - it was just for i2c-enumeration */
2136 dib7000p_set_output_mode(dpst, OUTMODE_HIGH_Z);
2143 static const s32 lut_1000ln_mant[] = {
2144 6908, 6956, 7003, 7047, 7090, 7131, 7170, 7208, 7244, 7279, 7313, 7346, 7377, 7408, 7438, 7467, 7495, 7523, 7549, 7575, 7600
2147 static s32 dib7000p_get_adc_power(struct dvb_frontend *fe)
2149 struct dib7000p_state *state = fe->demodulator_priv;
2150 u32 tmp_val = 0, exp = 0, mant = 0;
2155 buf[0] = dib7000p_read_word(state, 0x184);
2156 buf[1] = dib7000p_read_word(state, 0x185);
2157 pow_i = (buf[0] << 16) | buf[1];
2158 dprintk("raw pow_i = %d\n", pow_i);
2161 while (tmp_val >>= 1)
2164 mant = (pow_i * 1000 / (1 << exp));
2165 dprintk(" mant = %d exp = %d\n", mant / 1000, exp);
2167 ix = (u8) ((mant - 1000) / 100); /* index of the LUT */
2168 dprintk(" ix = %d\n", ix);
2170 pow_i = (lut_1000ln_mant[ix] + 693 * (exp - 20) - 6908);
2171 pow_i = (pow_i << 8) / 1000;
2172 dprintk(" pow_i = %d\n", pow_i);
2177 static int map_addr_to_serpar_number(struct i2c_msg *msg)
2179 if ((msg->buf[0] <= 15))
2181 else if (msg->buf[0] == 17)
2183 else if (msg->buf[0] == 16)
2185 else if (msg->buf[0] == 19)
2187 else if (msg->buf[0] >= 21 && msg->buf[0] <= 25)
2189 else if (msg->buf[0] == 28)
2196 static int w7090p_tuner_write_serpar(struct i2c_adapter *i2c_adap, struct i2c_msg msg[], int num)
2198 struct dib7000p_state *state = i2c_get_adapdata(i2c_adap);
2201 u16 serpar_num = msg[0].buf[0];
2203 while (n_overflow == 1 && i) {
2204 n_overflow = (dib7000p_read_word(state, 1984) >> 1) & 0x1;
2207 dprintk("Tuner ITF: write busy (overflow)\n");
2209 dib7000p_write_word(state, 1985, (1 << 6) | (serpar_num & 0x3f));
2210 dib7000p_write_word(state, 1986, (msg[0].buf[1] << 8) | msg[0].buf[2]);
2215 static int w7090p_tuner_read_serpar(struct i2c_adapter *i2c_adap, struct i2c_msg msg[], int num)
2217 struct dib7000p_state *state = i2c_get_adapdata(i2c_adap);
2218 u8 n_overflow = 1, n_empty = 1;
2220 u16 serpar_num = msg[0].buf[0];
2223 while (n_overflow == 1 && i) {
2224 n_overflow = (dib7000p_read_word(state, 1984) >> 1) & 0x1;
2227 dprintk("TunerITF: read busy (overflow)\n");
2229 dib7000p_write_word(state, 1985, (0 << 6) | (serpar_num & 0x3f));
2232 while (n_empty == 1 && i) {
2233 n_empty = dib7000p_read_word(state, 1984) & 0x1;
2236 dprintk("TunerITF: read busy (empty)\n");
2238 read_word = dib7000p_read_word(state, 1987);
2239 msg[1].buf[0] = (read_word >> 8) & 0xff;
2240 msg[1].buf[1] = (read_word) & 0xff;
2245 static int w7090p_tuner_rw_serpar(struct i2c_adapter *i2c_adap, struct i2c_msg msg[], int num)
2247 if (map_addr_to_serpar_number(&msg[0]) == 0) { /* else = Tuner regs to ignore : DIG_CFG, CTRL_RF_LT, PLL_CFG, PWM1_REG, ADCCLK, DIG_CFG_3; SLEEP_EN... */
2248 if (num == 1) { /* write */
2249 return w7090p_tuner_write_serpar(i2c_adap, msg, 1);
2251 return w7090p_tuner_read_serpar(i2c_adap, msg, 2);
2257 static int dib7090p_rw_on_apb(struct i2c_adapter *i2c_adap,
2258 struct i2c_msg msg[], int num, u16 apb_address)
2260 struct dib7000p_state *state = i2c_get_adapdata(i2c_adap);
2263 if (num == 1) { /* write */
2264 dib7000p_write_word(state, apb_address, ((msg[0].buf[1] << 8) | (msg[0].buf[2])));
2266 word = dib7000p_read_word(state, apb_address);
2267 msg[1].buf[0] = (word >> 8) & 0xff;
2268 msg[1].buf[1] = (word) & 0xff;
2274 static int dib7090_tuner_xfer(struct i2c_adapter *i2c_adap, struct i2c_msg msg[], int num)
2276 struct dib7000p_state *state = i2c_get_adapdata(i2c_adap);
2278 u16 apb_address = 0, word;
2280 switch (msg[0].buf[0]) {
2366 i = ((dib7000p_read_word(state, 72) >> 12) & 0x3);
2367 word = dib7000p_read_word(state, 384 + i);
2368 msg[1].buf[0] = (word >> 8) & 0xff;
2369 msg[1].buf[1] = (word) & 0xff;
2372 if (num == 1) { /* write */
2373 word = (u16) ((msg[0].buf[1] << 8) | msg[0].buf[2]);
2375 word = (dib7000p_read_word(state, 72) & ~(3 << 12)) | (word << 12);
2376 dib7000p_write_word(state, 72, word); /* Set the proper input */
2381 if (apb_address != 0) /* R/W access via APB */
2382 return dib7090p_rw_on_apb(i2c_adap, msg, num, apb_address);
2383 else /* R/W access via SERPAR */
2384 return w7090p_tuner_rw_serpar(i2c_adap, msg, num);
2389 static u32 dib7000p_i2c_func(struct i2c_adapter *adapter)
2391 return I2C_FUNC_I2C;
2394 static const struct i2c_algorithm dib7090_tuner_xfer_algo = {
2395 .master_xfer = dib7090_tuner_xfer,
2396 .functionality = dib7000p_i2c_func,
2399 static struct i2c_adapter *dib7090_get_i2c_tuner(struct dvb_frontend *fe)
2401 struct dib7000p_state *st = fe->demodulator_priv;
2402 return &st->dib7090_tuner_adap;
2405 static int dib7090_host_bus_drive(struct dib7000p_state *state, u8 drive)
2409 /* drive host bus 2, 3, 4 */
2410 reg = dib7000p_read_word(state, 1798) & ~((0x7) | (0x7 << 6) | (0x7 << 12));
2411 reg |= (drive << 12) | (drive << 6) | drive;
2412 dib7000p_write_word(state, 1798, reg);
2414 /* drive host bus 5,6 */
2415 reg = dib7000p_read_word(state, 1799) & ~((0x7 << 2) | (0x7 << 8));
2416 reg |= (drive << 8) | (drive << 2);
2417 dib7000p_write_word(state, 1799, reg);
2419 /* drive host bus 7, 8, 9 */
2420 reg = dib7000p_read_word(state, 1800) & ~((0x7) | (0x7 << 6) | (0x7 << 12));
2421 reg |= (drive << 12) | (drive << 6) | drive;
2422 dib7000p_write_word(state, 1800, reg);
2424 /* drive host bus 10, 11 */
2425 reg = dib7000p_read_word(state, 1801) & ~((0x7 << 2) | (0x7 << 8));
2426 reg |= (drive << 8) | (drive << 2);
2427 dib7000p_write_word(state, 1801, reg);
2429 /* drive host bus 12, 13, 14 */
2430 reg = dib7000p_read_word(state, 1802) & ~((0x7) | (0x7 << 6) | (0x7 << 12));
2431 reg |= (drive << 12) | (drive << 6) | drive;
2432 dib7000p_write_word(state, 1802, reg);
2437 static u32 dib7090_calcSyncFreq(u32 P_Kin, u32 P_Kout, u32 insertExtSynchro, u32 syncSize)
2440 u32 nom = (insertExtSynchro * P_Kin + syncSize);
2442 u32 syncFreq = ((nom << quantif) / denom);
2444 if ((syncFreq & ((1 << quantif) - 1)) != 0)
2445 syncFreq = (syncFreq >> quantif) + 1;
2447 syncFreq = (syncFreq >> quantif);
2450 syncFreq = syncFreq - 1;
2455 static int dib7090_cfg_DibTx(struct dib7000p_state *state, u32 P_Kin, u32 P_Kout, u32 insertExtSynchro, u32 synchroMode, u32 syncWord, u32 syncSize)
2457 dprintk("Configure DibStream Tx\n");
2459 dib7000p_write_word(state, 1615, 1);
2460 dib7000p_write_word(state, 1603, P_Kin);
2461 dib7000p_write_word(state, 1605, P_Kout);
2462 dib7000p_write_word(state, 1606, insertExtSynchro);
2463 dib7000p_write_word(state, 1608, synchroMode);
2464 dib7000p_write_word(state, 1609, (syncWord >> 16) & 0xffff);
2465 dib7000p_write_word(state, 1610, syncWord & 0xffff);
2466 dib7000p_write_word(state, 1612, syncSize);
2467 dib7000p_write_word(state, 1615, 0);
2472 static int dib7090_cfg_DibRx(struct dib7000p_state *state, u32 P_Kin, u32 P_Kout, u32 synchroMode, u32 insertExtSynchro, u32 syncWord, u32 syncSize,
2477 dprintk("Configure DibStream Rx\n");
2478 if ((P_Kin != 0) && (P_Kout != 0)) {
2479 syncFreq = dib7090_calcSyncFreq(P_Kin, P_Kout, insertExtSynchro, syncSize);
2480 dib7000p_write_word(state, 1542, syncFreq);
2482 dib7000p_write_word(state, 1554, 1);
2483 dib7000p_write_word(state, 1536, P_Kin);
2484 dib7000p_write_word(state, 1537, P_Kout);
2485 dib7000p_write_word(state, 1539, synchroMode);
2486 dib7000p_write_word(state, 1540, (syncWord >> 16) & 0xffff);
2487 dib7000p_write_word(state, 1541, syncWord & 0xffff);
2488 dib7000p_write_word(state, 1543, syncSize);
2489 dib7000p_write_word(state, 1544, dataOutRate);
2490 dib7000p_write_word(state, 1554, 0);
2495 static void dib7090_enMpegMux(struct dib7000p_state *state, int onoff)
2497 u16 reg_1287 = dib7000p_read_word(state, 1287);
2501 reg_1287 &= ~(1<<7);
2508 dib7000p_write_word(state, 1287, reg_1287);
2511 static void dib7090_configMpegMux(struct dib7000p_state *state,
2512 u16 pulseWidth, u16 enSerialMode, u16 enSerialClkDiv2)
2514 dprintk("Enable Mpeg mux\n");
2516 dib7090_enMpegMux(state, 0);
2518 /* If the input mode is MPEG do not divide the serial clock */
2519 if ((enSerialMode == 1) && (state->input_mode_mpeg == 1))
2520 enSerialClkDiv2 = 0;
2522 dib7000p_write_word(state, 1287, ((pulseWidth & 0x1f) << 2)
2523 | ((enSerialMode & 0x1) << 1)
2524 | (enSerialClkDiv2 & 0x1));
2526 dib7090_enMpegMux(state, 1);
2529 static void dib7090_setDibTxMux(struct dib7000p_state *state, int mode)
2531 u16 reg_1288 = dib7000p_read_word(state, 1288) & ~(0x7 << 7);
2535 dprintk("SET MPEG ON DIBSTREAM TX\n");
2536 dib7090_cfg_DibTx(state, 8, 5, 0, 0, 0, 0);
2540 dprintk("SET DIV_OUT ON DIBSTREAM TX\n");
2541 dib7090_cfg_DibTx(state, 5, 5, 0, 0, 0, 0);
2545 dprintk("SET ADC_OUT ON DIBSTREAM TX\n");
2546 dib7090_cfg_DibTx(state, 20, 5, 10, 0, 0, 0);
2552 dib7000p_write_word(state, 1288, reg_1288);
2555 static void dib7090_setHostBusMux(struct dib7000p_state *state, int mode)
2557 u16 reg_1288 = dib7000p_read_word(state, 1288) & ~(0x7 << 4);
2560 case DEMOUT_ON_HOSTBUS:
2561 dprintk("SET DEM OUT OLD INTERF ON HOST BUS\n");
2562 dib7090_enMpegMux(state, 0);
2565 case DIBTX_ON_HOSTBUS:
2566 dprintk("SET DIBSTREAM TX ON HOST BUS\n");
2567 dib7090_enMpegMux(state, 0);
2570 case MPEG_ON_HOSTBUS:
2571 dprintk("SET MPEG MUX ON HOST BUS\n");
2577 dib7000p_write_word(state, 1288, reg_1288);
2580 static int dib7090_set_diversity_in(struct dvb_frontend *fe, int onoff)
2582 struct dib7000p_state *state = fe->demodulator_priv;
2586 case 0: /* only use the internal way - not the diversity input */
2587 dprintk("%s mode OFF : by default Enable Mpeg INPUT\n", __func__);
2588 dib7090_cfg_DibRx(state, 8, 5, 0, 0, 0, 8, 0);
2590 /* Do not divide the serial clock of MPEG MUX */
2591 /* in SERIAL MODE in case input mode MPEG is used */
2592 reg_1287 = dib7000p_read_word(state, 1287);
2593 /* enSerialClkDiv2 == 1 ? */
2594 if ((reg_1287 & 0x1) == 1) {
2595 /* force enSerialClkDiv2 = 0 */
2597 dib7000p_write_word(state, 1287, reg_1287);
2599 state->input_mode_mpeg = 1;
2601 case 1: /* both ways */
2602 case 2: /* only the diversity input */
2603 dprintk("%s ON : Enable diversity INPUT\n", __func__);
2604 dib7090_cfg_DibRx(state, 5, 5, 0, 0, 0, 0, 0);
2605 state->input_mode_mpeg = 0;
2609 dib7000p_set_diversity_in(&state->demod, onoff);
2613 static int dib7090_set_output_mode(struct dvb_frontend *fe, int mode)
2615 struct dib7000p_state *state = fe->demodulator_priv;
2617 u16 outreg, smo_mode, fifo_threshold;
2618 u8 prefer_mpeg_mux_use = 1;
2621 dib7090_host_bus_drive(state, 1);
2623 fifo_threshold = 1792;
2624 smo_mode = (dib7000p_read_word(state, 235) & 0x0050) | (1 << 1);
2625 outreg = dib7000p_read_word(state, 1286) & ~((1 << 10) | (0x7 << 6) | (1 << 1));
2628 case OUTMODE_HIGH_Z:
2632 case OUTMODE_MPEG2_SERIAL:
2633 if (prefer_mpeg_mux_use) {
2634 dprintk("setting output mode TS_SERIAL using Mpeg Mux\n");
2635 dib7090_configMpegMux(state, 3, 1, 1);
2636 dib7090_setHostBusMux(state, MPEG_ON_HOSTBUS);
2637 } else {/* Use Smooth block */
2638 dprintk("setting output mode TS_SERIAL using Smooth bloc\n");
2639 dib7090_setHostBusMux(state, DEMOUT_ON_HOSTBUS);
2640 outreg |= (2<<6) | (0 << 1);
2644 case OUTMODE_MPEG2_PAR_GATED_CLK:
2645 if (prefer_mpeg_mux_use) {
2646 dprintk("setting output mode TS_PARALLEL_GATED using Mpeg Mux\n");
2647 dib7090_configMpegMux(state, 2, 0, 0);
2648 dib7090_setHostBusMux(state, MPEG_ON_HOSTBUS);
2649 } else { /* Use Smooth block */
2650 dprintk("setting output mode TS_PARALLEL_GATED using Smooth block\n");
2651 dib7090_setHostBusMux(state, DEMOUT_ON_HOSTBUS);
2656 case OUTMODE_MPEG2_PAR_CONT_CLK: /* Using Smooth block only */
2657 dprintk("setting output mode TS_PARALLEL_CONT using Smooth block\n");
2658 dib7090_setHostBusMux(state, DEMOUT_ON_HOSTBUS);
2662 case OUTMODE_MPEG2_FIFO: /* Using Smooth block because not supported by new Mpeg Mux bloc */
2663 dprintk("setting output mode TS_FIFO using Smooth block\n");
2664 dib7090_setHostBusMux(state, DEMOUT_ON_HOSTBUS);
2666 smo_mode |= (3 << 1);
2667 fifo_threshold = 512;
2670 case OUTMODE_DIVERSITY:
2671 dprintk("setting output mode MODE_DIVERSITY\n");
2672 dib7090_setDibTxMux(state, DIV_ON_DIBTX);
2673 dib7090_setHostBusMux(state, DIBTX_ON_HOSTBUS);
2676 case OUTMODE_ANALOG_ADC:
2677 dprintk("setting output mode MODE_ANALOG_ADC\n");
2678 dib7090_setDibTxMux(state, ADC_ON_DIBTX);
2679 dib7090_setHostBusMux(state, DIBTX_ON_HOSTBUS);
2682 if (mode != OUTMODE_HIGH_Z)
2683 outreg |= (1 << 10);
2685 if (state->cfg.output_mpeg2_in_188_bytes)
2686 smo_mode |= (1 << 5);
2688 ret |= dib7000p_write_word(state, 235, smo_mode);
2689 ret |= dib7000p_write_word(state, 236, fifo_threshold); /* synchronous fread */
2690 ret |= dib7000p_write_word(state, 1286, outreg);
2695 static int dib7090_tuner_sleep(struct dvb_frontend *fe, int onoff)
2697 struct dib7000p_state *state = fe->demodulator_priv;
2700 dprintk("sleep dib7090: %d\n", onoff);
2702 en_cur_state = dib7000p_read_word(state, 1922);
2704 if (en_cur_state > 0xff)
2705 state->tuner_enable = en_cur_state;
2708 en_cur_state &= 0x00ff;
2710 if (state->tuner_enable != 0)
2711 en_cur_state = state->tuner_enable;
2714 dib7000p_write_word(state, 1922, en_cur_state);
2719 static int dib7090_get_adc_power(struct dvb_frontend *fe)
2721 return dib7000p_get_adc_power(fe);
2724 static int dib7090_slave_reset(struct dvb_frontend *fe)
2726 struct dib7000p_state *state = fe->demodulator_priv;
2729 reg = dib7000p_read_word(state, 1794);
2730 dib7000p_write_word(state, 1794, reg | (4 << 12));
2732 dib7000p_write_word(state, 1032, 0xffff);
2736 static const struct dvb_frontend_ops dib7000p_ops;
2737 static struct dvb_frontend *dib7000p_init(struct i2c_adapter *i2c_adap, u8 i2c_addr, struct dib7000p_config *cfg)
2739 struct dvb_frontend *demod;
2740 struct dib7000p_state *st;
2741 st = kzalloc(sizeof(struct dib7000p_state), GFP_KERNEL);
2745 memcpy(&st->cfg, cfg, sizeof(struct dib7000p_config));
2746 st->i2c_adap = i2c_adap;
2747 st->i2c_addr = i2c_addr;
2748 st->gpio_val = cfg->gpio_val;
2749 st->gpio_dir = cfg->gpio_dir;
2751 /* Ensure the output mode remains at the previous default if it's
2752 * not specifically set by the caller.
2754 if ((st->cfg.output_mode != OUTMODE_MPEG2_SERIAL) && (st->cfg.output_mode != OUTMODE_MPEG2_PAR_GATED_CLK))
2755 st->cfg.output_mode = OUTMODE_MPEG2_FIFO;
2758 demod->demodulator_priv = st;
2759 memcpy(&st->demod.ops, &dib7000p_ops, sizeof(struct dvb_frontend_ops));
2760 mutex_init(&st->i2c_buffer_lock);
2762 dib7000p_write_word(st, 1287, 0x0003); /* sram lead in, rdy */
2764 if (dib7000p_identify(st) != 0)
2767 st->version = dib7000p_read_word(st, 897);
2769 /* FIXME: make sure the dev.parent field is initialized, or else
2770 request_firmware() will hit an OOPS (this should be moved somewhere
2772 st->i2c_master.gated_tuner_i2c_adap.dev.parent = i2c_adap->dev.parent;
2774 dibx000_init_i2c_master(&st->i2c_master, DIB7000P, st->i2c_adap, st->i2c_addr);
2776 /* init 7090 tuner adapter */
2777 strscpy(st->dib7090_tuner_adap.name, "DiB7090 tuner interface",
2778 sizeof(st->dib7090_tuner_adap.name));
2779 st->dib7090_tuner_adap.algo = &dib7090_tuner_xfer_algo;
2780 st->dib7090_tuner_adap.algo_data = NULL;
2781 st->dib7090_tuner_adap.dev.parent = st->i2c_adap->dev.parent;
2782 i2c_set_adapdata(&st->dib7090_tuner_adap, st);
2783 i2c_add_adapter(&st->dib7090_tuner_adap);
2785 dib7000p_demod_reset(st);
2787 dib7000p_reset_stats(demod);
2789 if (st->version == SOC7090) {
2790 dib7090_set_output_mode(demod, st->cfg.output_mode);
2791 dib7090_set_diversity_in(demod, 0);
2801 void *dib7000p_attach(struct dib7000p_ops *ops)
2806 ops->slave_reset = dib7090_slave_reset;
2807 ops->get_adc_power = dib7090_get_adc_power;
2808 ops->dib7000pc_detection = dib7000pc_detection;
2809 ops->get_i2c_tuner = dib7090_get_i2c_tuner;
2810 ops->tuner_sleep = dib7090_tuner_sleep;
2811 ops->init = dib7000p_init;
2812 ops->set_agc1_min = dib7000p_set_agc1_min;
2813 ops->set_gpio = dib7000p_set_gpio;
2814 ops->i2c_enumeration = dib7000p_i2c_enumeration;
2815 ops->pid_filter = dib7000p_pid_filter;
2816 ops->pid_filter_ctrl = dib7000p_pid_filter_ctrl;
2817 ops->get_i2c_master = dib7000p_get_i2c_master;
2818 ops->update_pll = dib7000p_update_pll;
2819 ops->ctrl_timf = dib7000p_ctrl_timf;
2820 ops->get_agc_values = dib7000p_get_agc_values;
2821 ops->set_wbd_ref = dib7000p_set_wbd_ref;
2825 EXPORT_SYMBOL(dib7000p_attach);
2827 static const struct dvb_frontend_ops dib7000p_ops = {
2828 .delsys = { SYS_DVBT },
2830 .name = "DiBcom 7000PC",
2831 .frequency_min_hz = 44250 * kHz,
2832 .frequency_max_hz = 867250 * kHz,
2833 .frequency_stepsize_hz = 62500,
2834 .caps = FE_CAN_INVERSION_AUTO |
2835 FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
2836 FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
2837 FE_CAN_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_64 | FE_CAN_QAM_AUTO |
2838 FE_CAN_TRANSMISSION_MODE_AUTO | FE_CAN_GUARD_INTERVAL_AUTO | FE_CAN_RECOVER | FE_CAN_HIERARCHY_AUTO,
2841 .release = dib7000p_release,
2843 .init = dib7000p_wakeup,
2844 .sleep = dib7000p_sleep,
2846 .set_frontend = dib7000p_set_frontend,
2847 .get_tune_settings = dib7000p_fe_get_tune_settings,
2848 .get_frontend = dib7000p_get_frontend,
2850 .read_status = dib7000p_read_status,
2851 .read_ber = dib7000p_read_ber,
2852 .read_signal_strength = dib7000p_read_signal_strength,
2853 .read_snr = dib7000p_read_snr,
2854 .read_ucblocks = dib7000p_read_unc_blocks,
2857 MODULE_AUTHOR("Olivier Grenie <olivie.grenie@parrot.com>");
2858 MODULE_AUTHOR("Patrick Boettcher <patrick.boettcher@posteo.de>");
2859 MODULE_DESCRIPTION("Driver for the DiBcom 7000PC COFDM demodulator");
2860 MODULE_LICENSE("GPL");