2 * Driver for DiBcom DiB3000MC/P-demodulator.
4 * Copyright (C) 2004-7 DiBcom (http://www.dibcom.fr/)
5 * Copyright (C) 2004-5 Patrick Boettcher (patrick.boettcher@desy.de)
7 * This code is partially based on the previous dib3000mc.c .
9 * This program is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU General Public License as
11 * published by the Free Software Foundation, version 2.
14 #include <linux/kernel.h>
15 #include <linux/slab.h>
16 #include <linux/i2c.h>
18 #include "dvb_frontend.h"
20 #include "dib3000mc.h"
23 module_param(debug, int, 0644);
24 MODULE_PARM_DESC(debug, "turn on debugging (default: 0)");
26 static int buggy_sfn_workaround;
27 module_param(buggy_sfn_workaround, int, 0644);
28 MODULE_PARM_DESC(buggy_sfn_workaround, "Enable work-around for buggy SFNs (default: 0)");
30 #define dprintk(args...) do { if (debug) { printk(KERN_DEBUG "DiB3000MC/P:"); printk(args); printk("\n"); } } while (0)
32 struct dib3000mc_state {
33 struct dvb_frontend demod;
34 struct dib3000mc_config *cfg;
37 struct i2c_adapter *i2c_adap;
39 struct dibx000_i2c_master i2c_master;
43 fe_bandwidth_t current_bandwidth;
47 u8 sfn_workaround_active :1;
50 static u16 dib3000mc_read_word(struct dib3000mc_state *state, u16 reg)
52 u8 wb[2] = { (reg >> 8) | 0x80, reg & 0xff };
54 struct i2c_msg msg[2] = {
55 { .addr = state->i2c_addr >> 1, .flags = 0, .buf = wb, .len = 2 },
56 { .addr = state->i2c_addr >> 1, .flags = I2C_M_RD, .buf = rb, .len = 2 },
59 if (i2c_transfer(state->i2c_adap, msg, 2) != 2)
60 dprintk("i2c read error on %d\n",reg);
62 return (rb[0] << 8) | rb[1];
65 static int dib3000mc_write_word(struct dib3000mc_state *state, u16 reg, u16 val)
68 (reg >> 8) & 0xff, reg & 0xff,
69 (val >> 8) & 0xff, val & 0xff,
71 struct i2c_msg msg = {
72 .addr = state->i2c_addr >> 1, .flags = 0, .buf = b, .len = 4
74 return i2c_transfer(state->i2c_adap, &msg, 1) != 1 ? -EREMOTEIO : 0;
77 static int dib3000mc_identify(struct dib3000mc_state *state)
80 if ((value = dib3000mc_read_word(state, 1025)) != 0x01b3) {
81 dprintk("-E- DiB3000MC/P: wrong Vendor ID (read=0x%x)\n",value);
85 value = dib3000mc_read_word(state, 1026);
86 if (value != 0x3001 && value != 0x3002) {
87 dprintk("-E- DiB3000MC/P: wrong Device ID (%x)\n",value);
90 state->dev_id = value;
92 dprintk("-I- found DiB3000MC/P: %x\n",state->dev_id);
97 static int dib3000mc_set_timing(struct dib3000mc_state *state, s16 nfft, u32 bw, u8 update_offset)
101 if (state->timf == 0) {
102 timf = 1384402; // default value for 8MHz
104 msleep(200); // first time we do an update
111 s16 tim_offs = dib3000mc_read_word(state, 416);
113 if (tim_offs & 0x2000)
116 if (nfft == TRANSMISSION_MODE_2K)
120 state->timf = timf / (bw / 1000);
123 dprintk("timf: %d\n", timf);
125 dib3000mc_write_word(state, 23, (u16) (timf >> 16));
126 dib3000mc_write_word(state, 24, (u16) (timf ) & 0xffff);
131 static int dib3000mc_setup_pwm_state(struct dib3000mc_state *state)
133 u16 reg_51, reg_52 = state->cfg->agc->setup & 0xfefb;
134 if (state->cfg->pwm3_inversion) {
135 reg_51 = (2 << 14) | (0 << 10) | (7 << 6) | (2 << 2) | (2 << 0);
138 reg_51 = (2 << 14) | (4 << 10) | (7 << 6) | (2 << 2) | (2 << 0);
141 dib3000mc_write_word(state, 51, reg_51);
142 dib3000mc_write_word(state, 52, reg_52);
144 if (state->cfg->use_pwm3)
145 dib3000mc_write_word(state, 245, (1 << 3) | (1 << 0));
147 dib3000mc_write_word(state, 245, 0);
149 dib3000mc_write_word(state, 1040, 0x3);
153 static int dib3000mc_set_output_mode(struct dib3000mc_state *state, int mode)
156 u16 fifo_threshold = 1792;
160 u16 smo_reg = dib3000mc_read_word(state, 206) & 0x0010; /* keep the pid_parse bit */
162 dprintk("-I- Setting output mode for demod %p to %d\n",
163 &state->demod, mode);
166 case OUTMODE_HIGH_Z: // disable
169 case OUTMODE_MPEG2_PAR_GATED_CLK: // STBs with parallel gated clock
172 case OUTMODE_MPEG2_PAR_CONT_CLK: // STBs with parallel continues clock
175 case OUTMODE_MPEG2_SERIAL: // STBs with serial input
178 case OUTMODE_MPEG2_FIFO: // e.g. USB feeding
181 P_smo_error_discard [1;6:6] = 0
182 P_smo_rs_discard [1;5:5] = 0
183 P_smo_pid_parse [1;4:4] = 0
184 P_smo_fifo_flush [1;3:3] = 0
185 P_smo_mode [2;2:1] = 11
186 P_smo_ovf_prot [1;0:0] = 0
189 fifo_threshold = 512;
192 case OUTMODE_DIVERSITY:
197 dprintk("Unhandled output_mode passed to be set for demod %p\n",&state->demod);
202 if ((state->cfg->output_mpeg2_in_188_bytes))
203 smo_reg |= (1 << 5); // P_smo_rs_discard [1;5:5] = 1
205 outreg = dib3000mc_read_word(state, 244) & 0x07FF;
206 outreg |= (outmode << 11);
207 ret |= dib3000mc_write_word(state, 244, outreg);
208 ret |= dib3000mc_write_word(state, 206, smo_reg); /*smo_ mode*/
209 ret |= dib3000mc_write_word(state, 207, fifo_threshold); /* synchronous fread */
210 ret |= dib3000mc_write_word(state, 1040, elecout); /* P_out_cfg */
214 static int dib3000mc_set_bandwidth(struct dib3000mc_state *state, u32 bw)
216 u16 bw_cfg[6] = { 0 };
217 u16 imp_bw_cfg[3] = { 0 };
220 /* settings here are for 27.7MHz */
223 bw_cfg[0] = 0x0019; bw_cfg[1] = 0x5c30; bw_cfg[2] = 0x0054; bw_cfg[3] = 0x88a0; bw_cfg[4] = 0x01a6; bw_cfg[5] = 0xab20;
224 imp_bw_cfg[0] = 0x04db; imp_bw_cfg[1] = 0x00db; imp_bw_cfg[2] = 0x00b7;
228 bw_cfg[0] = 0x001c; bw_cfg[1] = 0xfba5; bw_cfg[2] = 0x0060; bw_cfg[3] = 0x9c25; bw_cfg[4] = 0x01e3; bw_cfg[5] = 0x0cb7;
229 imp_bw_cfg[0] = 0x04c0; imp_bw_cfg[1] = 0x00c0; imp_bw_cfg[2] = 0x00a0;
233 bw_cfg[0] = 0x0021; bw_cfg[1] = 0xd040; bw_cfg[2] = 0x0070; bw_cfg[3] = 0xb62b; bw_cfg[4] = 0x0233; bw_cfg[5] = 0x8ed5;
234 imp_bw_cfg[0] = 0x04a5; imp_bw_cfg[1] = 0x00a5; imp_bw_cfg[2] = 0x0089;
238 bw_cfg[0] = 0x0028; bw_cfg[1] = 0x9380; bw_cfg[2] = 0x0087; bw_cfg[3] = 0x4100; bw_cfg[4] = 0x02a4; bw_cfg[5] = 0x4500;
239 imp_bw_cfg[0] = 0x0489; imp_bw_cfg[1] = 0x0089; imp_bw_cfg[2] = 0x0072;
242 default: return -EINVAL;
245 for (reg = 6; reg < 12; reg++)
246 dib3000mc_write_word(state, reg, bw_cfg[reg - 6]);
247 dib3000mc_write_word(state, 12, 0x0000);
248 dib3000mc_write_word(state, 13, 0x03e8);
249 dib3000mc_write_word(state, 14, 0x0000);
250 dib3000mc_write_word(state, 15, 0x03f2);
251 dib3000mc_write_word(state, 16, 0x0001);
252 dib3000mc_write_word(state, 17, 0xb0d0);
254 dib3000mc_write_word(state, 18, 0x0393);
255 dib3000mc_write_word(state, 19, 0x8700);
257 for (reg = 55; reg < 58; reg++)
258 dib3000mc_write_word(state, reg, imp_bw_cfg[reg - 55]);
260 // Timing configuration
261 dib3000mc_set_timing(state, TRANSMISSION_MODE_2K, bw, 0);
266 static u16 impulse_noise_val[29] =
269 0x38, 0x6d9, 0x3f28, 0x7a7, 0x3a74, 0x196, 0x32a, 0x48c, 0x3ffe, 0x7f3,
270 0x2d94, 0x76, 0x53d, 0x3ff8, 0x7e3, 0x3320, 0x76, 0x5b3, 0x3feb, 0x7d2,
271 0x365e, 0x76, 0x48c, 0x3ffe, 0x5b3, 0x3feb, 0x76, 0x0000, 0xd
274 static void dib3000mc_set_impulse_noise(struct dib3000mc_state *state, u8 mode, s16 nfft)
277 for (i = 58; i < 87; i++)
278 dib3000mc_write_word(state, i, impulse_noise_val[i-58]);
280 if (nfft == TRANSMISSION_MODE_8K) {
281 dib3000mc_write_word(state, 58, 0x3b);
282 dib3000mc_write_word(state, 84, 0x00);
283 dib3000mc_write_word(state, 85, 0x8200);
286 dib3000mc_write_word(state, 34, 0x1294);
287 dib3000mc_write_word(state, 35, 0x1ff8);
289 dib3000mc_write_word(state, 55, dib3000mc_read_word(state, 55) | (1 << 10));
292 static int dib3000mc_init(struct dvb_frontend *demod)
294 struct dib3000mc_state *state = demod->demodulator_priv;
295 struct dibx000_agc_config *agc = state->cfg->agc;
297 // Restart Configuration
298 dib3000mc_write_word(state, 1027, 0x8000);
299 dib3000mc_write_word(state, 1027, 0x0000);
301 // power up the demod + mobility configuration
302 dib3000mc_write_word(state, 140, 0x0000);
303 dib3000mc_write_word(state, 1031, 0);
305 if (state->cfg->mobile_mode) {
306 dib3000mc_write_word(state, 139, 0x0000);
307 dib3000mc_write_word(state, 141, 0x0000);
308 dib3000mc_write_word(state, 175, 0x0002);
309 dib3000mc_write_word(state, 1032, 0x0000);
311 dib3000mc_write_word(state, 139, 0x0001);
312 dib3000mc_write_word(state, 141, 0x0000);
313 dib3000mc_write_word(state, 175, 0x0000);
314 dib3000mc_write_word(state, 1032, 0x012C);
316 dib3000mc_write_word(state, 1033, 0x0000);
319 dib3000mc_write_word(state, 1037, 0x3130);
321 // other configurations
324 dib3000mc_write_word(state, 33, (5 << 0));
325 dib3000mc_write_word(state, 88, (1 << 10) | (0x10 << 0));
327 // Phase noise control
328 // P_fft_phacor_inh, P_fft_phacor_cpe, P_fft_powrange
329 dib3000mc_write_word(state, 99, (1 << 9) | (0x20 << 0));
331 if (state->cfg->phase_noise_mode == 0)
332 dib3000mc_write_word(state, 111, 0x00);
334 dib3000mc_write_word(state, 111, 0x02);
337 dib3000mc_write_word(state, 50, 0x8000);
340 dib3000mc_setup_pwm_state(state);
342 // P_agc_counter_lock
343 dib3000mc_write_word(state, 53, 0x87);
344 // P_agc_counter_unlock
345 dib3000mc_write_word(state, 54, 0x87);
348 dib3000mc_write_word(state, 36, state->cfg->max_time);
349 dib3000mc_write_word(state, 37, (state->cfg->agc_command1 << 13) | (state->cfg->agc_command2 << 12) | (0x1d << 0));
350 dib3000mc_write_word(state, 38, state->cfg->pwm3_value);
351 dib3000mc_write_word(state, 39, state->cfg->ln_adc_level);
354 dib3000mc_write_word(state, 40, 0x0179);
355 dib3000mc_write_word(state, 41, 0x03f0);
357 dib3000mc_write_word(state, 42, agc->agc1_max);
358 dib3000mc_write_word(state, 43, agc->agc1_min);
359 dib3000mc_write_word(state, 44, agc->agc2_max);
360 dib3000mc_write_word(state, 45, agc->agc2_min);
361 dib3000mc_write_word(state, 46, (agc->agc1_pt1 << 8) | agc->agc1_pt2);
362 dib3000mc_write_word(state, 47, (agc->agc1_slope1 << 8) | agc->agc1_slope2);
363 dib3000mc_write_word(state, 48, (agc->agc2_pt1 << 8) | agc->agc2_pt2);
364 dib3000mc_write_word(state, 49, (agc->agc2_slope1 << 8) | agc->agc2_slope2);
366 // Begin: TimeOut registers
368 dib3000mc_write_word(state, 110, 3277);
369 // P_timf_alpha = 6, P_corm_alpha = 6, P_corm_thres = 0x80
370 dib3000mc_write_word(state, 26, 0x6680);
372 dib3000mc_write_word(state, 1, 4);
374 dib3000mc_write_word(state, 2, 4);
376 dib3000mc_write_word(state, 3, 0x1000);
377 // P_search_maxtrial=1
378 dib3000mc_write_word(state, 5, 1);
380 dib3000mc_set_bandwidth(state, 8000);
383 dib3000mc_write_word(state, 4, 0x814);
385 dib3000mc_write_word(state, 21, (1 << 9) | 0x164);
386 dib3000mc_write_word(state, 22, 0x463d);
389 // P_cspu_regul, P_cspu_win_cut
390 dib3000mc_write_word(state, 120, 0x200f);
392 dib3000mc_write_word(state, 134, 0);
395 dib3000mc_write_word(state, 195, 0x10);
397 // diversity register: P_dvsy_sync_wait..
398 dib3000mc_write_word(state, 180, 0x2FF0);
400 // Impulse noise configuration
401 dib3000mc_set_impulse_noise(state, 0, TRANSMISSION_MODE_8K);
403 // output mode set-up
404 dib3000mc_set_output_mode(state, OUTMODE_HIGH_Z);
406 /* close the i2c-gate */
407 dib3000mc_write_word(state, 769, (1 << 7) );
412 static int dib3000mc_sleep(struct dvb_frontend *demod)
414 struct dib3000mc_state *state = demod->demodulator_priv;
416 dib3000mc_write_word(state, 1031, 0xFFFF);
417 dib3000mc_write_word(state, 1032, 0xFFFF);
418 dib3000mc_write_word(state, 1033, 0xFFF0);
423 static void dib3000mc_set_adp_cfg(struct dib3000mc_state *state, s16 qam)
425 u16 cfg[4] = { 0 },reg;
428 cfg[0] = 0x099a; cfg[1] = 0x7fae; cfg[2] = 0x0333; cfg[3] = 0x7ff0;
431 cfg[0] = 0x023d; cfg[1] = 0x7fdf; cfg[2] = 0x00a4; cfg[3] = 0x7ff0;
434 cfg[0] = 0x0148; cfg[1] = 0x7ff0; cfg[2] = 0x00a4; cfg[3] = 0x7ff8;
437 for (reg = 129; reg < 133; reg++)
438 dib3000mc_write_word(state, reg, cfg[reg - 129]);
441 static void dib3000mc_set_channel_cfg(struct dib3000mc_state *state,
442 struct dtv_frontend_properties *ch, u16 seq)
445 u32 bw = BANDWIDTH_TO_KHZ(ch->bandwidth_hz);
447 dib3000mc_set_bandwidth(state, bw);
448 dib3000mc_set_timing(state, ch->transmission_mode, bw, 0);
451 // dib3000mc_write_word(state, 100, (11 << 6) + 6);
453 dib3000mc_write_word(state, 100, (16 << 6) + 9);
455 dib3000mc_write_word(state, 1027, 0x0800);
456 dib3000mc_write_word(state, 1027, 0x0000);
458 //Default cfg isi offset adp
459 dib3000mc_write_word(state, 26, 0x6680);
460 dib3000mc_write_word(state, 29, 0x1273);
461 dib3000mc_write_word(state, 33, 5);
462 dib3000mc_set_adp_cfg(state, QAM_16);
463 dib3000mc_write_word(state, 133, 15564);
465 dib3000mc_write_word(state, 12 , 0x0);
466 dib3000mc_write_word(state, 13 , 0x3e8);
467 dib3000mc_write_word(state, 14 , 0x0);
468 dib3000mc_write_word(state, 15 , 0x3f2);
470 dib3000mc_write_word(state, 93,0);
471 dib3000mc_write_word(state, 94,0);
472 dib3000mc_write_word(state, 95,0);
473 dib3000mc_write_word(state, 96,0);
474 dib3000mc_write_word(state, 97,0);
475 dib3000mc_write_word(state, 98,0);
477 dib3000mc_set_impulse_noise(state, 0, ch->transmission_mode);
480 switch (ch->transmission_mode) {
481 case TRANSMISSION_MODE_2K: value |= (0 << 7); break;
483 case TRANSMISSION_MODE_8K: value |= (1 << 7); break;
485 switch (ch->guard_interval) {
486 case GUARD_INTERVAL_1_32: value |= (0 << 5); break;
487 case GUARD_INTERVAL_1_16: value |= (1 << 5); break;
488 case GUARD_INTERVAL_1_4: value |= (3 << 5); break;
490 case GUARD_INTERVAL_1_8: value |= (2 << 5); break;
492 switch (ch->modulation) {
493 case QPSK: value |= (0 << 3); break;
494 case QAM_16: value |= (1 << 3); break;
496 case QAM_64: value |= (2 << 3); break;
498 switch (HIERARCHY_1) {
499 case HIERARCHY_2: value |= 2; break;
500 case HIERARCHY_4: value |= 4; break;
502 case HIERARCHY_1: value |= 1; break;
504 dib3000mc_write_word(state, 0, value);
505 dib3000mc_write_word(state, 5, (1 << 8) | ((seq & 0xf) << 4));
508 if (ch->hierarchy == 1)
512 switch ((ch->hierarchy == 0 || 1 == 1) ? ch->code_rate_HP : ch->code_rate_LP) {
513 case FEC_2_3: value |= (2 << 1); break;
514 case FEC_3_4: value |= (3 << 1); break;
515 case FEC_5_6: value |= (5 << 1); break;
516 case FEC_7_8: value |= (7 << 1); break;
518 case FEC_1_2: value |= (1 << 1); break;
520 dib3000mc_write_word(state, 181, value);
522 // diversity synchro delay add 50% SFN margin
523 switch (ch->transmission_mode) {
524 case TRANSMISSION_MODE_8K: value = 256; break;
525 case TRANSMISSION_MODE_2K:
526 default: value = 64; break;
528 switch (ch->guard_interval) {
529 case GUARD_INTERVAL_1_16: value *= 2; break;
530 case GUARD_INTERVAL_1_8: value *= 4; break;
531 case GUARD_INTERVAL_1_4: value *= 8; break;
533 case GUARD_INTERVAL_1_32: value *= 1; break;
536 value |= dib3000mc_read_word(state, 180) & 0x000f;
537 dib3000mc_write_word(state, 180, value);
540 value = dib3000mc_read_word(state, 0);
541 dib3000mc_write_word(state, 0, value | (1 << 9));
542 dib3000mc_write_word(state, 0, value);
546 dib3000mc_set_impulse_noise(state, state->cfg->impulse_noise_mode, ch->transmission_mode);
549 static int dib3000mc_autosearch_start(struct dvb_frontend *demod)
551 struct dtv_frontend_properties *chan = &demod->dtv_property_cache;
552 struct dib3000mc_state *state = demod->demodulator_priv;
555 struct dtv_frontend_properties schan;
559 /* TODO what is that ? */
561 /* a channel for autosearch */
562 schan.transmission_mode = TRANSMISSION_MODE_8K;
563 schan.guard_interval = GUARD_INTERVAL_1_32;
564 schan.modulation = QAM_64;
565 schan.code_rate_HP = FEC_2_3;
566 schan.code_rate_LP = FEC_2_3;
569 dib3000mc_set_channel_cfg(state, &schan, 11);
571 reg = dib3000mc_read_word(state, 0);
572 dib3000mc_write_word(state, 0, reg | (1 << 8));
573 dib3000mc_read_word(state, 511);
574 dib3000mc_write_word(state, 0, reg);
579 static int dib3000mc_autosearch_is_irq(struct dvb_frontend *demod)
581 struct dib3000mc_state *state = demod->demodulator_priv;
582 u16 irq_pending = dib3000mc_read_word(state, 511);
584 if (irq_pending & 0x1) // failed
587 if (irq_pending & 0x2) // succeeded
590 return 0; // still pending
593 static int dib3000mc_tune(struct dvb_frontend *demod)
595 struct dtv_frontend_properties *ch = &demod->dtv_property_cache;
596 struct dib3000mc_state *state = demod->demodulator_priv;
598 // ** configure demod **
599 dib3000mc_set_channel_cfg(state, ch, 0);
602 if (state->sfn_workaround_active) {
603 dprintk("SFN workaround is active\n");
604 dib3000mc_write_word(state, 29, 0x1273);
605 dib3000mc_write_word(state, 108, 0x4000); // P_pha3_force_pha_shift
607 dib3000mc_write_word(state, 29, 0x1073);
608 dib3000mc_write_word(state, 108, 0x0000); // P_pha3_force_pha_shift
611 dib3000mc_set_adp_cfg(state, (u8)ch->modulation);
612 if (ch->transmission_mode == TRANSMISSION_MODE_8K) {
613 dib3000mc_write_word(state, 26, 38528);
614 dib3000mc_write_word(state, 33, 8);
616 dib3000mc_write_word(state, 26, 30336);
617 dib3000mc_write_word(state, 33, 6);
620 if (dib3000mc_read_word(state, 509) & 0x80)
621 dib3000mc_set_timing(state, ch->transmission_mode,
622 BANDWIDTH_TO_KHZ(ch->bandwidth_hz), 1);
627 struct i2c_adapter * dib3000mc_get_tuner_i2c_master(struct dvb_frontend *demod, int gating)
629 struct dib3000mc_state *st = demod->demodulator_priv;
630 return dibx000_get_i2c_adapter(&st->i2c_master, DIBX000_I2C_INTERFACE_TUNER, gating);
633 EXPORT_SYMBOL(dib3000mc_get_tuner_i2c_master);
635 static int dib3000mc_get_frontend(struct dvb_frontend* fe,
636 struct dtv_frontend_properties *fep)
638 struct dib3000mc_state *state = fe->demodulator_priv;
639 u16 tps = dib3000mc_read_word(state,458);
641 fep->inversion = INVERSION_AUTO;
643 fep->bandwidth_hz = state->current_bandwidth;
645 switch ((tps >> 8) & 0x1) {
646 case 0: fep->transmission_mode = TRANSMISSION_MODE_2K; break;
647 case 1: fep->transmission_mode = TRANSMISSION_MODE_8K; break;
651 case 0: fep->guard_interval = GUARD_INTERVAL_1_32; break;
652 case 1: fep->guard_interval = GUARD_INTERVAL_1_16; break;
653 case 2: fep->guard_interval = GUARD_INTERVAL_1_8; break;
654 case 3: fep->guard_interval = GUARD_INTERVAL_1_4; break;
657 switch ((tps >> 13) & 0x3) {
658 case 0: fep->modulation = QPSK; break;
659 case 1: fep->modulation = QAM_16; break;
661 default: fep->modulation = QAM_64; break;
664 /* as long as the frontend_param structure is fixed for hierarchical transmission I refuse to use it */
665 /* (tps >> 12) & 0x1 == hrch is used, (tps >> 9) & 0x7 == alpha */
667 fep->hierarchy = HIERARCHY_NONE;
668 switch ((tps >> 5) & 0x7) {
669 case 1: fep->code_rate_HP = FEC_1_2; break;
670 case 2: fep->code_rate_HP = FEC_2_3; break;
671 case 3: fep->code_rate_HP = FEC_3_4; break;
672 case 5: fep->code_rate_HP = FEC_5_6; break;
674 default: fep->code_rate_HP = FEC_7_8; break;
678 switch ((tps >> 2) & 0x7) {
679 case 1: fep->code_rate_LP = FEC_1_2; break;
680 case 2: fep->code_rate_LP = FEC_2_3; break;
681 case 3: fep->code_rate_LP = FEC_3_4; break;
682 case 5: fep->code_rate_LP = FEC_5_6; break;
684 default: fep->code_rate_LP = FEC_7_8; break;
690 static int dib3000mc_set_frontend(struct dvb_frontend *fe)
692 struct dtv_frontend_properties *fep = &fe->dtv_property_cache, tmp;
693 struct dib3000mc_state *state = fe->demodulator_priv;
696 dib3000mc_set_output_mode(state, OUTMODE_HIGH_Z);
698 state->current_bandwidth = fep->bandwidth_hz;
699 dib3000mc_set_bandwidth(state, BANDWIDTH_TO_KHZ(fep->bandwidth_hz));
701 /* maybe the parameter has been changed */
702 state->sfn_workaround_active = buggy_sfn_workaround;
704 if (fe->ops.tuner_ops.set_params) {
705 fe->ops.tuner_ops.set_params(fe);
709 if (fep->transmission_mode == TRANSMISSION_MODE_AUTO ||
710 fep->guard_interval == GUARD_INTERVAL_AUTO ||
711 fep->modulation == QAM_AUTO ||
712 fep->code_rate_HP == FEC_AUTO) {
717 dib3000mc_autosearch_start(fe);
720 found = dib3000mc_autosearch_is_irq(fe);
721 } while (found == 0 && i--);
723 dprintk("autosearch returns: %d\n",found);
724 if (found == 0 || found == 1)
725 return 0; // no channel found
727 dib3000mc_get_frontend(fe, &tmp);
730 ret = dib3000mc_tune(fe);
732 /* make this a config parameter */
733 dib3000mc_set_output_mode(state, OUTMODE_MPEG2_FIFO);
737 static int dib3000mc_read_status(struct dvb_frontend *fe, fe_status_t *stat)
739 struct dib3000mc_state *state = fe->demodulator_priv;
740 u16 lock = dib3000mc_read_word(state, 509);
745 *stat |= FE_HAS_SIGNAL;
747 *stat |= FE_HAS_CARRIER;
749 *stat |= FE_HAS_VITERBI;
751 *stat |= FE_HAS_SYNC;
753 *stat |= FE_HAS_LOCK;
758 static int dib3000mc_read_ber(struct dvb_frontend *fe, u32 *ber)
760 struct dib3000mc_state *state = fe->demodulator_priv;
761 *ber = (dib3000mc_read_word(state, 500) << 16) | dib3000mc_read_word(state, 501);
765 static int dib3000mc_read_unc_blocks(struct dvb_frontend *fe, u32 *unc)
767 struct dib3000mc_state *state = fe->demodulator_priv;
768 *unc = dib3000mc_read_word(state, 508);
772 static int dib3000mc_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
774 struct dib3000mc_state *state = fe->demodulator_priv;
775 u16 val = dib3000mc_read_word(state, 392);
776 *strength = 65535 - val;
780 static int dib3000mc_read_snr(struct dvb_frontend* fe, u16 *snr)
786 static int dib3000mc_fe_get_tune_settings(struct dvb_frontend* fe, struct dvb_frontend_tune_settings *tune)
788 tune->min_delay_ms = 1000;
792 static void dib3000mc_release(struct dvb_frontend *fe)
794 struct dib3000mc_state *state = fe->demodulator_priv;
795 dibx000_exit_i2c_master(&state->i2c_master);
799 int dib3000mc_pid_control(struct dvb_frontend *fe, int index, int pid,int onoff)
801 struct dib3000mc_state *state = fe->demodulator_priv;
802 dib3000mc_write_word(state, 212 + index, onoff ? (1 << 13) | pid : 0);
805 EXPORT_SYMBOL(dib3000mc_pid_control);
807 int dib3000mc_pid_parse(struct dvb_frontend *fe, int onoff)
809 struct dib3000mc_state *state = fe->demodulator_priv;
810 u16 tmp = dib3000mc_read_word(state, 206) & ~(1 << 4);
812 return dib3000mc_write_word(state, 206, tmp);
814 EXPORT_SYMBOL(dib3000mc_pid_parse);
816 void dib3000mc_set_config(struct dvb_frontend *fe, struct dib3000mc_config *cfg)
818 struct dib3000mc_state *state = fe->demodulator_priv;
821 EXPORT_SYMBOL(dib3000mc_set_config);
823 int dib3000mc_i2c_enumeration(struct i2c_adapter *i2c, int no_of_demods, u8 default_addr, struct dib3000mc_config cfg[])
825 struct dib3000mc_state *dmcst;
829 static u8 DIB3000MC_I2C_ADDRESS[] = {20,22,24,26};
831 dmcst = kzalloc(sizeof(struct dib3000mc_state), GFP_KERNEL);
835 dmcst->i2c_adap = i2c;
837 for (k = no_of_demods-1; k >= 0; k--) {
838 dmcst->cfg = &cfg[k];
840 /* designated i2c address */
841 new_addr = DIB3000MC_I2C_ADDRESS[k];
842 dmcst->i2c_addr = new_addr;
843 if (dib3000mc_identify(dmcst) != 0) {
844 dmcst->i2c_addr = default_addr;
845 if (dib3000mc_identify(dmcst) != 0) {
846 dprintk("-E- DiB3000P/MC #%d: not identified\n", k);
852 dib3000mc_set_output_mode(dmcst, OUTMODE_MPEG2_PAR_CONT_CLK);
854 // set new i2c address and force divstr (Bit 1) to value 0 (Bit 0)
855 dib3000mc_write_word(dmcst, 1024, (new_addr << 3) | 0x1);
856 dmcst->i2c_addr = new_addr;
859 for (k = 0; k < no_of_demods; k++) {
860 dmcst->cfg = &cfg[k];
861 dmcst->i2c_addr = DIB3000MC_I2C_ADDRESS[k];
863 dib3000mc_write_word(dmcst, 1024, dmcst->i2c_addr << 3);
865 /* turn off data output */
866 dib3000mc_set_output_mode(dmcst, OUTMODE_HIGH_Z);
872 EXPORT_SYMBOL(dib3000mc_i2c_enumeration);
874 static struct dvb_frontend_ops dib3000mc_ops;
876 struct dvb_frontend * dib3000mc_attach(struct i2c_adapter *i2c_adap, u8 i2c_addr, struct dib3000mc_config *cfg)
878 struct dvb_frontend *demod;
879 struct dib3000mc_state *st;
880 st = kzalloc(sizeof(struct dib3000mc_state), GFP_KERNEL);
885 st->i2c_adap = i2c_adap;
886 st->i2c_addr = i2c_addr;
889 demod->demodulator_priv = st;
890 memcpy(&st->demod.ops, &dib3000mc_ops, sizeof(struct dvb_frontend_ops));
892 if (dib3000mc_identify(st) != 0)
895 dibx000_init_i2c_master(&st->i2c_master, DIB3000MC, st->i2c_adap, st->i2c_addr);
897 dib3000mc_write_word(st, 1037, 0x3130);
905 EXPORT_SYMBOL(dib3000mc_attach);
907 static struct dvb_frontend_ops dib3000mc_ops = {
908 .delsys = { SYS_DVBT },
910 .name = "DiBcom 3000MC/P",
912 .frequency_min = 44250000,
913 .frequency_max = 867250000,
914 .frequency_stepsize = 62500,
915 .caps = FE_CAN_INVERSION_AUTO |
916 FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
917 FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
918 FE_CAN_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_64 | FE_CAN_QAM_AUTO |
919 FE_CAN_TRANSMISSION_MODE_AUTO |
920 FE_CAN_GUARD_INTERVAL_AUTO |
922 FE_CAN_HIERARCHY_AUTO,
925 .release = dib3000mc_release,
927 .init = dib3000mc_init,
928 .sleep = dib3000mc_sleep,
930 .set_frontend = dib3000mc_set_frontend,
931 .get_tune_settings = dib3000mc_fe_get_tune_settings,
932 .get_frontend = dib3000mc_get_frontend,
934 .read_status = dib3000mc_read_status,
935 .read_ber = dib3000mc_read_ber,
936 .read_signal_strength = dib3000mc_read_signal_strength,
937 .read_snr = dib3000mc_read_snr,
938 .read_ucblocks = dib3000mc_read_unc_blocks,
941 MODULE_AUTHOR("Patrick Boettcher <pboettcher@dibcom.fr>");
942 MODULE_DESCRIPTION("Driver for the DiBcom 3000MC/P COFDM demodulator");
943 MODULE_LICENSE("GPL");