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@posteo.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 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
16 #include <linux/kernel.h>
17 #include <linux/slab.h>
18 #include <linux/i2c.h>
20 #include <media/dvb_frontend.h>
22 #include "dib3000mc.h"
25 module_param(debug
, int, 0644);
26 MODULE_PARM_DESC(debug
, "turn on debugging (default: 0)");
28 static int buggy_sfn_workaround
;
29 module_param(buggy_sfn_workaround
, int, 0644);
30 MODULE_PARM_DESC(buggy_sfn_workaround
, "Enable work-around for buggy SFNs (default: 0)");
32 #define dprintk(fmt, arg...) do { \
34 printk(KERN_DEBUG pr_fmt("%s: " fmt), \
38 struct dib3000mc_state
{
39 struct dvb_frontend demod
;
40 struct dib3000mc_config
*cfg
;
43 struct i2c_adapter
*i2c_adap
;
45 struct dibx000_i2c_master i2c_master
;
49 u32 current_bandwidth
;
53 u8 sfn_workaround_active
:1;
56 static u16
dib3000mc_read_word(struct dib3000mc_state
*state
, u16 reg
)
58 struct i2c_msg msg
[2] = {
59 { .addr
= state
->i2c_addr
>> 1, .flags
= 0, .len
= 2 },
60 { .addr
= state
->i2c_addr
>> 1, .flags
= I2C_M_RD
, .len
= 2 },
65 b
= kmalloc(4, GFP_KERNEL
);
69 b
[0] = (reg
>> 8) | 0x80;
77 if (i2c_transfer(state
->i2c_adap
, msg
, 2) != 2)
78 dprintk("i2c read error on %d\n",reg
);
80 word
= (b
[2] << 8) | b
[3];
86 static int dib3000mc_write_word(struct dib3000mc_state
*state
, u16 reg
, u16 val
)
88 struct i2c_msg msg
= {
89 .addr
= state
->i2c_addr
>> 1, .flags
= 0, .len
= 4
94 b
= kmalloc(4, GFP_KERNEL
);
105 rc
= i2c_transfer(state
->i2c_adap
, &msg
, 1) != 1 ? -EREMOTEIO
: 0;
111 static int dib3000mc_identify(struct dib3000mc_state
*state
)
114 if ((value
= dib3000mc_read_word(state
, 1025)) != 0x01b3) {
115 dprintk("-E- DiB3000MC/P: wrong Vendor ID (read=0x%x)\n",value
);
119 value
= dib3000mc_read_word(state
, 1026);
120 if (value
!= 0x3001 && value
!= 0x3002) {
121 dprintk("-E- DiB3000MC/P: wrong Device ID (%x)\n",value
);
124 state
->dev_id
= value
;
126 dprintk("-I- found DiB3000MC/P: %x\n",state
->dev_id
);
131 static int dib3000mc_set_timing(struct dib3000mc_state
*state
, s16 nfft
, u32 bw
, u8 update_offset
)
135 if (state
->timf
== 0) {
136 timf
= 1384402; // default value for 8MHz
138 msleep(200); // first time we do an update
145 s16 tim_offs
= dib3000mc_read_word(state
, 416);
147 if (tim_offs
& 0x2000)
150 if (nfft
== TRANSMISSION_MODE_2K
)
154 state
->timf
= timf
/ (bw
/ 1000);
157 dprintk("timf: %d\n", timf
);
159 dib3000mc_write_word(state
, 23, (u16
) (timf
>> 16));
160 dib3000mc_write_word(state
, 24, (u16
) (timf
) & 0xffff);
165 static int dib3000mc_setup_pwm_state(struct dib3000mc_state
*state
)
167 u16 reg_51
, reg_52
= state
->cfg
->agc
->setup
& 0xfefb;
168 if (state
->cfg
->pwm3_inversion
) {
169 reg_51
= (2 << 14) | (0 << 10) | (7 << 6) | (2 << 2) | (2 << 0);
172 reg_51
= (2 << 14) | (4 << 10) | (7 << 6) | (2 << 2) | (2 << 0);
175 dib3000mc_write_word(state
, 51, reg_51
);
176 dib3000mc_write_word(state
, 52, reg_52
);
178 if (state
->cfg
->use_pwm3
)
179 dib3000mc_write_word(state
, 245, (1 << 3) | (1 << 0));
181 dib3000mc_write_word(state
, 245, 0);
183 dib3000mc_write_word(state
, 1040, 0x3);
187 static int dib3000mc_set_output_mode(struct dib3000mc_state
*state
, int mode
)
190 u16 fifo_threshold
= 1792;
194 u16 smo_reg
= dib3000mc_read_word(state
, 206) & 0x0010; /* keep the pid_parse bit */
196 dprintk("-I- Setting output mode for demod %p to %d\n",
197 &state
->demod
, mode
);
200 case OUTMODE_HIGH_Z
: // disable
203 case OUTMODE_MPEG2_PAR_GATED_CLK
: // STBs with parallel gated clock
206 case OUTMODE_MPEG2_PAR_CONT_CLK
: // STBs with parallel continues clock
209 case OUTMODE_MPEG2_SERIAL
: // STBs with serial input
212 case OUTMODE_MPEG2_FIFO
: // e.g. USB feeding
215 P_smo_error_discard [1;6:6] = 0
216 P_smo_rs_discard [1;5:5] = 0
217 P_smo_pid_parse [1;4:4] = 0
218 P_smo_fifo_flush [1;3:3] = 0
219 P_smo_mode [2;2:1] = 11
220 P_smo_ovf_prot [1;0:0] = 0
223 fifo_threshold
= 512;
226 case OUTMODE_DIVERSITY
:
231 dprintk("Unhandled output_mode passed to be set for demod %p\n",&state
->demod
);
236 if ((state
->cfg
->output_mpeg2_in_188_bytes
))
237 smo_reg
|= (1 << 5); // P_smo_rs_discard [1;5:5] = 1
239 outreg
= dib3000mc_read_word(state
, 244) & 0x07FF;
240 outreg
|= (outmode
<< 11);
241 ret
|= dib3000mc_write_word(state
, 244, outreg
);
242 ret
|= dib3000mc_write_word(state
, 206, smo_reg
); /*smo_ mode*/
243 ret
|= dib3000mc_write_word(state
, 207, fifo_threshold
); /* synchronous fread */
244 ret
|= dib3000mc_write_word(state
, 1040, elecout
); /* P_out_cfg */
248 static int dib3000mc_set_bandwidth(struct dib3000mc_state
*state
, u32 bw
)
250 u16 bw_cfg
[6] = { 0 };
251 u16 imp_bw_cfg
[3] = { 0 };
254 /* settings here are for 27.7MHz */
257 bw_cfg
[0] = 0x0019; bw_cfg
[1] = 0x5c30; bw_cfg
[2] = 0x0054; bw_cfg
[3] = 0x88a0; bw_cfg
[4] = 0x01a6; bw_cfg
[5] = 0xab20;
258 imp_bw_cfg
[0] = 0x04db; imp_bw_cfg
[1] = 0x00db; imp_bw_cfg
[2] = 0x00b7;
262 bw_cfg
[0] = 0x001c; bw_cfg
[1] = 0xfba5; bw_cfg
[2] = 0x0060; bw_cfg
[3] = 0x9c25; bw_cfg
[4] = 0x01e3; bw_cfg
[5] = 0x0cb7;
263 imp_bw_cfg
[0] = 0x04c0; imp_bw_cfg
[1] = 0x00c0; imp_bw_cfg
[2] = 0x00a0;
267 bw_cfg
[0] = 0x0021; bw_cfg
[1] = 0xd040; bw_cfg
[2] = 0x0070; bw_cfg
[3] = 0xb62b; bw_cfg
[4] = 0x0233; bw_cfg
[5] = 0x8ed5;
268 imp_bw_cfg
[0] = 0x04a5; imp_bw_cfg
[1] = 0x00a5; imp_bw_cfg
[2] = 0x0089;
272 bw_cfg
[0] = 0x0028; bw_cfg
[1] = 0x9380; bw_cfg
[2] = 0x0087; bw_cfg
[3] = 0x4100; bw_cfg
[4] = 0x02a4; bw_cfg
[5] = 0x4500;
273 imp_bw_cfg
[0] = 0x0489; imp_bw_cfg
[1] = 0x0089; imp_bw_cfg
[2] = 0x0072;
276 default: return -EINVAL
;
279 for (reg
= 6; reg
< 12; reg
++)
280 dib3000mc_write_word(state
, reg
, bw_cfg
[reg
- 6]);
281 dib3000mc_write_word(state
, 12, 0x0000);
282 dib3000mc_write_word(state
, 13, 0x03e8);
283 dib3000mc_write_word(state
, 14, 0x0000);
284 dib3000mc_write_word(state
, 15, 0x03f2);
285 dib3000mc_write_word(state
, 16, 0x0001);
286 dib3000mc_write_word(state
, 17, 0xb0d0);
288 dib3000mc_write_word(state
, 18, 0x0393);
289 dib3000mc_write_word(state
, 19, 0x8700);
291 for (reg
= 55; reg
< 58; reg
++)
292 dib3000mc_write_word(state
, reg
, imp_bw_cfg
[reg
- 55]);
294 // Timing configuration
295 dib3000mc_set_timing(state
, TRANSMISSION_MODE_2K
, bw
, 0);
300 static u16 impulse_noise_val
[29] =
303 0x38, 0x6d9, 0x3f28, 0x7a7, 0x3a74, 0x196, 0x32a, 0x48c, 0x3ffe, 0x7f3,
304 0x2d94, 0x76, 0x53d, 0x3ff8, 0x7e3, 0x3320, 0x76, 0x5b3, 0x3feb, 0x7d2,
305 0x365e, 0x76, 0x48c, 0x3ffe, 0x5b3, 0x3feb, 0x76, 0x0000, 0xd
308 static void dib3000mc_set_impulse_noise(struct dib3000mc_state
*state
, u8 mode
, s16 nfft
)
311 for (i
= 58; i
< 87; i
++)
312 dib3000mc_write_word(state
, i
, impulse_noise_val
[i
-58]);
314 if (nfft
== TRANSMISSION_MODE_8K
) {
315 dib3000mc_write_word(state
, 58, 0x3b);
316 dib3000mc_write_word(state
, 84, 0x00);
317 dib3000mc_write_word(state
, 85, 0x8200);
320 dib3000mc_write_word(state
, 34, 0x1294);
321 dib3000mc_write_word(state
, 35, 0x1ff8);
323 dib3000mc_write_word(state
, 55, dib3000mc_read_word(state
, 55) | (1 << 10));
326 static int dib3000mc_init(struct dvb_frontend
*demod
)
328 struct dib3000mc_state
*state
= demod
->demodulator_priv
;
329 struct dibx000_agc_config
*agc
= state
->cfg
->agc
;
331 // Restart Configuration
332 dib3000mc_write_word(state
, 1027, 0x8000);
333 dib3000mc_write_word(state
, 1027, 0x0000);
335 // power up the demod + mobility configuration
336 dib3000mc_write_word(state
, 140, 0x0000);
337 dib3000mc_write_word(state
, 1031, 0);
339 if (state
->cfg
->mobile_mode
) {
340 dib3000mc_write_word(state
, 139, 0x0000);
341 dib3000mc_write_word(state
, 141, 0x0000);
342 dib3000mc_write_word(state
, 175, 0x0002);
343 dib3000mc_write_word(state
, 1032, 0x0000);
345 dib3000mc_write_word(state
, 139, 0x0001);
346 dib3000mc_write_word(state
, 141, 0x0000);
347 dib3000mc_write_word(state
, 175, 0x0000);
348 dib3000mc_write_word(state
, 1032, 0x012C);
350 dib3000mc_write_word(state
, 1033, 0x0000);
353 dib3000mc_write_word(state
, 1037, 0x3130);
355 // other configurations
358 dib3000mc_write_word(state
, 33, (5 << 0));
359 dib3000mc_write_word(state
, 88, (1 << 10) | (0x10 << 0));
361 // Phase noise control
362 // P_fft_phacor_inh, P_fft_phacor_cpe, P_fft_powrange
363 dib3000mc_write_word(state
, 99, (1 << 9) | (0x20 << 0));
365 if (state
->cfg
->phase_noise_mode
== 0)
366 dib3000mc_write_word(state
, 111, 0x00);
368 dib3000mc_write_word(state
, 111, 0x02);
371 dib3000mc_write_word(state
, 50, 0x8000);
374 dib3000mc_setup_pwm_state(state
);
376 // P_agc_counter_lock
377 dib3000mc_write_word(state
, 53, 0x87);
378 // P_agc_counter_unlock
379 dib3000mc_write_word(state
, 54, 0x87);
382 dib3000mc_write_word(state
, 36, state
->cfg
->max_time
);
383 dib3000mc_write_word(state
, 37, (state
->cfg
->agc_command1
<< 13) | (state
->cfg
->agc_command2
<< 12) | (0x1d << 0));
384 dib3000mc_write_word(state
, 38, state
->cfg
->pwm3_value
);
385 dib3000mc_write_word(state
, 39, state
->cfg
->ln_adc_level
);
388 dib3000mc_write_word(state
, 40, 0x0179);
389 dib3000mc_write_word(state
, 41, 0x03f0);
391 dib3000mc_write_word(state
, 42, agc
->agc1_max
);
392 dib3000mc_write_word(state
, 43, agc
->agc1_min
);
393 dib3000mc_write_word(state
, 44, agc
->agc2_max
);
394 dib3000mc_write_word(state
, 45, agc
->agc2_min
);
395 dib3000mc_write_word(state
, 46, (agc
->agc1_pt1
<< 8) | agc
->agc1_pt2
);
396 dib3000mc_write_word(state
, 47, (agc
->agc1_slope1
<< 8) | agc
->agc1_slope2
);
397 dib3000mc_write_word(state
, 48, (agc
->agc2_pt1
<< 8) | agc
->agc2_pt2
);
398 dib3000mc_write_word(state
, 49, (agc
->agc2_slope1
<< 8) | agc
->agc2_slope2
);
400 // Begin: TimeOut registers
402 dib3000mc_write_word(state
, 110, 3277);
403 // P_timf_alpha = 6, P_corm_alpha = 6, P_corm_thres = 0x80
404 dib3000mc_write_word(state
, 26, 0x6680);
406 dib3000mc_write_word(state
, 1, 4);
408 dib3000mc_write_word(state
, 2, 4);
410 dib3000mc_write_word(state
, 3, 0x1000);
411 // P_search_maxtrial=1
412 dib3000mc_write_word(state
, 5, 1);
414 dib3000mc_set_bandwidth(state
, 8000);
417 dib3000mc_write_word(state
, 4, 0x814);
419 dib3000mc_write_word(state
, 21, (1 << 9) | 0x164);
420 dib3000mc_write_word(state
, 22, 0x463d);
423 // P_cspu_regul, P_cspu_win_cut
424 dib3000mc_write_word(state
, 120, 0x200f);
426 dib3000mc_write_word(state
, 134, 0);
429 dib3000mc_write_word(state
, 195, 0x10);
431 // diversity register: P_dvsy_sync_wait..
432 dib3000mc_write_word(state
, 180, 0x2FF0);
434 // Impulse noise configuration
435 dib3000mc_set_impulse_noise(state
, 0, TRANSMISSION_MODE_8K
);
437 // output mode set-up
438 dib3000mc_set_output_mode(state
, OUTMODE_HIGH_Z
);
440 /* close the i2c-gate */
441 dib3000mc_write_word(state
, 769, (1 << 7) );
446 static int dib3000mc_sleep(struct dvb_frontend
*demod
)
448 struct dib3000mc_state
*state
= demod
->demodulator_priv
;
450 dib3000mc_write_word(state
, 1031, 0xFFFF);
451 dib3000mc_write_word(state
, 1032, 0xFFFF);
452 dib3000mc_write_word(state
, 1033, 0xFFF0);
457 static void dib3000mc_set_adp_cfg(struct dib3000mc_state
*state
, s16 qam
)
459 u16 cfg
[4] = { 0 },reg
;
462 cfg
[0] = 0x099a; cfg
[1] = 0x7fae; cfg
[2] = 0x0333; cfg
[3] = 0x7ff0;
465 cfg
[0] = 0x023d; cfg
[1] = 0x7fdf; cfg
[2] = 0x00a4; cfg
[3] = 0x7ff0;
468 cfg
[0] = 0x0148; cfg
[1] = 0x7ff0; cfg
[2] = 0x00a4; cfg
[3] = 0x7ff8;
471 for (reg
= 129; reg
< 133; reg
++)
472 dib3000mc_write_word(state
, reg
, cfg
[reg
- 129]);
475 static void dib3000mc_set_channel_cfg(struct dib3000mc_state
*state
,
476 struct dtv_frontend_properties
*ch
, u16 seq
)
479 u32 bw
= BANDWIDTH_TO_KHZ(ch
->bandwidth_hz
);
481 dib3000mc_set_bandwidth(state
, bw
);
482 dib3000mc_set_timing(state
, ch
->transmission_mode
, bw
, 0);
485 dib3000mc_write_word(state
, 100, (16 << 6) + 9);
488 dib3000mc_write_word(state
, 100, (11 << 6) + 6);
490 dib3000mc_write_word(state
, 100, (16 << 6) + 9);
493 dib3000mc_write_word(state
, 1027, 0x0800);
494 dib3000mc_write_word(state
, 1027, 0x0000);
496 //Default cfg isi offset adp
497 dib3000mc_write_word(state
, 26, 0x6680);
498 dib3000mc_write_word(state
, 29, 0x1273);
499 dib3000mc_write_word(state
, 33, 5);
500 dib3000mc_set_adp_cfg(state
, QAM_16
);
501 dib3000mc_write_word(state
, 133, 15564);
503 dib3000mc_write_word(state
, 12 , 0x0);
504 dib3000mc_write_word(state
, 13 , 0x3e8);
505 dib3000mc_write_word(state
, 14 , 0x0);
506 dib3000mc_write_word(state
, 15 , 0x3f2);
508 dib3000mc_write_word(state
, 93,0);
509 dib3000mc_write_word(state
, 94,0);
510 dib3000mc_write_word(state
, 95,0);
511 dib3000mc_write_word(state
, 96,0);
512 dib3000mc_write_word(state
, 97,0);
513 dib3000mc_write_word(state
, 98,0);
515 dib3000mc_set_impulse_noise(state
, 0, ch
->transmission_mode
);
518 switch (ch
->transmission_mode
) {
519 case TRANSMISSION_MODE_2K
: value
|= (0 << 7); break;
521 case TRANSMISSION_MODE_8K
: value
|= (1 << 7); break;
523 switch (ch
->guard_interval
) {
524 case GUARD_INTERVAL_1_32
: value
|= (0 << 5); break;
525 case GUARD_INTERVAL_1_16
: value
|= (1 << 5); break;
526 case GUARD_INTERVAL_1_4
: value
|= (3 << 5); break;
528 case GUARD_INTERVAL_1_8
: value
|= (2 << 5); break;
530 switch (ch
->modulation
) {
531 case QPSK
: value
|= (0 << 3); break;
532 case QAM_16
: value
|= (1 << 3); break;
534 case QAM_64
: value
|= (2 << 3); break;
536 switch (HIERARCHY_1
) {
537 case HIERARCHY_2
: value
|= 2; break;
538 case HIERARCHY_4
: value
|= 4; break;
540 case HIERARCHY_1
: value
|= 1; break;
542 dib3000mc_write_word(state
, 0, value
);
543 dib3000mc_write_word(state
, 5, (1 << 8) | ((seq
& 0xf) << 4));
546 if (ch
->hierarchy
== 1)
550 switch ((ch
->hierarchy
== 0 || 1 == 1) ? ch
->code_rate_HP
: ch
->code_rate_LP
) {
551 case FEC_2_3
: value
|= (2 << 1); break;
552 case FEC_3_4
: value
|= (3 << 1); break;
553 case FEC_5_6
: value
|= (5 << 1); break;
554 case FEC_7_8
: value
|= (7 << 1); break;
556 case FEC_1_2
: value
|= (1 << 1); break;
558 dib3000mc_write_word(state
, 181, value
);
560 // diversity synchro delay add 50% SFN margin
561 switch (ch
->transmission_mode
) {
562 case TRANSMISSION_MODE_8K
: value
= 256; break;
563 case TRANSMISSION_MODE_2K
:
564 default: value
= 64; break;
566 switch (ch
->guard_interval
) {
567 case GUARD_INTERVAL_1_16
: value
*= 2; break;
568 case GUARD_INTERVAL_1_8
: value
*= 4; break;
569 case GUARD_INTERVAL_1_4
: value
*= 8; break;
571 case GUARD_INTERVAL_1_32
: value
*= 1; break;
574 value
|= dib3000mc_read_word(state
, 180) & 0x000f;
575 dib3000mc_write_word(state
, 180, value
);
578 value
= dib3000mc_read_word(state
, 0);
579 dib3000mc_write_word(state
, 0, value
| (1 << 9));
580 dib3000mc_write_word(state
, 0, value
);
584 dib3000mc_set_impulse_noise(state
, state
->cfg
->impulse_noise_mode
, ch
->transmission_mode
);
587 static int dib3000mc_autosearch_start(struct dvb_frontend
*demod
)
589 struct dtv_frontend_properties
*chan
= &demod
->dtv_property_cache
;
590 struct dib3000mc_state
*state
= demod
->demodulator_priv
;
593 struct dtv_frontend_properties schan
;
597 /* TODO what is that ? */
599 /* a channel for autosearch */
600 schan
.transmission_mode
= TRANSMISSION_MODE_8K
;
601 schan
.guard_interval
= GUARD_INTERVAL_1_32
;
602 schan
.modulation
= QAM_64
;
603 schan
.code_rate_HP
= FEC_2_3
;
604 schan
.code_rate_LP
= FEC_2_3
;
607 dib3000mc_set_channel_cfg(state
, &schan
, 11);
609 reg
= dib3000mc_read_word(state
, 0);
610 dib3000mc_write_word(state
, 0, reg
| (1 << 8));
611 dib3000mc_read_word(state
, 511);
612 dib3000mc_write_word(state
, 0, reg
);
617 static int dib3000mc_autosearch_is_irq(struct dvb_frontend
*demod
)
619 struct dib3000mc_state
*state
= demod
->demodulator_priv
;
620 u16 irq_pending
= dib3000mc_read_word(state
, 511);
622 if (irq_pending
& 0x1) // failed
625 if (irq_pending
& 0x2) // succeeded
628 return 0; // still pending
631 static int dib3000mc_tune(struct dvb_frontend
*demod
)
633 struct dtv_frontend_properties
*ch
= &demod
->dtv_property_cache
;
634 struct dib3000mc_state
*state
= demod
->demodulator_priv
;
636 // ** configure demod **
637 dib3000mc_set_channel_cfg(state
, ch
, 0);
640 if (state
->sfn_workaround_active
) {
641 dprintk("SFN workaround is active\n");
642 dib3000mc_write_word(state
, 29, 0x1273);
643 dib3000mc_write_word(state
, 108, 0x4000); // P_pha3_force_pha_shift
645 dib3000mc_write_word(state
, 29, 0x1073);
646 dib3000mc_write_word(state
, 108, 0x0000); // P_pha3_force_pha_shift
649 dib3000mc_set_adp_cfg(state
, (u8
)ch
->modulation
);
650 if (ch
->transmission_mode
== TRANSMISSION_MODE_8K
) {
651 dib3000mc_write_word(state
, 26, 38528);
652 dib3000mc_write_word(state
, 33, 8);
654 dib3000mc_write_word(state
, 26, 30336);
655 dib3000mc_write_word(state
, 33, 6);
658 if (dib3000mc_read_word(state
, 509) & 0x80)
659 dib3000mc_set_timing(state
, ch
->transmission_mode
,
660 BANDWIDTH_TO_KHZ(ch
->bandwidth_hz
), 1);
665 struct i2c_adapter
* dib3000mc_get_tuner_i2c_master(struct dvb_frontend
*demod
, int gating
)
667 struct dib3000mc_state
*st
= demod
->demodulator_priv
;
668 return dibx000_get_i2c_adapter(&st
->i2c_master
, DIBX000_I2C_INTERFACE_TUNER
, gating
);
671 EXPORT_SYMBOL(dib3000mc_get_tuner_i2c_master
);
673 static int dib3000mc_get_frontend(struct dvb_frontend
* fe
,
674 struct dtv_frontend_properties
*fep
)
676 struct dib3000mc_state
*state
= fe
->demodulator_priv
;
677 u16 tps
= dib3000mc_read_word(state
,458);
679 fep
->inversion
= INVERSION_AUTO
;
681 fep
->bandwidth_hz
= state
->current_bandwidth
;
683 switch ((tps
>> 8) & 0x1) {
684 case 0: fep
->transmission_mode
= TRANSMISSION_MODE_2K
; break;
685 case 1: fep
->transmission_mode
= TRANSMISSION_MODE_8K
; break;
689 case 0: fep
->guard_interval
= GUARD_INTERVAL_1_32
; break;
690 case 1: fep
->guard_interval
= GUARD_INTERVAL_1_16
; break;
691 case 2: fep
->guard_interval
= GUARD_INTERVAL_1_8
; break;
692 case 3: fep
->guard_interval
= GUARD_INTERVAL_1_4
; break;
695 switch ((tps
>> 13) & 0x3) {
696 case 0: fep
->modulation
= QPSK
; break;
697 case 1: fep
->modulation
= QAM_16
; break;
699 default: fep
->modulation
= QAM_64
; break;
702 /* as long as the frontend_param structure is fixed for hierarchical transmission I refuse to use it */
703 /* (tps >> 12) & 0x1 == hrch is used, (tps >> 9) & 0x7 == alpha */
705 fep
->hierarchy
= HIERARCHY_NONE
;
706 switch ((tps
>> 5) & 0x7) {
707 case 1: fep
->code_rate_HP
= FEC_1_2
; break;
708 case 2: fep
->code_rate_HP
= FEC_2_3
; break;
709 case 3: fep
->code_rate_HP
= FEC_3_4
; break;
710 case 5: fep
->code_rate_HP
= FEC_5_6
; break;
712 default: fep
->code_rate_HP
= FEC_7_8
; break;
716 switch ((tps
>> 2) & 0x7) {
717 case 1: fep
->code_rate_LP
= FEC_1_2
; break;
718 case 2: fep
->code_rate_LP
= FEC_2_3
; break;
719 case 3: fep
->code_rate_LP
= FEC_3_4
; break;
720 case 5: fep
->code_rate_LP
= FEC_5_6
; break;
722 default: fep
->code_rate_LP
= FEC_7_8
; break;
728 static int dib3000mc_set_frontend(struct dvb_frontend
*fe
)
730 struct dtv_frontend_properties
*fep
= &fe
->dtv_property_cache
;
731 struct dib3000mc_state
*state
= fe
->demodulator_priv
;
734 dib3000mc_set_output_mode(state
, OUTMODE_HIGH_Z
);
736 state
->current_bandwidth
= fep
->bandwidth_hz
;
737 dib3000mc_set_bandwidth(state
, BANDWIDTH_TO_KHZ(fep
->bandwidth_hz
));
739 /* maybe the parameter has been changed */
740 state
->sfn_workaround_active
= buggy_sfn_workaround
;
742 if (fe
->ops
.tuner_ops
.set_params
) {
743 fe
->ops
.tuner_ops
.set_params(fe
);
747 if (fep
->transmission_mode
== TRANSMISSION_MODE_AUTO
||
748 fep
->guard_interval
== GUARD_INTERVAL_AUTO
||
749 fep
->modulation
== QAM_AUTO
||
750 fep
->code_rate_HP
== FEC_AUTO
) {
753 dib3000mc_autosearch_start(fe
);
756 found
= dib3000mc_autosearch_is_irq(fe
);
757 } while (found
== 0 && i
--);
759 dprintk("autosearch returns: %d\n",found
);
760 if (found
== 0 || found
== 1)
761 return 0; // no channel found
763 dib3000mc_get_frontend(fe
, fep
);
766 ret
= dib3000mc_tune(fe
);
768 /* make this a config parameter */
769 dib3000mc_set_output_mode(state
, OUTMODE_MPEG2_FIFO
);
773 static int dib3000mc_read_status(struct dvb_frontend
*fe
, enum fe_status
*stat
)
775 struct dib3000mc_state
*state
= fe
->demodulator_priv
;
776 u16 lock
= dib3000mc_read_word(state
, 509);
781 *stat
|= FE_HAS_SIGNAL
;
783 *stat
|= FE_HAS_CARRIER
;
785 *stat
|= FE_HAS_VITERBI
;
787 *stat
|= FE_HAS_SYNC
;
789 *stat
|= FE_HAS_LOCK
;
794 static int dib3000mc_read_ber(struct dvb_frontend
*fe
, u32
*ber
)
796 struct dib3000mc_state
*state
= fe
->demodulator_priv
;
797 *ber
= (dib3000mc_read_word(state
, 500) << 16) | dib3000mc_read_word(state
, 501);
801 static int dib3000mc_read_unc_blocks(struct dvb_frontend
*fe
, u32
*unc
)
803 struct dib3000mc_state
*state
= fe
->demodulator_priv
;
804 *unc
= dib3000mc_read_word(state
, 508);
808 static int dib3000mc_read_signal_strength(struct dvb_frontend
*fe
, u16
*strength
)
810 struct dib3000mc_state
*state
= fe
->demodulator_priv
;
811 u16 val
= dib3000mc_read_word(state
, 392);
812 *strength
= 65535 - val
;
816 static int dib3000mc_read_snr(struct dvb_frontend
* fe
, u16
*snr
)
822 static int dib3000mc_fe_get_tune_settings(struct dvb_frontend
* fe
, struct dvb_frontend_tune_settings
*tune
)
824 tune
->min_delay_ms
= 1000;
828 static void dib3000mc_release(struct dvb_frontend
*fe
)
830 struct dib3000mc_state
*state
= fe
->demodulator_priv
;
831 dibx000_exit_i2c_master(&state
->i2c_master
);
835 int dib3000mc_pid_control(struct dvb_frontend
*fe
, int index
, int pid
,int onoff
)
837 struct dib3000mc_state
*state
= fe
->demodulator_priv
;
838 dib3000mc_write_word(state
, 212 + index
, onoff
? (1 << 13) | pid
: 0);
841 EXPORT_SYMBOL(dib3000mc_pid_control
);
843 int dib3000mc_pid_parse(struct dvb_frontend
*fe
, int onoff
)
845 struct dib3000mc_state
*state
= fe
->demodulator_priv
;
846 u16 tmp
= dib3000mc_read_word(state
, 206) & ~(1 << 4);
848 return dib3000mc_write_word(state
, 206, tmp
);
850 EXPORT_SYMBOL(dib3000mc_pid_parse
);
852 void dib3000mc_set_config(struct dvb_frontend
*fe
, struct dib3000mc_config
*cfg
)
854 struct dib3000mc_state
*state
= fe
->demodulator_priv
;
857 EXPORT_SYMBOL(dib3000mc_set_config
);
859 int dib3000mc_i2c_enumeration(struct i2c_adapter
*i2c
, int no_of_demods
, u8 default_addr
, struct dib3000mc_config cfg
[])
861 struct dib3000mc_state
*dmcst
;
865 static u8 DIB3000MC_I2C_ADDRESS
[] = {20,22,24,26};
867 dmcst
= kzalloc(sizeof(struct dib3000mc_state
), GFP_KERNEL
);
871 dmcst
->i2c_adap
= i2c
;
873 for (k
= no_of_demods
-1; k
>= 0; k
--) {
874 dmcst
->cfg
= &cfg
[k
];
876 /* designated i2c address */
877 new_addr
= DIB3000MC_I2C_ADDRESS
[k
];
878 dmcst
->i2c_addr
= new_addr
;
879 if (dib3000mc_identify(dmcst
) != 0) {
880 dmcst
->i2c_addr
= default_addr
;
881 if (dib3000mc_identify(dmcst
) != 0) {
882 dprintk("-E- DiB3000P/MC #%d: not identified\n", k
);
888 dib3000mc_set_output_mode(dmcst
, OUTMODE_MPEG2_PAR_CONT_CLK
);
890 // set new i2c address and force divstr (Bit 1) to value 0 (Bit 0)
891 dib3000mc_write_word(dmcst
, 1024, (new_addr
<< 3) | 0x1);
892 dmcst
->i2c_addr
= new_addr
;
895 for (k
= 0; k
< no_of_demods
; k
++) {
896 dmcst
->cfg
= &cfg
[k
];
897 dmcst
->i2c_addr
= DIB3000MC_I2C_ADDRESS
[k
];
899 dib3000mc_write_word(dmcst
, 1024, dmcst
->i2c_addr
<< 3);
901 /* turn off data output */
902 dib3000mc_set_output_mode(dmcst
, OUTMODE_HIGH_Z
);
908 EXPORT_SYMBOL(dib3000mc_i2c_enumeration
);
910 static const struct dvb_frontend_ops dib3000mc_ops
;
912 struct dvb_frontend
* dib3000mc_attach(struct i2c_adapter
*i2c_adap
, u8 i2c_addr
, struct dib3000mc_config
*cfg
)
914 struct dvb_frontend
*demod
;
915 struct dib3000mc_state
*st
;
916 st
= kzalloc(sizeof(struct dib3000mc_state
), GFP_KERNEL
);
921 st
->i2c_adap
= i2c_adap
;
922 st
->i2c_addr
= i2c_addr
;
925 demod
->demodulator_priv
= st
;
926 memcpy(&st
->demod
.ops
, &dib3000mc_ops
, sizeof(struct dvb_frontend_ops
));
928 if (dib3000mc_identify(st
) != 0)
931 dibx000_init_i2c_master(&st
->i2c_master
, DIB3000MC
, st
->i2c_adap
, st
->i2c_addr
);
933 dib3000mc_write_word(st
, 1037, 0x3130);
941 EXPORT_SYMBOL(dib3000mc_attach
);
943 static const struct dvb_frontend_ops dib3000mc_ops
= {
944 .delsys
= { SYS_DVBT
},
946 .name
= "DiBcom 3000MC/P",
947 .frequency_min
= 44250000,
948 .frequency_max
= 867250000,
949 .frequency_stepsize
= 62500,
950 .caps
= FE_CAN_INVERSION_AUTO
|
951 FE_CAN_FEC_1_2
| FE_CAN_FEC_2_3
| FE_CAN_FEC_3_4
|
952 FE_CAN_FEC_5_6
| FE_CAN_FEC_7_8
| FE_CAN_FEC_AUTO
|
953 FE_CAN_QPSK
| FE_CAN_QAM_16
| FE_CAN_QAM_64
| FE_CAN_QAM_AUTO
|
954 FE_CAN_TRANSMISSION_MODE_AUTO
|
955 FE_CAN_GUARD_INTERVAL_AUTO
|
957 FE_CAN_HIERARCHY_AUTO
,
960 .release
= dib3000mc_release
,
962 .init
= dib3000mc_init
,
963 .sleep
= dib3000mc_sleep
,
965 .set_frontend
= dib3000mc_set_frontend
,
966 .get_tune_settings
= dib3000mc_fe_get_tune_settings
,
967 .get_frontend
= dib3000mc_get_frontend
,
969 .read_status
= dib3000mc_read_status
,
970 .read_ber
= dib3000mc_read_ber
,
971 .read_signal_strength
= dib3000mc_read_signal_strength
,
972 .read_snr
= dib3000mc_read_snr
,
973 .read_ucblocks
= dib3000mc_read_unc_blocks
,
976 MODULE_AUTHOR("Patrick Boettcher <patrick.boettcher@posteo.de>");
977 MODULE_DESCRIPTION("Driver for the DiBcom 3000MC/P COFDM demodulator");
978 MODULE_LICENSE("GPL");