1
2
3
4
5
6
7
8
9
10
11#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
12
13#include <linux/kernel.h>
14#include <linux/slab.h>
15#include <linux/i2c.h>
16#include <linux/mutex.h>
17#include <asm/div64.h>
18
19#include <media/dvb_math.h>
20
21#include <media/dvb_frontend.h>
22
23#include "dib8000.h"
24
25#define LAYER_ALL -1
26#define LAYER_A 1
27#define LAYER_B 2
28#define LAYER_C 3
29
30#define MAX_NUMBER_OF_FRONTENDS 6
31
32
33static int debug;
34module_param(debug, int, 0644);
35MODULE_PARM_DESC(debug, "turn on debugging (default: 0)");
36
37#define dprintk(fmt, arg...) do { \
38 if (debug) \
39 printk(KERN_DEBUG pr_fmt("%s: " fmt), \
40 __func__, ##arg); \
41} while (0)
42
43struct i2c_device {
44 struct i2c_adapter *adap;
45 u8 addr;
46 u8 *i2c_write_buffer;
47 u8 *i2c_read_buffer;
48 struct mutex *i2c_buffer_lock;
49};
50
51enum param_loop_step {
52 LOOP_TUNE_1,
53 LOOP_TUNE_2
54};
55
56enum dib8000_autosearch_step {
57 AS_START = 0,
58 AS_SEARCHING_FFT,
59 AS_SEARCHING_GUARD,
60 AS_DONE = 100,
61};
62
63enum timeout_mode {
64 SYMBOL_DEPENDENT_OFF = 0,
65 SYMBOL_DEPENDENT_ON,
66};
67
68struct dib8000_state {
69 struct dib8000_config cfg;
70
71 struct i2c_device i2c;
72
73 struct dibx000_i2c_master i2c_master;
74
75 u16 wbd_ref;
76
77 u8 current_band;
78 u32 current_bandwidth;
79 struct dibx000_agc_config *current_agc;
80 u32 timf;
81 u32 timf_default;
82
83 u8 div_force_off:1;
84 u8 div_state:1;
85 u16 div_sync_wait;
86
87 u8 agc_state;
88 u8 differential_constellation;
89 u8 diversity_onoff;
90
91 s16 ber_monitored_layer;
92 u16 gpio_dir;
93 u16 gpio_val;
94
95 u16 revision;
96 u8 isdbt_cfg_loaded;
97 enum frontend_tune_state tune_state;
98 s32 status;
99
100 struct dvb_frontend *fe[MAX_NUMBER_OF_FRONTENDS];
101
102
103 struct i2c_msg msg[2];
104 u8 i2c_write_buffer[4];
105 u8 i2c_read_buffer[2];
106 struct mutex i2c_buffer_lock;
107 u8 input_mode_mpeg;
108
109 u16 tuner_enable;
110 struct i2c_adapter dib8096p_tuner_adap;
111 u16 current_demod_bw;
112
113 u16 seg_mask;
114 u16 seg_diff_mask;
115 u16 mode;
116 u8 layer_b_nb_seg;
117 u8 layer_c_nb_seg;
118
119 u8 channel_parameters_set;
120 u16 autosearch_state;
121 u16 found_nfft;
122 u16 found_guard;
123 u8 subchannel;
124 u8 symbol_duration;
125 unsigned long timeout;
126 u8 longest_intlv_layer;
127 u16 output_mode;
128
129
130 s64 init_ucb;
131 unsigned long per_jiffies_stats;
132 unsigned long ber_jiffies_stats;
133 unsigned long ber_jiffies_stats_layer[3];
134
135#ifdef DIB8000_AGC_FREEZE
136 u16 agc1_max;
137 u16 agc1_min;
138 u16 agc2_max;
139 u16 agc2_min;
140#endif
141};
142
143enum dib8000_power_mode {
144 DIB8000_POWER_ALL = 0,
145 DIB8000_POWER_INTERFACE_ONLY,
146};
147
148static u16 dib8000_i2c_read16(struct i2c_device *i2c, u16 reg)
149{
150 u16 ret;
151 struct i2c_msg msg[2] = {
152 {.addr = i2c->addr >> 1, .flags = 0, .len = 2},
153 {.addr = i2c->addr >> 1, .flags = I2C_M_RD, .len = 2},
154 };
155
156 if (mutex_lock_interruptible(i2c->i2c_buffer_lock) < 0) {
157 dprintk("could not acquire lock\n");
158 return 0;
159 }
160
161 msg[0].buf = i2c->i2c_write_buffer;
162 msg[0].buf[0] = reg >> 8;
163 msg[0].buf[1] = reg & 0xff;
164 msg[1].buf = i2c->i2c_read_buffer;
165
166 if (i2c_transfer(i2c->adap, msg, 2) != 2)
167 dprintk("i2c read error on %d\n", reg);
168
169 ret = (msg[1].buf[0] << 8) | msg[1].buf[1];
170 mutex_unlock(i2c->i2c_buffer_lock);
171 return ret;
172}
173
174static u16 __dib8000_read_word(struct dib8000_state *state, u16 reg)
175{
176 u16 ret;
177
178 state->i2c_write_buffer[0] = reg >> 8;
179 state->i2c_write_buffer[1] = reg & 0xff;
180
181 memset(state->msg, 0, 2 * sizeof(struct i2c_msg));
182 state->msg[0].addr = state->i2c.addr >> 1;
183 state->msg[0].flags = 0;
184 state->msg[0].buf = state->i2c_write_buffer;
185 state->msg[0].len = 2;
186 state->msg[1].addr = state->i2c.addr >> 1;
187 state->msg[1].flags = I2C_M_RD;
188 state->msg[1].buf = state->i2c_read_buffer;
189 state->msg[1].len = 2;
190
191 if (i2c_transfer(state->i2c.adap, state->msg, 2) != 2)
192 dprintk("i2c read error on %d\n", reg);
193
194 ret = (state->i2c_read_buffer[0] << 8) | state->i2c_read_buffer[1];
195
196 return ret;
197}
198
199static u16 dib8000_read_word(struct dib8000_state *state, u16 reg)
200{
201 u16 ret;
202
203 if (mutex_lock_interruptible(&state->i2c_buffer_lock) < 0) {
204 dprintk("could not acquire lock\n");
205 return 0;
206 }
207
208 ret = __dib8000_read_word(state, reg);
209
210 mutex_unlock(&state->i2c_buffer_lock);
211
212 return ret;
213}
214
215static u32 dib8000_read32(struct dib8000_state *state, u16 reg)
216{
217 u16 rw[2];
218
219 if (mutex_lock_interruptible(&state->i2c_buffer_lock) < 0) {
220 dprintk("could not acquire lock\n");
221 return 0;
222 }
223
224 rw[0] = __dib8000_read_word(state, reg + 0);
225 rw[1] = __dib8000_read_word(state, reg + 1);
226
227 mutex_unlock(&state->i2c_buffer_lock);
228
229 return ((rw[0] << 16) | (rw[1]));
230}
231
232static int dib8000_i2c_write16(struct i2c_device *i2c, u16 reg, u16 val)
233{
234 struct i2c_msg msg = {.addr = i2c->addr >> 1, .flags = 0, .len = 4};
235 int ret = 0;
236
237 if (mutex_lock_interruptible(i2c->i2c_buffer_lock) < 0) {
238 dprintk("could not acquire lock\n");
239 return -EINVAL;
240 }
241
242 msg.buf = i2c->i2c_write_buffer;
243 msg.buf[0] = (reg >> 8) & 0xff;
244 msg.buf[1] = reg & 0xff;
245 msg.buf[2] = (val >> 8) & 0xff;
246 msg.buf[3] = val & 0xff;
247
248 ret = i2c_transfer(i2c->adap, &msg, 1) != 1 ? -EREMOTEIO : 0;
249 mutex_unlock(i2c->i2c_buffer_lock);
250
251 return ret;
252}
253
254static int dib8000_write_word(struct dib8000_state *state, u16 reg, u16 val)
255{
256 int ret;
257
258 if (mutex_lock_interruptible(&state->i2c_buffer_lock) < 0) {
259 dprintk("could not acquire lock\n");
260 return -EINVAL;
261 }
262
263 state->i2c_write_buffer[0] = (reg >> 8) & 0xff;
264 state->i2c_write_buffer[1] = reg & 0xff;
265 state->i2c_write_buffer[2] = (val >> 8) & 0xff;
266 state->i2c_write_buffer[3] = val & 0xff;
267
268 memset(&state->msg[0], 0, sizeof(struct i2c_msg));
269 state->msg[0].addr = state->i2c.addr >> 1;
270 state->msg[0].flags = 0;
271 state->msg[0].buf = state->i2c_write_buffer;
272 state->msg[0].len = 4;
273
274 ret = (i2c_transfer(state->i2c.adap, state->msg, 1) != 1 ?
275 -EREMOTEIO : 0);
276 mutex_unlock(&state->i2c_buffer_lock);
277
278 return ret;
279}
280
281static const s16 coeff_2k_sb_1seg_dqpsk[8] = {
282 (769 << 5) | 0x0a, (745 << 5) | 0x03, (595 << 5) | 0x0d, (769 << 5) | 0x0a, (920 << 5) | 0x09, (784 << 5) | 0x02, (519 << 5) | 0x0c,
283 (920 << 5) | 0x09
284};
285
286static const s16 coeff_2k_sb_1seg[8] = {
287 (692 << 5) | 0x0b, (683 << 5) | 0x01, (519 << 5) | 0x09, (692 << 5) | 0x0b, 0 | 0x1f, 0 | 0x1f, 0 | 0x1f, 0 | 0x1f
288};
289
290static const s16 coeff_2k_sb_3seg_0dqpsk_1dqpsk[8] = {
291 (832 << 5) | 0x10, (912 << 5) | 0x05, (900 << 5) | 0x12, (832 << 5) | 0x10, (-931 << 5) | 0x0f, (912 << 5) | 0x04, (807 << 5) | 0x11,
292 (-931 << 5) | 0x0f
293};
294
295static const s16 coeff_2k_sb_3seg_0dqpsk[8] = {
296 (622 << 5) | 0x0c, (941 << 5) | 0x04, (796 << 5) | 0x10, (622 << 5) | 0x0c, (982 << 5) | 0x0c, (519 << 5) | 0x02, (572 << 5) | 0x0e,
297 (982 << 5) | 0x0c
298};
299
300static const s16 coeff_2k_sb_3seg_1dqpsk[8] = {
301 (699 << 5) | 0x14, (607 << 5) | 0x04, (944 << 5) | 0x13, (699 << 5) | 0x14, (-720 << 5) | 0x0d, (640 << 5) | 0x03, (866 << 5) | 0x12,
302 (-720 << 5) | 0x0d
303};
304
305static const s16 coeff_2k_sb_3seg[8] = {
306 (664 << 5) | 0x0c, (925 << 5) | 0x03, (937 << 5) | 0x10, (664 << 5) | 0x0c, (-610 << 5) | 0x0a, (697 << 5) | 0x01, (836 << 5) | 0x0e,
307 (-610 << 5) | 0x0a
308};
309
310static const s16 coeff_4k_sb_1seg_dqpsk[8] = {
311 (-955 << 5) | 0x0e, (687 << 5) | 0x04, (818 << 5) | 0x10, (-955 << 5) | 0x0e, (-922 << 5) | 0x0d, (750 << 5) | 0x03, (665 << 5) | 0x0f,
312 (-922 << 5) | 0x0d
313};
314
315static const s16 coeff_4k_sb_1seg[8] = {
316 (638 << 5) | 0x0d, (683 << 5) | 0x02, (638 << 5) | 0x0d, (638 << 5) | 0x0d, (-655 << 5) | 0x0a, (517 << 5) | 0x00, (698 << 5) | 0x0d,
317 (-655 << 5) | 0x0a
318};
319
320static const s16 coeff_4k_sb_3seg_0dqpsk_1dqpsk[8] = {
321 (-707 << 5) | 0x14, (910 << 5) | 0x06, (889 << 5) | 0x16, (-707 << 5) | 0x14, (-958 << 5) | 0x13, (993 << 5) | 0x05, (523 << 5) | 0x14,
322 (-958 << 5) | 0x13
323};
324
325static const s16 coeff_4k_sb_3seg_0dqpsk[8] = {
326 (-723 << 5) | 0x13, (910 << 5) | 0x05, (777 << 5) | 0x14, (-723 << 5) | 0x13, (-568 << 5) | 0x0f, (547 << 5) | 0x03, (696 << 5) | 0x12,
327 (-568 << 5) | 0x0f
328};
329
330static const s16 coeff_4k_sb_3seg_1dqpsk[8] = {
331 (-940 << 5) | 0x15, (607 << 5) | 0x05, (915 << 5) | 0x16, (-940 << 5) | 0x15, (-848 << 5) | 0x13, (683 << 5) | 0x04, (543 << 5) | 0x14,
332 (-848 << 5) | 0x13
333};
334
335static const s16 coeff_4k_sb_3seg[8] = {
336 (612 << 5) | 0x12, (910 << 5) | 0x04, (864 << 5) | 0x14, (612 << 5) | 0x12, (-869 << 5) | 0x13, (683 << 5) | 0x02, (869 << 5) | 0x12,
337 (-869 << 5) | 0x13
338};
339
340static const s16 coeff_8k_sb_1seg_dqpsk[8] = {
341 (-835 << 5) | 0x12, (684 << 5) | 0x05, (735 << 5) | 0x14, (-835 << 5) | 0x12, (-598 << 5) | 0x10, (781 << 5) | 0x04, (739 << 5) | 0x13,
342 (-598 << 5) | 0x10
343};
344
345static const s16 coeff_8k_sb_1seg[8] = {
346 (673 << 5) | 0x0f, (683 << 5) | 0x03, (808 << 5) | 0x12, (673 << 5) | 0x0f, (585 << 5) | 0x0f, (512 << 5) | 0x01, (780 << 5) | 0x0f,
347 (585 << 5) | 0x0f
348};
349
350static const s16 coeff_8k_sb_3seg_0dqpsk_1dqpsk[8] = {
351 (863 << 5) | 0x17, (930 << 5) | 0x07, (878 << 5) | 0x19, (863 << 5) | 0x17, (0 << 5) | 0x14, (521 << 5) | 0x05, (980 << 5) | 0x18,
352 (0 << 5) | 0x14
353};
354
355static const s16 coeff_8k_sb_3seg_0dqpsk[8] = {
356 (-924 << 5) | 0x17, (910 << 5) | 0x06, (774 << 5) | 0x17, (-924 << 5) | 0x17, (-877 << 5) | 0x15, (565 << 5) | 0x04, (553 << 5) | 0x15,
357 (-877 << 5) | 0x15
358};
359
360static const s16 coeff_8k_sb_3seg_1dqpsk[8] = {
361 (-921 << 5) | 0x19, (607 << 5) | 0x06, (881 << 5) | 0x19, (-921 << 5) | 0x19, (-921 << 5) | 0x14, (713 << 5) | 0x05, (1018 << 5) | 0x18,
362 (-921 << 5) | 0x14
363};
364
365static const s16 coeff_8k_sb_3seg[8] = {
366 (514 << 5) | 0x14, (910 << 5) | 0x05, (861 << 5) | 0x17, (514 << 5) | 0x14, (690 << 5) | 0x14, (683 << 5) | 0x03, (662 << 5) | 0x15,
367 (690 << 5) | 0x14
368};
369
370static const s16 ana_fe_coeff_3seg[24] = {
371 81, 80, 78, 74, 68, 61, 54, 45, 37, 28, 19, 11, 4, 1022, 1017, 1013, 1010, 1008, 1008, 1008, 1008, 1010, 1014, 1017
372};
373
374static const s16 ana_fe_coeff_1seg[24] = {
375 249, 226, 164, 82, 5, 981, 970, 988, 1018, 20, 31, 26, 8, 1012, 1000, 1018, 1012, 8, 15, 14, 9, 3, 1017, 1003
376};
377
378static const s16 ana_fe_coeff_13seg[24] = {
379 396, 305, 105, -51, -77, -12, 41, 31, -11, -30, -11, 14, 15, -2, -13, -7, 5, 8, 1, -6, -7, -3, 0, 1
380};
381
382static u16 fft_to_mode(struct dib8000_state *state)
383{
384 u16 mode;
385 switch (state->fe[0]->dtv_property_cache.transmission_mode) {
386 case TRANSMISSION_MODE_2K:
387 mode = 1;
388 break;
389 case TRANSMISSION_MODE_4K:
390 mode = 2;
391 break;
392 default:
393 case TRANSMISSION_MODE_AUTO:
394 case TRANSMISSION_MODE_8K:
395 mode = 3;
396 break;
397 }
398 return mode;
399}
400
401static void dib8000_set_acquisition_mode(struct dib8000_state *state)
402{
403 u16 nud = dib8000_read_word(state, 298);
404 nud |= (1 << 3) | (1 << 0);
405 dprintk("acquisition mode activated\n");
406 dib8000_write_word(state, 298, nud);
407}
408static int dib8000_set_output_mode(struct dvb_frontend *fe, int mode)
409{
410 struct dib8000_state *state = fe->demodulator_priv;
411 u16 outreg, fifo_threshold, smo_mode, sram = 0x0205;
412
413 state->output_mode = mode;
414 outreg = 0;
415 fifo_threshold = 1792;
416 smo_mode = (dib8000_read_word(state, 299) & 0x0050) | (1 << 1);
417
418 dprintk("-I- Setting output mode for demod %p to %d\n",
419 &state->fe[0], mode);
420
421 switch (mode) {
422 case OUTMODE_MPEG2_PAR_GATED_CLK:
423 outreg = (1 << 10);
424 break;
425 case OUTMODE_MPEG2_PAR_CONT_CLK:
426 outreg = (1 << 10) | (1 << 6);
427 break;
428 case OUTMODE_MPEG2_SERIAL:
429 outreg = (1 << 10) | (2 << 6) | (0 << 1);
430 break;
431 case OUTMODE_DIVERSITY:
432 if (state->cfg.hostbus_diversity) {
433 outreg = (1 << 10) | (4 << 6);
434 sram &= 0xfdff;
435 } else
436 sram |= 0x0c00;
437 break;
438 case OUTMODE_MPEG2_FIFO:
439 smo_mode |= (3 << 1);
440 fifo_threshold = 512;
441 outreg = (1 << 10) | (5 << 6);
442 break;
443 case OUTMODE_HIGH_Z:
444 outreg = 0;
445 break;
446
447 case OUTMODE_ANALOG_ADC:
448 outreg = (1 << 10) | (3 << 6);
449 dib8000_set_acquisition_mode(state);
450 break;
451
452 default:
453 dprintk("Unhandled output_mode passed to be set for demod %p\n",
454 &state->fe[0]);
455 return -EINVAL;
456 }
457
458 if (state->cfg.output_mpeg2_in_188_bytes)
459 smo_mode |= (1 << 5);
460
461 dib8000_write_word(state, 299, smo_mode);
462 dib8000_write_word(state, 300, fifo_threshold);
463 dib8000_write_word(state, 1286, outreg);
464 dib8000_write_word(state, 1291, sram);
465
466 return 0;
467}
468
469static int dib8000_set_diversity_in(struct dvb_frontend *fe, int onoff)
470{
471 struct dib8000_state *state = fe->demodulator_priv;
472 u16 tmp, sync_wait = dib8000_read_word(state, 273) & 0xfff0;
473
474 dprintk("set diversity input to %i\n", onoff);
475 if (!state->differential_constellation) {
476 dib8000_write_word(state, 272, 1 << 9);
477 dib8000_write_word(state, 273, sync_wait | (1 << 2) | 2);
478 } else {
479 dib8000_write_word(state, 272, 0);
480 dib8000_write_word(state, 273, sync_wait);
481 }
482 state->diversity_onoff = onoff;
483
484 switch (onoff) {
485 case 0:
486 dib8000_write_word(state, 270, 1);
487 dib8000_write_word(state, 271, 0);
488 break;
489 case 1:
490 dib8000_write_word(state, 270, 6);
491 dib8000_write_word(state, 271, 6);
492 break;
493 case 2:
494 dib8000_write_word(state, 270, 0);
495 dib8000_write_word(state, 271, 1);
496 break;
497 }
498
499 if (state->revision == 0x8002) {
500 tmp = dib8000_read_word(state, 903);
501 dib8000_write_word(state, 903, tmp & ~(1 << 3));
502 msleep(30);
503 dib8000_write_word(state, 903, tmp | (1 << 3));
504 }
505 return 0;
506}
507
508static void dib8000_set_power_mode(struct dib8000_state *state, enum dib8000_power_mode mode)
509{
510
511 u16 reg_774 = 0x3fff, reg_775 = 0xffff, reg_776 = 0xffff,
512 reg_900 = (dib8000_read_word(state, 900) & 0xfffc) | 0x3,
513 reg_1280;
514
515 if (state->revision != 0x8090)
516 reg_1280 = (dib8000_read_word(state, 1280) & 0x00ff) | 0xff00;
517 else
518 reg_1280 = (dib8000_read_word(state, 1280) & 0x707f) | 0x8f80;
519
520
521 switch (mode) {
522
523 case DIB8000_POWER_ALL:
524 reg_774 = 0x0000;
525 reg_775 = 0x0000;
526 reg_776 = 0x0000;
527 reg_900 &= 0xfffc;
528 if (state->revision != 0x8090)
529 reg_1280 &= 0x00ff;
530 else
531 reg_1280 &= 0x707f;
532 break;
533 case DIB8000_POWER_INTERFACE_ONLY:
534 if (state->revision != 0x8090)
535 reg_1280 &= 0x00ff;
536 else
537 reg_1280 &= 0xfa7b;
538 break;
539 }
540
541 dprintk("powermode : 774 : %x ; 775 : %x; 776 : %x ; 900 : %x; 1280 : %x\n", reg_774, reg_775, reg_776, reg_900, reg_1280);
542 dib8000_write_word(state, 774, reg_774);
543 dib8000_write_word(state, 775, reg_775);
544 dib8000_write_word(state, 776, reg_776);
545 dib8000_write_word(state, 900, reg_900);
546 dib8000_write_word(state, 1280, reg_1280);
547}
548
549static int dib8000_set_adc_state(struct dib8000_state *state, enum dibx000_adc_states no)
550{
551 int ret = 0;
552 u16 reg, reg_907 = dib8000_read_word(state, 907);
553 u16 reg_908 = dib8000_read_word(state, 908);
554
555 switch (no) {
556 case DIBX000_SLOW_ADC_ON:
557 if (state->revision != 0x8090) {
558 reg_908 |= (1 << 1) | (1 << 0);
559 ret |= dib8000_write_word(state, 908, reg_908);
560 reg_908 &= ~(1 << 1);
561 } else {
562 reg = dib8000_read_word(state, 1925);
563
564 dib8000_write_word(state, 1925, reg |
565 (1<<4) | (1<<2));
566
567
568 reg = dib8000_read_word(state, 1925);
569 msleep(20);
570
571 dib8000_write_word(state, 1925, reg & ~(1<<4));
572
573 reg = dib8000_read_word(state, 921) & ~((0x3 << 14)
574 | (0x3 << 12));
575
576
577 dib8000_write_word(state, 921, reg | (1 << 14)
578 | (3 << 12));
579 }
580 break;
581
582 case DIBX000_SLOW_ADC_OFF:
583 if (state->revision == 0x8090) {
584 reg = dib8000_read_word(state, 1925);
585
586 dib8000_write_word(state, 1925,
587 (reg & ~(1<<2)) | (1<<4));
588 }
589 reg_908 |= (1 << 1) | (1 << 0);
590 break;
591
592 case DIBX000_ADC_ON:
593 reg_907 &= 0x0fff;
594 reg_908 &= 0x0003;
595 break;
596
597 case DIBX000_ADC_OFF:
598 reg_907 = (1 << 13) | (1 << 12);
599 reg_908 = (1 << 6) | (1 << 5) | (1 << 4) | (1 << 3) | (1 << 1);
600 break;
601
602 case DIBX000_VBG_ENABLE:
603 reg_907 &= ~(1 << 15);
604 break;
605
606 case DIBX000_VBG_DISABLE:
607 reg_907 |= (1 << 15);
608 break;
609
610 default:
611 break;
612 }
613
614 ret |= dib8000_write_word(state, 907, reg_907);
615 ret |= dib8000_write_word(state, 908, reg_908);
616
617 return ret;
618}
619
620static int dib8000_set_bandwidth(struct dvb_frontend *fe, u32 bw)
621{
622 struct dib8000_state *state = fe->demodulator_priv;
623 u32 timf;
624
625 if (bw == 0)
626 bw = 6000;
627
628 if (state->timf == 0) {
629 dprintk("using default timf\n");
630 timf = state->timf_default;
631 } else {
632 dprintk("using updated timf\n");
633 timf = state->timf;
634 }
635
636 dib8000_write_word(state, 29, (u16) ((timf >> 16) & 0xffff));
637 dib8000_write_word(state, 30, (u16) ((timf) & 0xffff));
638
639 return 0;
640}
641
642static int dib8000_sad_calib(struct dib8000_state *state)
643{
644 u8 sad_sel = 3;
645
646 if (state->revision == 0x8090) {
647 dib8000_write_word(state, 922, (sad_sel << 2));
648 dib8000_write_word(state, 923, 2048);
649
650 dib8000_write_word(state, 922, (sad_sel << 2) | 0x1);
651 dib8000_write_word(state, 922, (sad_sel << 2));
652 } else {
653
654 dib8000_write_word(state, 923, (0 << 1) | (0 << 0));
655 dib8000_write_word(state, 924, 776);
656
657
658 dib8000_write_word(state, 923, (1 << 0));
659 dib8000_write_word(state, 923, (0 << 0));
660 }
661
662 msleep(1);
663 return 0;
664}
665
666static int dib8000_set_wbd_ref(struct dvb_frontend *fe, u16 value)
667{
668 struct dib8000_state *state = fe->demodulator_priv;
669 if (value > 4095)
670 value = 4095;
671 state->wbd_ref = value;
672 return dib8000_write_word(state, 106, value);
673}
674
675static void dib8000_reset_pll_common(struct dib8000_state *state, const struct dibx000_bandwidth_config *bw)
676{
677 dprintk("ifreq: %d %x, inversion: %d\n", bw->ifreq, bw->ifreq, bw->ifreq >> 25);
678 if (state->revision != 0x8090) {
679 dib8000_write_word(state, 23,
680 (u16) (((bw->internal * 1000) >> 16) & 0xffff));
681 dib8000_write_word(state, 24,
682 (u16) ((bw->internal * 1000) & 0xffff));
683 } else {
684 dib8000_write_word(state, 23, (u16) (((bw->internal / 2 * 1000) >> 16) & 0xffff));
685 dib8000_write_word(state, 24,
686 (u16) ((bw->internal / 2 * 1000) & 0xffff));
687 }
688 dib8000_write_word(state, 27, (u16) ((bw->ifreq >> 16) & 0x01ff));
689 dib8000_write_word(state, 28, (u16) (bw->ifreq & 0xffff));
690 dib8000_write_word(state, 26, (u16) ((bw->ifreq >> 25) & 0x0003));
691
692 if (state->revision != 0x8090)
693 dib8000_write_word(state, 922, bw->sad_cfg);
694}
695
696static void dib8000_reset_pll(struct dib8000_state *state)
697{
698 const struct dibx000_bandwidth_config *pll = state->cfg.pll;
699 u16 clk_cfg1, reg;
700
701 if (state->revision != 0x8090) {
702 dib8000_write_word(state, 901,
703 (pll->pll_prediv << 8) | (pll->pll_ratio << 0));
704
705 clk_cfg1 = (1 << 10) | (0 << 9) | (pll->IO_CLK_en_core << 8) |
706 (pll->bypclk_div << 5) | (pll->enable_refdiv << 4) |
707 (1 << 3) | (pll->pll_range << 1) |
708 (pll->pll_reset << 0);
709
710 dib8000_write_word(state, 902, clk_cfg1);
711 clk_cfg1 = (clk_cfg1 & 0xfff7) | (pll->pll_bypass << 3);
712 dib8000_write_word(state, 902, clk_cfg1);
713
714 dprintk("clk_cfg1: 0x%04x\n", clk_cfg1);
715
716
717 if (state->cfg.pll->ADClkSrc == 0)
718 dib8000_write_word(state, 904,
719 (0 << 15) | (0 << 12) | (0 << 10) |
720 (pll->modulo << 8) |
721 (pll->ADClkSrc << 7) | (0 << 1));
722 else if (state->cfg.refclksel != 0)
723 dib8000_write_word(state, 904, (0 << 15) | (1 << 12) |
724 ((state->cfg.refclksel & 0x3) << 10) |
725 (pll->modulo << 8) |
726 (pll->ADClkSrc << 7) | (0 << 1));
727 else
728 dib8000_write_word(state, 904, (0 << 15) | (1 << 12) |
729 (3 << 10) | (pll->modulo << 8) |
730 (pll->ADClkSrc << 7) | (0 << 1));
731 } else {
732 dib8000_write_word(state, 1856, (!pll->pll_reset<<13) |
733 (pll->pll_range<<12) | (pll->pll_ratio<<6) |
734 (pll->pll_prediv));
735
736 reg = dib8000_read_word(state, 1857);
737 dib8000_write_word(state, 1857, reg|(!pll->pll_bypass<<15));
738
739 reg = dib8000_read_word(state, 1858);
740 dib8000_write_word(state, 1858, reg | 1);
741
742 dib8000_write_word(state, 904, (pll->modulo << 8));
743 }
744
745 dib8000_reset_pll_common(state, pll);
746}
747
748static int dib8000_update_pll(struct dvb_frontend *fe,
749 struct dibx000_bandwidth_config *pll, u32 bw, u8 ratio)
750{
751 struct dib8000_state *state = fe->demodulator_priv;
752 u16 reg_1857, reg_1856 = dib8000_read_word(state, 1856);
753 u8 loopdiv, prediv, oldprediv = state->cfg.pll->pll_prediv ;
754 u32 internal, xtal;
755
756
757 prediv = reg_1856 & 0x3f;
758 loopdiv = (reg_1856 >> 6) & 0x3f;
759
760 if ((pll == NULL) || (pll->pll_prediv == prediv &&
761 pll->pll_ratio == loopdiv))
762 return -EINVAL;
763
764 dprintk("Updating pll (prediv: old = %d new = %d ; loopdiv : old = %d new = %d)\n", prediv, pll->pll_prediv, loopdiv, pll->pll_ratio);
765 if (state->revision == 0x8090) {
766 reg_1856 &= 0xf000;
767 reg_1857 = dib8000_read_word(state, 1857);
768
769 dib8000_write_word(state, 1857, reg_1857 & ~(1 << 15));
770
771 dib8000_write_word(state, 1856, reg_1856 |
772 ((pll->pll_ratio & 0x3f) << 6) |
773 (pll->pll_prediv & 0x3f));
774
775
776 internal = dib8000_read32(state, 23) / 1000;
777 dprintk("Old Internal = %d\n", internal);
778 xtal = 2 * (internal / loopdiv) * prediv;
779 internal = 1000 * (xtal/pll->pll_prediv) * pll->pll_ratio;
780 dprintk("Xtal = %d , New Fmem = %d New Fdemod = %d, New Fsampling = %d\n", xtal, internal/1000, internal/2000, internal/8000);
781 dprintk("New Internal = %d\n", internal);
782
783 dib8000_write_word(state, 23,
784 (u16) (((internal / 2) >> 16) & 0xffff));
785 dib8000_write_word(state, 24, (u16) ((internal / 2) & 0xffff));
786
787 dib8000_write_word(state, 1857, reg_1857 | (1 << 15));
788
789 while (((dib8000_read_word(state, 1856)>>15)&0x1) != 1)
790 dprintk("Waiting for PLL to lock\n");
791
792
793 reg_1856 = dib8000_read_word(state, 1856);
794 dprintk("PLL Updated with prediv = %d and loopdiv = %d\n",
795 reg_1856&0x3f, (reg_1856>>6)&0x3f);
796 } else {
797 if (bw != state->current_demod_bw) {
798
799 dprintk("PLL: Bandwidth Change %d MHz -> %d MHz (prediv: %d->%d)\n", state->current_demod_bw / 1000, bw / 1000, oldprediv, state->cfg.pll->pll_prediv);
800
801 if (state->cfg.pll->pll_prediv != oldprediv) {
802
803
804
805 dprintk("PLL: New Setting for %d MHz Bandwidth (prediv: %d, ratio: %d)\n", bw/1000, state->cfg.pll->pll_prediv, state->cfg.pll->pll_ratio);
806 dib8000_write_word(state, 902, dib8000_read_word(state, 902) | (1<<3));
807 dib8000_reset_pll(state);
808 dib8000_write_word(state, 898, 0x0004);
809 } else
810 ratio = state->cfg.pll->pll_ratio;
811
812 state->current_demod_bw = bw;
813 }
814
815 if (ratio != 0) {
816
817 dprintk("PLL: Update ratio (prediv: %d, ratio: %d)\n", state->cfg.pll->pll_prediv, ratio);
818 dib8000_write_word(state, 901, (state->cfg.pll->pll_prediv << 8) | (ratio << 0));
819 }
820 }
821
822 return 0;
823}
824
825static int dib8000_reset_gpio(struct dib8000_state *st)
826{
827
828 dib8000_write_word(st, 1029, st->cfg.gpio_dir);
829 dib8000_write_word(st, 1030, st->cfg.gpio_val);
830
831
832
833 dib8000_write_word(st, 1032, st->cfg.gpio_pwm_pos);
834
835 dib8000_write_word(st, 1037, st->cfg.pwm_freq_div);
836 return 0;
837}
838
839static int dib8000_cfg_gpio(struct dib8000_state *st, u8 num, u8 dir, u8 val)
840{
841 st->cfg.gpio_dir = dib8000_read_word(st, 1029);
842 st->cfg.gpio_dir &= ~(1 << num);
843 st->cfg.gpio_dir |= (dir & 0x1) << num;
844 dib8000_write_word(st, 1029, st->cfg.gpio_dir);
845
846 st->cfg.gpio_val = dib8000_read_word(st, 1030);
847 st->cfg.gpio_val &= ~(1 << num);
848 st->cfg.gpio_val |= (val & 0x01) << num;
849 dib8000_write_word(st, 1030, st->cfg.gpio_val);
850
851 dprintk("gpio dir: %x: gpio val: %x\n", st->cfg.gpio_dir, st->cfg.gpio_val);
852
853 return 0;
854}
855
856static int dib8000_set_gpio(struct dvb_frontend *fe, u8 num, u8 dir, u8 val)
857{
858 struct dib8000_state *state = fe->demodulator_priv;
859 return dib8000_cfg_gpio(state, num, dir, val);
860}
861
862static const u16 dib8000_defaults[] = {
863
864
865 3, 7,
866 0x0004,
867 0x0400,
868 0x0814,
869
870 12, 11,
871 0x001b,
872 0x7740,
873 0x005b,
874 0x8d80,
875 0x01c9,
876 0xc380,
877 0x0000,
878 0x0080,
879 0x0000,
880 0x0090,
881 0x0001,
882 0xd4c0,
883
884
885
886
887 11, 80,
888 (1 << 13) - 825 - 117,
889 (1 << 13) - 837 - 117,
890 (1 << 13) - 811 - 117,
891 (1 << 13) - 766 - 117,
892 (1 << 13) - 737 - 117,
893 (1 << 13) - 693 - 117,
894 (1 << 13) - 648 - 117,
895 (1 << 13) - 619 - 117,
896 (1 << 13) - 575 - 117,
897 (1 << 13) - 531 - 117,
898 (1 << 13) - 501 - 117,
899
900 4, 108,
901 0,
902 0,
903 0,
904 0,
905
906 1, 175,
907 0x0410,
908 1, 179,
909 8192,
910
911 6, 181,
912 0x2800,
913 0x2800,
914 0x2800,
915 0x2800,
916 0x2800,
917 0x2800,
918
919 2, 193,
920 0x0666,
921 0x0000,
922
923 2, 205,
924 0x200f,
925 0x000f,
926
927 5, 215,
928 0x023d,
929 0x00a4,
930 0x00a4,
931 0x7ff0,
932 0x3ccc,
933
934 1, 230,
935 0x0000,
936
937 1, 263,
938 0x800,
939
940 1, 268,
941 (2 << 9) | 39,
942
943 1, 270,
944 0x0001,
945 1, 285,
946 0x0020,
947 1, 299,
948 0x0062,
949
950 1, 338,
951 (1 << 12) |
952 (1 << 10) |
953 (0 << 9) |
954 (3 << 5) |
955 (1 << 0),
956
957 0,
958};
959
960static u16 dib8000_identify(struct i2c_device *client)
961{
962 u16 value;
963
964
965 value = dib8000_i2c_read16(client, 896);
966
967 if ((value = dib8000_i2c_read16(client, 896)) != 0x01b3) {
968 dprintk("wrong Vendor ID (read=0x%x)\n", value);
969 return 0;
970 }
971
972 value = dib8000_i2c_read16(client, 897);
973 if (value != 0x8000 && value != 0x8001 &&
974 value != 0x8002 && value != 0x8090) {
975 dprintk("wrong Device ID (%x)\n", value);
976 return 0;
977 }
978
979 switch (value) {
980 case 0x8000:
981 dprintk("found DiB8000A\n");
982 break;
983 case 0x8001:
984 dprintk("found DiB8000B\n");
985 break;
986 case 0x8002:
987 dprintk("found DiB8000C\n");
988 break;
989 case 0x8090:
990 dprintk("found DiB8096P\n");
991 break;
992 }
993 return value;
994}
995
996static int dib8000_read_unc_blocks(struct dvb_frontend *fe, u32 *unc);
997
998static void dib8000_reset_stats(struct dvb_frontend *fe)
999{
1000 struct dib8000_state *state = fe->demodulator_priv;
1001 struct dtv_frontend_properties *c = &state->fe[0]->dtv_property_cache;
1002 u32 ucb;
1003
1004 memset(&c->strength, 0, sizeof(c->strength));
1005 memset(&c->cnr, 0, sizeof(c->cnr));
1006 memset(&c->post_bit_error, 0, sizeof(c->post_bit_error));
1007 memset(&c->post_bit_count, 0, sizeof(c->post_bit_count));
1008 memset(&c->block_error, 0, sizeof(c->block_error));
1009
1010 c->strength.len = 1;
1011 c->cnr.len = 1;
1012 c->block_error.len = 1;
1013 c->block_count.len = 1;
1014 c->post_bit_error.len = 1;
1015 c->post_bit_count.len = 1;
1016
1017 c->strength.stat[0].scale = FE_SCALE_DECIBEL;
1018 c->strength.stat[0].uvalue = 0;
1019
1020 c->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
1021 c->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
1022 c->block_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
1023 c->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
1024 c->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
1025
1026 dib8000_read_unc_blocks(fe, &ucb);
1027
1028 state->init_ucb = -ucb;
1029 state->ber_jiffies_stats = 0;
1030 state->per_jiffies_stats = 0;
1031 memset(&state->ber_jiffies_stats_layer, 0,
1032 sizeof(state->ber_jiffies_stats_layer));
1033}
1034
1035static int dib8000_reset(struct dvb_frontend *fe)
1036{
1037 struct dib8000_state *state = fe->demodulator_priv;
1038
1039 if ((state->revision = dib8000_identify(&state->i2c)) == 0)
1040 return -EINVAL;
1041
1042
1043 if (state->revision != 0x8090)
1044 dib8000_write_word(state, 1287, 0x0003);
1045
1046 if (state->revision == 0x8000)
1047 dprintk("error : dib8000 MA not supported\n");
1048
1049 dibx000_reset_i2c_master(&state->i2c_master);
1050
1051 dib8000_set_power_mode(state, DIB8000_POWER_ALL);
1052
1053
1054 dib8000_set_adc_state(state, DIBX000_ADC_OFF);
1055
1056
1057 dib8000_write_word(state, 770, 0xffff);
1058 dib8000_write_word(state, 771, 0xffff);
1059 dib8000_write_word(state, 772, 0xfffc);
1060 dib8000_write_word(state, 898, 0x000c);
1061 if (state->revision == 0x8090)
1062 dib8000_write_word(state, 1280, 0x0045);
1063 else
1064 dib8000_write_word(state, 1280, 0x004d);
1065 dib8000_write_word(state, 1281, 0x000c);
1066
1067 dib8000_write_word(state, 770, 0x0000);
1068 dib8000_write_word(state, 771, 0x0000);
1069 dib8000_write_word(state, 772, 0x0000);
1070 dib8000_write_word(state, 898, 0x0004);
1071 dib8000_write_word(state, 1280, 0x0000);
1072 dib8000_write_word(state, 1281, 0x0000);
1073
1074
1075 if (state->revision != 0x8090) {
1076 if (state->cfg.drives)
1077 dib8000_write_word(state, 906, state->cfg.drives);
1078 else {
1079 dprintk("using standard PAD-drive-settings, please adjust settings in config-struct to be optimal.\n");
1080
1081 dib8000_write_word(state, 906, 0x2d98);
1082 }
1083 }
1084
1085 dib8000_reset_pll(state);
1086 if (state->revision != 0x8090)
1087 dib8000_write_word(state, 898, 0x0004);
1088
1089 if (dib8000_reset_gpio(state) != 0)
1090 dprintk("GPIO reset was not successful.\n");
1091
1092 if ((state->revision != 0x8090) &&
1093 (dib8000_set_output_mode(fe, OUTMODE_HIGH_Z) != 0))
1094 dprintk("OUTPUT_MODE could not be resetted.\n");
1095
1096 state->current_agc = NULL;
1097
1098
1099
1100 if (state->cfg.pll->ifreq == 0)
1101 dib8000_write_word(state, 40, 0x0755);
1102 else
1103 dib8000_write_word(state, 40, 0x1f55);
1104
1105 {
1106 u16 l = 0, r;
1107 const u16 *n;
1108 n = dib8000_defaults;
1109 l = *n++;
1110 while (l) {
1111 r = *n++;
1112 do {
1113 dib8000_write_word(state, r, *n++);
1114 r++;
1115 } while (--l);
1116 l = *n++;
1117 }
1118 }
1119
1120 state->isdbt_cfg_loaded = 0;
1121
1122
1123 if ((state->revision != 8090) && (state->cfg.div_cfg != 0))
1124 dib8000_write_word(state, 903, state->cfg.div_cfg);
1125
1126
1127 dib8000_write_word(state, 1285, dib8000_read_word(state, 1285) & ~(1 << 1));
1128
1129 dib8000_set_bandwidth(fe, 6000);
1130
1131 dib8000_set_adc_state(state, DIBX000_SLOW_ADC_ON);
1132 dib8000_sad_calib(state);
1133 if (state->revision != 0x8090)
1134 dib8000_set_adc_state(state, DIBX000_SLOW_ADC_OFF);
1135
1136
1137 dib8000_write_word(state, 285, (dib8000_read_word(state, 285) & ~0x60) | (3 << 5));
1138
1139 dib8000_set_power_mode(state, DIB8000_POWER_INTERFACE_ONLY);
1140
1141 dib8000_reset_stats(fe);
1142
1143 return 0;
1144}
1145
1146static void dib8000_restart_agc(struct dib8000_state *state)
1147{
1148
1149 dib8000_write_word(state, 770, 0x0a00);
1150 dib8000_write_word(state, 770, 0x0000);
1151}
1152
1153static int dib8000_update_lna(struct dib8000_state *state)
1154{
1155 u16 dyn_gain;
1156
1157 if (state->cfg.update_lna) {
1158
1159 dyn_gain = dib8000_read_word(state, 390);
1160
1161 if (state->cfg.update_lna(state->fe[0], dyn_gain)) {
1162 dib8000_restart_agc(state);
1163 return 1;
1164 }
1165 }
1166 return 0;
1167}
1168
1169static int dib8000_set_agc_config(struct dib8000_state *state, u8 band)
1170{
1171 struct dibx000_agc_config *agc = NULL;
1172 int i;
1173 u16 reg;
1174
1175 if (state->current_band == band && state->current_agc != NULL)
1176 return 0;
1177 state->current_band = band;
1178
1179 for (i = 0; i < state->cfg.agc_config_count; i++)
1180 if (state->cfg.agc[i].band_caps & band) {
1181 agc = &state->cfg.agc[i];
1182 break;
1183 }
1184
1185 if (agc == NULL) {
1186 dprintk("no valid AGC configuration found for band 0x%02x\n", band);
1187 return -EINVAL;
1188 }
1189
1190 state->current_agc = agc;
1191
1192
1193 dib8000_write_word(state, 76, agc->setup);
1194 dib8000_write_word(state, 77, agc->inv_gain);
1195 dib8000_write_word(state, 78, agc->time_stabiliz);
1196 dib8000_write_word(state, 101, (agc->alpha_level << 12) | agc->thlock);
1197
1198
1199 dib8000_write_word(state, 102, (agc->alpha_mant << 5) | agc->alpha_exp);
1200 dib8000_write_word(state, 103, (agc->beta_mant << 6) | agc->beta_exp);
1201
1202 dprintk("WBD: ref: %d, sel: %d, active: %d, alpha: %d\n",
1203 state->wbd_ref != 0 ? state->wbd_ref : agc->wbd_ref, agc->wbd_sel, !agc->perform_agc_softsplit, agc->wbd_sel);
1204
1205
1206 if (state->wbd_ref != 0)
1207 dib8000_write_word(state, 106, state->wbd_ref);
1208 else
1209 dib8000_write_word(state, 106, agc->wbd_ref);
1210
1211 if (state->revision == 0x8090) {
1212 reg = dib8000_read_word(state, 922) & (0x3 << 2);
1213 dib8000_write_word(state, 922, reg | (agc->wbd_sel << 2));
1214 }
1215
1216 dib8000_write_word(state, 107, (agc->wbd_alpha << 9) | (agc->perform_agc_softsplit << 8));
1217 dib8000_write_word(state, 108, agc->agc1_max);
1218 dib8000_write_word(state, 109, agc->agc1_min);
1219 dib8000_write_word(state, 110, agc->agc2_max);
1220 dib8000_write_word(state, 111, agc->agc2_min);
1221 dib8000_write_word(state, 112, (agc->agc1_pt1 << 8) | agc->agc1_pt2);
1222 dib8000_write_word(state, 113, (agc->agc1_slope1 << 8) | agc->agc1_slope2);
1223 dib8000_write_word(state, 114, (agc->agc2_pt1 << 8) | agc->agc2_pt2);
1224 dib8000_write_word(state, 115, (agc->agc2_slope1 << 8) | agc->agc2_slope2);
1225
1226 dib8000_write_word(state, 75, agc->agc1_pt3);
1227 if (state->revision != 0x8090)
1228 dib8000_write_word(state, 923,
1229 (dib8000_read_word(state, 923) & 0xffe3) |
1230 (agc->wbd_inv << 4) | (agc->wbd_sel << 2));
1231
1232 return 0;
1233}
1234
1235static void dib8000_pwm_agc_reset(struct dvb_frontend *fe)
1236{
1237 struct dib8000_state *state = fe->demodulator_priv;
1238 dib8000_set_adc_state(state, DIBX000_ADC_ON);
1239 dib8000_set_agc_config(state, (unsigned char)(BAND_OF_FREQUENCY(fe->dtv_property_cache.frequency / 1000)));
1240}
1241
1242static int dib8000_agc_soft_split(struct dib8000_state *state)
1243{
1244 u16 agc, split_offset;
1245
1246 if (!state->current_agc || !state->current_agc->perform_agc_softsplit || state->current_agc->split.max == 0)
1247 return 0;
1248
1249
1250 agc = dib8000_read_word(state, 390);
1251
1252 if (agc > state->current_agc->split.min_thres)
1253 split_offset = state->current_agc->split.min;
1254 else if (agc < state->current_agc->split.max_thres)
1255 split_offset = state->current_agc->split.max;
1256 else
1257 split_offset = state->current_agc->split.max *
1258 (agc - state->current_agc->split.min_thres) /
1259 (state->current_agc->split.max_thres - state->current_agc->split.min_thres);
1260
1261 dprintk("AGC split_offset: %d\n", split_offset);
1262
1263
1264 dib8000_write_word(state, 107, (dib8000_read_word(state, 107) & 0xff00) | split_offset);
1265 return 5000;
1266}
1267
1268static int dib8000_agc_startup(struct dvb_frontend *fe)
1269{
1270 struct dib8000_state *state = fe->demodulator_priv;
1271 enum frontend_tune_state *tune_state = &state->tune_state;
1272 int ret = 0;
1273 u16 reg;
1274 u32 upd_demod_gain_period = 0x8000;
1275
1276 switch (*tune_state) {
1277 case CT_AGC_START:
1278
1279
1280 if (state->revision != 0x8090)
1281 dib8000_set_adc_state(state, DIBX000_ADC_ON);
1282 else {
1283 dib8000_set_power_mode(state, DIB8000_POWER_ALL);
1284
1285 reg = dib8000_read_word(state, 1947)&0xff00;
1286 dib8000_write_word(state, 1946,
1287 upd_demod_gain_period & 0xFFFF);
1288
1289 dib8000_write_word(state, 1947, reg | (1<<14) |
1290 ((upd_demod_gain_period >> 16) & 0xFF));
1291
1292
1293 reg = dib8000_read_word(state, 1920);
1294 dib8000_write_word(state, 1920, (reg | 0x3) &
1295 (~(1 << 7)));
1296 }
1297
1298 if (dib8000_set_agc_config(state, (unsigned char)(BAND_OF_FREQUENCY(fe->dtv_property_cache.frequency / 1000))) != 0) {
1299 *tune_state = CT_AGC_STOP;
1300 state->status = FE_STATUS_TUNE_FAILED;
1301 break;
1302 }
1303
1304 ret = 70;
1305 *tune_state = CT_AGC_STEP_0;
1306 break;
1307
1308 case CT_AGC_STEP_0:
1309
1310 if (state->cfg.agc_control)
1311 state->cfg.agc_control(fe, 1);
1312
1313 dib8000_restart_agc(state);
1314
1315
1316 ret = 50;
1317 *tune_state = CT_AGC_STEP_1;
1318 break;
1319
1320 case CT_AGC_STEP_1:
1321
1322 ret = 70;
1323
1324 if (dib8000_update_lna(state))
1325
1326 ret = 50;
1327 else
1328 *tune_state = CT_AGC_STEP_2;
1329 break;
1330
1331 case CT_AGC_STEP_2:
1332 dib8000_agc_soft_split(state);
1333
1334 if (state->cfg.agc_control)
1335 state->cfg.agc_control(fe, 0);
1336
1337 *tune_state = CT_AGC_STOP;
1338 break;
1339 default:
1340 ret = dib8000_agc_soft_split(state);
1341 break;
1342 }
1343 return ret;
1344
1345}
1346
1347static void dib8096p_host_bus_drive(struct dib8000_state *state, u8 drive)
1348{
1349 u16 reg;
1350
1351 drive &= 0x7;
1352
1353
1354 reg = dib8000_read_word(state, 1798) &
1355 ~(0x7 | (0x7 << 6) | (0x7 << 12));
1356 reg |= (drive<<12) | (drive<<6) | drive;
1357 dib8000_write_word(state, 1798, reg);
1358
1359
1360 reg = dib8000_read_word(state, 1799) & ~((0x7 << 2) | (0x7 << 8));
1361 reg |= (drive<<8) | (drive<<2);
1362 dib8000_write_word(state, 1799, reg);
1363
1364
1365 reg = dib8000_read_word(state, 1800) &
1366 ~(0x7 | (0x7 << 6) | (0x7 << 12));
1367 reg |= (drive<<12) | (drive<<6) | drive;
1368 dib8000_write_word(state, 1800, reg);
1369
1370
1371 reg = dib8000_read_word(state, 1801) & ~((0x7 << 2) | (0x7 << 8));
1372 reg |= (drive<<8) | (drive<<2);
1373 dib8000_write_word(state, 1801, reg);
1374
1375
1376 reg = dib8000_read_word(state, 1802) &
1377 ~(0x7 | (0x7 << 6) | (0x7 << 12));
1378 reg |= (drive<<12) | (drive<<6) | drive;
1379 dib8000_write_word(state, 1802, reg);
1380}
1381
1382static u32 dib8096p_calcSyncFreq(u32 P_Kin, u32 P_Kout,
1383 u32 insertExtSynchro, u32 syncSize)
1384{
1385 u32 quantif = 3;
1386 u32 nom = (insertExtSynchro * P_Kin+syncSize);
1387 u32 denom = P_Kout;
1388 u32 syncFreq = ((nom << quantif) / denom);
1389
1390 if ((syncFreq & ((1 << quantif) - 1)) != 0)
1391 syncFreq = (syncFreq >> quantif) + 1;
1392 else
1393 syncFreq = (syncFreq >> quantif);
1394
1395 if (syncFreq != 0)
1396 syncFreq = syncFreq - 1;
1397
1398 return syncFreq;
1399}
1400
1401static void dib8096p_cfg_DibTx(struct dib8000_state *state, u32 P_Kin,
1402 u32 P_Kout, u32 insertExtSynchro, u32 synchroMode,
1403 u32 syncWord, u32 syncSize)
1404{
1405 dprintk("Configure DibStream Tx\n");
1406
1407 dib8000_write_word(state, 1615, 1);
1408 dib8000_write_word(state, 1603, P_Kin);
1409 dib8000_write_word(state, 1605, P_Kout);
1410 dib8000_write_word(state, 1606, insertExtSynchro);
1411 dib8000_write_word(state, 1608, synchroMode);
1412 dib8000_write_word(state, 1609, (syncWord >> 16) & 0xffff);
1413 dib8000_write_word(state, 1610, syncWord & 0xffff);
1414 dib8000_write_word(state, 1612, syncSize);
1415 dib8000_write_word(state, 1615, 0);
1416}
1417
1418static void dib8096p_cfg_DibRx(struct dib8000_state *state, u32 P_Kin,
1419 u32 P_Kout, u32 synchroMode, u32 insertExtSynchro,
1420 u32 syncWord, u32 syncSize, u32 dataOutRate)
1421{
1422 u32 syncFreq;
1423
1424 dprintk("Configure DibStream Rx synchroMode = %d\n", synchroMode);
1425
1426 if ((P_Kin != 0) && (P_Kout != 0)) {
1427 syncFreq = dib8096p_calcSyncFreq(P_Kin, P_Kout,
1428 insertExtSynchro, syncSize);
1429 dib8000_write_word(state, 1542, syncFreq);
1430 }
1431
1432 dib8000_write_word(state, 1554, 1);
1433 dib8000_write_word(state, 1536, P_Kin);
1434 dib8000_write_word(state, 1537, P_Kout);
1435 dib8000_write_word(state, 1539, synchroMode);
1436 dib8000_write_word(state, 1540, (syncWord >> 16) & 0xffff);
1437 dib8000_write_word(state, 1541, syncWord & 0xffff);
1438 dib8000_write_word(state, 1543, syncSize);
1439 dib8000_write_word(state, 1544, dataOutRate);
1440 dib8000_write_word(state, 1554, 0);
1441}
1442
1443static void dib8096p_enMpegMux(struct dib8000_state *state, int onoff)
1444{
1445 u16 reg_1287;
1446
1447 reg_1287 = dib8000_read_word(state, 1287);
1448
1449 switch (onoff) {
1450 case 1:
1451 reg_1287 &= ~(1 << 8);
1452 break;
1453 case 0:
1454 reg_1287 |= (1 << 8);
1455 break;
1456 }
1457
1458 dib8000_write_word(state, 1287, reg_1287);
1459}
1460
1461static void dib8096p_configMpegMux(struct dib8000_state *state,
1462 u16 pulseWidth, u16 enSerialMode, u16 enSerialClkDiv2)
1463{
1464 u16 reg_1287;
1465
1466 dprintk("Enable Mpeg mux\n");
1467
1468 dib8096p_enMpegMux(state, 0);
1469
1470
1471 if ((enSerialMode == 1) && (state->input_mode_mpeg == 1))
1472 enSerialClkDiv2 = 0;
1473
1474 reg_1287 = ((pulseWidth & 0x1f) << 3) |
1475 ((enSerialMode & 0x1) << 2) | (enSerialClkDiv2 & 0x1);
1476 dib8000_write_word(state, 1287, reg_1287);
1477
1478 dib8096p_enMpegMux(state, 1);
1479}
1480
1481static void dib8096p_setDibTxMux(struct dib8000_state *state, int mode)
1482{
1483 u16 reg_1288 = dib8000_read_word(state, 1288) & ~(0x7 << 7);
1484
1485 switch (mode) {
1486 case MPEG_ON_DIBTX:
1487 dprintk("SET MPEG ON DIBSTREAM TX\n");
1488 dib8096p_cfg_DibTx(state, 8, 5, 0, 0, 0, 0);
1489 reg_1288 |= (1 << 9); break;
1490 case DIV_ON_DIBTX:
1491 dprintk("SET DIV_OUT ON DIBSTREAM TX\n");
1492 dib8096p_cfg_DibTx(state, 5, 5, 0, 0, 0, 0);
1493 reg_1288 |= (1 << 8); break;
1494 case ADC_ON_DIBTX:
1495 dprintk("SET ADC_OUT ON DIBSTREAM TX\n");
1496 dib8096p_cfg_DibTx(state, 20, 5, 10, 0, 0, 0);
1497 reg_1288 |= (1 << 7); break;
1498 default:
1499 break;
1500 }
1501 dib8000_write_word(state, 1288, reg_1288);
1502}
1503
1504static void dib8096p_setHostBusMux(struct dib8000_state *state, int mode)
1505{
1506 u16 reg_1288 = dib8000_read_word(state, 1288) & ~(0x7 << 4);
1507
1508 switch (mode) {
1509 case DEMOUT_ON_HOSTBUS:
1510 dprintk("SET DEM OUT OLD INTERF ON HOST BUS\n");
1511 dib8096p_enMpegMux(state, 0);
1512 reg_1288 |= (1 << 6);
1513 break;
1514 case DIBTX_ON_HOSTBUS:
1515 dprintk("SET DIBSTREAM TX ON HOST BUS\n");
1516 dib8096p_enMpegMux(state, 0);
1517 reg_1288 |= (1 << 5);
1518 break;
1519 case MPEG_ON_HOSTBUS:
1520 dprintk("SET MPEG MUX ON HOST BUS\n");
1521 reg_1288 |= (1 << 4);
1522 break;
1523 default:
1524 break;
1525 }
1526 dib8000_write_word(state, 1288, reg_1288);
1527}
1528
1529static int dib8096p_set_diversity_in(struct dvb_frontend *fe, int onoff)
1530{
1531 struct dib8000_state *state = fe->demodulator_priv;
1532 u16 reg_1287;
1533
1534 switch (onoff) {
1535 case 0:
1536 dprintk("%s mode OFF : by default Enable Mpeg INPUT\n",
1537 __func__);
1538
1539 dib8096p_cfg_DibRx(state, 8, 5, 0, 0, 0, 8, 0);
1540
1541
1542
1543 reg_1287 = dib8000_read_word(state, 1287);
1544
1545 if ((reg_1287 & 0x1) == 1) {
1546
1547 reg_1287 &= ~0x1;
1548 dib8000_write_word(state, 1287, reg_1287);
1549 }
1550 state->input_mode_mpeg = 1;
1551 break;
1552 case 1:
1553 case 2:
1554 dprintk("%s ON : Enable diversity INPUT\n", __func__);
1555 dib8096p_cfg_DibRx(state, 5, 5, 0, 0, 0, 0, 0);
1556 state->input_mode_mpeg = 0;
1557 break;
1558 }
1559
1560 dib8000_set_diversity_in(state->fe[0], onoff);
1561 return 0;
1562}
1563
1564static int dib8096p_set_output_mode(struct dvb_frontend *fe, int mode)
1565{
1566 struct dib8000_state *state = fe->demodulator_priv;
1567 u16 outreg, smo_mode, fifo_threshold;
1568 u8 prefer_mpeg_mux_use = 1;
1569 int ret = 0;
1570
1571 state->output_mode = mode;
1572 dib8096p_host_bus_drive(state, 1);
1573
1574 fifo_threshold = 1792;
1575 smo_mode = (dib8000_read_word(state, 299) & 0x0050) | (1 << 1);
1576 outreg = dib8000_read_word(state, 1286) &
1577 ~((1 << 10) | (0x7 << 6) | (1 << 1));
1578
1579 switch (mode) {
1580 case OUTMODE_HIGH_Z:
1581 outreg = 0;
1582 break;
1583
1584 case OUTMODE_MPEG2_SERIAL:
1585 if (prefer_mpeg_mux_use) {
1586 dprintk("dib8096P setting output mode TS_SERIAL using Mpeg Mux\n");
1587 dib8096p_configMpegMux(state, 3, 1, 1);
1588 dib8096p_setHostBusMux(state, MPEG_ON_HOSTBUS);
1589 } else {
1590 dprintk("dib8096P setting output mode TS_SERIAL using Smooth bloc\n");
1591 dib8096p_setHostBusMux(state,
1592 DEMOUT_ON_HOSTBUS);
1593 outreg |= (2 << 6) | (0 << 1);
1594 }
1595 break;
1596
1597 case OUTMODE_MPEG2_PAR_GATED_CLK:
1598 if (prefer_mpeg_mux_use) {
1599 dprintk("dib8096P setting output mode TS_PARALLEL_GATED using Mpeg Mux\n");
1600 dib8096p_configMpegMux(state, 2, 0, 0);
1601 dib8096p_setHostBusMux(state, MPEG_ON_HOSTBUS);
1602 } else {
1603 dprintk("dib8096P setting output mode TS_PARALLEL_GATED using Smooth block\n");
1604 dib8096p_setHostBusMux(state,
1605 DEMOUT_ON_HOSTBUS);
1606 outreg |= (0 << 6);
1607 }
1608 break;
1609
1610 case OUTMODE_MPEG2_PAR_CONT_CLK:
1611 dprintk("dib8096P setting output mode TS_PARALLEL_CONT using Smooth block\n");
1612 dib8096p_setHostBusMux(state, DEMOUT_ON_HOSTBUS);
1613 outreg |= (1 << 6);
1614 break;
1615
1616 case OUTMODE_MPEG2_FIFO:
1617
1618
1619 dprintk("dib8096P setting output mode TS_FIFO using Smooth block\n");
1620 dib8096p_setHostBusMux(state, DEMOUT_ON_HOSTBUS);
1621 outreg |= (5 << 6);
1622 smo_mode |= (3 << 1);
1623 fifo_threshold = 512;
1624 break;
1625
1626 case OUTMODE_DIVERSITY:
1627 dprintk("dib8096P setting output mode MODE_DIVERSITY\n");
1628 dib8096p_setDibTxMux(state, DIV_ON_DIBTX);
1629 dib8096p_setHostBusMux(state, DIBTX_ON_HOSTBUS);
1630 break;
1631
1632 case OUTMODE_ANALOG_ADC:
1633 dprintk("dib8096P setting output mode MODE_ANALOG_ADC\n");
1634 dib8096p_setDibTxMux(state, ADC_ON_DIBTX);
1635 dib8096p_setHostBusMux(state, DIBTX_ON_HOSTBUS);
1636 break;
1637 }
1638
1639 if (mode != OUTMODE_HIGH_Z)
1640 outreg |= (1<<10);
1641
1642 dprintk("output_mpeg2_in_188_bytes = %d\n",
1643 state->cfg.output_mpeg2_in_188_bytes);
1644 if (state->cfg.output_mpeg2_in_188_bytes)
1645 smo_mode |= (1 << 5);
1646
1647 ret |= dib8000_write_word(state, 299, smo_mode);
1648
1649 ret |= dib8000_write_word(state, 299 + 1, fifo_threshold);
1650 ret |= dib8000_write_word(state, 1286, outreg);
1651
1652 return ret;
1653}
1654
1655static int map_addr_to_serpar_number(struct i2c_msg *msg)
1656{
1657 if (msg->buf[0] <= 15)
1658 msg->buf[0] -= 1;
1659 else if (msg->buf[0] == 17)
1660 msg->buf[0] = 15;
1661 else if (msg->buf[0] == 16)
1662 msg->buf[0] = 17;
1663 else if (msg->buf[0] == 19)
1664 msg->buf[0] = 16;
1665 else if (msg->buf[0] >= 21 && msg->buf[0] <= 25)
1666 msg->buf[0] -= 3;
1667 else if (msg->buf[0] == 28)
1668 msg->buf[0] = 23;
1669 else if (msg->buf[0] == 99)
1670 msg->buf[0] = 99;
1671 else
1672 return -EINVAL;
1673 return 0;
1674}
1675
1676static int dib8096p_tuner_write_serpar(struct i2c_adapter *i2c_adap,
1677 struct i2c_msg msg[], int num)
1678{
1679 struct dib8000_state *state = i2c_get_adapdata(i2c_adap);
1680 u8 n_overflow = 1;
1681 u16 i = 1000;
1682 u16 serpar_num = msg[0].buf[0];
1683
1684 while (n_overflow == 1 && i) {
1685 n_overflow = (dib8000_read_word(state, 1984) >> 1) & 0x1;
1686 i--;
1687 if (i == 0)
1688 dprintk("Tuner ITF: write busy (overflow)\n");
1689 }
1690 dib8000_write_word(state, 1985, (1 << 6) | (serpar_num & 0x3f));
1691 dib8000_write_word(state, 1986, (msg[0].buf[1] << 8) | msg[0].buf[2]);
1692
1693 return num;
1694}
1695
1696static int dib8096p_tuner_read_serpar(struct i2c_adapter *i2c_adap,
1697 struct i2c_msg msg[], int num)
1698{
1699 struct dib8000_state *state = i2c_get_adapdata(i2c_adap);
1700 u8 n_overflow = 1, n_empty = 1;
1701 u16 i = 1000;
1702 u16 serpar_num = msg[0].buf[0];
1703 u16 read_word;
1704
1705 while (n_overflow == 1 && i) {
1706 n_overflow = (dib8000_read_word(state, 1984) >> 1) & 0x1;
1707 i--;
1708 if (i == 0)
1709 dprintk("TunerITF: read busy (overflow)\n");
1710 }
1711 dib8000_write_word(state, 1985, (0<<6) | (serpar_num&0x3f));
1712
1713 i = 1000;
1714 while (n_empty == 1 && i) {
1715 n_empty = dib8000_read_word(state, 1984)&0x1;
1716 i--;
1717 if (i == 0)
1718 dprintk("TunerITF: read busy (empty)\n");
1719 }
1720
1721 read_word = dib8000_read_word(state, 1987);
1722 msg[1].buf[0] = (read_word >> 8) & 0xff;
1723 msg[1].buf[1] = (read_word) & 0xff;
1724
1725 return num;
1726}
1727
1728static int dib8096p_tuner_rw_serpar(struct i2c_adapter *i2c_adap,
1729 struct i2c_msg msg[], int num)
1730{
1731 if (map_addr_to_serpar_number(&msg[0]) == 0) {
1732 if (num == 1)
1733 return dib8096p_tuner_write_serpar(i2c_adap, msg, 1);
1734 else
1735 return dib8096p_tuner_read_serpar(i2c_adap, msg, 2);
1736 }
1737 return num;
1738}
1739
1740static int dib8096p_rw_on_apb(struct i2c_adapter *i2c_adap,
1741 struct i2c_msg msg[], int num, u16 apb_address)
1742{
1743 struct dib8000_state *state = i2c_get_adapdata(i2c_adap);
1744 u16 word;
1745
1746 if (num == 1) {
1747 dib8000_write_word(state, apb_address,
1748 ((msg[0].buf[1] << 8) | (msg[0].buf[2])));
1749 } else {
1750 word = dib8000_read_word(state, apb_address);
1751 msg[1].buf[0] = (word >> 8) & 0xff;
1752 msg[1].buf[1] = (word) & 0xff;
1753 }
1754 return num;
1755}
1756
1757static int dib8096p_tuner_xfer(struct i2c_adapter *i2c_adap,
1758 struct i2c_msg msg[], int num)
1759{
1760 struct dib8000_state *state = i2c_get_adapdata(i2c_adap);
1761 u16 apb_address = 0, word;
1762 int i = 0;
1763
1764 switch (msg[0].buf[0]) {
1765 case 0x12:
1766 apb_address = 1920;
1767 break;
1768 case 0x14:
1769 apb_address = 1921;
1770 break;
1771 case 0x24:
1772 apb_address = 1922;
1773 break;
1774 case 0x1a:
1775 apb_address = 1923;
1776 break;
1777 case 0x22:
1778 apb_address = 1924;
1779 break;
1780 case 0x33:
1781 apb_address = 1926;
1782 break;
1783 case 0x34:
1784 apb_address = 1927;
1785 break;
1786 case 0x35:
1787 apb_address = 1928;
1788 break;
1789 case 0x36:
1790 apb_address = 1929;
1791 break;
1792 case 0x37:
1793 apb_address = 1930;
1794 break;
1795 case 0x38:
1796 apb_address = 1931;
1797 break;
1798 case 0x39:
1799 apb_address = 1932;
1800 break;
1801 case 0x2a:
1802 apb_address = 1935;
1803 break;
1804 case 0x2b:
1805 apb_address = 1936;
1806 break;
1807 case 0x2c:
1808 apb_address = 1937;
1809 break;
1810 case 0x2d:
1811 apb_address = 1938;
1812 break;
1813 case 0x2e:
1814 apb_address = 1939;
1815 break;
1816 case 0x2f:
1817 apb_address = 1940;
1818 break;
1819 case 0x30:
1820 apb_address = 1941;
1821 break;
1822 case 0x31:
1823 apb_address = 1942;
1824 break;
1825 case 0x32:
1826 apb_address = 1943;
1827 break;
1828 case 0x3e:
1829 apb_address = 1944;
1830 break;
1831 case 0x3f:
1832 apb_address = 1945;
1833 break;
1834 case 0x40:
1835 apb_address = 1948;
1836 break;
1837 case 0x25:
1838 apb_address = 936;
1839 break;
1840 case 0x26:
1841 apb_address = 937;
1842 break;
1843 case 0x27:
1844 apb_address = 938;
1845 break;
1846 case 0x28:
1847 apb_address = 939;
1848 break;
1849 case 0x1d:
1850
1851 i = ((dib8000_read_word(state, 921) >> 12)&0x3);
1852 word = dib8000_read_word(state, 924+i);
1853 msg[1].buf[0] = (word >> 8) & 0xff;
1854 msg[1].buf[1] = (word) & 0xff;
1855 return num;
1856 case 0x1f:
1857 if (num == 1) {
1858 word = (u16) ((msg[0].buf[1] << 8) |
1859 msg[0].buf[2]);
1860
1861 word &= 0x3;
1862 word = (dib8000_read_word(state, 921) &
1863 ~(3<<12)) | (word<<12);
1864
1865 dib8000_write_word(state, 921, word);
1866 return num;
1867 }
1868 }
1869
1870 if (apb_address != 0)
1871 return dib8096p_rw_on_apb(i2c_adap, msg, num, apb_address);
1872 else
1873 return dib8096p_tuner_rw_serpar(i2c_adap, msg, num);
1874
1875 return 0;
1876}
1877
1878static u32 dib8096p_i2c_func(struct i2c_adapter *adapter)
1879{
1880 return I2C_FUNC_I2C;
1881}
1882
1883static const struct i2c_algorithm dib8096p_tuner_xfer_algo = {
1884 .master_xfer = dib8096p_tuner_xfer,
1885 .functionality = dib8096p_i2c_func,
1886};
1887
1888static struct i2c_adapter *dib8096p_get_i2c_tuner(struct dvb_frontend *fe)
1889{
1890 struct dib8000_state *st = fe->demodulator_priv;
1891 return &st->dib8096p_tuner_adap;
1892}
1893
1894static int dib8096p_tuner_sleep(struct dvb_frontend *fe, int onoff)
1895{
1896 struct dib8000_state *state = fe->demodulator_priv;
1897 u16 en_cur_state;
1898
1899 dprintk("sleep dib8096p: %d\n", onoff);
1900
1901 en_cur_state = dib8000_read_word(state, 1922);
1902
1903
1904 if (en_cur_state > 0xff)
1905 state->tuner_enable = en_cur_state ;
1906
1907 if (onoff)
1908 en_cur_state &= 0x00ff;
1909 else {
1910 if (state->tuner_enable != 0)
1911 en_cur_state = state->tuner_enable;
1912 }
1913
1914 dib8000_write_word(state, 1922, en_cur_state);
1915
1916 return 0;
1917}
1918
1919static const s32 lut_1000ln_mant[] =
1920{
1921 908, 7003, 7090, 7170, 7244, 7313, 7377, 7438, 7495, 7549, 7600
1922};
1923
1924static s32 dib8000_get_adc_power(struct dvb_frontend *fe, u8 mode)
1925{
1926 struct dib8000_state *state = fe->demodulator_priv;
1927 u32 ix = 0, tmp_val = 0, exp = 0, mant = 0;
1928 s32 val;
1929
1930 val = dib8000_read32(state, 384);
1931 if (mode) {
1932 tmp_val = val;
1933 while (tmp_val >>= 1)
1934 exp++;
1935 mant = (val * 1000 / (1<<exp));
1936 ix = (u8)((mant-1000)/100);
1937 val = (lut_1000ln_mant[ix] + 693*(exp-20) - 6908);
1938 val = (val*256)/1000;
1939 }
1940 return val;
1941}
1942
1943static int dib8090p_get_dc_power(struct dvb_frontend *fe, u8 IQ)
1944{
1945 struct dib8000_state *state = fe->demodulator_priv;
1946 int val = 0;
1947
1948 switch (IQ) {
1949 case 1:
1950 val = dib8000_read_word(state, 403);
1951 break;
1952 case 0:
1953 val = dib8000_read_word(state, 404);
1954 break;
1955 }
1956 if (val & 0x200)
1957 val -= 1024;
1958
1959 return val;
1960}
1961
1962static void dib8000_update_timf(struct dib8000_state *state)
1963{
1964 u32 timf = state->timf = dib8000_read32(state, 435);
1965
1966 dib8000_write_word(state, 29, (u16) (timf >> 16));
1967 dib8000_write_word(state, 30, (u16) (timf & 0xffff));
1968 dprintk("Updated timing frequency: %d (default: %d)\n", state->timf, state->timf_default);
1969}
1970
1971static u32 dib8000_ctrl_timf(struct dvb_frontend *fe, uint8_t op, uint32_t timf)
1972{
1973 struct dib8000_state *state = fe->demodulator_priv;
1974
1975 switch (op) {
1976 case DEMOD_TIMF_SET:
1977 state->timf = timf;
1978 break;
1979 case DEMOD_TIMF_UPDATE:
1980 dib8000_update_timf(state);
1981 break;
1982 case DEMOD_TIMF_GET:
1983 break;
1984 }
1985 dib8000_set_bandwidth(state->fe[0], 6000);
1986
1987 return state->timf;
1988}
1989
1990static const u16 adc_target_16dB[11] = {
1991 7250, 7238, 7264, 7309, 7338, 7382, 7427, 7456, 7500, 7544, 7574
1992};
1993
1994static const u8 permu_seg[] = { 6, 5, 7, 4, 8, 3, 9, 2, 10, 1, 11, 0, 12 };
1995
1996static u16 dib8000_set_layer(struct dib8000_state *state, u8 layer_index, u16 max_constellation)
1997{
1998 u8 cr, constellation, time_intlv;
1999 struct dtv_frontend_properties *c = &state->fe[0]->dtv_property_cache;
2000
2001 switch (c->layer[layer_index].modulation) {
2002 case DQPSK:
2003 constellation = 0;
2004 break;
2005 case QPSK:
2006 constellation = 1;
2007 break;
2008 case QAM_16:
2009 constellation = 2;
2010 break;
2011 case QAM_64:
2012 default:
2013 constellation = 3;
2014 break;
2015 }
2016
2017 switch (c->layer[layer_index].fec) {
2018 case FEC_1_2:
2019 cr = 1;
2020 break;
2021 case FEC_2_3:
2022 cr = 2;
2023 break;
2024 case FEC_3_4:
2025 cr = 3;
2026 break;
2027 case FEC_5_6:
2028 cr = 5;
2029 break;
2030 case FEC_7_8:
2031 default:
2032 cr = 7;
2033 break;
2034 }
2035
2036 time_intlv = fls(c->layer[layer_index].interleaving);
2037 if (time_intlv > 3 && !(time_intlv == 4 && c->isdbt_sb_mode == 1))
2038 time_intlv = 0;
2039
2040 dib8000_write_word(state, 2 + layer_index, (constellation << 10) | ((c->layer[layer_index].segment_count & 0xf) << 6) | (cr << 3) | time_intlv);
2041 if (c->layer[layer_index].segment_count > 0) {
2042 switch (max_constellation) {
2043 case DQPSK:
2044 case QPSK:
2045 if (c->layer[layer_index].modulation == QAM_16 || c->layer[layer_index].modulation == QAM_64)
2046 max_constellation = c->layer[layer_index].modulation;
2047 break;
2048 case QAM_16:
2049 if (c->layer[layer_index].modulation == QAM_64)
2050 max_constellation = c->layer[layer_index].modulation;
2051 break;
2052 }
2053 }
2054
2055 return max_constellation;
2056}
2057
2058static const u16 adp_Q64[4] = {0x0148, 0xfff0, 0x00a4, 0xfff8};
2059static const u16 adp_Q16[4] = {0x023d, 0xffdf, 0x00a4, 0xfff0};
2060static const u16 adp_Qdefault[4] = {0x099a, 0xffae, 0x0333, 0xfff8};
2061static u16 dib8000_adp_fine_tune(struct dib8000_state *state, u16 max_constellation)
2062{
2063 u16 i, ana_gain = 0;
2064 const u16 *adp;
2065
2066
2067 switch (max_constellation) {
2068 case QAM_64:
2069 ana_gain = 0x7;
2070 adp = &adp_Q64[0];
2071 break;
2072 case QAM_16:
2073 ana_gain = 0x7;
2074 adp = &adp_Q16[0];
2075 break;
2076 default:
2077 ana_gain = 0;
2078 adp = &adp_Qdefault[0];
2079 break;
2080 }
2081
2082 for (i = 0; i < 4; i++)
2083 dib8000_write_word(state, 215 + i, adp[i]);
2084
2085 return ana_gain;
2086}
2087
2088static void dib8000_update_ana_gain(struct dib8000_state *state, u16 ana_gain)
2089{
2090 u16 i;
2091
2092 dib8000_write_word(state, 116, ana_gain);
2093
2094
2095 if (ana_gain) {
2096 for (i = 0; i < 10; i++)
2097 dib8000_write_word(state, 80 + i, adc_target_16dB[i]);
2098 } else {
2099 for (i = 0; i < 10; i++)
2100 dib8000_write_word(state, 80 + i, adc_target_16dB[i] - 355);
2101 }
2102}
2103
2104static void dib8000_load_ana_fe_coefs(struct dib8000_state *state, const s16 *ana_fe)
2105{
2106 u16 mode = 0;
2107
2108 if (state->isdbt_cfg_loaded == 0)
2109 for (mode = 0; mode < 24; mode++)
2110 dib8000_write_word(state, 117 + mode, ana_fe[mode]);
2111}
2112
2113static const u16 lut_prbs_2k[14] = {
2114 0, 0x423, 0x009, 0x5C7, 0x7A6, 0x3D8, 0x527, 0x7FF, 0x79B, 0x3D6, 0x3A2, 0x53B, 0x2F4, 0x213
2115};
2116static const u16 lut_prbs_4k[14] = {
2117 0, 0x208, 0x0C3, 0x7B9, 0x423, 0x5C7, 0x3D8, 0x7FF, 0x3D6, 0x53B, 0x213, 0x029, 0x0D0, 0x48E
2118};
2119static const u16 lut_prbs_8k[14] = {
2120 0, 0x740, 0x069, 0x7DD, 0x208, 0x7B9, 0x5C7, 0x7FF, 0x53B, 0x029, 0x48E, 0x4C4, 0x367, 0x684
2121};
2122
2123static u16 dib8000_get_init_prbs(struct dib8000_state *state, u16 subchannel)
2124{
2125 int sub_channel_prbs_group = 0;
2126
2127 sub_channel_prbs_group = (subchannel / 3) + 1;
2128 dprintk("sub_channel_prbs_group = %d , subchannel =%d prbs = 0x%04x\n", sub_channel_prbs_group, subchannel, lut_prbs_8k[sub_channel_prbs_group]);
2129
2130 switch (state->fe[0]->dtv_property_cache.transmission_mode) {
2131 case TRANSMISSION_MODE_2K:
2132 return lut_prbs_2k[sub_channel_prbs_group];
2133 case TRANSMISSION_MODE_4K:
2134 return lut_prbs_4k[sub_channel_prbs_group];
2135 default:
2136 case TRANSMISSION_MODE_8K:
2137 return lut_prbs_8k[sub_channel_prbs_group];
2138 }
2139}
2140
2141static void dib8000_set_13seg_channel(struct dib8000_state *state)
2142{
2143 u16 i;
2144 u16 coff_pow = 0x2800;
2145
2146 state->seg_mask = 0x1fff;
2147
2148
2149 if (state->isdbt_cfg_loaded == 0) {
2150 dib8000_write_word(state, 180, (16 << 6) | 9);
2151 dib8000_write_word(state, 187, (4 << 12) | (8 << 5) | 0x2);
2152 coff_pow = 0x2800;
2153 for (i = 0; i < 6; i++)
2154 dib8000_write_word(state, 181+i, coff_pow);
2155
2156
2157
2158 dib8000_write_word(state, 338, (1 << 12) | (1 << 10) | (0 << 9) | (3 << 5) | 1);
2159
2160
2161 dib8000_write_word(state, 340, (8 << 6) | (6 << 0));
2162
2163 dib8000_write_word(state, 341, (4 << 3) | (1 << 2) | (1 << 1) | (1 << 0));
2164
2165 dib8000_write_word(state, 228, 0);
2166 dib8000_write_word(state, 265, 31);
2167 dib8000_write_word(state, 205, 0x200f);
2168 }
2169
2170
2171
2172
2173
2174
2175 if (state->cfg.pll->ifreq == 0)
2176 dib8000_write_word(state, 266, ~state->seg_mask | state->seg_diff_mask | 0x40);
2177
2178 dib8000_load_ana_fe_coefs(state, ana_fe_coeff_13seg);
2179}
2180
2181static void dib8000_set_subchannel_prbs(struct dib8000_state *state, u16 init_prbs)
2182{
2183 u16 reg_1;
2184
2185 reg_1 = dib8000_read_word(state, 1);
2186 dib8000_write_word(state, 1, (init_prbs << 2) | (reg_1 & 0x3));
2187}
2188
2189static void dib8000_small_fine_tune(struct dib8000_state *state)
2190{
2191 u16 i;
2192 const s16 *ncoeff;
2193 struct dtv_frontend_properties *c = &state->fe[0]->dtv_property_cache;
2194
2195 dib8000_write_word(state, 352, state->seg_diff_mask);
2196 dib8000_write_word(state, 353, state->seg_mask);
2197
2198
2199 dib8000_write_word(state, 351, (c->isdbt_sb_mode << 9) | (c->isdbt_sb_mode << 8) | (13 << 4) | 5);
2200
2201 if (c->isdbt_sb_mode) {
2202
2203 switch (c->transmission_mode) {
2204 case TRANSMISSION_MODE_2K:
2205 if (c->isdbt_partial_reception == 0) {
2206 if (c->layer[0].modulation == DQPSK)
2207 ncoeff = coeff_2k_sb_1seg_dqpsk;
2208 else
2209 ncoeff = coeff_2k_sb_1seg;
2210 } else {
2211 if (c->layer[0].modulation == DQPSK) {
2212 if (c->layer[1].modulation == DQPSK)
2213 ncoeff = coeff_2k_sb_3seg_0dqpsk_1dqpsk;
2214 else
2215 ncoeff = coeff_2k_sb_3seg_0dqpsk;
2216 } else {
2217 if (c->layer[1].modulation == DQPSK)
2218 ncoeff = coeff_2k_sb_3seg_1dqpsk;
2219 else
2220 ncoeff = coeff_2k_sb_3seg;
2221 }
2222 }
2223 break;
2224 case TRANSMISSION_MODE_4K:
2225 if (c->isdbt_partial_reception == 0) {
2226 if (c->layer[0].modulation == DQPSK)
2227 ncoeff = coeff_4k_sb_1seg_dqpsk;
2228 else
2229 ncoeff = coeff_4k_sb_1seg;
2230 } else {
2231 if (c->layer[0].modulation == DQPSK) {
2232 if (c->layer[1].modulation == DQPSK)
2233 ncoeff = coeff_4k_sb_3seg_0dqpsk_1dqpsk;
2234 else
2235 ncoeff = coeff_4k_sb_3seg_0dqpsk;
2236 } else {
2237 if (c->layer[1].modulation == DQPSK)
2238 ncoeff = coeff_4k_sb_3seg_1dqpsk;
2239 else
2240 ncoeff = coeff_4k_sb_3seg;
2241 }
2242 }
2243 break;
2244 case TRANSMISSION_MODE_AUTO:
2245 case TRANSMISSION_MODE_8K:
2246 default:
2247 if (c->isdbt_partial_reception == 0) {
2248 if (c->layer[0].modulation == DQPSK)
2249 ncoeff = coeff_8k_sb_1seg_dqpsk;
2250 else
2251 ncoeff = coeff_8k_sb_1seg;
2252 } else {
2253 if (c->layer[0].modulation == DQPSK) {
2254 if (c->layer[1].modulation == DQPSK)
2255 ncoeff = coeff_8k_sb_3seg_0dqpsk_1dqpsk;
2256 else
2257 ncoeff = coeff_8k_sb_3seg_0dqpsk;
2258 } else {
2259 if (c->layer[1].modulation == DQPSK)
2260 ncoeff = coeff_8k_sb_3seg_1dqpsk;
2261 else
2262 ncoeff = coeff_8k_sb_3seg;
2263 }
2264 }
2265 break;
2266 }
2267
2268 for (i = 0; i < 8; i++)
2269 dib8000_write_word(state, 343 + i, ncoeff[i]);
2270 }
2271}
2272
2273static const u16 coff_thres_1seg[3] = {300, 150, 80};
2274static const u16 coff_thres_3seg[3] = {350, 300, 250};
2275static void dib8000_set_sb_channel(struct dib8000_state *state)
2276{
2277 struct dtv_frontend_properties *c = &state->fe[0]->dtv_property_cache;
2278 const u16 *coff;
2279 u16 i;
2280
2281 if (c->transmission_mode == TRANSMISSION_MODE_2K || c->transmission_mode == TRANSMISSION_MODE_4K) {
2282 dib8000_write_word(state, 219, dib8000_read_word(state, 219) | 0x1);
2283 dib8000_write_word(state, 190, dib8000_read_word(state, 190) | (0x1 << 14));
2284 } else {
2285 dib8000_write_word(state, 219, dib8000_read_word(state, 219) & 0xfffe);
2286 dib8000_write_word(state, 190, dib8000_read_word(state, 190) & 0xbfff);
2287 }
2288
2289 if (c->isdbt_partial_reception == 1)
2290 state->seg_mask = 0x00E0;
2291 else
2292 state->seg_mask = 0x0040;
2293
2294 dib8000_write_word(state, 268, (dib8000_read_word(state, 268) & 0xF9FF) | 0x0200);
2295
2296
2297
2298 dib8000_write_word(state, 187, (4 << 12) | (0 << 11) | (63 << 5) | (0x3 << 3) | ((~c->isdbt_partial_reception & 1) << 2) | 0x3);
2299
2300 dib8000_write_word(state, 340, (16 << 6) | (8 << 0));
2301 dib8000_write_word(state, 341, (6 << 3) | (1 << 2) | (1 << 1) | (1 << 0));
2302
2303
2304 if (c->isdbt_partial_reception == 0) {
2305
2306 if (state->mode == 3)
2307 dib8000_write_word(state, 180, 0x1fcf | ((state->mode - 1) << 14));
2308 else
2309 dib8000_write_word(state, 180, 0x0fcf | ((state->mode - 1) << 14));
2310
2311
2312 dib8000_write_word(state, 338, (1 << 12) | (1 << 10) | (0 << 9) | (5 << 5) | 4);
2313 coff = &coff_thres_1seg[0];
2314 } else {
2315 dib8000_write_word(state, 180, 0x1fcf | (1 << 14));
2316
2317 dib8000_write_word(state, 338, (1 << 12) | (1 << 10) | (0 << 9) | (4 << 5) | 4);
2318 coff = &coff_thres_3seg[0];
2319 }
2320
2321 dib8000_write_word(state, 228, 1);
2322 dib8000_write_word(state, 205, dib8000_read_word(state, 205) & 0xfff0);
2323
2324 if (c->isdbt_partial_reception == 0 && c->transmission_mode == TRANSMISSION_MODE_2K)
2325 dib8000_write_word(state, 265, 15);
2326
2327
2328 for (i = 0 ; i < 3; i++) {
2329 dib8000_write_word(state, 181+i, coff[i]);
2330 dib8000_write_word(state, 184+i, coff[i]);
2331 }
2332
2333
2334
2335
2336
2337
2338 dib8000_write_word(state, 266, ~state->seg_mask | state->seg_diff_mask);
2339
2340 if (c->isdbt_partial_reception == 0)
2341 dib8000_write_word(state, 178, 64);
2342 else
2343 dib8000_write_word(state, 178, 32);
2344}
2345
2346static void dib8000_set_isdbt_common_channel(struct dib8000_state *state, u8 seq, u8 autosearching)
2347{
2348 u16 p_cfr_left_edge = 0, p_cfr_right_edge = 0;
2349 u16 tmcc_pow = 0, ana_gain = 0, tmp = 0, i = 0, nbseg_diff = 0 ;
2350 u16 max_constellation = DQPSK;
2351 int init_prbs;
2352 struct dtv_frontend_properties *c = &state->fe[0]->dtv_property_cache;
2353
2354 if (autosearching)
2355 c->isdbt_partial_reception = 1;
2356
2357
2358 dib8000_write_word(state, 10, (seq << 4));
2359
2360
2361 state->mode = fft_to_mode(state);
2362
2363
2364 tmp = dib8000_read_word(state, 1);
2365 dib8000_write_word(state, 1, (tmp&0xfffc) | (c->guard_interval & 0x3));
2366
2367 dib8000_write_word(state, 274, (dib8000_read_word(state, 274) & 0xffcf) | ((c->isdbt_partial_reception & 1) << 5) | ((c->isdbt_sb_mode & 1) << 4));
2368
2369
2370 if (c->isdbt_partial_reception) {
2371 state->seg_diff_mask = (c->layer[0].modulation == DQPSK) << permu_seg[0];
2372 for (i = 1; i < 3; i++)
2373 nbseg_diff += (c->layer[i].modulation == DQPSK) * c->layer[i].segment_count;
2374 for (i = 0; i < nbseg_diff; i++)
2375 state->seg_diff_mask |= 1 << permu_seg[i+1];
2376 } else {
2377 for (i = 0; i < 3; i++)
2378 nbseg_diff += (c->layer[i].modulation == DQPSK) * c->layer[i].segment_count;
2379 for (i = 0; i < nbseg_diff; i++)
2380 state->seg_diff_mask |= 1 << permu_seg[i];
2381 }
2382
2383 if (state->seg_diff_mask)
2384 dib8000_write_word(state, 268, (dib8000_read_word(state, 268) & 0xF9FF) | 0x0200);
2385 else
2386 dib8000_write_word(state, 268, (2 << 9) | 39);
2387
2388 for (i = 0; i < 3; i++)
2389 max_constellation = dib8000_set_layer(state, i, max_constellation);
2390 if (autosearching == 0) {
2391 state->layer_b_nb_seg = c->layer[1].segment_count;
2392 state->layer_c_nb_seg = c->layer[2].segment_count;
2393 }
2394
2395
2396 dib8000_write_word(state, 0, (state->mode << 13) | state->seg_diff_mask);
2397
2398 state->differential_constellation = (state->seg_diff_mask != 0);
2399
2400
2401 ana_gain = dib8000_adp_fine_tune(state, max_constellation);
2402
2403
2404 dib8000_update_ana_gain(state, ana_gain);
2405
2406
2407 if (c->isdbt_partial_reception)
2408 dib8000_load_ana_fe_coefs(state, ana_fe_coeff_3seg);
2409 else
2410 dib8000_load_ana_fe_coefs(state, ana_fe_coeff_1seg);
2411
2412
2413 if (c->isdbt_sb_mode) {
2414 dib8000_set_sb_channel(state);
2415 if (c->isdbt_sb_subchannel < 14)
2416 init_prbs = dib8000_get_init_prbs(state, c->isdbt_sb_subchannel);
2417 else
2418 init_prbs = 0;
2419 } else {
2420 dib8000_set_13seg_channel(state);
2421 init_prbs = 0xfff;
2422 }
2423
2424
2425 dib8000_small_fine_tune(state);
2426
2427 dib8000_set_subchannel_prbs(state, init_prbs);
2428
2429
2430 for (i = 0; i < 13; i++) {
2431 if ((((~state->seg_diff_mask) >> i) & 1) == 1) {
2432 p_cfr_left_edge += (1 << i) * ((i == 0) || ((((state->seg_mask & (~state->seg_diff_mask)) >> (i - 1)) & 1) == 0));
2433 p_cfr_right_edge += (1 << i) * ((i == 12) || ((((state->seg_mask & (~state->seg_diff_mask)) >> (i + 1)) & 1) == 0));
2434 }
2435 }
2436 dib8000_write_word(state, 222, p_cfr_left_edge);
2437 dib8000_write_word(state, 223, p_cfr_right_edge);
2438
2439
2440 dib8000_write_word(state, 189, ~state->seg_mask | state->seg_diff_mask);
2441 dib8000_write_word(state, 192, ~state->seg_mask | state->seg_diff_mask);
2442 dib8000_write_word(state, 225, ~state->seg_mask | state->seg_diff_mask);
2443
2444 if (!autosearching)
2445 dib8000_write_word(state, 288, (~state->seg_mask | state->seg_diff_mask) & 0x1fff);
2446 else
2447 dib8000_write_word(state, 288, 0x1fff);
2448
2449 dib8000_write_word(state, 211, state->seg_mask & (~state->seg_diff_mask));
2450 dib8000_write_word(state, 287, ~state->seg_mask | 0x1000);
2451
2452 dib8000_write_word(state, 178, 32);
2453
2454
2455 for (i = 0; i < 3; i++)
2456 tmcc_pow += (((c->layer[i].modulation == DQPSK) * 4 + 1) * c->layer[i].segment_count) ;
2457
2458
2459
2460 tmcc_pow *= (1 << (9-2));
2461 dib8000_write_word(state, 290, tmcc_pow);
2462 dib8000_write_word(state, 291, tmcc_pow);
2463 dib8000_write_word(state, 292, tmcc_pow);
2464
2465
2466
2467 if (state->isdbt_cfg_loaded == 0)
2468 dib8000_write_word(state, 250, 3285);
2469
2470 state->isdbt_cfg_loaded = 0;
2471}
2472
2473static u32 dib8000_wait_lock(struct dib8000_state *state, u32 internal,
2474 u32 wait0_ms, u32 wait1_ms, u32 wait2_ms)
2475{
2476 u32 value = 0;
2477 u16 reg = 11;
2478
2479 for (reg = 11; reg < 16; reg += 2) {
2480 if (reg == 11) {
2481 if (state->revision == 0x8090)
2482 value = internal * wait1_ms;
2483 else
2484 value = internal * wait0_ms;
2485 } else if (reg == 13)
2486 value = internal * wait1_ms;
2487 else if (reg == 15)
2488 value = internal * wait2_ms;
2489 dib8000_write_word(state, reg, (u16)((value >> 16) & 0xffff));
2490 dib8000_write_word(state, (reg + 1), (u16)(value & 0xffff));
2491 }
2492 return value;
2493}
2494
2495static int dib8000_autosearch_start(struct dvb_frontend *fe)
2496{
2497 struct dib8000_state *state = fe->demodulator_priv;
2498 struct dtv_frontend_properties *c = &state->fe[0]->dtv_property_cache;
2499 u8 slist = 0;
2500 u32 value, internal = state->cfg.pll->internal;
2501
2502 if (state->revision == 0x8090)
2503 internal = dib8000_read32(state, 23) / 1000;
2504
2505 if ((state->revision >= 0x8002) &&
2506 (state->autosearch_state == AS_SEARCHING_FFT)) {
2507 dib8000_write_word(state, 37, 0x0065);
2508 dib8000_write_word(state, 116, 0x0000);
2509
2510 dib8000_write_word(state, 0, (dib8000_read_word(state, 0) & 0x1fff) | (0 << 13) | (1 << 15));
2511 dib8000_write_word(state, 1, (dib8000_read_word(state, 1) & 0xfffc) | 0);
2512 dib8000_write_word(state, 6, 0);
2513 dib8000_write_word(state, 7, 0);
2514 dib8000_write_word(state, 8, 0);
2515 dib8000_write_word(state, 10, (dib8000_read_word(state, 10) & 0x200) | (16 << 4) | (0 << 0));
2516
2517 if (state->revision == 0x8090)
2518 value = dib8000_wait_lock(state, internal, 10, 10, 10);
2519 else
2520 value = dib8000_wait_lock(state, internal, 20, 20, 20);
2521
2522 dib8000_write_word(state, 17, 0);
2523 dib8000_write_word(state, 18, 200);
2524 dib8000_write_word(state, 19, 0);
2525 dib8000_write_word(state, 20, 400);
2526 dib8000_write_word(state, 21, (value >> 16) & 0xffff);
2527 dib8000_write_word(state, 22, value & 0xffff);
2528
2529 if (state->revision == 0x8090)
2530 dib8000_write_word(state, 32, (dib8000_read_word(state, 32) & 0xf0ff) | (0 << 8));
2531 else
2532 dib8000_write_word(state, 32, (dib8000_read_word(state, 32) & 0xf0ff) | (9 << 8));
2533 dib8000_write_word(state, 355, 2);
2534
2535
2536 dib8000_write_word(state, 356, 0);
2537 dib8000_write_word(state, 357, 0x111);
2538
2539 dib8000_write_word(state, 770, (dib8000_read_word(state, 770) & 0xdfff) | (1 << 13));
2540 dib8000_write_word(state, 770, (dib8000_read_word(state, 770) & 0xdfff) | (0 << 13));
2541 dib8000_write_word(state, 0, (dib8000_read_word(state, 0) & 0x7ff) | (0 << 15) | (1 << 13));
2542 } else if ((state->revision >= 0x8002) &&
2543 (state->autosearch_state == AS_SEARCHING_GUARD)) {
2544 c->transmission_mode = TRANSMISSION_MODE_8K;
2545 c->guard_interval = GUARD_INTERVAL_1_8;
2546 c->inversion = 0;
2547 c->layer[0].modulation = QAM_64;
2548 c->layer[0].fec = FEC_2_3;
2549 c->layer[0].interleaving = 0;
2550 c->layer[0].segment_count = 13;
2551
2552 slist = 16;
2553 c->transmission_mode = state->found_nfft;
2554
2555 dib8000_set_isdbt_common_channel(state, slist, 1);
2556
2557
2558 dib8000_write_word(state, 6, 0x4);
2559 if (state->revision == 0x8090)
2560 dib8000_write_word(state, 7, ((1 << 12) | (1 << 11) | (1 << 10)));
2561 else
2562 dib8000_write_word(state, 7, 0x8);
2563 dib8000_write_word(state, 8, 0x1000);
2564
2565
2566 if (state->revision == 0x8090)
2567 dib8000_wait_lock(state, internal, 50, 100, 1000);
2568 else
2569 dib8000_wait_lock(state, internal, 50, 200, 1000);
2570
2571 dib8000_write_word(state, 355, 3);
2572
2573
2574 dib8000_write_word(state, 356, 0);
2575 dib8000_write_word(state, 357, 0xf);
2576
2577 value = dib8000_read_word(state, 0);
2578 dib8000_write_word(state, 0, (u16)((1 << 15) | value));
2579 dib8000_read_word(state, 1284);
2580 dib8000_write_word(state, 0, (u16)value);
2581 } else {
2582 c->inversion = 0;
2583 c->layer[0].modulation = QAM_64;
2584 c->layer[0].fec = FEC_2_3;
2585 c->layer[0].interleaving = 0;
2586 c->layer[0].segment_count = 13;
2587 if (!c->isdbt_sb_mode)
2588 c->layer[0].segment_count = 13;
2589
2590
2591 if (c->isdbt_sb_mode) {
2592 slist = 7;
2593 dib8000_write_word(state, 0, (dib8000_read_word(state, 0) & 0x9fff) | (1 << 13));
2594 } else {
2595 if (c->guard_interval == GUARD_INTERVAL_AUTO) {
2596 if (c->transmission_mode == TRANSMISSION_MODE_AUTO) {
2597 c->transmission_mode = TRANSMISSION_MODE_8K;
2598 c->guard_interval = GUARD_INTERVAL_1_8;
2599 slist = 7;
2600 dib8000_write_word(state, 0, (dib8000_read_word(state, 0) & 0x9fff) | (1 << 13));
2601 } else {
2602 c->guard_interval = GUARD_INTERVAL_1_8;
2603 slist = 3;
2604 }
2605 } else {
2606 if (c->transmission_mode == TRANSMISSION_MODE_AUTO) {
2607 c->transmission_mode = TRANSMISSION_MODE_8K;
2608 slist = 2;
2609 dib8000_write_word(state, 0, (dib8000_read_word(state, 0) & 0x9fff) | (1 << 13));
2610 } else
2611 slist = 0;
2612 }
2613 }
2614 dprintk("Using list for autosearch : %d\n", slist);
2615
2616 dib8000_set_isdbt_common_channel(state, slist, 1);
2617
2618
2619 dib8000_write_word(state, 6, 0x4);
2620 if (state->revision == 0x8090)
2621 dib8000_write_word(state, 7, (1 << 12) | (1 << 11) | (1 << 10));
2622 else
2623 dib8000_write_word(state, 7, 0x8);
2624 dib8000_write_word(state, 8, 0x1000);
2625
2626
2627 if (state->revision == 0x8090)
2628 dib8000_wait_lock(state, internal, 50, 200, 1000);
2629 else
2630 dib8000_wait_lock(state, internal, 50, 100, 1000);
2631
2632 value = dib8000_read_word(state, 0);
2633 dib8000_write_word(state, 0, (u16)((1 << 15) | value));
2634 dib8000_read_word(state, 1284);
2635 dib8000_write_word(state, 0, (u16)value);
2636 }
2637 return 0;
2638}
2639
2640static int dib8000_autosearch_irq(struct dvb_frontend *fe)
2641{
2642 struct dib8000_state *state = fe->demodulator_priv;
2643 u16 irq_pending = dib8000_read_word(state, 1284);
2644
2645 if ((state->revision >= 0x8002) &&
2646 (state->autosearch_state == AS_SEARCHING_FFT)) {
2647 if (irq_pending & 0x1) {
2648 dprintk("dib8000_autosearch_irq: max correlation result available\n");
2649 return 3;
2650 }
2651 } else {
2652 if (irq_pending & 0x1) {
2653 dprintk("dib8000_autosearch_irq failed\n");
2654 return 1;
2655 }
2656
2657 if (irq_pending & 0x2) {
2658 dprintk("dib8000_autosearch_irq succeeded\n");
2659 return 2;
2660 }
2661 }
2662
2663 return 0;
2664}
2665
2666static void dib8000_viterbi_state(struct dib8000_state *state, u8 onoff)
2667{
2668 u16 tmp;
2669
2670 tmp = dib8000_read_word(state, 771);
2671 if (onoff)
2672 dib8000_write_word(state, 771, tmp & 0xfffd);
2673 else
2674 dib8000_write_word(state, 771, tmp | (1<<1));
2675}
2676
2677static void dib8000_set_dds(struct dib8000_state *state, s32 offset_khz)
2678{
2679 s16 unit_khz_dds_val;
2680 u32 abs_offset_khz = abs(offset_khz);
2681 u32 dds = state->cfg.pll->ifreq & 0x1ffffff;
2682 u8 invert = !!(state->cfg.pll->ifreq & (1 << 25));
2683 u8 ratio;
2684
2685 if (state->revision == 0x8090) {
2686 ratio = 4;
2687 unit_khz_dds_val = (1<<26) / (dib8000_read32(state, 23) / 1000);
2688 if (offset_khz < 0)
2689 dds = (1 << 26) - (abs_offset_khz * unit_khz_dds_val);
2690 else
2691 dds = (abs_offset_khz * unit_khz_dds_val);
2692
2693 if (invert)
2694 dds = (1<<26) - dds;
2695 } else {
2696 ratio = 2;
2697 unit_khz_dds_val = (u16) (67108864 / state->cfg.pll->internal);
2698
2699 if (offset_khz < 0)
2700 unit_khz_dds_val *= -1;
2701
2702
2703 if (invert)
2704 dds -= abs_offset_khz * unit_khz_dds_val;
2705 else
2706 dds += abs_offset_khz * unit_khz_dds_val;
2707 }
2708
2709 dprintk("setting a DDS frequency offset of %c%dkHz\n", invert ? '-' : ' ', dds / unit_khz_dds_val);
2710
2711 if (abs_offset_khz <= (state->cfg.pll->internal / ratio)) {
2712
2713 dib8000_write_word(state, 26, invert);
2714 dib8000_write_word(state, 27, (u16)(dds >> 16) & 0x1ff);
2715 dib8000_write_word(state, 28, (u16)(dds & 0xffff));
2716 }
2717}
2718
2719static void dib8000_set_frequency_offset(struct dib8000_state *state)
2720{
2721 struct dtv_frontend_properties *c = &state->fe[0]->dtv_property_cache;
2722 int i;
2723 u32 current_rf;
2724 int total_dds_offset_khz;
2725
2726 if (state->fe[0]->ops.tuner_ops.get_frequency)
2727 state->fe[0]->ops.tuner_ops.get_frequency(state->fe[0], ¤t_rf);
2728 else
2729 current_rf = c->frequency;
2730 current_rf /= 1000;
2731 total_dds_offset_khz = (int)current_rf - (int)c->frequency / 1000;
2732
2733 if (c->isdbt_sb_mode) {
2734 state->subchannel = c->isdbt_sb_subchannel;
2735
2736 i = dib8000_read_word(state, 26) & 1;
2737 dib8000_write_word(state, 26, c->inversion ^ i);
2738
2739 if (state->cfg.pll->ifreq == 0) {
2740 if ((c->inversion ^ i) == 0)
2741 dib8000_write_word(state, 26, dib8000_read_word(state, 26) | 1);
2742 } else {
2743 if ((c->inversion ^ i) == 0)
2744 total_dds_offset_khz *= -1;
2745 }
2746 }
2747
2748 dprintk("%dkhz tuner offset (frequency = %dHz & current_rf = %dHz) total_dds_offset_hz = %d\n", c->frequency - current_rf, c->frequency, current_rf, total_dds_offset_khz);
2749
2750
2751 dib8000_set_dds(state, total_dds_offset_khz);
2752}
2753
2754static u16 LUT_isdbt_symbol_duration[4] = { 26, 101, 63 };
2755
2756static u32 dib8000_get_symbol_duration(struct dib8000_state *state)
2757{
2758 struct dtv_frontend_properties *c = &state->fe[0]->dtv_property_cache;
2759 u16 i;
2760
2761 switch (c->transmission_mode) {
2762 case TRANSMISSION_MODE_2K:
2763 i = 0;
2764 break;
2765 case TRANSMISSION_MODE_4K:
2766 i = 2;
2767 break;
2768 default:
2769 case TRANSMISSION_MODE_AUTO:
2770 case TRANSMISSION_MODE_8K:
2771 i = 1;
2772 break;
2773 }
2774
2775 return (LUT_isdbt_symbol_duration[i] / (c->bandwidth_hz / 1000)) + 1;
2776}
2777
2778static void dib8000_set_isdbt_loop_params(struct dib8000_state *state, enum param_loop_step loop_step)
2779{
2780 struct dtv_frontend_properties *c = &state->fe[0]->dtv_property_cache;
2781 u16 reg_32 = 0, reg_37 = 0;
2782
2783 switch (loop_step) {
2784 case LOOP_TUNE_1:
2785 if (c->isdbt_sb_mode) {
2786 if (c->isdbt_partial_reception == 0) {
2787 reg_32 = ((11 - state->mode) << 12) | (6 << 8) | 0x40;
2788 reg_37 = (3 << 5) | (0 << 4) | (10 - state->mode);
2789 } else {
2790 reg_32 = ((10 - state->mode) << 12) | (6 << 8) | 0x60;
2791 reg_37 = (3 << 5) | (0 << 4) | (9 - state->mode);
2792 }
2793 } else {
2794 reg_32 = ((9 - state->mode) << 12) | (6 << 8) | 0x80;
2795 reg_37 = (3 << 5) | (0 << 4) | (8 - state->mode);
2796 }
2797 break;
2798 case LOOP_TUNE_2:
2799 if (c->isdbt_sb_mode) {
2800 if (c->isdbt_partial_reception == 0) {
2801 reg_32 = ((13-state->mode) << 12) | (6 << 8) | 0x40;
2802 reg_37 = (12-state->mode) | ((5 + state->mode) << 5);
2803 } else {
2804 reg_32 = ((12-state->mode) << 12) | (6 << 8) | 0x60;
2805 reg_37 = (11-state->mode) | ((5 + state->mode) << 5);
2806 }
2807 } else {
2808 reg_32 = ((11-state->mode) << 12) | (6 << 8) | 0x80;
2809 reg_37 = ((5+state->mode) << 5) | (10 - state->mode);
2810 }
2811 break;
2812 }
2813 dib8000_write_word(state, 32, reg_32);
2814 dib8000_write_word(state, 37, reg_37);
2815}
2816
2817static void dib8000_demod_restart(struct dib8000_state *state)
2818{
2819 dib8000_write_word(state, 770, 0x4000);
2820 dib8000_write_word(state, 770, 0x0000);
2821 return;
2822}
2823
2824static void dib8000_set_sync_wait(struct dib8000_state *state)
2825{
2826 struct dtv_frontend_properties *c = &state->fe[0]->dtv_property_cache;
2827 u16 sync_wait = 64;
2828
2829
2830 switch (c->transmission_mode) {
2831 case TRANSMISSION_MODE_8K:
2832 sync_wait = 256;
2833 break;
2834 case TRANSMISSION_MODE_4K:
2835 sync_wait = 128;
2836 break;
2837 default:
2838 case TRANSMISSION_MODE_2K:
2839 sync_wait = 64;
2840 break;
2841 }
2842
2843 if (state->cfg.diversity_delay == 0)
2844 sync_wait = (sync_wait * (1 << (c->guard_interval)) * 3) / 2 + 48;
2845 else
2846 sync_wait = (sync_wait * (1 << (c->guard_interval)) * 3) / 2 + state->cfg.diversity_delay;
2847
2848 dib8000_write_word(state, 273, (dib8000_read_word(state, 273) & 0x000f) | (sync_wait << 4));
2849}
2850
2851static unsigned long dib8000_get_timeout(struct dib8000_state *state, u32 delay, enum timeout_mode mode)
2852{
2853 if (mode == SYMBOL_DEPENDENT_ON)
2854 delay *= state->symbol_duration;
2855
2856 return jiffies + usecs_to_jiffies(delay * 100);
2857}
2858
2859static s32 dib8000_get_status(struct dvb_frontend *fe)
2860{
2861 struct dib8000_state *state = fe->demodulator_priv;
2862 return state->status;
2863}
2864
2865static enum frontend_tune_state dib8000_get_tune_state(struct dvb_frontend *fe)
2866{
2867 struct dib8000_state *state = fe->demodulator_priv;
2868 return state->tune_state;
2869}
2870
2871static int dib8000_set_tune_state(struct dvb_frontend *fe, enum frontend_tune_state tune_state)
2872{
2873 struct dib8000_state *state = fe->demodulator_priv;
2874
2875 state->tune_state = tune_state;
2876 return 0;
2877}
2878
2879static int dib8000_tune_restart_from_demod(struct dvb_frontend *fe)
2880{
2881 struct dib8000_state *state = fe->demodulator_priv;
2882
2883 state->status = FE_STATUS_TUNE_PENDING;
2884 state->tune_state = CT_DEMOD_START;
2885 return 0;
2886}
2887
2888static u16 dib8000_read_lock(struct dvb_frontend *fe)
2889{
2890 struct dib8000_state *state = fe->demodulator_priv;
2891
2892 if (state->revision == 0x8090)
2893 return dib8000_read_word(state, 570);
2894 return dib8000_read_word(state, 568);
2895}
2896
2897static int dib8090p_init_sdram(struct dib8000_state *state)
2898{
2899 u16 reg = 0;
2900 dprintk("init sdram\n");
2901
2902 reg = dib8000_read_word(state, 274) & 0xfff0;
2903 dib8000_write_word(state, 274, reg | 0x7);
2904
2905 dib8000_write_word(state, 1803, (7 << 2));
2906
2907 reg = dib8000_read_word(state, 1280);
2908 dib8000_write_word(state, 1280, reg | (1 << 2));
2909 dib8000_write_word(state, 1280, reg);
2910
2911 return 0;
2912}
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929static int is_manual_mode(struct dtv_frontend_properties *c)
2930{
2931 int i, n_segs = 0;
2932
2933
2934 if (c->delivery_system != SYS_ISDBT)
2935 return 0;
2936
2937
2938
2939
2940 if (c->transmission_mode == TRANSMISSION_MODE_AUTO) {
2941 dprintk("transmission mode auto\n");
2942 return 0;
2943 }
2944
2945
2946
2947
2948 if (c->guard_interval == GUARD_INTERVAL_AUTO) {
2949 dprintk("guard interval auto\n");
2950 return 0;
2951 }
2952
2953
2954
2955
2956
2957 if (!c->isdbt_layer_enabled) {
2958 dprintk("no layer modulation specified\n");
2959 return 0;
2960 }
2961
2962
2963
2964
2965
2966 for (i = 0; i < 3; i++) {
2967 if (!(c->isdbt_layer_enabled & 1 << i))
2968 continue;
2969
2970 if ((c->layer[i].segment_count > 13) ||
2971 (c->layer[i].segment_count == 0)) {
2972 c->isdbt_layer_enabled &= ~(1 << i);
2973 continue;
2974 }
2975
2976 n_segs += c->layer[i].segment_count;
2977
2978 if ((c->layer[i].modulation == QAM_AUTO) ||
2979 (c->layer[i].fec == FEC_AUTO)) {
2980 dprintk("layer %c has either modulation or FEC auto\n",
2981 'A' + i);
2982 return 0;
2983 }
2984 }
2985
2986
2987
2988
2989
2990 if (n_segs == 0 || n_segs > 13) {
2991 dprintk("number of segments is invalid\n");
2992 return 0;
2993 }
2994
2995
2996 return 1;
2997}
2998
2999static int dib8000_tune(struct dvb_frontend *fe)
3000{
3001 struct dib8000_state *state = fe->demodulator_priv;
3002 struct dtv_frontend_properties *c = &state->fe[0]->dtv_property_cache;
3003 enum frontend_tune_state *tune_state = &state->tune_state;
3004
3005 u16 locks, deeper_interleaver = 0, i;
3006 int ret = 1;
3007
3008 unsigned long *timeout = &state->timeout;
3009 unsigned long now = jiffies;
3010#ifdef DIB8000_AGC_FREEZE
3011 u16 agc1, agc2;
3012#endif
3013
3014 u32 corm[4] = {0, 0, 0, 0};
3015 u8 find_index, max_value;
3016
3017#if 0
3018 if (*tune_state < CT_DEMOD_STOP)
3019 dprintk("IN: context status = %d, TUNE_STATE %d autosearch step = %u jiffies = %lu\n",
3020 state->channel_parameters_set, *tune_state, state->autosearch_state, now);
3021#endif
3022
3023 switch (*tune_state) {
3024 case CT_DEMOD_START:
3025 dib8000_reset_stats(fe);
3026
3027 if (state->revision == 0x8090)
3028 dib8090p_init_sdram(state);
3029 state->status = FE_STATUS_TUNE_PENDING;
3030 state->channel_parameters_set = is_manual_mode(c);
3031
3032 dprintk("Tuning channel on %s search mode\n",
3033 state->channel_parameters_set ? "manual" : "auto");
3034
3035 dib8000_viterbi_state(state, 0);
3036
3037
3038 dib8000_write_word(state, 285, dib8000_read_word(state, 285) & 0x60);
3039
3040 dib8000_set_frequency_offset(state);
3041 dib8000_set_bandwidth(fe, c->bandwidth_hz / 1000);
3042
3043 if (state->channel_parameters_set == 0) {
3044#ifdef DIB8000_AGC_FREEZE
3045 if (state->revision != 0x8090) {
3046 state->agc1_max = dib8000_read_word(state, 108);
3047 state->agc1_min = dib8000_read_word(state, 109);
3048 state->agc2_max = dib8000_read_word(state, 110);
3049 state->agc2_min = dib8000_read_word(state, 111);
3050 agc1 = dib8000_read_word(state, 388);
3051 agc2 = dib8000_read_word(state, 389);
3052 dib8000_write_word(state, 108, agc1);
3053 dib8000_write_word(state, 109, agc1);
3054 dib8000_write_word(state, 110, agc2);
3055 dib8000_write_word(state, 111, agc2);
3056 }
3057#endif
3058 state->autosearch_state = AS_SEARCHING_FFT;
3059 state->found_nfft = TRANSMISSION_MODE_AUTO;
3060 state->found_guard = GUARD_INTERVAL_AUTO;
3061 *tune_state = CT_DEMOD_SEARCH_NEXT;
3062 } else {
3063 state->autosearch_state = AS_DONE;
3064 *tune_state = CT_DEMOD_STEP_3;
3065 }
3066 state->symbol_duration = dib8000_get_symbol_duration(state);
3067 break;
3068
3069 case CT_DEMOD_SEARCH_NEXT:
3070 dib8000_autosearch_start(fe);
3071 if (state->revision == 0x8090)
3072 ret = 50;
3073 else
3074 ret = 15;
3075 *tune_state = CT_DEMOD_STEP_1;
3076 break;
3077
3078 case CT_DEMOD_STEP_1:
3079 switch (dib8000_autosearch_irq(fe)) {
3080 case 1:
3081 state->status = FE_STATUS_TUNE_FAILED;
3082 state->autosearch_state = AS_DONE;
3083 *tune_state = CT_DEMOD_STOP;
3084 break;
3085 case 2:
3086 state->status = FE_STATUS_FFT_SUCCESS;
3087 *tune_state = CT_DEMOD_STEP_3;
3088 if (state->autosearch_state == AS_SEARCHING_GUARD)
3089 *tune_state = CT_DEMOD_STEP_2;
3090 else
3091 state->autosearch_state = AS_DONE;
3092 break;
3093 case 3:
3094 *tune_state = CT_DEMOD_STEP_2;
3095 break;
3096 }
3097 break;
3098
3099 case CT_DEMOD_STEP_2:
3100 switch (state->autosearch_state) {
3101 case AS_SEARCHING_FFT:
3102
3103 if (state->revision == 0x8090) {
3104 corm[2] = (dib8000_read_word(state, 596) << 16) | (dib8000_read_word(state, 597));
3105 corm[1] = (dib8000_read_word(state, 598) << 16) | (dib8000_read_word(state, 599));
3106 corm[0] = (dib8000_read_word(state, 600) << 16) | (dib8000_read_word(state, 601));
3107 } else {
3108 corm[2] = (dib8000_read_word(state, 594) << 16) | (dib8000_read_word(state, 595));
3109 corm[1] = (dib8000_read_word(state, 596) << 16) | (dib8000_read_word(state, 597));
3110 corm[0] = (dib8000_read_word(state, 598) << 16) | (dib8000_read_word(state, 599));
3111 }
3112
3113
3114 max_value = 0;
3115 for (find_index = 1 ; find_index < 3 ; find_index++) {
3116 if (corm[max_value] < corm[find_index])
3117 max_value = find_index ;
3118 }
3119
3120 switch (max_value) {
3121 case 0:
3122 state->found_nfft = TRANSMISSION_MODE_2K;
3123 break;
3124 case 1:
3125 state->found_nfft = TRANSMISSION_MODE_4K;
3126 break;
3127 case 2:
3128 default:
3129 state->found_nfft = TRANSMISSION_MODE_8K;
3130 break;
3131 }
3132
3133
3134 *tune_state = CT_DEMOD_SEARCH_NEXT;
3135 state->autosearch_state = AS_SEARCHING_GUARD;
3136 if (state->revision == 0x8090)
3137 ret = 50;
3138 else
3139 ret = 10;
3140 break;
3141 case AS_SEARCHING_GUARD:
3142
3143 if (state->revision == 0x8090)
3144 state->found_guard = dib8000_read_word(state, 572) & 0x3;
3145 else
3146 state->found_guard = dib8000_read_word(state, 570) & 0x3;
3147
3148
3149 *tune_state = CT_DEMOD_STEP_3;
3150 break;
3151 default:
3152
3153 state->status = FE_STATUS_TUNE_FAILED;
3154 state->autosearch_state = AS_DONE;
3155 *tune_state = CT_DEMOD_STOP;
3156 break;
3157 }
3158 break;
3159
3160 case CT_DEMOD_STEP_3:
3161 dib8000_set_isdbt_loop_params(state, LOOP_TUNE_1);
3162 dib8000_set_isdbt_common_channel(state, 0, 0);
3163 *tune_state = CT_DEMOD_STEP_4;
3164 break;
3165
3166 case CT_DEMOD_STEP_4:
3167 dib8000_demod_restart(state);
3168
3169 dib8000_set_sync_wait(state);
3170 dib8000_set_diversity_in(state->fe[0], state->diversity_onoff);
3171
3172 locks = (dib8000_read_word(state, 180) >> 6) & 0x3f;
3173
3174 *timeout = dib8000_get_timeout(state, 2 * locks, SYMBOL_DEPENDENT_ON);
3175 *tune_state = CT_DEMOD_STEP_5;
3176 break;
3177
3178 case CT_DEMOD_STEP_5:
3179 locks = dib8000_read_lock(fe);
3180 if (locks & (0x3 << 11)) {
3181 dib8000_update_timf(state);
3182 if (!state->differential_constellation) {
3183
3184 *timeout = dib8000_get_timeout(state, (20 * ((dib8000_read_word(state, 188)>>5)&0x1f)), SYMBOL_DEPENDENT_ON);
3185 *tune_state = CT_DEMOD_STEP_7;
3186 } else {
3187 *tune_state = CT_DEMOD_STEP_8;
3188 }
3189 } else if (time_after(now, *timeout)) {
3190 *tune_state = CT_DEMOD_STEP_6;
3191 }
3192 break;
3193
3194 case CT_DEMOD_STEP_6:
3195 if ((state->fe[1] != NULL) && (state->output_mode != OUTMODE_DIVERSITY)) {
3196
3197 if (dib8000_get_status(state->fe[1]) <= FE_STATUS_STD_SUCCESS)
3198 *tune_state = CT_DEMOD_STEP_8;
3199 else if (dib8000_get_status(state->fe[1]) >= FE_STATUS_TUNE_TIME_TOO_SHORT) {
3200 *tune_state = CT_DEMOD_STOP;
3201 dib8000_viterbi_state(state, 1);
3202 dib8000_set_isdbt_loop_params(state, LOOP_TUNE_2);
3203 state->status = FE_STATUS_TUNE_FAILED;
3204 }
3205 } else {
3206 dib8000_viterbi_state(state, 1);
3207 dib8000_set_isdbt_loop_params(state, LOOP_TUNE_2);
3208 *tune_state = CT_DEMOD_STOP;
3209 state->status = FE_STATUS_TUNE_FAILED;
3210 }
3211 break;
3212
3213 case CT_DEMOD_STEP_7:
3214 locks = dib8000_read_lock(fe);
3215 if (locks & (1<<10)) {
3216 ret = 14;
3217 *tune_state = CT_DEMOD_STEP_8;
3218 } else if (time_after(now, *timeout))
3219 *tune_state = CT_DEMOD_STEP_6;
3220 break;
3221
3222 case CT_DEMOD_STEP_8:
3223 dib8000_viterbi_state(state, 1);
3224 dib8000_set_isdbt_loop_params(state, LOOP_TUNE_2);
3225
3226
3227 if (c->isdbt_sb_mode
3228 && c->isdbt_sb_subchannel < 14
3229 && !state->differential_constellation) {
3230 state->subchannel = 0;
3231 *tune_state = CT_DEMOD_STEP_11;
3232 } else {
3233 *tune_state = CT_DEMOD_STEP_9;
3234 state->status = FE_STATUS_LOCKED;
3235 }
3236 break;
3237
3238 case CT_DEMOD_STEP_9:
3239 if ((state->revision == 0x8090) || ((dib8000_read_word(state, 1291) >> 9) & 0x1)) {
3240
3241 for (i = 0; i < 3; i++) {
3242 if (c->layer[i].interleaving >= deeper_interleaver) {
3243 dprintk("layer%i: time interleaver = %d\n", i, c->layer[i].interleaving);
3244 if (c->layer[i].segment_count > 0) {
3245 deeper_interleaver = c->layer[0].interleaving;
3246 state->longest_intlv_layer = i;
3247 }
3248 }
3249 }
3250
3251 if (deeper_interleaver == 0)
3252 locks = 2;
3253 else if (deeper_interleaver == 3)
3254 locks = 8;
3255 else
3256 locks = 2 * deeper_interleaver;
3257
3258 if (state->diversity_onoff != 0)
3259 locks *= 2;
3260
3261 *timeout = now + msecs_to_jiffies(200 * locks);
3262 dprintk("Deeper interleaver mode = %d on layer %d : timeout mult factor = %d => will use timeout = %ld\n",
3263 deeper_interleaver, state->longest_intlv_layer, locks, *timeout);
3264
3265 *tune_state = CT_DEMOD_STEP_10;
3266 } else
3267 *tune_state = CT_DEMOD_STOP;
3268 break;
3269
3270 case CT_DEMOD_STEP_10:
3271 locks = dib8000_read_lock(fe);
3272 if (locks&(1<<(7-state->longest_intlv_layer))) {
3273 dprintk("ISDB-T layer locks: Layer A %s, Layer B %s, Layer C %s\n",
3274 c->layer[0].segment_count ? (locks >> 7) & 0x1 ? "locked" : "NOT LOCKED" : "not enabled",
3275 c->layer[1].segment_count ? (locks >> 6) & 0x1 ? "locked" : "NOT LOCKED" : "not enabled",
3276 c->layer[2].segment_count ? (locks >> 5) & 0x1 ? "locked" : "NOT LOCKED" : "not enabled");
3277 if (c->isdbt_sb_mode
3278 && c->isdbt_sb_subchannel < 14
3279 && !state->differential_constellation)
3280
3281 state->status = FE_STATUS_DEMOD_SUCCESS;
3282 else
3283 state->status = FE_STATUS_DATA_LOCKED;
3284 *tune_state = CT_DEMOD_STOP;
3285 } else if (time_after(now, *timeout)) {
3286 if (c->isdbt_sb_mode
3287 && c->isdbt_sb_subchannel < 14
3288 && !state->differential_constellation) {
3289 state->subchannel += 3;
3290 *tune_state = CT_DEMOD_STEP_11;
3291 } else {
3292 if (locks & (0x7 << 5)) {
3293 dprintk("Not all ISDB-T layers locked in %d ms: Layer A %s, Layer B %s, Layer C %s\n",
3294 jiffies_to_msecs(now - *timeout),
3295 c->layer[0].segment_count ? (locks >> 7) & 0x1 ? "locked" : "NOT LOCKED" : "not enabled",
3296 c->layer[1].segment_count ? (locks >> 6) & 0x1 ? "locked" : "NOT LOCKED" : "not enabled",
3297 c->layer[2].segment_count ? (locks >> 5) & 0x1 ? "locked" : "NOT LOCKED" : "not enabled");
3298
3299 state->status = FE_STATUS_DATA_LOCKED;
3300 } else
3301 state->status = FE_STATUS_TUNE_FAILED;
3302 *tune_state = CT_DEMOD_STOP;
3303 }
3304 }
3305 break;
3306
3307 case CT_DEMOD_STEP_11:
3308 if (state->subchannel <= 41) {
3309 dib8000_set_subchannel_prbs(state, dib8000_get_init_prbs(state, state->subchannel));
3310 *tune_state = CT_DEMOD_STEP_9;
3311 } else {
3312 *tune_state = CT_DEMOD_STOP;
3313 state->status = FE_STATUS_TUNE_FAILED;
3314 }
3315 break;
3316
3317 default:
3318 break;
3319 }
3320
3321
3322 switch (*tune_state) {
3323 case CT_DEMOD_STOP:
3324#ifdef DIB8000_AGC_FREEZE
3325 if ((state->revision != 0x8090) && (state->agc1_max != 0)) {
3326 dib8000_write_word(state, 108, state->agc1_max);
3327 dib8000_write_word(state, 109, state->agc1_min);
3328 dib8000_write_word(state, 110, state->agc2_max);
3329 dib8000_write_word(state, 111, state->agc2_min);
3330 state->agc1_max = 0;
3331 state->agc1_min = 0;
3332 state->agc2_max = 0;
3333 state->agc2_min = 0;
3334 }
3335#endif
3336 ret = 0;
3337 break;
3338 default:
3339 break;
3340 }
3341
3342 if ((ret > 0) && (*tune_state > CT_DEMOD_STEP_3))
3343 return ret * state->symbol_duration;
3344 if ((ret > 0) && (ret < state->symbol_duration))
3345 return state->symbol_duration;
3346 return ret;
3347}
3348
3349static int dib8000_wakeup(struct dvb_frontend *fe)
3350{
3351 struct dib8000_state *state = fe->demodulator_priv;
3352 u8 index_frontend;
3353 int ret;
3354
3355 dib8000_set_power_mode(state, DIB8000_POWER_ALL);
3356 dib8000_set_adc_state(state, DIBX000_ADC_ON);
3357 if (dib8000_set_adc_state(state, DIBX000_SLOW_ADC_ON) != 0)
3358 dprintk("could not start Slow ADC\n");
3359
3360 if (state->revision == 0x8090)
3361 dib8000_sad_calib(state);
3362
3363 for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
3364 ret = state->fe[index_frontend]->ops.init(state->fe[index_frontend]);
3365 if (ret < 0)
3366 return ret;
3367 }
3368
3369 return 0;
3370}
3371
3372static int dib8000_sleep(struct dvb_frontend *fe)
3373{
3374 struct dib8000_state *state = fe->demodulator_priv;
3375 u8 index_frontend;
3376 int ret;
3377
3378 for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
3379 ret = state->fe[index_frontend]->ops.sleep(state->fe[index_frontend]);
3380 if (ret < 0)
3381 return ret;
3382 }
3383
3384 if (state->revision != 0x8090)
3385 dib8000_set_output_mode(fe, OUTMODE_HIGH_Z);
3386 dib8000_set_power_mode(state, DIB8000_POWER_INTERFACE_ONLY);
3387 return dib8000_set_adc_state(state, DIBX000_SLOW_ADC_OFF) | dib8000_set_adc_state(state, DIBX000_ADC_OFF);
3388}
3389
3390static int dib8000_read_status(struct dvb_frontend *fe, enum fe_status *stat);
3391
3392static int dib8000_get_frontend(struct dvb_frontend *fe,
3393 struct dtv_frontend_properties *c)
3394{
3395 struct dib8000_state *state = fe->demodulator_priv;
3396 u16 i, val = 0;
3397 enum fe_status stat = 0;
3398 u8 index_frontend, sub_index_frontend;
3399
3400 c->bandwidth_hz = 6000000;
3401
3402
3403
3404
3405
3406
3407 dib8000_read_status(fe, &stat);
3408 if (!(stat & FE_HAS_SYNC))
3409 return 0;
3410
3411 dprintk("dib8000_get_frontend: TMCC lock\n");
3412 for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
3413 state->fe[index_frontend]->ops.read_status(state->fe[index_frontend], &stat);
3414 if (stat&FE_HAS_SYNC) {
3415 dprintk("TMCC lock on the slave%i\n", index_frontend);
3416
3417 state->fe[index_frontend]->ops.get_frontend(state->fe[index_frontend], c);
3418 for (sub_index_frontend = 0; (sub_index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[sub_index_frontend] != NULL); sub_index_frontend++) {
3419 if (sub_index_frontend != index_frontend) {
3420 state->fe[sub_index_frontend]->dtv_property_cache.isdbt_sb_mode = state->fe[index_frontend]->dtv_property_cache.isdbt_sb_mode;
3421 state->fe[sub_index_frontend]->dtv_property_cache.inversion = state->fe[index_frontend]->dtv_property_cache.inversion;
3422 state->fe[sub_index_frontend]->dtv_property_cache.transmission_mode = state->fe[index_frontend]->dtv_property_cache.transmission_mode;
3423 state->fe[sub_index_frontend]->dtv_property_cache.guard_interval = state->fe[index_frontend]->dtv_property_cache.guard_interval;
3424 state->fe[sub_index_frontend]->dtv_property_cache.isdbt_partial_reception = state->fe[index_frontend]->dtv_property_cache.isdbt_partial_reception;
3425 for (i = 0; i < 3; i++) {
3426 state->fe[sub_index_frontend]->dtv_property_cache.layer[i].segment_count = state->fe[index_frontend]->dtv_property_cache.layer[i].segment_count;
3427 state->fe[sub_index_frontend]->dtv_property_cache.layer[i].interleaving = state->fe[index_frontend]->dtv_property_cache.layer[i].interleaving;
3428 state->fe[sub_index_frontend]->dtv_property_cache.layer[i].fec = state->fe[index_frontend]->dtv_property_cache.layer[i].fec;
3429 state->fe[sub_index_frontend]->dtv_property_cache.layer[i].modulation = state->fe[index_frontend]->dtv_property_cache.layer[i].modulation;
3430 }
3431 }
3432 }
3433 return 0;
3434 }
3435 }
3436
3437 c->isdbt_sb_mode = dib8000_read_word(state, 508) & 0x1;
3438
3439 if (state->revision == 0x8090)
3440 val = dib8000_read_word(state, 572);
3441 else
3442 val = dib8000_read_word(state, 570);
3443 c->inversion = (val & 0x40) >> 6;
3444 switch ((val & 0x30) >> 4) {
3445 case 1:
3446 c->transmission_mode = TRANSMISSION_MODE_2K;
3447 dprintk("dib8000_get_frontend: transmission mode 2K\n");
3448 break;
3449 case 2:
3450 c->transmission_mode = TRANSMISSION_MODE_4K;
3451 dprintk("dib8000_get_frontend: transmission mode 4K\n");
3452 break;
3453 case 3:
3454 default:
3455 c->transmission_mode = TRANSMISSION_MODE_8K;
3456 dprintk("dib8000_get_frontend: transmission mode 8K\n");
3457 break;
3458 }
3459
3460 switch (val & 0x3) {
3461 case 0:
3462 c->guard_interval = GUARD_INTERVAL_1_32;
3463 dprintk("dib8000_get_frontend: Guard Interval = 1/32\n");
3464 break;
3465 case 1:
3466 c->guard_interval = GUARD_INTERVAL_1_16;
3467 dprintk("dib8000_get_frontend: Guard Interval = 1/16\n");
3468 break;
3469 case 2:
3470 dprintk("dib8000_get_frontend: Guard Interval = 1/8\n");
3471 c->guard_interval = GUARD_INTERVAL_1_8;
3472 break;
3473 case 3:
3474 dprintk("dib8000_get_frontend: Guard Interval = 1/4\n");
3475 c->guard_interval = GUARD_INTERVAL_1_4;
3476 break;
3477 }
3478
3479 val = dib8000_read_word(state, 505);
3480 c->isdbt_partial_reception = val & 1;
3481 dprintk("dib8000_get_frontend: partial_reception = %d\n", c->isdbt_partial_reception);
3482
3483 for (i = 0; i < 3; i++) {
3484 int show;
3485
3486 val = dib8000_read_word(state, 493 + i) & 0x0f;
3487 c->layer[i].segment_count = val;
3488
3489 if (val == 0 || val > 13)
3490 show = 0;
3491 else
3492 show = 1;
3493
3494 if (show)
3495 dprintk("dib8000_get_frontend: Layer %d segments = %d\n",
3496 i, c->layer[i].segment_count);
3497
3498 val = dib8000_read_word(state, 499 + i) & 0x3;
3499
3500 if (val == 3)
3501 val = 4;
3502 c->layer[i].interleaving = val;
3503 if (show)
3504 dprintk("dib8000_get_frontend: Layer %d time_intlv = %d\n",
3505 i, c->layer[i].interleaving);
3506
3507 val = dib8000_read_word(state, 481 + i);
3508 switch (val & 0x7) {
3509 case 1:
3510 c->layer[i].fec = FEC_1_2;
3511 if (show)
3512 dprintk("dib8000_get_frontend: Layer %d Code Rate = 1/2\n", i);
3513 break;
3514 case 2:
3515 c->layer[i].fec = FEC_2_3;
3516 if (show)
3517 dprintk("dib8000_get_frontend: Layer %d Code Rate = 2/3\n", i);
3518 break;
3519 case 3:
3520 c->layer[i].fec = FEC_3_4;
3521 if (show)
3522 dprintk("dib8000_get_frontend: Layer %d Code Rate = 3/4\n", i);
3523 break;
3524 case 5:
3525 c->layer[i].fec = FEC_5_6;
3526 if (show)
3527 dprintk("dib8000_get_frontend: Layer %d Code Rate = 5/6\n", i);
3528 break;
3529 default:
3530 c->layer[i].fec = FEC_7_8;
3531 if (show)
3532 dprintk("dib8000_get_frontend: Layer %d Code Rate = 7/8\n", i);
3533 break;
3534 }
3535
3536 val = dib8000_read_word(state, 487 + i);
3537 switch (val & 0x3) {
3538 case 0:
3539 c->layer[i].modulation = DQPSK;
3540 if (show)
3541 dprintk("dib8000_get_frontend: Layer %d DQPSK\n", i);
3542 break;
3543 case 1:
3544 c->layer[i].modulation = QPSK;
3545 if (show)
3546 dprintk("dib8000_get_frontend: Layer %d QPSK\n", i);
3547 break;
3548 case 2:
3549 c->layer[i].modulation = QAM_16;
3550 if (show)
3551 dprintk("dib8000_get_frontend: Layer %d QAM16\n", i);
3552 break;
3553 case 3:
3554 default:
3555 c->layer[i].modulation = QAM_64;
3556 if (show)
3557 dprintk("dib8000_get_frontend: Layer %d QAM64\n", i);
3558 break;
3559 }
3560 }
3561
3562
3563 for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
3564 state->fe[index_frontend]->dtv_property_cache.isdbt_sb_mode = c->isdbt_sb_mode;
3565 state->fe[index_frontend]->dtv_property_cache.inversion = c->inversion;
3566 state->fe[index_frontend]->dtv_property_cache.transmission_mode = c->transmission_mode;
3567 state->fe[index_frontend]->dtv_property_cache.guard_interval = c->guard_interval;
3568 state->fe[index_frontend]->dtv_property_cache.isdbt_partial_reception = c->isdbt_partial_reception;
3569 for (i = 0; i < 3; i++) {
3570 state->fe[index_frontend]->dtv_property_cache.layer[i].segment_count = c->layer[i].segment_count;
3571 state->fe[index_frontend]->dtv_property_cache.layer[i].interleaving = c->layer[i].interleaving;
3572 state->fe[index_frontend]->dtv_property_cache.layer[i].fec = c->layer[i].fec;
3573 state->fe[index_frontend]->dtv_property_cache.layer[i].modulation = c->layer[i].modulation;
3574 }
3575 }
3576 return 0;
3577}
3578
3579static int dib8000_set_frontend(struct dvb_frontend *fe)
3580{
3581 struct dib8000_state *state = fe->demodulator_priv;
3582 struct dtv_frontend_properties *c = &state->fe[0]->dtv_property_cache;
3583 int l, i, active, time, time_slave = 0;
3584 u8 exit_condition, index_frontend;
3585 unsigned long delay, callback_time;
3586
3587 if (c->frequency == 0) {
3588 dprintk("dib8000: must at least specify frequency\n");
3589 return 0;
3590 }
3591
3592 if (c->bandwidth_hz == 0) {
3593 dprintk("dib8000: no bandwidth specified, set to default\n");
3594 c->bandwidth_hz = 6000000;
3595 }
3596
3597 for (index_frontend = 0; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
3598
3599 state->fe[index_frontend]->dtv_property_cache.delivery_system = SYS_ISDBT;
3600 memcpy(&state->fe[index_frontend]->dtv_property_cache, &fe->dtv_property_cache, sizeof(struct dtv_frontend_properties));
3601
3602
3603 if (state->revision != 0x8090) {
3604 dib8000_set_diversity_in(state->fe[index_frontend], 1);
3605 if (index_frontend != 0)
3606 dib8000_set_output_mode(state->fe[index_frontend],
3607 OUTMODE_DIVERSITY);
3608 else
3609 dib8000_set_output_mode(state->fe[0], OUTMODE_HIGH_Z);
3610 } else {
3611 dib8096p_set_diversity_in(state->fe[index_frontend], 1);
3612 if (index_frontend != 0)
3613 dib8096p_set_output_mode(state->fe[index_frontend],
3614 OUTMODE_DIVERSITY);
3615 else
3616 dib8096p_set_output_mode(state->fe[0], OUTMODE_HIGH_Z);
3617 }
3618
3619
3620 if (state->fe[index_frontend]->ops.tuner_ops.set_params)
3621 state->fe[index_frontend]->ops.tuner_ops.set_params(state->fe[index_frontend]);
3622
3623 dib8000_set_tune_state(state->fe[index_frontend], CT_AGC_START);
3624 }
3625
3626
3627 if (state->revision != 0x8090)
3628 dib8000_set_diversity_in(state->fe[index_frontend - 1], 0);
3629 else
3630 dib8096p_set_diversity_in(state->fe[index_frontend - 1], 0);
3631
3632
3633 do {
3634 time = dib8000_agc_startup(state->fe[0]);
3635 for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
3636 time_slave = dib8000_agc_startup(state->fe[index_frontend]);
3637 if (time == 0)
3638 time = time_slave;
3639 else if ((time_slave != 0) && (time_slave > time))
3640 time = time_slave;
3641 }
3642 if (time == 0)
3643 break;
3644
3645
3646
3647
3648
3649
3650
3651
3652
3653 time = 10 * (time + 99)/100;
3654 usleep_range(time * 1000, (time + 1) * 1000);
3655 exit_condition = 1;
3656 for (index_frontend = 0; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
3657 if (dib8000_get_tune_state(state->fe[index_frontend]) != CT_AGC_STOP) {
3658 exit_condition = 0;
3659 break;
3660 }
3661 }
3662 } while (exit_condition == 0);
3663
3664 for (index_frontend = 0; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++)
3665 dib8000_set_tune_state(state->fe[index_frontend], CT_DEMOD_START);
3666
3667 active = 1;
3668 do {
3669 callback_time = 0;
3670 for (index_frontend = 0; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
3671 delay = dib8000_tune(state->fe[index_frontend]);
3672 if (delay != 0) {
3673 delay = jiffies + usecs_to_jiffies(100 * delay);
3674 if (!callback_time || delay < callback_time)
3675 callback_time = delay;
3676 }
3677
3678
3679 if (state->channel_parameters_set == 0) {
3680 if ((dib8000_get_status(state->fe[index_frontend]) == FE_STATUS_DEMOD_SUCCESS) || (dib8000_get_status(state->fe[index_frontend]) == FE_STATUS_FFT_SUCCESS)) {
3681 dprintk("autosearch succeeded on fe%i\n", index_frontend);
3682 dib8000_get_frontend(state->fe[index_frontend], c);
3683 state->channel_parameters_set = 1;
3684
3685 for (l = 0; (l < MAX_NUMBER_OF_FRONTENDS) && (state->fe[l] != NULL); l++) {
3686 if (l != index_frontend) {
3687 dprintk("Restarting frontend %d\n", l);
3688 dib8000_tune_restart_from_demod(state->fe[l]);
3689
3690 state->fe[l]->dtv_property_cache.isdbt_sb_mode = state->fe[index_frontend]->dtv_property_cache.isdbt_sb_mode;
3691 state->fe[l]->dtv_property_cache.inversion = state->fe[index_frontend]->dtv_property_cache.inversion;
3692 state->fe[l]->dtv_property_cache.transmission_mode = state->fe[index_frontend]->dtv_property_cache.transmission_mode;
3693 state->fe[l]->dtv_property_cache.guard_interval = state->fe[index_frontend]->dtv_property_cache.guard_interval;
3694 state->fe[l]->dtv_property_cache.isdbt_partial_reception = state->fe[index_frontend]->dtv_property_cache.isdbt_partial_reception;
3695 for (i = 0; i < 3; i++) {
3696 state->fe[l]->dtv_property_cache.layer[i].segment_count = state->fe[index_frontend]->dtv_property_cache.layer[i].segment_count;
3697 state->fe[l]->dtv_property_cache.layer[i].interleaving = state->fe[index_frontend]->dtv_property_cache.layer[i].interleaving;
3698 state->fe[l]->dtv_property_cache.layer[i].fec = state->fe[index_frontend]->dtv_property_cache.layer[i].fec;
3699 state->fe[l]->dtv_property_cache.layer[i].modulation = state->fe[index_frontend]->dtv_property_cache.layer[i].modulation;
3700 }
3701
3702 }
3703 }
3704 }
3705 }
3706 }
3707
3708 if (dib8000_get_status(state->fe[0]) == FE_STATUS_TUNE_FAILED ||
3709 dib8000_get_status(state->fe[0]) == FE_STATUS_LOCKED ||
3710 dib8000_get_status(state->fe[0]) == FE_STATUS_DATA_LOCKED) {
3711 active = 0;
3712
3713 for (index_frontend = 0; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
3714 if (dib8000_get_tune_state(state->fe[index_frontend]) != CT_DEMOD_STOP)
3715 active = 1;
3716 }
3717 if (active == 0)
3718 dprintk("tuning done with status %d\n", dib8000_get_status(state->fe[0]));
3719 }
3720
3721 if ((active == 1) && (callback_time == 0)) {
3722 dprintk("strange callback time something went wrong\n");
3723 active = 0;
3724 }
3725
3726 while ((active == 1) && (time_before(jiffies, callback_time)))
3727 msleep(100);
3728 } while (active);
3729
3730
3731 if (state->revision != 0x8090)
3732 dib8000_set_output_mode(state->fe[0], state->cfg.output_mode);
3733 else {
3734 dib8096p_set_output_mode(state->fe[0], state->cfg.output_mode);
3735 if (state->cfg.enMpegOutput == 0) {
3736 dib8096p_setDibTxMux(state, MPEG_ON_DIBTX);
3737 dib8096p_setHostBusMux(state, DIBTX_ON_HOSTBUS);
3738 }
3739 }
3740
3741 return 0;
3742}
3743
3744static int dib8000_get_stats(struct dvb_frontend *fe, enum fe_status stat);
3745
3746static int dib8000_read_status(struct dvb_frontend *fe, enum fe_status *stat)
3747{
3748 struct dib8000_state *state = fe->demodulator_priv;
3749 u16 lock_slave = 0, lock;
3750 u8 index_frontend;
3751
3752 lock = dib8000_read_lock(fe);
3753 for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++)
3754 lock_slave |= dib8000_read_lock(state->fe[index_frontend]);
3755
3756 *stat = 0;
3757
3758 if (((lock >> 13) & 1) || ((lock_slave >> 13) & 1))
3759 *stat |= FE_HAS_SIGNAL;
3760
3761 if (((lock >> 8) & 1) || ((lock_slave >> 8) & 1))
3762 *stat |= FE_HAS_CARRIER;
3763
3764 if ((((lock >> 1) & 0xf) == 0xf) || (((lock_slave >> 1) & 0xf) == 0xf))
3765 *stat |= FE_HAS_SYNC;
3766
3767 if ((((lock >> 12) & 1) || ((lock_slave >> 12) & 1)) && ((lock >> 5) & 7))
3768 *stat |= FE_HAS_LOCK;
3769
3770 if (((lock >> 12) & 1) || ((lock_slave >> 12) & 1)) {
3771 lock = dib8000_read_word(state, 554);
3772 if (lock & 0x01)
3773 *stat |= FE_HAS_VITERBI;
3774
3775 lock = dib8000_read_word(state, 555);
3776 if (lock & 0x01)
3777 *stat |= FE_HAS_VITERBI;
3778
3779 lock = dib8000_read_word(state, 556);
3780 if (lock & 0x01)
3781 *stat |= FE_HAS_VITERBI;
3782 }
3783 dib8000_get_stats(fe, *stat);
3784
3785 return 0;
3786}
3787
3788static int dib8000_read_ber(struct dvb_frontend *fe, u32 * ber)
3789{
3790 struct dib8000_state *state = fe->demodulator_priv;
3791
3792
3793 if (state->revision == 0x8090)
3794 *ber = (dib8000_read_word(state, 562) << 16) |
3795 dib8000_read_word(state, 563);
3796 else
3797 *ber = (dib8000_read_word(state, 560) << 16) |
3798 dib8000_read_word(state, 561);
3799 return 0;
3800}
3801
3802static int dib8000_read_unc_blocks(struct dvb_frontend *fe, u32 * unc)
3803{
3804 struct dib8000_state *state = fe->demodulator_priv;
3805
3806
3807 if (state->revision == 0x8090)
3808 *unc = dib8000_read_word(state, 567);
3809 else
3810 *unc = dib8000_read_word(state, 565);
3811 return 0;
3812}
3813
3814static int dib8000_read_signal_strength(struct dvb_frontend *fe, u16 * strength)
3815{
3816 struct dib8000_state *state = fe->demodulator_priv;
3817 u8 index_frontend;
3818 u16 val;
3819
3820 *strength = 0;
3821 for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
3822 state->fe[index_frontend]->ops.read_signal_strength(state->fe[index_frontend], &val);
3823 if (val > 65535 - *strength)
3824 *strength = 65535;
3825 else
3826 *strength += val;
3827 }
3828
3829 val = 65535 - dib8000_read_word(state, 390);
3830 if (val > 65535 - *strength)
3831 *strength = 65535;
3832 else
3833 *strength += val;
3834 return 0;
3835}
3836
3837static u32 dib8000_get_snr(struct dvb_frontend *fe)
3838{
3839 struct dib8000_state *state = fe->demodulator_priv;
3840 u32 n, s, exp;
3841 u16 val;
3842
3843 if (state->revision != 0x8090)
3844 val = dib8000_read_word(state, 542);
3845 else
3846 val = dib8000_read_word(state, 544);
3847 n = (val >> 6) & 0xff;
3848 exp = (val & 0x3f);
3849 if ((exp & 0x20) != 0)
3850 exp -= 0x40;
3851 n <<= exp+16;
3852
3853 if (state->revision != 0x8090)
3854 val = dib8000_read_word(state, 543);
3855 else
3856 val = dib8000_read_word(state, 545);
3857 s = (val >> 6) & 0xff;
3858 exp = (val & 0x3f);
3859 if ((exp & 0x20) != 0)
3860 exp -= 0x40;
3861 s <<= exp+16;
3862
3863 if (n > 0) {
3864 u32 t = (s/n) << 16;
3865 return t + ((s << 16) - n*t) / n;
3866 }
3867 return 0xffffffff;
3868}
3869
3870static int dib8000_read_snr(struct dvb_frontend *fe, u16 * snr)
3871{
3872 struct dib8000_state *state = fe->demodulator_priv;
3873 u8 index_frontend;
3874 u32 snr_master;
3875
3876 snr_master = dib8000_get_snr(fe);
3877 for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++)
3878 snr_master += dib8000_get_snr(state->fe[index_frontend]);
3879
3880 if ((snr_master >> 16) != 0) {
3881 snr_master = 10*intlog10(snr_master>>16);
3882 *snr = snr_master / ((1 << 24) / 10);
3883 }
3884 else
3885 *snr = 0;
3886
3887 return 0;
3888}
3889
3890struct per_layer_regs {
3891 u16 lock, ber, per;
3892};
3893
3894static const struct per_layer_regs per_layer_regs[] = {
3895 { 554, 560, 562 },
3896 { 555, 576, 578 },
3897 { 556, 581, 583 },
3898};
3899
3900struct linear_segments {
3901 unsigned x;
3902 signed y;
3903};
3904
3905
3906
3907
3908
3909
3910
3911
3912
3913
3914
3915
3916
3917
3918
3919static struct linear_segments strength_to_db_table[] = {
3920 { 55953, 108500 },
3921 { 55394, 108000 },
3922 { 53834, 107000 },
3923 { 52863, 106000 },
3924 { 52239, 105000 },
3925 { 52012, 104000 },
3926 { 51803, 103000 },
3927 { 51566, 102000 },
3928 { 51356, 101000 },
3929 { 51112, 100000 },
3930 { 50869, 99000 },
3931 { 50600, 98000 },
3932 { 50363, 97000 },
3933 { 50117, 96000 },
3934 { 49889, 95000 },
3935 { 49680, 94000 },
3936 { 49493, 93000 },
3937 { 49302, 92000 },
3938 { 48929, 91000 },
3939 { 48416, 90000 },
3940 { 48035, 89000 },
3941 { 47593, 88000 },
3942 { 47282, 87000 },
3943 { 46953, 86000 },
3944 { 46698, 85000 },
3945 { 45617, 84000 },
3946 { 44773, 83000 },
3947 { 43845, 82000 },
3948 { 43020, 81000 },
3949 { 42010, 80000 },
3950 { 0, 0 },
3951};
3952
3953static u32 interpolate_value(u32 value, struct linear_segments *segments,
3954 unsigned len)
3955{
3956 u64 tmp64;
3957 u32 dx;
3958 s32 dy;
3959 int i, ret;
3960
3961 if (value >= segments[0].x)
3962 return segments[0].y;
3963 if (value < segments[len-1].x)
3964 return segments[len-1].y;
3965
3966 for (i = 1; i < len - 1; i++) {
3967
3968 if (value == segments[i].x)
3969 return segments[i].y;
3970 if (value > segments[i].x)
3971 break;
3972 }
3973
3974
3975 dy = segments[i - 1].y - segments[i].y;
3976 dx = segments[i - 1].x - segments[i].x;
3977
3978 tmp64 = value - segments[i].x;
3979 tmp64 *= dy;
3980 do_div(tmp64, dx);
3981 ret = segments[i].y + tmp64;
3982
3983 return ret;
3984}
3985
3986static u32 dib8000_get_time_us(struct dvb_frontend *fe, int layer)
3987{
3988 struct dib8000_state *state = fe->demodulator_priv;
3989 struct dtv_frontend_properties *c = &state->fe[0]->dtv_property_cache;
3990 int ini_layer, end_layer, i;
3991 u64 time_us, tmp64;
3992 u32 tmp, denom;
3993 int guard, rate_num, rate_denum = 1, bits_per_symbol, nsegs;
3994 int interleaving = 0, fft_div;
3995
3996 if (layer >= 0) {
3997 ini_layer = layer;
3998 end_layer = layer + 1;
3999 } else {
4000 ini_layer = 0;
4001 end_layer = 3;
4002 }
4003
4004 switch (c->guard_interval) {
4005 case GUARD_INTERVAL_1_4:
4006 guard = 4;
4007 break;
4008 case GUARD_INTERVAL_1_8:
4009 guard = 8;
4010 break;
4011 case GUARD_INTERVAL_1_16:
4012 guard = 16;
4013 break;
4014 default:
4015 case GUARD_INTERVAL_1_32:
4016 guard = 32;
4017 break;
4018 }
4019
4020 switch (c->transmission_mode) {
4021 case TRANSMISSION_MODE_2K:
4022 fft_div = 4;
4023 break;
4024 case TRANSMISSION_MODE_4K:
4025 fft_div = 2;
4026 break;
4027 default:
4028 case TRANSMISSION_MODE_8K:
4029 fft_div = 1;
4030 break;
4031 }
4032
4033 denom = 0;
4034 for (i = ini_layer; i < end_layer; i++) {
4035 nsegs = c->layer[i].segment_count;
4036 if (nsegs == 0 || nsegs > 13)
4037 continue;
4038
4039 switch (c->layer[i].modulation) {
4040 case DQPSK:
4041 case QPSK:
4042 bits_per_symbol = 2;
4043 break;
4044 case QAM_16:
4045 bits_per_symbol = 4;
4046 break;
4047 default:
4048 case QAM_64:
4049 bits_per_symbol = 6;
4050 break;
4051 }
4052
4053 switch (c->layer[i].fec) {
4054 case FEC_1_2:
4055 rate_num = 1;
4056 rate_denum = 2;
4057 break;
4058 case FEC_2_3:
4059 rate_num = 2;
4060 rate_denum = 3;
4061 break;
4062 case FEC_3_4:
4063 rate_num = 3;
4064 rate_denum = 4;
4065 break;
4066 case FEC_5_6:
4067 rate_num = 5;
4068 rate_denum = 6;
4069 break;
4070 default:
4071 case FEC_7_8:
4072 rate_num = 7;
4073 rate_denum = 8;
4074 break;
4075 }
4076
4077 interleaving = c->layer[i].interleaving;
4078
4079 denom += bits_per_symbol * rate_num * fft_div * nsegs * 384;
4080 }
4081
4082
4083 if (!denom)
4084 return 0;
4085
4086
4087 time_us = rate_denum * (1008 * 1562500L);
4088 tmp64 = time_us;
4089 do_div(tmp64, guard);
4090 time_us = time_us + tmp64;
4091 time_us += denom / 2;
4092 do_div(time_us, denom);
4093
4094 tmp = 1008 * 96 * interleaving;
4095 time_us += tmp + tmp / guard;
4096
4097 return time_us;
4098}
4099
4100static int dib8000_get_stats(struct dvb_frontend *fe, enum fe_status stat)
4101{
4102 struct dib8000_state *state = fe->demodulator_priv;
4103 struct dtv_frontend_properties *c = &state->fe[0]->dtv_property_cache;
4104 int i;
4105 int show_per_stats = 0;
4106 u32 time_us = 0, snr, val;
4107 u64 blocks;
4108 s32 db;
4109 u16 strength;
4110
4111
4112 dib8000_read_signal_strength(fe, &strength);
4113 val = strength;
4114 db = interpolate_value(val,
4115 strength_to_db_table,
4116 ARRAY_SIZE(strength_to_db_table)) - 131000;
4117 c->strength.stat[0].svalue = db;
4118
4119
4120 if (!(stat & FE_HAS_LOCK)) {
4121 c->cnr.len = 1;
4122 c->block_count.len = 1;
4123 c->block_error.len = 1;
4124 c->post_bit_error.len = 1;
4125 c->post_bit_count.len = 1;
4126 c->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
4127 c->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
4128 c->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
4129 c->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
4130 c->block_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
4131 return 0;
4132 }
4133
4134
4135 if (time_after(jiffies, state->per_jiffies_stats)) {
4136 state->per_jiffies_stats = jiffies + msecs_to_jiffies(1000);
4137
4138
4139 snr = dib8000_get_snr(fe);
4140 for (i = 1; i < MAX_NUMBER_OF_FRONTENDS; i++) {
4141 if (state->fe[i])
4142 snr += dib8000_get_snr(state->fe[i]);
4143 }
4144 snr = snr >> 16;
4145
4146 if (snr) {
4147 snr = 10 * intlog10(snr);
4148 snr = (1000L * snr) >> 24;
4149 } else {
4150 snr = 0;
4151 }
4152 c->cnr.stat[0].svalue = snr;
4153 c->cnr.stat[0].scale = FE_SCALE_DECIBEL;
4154
4155
4156 dib8000_read_unc_blocks(fe, &val);
4157 if (val < state->init_ucb)
4158 state->init_ucb += 0x100000000LL;
4159
4160 c->block_error.stat[0].scale = FE_SCALE_COUNTER;
4161 c->block_error.stat[0].uvalue = val + state->init_ucb;
4162
4163
4164 if (!time_us)
4165 time_us = dib8000_get_time_us(fe, -1);
4166
4167 if (time_us) {
4168 blocks = 1250000ULL * 1000000ULL;
4169 do_div(blocks, time_us * 8 * 204);
4170 c->block_count.stat[0].scale = FE_SCALE_COUNTER;
4171 c->block_count.stat[0].uvalue += blocks;
4172 }
4173
4174 show_per_stats = 1;
4175 }
4176
4177
4178 if (time_after(jiffies, state->ber_jiffies_stats)) {
4179 time_us = dib8000_get_time_us(fe, -1);
4180 state->ber_jiffies_stats = jiffies + msecs_to_jiffies((time_us + 500) / 1000);
4181
4182 dprintk("Next all layers stats available in %u us.\n", time_us);
4183
4184 dib8000_read_ber(fe, &val);
4185 c->post_bit_error.stat[0].scale = FE_SCALE_COUNTER;
4186 c->post_bit_error.stat[0].uvalue += val;
4187
4188 c->post_bit_count.stat[0].scale = FE_SCALE_COUNTER;
4189 c->post_bit_count.stat[0].uvalue += 100000000;
4190 }
4191
4192 if (state->revision < 0x8002)
4193 return 0;
4194
4195 c->block_error.len = 4;
4196 c->post_bit_error.len = 4;
4197 c->post_bit_count.len = 4;
4198
4199 for (i = 0; i < 3; i++) {
4200 unsigned nsegs = c->layer[i].segment_count;
4201
4202 if (nsegs == 0 || nsegs > 13)
4203 continue;
4204
4205 time_us = 0;
4206
4207 if (time_after(jiffies, state->ber_jiffies_stats_layer[i])) {
4208 time_us = dib8000_get_time_us(fe, i);
4209
4210 state->ber_jiffies_stats_layer[i] = jiffies + msecs_to_jiffies((time_us + 500) / 1000);
4211 dprintk("Next layer %c stats will be available in %u us\n",
4212 'A' + i, time_us);
4213
4214 val = dib8000_read_word(state, per_layer_regs[i].ber);
4215 c->post_bit_error.stat[1 + i].scale = FE_SCALE_COUNTER;
4216 c->post_bit_error.stat[1 + i].uvalue += val;
4217
4218 c->post_bit_count.stat[1 + i].scale = FE_SCALE_COUNTER;
4219 c->post_bit_count.stat[1 + i].uvalue += 100000000;
4220 }
4221
4222 if (show_per_stats) {
4223 val = dib8000_read_word(state, per_layer_regs[i].per);
4224
4225 c->block_error.stat[1 + i].scale = FE_SCALE_COUNTER;
4226 c->block_error.stat[1 + i].uvalue += val;
4227
4228 if (!time_us)
4229 time_us = dib8000_get_time_us(fe, i);
4230 if (time_us) {
4231 blocks = 1250000ULL * 1000000ULL;
4232 do_div(blocks, time_us * 8 * 204);
4233 c->block_count.stat[0].scale = FE_SCALE_COUNTER;
4234 c->block_count.stat[0].uvalue += blocks;
4235 }
4236 }
4237 }
4238 return 0;
4239}
4240
4241static int dib8000_set_slave_frontend(struct dvb_frontend *fe, struct dvb_frontend *fe_slave)
4242{
4243 struct dib8000_state *state = fe->demodulator_priv;
4244 u8 index_frontend = 1;
4245
4246 while ((index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL))
4247 index_frontend++;
4248 if (index_frontend < MAX_NUMBER_OF_FRONTENDS) {
4249 dprintk("set slave fe %p to index %i\n", fe_slave, index_frontend);
4250 state->fe[index_frontend] = fe_slave;
4251 return 0;
4252 }
4253
4254 dprintk("too many slave frontend\n");
4255 return -ENOMEM;
4256}
4257
4258static struct dvb_frontend *dib8000_get_slave_frontend(struct dvb_frontend *fe, int slave_index)
4259{
4260 struct dib8000_state *state = fe->demodulator_priv;
4261
4262 if (slave_index >= MAX_NUMBER_OF_FRONTENDS)
4263 return NULL;
4264 return state->fe[slave_index];
4265}
4266
4267static int dib8000_i2c_enumeration(struct i2c_adapter *host, int no_of_demods,
4268 u8 default_addr, u8 first_addr, u8 is_dib8096p)
4269{
4270 int k = 0, ret = 0;
4271 u8 new_addr = 0;
4272 struct i2c_device client = {.adap = host };
4273
4274 client.i2c_write_buffer = kzalloc(4, GFP_KERNEL);
4275 if (!client.i2c_write_buffer) {
4276 dprintk("%s: not enough memory\n", __func__);
4277 return -ENOMEM;
4278 }
4279 client.i2c_read_buffer = kzalloc(4, GFP_KERNEL);
4280 if (!client.i2c_read_buffer) {
4281 dprintk("%s: not enough memory\n", __func__);
4282 ret = -ENOMEM;
4283 goto error_memory_read;
4284 }
4285 client.i2c_buffer_lock = kzalloc(sizeof(struct mutex), GFP_KERNEL);
4286 if (!client.i2c_buffer_lock) {
4287 dprintk("%s: not enough memory\n", __func__);
4288 ret = -ENOMEM;
4289 goto error_memory_lock;
4290 }
4291 mutex_init(client.i2c_buffer_lock);
4292
4293 for (k = no_of_demods - 1; k >= 0; k--) {
4294
4295 new_addr = first_addr + (k << 1);
4296
4297 client.addr = new_addr;
4298 if (!is_dib8096p)
4299 dib8000_i2c_write16(&client, 1287, 0x0003);
4300 if (dib8000_identify(&client) == 0) {
4301
4302 if (!is_dib8096p)
4303 dib8000_i2c_write16(&client, 1287, 0x0003);
4304 client.addr = default_addr;
4305 if (dib8000_identify(&client) == 0) {
4306 dprintk("#%d: not identified\n", k);
4307 ret = -EINVAL;
4308 goto error;
4309 }
4310 }
4311
4312
4313 dib8000_i2c_write16(&client, 1286, (1 << 10) | (4 << 6));
4314
4315
4316 dib8000_i2c_write16(&client, 1285, (new_addr << 2) | 0x2);
4317 client.addr = new_addr;
4318 dib8000_identify(&client);
4319
4320 dprintk("IC %d initialized (to i2c_address 0x%x)\n", k, new_addr);
4321 }
4322
4323 for (k = 0; k < no_of_demods; k++) {
4324 new_addr = first_addr | (k << 1);
4325 client.addr = new_addr;
4326
4327
4328 dib8000_i2c_write16(&client, 1285, new_addr << 2);
4329
4330
4331 dib8000_i2c_write16(&client, 1286, 0);
4332 }
4333
4334error:
4335 kfree(client.i2c_buffer_lock);
4336error_memory_lock:
4337 kfree(client.i2c_read_buffer);
4338error_memory_read:
4339 kfree(client.i2c_write_buffer);
4340
4341 return ret;
4342}
4343
4344static int dib8000_fe_get_tune_settings(struct dvb_frontend *fe, struct dvb_frontend_tune_settings *tune)
4345{
4346 tune->min_delay_ms = 1000;
4347 tune->step_size = 0;
4348 tune->max_drift = 0;
4349 return 0;
4350}
4351
4352static void dib8000_release(struct dvb_frontend *fe)
4353{
4354 struct dib8000_state *st = fe->demodulator_priv;
4355 u8 index_frontend;
4356
4357 for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (st->fe[index_frontend] != NULL); index_frontend++)
4358 dvb_frontend_detach(st->fe[index_frontend]);
4359
4360 dibx000_exit_i2c_master(&st->i2c_master);
4361 i2c_del_adapter(&st->dib8096p_tuner_adap);
4362 kfree(st->fe[0]);
4363 kfree(st);
4364}
4365
4366static struct i2c_adapter *dib8000_get_i2c_master(struct dvb_frontend *fe, enum dibx000_i2c_interface intf, int gating)
4367{
4368 struct dib8000_state *st = fe->demodulator_priv;
4369 return dibx000_get_i2c_adapter(&st->i2c_master, intf, gating);
4370}
4371
4372static int dib8000_pid_filter_ctrl(struct dvb_frontend *fe, u8 onoff)
4373{
4374 struct dib8000_state *st = fe->demodulator_priv;
4375 u16 val = dib8000_read_word(st, 299) & 0xffef;
4376 val |= (onoff & 0x1) << 4;
4377
4378 dprintk("pid filter enabled %d\n", onoff);
4379 return dib8000_write_word(st, 299, val);
4380}
4381
4382static int dib8000_pid_filter(struct dvb_frontend *fe, u8 id, u16 pid, u8 onoff)
4383{
4384 struct dib8000_state *st = fe->demodulator_priv;
4385 dprintk("Index %x, PID %d, OnOff %d\n", id, pid, onoff);
4386 return dib8000_write_word(st, 305 + id, onoff ? (1 << 13) | pid : 0);
4387}
4388
4389static const struct dvb_frontend_ops dib8000_ops = {
4390 .delsys = { SYS_ISDBT },
4391 .info = {
4392 .name = "DiBcom 8000 ISDB-T",
4393 .frequency_min_hz = 44250 * kHz,
4394 .frequency_max_hz = 867250 * kHz,
4395 .frequency_stepsize_hz = 62500,
4396 .caps = FE_CAN_INVERSION_AUTO |
4397 FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
4398 FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
4399 FE_CAN_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_64 | FE_CAN_QAM_AUTO |
4400 FE_CAN_TRANSMISSION_MODE_AUTO | FE_CAN_GUARD_INTERVAL_AUTO | FE_CAN_RECOVER | FE_CAN_HIERARCHY_AUTO,
4401 },
4402
4403 .release = dib8000_release,
4404
4405 .init = dib8000_wakeup,
4406 .sleep = dib8000_sleep,
4407
4408 .set_frontend = dib8000_set_frontend,
4409 .get_tune_settings = dib8000_fe_get_tune_settings,
4410 .get_frontend = dib8000_get_frontend,
4411
4412 .read_status = dib8000_read_status,
4413 .read_ber = dib8000_read_ber,
4414 .read_signal_strength = dib8000_read_signal_strength,
4415 .read_snr = dib8000_read_snr,
4416 .read_ucblocks = dib8000_read_unc_blocks,
4417};
4418
4419static struct dvb_frontend *dib8000_init(struct i2c_adapter *i2c_adap, u8 i2c_addr, struct dib8000_config *cfg)
4420{
4421 struct dvb_frontend *fe;
4422 struct dib8000_state *state;
4423
4424 dprintk("dib8000_init\n");
4425
4426 state = kzalloc(sizeof(struct dib8000_state), GFP_KERNEL);
4427 if (state == NULL)
4428 return NULL;
4429 fe = kzalloc(sizeof(struct dvb_frontend), GFP_KERNEL);
4430 if (fe == NULL)
4431 goto error;
4432
4433 memcpy(&state->cfg, cfg, sizeof(struct dib8000_config));
4434 state->i2c.adap = i2c_adap;
4435 state->i2c.addr = i2c_addr;
4436 state->i2c.i2c_write_buffer = state->i2c_write_buffer;
4437 state->i2c.i2c_read_buffer = state->i2c_read_buffer;
4438 mutex_init(&state->i2c_buffer_lock);
4439 state->i2c.i2c_buffer_lock = &state->i2c_buffer_lock;
4440 state->gpio_val = cfg->gpio_val;
4441 state->gpio_dir = cfg->gpio_dir;
4442
4443
4444
4445
4446 if ((state->cfg.output_mode != OUTMODE_MPEG2_SERIAL) && (state->cfg.output_mode != OUTMODE_MPEG2_PAR_GATED_CLK))
4447 state->cfg.output_mode = OUTMODE_MPEG2_FIFO;
4448
4449 state->fe[0] = fe;
4450 fe->demodulator_priv = state;
4451 memcpy(&state->fe[0]->ops, &dib8000_ops, sizeof(struct dvb_frontend_ops));
4452
4453 state->timf_default = cfg->pll->timf;
4454
4455 if (dib8000_identify(&state->i2c) == 0)
4456 goto error;
4457
4458 dibx000_init_i2c_master(&state->i2c_master, DIB8000, state->i2c.adap, state->i2c.addr);
4459
4460
4461 strncpy(state->dib8096p_tuner_adap.name, "DiB8096P tuner interface",
4462 sizeof(state->dib8096p_tuner_adap.name));
4463 state->dib8096p_tuner_adap.algo = &dib8096p_tuner_xfer_algo;
4464 state->dib8096p_tuner_adap.algo_data = NULL;
4465 state->dib8096p_tuner_adap.dev.parent = state->i2c.adap->dev.parent;
4466 i2c_set_adapdata(&state->dib8096p_tuner_adap, state);
4467 i2c_add_adapter(&state->dib8096p_tuner_adap);
4468
4469 dib8000_reset(fe);
4470
4471 dib8000_write_word(state, 285, (dib8000_read_word(state, 285) & ~0x60) | (3 << 5));
4472 state->current_demod_bw = 6000;
4473
4474 return fe;
4475
4476error:
4477 kfree(state);
4478 return NULL;
4479}
4480
4481void *dib8000_attach(struct dib8000_ops *ops)
4482{
4483 if (!ops)
4484 return NULL;
4485
4486 ops->pwm_agc_reset = dib8000_pwm_agc_reset;
4487 ops->get_dc_power = dib8090p_get_dc_power;
4488 ops->set_gpio = dib8000_set_gpio;
4489 ops->get_slave_frontend = dib8000_get_slave_frontend;
4490 ops->set_tune_state = dib8000_set_tune_state;
4491 ops->pid_filter_ctrl = dib8000_pid_filter_ctrl;
4492 ops->get_adc_power = dib8000_get_adc_power;
4493 ops->update_pll = dib8000_update_pll;
4494 ops->tuner_sleep = dib8096p_tuner_sleep;
4495 ops->get_tune_state = dib8000_get_tune_state;
4496 ops->get_i2c_tuner = dib8096p_get_i2c_tuner;
4497 ops->set_slave_frontend = dib8000_set_slave_frontend;
4498 ops->pid_filter = dib8000_pid_filter;
4499 ops->ctrl_timf = dib8000_ctrl_timf;
4500 ops->init = dib8000_init;
4501 ops->get_i2c_master = dib8000_get_i2c_master;
4502 ops->i2c_enumeration = dib8000_i2c_enumeration;
4503 ops->set_wbd_ref = dib8000_set_wbd_ref;
4504
4505 return ops;
4506}
4507EXPORT_SYMBOL(dib8000_attach);
4508
4509MODULE_AUTHOR("Olivier Grenie <Olivier.Grenie@parrot.com, Patrick Boettcher <patrick.boettcher@posteo.de>");
4510MODULE_DESCRIPTION("Driver for the DiBcom 8000 ISDB-T demodulator");
4511MODULE_LICENSE("GPL");
4512