1
2
3
4
5
6
7
8
9
10
11
12
13
14#include <linux/kernel.h>
15#include <linux/i2c.h>
16
17#include "dvb_frontend.h"
18
19#include "dib3000mc.h"
20
21static int debug;
22module_param(debug, int, 0644);
23MODULE_PARM_DESC(debug, "turn on debugging (default: 0)");
24
25static int buggy_sfn_workaround;
26module_param(buggy_sfn_workaround, int, 0644);
27MODULE_PARM_DESC(buggy_sfn_workaround, "Enable work-around for buggy SFNs (default: 0)");
28
29#define dprintk(args...) do { if (debug) { printk(KERN_DEBUG "DiB3000MC/P:"); printk(args); printk("\n"); } } while (0)
30
31struct dib3000mc_state {
32 struct dvb_frontend demod;
33 struct dib3000mc_config *cfg;
34
35 u8 i2c_addr;
36 struct i2c_adapter *i2c_adap;
37
38 struct dibx000_i2c_master i2c_master;
39
40 u32 timf;
41
42 fe_bandwidth_t current_bandwidth;
43
44 u16 dev_id;
45
46 u8 sfn_workaround_active :1;
47};
48
49static u16 dib3000mc_read_word(struct dib3000mc_state *state, u16 reg)
50{
51 u8 wb[2] = { (reg >> 8) | 0x80, reg & 0xff };
52 u8 rb[2];
53 struct i2c_msg msg[2] = {
54 { .addr = state->i2c_addr >> 1, .flags = 0, .buf = wb, .len = 2 },
55 { .addr = state->i2c_addr >> 1, .flags = I2C_M_RD, .buf = rb, .len = 2 },
56 };
57
58 if (i2c_transfer(state->i2c_adap, msg, 2) != 2)
59 dprintk("i2c read error on %d\n",reg);
60
61 return (rb[0] << 8) | rb[1];
62}
63
64static int dib3000mc_write_word(struct dib3000mc_state *state, u16 reg, u16 val)
65{
66 u8 b[4] = {
67 (reg >> 8) & 0xff, reg & 0xff,
68 (val >> 8) & 0xff, val & 0xff,
69 };
70 struct i2c_msg msg = {
71 .addr = state->i2c_addr >> 1, .flags = 0, .buf = b, .len = 4
72 };
73 return i2c_transfer(state->i2c_adap, &msg, 1) != 1 ? -EREMOTEIO : 0;
74}
75
76static int dib3000mc_identify(struct dib3000mc_state *state)
77{
78 u16 value;
79 if ((value = dib3000mc_read_word(state, 1025)) != 0x01b3) {
80 dprintk("-E- DiB3000MC/P: wrong Vendor ID (read=0x%x)\n",value);
81 return -EREMOTEIO;
82 }
83
84 value = dib3000mc_read_word(state, 1026);
85 if (value != 0x3001 && value != 0x3002) {
86 dprintk("-E- DiB3000MC/P: wrong Device ID (%x)\n",value);
87 return -EREMOTEIO;
88 }
89 state->dev_id = value;
90
91 dprintk("-I- found DiB3000MC/P: %x\n",state->dev_id);
92
93 return 0;
94}
95
96static int dib3000mc_set_timing(struct dib3000mc_state *state, s16 nfft, u32 bw, u8 update_offset)
97{
98 u32 timf;
99
100 if (state->timf == 0) {
101 timf = 1384402;
102 if (update_offset)
103 msleep(200);
104 } else
105 timf = state->timf;
106
107 timf *= (bw / 1000);
108
109 if (update_offset) {
110 s16 tim_offs = dib3000mc_read_word(state, 416);
111
112 if (tim_offs & 0x2000)
113 tim_offs -= 0x4000;
114
115 if (nfft == TRANSMISSION_MODE_2K)
116 tim_offs *= 4;
117
118 timf += tim_offs;
119 state->timf = timf / (bw / 1000);
120 }
121
122 dprintk("timf: %d\n", timf);
123
124 dib3000mc_write_word(state, 23, (u16) (timf >> 16));
125 dib3000mc_write_word(state, 24, (u16) (timf ) & 0xffff);
126
127 return 0;
128}
129
130static int dib3000mc_setup_pwm_state(struct dib3000mc_state *state)
131{
132 u16 reg_51, reg_52 = state->cfg->agc->setup & 0xfefb;
133 if (state->cfg->pwm3_inversion) {
134 reg_51 = (2 << 14) | (0 << 10) | (7 << 6) | (2 << 2) | (2 << 0);
135 reg_52 |= (1 << 2);
136 } else {
137 reg_51 = (2 << 14) | (4 << 10) | (7 << 6) | (2 << 2) | (2 << 0);
138 reg_52 |= (1 << 8);
139 }
140 dib3000mc_write_word(state, 51, reg_51);
141 dib3000mc_write_word(state, 52, reg_52);
142
143 if (state->cfg->use_pwm3)
144 dib3000mc_write_word(state, 245, (1 << 3) | (1 << 0));
145 else
146 dib3000mc_write_word(state, 245, 0);
147
148 dib3000mc_write_word(state, 1040, 0x3);
149 return 0;
150}
151
152static int dib3000mc_set_output_mode(struct dib3000mc_state *state, int mode)
153{
154 int ret = 0;
155 u16 fifo_threshold = 1792;
156 u16 outreg = 0;
157 u16 outmode = 0;
158 u16 elecout = 1;
159 u16 smo_reg = dib3000mc_read_word(state, 206) & 0x0010;
160
161 dprintk("-I- Setting output mode for demod %p to %d\n",
162 &state->demod, mode);
163
164 switch (mode) {
165 case OUTMODE_HIGH_Z:
166 elecout = 0;
167 break;
168 case OUTMODE_MPEG2_PAR_GATED_CLK:
169 outmode = 0;
170 break;
171 case OUTMODE_MPEG2_PAR_CONT_CLK:
172 outmode = 1;
173 break;
174 case OUTMODE_MPEG2_SERIAL:
175 outmode = 2;
176 break;
177 case OUTMODE_MPEG2_FIFO:
178 elecout = 3;
179
180
181
182
183
184
185
186
187 smo_reg |= 3 << 1;
188 fifo_threshold = 512;
189 outmode = 5;
190 break;
191 case OUTMODE_DIVERSITY:
192 outmode = 4;
193 elecout = 1;
194 break;
195 default:
196 dprintk("Unhandled output_mode passed to be set for demod %p\n",&state->demod);
197 outmode = 0;
198 break;
199 }
200
201 if ((state->cfg->output_mpeg2_in_188_bytes))
202 smo_reg |= (1 << 5);
203
204 outreg = dib3000mc_read_word(state, 244) & 0x07FF;
205 outreg |= (outmode << 11);
206 ret |= dib3000mc_write_word(state, 244, outreg);
207 ret |= dib3000mc_write_word(state, 206, smo_reg);
208 ret |= dib3000mc_write_word(state, 207, fifo_threshold);
209 ret |= dib3000mc_write_word(state, 1040, elecout);
210 return ret;
211}
212
213static int dib3000mc_set_bandwidth(struct dib3000mc_state *state, u32 bw)
214{
215 u16 bw_cfg[6] = { 0 };
216 u16 imp_bw_cfg[3] = { 0 };
217 u16 reg;
218
219
220 switch (bw) {
221 case 8000:
222 bw_cfg[0] = 0x0019; bw_cfg[1] = 0x5c30; bw_cfg[2] = 0x0054; bw_cfg[3] = 0x88a0; bw_cfg[4] = 0x01a6; bw_cfg[5] = 0xab20;
223 imp_bw_cfg[0] = 0x04db; imp_bw_cfg[1] = 0x00db; imp_bw_cfg[2] = 0x00b7;
224 break;
225
226 case 7000:
227 bw_cfg[0] = 0x001c; bw_cfg[1] = 0xfba5; bw_cfg[2] = 0x0060; bw_cfg[3] = 0x9c25; bw_cfg[4] = 0x01e3; bw_cfg[5] = 0x0cb7;
228 imp_bw_cfg[0] = 0x04c0; imp_bw_cfg[1] = 0x00c0; imp_bw_cfg[2] = 0x00a0;
229 break;
230
231 case 6000:
232 bw_cfg[0] = 0x0021; bw_cfg[1] = 0xd040; bw_cfg[2] = 0x0070; bw_cfg[3] = 0xb62b; bw_cfg[4] = 0x0233; bw_cfg[5] = 0x8ed5;
233 imp_bw_cfg[0] = 0x04a5; imp_bw_cfg[1] = 0x00a5; imp_bw_cfg[2] = 0x0089;
234 break;
235
236 case 5000:
237 bw_cfg[0] = 0x0028; bw_cfg[1] = 0x9380; bw_cfg[2] = 0x0087; bw_cfg[3] = 0x4100; bw_cfg[4] = 0x02a4; bw_cfg[5] = 0x4500;
238 imp_bw_cfg[0] = 0x0489; imp_bw_cfg[1] = 0x0089; imp_bw_cfg[2] = 0x0072;
239 break;
240
241 default: return -EINVAL;
242 }
243
244 for (reg = 6; reg < 12; reg++)
245 dib3000mc_write_word(state, reg, bw_cfg[reg - 6]);
246 dib3000mc_write_word(state, 12, 0x0000);
247 dib3000mc_write_word(state, 13, 0x03e8);
248 dib3000mc_write_word(state, 14, 0x0000);
249 dib3000mc_write_word(state, 15, 0x03f2);
250 dib3000mc_write_word(state, 16, 0x0001);
251 dib3000mc_write_word(state, 17, 0xb0d0);
252
253 dib3000mc_write_word(state, 18, 0x0393);
254 dib3000mc_write_word(state, 19, 0x8700);
255
256 for (reg = 55; reg < 58; reg++)
257 dib3000mc_write_word(state, reg, imp_bw_cfg[reg - 55]);
258
259
260 dib3000mc_set_timing(state, TRANSMISSION_MODE_2K, bw, 0);
261
262 return 0;
263}
264
265static u16 impulse_noise_val[29] =
266
267{
268 0x38, 0x6d9, 0x3f28, 0x7a7, 0x3a74, 0x196, 0x32a, 0x48c, 0x3ffe, 0x7f3,
269 0x2d94, 0x76, 0x53d, 0x3ff8, 0x7e3, 0x3320, 0x76, 0x5b3, 0x3feb, 0x7d2,
270 0x365e, 0x76, 0x48c, 0x3ffe, 0x5b3, 0x3feb, 0x76, 0x0000, 0xd
271};
272
273static void dib3000mc_set_impulse_noise(struct dib3000mc_state *state, u8 mode, s16 nfft)
274{
275 u16 i;
276 for (i = 58; i < 87; i++)
277 dib3000mc_write_word(state, i, impulse_noise_val[i-58]);
278
279 if (nfft == TRANSMISSION_MODE_8K) {
280 dib3000mc_write_word(state, 58, 0x3b);
281 dib3000mc_write_word(state, 84, 0x00);
282 dib3000mc_write_word(state, 85, 0x8200);
283 }
284
285 dib3000mc_write_word(state, 34, 0x1294);
286 dib3000mc_write_word(state, 35, 0x1ff8);
287 if (mode == 1)
288 dib3000mc_write_word(state, 55, dib3000mc_read_word(state, 55) | (1 << 10));
289}
290
291static int dib3000mc_init(struct dvb_frontend *demod)
292{
293 struct dib3000mc_state *state = demod->demodulator_priv;
294 struct dibx000_agc_config *agc = state->cfg->agc;
295
296
297 dib3000mc_write_word(state, 1027, 0x8000);
298 dib3000mc_write_word(state, 1027, 0x0000);
299
300
301 dib3000mc_write_word(state, 140, 0x0000);
302 dib3000mc_write_word(state, 1031, 0);
303
304 if (state->cfg->mobile_mode) {
305 dib3000mc_write_word(state, 139, 0x0000);
306 dib3000mc_write_word(state, 141, 0x0000);
307 dib3000mc_write_word(state, 175, 0x0002);
308 dib3000mc_write_word(state, 1032, 0x0000);
309 } else {
310 dib3000mc_write_word(state, 139, 0x0001);
311 dib3000mc_write_word(state, 141, 0x0000);
312 dib3000mc_write_word(state, 175, 0x0000);
313 dib3000mc_write_word(state, 1032, 0x012C);
314 }
315 dib3000mc_write_word(state, 1033, 0x0000);
316
317
318 dib3000mc_write_word(state, 1037, 0x3130);
319
320
321
322
323 dib3000mc_write_word(state, 33, (5 << 0));
324 dib3000mc_write_word(state, 88, (1 << 10) | (0x10 << 0));
325
326
327
328 dib3000mc_write_word(state, 99, (1 << 9) | (0x20 << 0));
329
330 if (state->cfg->phase_noise_mode == 0)
331 dib3000mc_write_word(state, 111, 0x00);
332 else
333 dib3000mc_write_word(state, 111, 0x02);
334
335
336 dib3000mc_write_word(state, 50, 0x8000);
337
338
339 dib3000mc_setup_pwm_state(state);
340
341
342 dib3000mc_write_word(state, 53, 0x87);
343
344 dib3000mc_write_word(state, 54, 0x87);
345
346
347 dib3000mc_write_word(state, 36, state->cfg->max_time);
348 dib3000mc_write_word(state, 37, (state->cfg->agc_command1 << 13) | (state->cfg->agc_command2 << 12) | (0x1d << 0));
349 dib3000mc_write_word(state, 38, state->cfg->pwm3_value);
350 dib3000mc_write_word(state, 39, state->cfg->ln_adc_level);
351
352
353 dib3000mc_write_word(state, 40, 0x0179);
354 dib3000mc_write_word(state, 41, 0x03f0);
355
356 dib3000mc_write_word(state, 42, agc->agc1_max);
357 dib3000mc_write_word(state, 43, agc->agc1_min);
358 dib3000mc_write_word(state, 44, agc->agc2_max);
359 dib3000mc_write_word(state, 45, agc->agc2_min);
360 dib3000mc_write_word(state, 46, (agc->agc1_pt1 << 8) | agc->agc1_pt2);
361 dib3000mc_write_word(state, 47, (agc->agc1_slope1 << 8) | agc->agc1_slope2);
362 dib3000mc_write_word(state, 48, (agc->agc2_pt1 << 8) | agc->agc2_pt2);
363 dib3000mc_write_word(state, 49, (agc->agc2_slope1 << 8) | agc->agc2_slope2);
364
365
366
367 dib3000mc_write_word(state, 110, 3277);
368
369 dib3000mc_write_word(state, 26, 0x6680);
370
371 dib3000mc_write_word(state, 1, 4);
372
373 dib3000mc_write_word(state, 2, 4);
374
375 dib3000mc_write_word(state, 3, 0x1000);
376
377 dib3000mc_write_word(state, 5, 1);
378
379 dib3000mc_set_bandwidth(state, 8000);
380
381
382 dib3000mc_write_word(state, 4, 0x814);
383
384 dib3000mc_write_word(state, 21, (1 << 9) | 0x164);
385 dib3000mc_write_word(state, 22, 0x463d);
386
387
388
389 dib3000mc_write_word(state, 120, 0x200f);
390
391 dib3000mc_write_word(state, 134, 0);
392
393
394 dib3000mc_write_word(state, 195, 0x10);
395
396
397 dib3000mc_write_word(state, 180, 0x2FF0);
398
399
400 dib3000mc_set_impulse_noise(state, 0, TRANSMISSION_MODE_8K);
401
402
403 dib3000mc_set_output_mode(state, OUTMODE_HIGH_Z);
404
405
406 dib3000mc_write_word(state, 769, (1 << 7) );
407
408 return 0;
409}
410
411static int dib3000mc_sleep(struct dvb_frontend *demod)
412{
413 struct dib3000mc_state *state = demod->demodulator_priv;
414
415 dib3000mc_write_word(state, 1031, 0xFFFF);
416 dib3000mc_write_word(state, 1032, 0xFFFF);
417 dib3000mc_write_word(state, 1033, 0xFFF0);
418
419 return 0;
420}
421
422static void dib3000mc_set_adp_cfg(struct dib3000mc_state *state, s16 qam)
423{
424 u16 cfg[4] = { 0 },reg;
425 switch (qam) {
426 case QPSK:
427 cfg[0] = 0x099a; cfg[1] = 0x7fae; cfg[2] = 0x0333; cfg[3] = 0x7ff0;
428 break;
429 case QAM_16:
430 cfg[0] = 0x023d; cfg[1] = 0x7fdf; cfg[2] = 0x00a4; cfg[3] = 0x7ff0;
431 break;
432 case QAM_64:
433 cfg[0] = 0x0148; cfg[1] = 0x7ff0; cfg[2] = 0x00a4; cfg[3] = 0x7ff8;
434 break;
435 }
436 for (reg = 129; reg < 133; reg++)
437 dib3000mc_write_word(state, reg, cfg[reg - 129]);
438}
439
440static void dib3000mc_set_channel_cfg(struct dib3000mc_state *state, struct dvb_frontend_parameters *ch, u16 seq)
441{
442 u16 value;
443 dib3000mc_set_bandwidth(state, BANDWIDTH_TO_KHZ(ch->u.ofdm.bandwidth));
444 dib3000mc_set_timing(state, ch->u.ofdm.transmission_mode, BANDWIDTH_TO_KHZ(ch->u.ofdm.bandwidth), 0);
445
446
447
448
449 dib3000mc_write_word(state, 100, (16 << 6) + 9);
450
451 dib3000mc_write_word(state, 1027, 0x0800);
452 dib3000mc_write_word(state, 1027, 0x0000);
453
454
455 dib3000mc_write_word(state, 26, 0x6680);
456 dib3000mc_write_word(state, 29, 0x1273);
457 dib3000mc_write_word(state, 33, 5);
458 dib3000mc_set_adp_cfg(state, QAM_16);
459 dib3000mc_write_word(state, 133, 15564);
460
461 dib3000mc_write_word(state, 12 , 0x0);
462 dib3000mc_write_word(state, 13 , 0x3e8);
463 dib3000mc_write_word(state, 14 , 0x0);
464 dib3000mc_write_word(state, 15 , 0x3f2);
465
466 dib3000mc_write_word(state, 93,0);
467 dib3000mc_write_word(state, 94,0);
468 dib3000mc_write_word(state, 95,0);
469 dib3000mc_write_word(state, 96,0);
470 dib3000mc_write_word(state, 97,0);
471 dib3000mc_write_word(state, 98,0);
472
473 dib3000mc_set_impulse_noise(state, 0, ch->u.ofdm.transmission_mode);
474
475 value = 0;
476 switch (ch->u.ofdm.transmission_mode) {
477 case TRANSMISSION_MODE_2K: value |= (0 << 7); break;
478 default:
479 case TRANSMISSION_MODE_8K: value |= (1 << 7); break;
480 }
481 switch (ch->u.ofdm.guard_interval) {
482 case GUARD_INTERVAL_1_32: value |= (0 << 5); break;
483 case GUARD_INTERVAL_1_16: value |= (1 << 5); break;
484 case GUARD_INTERVAL_1_4: value |= (3 << 5); break;
485 default:
486 case GUARD_INTERVAL_1_8: value |= (2 << 5); break;
487 }
488 switch (ch->u.ofdm.constellation) {
489 case QPSK: value |= (0 << 3); break;
490 case QAM_16: value |= (1 << 3); break;
491 default:
492 case QAM_64: value |= (2 << 3); break;
493 }
494 switch (HIERARCHY_1) {
495 case HIERARCHY_2: value |= 2; break;
496 case HIERARCHY_4: value |= 4; break;
497 default:
498 case HIERARCHY_1: value |= 1; break;
499 }
500 dib3000mc_write_word(state, 0, value);
501 dib3000mc_write_word(state, 5, (1 << 8) | ((seq & 0xf) << 4));
502
503 value = 0;
504 if (ch->u.ofdm.hierarchy_information == 1)
505 value |= (1 << 4);
506 if (1 == 1)
507 value |= 1;
508 switch ((ch->u.ofdm.hierarchy_information == 0 || 1 == 1) ? ch->u.ofdm.code_rate_HP : ch->u.ofdm.code_rate_LP) {
509 case FEC_2_3: value |= (2 << 1); break;
510 case FEC_3_4: value |= (3 << 1); break;
511 case FEC_5_6: value |= (5 << 1); break;
512 case FEC_7_8: value |= (7 << 1); break;
513 default:
514 case FEC_1_2: value |= (1 << 1); break;
515 }
516 dib3000mc_write_word(state, 181, value);
517
518
519 switch (ch->u.ofdm.transmission_mode) {
520 case TRANSMISSION_MODE_8K: value = 256; break;
521 case TRANSMISSION_MODE_2K:
522 default: value = 64; break;
523 }
524 switch (ch->u.ofdm.guard_interval) {
525 case GUARD_INTERVAL_1_16: value *= 2; break;
526 case GUARD_INTERVAL_1_8: value *= 4; break;
527 case GUARD_INTERVAL_1_4: value *= 8; break;
528 default:
529 case GUARD_INTERVAL_1_32: value *= 1; break;
530 }
531 value <<= 4;
532 value |= dib3000mc_read_word(state, 180) & 0x000f;
533 dib3000mc_write_word(state, 180, value);
534
535
536 value = dib3000mc_read_word(state, 0);
537 dib3000mc_write_word(state, 0, value | (1 << 9));
538 dib3000mc_write_word(state, 0, value);
539
540 msleep(30);
541
542 dib3000mc_set_impulse_noise(state, state->cfg->impulse_noise_mode, ch->u.ofdm.transmission_mode);
543}
544
545static int dib3000mc_autosearch_start(struct dvb_frontend *demod, struct dvb_frontend_parameters *chan)
546{
547 struct dib3000mc_state *state = demod->demodulator_priv;
548 u16 reg;
549
550 struct dvb_frontend_parameters schan;
551
552 schan = *chan;
553
554
555
556
557 schan.u.ofdm.transmission_mode = TRANSMISSION_MODE_8K;
558 schan.u.ofdm.guard_interval = GUARD_INTERVAL_1_32;
559 schan.u.ofdm.constellation = QAM_64;
560 schan.u.ofdm.code_rate_HP = FEC_2_3;
561 schan.u.ofdm.code_rate_LP = FEC_2_3;
562 schan.u.ofdm.hierarchy_information = 0;
563
564 dib3000mc_set_channel_cfg(state, &schan, 11);
565
566 reg = dib3000mc_read_word(state, 0);
567 dib3000mc_write_word(state, 0, reg | (1 << 8));
568 dib3000mc_read_word(state, 511);
569 dib3000mc_write_word(state, 0, reg);
570
571 return 0;
572}
573
574static int dib3000mc_autosearch_is_irq(struct dvb_frontend *demod)
575{
576 struct dib3000mc_state *state = demod->demodulator_priv;
577 u16 irq_pending = dib3000mc_read_word(state, 511);
578
579 if (irq_pending & 0x1)
580 return 1;
581
582 if (irq_pending & 0x2)
583 return 2;
584
585 return 0;
586}
587
588static int dib3000mc_tune(struct dvb_frontend *demod, struct dvb_frontend_parameters *ch)
589{
590 struct dib3000mc_state *state = demod->demodulator_priv;
591
592
593 dib3000mc_set_channel_cfg(state, ch, 0);
594
595
596 if (state->sfn_workaround_active) {
597 dprintk("SFN workaround is active\n");
598 dib3000mc_write_word(state, 29, 0x1273);
599 dib3000mc_write_word(state, 108, 0x4000);
600 } else {
601 dib3000mc_write_word(state, 29, 0x1073);
602 dib3000mc_write_word(state, 108, 0x0000);
603 }
604
605 dib3000mc_set_adp_cfg(state, (u8)ch->u.ofdm.constellation);
606 if (ch->u.ofdm.transmission_mode == TRANSMISSION_MODE_8K) {
607 dib3000mc_write_word(state, 26, 38528);
608 dib3000mc_write_word(state, 33, 8);
609 } else {
610 dib3000mc_write_word(state, 26, 30336);
611 dib3000mc_write_word(state, 33, 6);
612 }
613
614 if (dib3000mc_read_word(state, 509) & 0x80)
615 dib3000mc_set_timing(state, ch->u.ofdm.transmission_mode, BANDWIDTH_TO_KHZ(ch->u.ofdm.bandwidth), 1);
616
617 return 0;
618}
619
620struct i2c_adapter * dib3000mc_get_tuner_i2c_master(struct dvb_frontend *demod, int gating)
621{
622 struct dib3000mc_state *st = demod->demodulator_priv;
623 return dibx000_get_i2c_adapter(&st->i2c_master, DIBX000_I2C_INTERFACE_TUNER, gating);
624}
625
626EXPORT_SYMBOL(dib3000mc_get_tuner_i2c_master);
627
628static int dib3000mc_get_frontend(struct dvb_frontend* fe,
629 struct dvb_frontend_parameters *fep)
630{
631 struct dib3000mc_state *state = fe->demodulator_priv;
632 u16 tps = dib3000mc_read_word(state,458);
633
634 fep->inversion = INVERSION_AUTO;
635
636 fep->u.ofdm.bandwidth = state->current_bandwidth;
637
638 switch ((tps >> 8) & 0x1) {
639 case 0: fep->u.ofdm.transmission_mode = TRANSMISSION_MODE_2K; break;
640 case 1: fep->u.ofdm.transmission_mode = TRANSMISSION_MODE_8K; break;
641 }
642
643 switch (tps & 0x3) {
644 case 0: fep->u.ofdm.guard_interval = GUARD_INTERVAL_1_32; break;
645 case 1: fep->u.ofdm.guard_interval = GUARD_INTERVAL_1_16; break;
646 case 2: fep->u.ofdm.guard_interval = GUARD_INTERVAL_1_8; break;
647 case 3: fep->u.ofdm.guard_interval = GUARD_INTERVAL_1_4; break;
648 }
649
650 switch ((tps >> 13) & 0x3) {
651 case 0: fep->u.ofdm.constellation = QPSK; break;
652 case 1: fep->u.ofdm.constellation = QAM_16; break;
653 case 2:
654 default: fep->u.ofdm.constellation = QAM_64; break;
655 }
656
657
658
659
660 fep->u.ofdm.hierarchy_information = HIERARCHY_NONE;
661 switch ((tps >> 5) & 0x7) {
662 case 1: fep->u.ofdm.code_rate_HP = FEC_1_2; break;
663 case 2: fep->u.ofdm.code_rate_HP = FEC_2_3; break;
664 case 3: fep->u.ofdm.code_rate_HP = FEC_3_4; break;
665 case 5: fep->u.ofdm.code_rate_HP = FEC_5_6; break;
666 case 7:
667 default: fep->u.ofdm.code_rate_HP = FEC_7_8; break;
668
669 }
670
671 switch ((tps >> 2) & 0x7) {
672 case 1: fep->u.ofdm.code_rate_LP = FEC_1_2; break;
673 case 2: fep->u.ofdm.code_rate_LP = FEC_2_3; break;
674 case 3: fep->u.ofdm.code_rate_LP = FEC_3_4; break;
675 case 5: fep->u.ofdm.code_rate_LP = FEC_5_6; break;
676 case 7:
677 default: fep->u.ofdm.code_rate_LP = FEC_7_8; break;
678 }
679
680 return 0;
681}
682
683static int dib3000mc_set_frontend(struct dvb_frontend* fe,
684 struct dvb_frontend_parameters *fep)
685{
686 struct dib3000mc_state *state = fe->demodulator_priv;
687 int ret;
688
689 dib3000mc_set_output_mode(state, OUTMODE_HIGH_Z);
690
691 state->current_bandwidth = fep->u.ofdm.bandwidth;
692 dib3000mc_set_bandwidth(state, BANDWIDTH_TO_KHZ(fep->u.ofdm.bandwidth));
693
694
695 state->sfn_workaround_active = buggy_sfn_workaround;
696
697 if (fe->ops.tuner_ops.set_params) {
698 fe->ops.tuner_ops.set_params(fe, fep);
699 msleep(100);
700 }
701
702 if (fep->u.ofdm.transmission_mode == TRANSMISSION_MODE_AUTO ||
703 fep->u.ofdm.guard_interval == GUARD_INTERVAL_AUTO ||
704 fep->u.ofdm.constellation == QAM_AUTO ||
705 fep->u.ofdm.code_rate_HP == FEC_AUTO) {
706 int i = 1000, found;
707
708 dib3000mc_autosearch_start(fe, fep);
709 do {
710 msleep(1);
711 found = dib3000mc_autosearch_is_irq(fe);
712 } while (found == 0 && i--);
713
714 dprintk("autosearch returns: %d\n",found);
715 if (found == 0 || found == 1)
716 return 0;
717
718 dib3000mc_get_frontend(fe, fep);
719 }
720
721 ret = dib3000mc_tune(fe, fep);
722
723
724 dib3000mc_set_output_mode(state, OUTMODE_MPEG2_FIFO);
725 return ret;
726}
727
728static int dib3000mc_read_status(struct dvb_frontend *fe, fe_status_t *stat)
729{
730 struct dib3000mc_state *state = fe->demodulator_priv;
731 u16 lock = dib3000mc_read_word(state, 509);
732
733 *stat = 0;
734
735 if (lock & 0x8000)
736 *stat |= FE_HAS_SIGNAL;
737 if (lock & 0x3000)
738 *stat |= FE_HAS_CARRIER;
739 if (lock & 0x0100)
740 *stat |= FE_HAS_VITERBI;
741 if (lock & 0x0010)
742 *stat |= FE_HAS_SYNC;
743 if (lock & 0x0008)
744 *stat |= FE_HAS_LOCK;
745
746 return 0;
747}
748
749static int dib3000mc_read_ber(struct dvb_frontend *fe, u32 *ber)
750{
751 struct dib3000mc_state *state = fe->demodulator_priv;
752 *ber = (dib3000mc_read_word(state, 500) << 16) | dib3000mc_read_word(state, 501);
753 return 0;
754}
755
756static int dib3000mc_read_unc_blocks(struct dvb_frontend *fe, u32 *unc)
757{
758 struct dib3000mc_state *state = fe->demodulator_priv;
759 *unc = dib3000mc_read_word(state, 508);
760 return 0;
761}
762
763static int dib3000mc_read_signal_strength(struct dvb_frontend *fe, u16 *strength)
764{
765 struct dib3000mc_state *state = fe->demodulator_priv;
766 u16 val = dib3000mc_read_word(state, 392);
767 *strength = 65535 - val;
768 return 0;
769}
770
771static int dib3000mc_read_snr(struct dvb_frontend* fe, u16 *snr)
772{
773 *snr = 0x0000;
774 return 0;
775}
776
777static int dib3000mc_fe_get_tune_settings(struct dvb_frontend* fe, struct dvb_frontend_tune_settings *tune)
778{
779 tune->min_delay_ms = 1000;
780 return 0;
781}
782
783static void dib3000mc_release(struct dvb_frontend *fe)
784{
785 struct dib3000mc_state *state = fe->demodulator_priv;
786 dibx000_exit_i2c_master(&state->i2c_master);
787 kfree(state);
788}
789
790int dib3000mc_pid_control(struct dvb_frontend *fe, int index, int pid,int onoff)
791{
792 struct dib3000mc_state *state = fe->demodulator_priv;
793 dib3000mc_write_word(state, 212 + index, onoff ? (1 << 13) | pid : 0);
794 return 0;
795}
796EXPORT_SYMBOL(dib3000mc_pid_control);
797
798int dib3000mc_pid_parse(struct dvb_frontend *fe, int onoff)
799{
800 struct dib3000mc_state *state = fe->demodulator_priv;
801 u16 tmp = dib3000mc_read_word(state, 206) & ~(1 << 4);
802 tmp |= (onoff << 4);
803 return dib3000mc_write_word(state, 206, tmp);
804}
805EXPORT_SYMBOL(dib3000mc_pid_parse);
806
807void dib3000mc_set_config(struct dvb_frontend *fe, struct dib3000mc_config *cfg)
808{
809 struct dib3000mc_state *state = fe->demodulator_priv;
810 state->cfg = cfg;
811}
812EXPORT_SYMBOL(dib3000mc_set_config);
813
814int dib3000mc_i2c_enumeration(struct i2c_adapter *i2c, int no_of_demods, u8 default_addr, struct dib3000mc_config cfg[])
815{
816 struct dib3000mc_state st = { .i2c_adap = i2c };
817 int k;
818 u8 new_addr;
819
820 static u8 DIB3000MC_I2C_ADDRESS[] = {20,22,24,26};
821
822 for (k = no_of_demods-1; k >= 0; k--) {
823 st.cfg = &cfg[k];
824
825
826 new_addr = DIB3000MC_I2C_ADDRESS[k];
827 st.i2c_addr = new_addr;
828 if (dib3000mc_identify(&st) != 0) {
829 st.i2c_addr = default_addr;
830 if (dib3000mc_identify(&st) != 0) {
831 dprintk("-E- DiB3000P/MC #%d: not identified\n", k);
832 return -ENODEV;
833 }
834 }
835
836 dib3000mc_set_output_mode(&st, OUTMODE_MPEG2_PAR_CONT_CLK);
837
838
839 dib3000mc_write_word(&st, 1024, (new_addr << 3) | 0x1);
840 st.i2c_addr = new_addr;
841 }
842
843 for (k = 0; k < no_of_demods; k++) {
844 st.cfg = &cfg[k];
845 st.i2c_addr = DIB3000MC_I2C_ADDRESS[k];
846
847 dib3000mc_write_word(&st, 1024, st.i2c_addr << 3);
848
849
850 dib3000mc_set_output_mode(&st, OUTMODE_HIGH_Z);
851 }
852 return 0;
853}
854EXPORT_SYMBOL(dib3000mc_i2c_enumeration);
855
856static struct dvb_frontend_ops dib3000mc_ops;
857
858struct dvb_frontend * dib3000mc_attach(struct i2c_adapter *i2c_adap, u8 i2c_addr, struct dib3000mc_config *cfg)
859{
860 struct dvb_frontend *demod;
861 struct dib3000mc_state *st;
862 st = kzalloc(sizeof(struct dib3000mc_state), GFP_KERNEL);
863 if (st == NULL)
864 return NULL;
865
866 st->cfg = cfg;
867 st->i2c_adap = i2c_adap;
868 st->i2c_addr = i2c_addr;
869
870 demod = &st->demod;
871 demod->demodulator_priv = st;
872 memcpy(&st->demod.ops, &dib3000mc_ops, sizeof(struct dvb_frontend_ops));
873
874 if (dib3000mc_identify(st) != 0)
875 goto error;
876
877 dibx000_init_i2c_master(&st->i2c_master, DIB3000MC, st->i2c_adap, st->i2c_addr);
878
879 dib3000mc_write_word(st, 1037, 0x3130);
880
881 return demod;
882
883error:
884 kfree(st);
885 return NULL;
886}
887EXPORT_SYMBOL(dib3000mc_attach);
888
889static struct dvb_frontend_ops dib3000mc_ops = {
890 .info = {
891 .name = "DiBcom 3000MC/P",
892 .type = FE_OFDM,
893 .frequency_min = 44250000,
894 .frequency_max = 867250000,
895 .frequency_stepsize = 62500,
896 .caps = FE_CAN_INVERSION_AUTO |
897 FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
898 FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
899 FE_CAN_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_64 | FE_CAN_QAM_AUTO |
900 FE_CAN_TRANSMISSION_MODE_AUTO |
901 FE_CAN_GUARD_INTERVAL_AUTO |
902 FE_CAN_RECOVER |
903 FE_CAN_HIERARCHY_AUTO,
904 },
905
906 .release = dib3000mc_release,
907
908 .init = dib3000mc_init,
909 .sleep = dib3000mc_sleep,
910
911 .set_frontend = dib3000mc_set_frontend,
912 .get_tune_settings = dib3000mc_fe_get_tune_settings,
913 .get_frontend = dib3000mc_get_frontend,
914
915 .read_status = dib3000mc_read_status,
916 .read_ber = dib3000mc_read_ber,
917 .read_signal_strength = dib3000mc_read_signal_strength,
918 .read_snr = dib3000mc_read_snr,
919 .read_ucblocks = dib3000mc_read_unc_blocks,
920};
921
922MODULE_AUTHOR("Patrick Boettcher <pboettcher@dibcom.fr>");
923MODULE_DESCRIPTION("Driver for the DiBcom 3000MC/P COFDM demodulator");
924MODULE_LICENSE("GPL");
925