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