10 #include <linux/kernel.h>
11 #include <linux/slab.h>
12 #include <linux/i2c.h>
24 static int buggy_sfn_workaround;
26 MODULE_PARM_DESC(buggy_sfn_workaround,
"Enable work-around for buggy SFNs (default: 0)");
28 #define dprintk(args...) do { if (debug) { printk(KERN_DEBUG "DiB7000P: "); printk(args); printk("\n"); } } while (0)
62 #define SOC7090 0x7090
94 dprintk(
"could not acquire lock");
103 state->
msg[0].flags = 0;
105 state->
msg[0].len = 2;
109 state->
msg[1].len = 2;
112 dprintk(
"i2c read error on %d", reg);
124 dprintk(
"could not acquire lock");
135 state->
msg[0].flags = 0;
137 state->
msg[0].len = 4;
154 dib7000p_write_word(state,
r, *n++);
164 u16 outreg, fifo_threshold, smo_mode;
167 fifo_threshold = 1792;
168 smo_mode = (dib7000p_read_word(state, 235) & 0x0050) | (1 << 1);
170 dprintk(
"setting output mode for demod %p to %d", &state->
demod, mode);
177 outreg = (1 << 10) | (1 << 6);
180 outreg = (1 << 10) | (2 << 6) | (0 << 1);
183 if (state->
cfg.hostbus_diversity)
184 outreg = (1 << 10) | (4 << 6);
189 smo_mode |= (3 << 1);
190 fifo_threshold = 512;
191 outreg = (1 << 10) | (5 << 6);
194 outreg = (1 << 10) | (3 << 6);
200 dprintk(
"Unhandled output_mode passed to be set for demod %p", &state->
demod);
204 if (state->
cfg.output_mpeg2_in_188_bytes)
205 smo_mode |= (1 << 5);
207 ret |= dib7000p_write_word(state, 235, smo_mode);
208 ret |= dib7000p_write_word(state, 236, fifo_threshold);
210 ret |= dib7000p_write_word(state, 1286, outreg);
220 dprintk(
"diversity combination deactivated - forced by COFDM parameters");
222 dib7000p_write_word(state, 207, 0);
224 dib7000p_write_word(state, 207, (state->
div_sync_wait << 4) | (1 << 2) | (2 << 0));
229 dib7000p_write_word(state, 204, 6);
230 dib7000p_write_word(state, 205, 16);
233 dib7000p_write_word(state, 204, 1);
234 dib7000p_write_word(state, 205, 0);
243 u16 reg_774 = 0x3fff, reg_775 = 0xffff, reg_776 = 0x0007, reg_899 = 0x0003, reg_1280 = (0xfe00) | (dib7000p_read_word(state, 1280) & 0x01ff);
261 reg_774 &= ~((1 << 15) | (1 << 14) | (1 << 11) | (1 << 10) | (1 << 9));
263 reg_776 &= ~((1 << 0));
266 reg_1280 &= ~((1 << 11));
267 reg_1280 &= ~(1 << 6);
273 reg_1280 &= ~((1 << 7) | (1 << 5));
275 reg_1280 &= ~((1 << 14) | (1 << 13) | (1 << 12) | (1 << 10));
281 dib7000p_write_word(state, 774, reg_774);
282 dib7000p_write_word(state, 775, reg_775);
283 dib7000p_write_word(state, 776, reg_776);
284 dib7000p_write_word(state, 1280, reg_1280);
286 dib7000p_write_word(state, 899, reg_899);
293 u16 reg_908 = 0, reg_909 = 0;
297 reg_908 = dib7000p_read_word(state, 908);
298 reg_909 = dib7000p_read_word(state, 909);
304 reg = dib7000p_read_word(state, 1925);
306 dib7000p_write_word(state, 1925, reg | (1 << 4) | (1 << 2));
308 reg = dib7000p_read_word(state, 1925);
310 dib7000p_write_word(state, 1925, reg & ~(1 << 4));
312 reg = dib7000p_read_word(state, 72) & ~((0x3 << 14) | (0x3 << 12));
313 dib7000p_write_word(state, 72, reg | (1 << 14) | (3 << 12) | 524);
315 reg_909 |= (1 << 1) | (1 << 0);
316 dib7000p_write_word(state, 909, reg_909);
317 reg_909 &= ~(1 << 1);
323 reg = dib7000p_read_word(state, 1925);
324 dib7000p_write_word(state, 1925, (reg & ~(1 << 2)) | (1 << 4));
326 reg_909 |= (1 << 1) | (1 << 0);
335 reg_908 |= (1 << 14) | (1 << 13) | (1 << 12);
336 reg_909 |= (1 << 5) | (1 << 4) | (1 << 3) | (1 << 2);
340 reg_908 &= ~(1 << 15);
344 reg_908 |= (1 << 15);
353 reg_909 |= (state->
cfg.disable_sample_and_hold & 1) << 4;
354 reg_908 |= (state->
cfg.enable_current_mirror & 1) << 7;
357 dib7000p_write_word(state, 908, reg_908);
358 dib7000p_write_word(state, 909, reg_909);
369 if (state->
timf == 0) {
371 timf = state->
cfg.bw->timf;
377 timf = timf * (bw / 50) / 160;
379 dib7000p_write_word(state, 23, (
u16) ((timf >> 16) & 0xffff));
380 dib7000p_write_word(state, 24, (
u16) ((timf) & 0xffff));
388 dib7000p_write_word(state, 73, (0 << 1) | (0 << 0));
391 dib7000p_write_word(state, 74, 2048);
393 dib7000p_write_word(state, 74, 776);
396 dib7000p_write_word(state, 73, (1 << 0));
397 dib7000p_write_word(state, 73, (0 << 0));
410 return dib7000p_write_word(state, 105, (dib7000p_read_word(state, 105) & 0xf000) | value);
419 if (agc_global !=
NULL)
420 *agc_global = dib7000p_read_word(state, 394);
422 *agc1 = dib7000p_read_word(state, 392);
424 *agc2 = dib7000p_read_word(state, 393);
426 *wbd = dib7000p_read_word(state, 397);
440 while (((dib7000p_read_word(state, 1856) >> 15) & 0x1) != 1)
443 dib7000p_write_word(state, 1857, dib7000p_read_word(state, 1857) | (!bw->
pll_bypass << 15));
446 clk_cfg0 = (1 << 15) | ((bw->
pll_ratio & 0x3f) << 9) |
449 dib7000p_write_word(state, 900, clk_cfg0);
453 clk_cfg0 = (bw->
pll_bypass << 15) | (clk_cfg0 & 0x7fff);
454 dib7000p_write_word(state, 900, clk_cfg0);
457 dib7000p_write_word(state, 18, (
u16) (((bw->
internal * 1000) >> 16) & 0xffff));
458 dib7000p_write_word(state, 19, (
u16) ((bw->
internal * 1000) & 0xffff));
459 dib7000p_write_word(state, 21, (
u16) ((bw->
ifreq >> 16) & 0xffff));
460 dib7000p_write_word(state, 22, (
u16) ((bw->
ifreq) & 0xffff));
462 dib7000p_write_word(state, 72, bw->
sad_cfg);
467 u32 internal = (
u32) dib7000p_read_word(state, 18) << 16;
468 internal |= (
u32) dib7000p_read_word(state, 19);
477 u16 reg_1857, reg_1856 = dib7000p_read_word(state, 1856);
482 prediv = reg_1856 & 0x3f;
483 loopdiv = (reg_1856 >> 6) & 0x3f;
486 dprintk(
"Updating pll (prediv: old = %d new = %d ; loopdiv : old = %d new = %d)", prediv, bw->
pll_prediv, loopdiv, bw->
pll_ratio);
488 reg_1857 = dib7000p_read_word(state, 1857);
489 dib7000p_write_word(state, 1857, reg_1857 & ~(1 << 15));
491 dib7000p_write_word(state, 1856, reg_1856 | ((bw->
pll_ratio & 0x3f) << 6) | (bw->
pll_prediv & 0x3f));
494 internal = dib7000p_get_internal_freq(state);
495 xtal = (
internal / loopdiv) * prediv;
497 dib7000p_write_word(state, 18, (
u16) ((
internal >> 16) & 0xffff));
498 dib7000p_write_word(state, 19, (
u16) (
internal & 0xffff));
500 dib7000p_write_word(state, 1857, reg_1857 | (1 << 15));
502 while (((dib7000p_read_word(state, 1856) >> 15) & 0x1) != 1)
503 dprintk(
"Waiting for PLL to lock");
516 dib7000p_write_word(st, 1029, st->
gpio_dir);
517 dib7000p_write_word(st, 1030, st->
gpio_val);
521 dib7000p_write_word(st, 1032, st->
cfg.gpio_pwm_pos);
523 dib7000p_write_word(st, 1037, st->
cfg.pwm_freq_div);
529 st->
gpio_dir = dib7000p_read_word(st, 1029);
532 dib7000p_write_word(st, 1029, st->
gpio_dir);
534 st->
gpio_val = dib7000p_read_word(st, 1030);
536 st->
gpio_val |= (val & 0x01) << num;
537 dib7000p_write_word(st, 1030, st->
gpio_val);
545 return dib7000p_cfg_gpio(state, num, dir, val);
549 static u16 dib7000p_defaults[] = {
553 (1<<3)|(1<<11)|(1<<12)|(1<<13),
575 (1 << 13) - 825 - 117,
576 (1 << 13) - 837 - 117,
577 (1 << 13) - 811 - 117,
578 (1 << 13) - 766 - 117,
579 (1 << 13) - 737 - 117,
580 (1 << 13) - 693 - 117,
581 (1 << 13) - 648 - 117,
582 (1 << 13) - 619 - 117,
583 (1 << 13) - 575 - 117,
584 (1 << 13) - 531 - 117,
585 (1 << 13) - 501 - 117,
642 dib7000p_write_word(state, 770, 0xffff);
643 dib7000p_write_word(state, 771, 0xffff);
644 dib7000p_write_word(state, 772, 0x001f);
645 dib7000p_write_word(state, 1280, 0x001f - ((1 << 4) | (1 << 3)));
647 dib7000p_write_word(state, 770, 0);
648 dib7000p_write_word(state, 771, 0);
649 dib7000p_write_word(state, 772, 0);
650 dib7000p_write_word(state, 1280, 0);
653 dib7000p_write_word(state, 898, 0x0003);
654 dib7000p_write_word(state, 898, 0);
658 dib7000p_reset_pll(state);
660 if (dib7000p_reset_gpio(state) != 0)
661 dprintk(
"GPIO reset was not successful.");
664 dib7000p_write_word(state, 899, 0);
667 dib7000p_write_word(state, 42, (1<<5) | 3);
668 dib7000p_write_word(state, 43, 0x2d4);
669 dib7000p_write_word(state, 44, 300);
670 dib7000p_write_word(state, 273, (0<<6) | 30);
673 dprintk(
"OUTPUT_MODE could not be reset.");
676 dib7000p_sad_calib(state);
680 dib7000p_write_word(state, 1285, dib7000p_read_word(state, 1285) & ~(1 << 1));
682 dib7000p_set_bandwidth(state, 8000);
685 dib7000p_write_word(state, 36, 0x0755);
687 if (state->
cfg.tuner_is_baseband)
688 dib7000p_write_word(state, 36, 0x0755);
690 dib7000p_write_word(state, 36, 0x1f55);
693 dib7000p_write_tab(state, dib7000p_defaults);
695 dib7000p_write_word(state, 901, 0x0006);
696 dib7000p_write_word(state, 902, (3 << 10) | (1 << 6));
697 dib7000p_write_word(state, 905, 0x2c8e);
708 tmp = dib7000p_read_word(state, 903);
709 dib7000p_write_word(state, 903, (tmp | 0x1));
710 tmp = dib7000p_read_word(state, 900);
711 dib7000p_write_word(state, 900, (tmp & 0x7fff) | (1 << 6));
717 dib7000p_write_word(state, 770, (1 << 11) | (1 << 9));
718 dib7000p_write_word(state, 770, 0x0000);
725 if (state->
cfg.update_lna) {
726 dyn_gain = dib7000p_read_word(state, 394);
727 if (state->
cfg.update_lna(&state->
demod, dyn_gain)) {
728 dib7000p_restart_agc(state);
744 for (i = 0; i < state->
cfg.agc_config_count; i++)
745 if (state->
cfg.agc[i].band_caps & band) {
746 agc = &state->
cfg.agc[
i];
751 dprintk(
"no valid AGC configuration found for band 0x%02x", band);
758 dib7000p_write_word(state, 75, agc->
setup);
759 dib7000p_write_word(state, 76, agc->
inv_gain);
768 dprintk(
"WBD: ref: %d, sel: %d, active: %d, alpha: %d",
772 dib7000p_write_word(state, 105, (agc->
wbd_inv << 12) | state->
wbd_ref);
774 dib7000p_write_word(state, 105, (agc->
wbd_inv << 12) | agc->
wbd_ref);
778 dib7000p_write_word(state, 107, agc->
agc1_max);
779 dib7000p_write_word(state, 108, agc->
agc1_min);
780 dib7000p_write_word(state, 109, agc->
agc2_max);
781 dib7000p_write_word(state, 110, agc->
agc2_min);
783 dib7000p_write_word(state, 112, agc->
agc1_pt3);
792 u32 internal = dib7000p_get_internal_freq(state);
793 s32 unit_khz_dds_val = 67108864 / (
internal);
794 u32 abs_offset_khz =
ABS(offset_khz);
795 u32 dds = state->
cfg.bw->ifreq & 0x1ffffff;
796 u8 invert = !!(state->
cfg.bw->ifreq & (1 << 25));
798 dprintk(
"setting a frequency offset of %dkHz internal freq = %d invert = %d", offset_khz,
internal, invert);
801 unit_khz_dds_val *= -1;
805 dds -= (abs_offset_khz * unit_khz_dds_val);
807 dds += (abs_offset_khz * unit_khz_dds_val);
809 if (abs_offset_khz <= (
internal / 2)) {
810 dib7000p_write_word(state, 21, (
u16) (((dds >> 16) & 0x1ff) | (0 << 10) | (invert << 9)));
811 dib7000p_write_word(state, 22, (
u16) (dds & 0xffff));
815 static int dib7000p_agc_startup(
struct dvb_frontend *demod)
823 u32 upd_demod_gain_period = 0x1000;
829 reg = dib7000p_read_word(state, 0x79b) & 0xff00;
830 dib7000p_write_word(state, 0x79a, upd_demod_gain_period & 0xFFFF);
831 dib7000p_write_word(state, 0x79b, reg | (1 << 14) | ((upd_demod_gain_period >> 16) & 0xFF));
834 reg = dib7000p_read_word(state, 0x780);
835 dib7000p_write_word(state, 0x780, (reg | (0x3)) & (~(1 << 7)));
838 dib7000p_pll_clk_cfg(state);
844 dib7000p_set_dds(state, 0);
850 if (state->
cfg.agc_control)
851 state->
cfg.agc_control(&state->
demod, 1);
853 dib7000p_write_word(state, 78, 32768);
857 dib7000p_write_word(state, 106, (state->
current_agc->wbd_sel << 13) | (state->
current_agc->wbd_alpha << 9) | (1 << 8));
867 dib7000p_restart_agc(state);
871 dib7000p_write_word(state, 75, state->
current_agc->setup | (1 << 4));
872 dib7000p_write_word(state, 106, (state->
current_agc->wbd_sel << 13) | (2 << 9) | (0 << 8));
878 agc_split = (
u8) dib7000p_read_word(state, 396);
879 dib7000p_write_word(state, 78, dib7000p_read_word(state, 394));
881 dib7000p_write_word(state, 75, state->
current_agc->setup);
882 dib7000p_write_word(state, 106, (state->
current_agc->wbd_sel << 13) | (state->
current_agc->wbd_alpha << 9) | agc_split);
884 dib7000p_restart_agc(state);
886 dprintk(
"SPLIT %p: %hd", demod, agc_split);
895 if (dib7000p_update_lna(state))
902 if (state->
cfg.agc_control)
903 state->
cfg.agc_control(&state->
demod, 0);
914 u32 timf = (dib7000p_read_word(state, 427) << 16) | dib7000p_read_word(state, 428);
916 dib7000p_write_word(state, 23, (
u16) (timf >> 16));
917 dib7000p_write_word(state, 24, (
u16) (timf & 0xffff));
918 dprintk(
"updated timf_frequency: %d (default: %d)", state->
timf, state->
cfg.bw->timf);
930 dib7000p_update_timf(state);
1000 dib7000p_write_word(state, 0, value);
1001 dib7000p_write_word(state, 5, (seq << 4) | 1);
1029 dib7000p_write_word(state, 208, value);
1032 dib7000p_write_word(state, 26, 0x6680);
1033 dib7000p_write_word(state, 32, 0x0003);
1034 dib7000p_write_word(state, 29, 0x1273);
1035 dib7000p_write_word(state, 33, 0x0005);
1065 if (state->
cfg.diversity_delay == 0)
1095 for (value = 0; value < 4; value++)
1096 dib7000p_write_word(state, 187 + value, est[value]);
1099 static int dib7000p_autosearch_start(
struct dvb_frontend *demod)
1105 u32 internal = dib7000p_get_internal_freq(state);
1113 schan.hierarchy = 0;
1115 dib7000p_set_channel(state, &schan, 7);
1118 if (factor >= 5000) {
1126 value = 30 *
internal * factor;
1127 dib7000p_write_word(state, 6, (
u16) ((value >> 16) & 0xffff));
1128 dib7000p_write_word(state, 7, (
u16) (value & 0xffff));
1129 value = 100 *
internal * factor;
1130 dib7000p_write_word(state, 8, (
u16) ((value >> 16) & 0xffff));
1131 dib7000p_write_word(state, 9, (
u16) (value & 0xffff));
1132 value = 500 *
internal * factor;
1133 dib7000p_write_word(state, 10, (
u16) ((value >> 16) & 0xffff));
1134 dib7000p_write_word(state, 11, (
u16) (value & 0xffff));
1136 value = dib7000p_read_word(state, 0);
1137 dib7000p_write_word(state, 0, (
u16) ((1 << 9) | value));
1138 dib7000p_read_word(state, 1284);
1139 dib7000p_write_word(state, 0, (
u16) value);
1144 static int dib7000p_autosearch_is_irq(
struct dvb_frontend *demod)
1147 u16 irq_pending = dib7000p_read_word(state, 1284);
1149 if (irq_pending & 0x1)
1152 if (irq_pending & 0x2)
1160 static s16 notch[] = { 16143, 14402, 12238, 9713, 6902, 3888, 759, -2392 };
1161 static u8 sine[] = { 0, 2, 3, 5, 6, 8, 9, 11, 13, 14, 16, 17, 19, 20, 22,
1162 24, 25, 27, 28, 30, 31, 33, 34, 36, 38, 39, 41, 42, 44, 45, 47, 48, 50, 51,
1163 53, 55, 56, 58, 59, 61, 62, 64, 65, 67, 68, 70, 71, 73, 74, 76, 77, 79, 80,
1164 82, 83, 85, 86, 88, 89, 91, 92, 94, 95, 97, 98, 99, 101, 102, 104, 105,
1165 107, 108, 109, 111, 112, 114, 115, 117, 118, 119, 121, 122, 123, 125, 126,
1166 128, 129, 130, 132, 133, 134, 136, 137, 138, 140, 141, 142, 144, 145, 146,
1167 147, 149, 150, 151, 152, 154, 155, 156, 157, 159, 160, 161, 162, 164, 165,
1168 166, 167, 168, 170, 171, 172, 173, 174, 175, 177, 178, 179, 180, 181, 182,
1169 183, 184, 185, 186, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198,
1170 199, 200, 201, 202, 203, 204, 205, 206, 207, 207, 208, 209, 210, 211, 212,
1171 213, 214, 215, 215, 216, 217, 218, 219, 220, 220, 221, 222, 223, 224, 224,
1172 225, 226, 227, 227, 228, 229, 229, 230, 231, 231, 232, 233, 233, 234, 235,
1173 235, 236, 237, 237, 238, 238, 239, 239, 240, 241, 241, 242, 242, 243, 243,
1174 244, 244, 245, 245, 245, 246, 246, 247, 247, 248, 248, 248, 249, 249, 249,
1175 250, 250, 250, 251, 251, 251, 252, 252, 252, 252, 253, 253, 253, 253, 254,
1176 254, 254, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
1177 255, 255, 255, 255, 255, 255
1183 int coef_re[8], coef_im[8];
1187 dprintk(
"relative position of the Spur: %dk (RF: %dk, XTAL: %dk)", f_rel, rf_khz, xtal);
1189 if (f_rel < -bw_khz / 2 || f_rel > bw_khz / 2)
1194 dib7000p_write_word(state, 142, 0x0610);
1196 for (k = 0; k < 8; k++) {
1197 pha = ((f_rel * (k + 1) * 112 * 80 / bw_khz) / 1000) & 0x3ff;
1202 }
else if (pha < 256) {
1203 coef_re[
k] = sine[256 - (pha & 0xff)];
1204 coef_im[
k] = sine[pha & 0xff];
1205 }
else if (pha == 256) {
1208 }
else if (pha < 512) {
1209 coef_re[
k] = -sine[pha & 0xff];
1210 coef_im[
k] = sine[256 - (pha & 0xff)];
1211 }
else if (pha == 512) {
1214 }
else if (pha < 768) {
1215 coef_re[
k] = -sine[256 - (pha & 0xff)];
1216 coef_im[
k] = -sine[pha & 0xff];
1217 }
else if (pha == 768) {
1221 coef_re[
k] = sine[pha & 0xff];
1222 coef_im[
k] = -sine[256 - (pha & 0xff)];
1225 coef_re[
k] *= notch[
k];
1226 coef_re[
k] += (1 << 14);
1227 if (coef_re[k] >= (1 << 24))
1228 coef_re[k] = (1 << 24) - 1;
1229 coef_re[
k] /= (1 << 15);
1231 coef_im[
k] *= notch[
k];
1232 coef_im[
k] += (1 << 14);
1233 if (coef_im[k] >= (1 << 24))
1234 coef_im[k] = (1 << 24) - 1;
1235 coef_im[
k] /= (1 << 15);
1237 dprintk(
"PALF COEF: %d re: %d im: %d", k, coef_re[k], coef_im[k]);
1239 dib7000p_write_word(state, 143, (0 << 14) | (k << 10) | (coef_re[k] & 0x3ff));
1240 dib7000p_write_word(state, 144, coef_im[k] & 0x3ff);
1241 dib7000p_write_word(state, 143, (1 << 14) | (k << 10) | (coef_re[k] & 0x3ff));
1243 dib7000p_write_word(state, 143, 0);
1253 dib7000p_set_channel(state, ch, 0);
1258 dib7000p_write_word(state, 770, 0x4000);
1259 dib7000p_write_word(state, 770, 0x0000);
1263 tmp = (0 << 14) | (4 << 10) | (0 << 9) | (3 << 5) | (1 << 4) | (0x3);
1265 dprintk(
"SFN workaround is active");
1267 dib7000p_write_word(state, 166, 0x4000);
1269 dib7000p_write_word(state, 166, 0x0000);
1271 dib7000p_write_word(state, 29, tmp);
1274 if (state->
timf == 0)
1280 tmp = (6 << 8) | 0x80;
1293 dib7000p_write_word(state, 26, tmp);
1309 dib7000p_write_word(state, 32, tmp);
1325 dib7000p_write_word(state, 33, tmp);
1327 tmp = dib7000p_read_word(state, 509);
1328 if (!((tmp >> 6) & 0x1)) {
1330 tmp = dib7000p_read_word(state, 771);
1331 dib7000p_write_word(state, 771, tmp | (1 << 1));
1332 dib7000p_write_word(state, 771, tmp);
1334 tmp = dib7000p_read_word(state, 509);
1337 if ((tmp >> 6) & 0x1) {
1338 dib7000p_update_timf(state);
1340 tmp = dib7000p_read_word(state, 26);
1341 dib7000p_write_word(state, 26, (tmp & ~(0xf << 12)) | ((((tmp >> 12) & 0xf) + 5) << 12));
1344 if (state->
cfg.spur_protect)
1357 dib7000p_sad_calib(state);
1374 if ((value = dib7000p_read_word(st, 768)) != 0x01b3) {
1375 dprintk(
"wrong Vendor ID (read=0x%x)", value);
1379 if ((value = dib7000p_read_word(st, 769)) != 0x4000) {
1380 dprintk(
"wrong Device ID (%x)", value);
1387 static int dib7000p_get_frontend(
struct dvb_frontend *fe)
1391 u16 tps = dib7000p_read_word(state, 463);
1397 switch ((tps >> 8) & 0x3) {
1407 switch (tps & 0x3) {
1422 switch ((tps >> 14) & 0x3) {
1439 switch ((tps >> 5) & 0x7) {
1459 switch ((tps >> 2) & 0x7) {
1483 static int dib7000p_set_frontend(
struct dvb_frontend *fe)
1490 dib7090_set_diversity_in(fe, 0);
1497 if (fe->
ops.tuner_ops.set_params)
1498 fe->
ops.tuner_ops.set_params(fe);
1503 time = dib7000p_agc_startup(fe);
1506 }
while (time != -1);
1512 dib7000p_autosearch_start(fe);
1515 found = dib7000p_autosearch_is_irq(fe);
1516 }
while (found == 0 && i--);
1518 dprintk(
"autosearch returns: %d", found);
1519 if (found == 0 || found == 1)
1522 dib7000p_get_frontend(fe);
1525 ret = dib7000p_tune(fe);
1529 dib7090_set_output_mode(fe, state->
cfg.output_mode);
1530 if (state->
cfg.enMpegOutput == 0) {
1535 dib7000p_set_output_mode(state, state->
cfg.output_mode);
1543 u16 lock = dib7000p_read_word(state, 509);
1555 if ((lock & 0x0038) == 0x38)
1564 *ber = (dib7000p_read_word(state, 500) << 16) | dib7000p_read_word(state, 501);
1568 static int dib7000p_read_unc_blocks(
struct dvb_frontend *fe,
u32 * unc)
1571 *unc = dib7000p_read_word(state, 506);
1575 static int dib7000p_read_signal_strength(
struct dvb_frontend *fe,
u16 * strength)
1578 u16 val = dib7000p_read_word(state, 394);
1579 *strength = 65535 -
val;
1587 s32 signal_mant, signal_exp, noise_mant, noise_exp;
1590 val = dib7000p_read_word(state, 479);
1591 noise_mant = (val >> 4) & 0xff;
1592 noise_exp = ((val & 0xf) << 2);
1593 val = dib7000p_read_word(state, 480);
1594 noise_exp += ((val >> 14) & 0x3);
1595 if ((noise_exp & 0x20) != 0)
1598 signal_mant = (val >> 6) & 0xFF;
1599 signal_exp = (val & 0x3F);
1600 if ((signal_exp & 0x20) != 0)
1603 if (signal_mant != 0)
1606 result =
intlog10(2) * 10 * signal_exp - 100;
1608 if (noise_mant != 0)
1611 result -=
intlog10(2) * 10 * noise_exp - 100;
1613 *snr = result / ((1 << 24) / 10);
1623 static void dib7000p_release(
struct dvb_frontend *demod)
1635 {.
addr = 18 >> 1, .flags = 0, .len = 2},
1636 {.addr = 18 >> 1, .flags =
I2C_M_RD, .len = 2},
1646 goto rx_memory_error;
1656 if (rx[0] == 0x01 && rx[1] == 0xb3) {
1657 dprintk(
"-D- DiB7000PC detected");
1664 if (rx[0] == 0x01 && rx[1] == 0xb3) {
1665 dprintk(
"-D- DiB7000PC detected");
1669 dprintk(
"-D- DiB7000PC not detected");
1688 u16 val = dib7000p_read_word(state, 235) & 0xffef;
1689 val |= (onoff & 0x1) << 4;
1690 dprintk(
"PID filter enabled %d", onoff);
1691 return dib7000p_write_word(state, 235, val);
1698 dprintk(
"PID filter: index %x, PID %d, OnOff %d",
id, pid, onoff);
1699 return dib7000p_write_word(state, 241 +
id, onoff ? (1 << 13) | pid : 0);
1716 for (k = no_of_demods - 1; k >= 0; k--) {
1720 if (cfg[k].default_i2c_addr != 0)
1723 new_addr = (0x40 +
k) << 1;
1725 dib7000p_write_word(dpst, 1287, 0x0003);
1726 if (dib7000p_identify(dpst) != 0) {
1728 dib7000p_write_word(dpst, 1287, 0x0003);
1729 if (dib7000p_identify(dpst) != 0) {
1730 dprintk(
"DiB7000P #%d: not identified\n", k);
1740 dib7000p_write_word(dpst, 1285, (new_addr << 2) | 0x2);
1742 dprintk(
"IC %d initialized (to i2c_address 0x%x)", k, new_addr);
1745 for (k = 0; k < no_of_demods; k++) {
1747 if (cfg[k].default_i2c_addr != 0)
1753 dib7000p_write_word(dpst, 1285, dpst->
i2c_addr << 2);
1764 static const s32 lut_1000ln_mant[] = {
1765 6908, 6956, 7003, 7047, 7090, 7131, 7170, 7208, 7244, 7279, 7313, 7346, 7377, 7408, 7438, 7467, 7495, 7523, 7549, 7575, 7600
1771 u32 tmp_val = 0,
exp = 0, mant = 0;
1776 buf[0] = dib7000p_read_word(state, 0x184);
1777 buf[1] = dib7000p_read_word(state, 0x185);
1778 pow_i = (buf[0] << 16) | buf[1];
1779 dprintk(
"raw pow_i = %d", pow_i);
1782 while (tmp_val >>= 1)
1785 mant = (pow_i * 1000 / (1 <<
exp));
1786 dprintk(
" mant = %d exp = %d", mant / 1000,
exp);
1788 ix = (
u8) ((mant - 1000) / 100);
1791 pow_i = (lut_1000ln_mant[ix] + 693 * (
exp - 20) - 6908);
1792 pow_i = (pow_i << 8) / 1000;
1793 dprintk(
" pow_i = %d", pow_i);
1798 static int map_addr_to_serpar_number(
struct i2c_msg *
msg)
1800 if ((msg->
buf[0] <= 15))
1802 else if (msg->
buf[0] == 17)
1804 else if (msg->
buf[0] == 16)
1806 else if (msg->
buf[0] == 19)
1808 else if (msg->
buf[0] >= 21 && msg->
buf[0] <= 25)
1810 else if (msg->
buf[0] == 28)
1822 u16 serpar_num = msg[0].
buf[0];
1824 while (n_overflow == 1 && i) {
1825 n_overflow = (dib7000p_read_word(state, 1984) >> 1) & 0x1;
1828 dprintk(
"Tuner ITF: write busy (overflow)");
1830 dib7000p_write_word(state, 1985, (1 << 6) | (serpar_num & 0x3f));
1831 dib7000p_write_word(state, 1986, (msg[0].buf[1] << 8) | msg[0].buf[2]);
1836 static int w7090p_tuner_read_serpar(
struct i2c_adapter *i2c_adap,
struct i2c_msg msg[],
int num)
1839 u8 n_overflow = 1, n_empty = 1;
1841 u16 serpar_num = msg[0].
buf[0];
1844 while (n_overflow == 1 && i) {
1845 n_overflow = (dib7000p_read_word(state, 1984) >> 1) & 0x1;
1848 dprintk(
"TunerITF: read busy (overflow)");
1850 dib7000p_write_word(state, 1985, (0 << 6) | (serpar_num & 0x3f));
1853 while (n_empty == 1 && i) {
1854 n_empty = dib7000p_read_word(state, 1984) & 0x1;
1857 dprintk(
"TunerITF: read busy (empty)");
1859 read_word = dib7000p_read_word(state, 1987);
1860 msg[1].
buf[0] = (read_word >> 8) & 0xff;
1861 msg[1].
buf[1] = (read_word) & 0xff;
1866 static int w7090p_tuner_rw_serpar(
struct i2c_adapter *i2c_adap,
struct i2c_msg msg[],
int num)
1868 if (map_addr_to_serpar_number(&msg[0]) == 0) {
1870 return w7090p_tuner_write_serpar(i2c_adap, msg, 1);
1872 return w7090p_tuner_read_serpar(i2c_adap, msg, 2);
1878 static int dib7090p_rw_on_apb(
struct i2c_adapter *i2c_adap,
1879 struct i2c_msg msg[],
int num,
u16 apb_address)
1885 dib7000p_write_word(state, apb_address, ((msg[0].buf[1] << 8) | (msg[0].buf[2])));
1887 word = dib7000p_read_word(state, apb_address);
1888 msg[1].
buf[0] = (word >> 8) & 0xff;
1889 msg[1].
buf[1] = (
word) & 0xff;
1895 static int dib7090_tuner_xfer(
struct i2c_adapter *i2c_adap,
struct i2c_msg msg[],
int num)
1901 switch (msg[0].buf[0]) {
1987 i = ((dib7000p_read_word(state, 72) >> 12) & 0x3);
1988 word = dib7000p_read_word(state, 384 + i);
1989 msg[1].
buf[0] = (word >> 8) & 0xff;
1990 msg[1].
buf[1] = (
word) & 0xff;
1994 word = (
u16) ((msg[0].buf[1] << 8) | msg[0].
buf[2]);
1996 word = (dib7000p_read_word(state, 72) & ~(3 << 12)) | (word << 12);
1997 dib7000p_write_word(state, 72, word);
2002 if (apb_address != 0)
2003 return dib7090p_rw_on_apb(i2c_adap, msg, num, apb_address);
2005 return w7090p_tuner_rw_serpar(i2c_adap, msg, num);
2016 .master_xfer = dib7090_tuner_xfer,
2017 .functionality = dib7000p_i2c_func,
2032 reg = dib7000p_read_word(state, 1798) & ~((0x7) | (0x7 << 6) | (0x7 << 12));
2033 reg |= (drive << 12) | (drive << 6) | drive;
2034 dib7000p_write_word(state, 1798, reg);
2037 reg = dib7000p_read_word(state, 1799) & ~((0x7 << 2) | (0x7 << 8));
2038 reg |= (drive << 8) | (drive << 2);
2039 dib7000p_write_word(state, 1799, reg);
2042 reg = dib7000p_read_word(state, 1800) & ~((0x7) | (0x7 << 6) | (0x7 << 12));
2043 reg |= (drive << 12) | (drive << 6) | drive;
2044 dib7000p_write_word(state, 1800, reg);
2047 reg = dib7000p_read_word(state, 1801) & ~((0x7 << 2) | (0x7 << 8));
2048 reg |= (drive << 8) | (drive << 2);
2049 dib7000p_write_word(state, 1801, reg);
2052 reg = dib7000p_read_word(state, 1802) & ~((0x7) | (0x7 << 6) | (0x7 << 12));
2053 reg |= (drive << 12) | (drive << 6) | drive;
2054 dib7000p_write_word(state, 1802, reg);
2059 static u32 dib7090_calcSyncFreq(
u32 P_Kin,
u32 P_Kout,
u32 insertExtSynchro,
u32 syncSize)
2062 u32 nom = (insertExtSynchro * P_Kin + syncSize);
2064 u32 syncFreq = ((nom << quantif) / denom);
2066 if ((syncFreq & ((1 << quantif) - 1)) != 0)
2067 syncFreq = (syncFreq >> quantif) + 1;
2069 syncFreq = (syncFreq >> quantif);
2072 syncFreq = syncFreq - 1;
2079 dprintk(
"Configure DibStream Tx");
2081 dib7000p_write_word(state, 1615, 1);
2082 dib7000p_write_word(state, 1603, P_Kin);
2083 dib7000p_write_word(state, 1605, P_Kout);
2084 dib7000p_write_word(state, 1606, insertExtSynchro);
2085 dib7000p_write_word(state, 1608, synchroMode);
2086 dib7000p_write_word(state, 1609, (syncWord >> 16) & 0xffff);
2087 dib7000p_write_word(state, 1610, syncWord & 0xffff);
2088 dib7000p_write_word(state, 1612, syncSize);
2089 dib7000p_write_word(state, 1615, 0);
2099 dprintk(
"Configure DibStream Rx");
2100 if ((P_Kin != 0) && (P_Kout != 0)) {
2101 syncFreq = dib7090_calcSyncFreq(P_Kin, P_Kout, insertExtSynchro, syncSize);
2102 dib7000p_write_word(state, 1542, syncFreq);
2104 dib7000p_write_word(state, 1554, 1);
2105 dib7000p_write_word(state, 1536, P_Kin);
2106 dib7000p_write_word(state, 1537, P_Kout);
2107 dib7000p_write_word(state, 1539, synchroMode);
2108 dib7000p_write_word(state, 1540, (syncWord >> 16) & 0xffff);
2109 dib7000p_write_word(state, 1541, syncWord & 0xffff);
2110 dib7000p_write_word(state, 1543, syncSize);
2111 dib7000p_write_word(state, 1544, dataOutRate);
2112 dib7000p_write_word(state, 1554, 0);
2117 static void dib7090_enMpegMux(
struct dib7000p_state *state,
int onoff)
2119 u16 reg_1287 = dib7000p_read_word(state, 1287);
2123 reg_1287 &= ~(1<<7);
2130 dib7000p_write_word(state, 1287, reg_1287);
2134 u16 pulseWidth,
u16 enSerialMode,
u16 enSerialClkDiv2)
2138 dib7090_enMpegMux(state, 0);
2142 enSerialClkDiv2 = 0;
2144 dib7000p_write_word(state, 1287, ((pulseWidth & 0x1f) << 2)
2145 | ((enSerialMode & 0x1) << 1)
2146 | (enSerialClkDiv2 & 0x1));
2148 dib7090_enMpegMux(state, 1);
2151 static void dib7090_setDibTxMux(
struct dib7000p_state *state,
int mode)
2153 u16 reg_1288 = dib7000p_read_word(state, 1288) & ~(0x7 << 7);
2157 dprintk(
"SET MPEG ON DIBSTREAM TX");
2158 dib7090_cfg_DibTx(state, 8, 5, 0, 0, 0, 0);
2162 dprintk(
"SET DIV_OUT ON DIBSTREAM TX");
2163 dib7090_cfg_DibTx(state, 5, 5, 0, 0, 0, 0);
2167 dprintk(
"SET ADC_OUT ON DIBSTREAM TX");
2168 dib7090_cfg_DibTx(state, 20, 5, 10, 0, 0, 0);
2174 dib7000p_write_word(state, 1288, reg_1288);
2177 static void dib7090_setHostBusMux(
struct dib7000p_state *state,
int mode)
2179 u16 reg_1288 = dib7000p_read_word(state, 1288) & ~(0x7 << 4);
2183 dprintk(
"SET DEM OUT OLD INTERF ON HOST BUS");
2184 dib7090_enMpegMux(state, 0);
2188 dprintk(
"SET DIBSTREAM TX ON HOST BUS");
2189 dib7090_enMpegMux(state, 0);
2193 dprintk(
"SET MPEG MUX ON HOST BUS");
2199 dib7000p_write_word(state, 1288, reg_1288);
2202 int dib7090_set_diversity_in(
struct dvb_frontend *fe,
int onoff)
2209 dprintk(
"%s mode OFF : by default Enable Mpeg INPUT", __func__);
2210 dib7090_cfg_DibRx(state, 8, 5, 0, 0, 0, 8, 0);
2214 reg_1287 = dib7000p_read_word(state, 1287);
2216 if ((reg_1287 & 0x1) == 1) {
2219 dib7000p_write_word(state, 1287, reg_1287);
2225 dprintk(
"%s ON : Enable diversity INPUT", __func__);
2226 dib7090_cfg_DibRx(state, 5, 5, 0, 0, 0, 0, 0);
2231 dib7000p_set_diversity_in(&state->
demod, onoff);
2235 static int dib7090_set_output_mode(
struct dvb_frontend *fe,
int mode)
2239 u16 outreg, smo_mode, fifo_threshold;
2240 u8 prefer_mpeg_mux_use = 1;
2243 dib7090_host_bus_drive(state, 1);
2245 fifo_threshold = 1792;
2246 smo_mode = (dib7000p_read_word(state, 235) & 0x0050) | (1 << 1);
2247 outreg = dib7000p_read_word(state, 1286) & ~((1 << 10) | (0x7 << 6) | (1 << 1));
2255 if (prefer_mpeg_mux_use) {
2256 dprintk(
"setting output mode TS_SERIAL using Mpeg Mux");
2257 dib7090_configMpegMux(state, 3, 1, 1);
2260 dprintk(
"setting output mode TS_SERIAL using Smooth bloc");
2262 outreg |= (2<<6) | (0 << 1);
2267 if (prefer_mpeg_mux_use) {
2268 dprintk(
"setting output mode TS_PARALLEL_GATED using Mpeg Mux");
2269 dib7090_configMpegMux(state, 2, 0, 0);
2272 dprintk(
"setting output mode TS_PARALLEL_GATED using Smooth block");
2279 dprintk(
"setting output mode TS_PARALLEL_CONT using Smooth block");
2285 dprintk(
"setting output mode TS_FIFO using Smooth block");
2288 smo_mode |= (3 << 1);
2289 fifo_threshold = 512;
2293 dprintk(
"setting output mode MODE_DIVERSITY");
2299 dprintk(
"setting output mode MODE_ANALOG_ADC");
2305 outreg |= (1 << 10);
2307 if (state->
cfg.output_mpeg2_in_188_bytes)
2308 smo_mode |= (1 << 5);
2310 ret |= dib7000p_write_word(state, 235, smo_mode);
2311 ret |= dib7000p_write_word(state, 236, fifo_threshold);
2312 ret |= dib7000p_write_word(state, 1286, outreg);
2322 dprintk(
"sleep dib7090: %d", onoff);
2324 en_cur_state = dib7000p_read_word(state, 1922);
2326 if (en_cur_state > 0xff)
2330 en_cur_state &= 0x00ff;
2336 dib7000p_write_word(state, 1922, en_cur_state);
2344 return dib7000p_get_adc_power(fe);
2353 reg = dib7000p_read_word(state, 1794);
2354 dib7000p_write_word(state, 1794, reg | (4 << 12));
2356 dib7000p_write_word(state, 1032, 0xffff);
2387 dib7000p_write_word(st, 1287, 0x0003);
2389 if (dib7000p_identify(st) != 0)
2392 st->
version = dib7000p_read_word(st, 897);
2397 st->
i2c_master.gated_tuner_i2c_adap.dev.parent = i2c_adap->
dev.parent;
2409 dib7000p_demod_reset(st);
2412 dib7090_set_output_mode(demod, st->
cfg.output_mode);
2413 dib7090_set_diversity_in(demod, 0);
2427 .name =
"DiBcom 7000PC",
2428 .frequency_min = 44250000,
2429 .frequency_max = 867250000,
2430 .frequency_stepsize = 62500,
2438 .release = dib7000p_release,
2440 .init = dib7000p_wakeup,
2441 .sleep = dib7000p_sleep,
2443 .set_frontend = dib7000p_set_frontend,
2444 .get_tune_settings = dib7000p_fe_get_tune_settings,
2445 .get_frontend = dib7000p_get_frontend,
2447 .read_status = dib7000p_read_status,
2448 .read_ber = dib7000p_read_ber,
2449 .read_signal_strength = dib7000p_read_signal_strength,
2450 .read_snr = dib7000p_read_snr,
2451 .read_ucblocks = dib7000p_read_unc_blocks,