xref: /linux/drivers/media/dvb-frontends/dib8000.c (revision 93d90ad708b8da6efc0e487b66111aa9db7f70c7)
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, upd_demod_gain_period = 0x8000;
1267 
1268 	switch (*tune_state) {
1269 	case CT_AGC_START:
1270 		// set power-up level: interf+analog+AGC
1271 
1272 		if (state->revision != 0x8090)
1273 			dib8000_set_adc_state(state, DIBX000_ADC_ON);
1274 		else {
1275 			dib8000_set_power_mode(state, DIB8000_POWER_ALL);
1276 
1277 			reg = dib8000_read_word(state, 1947)&0xff00;
1278 			dib8000_write_word(state, 1946,
1279 					upd_demod_gain_period & 0xFFFF);
1280 			/* bit 14 = enDemodGain */
1281 			dib8000_write_word(state, 1947, reg | (1<<14) |
1282 					((upd_demod_gain_period >> 16) & 0xFF));
1283 
1284 			/* enable adc i & q */
1285 			reg = dib8000_read_word(state, 1920);
1286 			dib8000_write_word(state, 1920, (reg | 0x3) &
1287 					(~(1 << 7)));
1288 		}
1289 
1290 		if (dib8000_set_agc_config(state, (unsigned char)(BAND_OF_FREQUENCY(fe->dtv_property_cache.frequency / 1000))) != 0) {
1291 			*tune_state = CT_AGC_STOP;
1292 			state->status = FE_STATUS_TUNE_FAILED;
1293 			break;
1294 		}
1295 
1296 		ret = 70;
1297 		*tune_state = CT_AGC_STEP_0;
1298 		break;
1299 
1300 	case CT_AGC_STEP_0:
1301 		//AGC initialization
1302 		if (state->cfg.agc_control)
1303 			state->cfg.agc_control(fe, 1);
1304 
1305 		dib8000_restart_agc(state);
1306 
1307 		// wait AGC rough lock time
1308 		ret = 50;
1309 		*tune_state = CT_AGC_STEP_1;
1310 		break;
1311 
1312 	case CT_AGC_STEP_1:
1313 		// wait AGC accurate lock time
1314 		ret = 70;
1315 
1316 		if (dib8000_update_lna(state))
1317 			// wait only AGC rough lock time
1318 			ret = 50;
1319 		else
1320 			*tune_state = CT_AGC_STEP_2;
1321 		break;
1322 
1323 	case CT_AGC_STEP_2:
1324 		dib8000_agc_soft_split(state);
1325 
1326 		if (state->cfg.agc_control)
1327 			state->cfg.agc_control(fe, 0);
1328 
1329 		*tune_state = CT_AGC_STOP;
1330 		break;
1331 	default:
1332 		ret = dib8000_agc_soft_split(state);
1333 		break;
1334 	}
1335 	return ret;
1336 
1337 }
1338 
1339 static void dib8096p_host_bus_drive(struct dib8000_state *state, u8 drive)
1340 {
1341 	u16 reg;
1342 
1343 	drive &= 0x7;
1344 
1345 	/* drive host bus 2, 3, 4 */
1346 	reg = dib8000_read_word(state, 1798) &
1347 		~(0x7 | (0x7 << 6) | (0x7 << 12));
1348 	reg |= (drive<<12) | (drive<<6) | drive;
1349 	dib8000_write_word(state, 1798, reg);
1350 
1351 	/* drive host bus 5,6 */
1352 	reg = dib8000_read_word(state, 1799) & ~((0x7 << 2) | (0x7 << 8));
1353 	reg |= (drive<<8) | (drive<<2);
1354 	dib8000_write_word(state, 1799, reg);
1355 
1356 	/* drive host bus 7, 8, 9 */
1357 	reg = dib8000_read_word(state, 1800) &
1358 		~(0x7 | (0x7 << 6) | (0x7 << 12));
1359 	reg |= (drive<<12) | (drive<<6) | drive;
1360 	dib8000_write_word(state, 1800, reg);
1361 
1362 	/* drive host bus 10, 11 */
1363 	reg = dib8000_read_word(state, 1801) & ~((0x7 << 2) | (0x7 << 8));
1364 	reg |= (drive<<8) | (drive<<2);
1365 	dib8000_write_word(state, 1801, reg);
1366 
1367 	/* drive host bus 12, 13, 14 */
1368 	reg = dib8000_read_word(state, 1802) &
1369 		~(0x7 | (0x7 << 6) | (0x7 << 12));
1370 	reg |= (drive<<12) | (drive<<6) | drive;
1371 	dib8000_write_word(state, 1802, reg);
1372 }
1373 
1374 static u32 dib8096p_calcSyncFreq(u32 P_Kin, u32 P_Kout,
1375 		u32 insertExtSynchro, u32 syncSize)
1376 {
1377 	u32 quantif = 3;
1378 	u32 nom = (insertExtSynchro * P_Kin+syncSize);
1379 	u32 denom = P_Kout;
1380 	u32 syncFreq = ((nom << quantif) / denom);
1381 
1382 	if ((syncFreq & ((1 << quantif) - 1)) != 0)
1383 		syncFreq = (syncFreq >> quantif) + 1;
1384 	else
1385 		syncFreq = (syncFreq >> quantif);
1386 
1387 	if (syncFreq != 0)
1388 		syncFreq = syncFreq - 1;
1389 
1390 	return syncFreq;
1391 }
1392 
1393 static void dib8096p_cfg_DibTx(struct dib8000_state *state, u32 P_Kin,
1394 		u32 P_Kout, u32 insertExtSynchro, u32 synchroMode,
1395 		u32 syncWord, u32 syncSize)
1396 {
1397 	dprintk("Configure DibStream Tx");
1398 
1399 	dib8000_write_word(state, 1615, 1);
1400 	dib8000_write_word(state, 1603, P_Kin);
1401 	dib8000_write_word(state, 1605, P_Kout);
1402 	dib8000_write_word(state, 1606, insertExtSynchro);
1403 	dib8000_write_word(state, 1608, synchroMode);
1404 	dib8000_write_word(state, 1609, (syncWord >> 16) & 0xffff);
1405 	dib8000_write_word(state, 1610, syncWord & 0xffff);
1406 	dib8000_write_word(state, 1612, syncSize);
1407 	dib8000_write_word(state, 1615, 0);
1408 }
1409 
1410 static void dib8096p_cfg_DibRx(struct dib8000_state *state, u32 P_Kin,
1411 		u32 P_Kout, u32 synchroMode, u32 insertExtSynchro,
1412 		u32 syncWord, u32 syncSize, u32 dataOutRate)
1413 {
1414 	u32 syncFreq;
1415 
1416 	dprintk("Configure DibStream Rx synchroMode = %d", synchroMode);
1417 
1418 	if ((P_Kin != 0) && (P_Kout != 0)) {
1419 		syncFreq = dib8096p_calcSyncFreq(P_Kin, P_Kout,
1420 				insertExtSynchro, syncSize);
1421 		dib8000_write_word(state, 1542, syncFreq);
1422 	}
1423 
1424 	dib8000_write_word(state, 1554, 1);
1425 	dib8000_write_word(state, 1536, P_Kin);
1426 	dib8000_write_word(state, 1537, P_Kout);
1427 	dib8000_write_word(state, 1539, synchroMode);
1428 	dib8000_write_word(state, 1540, (syncWord >> 16) & 0xffff);
1429 	dib8000_write_word(state, 1541, syncWord & 0xffff);
1430 	dib8000_write_word(state, 1543, syncSize);
1431 	dib8000_write_word(state, 1544, dataOutRate);
1432 	dib8000_write_word(state, 1554, 0);
1433 }
1434 
1435 static void dib8096p_enMpegMux(struct dib8000_state *state, int onoff)
1436 {
1437 	u16 reg_1287;
1438 
1439 	reg_1287 = dib8000_read_word(state, 1287);
1440 
1441 	switch (onoff) {
1442 	case 1:
1443 			reg_1287 &= ~(1 << 8);
1444 			break;
1445 	case 0:
1446 			reg_1287 |= (1 << 8);
1447 			break;
1448 	}
1449 
1450 	dib8000_write_word(state, 1287, reg_1287);
1451 }
1452 
1453 static void dib8096p_configMpegMux(struct dib8000_state *state,
1454 		u16 pulseWidth, u16 enSerialMode, u16 enSerialClkDiv2)
1455 {
1456 	u16 reg_1287;
1457 
1458 	dprintk("Enable Mpeg mux");
1459 
1460 	dib8096p_enMpegMux(state, 0);
1461 
1462 	/* If the input mode is MPEG do not divide the serial clock */
1463 	if ((enSerialMode == 1) && (state->input_mode_mpeg == 1))
1464 		enSerialClkDiv2 = 0;
1465 
1466 	reg_1287 = ((pulseWidth & 0x1f) << 3) |
1467 		((enSerialMode & 0x1) << 2) | (enSerialClkDiv2 & 0x1);
1468 	dib8000_write_word(state, 1287, reg_1287);
1469 
1470 	dib8096p_enMpegMux(state, 1);
1471 }
1472 
1473 static void dib8096p_setDibTxMux(struct dib8000_state *state, int mode)
1474 {
1475 	u16 reg_1288 = dib8000_read_word(state, 1288) & ~(0x7 << 7);
1476 
1477 	switch (mode) {
1478 	case MPEG_ON_DIBTX:
1479 			dprintk("SET MPEG ON DIBSTREAM TX");
1480 			dib8096p_cfg_DibTx(state, 8, 5, 0, 0, 0, 0);
1481 			reg_1288 |= (1 << 9); break;
1482 	case DIV_ON_DIBTX:
1483 			dprintk("SET DIV_OUT ON DIBSTREAM TX");
1484 			dib8096p_cfg_DibTx(state, 5, 5, 0, 0, 0, 0);
1485 			reg_1288 |= (1 << 8); break;
1486 	case ADC_ON_DIBTX:
1487 			dprintk("SET ADC_OUT ON DIBSTREAM TX");
1488 			dib8096p_cfg_DibTx(state, 20, 5, 10, 0, 0, 0);
1489 			reg_1288 |= (1 << 7); break;
1490 	default:
1491 			break;
1492 	}
1493 	dib8000_write_word(state, 1288, reg_1288);
1494 }
1495 
1496 static void dib8096p_setHostBusMux(struct dib8000_state *state, int mode)
1497 {
1498 	u16 reg_1288 = dib8000_read_word(state, 1288) & ~(0x7 << 4);
1499 
1500 	switch (mode) {
1501 	case DEMOUT_ON_HOSTBUS:
1502 			dprintk("SET DEM OUT OLD INTERF ON HOST BUS");
1503 			dib8096p_enMpegMux(state, 0);
1504 			reg_1288 |= (1 << 6);
1505 			break;
1506 	case DIBTX_ON_HOSTBUS:
1507 			dprintk("SET DIBSTREAM TX ON HOST BUS");
1508 			dib8096p_enMpegMux(state, 0);
1509 			reg_1288 |= (1 << 5);
1510 			break;
1511 	case MPEG_ON_HOSTBUS:
1512 			dprintk("SET MPEG MUX ON HOST BUS");
1513 			reg_1288 |= (1 << 4);
1514 			break;
1515 	default:
1516 			break;
1517 	}
1518 	dib8000_write_word(state, 1288, reg_1288);
1519 }
1520 
1521 static int dib8096p_set_diversity_in(struct dvb_frontend *fe, int onoff)
1522 {
1523 	struct dib8000_state *state = fe->demodulator_priv;
1524 	u16 reg_1287;
1525 
1526 	switch (onoff) {
1527 	case 0: /* only use the internal way - not the diversity input */
1528 			dprintk("%s mode OFF : by default Enable Mpeg INPUT",
1529 					__func__);
1530 			/* outputRate = 8 */
1531 			dib8096p_cfg_DibRx(state, 8, 5, 0, 0, 0, 8, 0);
1532 
1533 			/* Do not divide the serial clock of MPEG MUX in
1534 			   SERIAL MODE in case input mode MPEG is used */
1535 			reg_1287 = dib8000_read_word(state, 1287);
1536 			/* enSerialClkDiv2 == 1 ? */
1537 			if ((reg_1287 & 0x1) == 1) {
1538 				/* force enSerialClkDiv2 = 0 */
1539 				reg_1287 &= ~0x1;
1540 				dib8000_write_word(state, 1287, reg_1287);
1541 			}
1542 			state->input_mode_mpeg = 1;
1543 			break;
1544 	case 1: /* both ways */
1545 	case 2: /* only the diversity input */
1546 			dprintk("%s ON : Enable diversity INPUT", __func__);
1547 			dib8096p_cfg_DibRx(state, 5, 5, 0, 0, 0, 0, 0);
1548 			state->input_mode_mpeg = 0;
1549 			break;
1550 	}
1551 
1552 	dib8000_set_diversity_in(state->fe[0], onoff);
1553 	return 0;
1554 }
1555 
1556 static int dib8096p_set_output_mode(struct dvb_frontend *fe, int mode)
1557 {
1558 	struct dib8000_state *state = fe->demodulator_priv;
1559 	u16 outreg, smo_mode, fifo_threshold;
1560 	u8 prefer_mpeg_mux_use = 1;
1561 	int ret = 0;
1562 
1563 	state->output_mode = mode;
1564 	dib8096p_host_bus_drive(state, 1);
1565 
1566 	fifo_threshold = 1792;
1567 	smo_mode = (dib8000_read_word(state, 299) & 0x0050) | (1 << 1);
1568 	outreg   = dib8000_read_word(state, 1286) &
1569 		~((1 << 10) | (0x7 << 6) | (1 << 1));
1570 
1571 	switch (mode) {
1572 	case OUTMODE_HIGH_Z:
1573 			outreg = 0;
1574 			break;
1575 
1576 	case OUTMODE_MPEG2_SERIAL:
1577 			if (prefer_mpeg_mux_use) {
1578 				dprintk("dib8096P setting output mode TS_SERIAL using Mpeg Mux");
1579 				dib8096p_configMpegMux(state, 3, 1, 1);
1580 				dib8096p_setHostBusMux(state, MPEG_ON_HOSTBUS);
1581 			} else {/* Use Smooth block */
1582 				dprintk("dib8096P setting output mode TS_SERIAL using Smooth bloc");
1583 				dib8096p_setHostBusMux(state,
1584 						DEMOUT_ON_HOSTBUS);
1585 				outreg |= (2 << 6) | (0 << 1);
1586 			}
1587 			break;
1588 
1589 	case OUTMODE_MPEG2_PAR_GATED_CLK:
1590 			if (prefer_mpeg_mux_use) {
1591 				dprintk("dib8096P setting output mode TS_PARALLEL_GATED using Mpeg Mux");
1592 				dib8096p_configMpegMux(state, 2, 0, 0);
1593 				dib8096p_setHostBusMux(state, MPEG_ON_HOSTBUS);
1594 			} else { /* Use Smooth block */
1595 				dprintk("dib8096P setting output mode TS_PARALLEL_GATED using Smooth block");
1596 				dib8096p_setHostBusMux(state,
1597 						DEMOUT_ON_HOSTBUS);
1598 				outreg |= (0 << 6);
1599 			}
1600 			break;
1601 
1602 	case OUTMODE_MPEG2_PAR_CONT_CLK: /* Using Smooth block only */
1603 			dprintk("dib8096P setting output mode TS_PARALLEL_CONT using Smooth block");
1604 			dib8096p_setHostBusMux(state, DEMOUT_ON_HOSTBUS);
1605 			outreg |= (1 << 6);
1606 			break;
1607 
1608 	case OUTMODE_MPEG2_FIFO:
1609 			/* Using Smooth block because not supported
1610 			   by new Mpeg Mux bloc */
1611 			dprintk("dib8096P setting output mode TS_FIFO using Smooth block");
1612 			dib8096p_setHostBusMux(state, DEMOUT_ON_HOSTBUS);
1613 			outreg |= (5 << 6);
1614 			smo_mode |= (3 << 1);
1615 			fifo_threshold = 512;
1616 			break;
1617 
1618 	case OUTMODE_DIVERSITY:
1619 			dprintk("dib8096P setting output mode MODE_DIVERSITY");
1620 			dib8096p_setDibTxMux(state, DIV_ON_DIBTX);
1621 			dib8096p_setHostBusMux(state, DIBTX_ON_HOSTBUS);
1622 			break;
1623 
1624 	case OUTMODE_ANALOG_ADC:
1625 			dprintk("dib8096P setting output mode MODE_ANALOG_ADC");
1626 			dib8096p_setDibTxMux(state, ADC_ON_DIBTX);
1627 			dib8096p_setHostBusMux(state, DIBTX_ON_HOSTBUS);
1628 			break;
1629 	}
1630 
1631 	if (mode != OUTMODE_HIGH_Z)
1632 		outreg |= (1<<10);
1633 
1634 	dprintk("output_mpeg2_in_188_bytes = %d",
1635 			state->cfg.output_mpeg2_in_188_bytes);
1636 	if (state->cfg.output_mpeg2_in_188_bytes)
1637 		smo_mode |= (1 << 5);
1638 
1639 	ret |= dib8000_write_word(state, 299, smo_mode);
1640 	/* synchronous fread */
1641 	ret |= dib8000_write_word(state, 299 + 1, fifo_threshold);
1642 	ret |= dib8000_write_word(state, 1286, outreg);
1643 
1644 	return ret;
1645 }
1646 
1647 static int map_addr_to_serpar_number(struct i2c_msg *msg)
1648 {
1649 	if (msg->buf[0] <= 15)
1650 		msg->buf[0] -= 1;
1651 	else if (msg->buf[0] == 17)
1652 		msg->buf[0] = 15;
1653 	else if (msg->buf[0] == 16)
1654 		msg->buf[0] = 17;
1655 	else if (msg->buf[0] == 19)
1656 		msg->buf[0] = 16;
1657 	else if (msg->buf[0] >= 21 && msg->buf[0] <= 25)
1658 		msg->buf[0] -= 3;
1659 	else if (msg->buf[0] == 28)
1660 		msg->buf[0] = 23;
1661 	else if (msg->buf[0] == 99)
1662 		msg->buf[0] = 99;
1663 	else
1664 		return -EINVAL;
1665 	return 0;
1666 }
1667 
1668 static int dib8096p_tuner_write_serpar(struct i2c_adapter *i2c_adap,
1669 		struct i2c_msg msg[], int num)
1670 {
1671 	struct dib8000_state *state = i2c_get_adapdata(i2c_adap);
1672 	u8 n_overflow = 1;
1673 	u16 i = 1000;
1674 	u16 serpar_num = msg[0].buf[0];
1675 
1676 	while (n_overflow == 1 && i) {
1677 		n_overflow = (dib8000_read_word(state, 1984) >> 1) & 0x1;
1678 		i--;
1679 		if (i == 0)
1680 			dprintk("Tuner ITF: write busy (overflow)");
1681 	}
1682 	dib8000_write_word(state, 1985, (1 << 6) | (serpar_num & 0x3f));
1683 	dib8000_write_word(state, 1986, (msg[0].buf[1] << 8) | msg[0].buf[2]);
1684 
1685 	return num;
1686 }
1687 
1688 static int dib8096p_tuner_read_serpar(struct i2c_adapter *i2c_adap,
1689 		struct i2c_msg msg[], int num)
1690 {
1691 	struct dib8000_state *state = i2c_get_adapdata(i2c_adap);
1692 	u8 n_overflow = 1, n_empty = 1;
1693 	u16 i = 1000;
1694 	u16 serpar_num = msg[0].buf[0];
1695 	u16 read_word;
1696 
1697 	while (n_overflow == 1 && i) {
1698 		n_overflow = (dib8000_read_word(state, 1984) >> 1) & 0x1;
1699 		i--;
1700 		if (i == 0)
1701 			dprintk("TunerITF: read busy (overflow)");
1702 	}
1703 	dib8000_write_word(state, 1985, (0<<6) | (serpar_num&0x3f));
1704 
1705 	i = 1000;
1706 	while (n_empty == 1 && i) {
1707 		n_empty = dib8000_read_word(state, 1984)&0x1;
1708 		i--;
1709 		if (i == 0)
1710 			dprintk("TunerITF: read busy (empty)");
1711 	}
1712 
1713 	read_word = dib8000_read_word(state, 1987);
1714 	msg[1].buf[0] = (read_word >> 8) & 0xff;
1715 	msg[1].buf[1] = (read_word) & 0xff;
1716 
1717 	return num;
1718 }
1719 
1720 static int dib8096p_tuner_rw_serpar(struct i2c_adapter *i2c_adap,
1721 		struct i2c_msg msg[], int num)
1722 {
1723 	if (map_addr_to_serpar_number(&msg[0]) == 0) {
1724 		if (num == 1) /* write */
1725 			return dib8096p_tuner_write_serpar(i2c_adap, msg, 1);
1726 		else /* read */
1727 			return dib8096p_tuner_read_serpar(i2c_adap, msg, 2);
1728 	}
1729 	return num;
1730 }
1731 
1732 static int dib8096p_rw_on_apb(struct i2c_adapter *i2c_adap,
1733 		struct i2c_msg msg[], int num, u16 apb_address)
1734 {
1735 	struct dib8000_state *state = i2c_get_adapdata(i2c_adap);
1736 	u16 word;
1737 
1738 	if (num == 1) {		/* write */
1739 		dib8000_write_word(state, apb_address,
1740 				((msg[0].buf[1] << 8) | (msg[0].buf[2])));
1741 	} else {
1742 		word = dib8000_read_word(state, apb_address);
1743 		msg[1].buf[0] = (word >> 8) & 0xff;
1744 		msg[1].buf[1] = (word) & 0xff;
1745 	}
1746 	return num;
1747 }
1748 
1749 static int dib8096p_tuner_xfer(struct i2c_adapter *i2c_adap,
1750 		struct i2c_msg msg[], int num)
1751 {
1752 	struct dib8000_state *state = i2c_get_adapdata(i2c_adap);
1753 	u16 apb_address = 0, word;
1754 	int i = 0;
1755 
1756 	switch (msg[0].buf[0]) {
1757 	case 0x12:
1758 			apb_address = 1920;
1759 			break;
1760 	case 0x14:
1761 			apb_address = 1921;
1762 			break;
1763 	case 0x24:
1764 			apb_address = 1922;
1765 			break;
1766 	case 0x1a:
1767 			apb_address = 1923;
1768 			break;
1769 	case 0x22:
1770 			apb_address = 1924;
1771 			break;
1772 	case 0x33:
1773 			apb_address = 1926;
1774 			break;
1775 	case 0x34:
1776 			apb_address = 1927;
1777 			break;
1778 	case 0x35:
1779 			apb_address = 1928;
1780 			break;
1781 	case 0x36:
1782 			apb_address = 1929;
1783 			break;
1784 	case 0x37:
1785 			apb_address = 1930;
1786 			break;
1787 	case 0x38:
1788 			apb_address = 1931;
1789 			break;
1790 	case 0x39:
1791 			apb_address = 1932;
1792 			break;
1793 	case 0x2a:
1794 			apb_address = 1935;
1795 			break;
1796 	case 0x2b:
1797 			apb_address = 1936;
1798 			break;
1799 	case 0x2c:
1800 			apb_address = 1937;
1801 			break;
1802 	case 0x2d:
1803 			apb_address = 1938;
1804 			break;
1805 	case 0x2e:
1806 			apb_address = 1939;
1807 			break;
1808 	case 0x2f:
1809 			apb_address = 1940;
1810 			break;
1811 	case 0x30:
1812 			apb_address = 1941;
1813 			break;
1814 	case 0x31:
1815 			apb_address = 1942;
1816 			break;
1817 	case 0x32:
1818 			apb_address = 1943;
1819 			break;
1820 	case 0x3e:
1821 			apb_address = 1944;
1822 			break;
1823 	case 0x3f:
1824 			apb_address = 1945;
1825 			break;
1826 	case 0x40:
1827 			apb_address = 1948;
1828 			break;
1829 	case 0x25:
1830 			apb_address = 936;
1831 			break;
1832 	case 0x26:
1833 			apb_address = 937;
1834 			break;
1835 	case 0x27:
1836 			apb_address = 938;
1837 			break;
1838 	case 0x28:
1839 			apb_address = 939;
1840 			break;
1841 	case 0x1d:
1842 			/* get sad sel request */
1843 			i = ((dib8000_read_word(state, 921) >> 12)&0x3);
1844 			word = dib8000_read_word(state, 924+i);
1845 			msg[1].buf[0] = (word >> 8) & 0xff;
1846 			msg[1].buf[1] = (word) & 0xff;
1847 			return num;
1848 	case 0x1f:
1849 			if (num == 1) {	/* write */
1850 				word = (u16) ((msg[0].buf[1] << 8) |
1851 						msg[0].buf[2]);
1852 				/* in the VGAMODE Sel are located on bit 0/1 */
1853 				word &= 0x3;
1854 				word = (dib8000_read_word(state, 921) &
1855 						~(3<<12)) | (word<<12);
1856 				/* Set the proper input */
1857 				dib8000_write_word(state, 921, word);
1858 				return num;
1859 			}
1860 	}
1861 
1862 	if (apb_address != 0) /* R/W acces via APB */
1863 		return dib8096p_rw_on_apb(i2c_adap, msg, num, apb_address);
1864 	else  /* R/W access via SERPAR  */
1865 		return dib8096p_tuner_rw_serpar(i2c_adap, msg, num);
1866 
1867 	return 0;
1868 }
1869 
1870 static u32 dib8096p_i2c_func(struct i2c_adapter *adapter)
1871 {
1872 	return I2C_FUNC_I2C;
1873 }
1874 
1875 static struct i2c_algorithm dib8096p_tuner_xfer_algo = {
1876 	.master_xfer = dib8096p_tuner_xfer,
1877 	.functionality = dib8096p_i2c_func,
1878 };
1879 
1880 static struct i2c_adapter *dib8096p_get_i2c_tuner(struct dvb_frontend *fe)
1881 {
1882 	struct dib8000_state *st = fe->demodulator_priv;
1883 	return &st->dib8096p_tuner_adap;
1884 }
1885 
1886 static int dib8096p_tuner_sleep(struct dvb_frontend *fe, int onoff)
1887 {
1888 	struct dib8000_state *state = fe->demodulator_priv;
1889 	u16 en_cur_state;
1890 
1891 	dprintk("sleep dib8096p: %d", onoff);
1892 
1893 	en_cur_state = dib8000_read_word(state, 1922);
1894 
1895 	/* LNAs and MIX are ON and therefore it is a valid configuration */
1896 	if (en_cur_state > 0xff)
1897 		state->tuner_enable = en_cur_state ;
1898 
1899 	if (onoff)
1900 		en_cur_state &= 0x00ff;
1901 	else {
1902 		if (state->tuner_enable != 0)
1903 			en_cur_state = state->tuner_enable;
1904 	}
1905 
1906 	dib8000_write_word(state, 1922, en_cur_state);
1907 
1908 	return 0;
1909 }
1910 
1911 static const s32 lut_1000ln_mant[] =
1912 {
1913 	908, 7003, 7090, 7170, 7244, 7313, 7377, 7438, 7495, 7549, 7600
1914 };
1915 
1916 static s32 dib8000_get_adc_power(struct dvb_frontend *fe, u8 mode)
1917 {
1918 	struct dib8000_state *state = fe->demodulator_priv;
1919 	u32 ix = 0, tmp_val = 0, exp = 0, mant = 0;
1920 	s32 val;
1921 
1922 	val = dib8000_read32(state, 384);
1923 	if (mode) {
1924 		tmp_val = val;
1925 		while (tmp_val >>= 1)
1926 			exp++;
1927 		mant = (val * 1000 / (1<<exp));
1928 		ix = (u8)((mant-1000)/100); /* index of the LUT */
1929 		val = (lut_1000ln_mant[ix] + 693*(exp-20) - 6908);
1930 		val = (val*256)/1000;
1931 	}
1932 	return val;
1933 }
1934 
1935 static int dib8090p_get_dc_power(struct dvb_frontend *fe, u8 IQ)
1936 {
1937 	struct dib8000_state *state = fe->demodulator_priv;
1938 	int val = 0;
1939 
1940 	switch (IQ) {
1941 	case 1:
1942 			val = dib8000_read_word(state, 403);
1943 			break;
1944 	case 0:
1945 			val = dib8000_read_word(state, 404);
1946 			break;
1947 	}
1948 	if (val  & 0x200)
1949 		val -= 1024;
1950 
1951 	return val;
1952 }
1953 
1954 static void dib8000_update_timf(struct dib8000_state *state)
1955 {
1956 	u32 timf = state->timf = dib8000_read32(state, 435);
1957 
1958 	dib8000_write_word(state, 29, (u16) (timf >> 16));
1959 	dib8000_write_word(state, 30, (u16) (timf & 0xffff));
1960 	dprintk("Updated timing frequency: %d (default: %d)", state->timf, state->timf_default);
1961 }
1962 
1963 static u32 dib8000_ctrl_timf(struct dvb_frontend *fe, uint8_t op, uint32_t timf)
1964 {
1965 	struct dib8000_state *state = fe->demodulator_priv;
1966 
1967 	switch (op) {
1968 	case DEMOD_TIMF_SET:
1969 			state->timf = timf;
1970 			break;
1971 	case DEMOD_TIMF_UPDATE:
1972 			dib8000_update_timf(state);
1973 			break;
1974 	case DEMOD_TIMF_GET:
1975 			break;
1976 	}
1977 	dib8000_set_bandwidth(state->fe[0], 6000);
1978 
1979 	return state->timf;
1980 }
1981 
1982 static const u16 adc_target_16dB[11] = {
1983 	7250, 7238, 7264, 7309, 7338, 7382, 7427, 7456, 7500, 7544, 7574
1984 };
1985 
1986 static const u8 permu_seg[] = { 6, 5, 7, 4, 8, 3, 9, 2, 10, 1, 11, 0, 12 };
1987 
1988 static u16 dib8000_set_layer(struct dib8000_state *state, u8 layer_index, u16 max_constellation)
1989 {
1990 	u8  cr, constellation, time_intlv;
1991 	struct dtv_frontend_properties *c = &state->fe[0]->dtv_property_cache;
1992 
1993 	switch (c->layer[layer_index].modulation) {
1994 	case DQPSK:
1995 			constellation = 0;
1996 			break;
1997 	case  QPSK:
1998 			constellation = 1;
1999 			break;
2000 	case QAM_16:
2001 			constellation = 2;
2002 			break;
2003 	case QAM_64:
2004 	default:
2005 			constellation = 3;
2006 			break;
2007 	}
2008 
2009 	switch (c->layer[layer_index].fec) {
2010 	case FEC_1_2:
2011 			cr = 1;
2012 			break;
2013 	case FEC_2_3:
2014 			cr = 2;
2015 			break;
2016 	case FEC_3_4:
2017 			cr = 3;
2018 			break;
2019 	case FEC_5_6:
2020 			cr = 5;
2021 			break;
2022 	case FEC_7_8:
2023 	default:
2024 			cr = 7;
2025 			break;
2026 	}
2027 
2028 	time_intlv = fls(c->layer[layer_index].interleaving);
2029 	if (time_intlv > 3 && !(time_intlv == 4 && c->isdbt_sb_mode == 1))
2030 		time_intlv = 0;
2031 
2032 	dib8000_write_word(state, 2 + layer_index, (constellation << 10) | ((c->layer[layer_index].segment_count & 0xf) << 6) | (cr << 3) | time_intlv);
2033 	if (c->layer[layer_index].segment_count > 0) {
2034 		switch (max_constellation) {
2035 		case DQPSK:
2036 		case QPSK:
2037 				if (c->layer[layer_index].modulation == QAM_16 || c->layer[layer_index].modulation == QAM_64)
2038 					max_constellation = c->layer[layer_index].modulation;
2039 				break;
2040 		case QAM_16:
2041 				if (c->layer[layer_index].modulation == QAM_64)
2042 					max_constellation = c->layer[layer_index].modulation;
2043 				break;
2044 		}
2045 	}
2046 
2047 	return  max_constellation;
2048 }
2049 
2050 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 */
2051 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 */
2052 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 */
2053 static u16 dib8000_adp_fine_tune(struct dib8000_state *state, u16 max_constellation)
2054 {
2055 	u16 i, ana_gain = 0;
2056 	const u16 *adp;
2057 
2058 	/* channel estimation fine configuration */
2059 	switch (max_constellation) {
2060 	case QAM_64:
2061 			ana_gain = 0x7;
2062 			adp = &adp_Q64[0];
2063 			break;
2064 	case QAM_16:
2065 			ana_gain = 0x7;
2066 			adp = &adp_Q16[0];
2067 			break;
2068 	default:
2069 			ana_gain = 0;
2070 			adp = &adp_Qdefault[0];
2071 			break;
2072 	}
2073 
2074 	for (i = 0; i < 4; i++)
2075 		dib8000_write_word(state, 215 + i, adp[i]);
2076 
2077 	return ana_gain;
2078 }
2079 
2080 static void dib8000_update_ana_gain(struct dib8000_state *state, u16 ana_gain)
2081 {
2082 	u16 i;
2083 
2084 	dib8000_write_word(state, 116, ana_gain);
2085 
2086 	/* update ADC target depending on ana_gain */
2087 	if (ana_gain) { /* set -16dB ADC target for ana_gain=-1 */
2088 		for (i = 0; i < 10; i++)
2089 			dib8000_write_word(state, 80 + i, adc_target_16dB[i]);
2090 	} else { /* set -22dB ADC target for ana_gain=0 */
2091 		for (i = 0; i < 10; i++)
2092 			dib8000_write_word(state, 80 + i, adc_target_16dB[i] - 355);
2093 	}
2094 }
2095 
2096 static void dib8000_load_ana_fe_coefs(struct dib8000_state *state, const s16 *ana_fe)
2097 {
2098 	u16 mode = 0;
2099 
2100 	if (state->isdbt_cfg_loaded == 0)
2101 		for (mode = 0; mode < 24; mode++)
2102 			dib8000_write_word(state, 117 + mode, ana_fe[mode]);
2103 }
2104 
2105 static const u16 lut_prbs_2k[14] = {
2106 	0, 0x423, 0x009, 0x5C7, 0x7A6, 0x3D8, 0x527, 0x7FF, 0x79B, 0x3D6, 0x3A2, 0x53B, 0x2F4, 0x213
2107 };
2108 static const u16 lut_prbs_4k[14] = {
2109 	0, 0x208, 0x0C3, 0x7B9, 0x423, 0x5C7, 0x3D8, 0x7FF, 0x3D6, 0x53B, 0x213, 0x029, 0x0D0, 0x48E
2110 };
2111 static const u16 lut_prbs_8k[14] = {
2112 	0, 0x740, 0x069, 0x7DD, 0x208, 0x7B9, 0x5C7, 0x7FF, 0x53B, 0x029, 0x48E, 0x4C4, 0x367, 0x684
2113 };
2114 
2115 static u16 dib8000_get_init_prbs(struct dib8000_state *state, u16 subchannel)
2116 {
2117 	int sub_channel_prbs_group = 0;
2118 
2119 	sub_channel_prbs_group = (subchannel / 3) + 1;
2120 	dprintk("sub_channel_prbs_group = %d , subchannel =%d prbs = 0x%04x", sub_channel_prbs_group, subchannel, lut_prbs_8k[sub_channel_prbs_group]);
2121 
2122 	switch (state->fe[0]->dtv_property_cache.transmission_mode) {
2123 	case TRANSMISSION_MODE_2K:
2124 			return lut_prbs_2k[sub_channel_prbs_group];
2125 	case TRANSMISSION_MODE_4K:
2126 			return lut_prbs_4k[sub_channel_prbs_group];
2127 	default:
2128 	case TRANSMISSION_MODE_8K:
2129 			return lut_prbs_8k[sub_channel_prbs_group];
2130 	}
2131 }
2132 
2133 static void dib8000_set_13seg_channel(struct dib8000_state *state)
2134 {
2135 	u16 i;
2136 	u16 coff_pow = 0x2800;
2137 
2138 	state->seg_mask = 0x1fff; /* All 13 segments enabled */
2139 
2140 	/* ---- COFF ---- Carloff, the most robust --- */
2141 	if (state->isdbt_cfg_loaded == 0) {  /* if not Sound Broadcasting mode : put default values for 13 segments */
2142 		dib8000_write_word(state, 180, (16 << 6) | 9);
2143 		dib8000_write_word(state, 187, (4 << 12) | (8 << 5) | 0x2);
2144 		coff_pow = 0x2800;
2145 		for (i = 0; i < 6; i++)
2146 			dib8000_write_word(state, 181+i, coff_pow);
2147 
2148 		/* P_ctrl_corm_thres4pre_freq_inh=1, P_ctrl_pre_freq_mode_sat=1 */
2149 		/* 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 */
2150 		dib8000_write_word(state, 338, (1 << 12) | (1 << 10) | (0 << 9) | (3 << 5) | 1);
2151 
2152 		/* P_ctrl_pre_freq_win_len=8, P_ctrl_pre_freq_thres_lockin=6 */
2153 		dib8000_write_word(state, 340, (8 << 6) | (6 << 0));
2154 		/* P_ctrl_pre_freq_thres_lockout=4, P_small_use_tmcc/ac/cp=1 */
2155 		dib8000_write_word(state, 341, (4 << 3) | (1 << 2) | (1 << 1) | (1 << 0));
2156 
2157 		dib8000_write_word(state, 228, 0);  /* default value */
2158 		dib8000_write_word(state, 265, 31); /* default value */
2159 		dib8000_write_word(state, 205, 0x200f); /* init value */
2160 	}
2161 
2162 	/*
2163 	 * make the cpil_coff_lock more robust but slower p_coff_winlen
2164 	 * 6bits; p_coff_thres_lock 6bits (for coff lock if needed)
2165 	 */
2166 
2167 	if (state->cfg.pll->ifreq == 0)
2168 		dib8000_write_word(state, 266, ~state->seg_mask | state->seg_diff_mask | 0x40); /* P_equal_noise_seg_inh */
2169 
2170 	dib8000_load_ana_fe_coefs(state, ana_fe_coeff_13seg);
2171 }
2172 
2173 static void dib8000_set_subchannel_prbs(struct dib8000_state *state, u16 init_prbs)
2174 {
2175 	u16 reg_1;
2176 
2177 	reg_1 = dib8000_read_word(state, 1);
2178 	dib8000_write_word(state, 1, (init_prbs << 2) | (reg_1 & 0x3)); /* ADDR 1 */
2179 }
2180 
2181 static void dib8000_small_fine_tune(struct dib8000_state *state)
2182 {
2183 	u16 i;
2184 	const s16 *ncoeff;
2185 	struct dtv_frontend_properties *c = &state->fe[0]->dtv_property_cache;
2186 
2187 	dib8000_write_word(state, 352, state->seg_diff_mask);
2188 	dib8000_write_word(state, 353, state->seg_mask);
2189 
2190 	/* P_small_coef_ext_enable=ISDB-Tsb, P_small_narrow_band=ISDB-Tsb, P_small_last_seg=13, P_small_offset_num_car=5 */
2191 	dib8000_write_word(state, 351, (c->isdbt_sb_mode << 9) | (c->isdbt_sb_mode << 8) | (13 << 4) | 5);
2192 
2193 	if (c->isdbt_sb_mode) {
2194 		/* ---- SMALL ---- */
2195 		switch (c->transmission_mode) {
2196 		case TRANSMISSION_MODE_2K:
2197 				if (c->isdbt_partial_reception == 0) { /* 1-seg */
2198 					if (c->layer[0].modulation == DQPSK) /* DQPSK */
2199 						ncoeff = coeff_2k_sb_1seg_dqpsk;
2200 					else /* QPSK or QAM */
2201 						ncoeff = coeff_2k_sb_1seg;
2202 				} else { /* 3-segments */
2203 					if (c->layer[0].modulation == DQPSK) { /* DQPSK on central segment */
2204 						if (c->layer[1].modulation == DQPSK) /* DQPSK on external segments */
2205 							ncoeff = coeff_2k_sb_3seg_0dqpsk_1dqpsk;
2206 						else /* QPSK or QAM on external segments */
2207 							ncoeff = coeff_2k_sb_3seg_0dqpsk;
2208 					} else { /* QPSK or QAM on central segment */
2209 						if (c->layer[1].modulation == DQPSK) /* DQPSK on external segments */
2210 							ncoeff = coeff_2k_sb_3seg_1dqpsk;
2211 						else /* QPSK or QAM on external segments */
2212 							ncoeff = coeff_2k_sb_3seg;
2213 					}
2214 				}
2215 				break;
2216 		case TRANSMISSION_MODE_4K:
2217 				if (c->isdbt_partial_reception == 0) { /* 1-seg */
2218 					if (c->layer[0].modulation == DQPSK) /* DQPSK */
2219 						ncoeff = coeff_4k_sb_1seg_dqpsk;
2220 					else /* QPSK or QAM */
2221 						ncoeff = coeff_4k_sb_1seg;
2222 				} else { /* 3-segments */
2223 					if (c->layer[0].modulation == DQPSK) { /* DQPSK on central segment */
2224 						if (c->layer[1].modulation == DQPSK) /* DQPSK on external segments */
2225 							ncoeff = coeff_4k_sb_3seg_0dqpsk_1dqpsk;
2226 						else /* QPSK or QAM on external segments */
2227 							ncoeff = coeff_4k_sb_3seg_0dqpsk;
2228 					} else { /* QPSK or QAM on central segment */
2229 						if (c->layer[1].modulation == DQPSK) /* DQPSK on external segments */
2230 							ncoeff = coeff_4k_sb_3seg_1dqpsk;
2231 						else /* QPSK or QAM on external segments */
2232 							ncoeff = coeff_4k_sb_3seg;
2233 					}
2234 				}
2235 				break;
2236 		case TRANSMISSION_MODE_AUTO:
2237 		case TRANSMISSION_MODE_8K:
2238 		default:
2239 				if (c->isdbt_partial_reception == 0) { /* 1-seg */
2240 					if (c->layer[0].modulation == DQPSK) /* DQPSK */
2241 						ncoeff = coeff_8k_sb_1seg_dqpsk;
2242 					else /* QPSK or QAM */
2243 						ncoeff = coeff_8k_sb_1seg;
2244 				} else { /* 3-segments */
2245 					if (c->layer[0].modulation == DQPSK) { /* DQPSK on central segment */
2246 						if (c->layer[1].modulation == DQPSK) /* DQPSK on external segments */
2247 							ncoeff = coeff_8k_sb_3seg_0dqpsk_1dqpsk;
2248 						else /* QPSK or QAM on external segments */
2249 							ncoeff = coeff_8k_sb_3seg_0dqpsk;
2250 					} else { /* QPSK or QAM on central segment */
2251 						if (c->layer[1].modulation == DQPSK) /* DQPSK on external segments */
2252 							ncoeff = coeff_8k_sb_3seg_1dqpsk;
2253 						else /* QPSK or QAM on external segments */
2254 							ncoeff = coeff_8k_sb_3seg;
2255 					}
2256 				}
2257 				break;
2258 		}
2259 
2260 		for (i = 0; i < 8; i++)
2261 			dib8000_write_word(state, 343 + i, ncoeff[i]);
2262 	}
2263 }
2264 
2265 static const u16 coff_thres_1seg[3] = {300, 150, 80};
2266 static const u16 coff_thres_3seg[3] = {350, 300, 250};
2267 static void dib8000_set_sb_channel(struct dib8000_state *state)
2268 {
2269 	struct dtv_frontend_properties *c = &state->fe[0]->dtv_property_cache;
2270 	const u16 *coff;
2271 	u16 i;
2272 
2273 	if (c->transmission_mode == TRANSMISSION_MODE_2K || c->transmission_mode == TRANSMISSION_MODE_4K) {
2274 		dib8000_write_word(state, 219, dib8000_read_word(state, 219) | 0x1); /* adp_pass =1 */
2275 		dib8000_write_word(state, 190, dib8000_read_word(state, 190) | (0x1 << 14)); /* pha3_force_pha_shift = 1 */
2276 	} else {
2277 		dib8000_write_word(state, 219, dib8000_read_word(state, 219) & 0xfffe); /* adp_pass =0 */
2278 		dib8000_write_word(state, 190, dib8000_read_word(state, 190) & 0xbfff); /* pha3_force_pha_shift = 0 */
2279 	}
2280 
2281 	if (c->isdbt_partial_reception == 1) /* 3-segments */
2282 		state->seg_mask = 0x00E0;
2283 	else /* 1-segment */
2284 		state->seg_mask = 0x0040;
2285 
2286 	dib8000_write_word(state, 268, (dib8000_read_word(state, 268) & 0xF9FF) | 0x0200);
2287 
2288 	/* ---- COFF ---- Carloff, the most robust --- */
2289 	/* 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 */
2290 	dib8000_write_word(state, 187, (4 << 12) | (0 << 11) | (63 << 5) | (0x3 << 3) | ((~c->isdbt_partial_reception & 1) << 2) | 0x3);
2291 
2292 	dib8000_write_word(state, 340, (16 << 6) | (8 << 0)); /* P_ctrl_pre_freq_win_len=16, P_ctrl_pre_freq_thres_lockin=8 */
2293 	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 */
2294 
2295 	/* Sound Broadcasting mode 1 seg */
2296 	if (c->isdbt_partial_reception == 0) {
2297 		/* 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) */
2298 		if (state->mode == 3)
2299 			dib8000_write_word(state, 180, 0x1fcf | ((state->mode - 1) << 14));
2300 		else
2301 			dib8000_write_word(state, 180, 0x0fcf | ((state->mode - 1) << 14));
2302 
2303 		/* 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 */
2304 		dib8000_write_word(state, 338, (1 << 12) | (1 << 10) | (0 << 9) | (5 << 5) | 4);
2305 		coff = &coff_thres_1seg[0];
2306 	} else {   /* Sound Broadcasting mode 3 seg */
2307 		dib8000_write_word(state, 180, 0x1fcf | (1 << 14));
2308 		/* 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 */
2309 		dib8000_write_word(state, 338, (1 << 12) | (1 << 10) | (0 << 9) | (4 << 5) | 4);
2310 		coff = &coff_thres_3seg[0];
2311 	}
2312 
2313 	dib8000_write_word(state, 228, 1); /* P_2d_mode_byp=1 */
2314 	dib8000_write_word(state, 205, dib8000_read_word(state, 205) & 0xfff0); /* P_cspu_win_cut = 0 */
2315 
2316 	if (c->isdbt_partial_reception == 0 && c->transmission_mode == TRANSMISSION_MODE_2K)
2317 		dib8000_write_word(state, 265, 15); /* P_equal_noise_sel = 15 */
2318 
2319 	/* Write COFF thres */
2320 	for (i = 0 ; i < 3; i++) {
2321 		dib8000_write_word(state, 181+i, coff[i]);
2322 		dib8000_write_word(state, 184+i, coff[i]);
2323 	}
2324 
2325 	/*
2326 	 * make the cpil_coff_lock more robust but slower p_coff_winlen
2327 	 * 6bits; p_coff_thres_lock 6bits (for coff lock if needed)
2328 	 */
2329 
2330 	dib8000_write_word(state, 266, ~state->seg_mask | state->seg_diff_mask); /* P_equal_noise_seg_inh */
2331 
2332 	if (c->isdbt_partial_reception == 0)
2333 		dib8000_write_word(state, 178, 64); /* P_fft_powrange = 64 */
2334 	else
2335 		dib8000_write_word(state, 178, 32); /* P_fft_powrange = 32 */
2336 }
2337 
2338 static void dib8000_set_isdbt_common_channel(struct dib8000_state *state, u8 seq, u8 autosearching)
2339 {
2340 	u16 p_cfr_left_edge  = 0, p_cfr_right_edge = 0;
2341 	u16 tmcc_pow = 0, ana_gain = 0, tmp = 0, i = 0, nbseg_diff = 0 ;
2342 	u16 max_constellation = DQPSK;
2343 	int init_prbs;
2344 	struct dtv_frontend_properties *c = &state->fe[0]->dtv_property_cache;
2345 
2346 	if (autosearching)
2347 		c->isdbt_partial_reception = 1;
2348 
2349 	/* P_mode */
2350 	dib8000_write_word(state, 10, (seq << 4));
2351 
2352 	/* init mode */
2353 	state->mode = fft_to_mode(state);
2354 
2355 	/* set guard */
2356 	tmp = dib8000_read_word(state, 1);
2357 	dib8000_write_word(state, 1, (tmp&0xfffc) | (c->guard_interval & 0x3));
2358 
2359 	dib8000_write_word(state, 274, (dib8000_read_word(state, 274) & 0xffcf) | ((c->isdbt_partial_reception & 1) << 5) | ((c->isdbt_sb_mode & 1) << 4));
2360 
2361 	/* signal optimization parameter */
2362 	if (c->isdbt_partial_reception) {
2363 		state->seg_diff_mask = (c->layer[0].modulation == DQPSK) << permu_seg[0];
2364 		for (i = 1; i < 3; i++)
2365 			nbseg_diff += (c->layer[i].modulation == DQPSK) * c->layer[i].segment_count;
2366 		for (i = 0; i < nbseg_diff; i++)
2367 			state->seg_diff_mask |= 1 << permu_seg[i+1];
2368 	} else {
2369 		for (i = 0; i < 3; i++)
2370 			nbseg_diff += (c->layer[i].modulation == DQPSK) * c->layer[i].segment_count;
2371 		for (i = 0; i < nbseg_diff; i++)
2372 			state->seg_diff_mask |= 1 << permu_seg[i];
2373 	}
2374 
2375 	if (state->seg_diff_mask)
2376 		dib8000_write_word(state, 268, (dib8000_read_word(state, 268) & 0xF9FF) | 0x0200);
2377 	else
2378 		dib8000_write_word(state, 268, (2 << 9) | 39); /*init value */
2379 
2380 	for (i = 0; i < 3; i++)
2381 		max_constellation = dib8000_set_layer(state, i, max_constellation);
2382 	if (autosearching == 0) {
2383 		state->layer_b_nb_seg = c->layer[1].segment_count;
2384 		state->layer_c_nb_seg = c->layer[2].segment_count;
2385 	}
2386 
2387 	/* WRITE: Mode & Diff mask */
2388 	dib8000_write_word(state, 0, (state->mode << 13) | state->seg_diff_mask);
2389 
2390 	state->differential_constellation = (state->seg_diff_mask != 0);
2391 
2392 	/* channel estimation fine configuration */
2393 	ana_gain = dib8000_adp_fine_tune(state, max_constellation);
2394 
2395 	/* update ana_gain depending on max constellation */
2396 	dib8000_update_ana_gain(state, ana_gain);
2397 
2398 	/* ---- ANA_FE ---- */
2399 	if (c->isdbt_partial_reception) /* 3-segments */
2400 		dib8000_load_ana_fe_coefs(state, ana_fe_coeff_3seg);
2401 	else
2402 		dib8000_load_ana_fe_coefs(state, ana_fe_coeff_1seg); /* 1-segment */
2403 
2404 	/* TSB or ISDBT ? apply it now */
2405 	if (c->isdbt_sb_mode) {
2406 		dib8000_set_sb_channel(state);
2407 		if (c->isdbt_sb_subchannel < 14)
2408 			init_prbs = dib8000_get_init_prbs(state, c->isdbt_sb_subchannel);
2409 		else
2410 			init_prbs = 0;
2411 	} else {
2412 		dib8000_set_13seg_channel(state);
2413 		init_prbs = 0xfff;
2414 	}
2415 
2416 	/* SMALL */
2417 	dib8000_small_fine_tune(state);
2418 
2419 	dib8000_set_subchannel_prbs(state, init_prbs);
2420 
2421 	/* ---- CHAN_BLK ---- */
2422 	for (i = 0; i < 13; i++) {
2423 		if ((((~state->seg_diff_mask) >> i) & 1) == 1) {
2424 			p_cfr_left_edge  += (1 << i) * ((i == 0) || ((((state->seg_mask & (~state->seg_diff_mask)) >> (i - 1)) & 1) == 0));
2425 			p_cfr_right_edge += (1 << i) * ((i == 12) || ((((state->seg_mask & (~state->seg_diff_mask)) >> (i + 1)) & 1) == 0));
2426 		}
2427 	}
2428 	dib8000_write_word(state, 222, p_cfr_left_edge); /* p_cfr_left_edge */
2429 	dib8000_write_word(state, 223, p_cfr_right_edge); /* p_cfr_right_edge */
2430 	/* "P_cspu_left_edge" & "P_cspu_right_edge" not used => do not care */
2431 
2432 	dib8000_write_word(state, 189, ~state->seg_mask | state->seg_diff_mask); /* P_lmod4_seg_inh */
2433 	dib8000_write_word(state, 192, ~state->seg_mask | state->seg_diff_mask); /* P_pha3_seg_inh */
2434 	dib8000_write_word(state, 225, ~state->seg_mask | state->seg_diff_mask); /* P_tac_seg_inh */
2435 
2436 	if (!autosearching)
2437 		dib8000_write_word(state, 288, (~state->seg_mask | state->seg_diff_mask) & 0x1fff); /* P_tmcc_seg_eq_inh */
2438 	else
2439 		dib8000_write_word(state, 288, 0x1fff); /*disable equalisation of the tmcc when autosearch to be able to find the DQPSK channels. */
2440 
2441 	dib8000_write_word(state, 211, state->seg_mask & (~state->seg_diff_mask)); /* P_des_seg_enabled */
2442 	dib8000_write_word(state, 287, ~state->seg_mask | 0x1000); /* P_tmcc_seg_inh */
2443 
2444 	dib8000_write_word(state, 178, 32); /* P_fft_powrange = 32 */
2445 
2446 	/* ---- TMCC ---- */
2447 	for (i = 0; i < 3; i++)
2448 		tmcc_pow += (((c->layer[i].modulation == DQPSK) * 4 + 1) * c->layer[i].segment_count) ;
2449 
2450 	/* Quantif of "P_tmcc_dec_thres_?k" is (0, 5+mode, 9); */
2451 	/* Threshold is set at 1/4 of max power. */
2452 	tmcc_pow *= (1 << (9-2));
2453 	dib8000_write_word(state, 290, tmcc_pow); /* P_tmcc_dec_thres_2k */
2454 	dib8000_write_word(state, 291, tmcc_pow); /* P_tmcc_dec_thres_4k */
2455 	dib8000_write_word(state, 292, tmcc_pow); /* P_tmcc_dec_thres_8k */
2456 	/*dib8000_write_word(state, 287, (1 << 13) | 0x1000 ); */
2457 
2458 	/* ---- PHA3 ---- */
2459 	if (state->isdbt_cfg_loaded == 0)
2460 		dib8000_write_word(state, 250, 3285); /* p_2d_hspeed_thr0 */
2461 
2462 	state->isdbt_cfg_loaded = 0;
2463 }
2464 
2465 static u32 dib8000_wait_lock(struct dib8000_state *state, u32 internal,
2466 			     u32 wait0_ms, u32 wait1_ms, u32 wait2_ms)
2467 {
2468 	u32 value = 0;	/* P_search_end0 wait time */
2469 	u16 reg = 11;	/* P_search_end0 start addr */
2470 
2471 	for (reg = 11; reg < 16; reg += 2) {
2472 		if (reg == 11) {
2473 			if (state->revision == 0x8090)
2474 				value = internal * wait1_ms;
2475 			else
2476 				value = internal * wait0_ms;
2477 		} else if (reg == 13)
2478 			value = internal * wait1_ms;
2479 		else if (reg == 15)
2480 			value = internal * wait2_ms;
2481 		dib8000_write_word(state, reg, (u16)((value >> 16) & 0xffff));
2482 		dib8000_write_word(state, (reg + 1), (u16)(value & 0xffff));
2483 	}
2484 	return value;
2485 }
2486 
2487 static int dib8000_autosearch_start(struct dvb_frontend *fe)
2488 {
2489 	struct dib8000_state *state = fe->demodulator_priv;
2490 	struct dtv_frontend_properties *c = &state->fe[0]->dtv_property_cache;
2491 	u8 slist = 0;
2492 	u32 value, internal = state->cfg.pll->internal;
2493 
2494 	if (state->revision == 0x8090)
2495 		internal = dib8000_read32(state, 23) / 1000;
2496 
2497 	if ((state->revision >= 0x8002) &&
2498 	    (state->autosearch_state == AS_SEARCHING_FFT)) {
2499 		dib8000_write_word(state,  37, 0x0065); /* P_ctrl_pha_off_max default values */
2500 		dib8000_write_word(state, 116, 0x0000); /* P_ana_gain to 0 */
2501 
2502 		dib8000_write_word(state, 0, (dib8000_read_word(state, 0) & 0x1fff) | (0 << 13) | (1 << 15)); /* P_mode = 0, P_restart_search=1 */
2503 		dib8000_write_word(state, 1, (dib8000_read_word(state, 1) & 0xfffc) | 0); /* P_guard = 0 */
2504 		dib8000_write_word(state, 6, 0); /* P_lock0_mask = 0 */
2505 		dib8000_write_word(state, 7, 0); /* P_lock1_mask = 0 */
2506 		dib8000_write_word(state, 8, 0); /* P_lock2_mask = 0 */
2507 		dib8000_write_word(state, 10, (dib8000_read_word(state, 10) & 0x200) | (16 << 4) | (0 << 0)); /* P_search_list=16, P_search_maxtrial=0 */
2508 
2509 		if (state->revision == 0x8090)
2510 			value = dib8000_wait_lock(state, internal, 10, 10, 10); /* time in ms configure P_search_end0 P_search_end1 P_search_end2 */
2511 		else
2512 			value = dib8000_wait_lock(state, internal, 20, 20, 20); /* time in ms configure P_search_end0 P_search_end1 P_search_end2 */
2513 
2514 		dib8000_write_word(state, 17, 0);
2515 		dib8000_write_word(state, 18, 200); /* P_search_rstst = 200 */
2516 		dib8000_write_word(state, 19, 0);
2517 		dib8000_write_word(state, 20, 400); /* P_search_rstend = 400 */
2518 		dib8000_write_word(state, 21, (value >> 16) & 0xffff); /* P_search_checkst */
2519 		dib8000_write_word(state, 22, value & 0xffff);
2520 
2521 		if (state->revision == 0x8090)
2522 			dib8000_write_word(state, 32, (dib8000_read_word(state, 32) & 0xf0ff) | (0 << 8)); /* P_corm_alpha = 0 */
2523 		else
2524 			dib8000_write_word(state, 32, (dib8000_read_word(state, 32) & 0xf0ff) | (9 << 8)); /* P_corm_alpha = 3 */
2525 		dib8000_write_word(state, 355, 2); /* P_search_param_max = 2 */
2526 
2527 		/* P_search_param_select = (1 | 1<<4 | 1 << 8) */
2528 		dib8000_write_word(state, 356, 0);
2529 		dib8000_write_word(state, 357, 0x111);
2530 
2531 		dib8000_write_word(state, 770, (dib8000_read_word(state, 770) & 0xdfff) | (1 << 13)); /* P_restart_ccg = 1 */
2532 		dib8000_write_word(state, 770, (dib8000_read_word(state, 770) & 0xdfff) | (0 << 13)); /* P_restart_ccg = 0 */
2533 		dib8000_write_word(state, 0, (dib8000_read_word(state, 0) & 0x7ff) | (0 << 15) | (1 << 13)); /* P_restart_search = 0; */
2534 	} else if ((state->revision >= 0x8002) &&
2535 		   (state->autosearch_state == AS_SEARCHING_GUARD)) {
2536 		c->transmission_mode = TRANSMISSION_MODE_8K;
2537 		c->guard_interval = GUARD_INTERVAL_1_8;
2538 		c->inversion = 0;
2539 		c->layer[0].modulation = QAM_64;
2540 		c->layer[0].fec = FEC_2_3;
2541 		c->layer[0].interleaving = 0;
2542 		c->layer[0].segment_count = 13;
2543 
2544 		slist = 16;
2545 		c->transmission_mode = state->found_nfft;
2546 
2547 		dib8000_set_isdbt_common_channel(state, slist, 1);
2548 
2549 		/* set lock_mask values */
2550 		dib8000_write_word(state, 6, 0x4);
2551 		if (state->revision == 0x8090)
2552 			dib8000_write_word(state, 7, ((1 << 12) | (1 << 11) | (1 << 10)));/* tmcc_dec_lock, tmcc_sync_lock, tmcc_data_lock, tmcc_bch_uncor */
2553 		else
2554 			dib8000_write_word(state, 7, 0x8);
2555 		dib8000_write_word(state, 8, 0x1000);
2556 
2557 		/* set lock_mask wait time values */
2558 		if (state->revision == 0x8090)
2559 			dib8000_wait_lock(state, internal, 50, 100, 1000); /* time in ms configure P_search_end0 P_search_end1 P_search_end2 */
2560 		else
2561 			dib8000_wait_lock(state, internal, 50, 200, 1000); /* time in ms configure P_search_end0 P_search_end1 P_search_end2 */
2562 
2563 		dib8000_write_word(state, 355, 3); /* P_search_param_max = 3 */
2564 
2565 		/* P_search_param_select = 0xf; look for the 4 different guard intervals */
2566 		dib8000_write_word(state, 356, 0);
2567 		dib8000_write_word(state, 357, 0xf);
2568 
2569 		value = dib8000_read_word(state, 0);
2570 		dib8000_write_word(state, 0, (u16)((1 << 15) | value));
2571 		dib8000_read_word(state, 1284);  /* reset the INT. n_irq_pending */
2572 		dib8000_write_word(state, 0, (u16)value);
2573 	} else {
2574 		c->inversion = 0;
2575 		c->layer[0].modulation = QAM_64;
2576 		c->layer[0].fec = FEC_2_3;
2577 		c->layer[0].interleaving = 0;
2578 		c->layer[0].segment_count = 13;
2579 		if (!c->isdbt_sb_mode)
2580 			c->layer[0].segment_count = 13;
2581 
2582 		/* choose the right list, in sb, always do everything */
2583 		if (c->isdbt_sb_mode) {
2584 			slist = 7;
2585 			dib8000_write_word(state, 0, (dib8000_read_word(state, 0) & 0x9fff) | (1 << 13));
2586 		} else {
2587 			if (c->guard_interval == GUARD_INTERVAL_AUTO) {
2588 				if (c->transmission_mode == TRANSMISSION_MODE_AUTO) {
2589 					c->transmission_mode = TRANSMISSION_MODE_8K;
2590 					c->guard_interval = GUARD_INTERVAL_1_8;
2591 					slist = 7;
2592 					dib8000_write_word(state, 0, (dib8000_read_word(state, 0) & 0x9fff) | (1 << 13));  /* P_mode = 1 to have autosearch start ok with mode2 */
2593 				} else {
2594 					c->guard_interval = GUARD_INTERVAL_1_8;
2595 					slist = 3;
2596 				}
2597 			} else {
2598 				if (c->transmission_mode == TRANSMISSION_MODE_AUTO) {
2599 					c->transmission_mode = TRANSMISSION_MODE_8K;
2600 					slist = 2;
2601 					dib8000_write_word(state, 0, (dib8000_read_word(state, 0) & 0x9fff) | (1 << 13));  /* P_mode = 1 */
2602 				} else
2603 					slist = 0;
2604 			}
2605 		}
2606 		dprintk("Using list for autosearch : %d", slist);
2607 
2608 		dib8000_set_isdbt_common_channel(state, slist, 1);
2609 
2610 		/* set lock_mask values */
2611 		dib8000_write_word(state, 6, 0x4);
2612 		if (state->revision == 0x8090)
2613 			dib8000_write_word(state, 7, (1 << 12) | (1 << 11) | (1 << 10));
2614 		else
2615 			dib8000_write_word(state, 7, 0x8);
2616 		dib8000_write_word(state, 8, 0x1000);
2617 
2618 		/* set lock_mask wait time values */
2619 		if (state->revision == 0x8090)
2620 			dib8000_wait_lock(state, internal, 50, 200, 1000); /* time in ms configure P_search_end0 P_search_end1 P_search_end2 */
2621 		else
2622 			dib8000_wait_lock(state, internal, 50, 100, 1000); /* time in ms configure P_search_end0 P_search_end1 P_search_end2 */
2623 
2624 		value = dib8000_read_word(state, 0);
2625 		dib8000_write_word(state, 0, (u16)((1 << 15) | value));
2626 		dib8000_read_word(state, 1284);  /* reset the INT. n_irq_pending */
2627 		dib8000_write_word(state, 0, (u16)value);
2628 	}
2629 	return 0;
2630 }
2631 
2632 static int dib8000_autosearch_irq(struct dvb_frontend *fe)
2633 {
2634 	struct dib8000_state *state = fe->demodulator_priv;
2635 	u16 irq_pending = dib8000_read_word(state, 1284);
2636 
2637 	if ((state->revision >= 0x8002) &&
2638 	    (state->autosearch_state == AS_SEARCHING_FFT)) {
2639 		if (irq_pending & 0x1) {
2640 			dprintk("dib8000_autosearch_irq: max correlation result available");
2641 			return 3;
2642 		}
2643 	} else {
2644 		if (irq_pending & 0x1) {	/* failed */
2645 			dprintk("dib8000_autosearch_irq failed");
2646 			return 1;
2647 		}
2648 
2649 		if (irq_pending & 0x2) {	/* succeeded */
2650 			dprintk("dib8000_autosearch_irq succeeded");
2651 			return 2;
2652 		}
2653 	}
2654 
2655 	return 0;		// still pending
2656 }
2657 
2658 static void dib8000_viterbi_state(struct dib8000_state *state, u8 onoff)
2659 {
2660 	u16 tmp;
2661 
2662 	tmp = dib8000_read_word(state, 771);
2663 	if (onoff) /* start P_restart_chd : channel_decoder */
2664 		dib8000_write_word(state, 771, tmp & 0xfffd);
2665 	else /* stop P_restart_chd : channel_decoder */
2666 		dib8000_write_word(state, 771, tmp | (1<<1));
2667 }
2668 
2669 static void dib8000_set_dds(struct dib8000_state *state, s32 offset_khz)
2670 {
2671 	s16 unit_khz_dds_val;
2672 	u32 abs_offset_khz = ABS(offset_khz);
2673 	u32 dds = state->cfg.pll->ifreq & 0x1ffffff;
2674 	u8 invert = !!(state->cfg.pll->ifreq & (1 << 25));
2675 	u8 ratio;
2676 
2677 	if (state->revision == 0x8090) {
2678 		ratio = 4;
2679 		unit_khz_dds_val = (1<<26) / (dib8000_read32(state, 23) / 1000);
2680 		if (offset_khz < 0)
2681 			dds = (1 << 26) - (abs_offset_khz * unit_khz_dds_val);
2682 		else
2683 			dds = (abs_offset_khz * unit_khz_dds_val);
2684 
2685 		if (invert)
2686 			dds = (1<<26) - dds;
2687 	} else {
2688 		ratio = 2;
2689 		unit_khz_dds_val = (u16) (67108864 / state->cfg.pll->internal);
2690 
2691 		if (offset_khz < 0)
2692 			unit_khz_dds_val *= -1;
2693 
2694 		/* IF tuner */
2695 		if (invert)
2696 			dds -= abs_offset_khz * unit_khz_dds_val;
2697 		else
2698 			dds += abs_offset_khz * unit_khz_dds_val;
2699 	}
2700 
2701 	dprintk("setting a DDS frequency offset of %c%dkHz", invert ? '-' : ' ', dds / unit_khz_dds_val);
2702 
2703 	if (abs_offset_khz <= (state->cfg.pll->internal / ratio)) {
2704 		/* Max dds offset is the half of the demod freq */
2705 		dib8000_write_word(state, 26, invert);
2706 		dib8000_write_word(state, 27, (u16)(dds >> 16) & 0x1ff);
2707 		dib8000_write_word(state, 28, (u16)(dds & 0xffff));
2708 	}
2709 }
2710 
2711 static void dib8000_set_frequency_offset(struct dib8000_state *state)
2712 {
2713 	struct dtv_frontend_properties *c = &state->fe[0]->dtv_property_cache;
2714 	int i;
2715 	u32 current_rf;
2716 	int total_dds_offset_khz;
2717 
2718 	if (state->fe[0]->ops.tuner_ops.get_frequency)
2719 		state->fe[0]->ops.tuner_ops.get_frequency(state->fe[0], &current_rf);
2720 	else
2721 		current_rf = c->frequency;
2722 	current_rf /= 1000;
2723 	total_dds_offset_khz = (int)current_rf - (int)c->frequency / 1000;
2724 
2725 	if (c->isdbt_sb_mode) {
2726 		state->subchannel = c->isdbt_sb_subchannel;
2727 
2728 		i = dib8000_read_word(state, 26) & 1; /* P_dds_invspec */
2729 		dib8000_write_word(state, 26, c->inversion ^ i);
2730 
2731 		if (state->cfg.pll->ifreq == 0) { /* low if tuner */
2732 			if ((c->inversion ^ i) == 0)
2733 				dib8000_write_word(state, 26, dib8000_read_word(state, 26) | 1);
2734 		} else {
2735 			if ((c->inversion ^ i) == 0)
2736 				total_dds_offset_khz *= -1;
2737 		}
2738 	}
2739 
2740 	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);
2741 
2742 	/* apply dds offset now */
2743 	dib8000_set_dds(state, total_dds_offset_khz);
2744 }
2745 
2746 static u16 LUT_isdbt_symbol_duration[4] = { 26, 101, 63 };
2747 
2748 static u32 dib8000_get_symbol_duration(struct dib8000_state *state)
2749 {
2750 	struct dtv_frontend_properties *c = &state->fe[0]->dtv_property_cache;
2751 	u16 i;
2752 
2753 	switch (c->transmission_mode) {
2754 	case TRANSMISSION_MODE_2K:
2755 			i = 0;
2756 			break;
2757 	case TRANSMISSION_MODE_4K:
2758 			i = 2;
2759 			break;
2760 	default:
2761 	case TRANSMISSION_MODE_AUTO:
2762 	case TRANSMISSION_MODE_8K:
2763 			i = 1;
2764 			break;
2765 	}
2766 
2767 	return (LUT_isdbt_symbol_duration[i] / (c->bandwidth_hz / 1000)) + 1;
2768 }
2769 
2770 static void dib8000_set_isdbt_loop_params(struct dib8000_state *state, enum param_loop_step loop_step)
2771 {
2772 	struct dtv_frontend_properties *c = &state->fe[0]->dtv_property_cache;
2773 	u16 reg_32 = 0, reg_37 = 0;
2774 
2775 	switch (loop_step) {
2776 	case LOOP_TUNE_1:
2777 			if (c->isdbt_sb_mode)  {
2778 				if (c->isdbt_partial_reception == 0) {
2779 					reg_32 = ((11 - state->mode) << 12) | (6 << 8) | 0x40; /* P_timf_alpha = (11-P_mode), P_corm_alpha=6, P_corm_thres=0x40 */
2780 					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)  */
2781 				} else { /* Sound Broadcasting mode 3 seg */
2782 					reg_32 = ((10 - state->mode) << 12) | (6 << 8) | 0x60; /* P_timf_alpha = (10-P_mode), P_corm_alpha=6, P_corm_thres=0x60 */
2783 					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)  */
2784 				}
2785 			} else { /* 13-seg start conf offset loop parameters */
2786 				reg_32 = ((9 - state->mode) << 12) | (6 << 8) | 0x80; /* P_timf_alpha = (9-P_mode, P_corm_alpha=6, P_corm_thres=0x80 */
2787 				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  */
2788 			}
2789 			break;
2790 	case LOOP_TUNE_2:
2791 			if (c->isdbt_sb_mode)  {
2792 				if (c->isdbt_partial_reception == 0) {  /* Sound Broadcasting mode 1 seg */
2793 					reg_32 = ((13-state->mode) << 12) | (6 << 8) | 0x40; /* P_timf_alpha = (13-P_mode) , P_corm_alpha=6, P_corm_thres=0x40*/
2794 					reg_37 = (12-state->mode) | ((5 + state->mode) << 5);
2795 				} else {  /* Sound Broadcasting mode 3 seg */
2796 					reg_32 = ((12-state->mode) << 12) | (6 << 8) | 0x60; /* P_timf_alpha = (12-P_mode) , P_corm_alpha=6, P_corm_thres=0x60 */
2797 					reg_37 = (11-state->mode) | ((5 + state->mode) << 5);
2798 				}
2799 			} else {  /* 13 seg */
2800 				reg_32 = ((11-state->mode) << 12) | (6 << 8) | 0x80; /* P_timf_alpha = 8 , P_corm_alpha=6, P_corm_thres=0x80 */
2801 				reg_37 = ((5+state->mode) << 5) | (10 - state->mode);
2802 			}
2803 			break;
2804 	}
2805 	dib8000_write_word(state, 32, reg_32);
2806 	dib8000_write_word(state, 37, reg_37);
2807 }
2808 
2809 static void dib8000_demod_restart(struct dib8000_state *state)
2810 {
2811 	dib8000_write_word(state, 770, 0x4000);
2812 	dib8000_write_word(state, 770, 0x0000);
2813 	return;
2814 }
2815 
2816 static void dib8000_set_sync_wait(struct dib8000_state *state)
2817 {
2818 	struct dtv_frontend_properties *c = &state->fe[0]->dtv_property_cache;
2819 	u16 sync_wait = 64;
2820 
2821 	/* P_dvsy_sync_wait - reuse mode */
2822 	switch (c->transmission_mode) {
2823 	case TRANSMISSION_MODE_8K:
2824 			sync_wait = 256;
2825 			break;
2826 	case TRANSMISSION_MODE_4K:
2827 			sync_wait = 128;
2828 			break;
2829 	default:
2830 	case TRANSMISSION_MODE_2K:
2831 			sync_wait =  64;
2832 			break;
2833 	}
2834 
2835 	if (state->cfg.diversity_delay == 0)
2836 		sync_wait = (sync_wait * (1 << (c->guard_interval)) * 3) / 2 + 48; /* add 50% SFN margin + compensate for one DVSY-fifo */
2837 	else
2838 		sync_wait = (sync_wait * (1 << (c->guard_interval)) * 3) / 2 + state->cfg.diversity_delay; /* add 50% SFN margin + compensate for DVSY-fifo */
2839 
2840 	dib8000_write_word(state, 273, (dib8000_read_word(state, 273) & 0x000f) | (sync_wait << 4));
2841 }
2842 
2843 static unsigned long dib8000_get_timeout(struct dib8000_state *state, u32 delay, enum timeout_mode mode)
2844 {
2845 	if (mode == SYMBOL_DEPENDENT_ON)
2846 		delay *= state->symbol_duration;
2847 
2848 	return jiffies + usecs_to_jiffies(delay * 100);
2849 }
2850 
2851 static s32 dib8000_get_status(struct dvb_frontend *fe)
2852 {
2853 	struct dib8000_state *state = fe->demodulator_priv;
2854 	return state->status;
2855 }
2856 
2857 static enum frontend_tune_state dib8000_get_tune_state(struct dvb_frontend *fe)
2858 {
2859 	struct dib8000_state *state = fe->demodulator_priv;
2860 	return state->tune_state;
2861 }
2862 
2863 static int dib8000_set_tune_state(struct dvb_frontend *fe, enum frontend_tune_state tune_state)
2864 {
2865 	struct dib8000_state *state = fe->demodulator_priv;
2866 
2867 	state->tune_state = tune_state;
2868 	return 0;
2869 }
2870 
2871 static int dib8000_tune_restart_from_demod(struct dvb_frontend *fe)
2872 {
2873 	struct dib8000_state *state = fe->demodulator_priv;
2874 
2875 	state->status = FE_STATUS_TUNE_PENDING;
2876 	state->tune_state = CT_DEMOD_START;
2877 	return 0;
2878 }
2879 
2880 static u16 dib8000_read_lock(struct dvb_frontend *fe)
2881 {
2882 	struct dib8000_state *state = fe->demodulator_priv;
2883 
2884 	if (state->revision == 0x8090)
2885 		return dib8000_read_word(state, 570);
2886 	return dib8000_read_word(state, 568);
2887 }
2888 
2889 static int dib8090p_init_sdram(struct dib8000_state *state)
2890 {
2891 	u16 reg = 0;
2892 	dprintk("init sdram");
2893 
2894 	reg = dib8000_read_word(state, 274) & 0xfff0;
2895 	dib8000_write_word(state, 274, reg | 0x7); /* P_dintlv_delay_ram = 7 because of MobileSdram */
2896 
2897 	dib8000_write_word(state, 1803, (7 << 2));
2898 
2899 	reg = dib8000_read_word(state, 1280);
2900 	dib8000_write_word(state, 1280,  reg | (1 << 2)); /* force restart P_restart_sdram */
2901 	dib8000_write_word(state, 1280,  reg); /* release restart P_restart_sdram */
2902 
2903 	return 0;
2904 }
2905 
2906 /**
2907  * is_manual_mode - Check if TMCC should be used for parameters settings
2908  * @c:	struct dvb_frontend_properties
2909  *
2910  * By default, TMCC table should be used for parameter settings on most
2911  * usercases. However, sometimes it is desirable to lock the demod to
2912  * use the manual parameters.
2913  *
2914  * On manual mode, the current dib8000_tune state machine is very restrict:
2915  * It requires that both per-layer and per-transponder parameters to be
2916  * properly specified, otherwise the device won't lock.
2917  *
2918  * Check if all those conditions are properly satisfied before allowing
2919  * the device to use the manual frequency lock mode.
2920  */
2921 static int is_manual_mode(struct dtv_frontend_properties *c)
2922 {
2923 	int i, n_segs = 0;
2924 
2925 	/* Use auto mode on DVB-T compat mode */
2926 	if (c->delivery_system != SYS_ISDBT)
2927 		return 0;
2928 
2929 	/*
2930 	 * Transmission mode is only detected on auto mode, currently
2931 	 */
2932 	if (c->transmission_mode == TRANSMISSION_MODE_AUTO) {
2933 		dprintk("transmission mode auto");
2934 		return 0;
2935 	}
2936 
2937 	/*
2938 	 * Guard interval is only detected on auto mode, currently
2939 	 */
2940 	if (c->guard_interval == GUARD_INTERVAL_AUTO) {
2941 		dprintk("guard interval auto");
2942 		return 0;
2943 	}
2944 
2945 	/*
2946 	 * If no layer is enabled, assume auto mode, as at least one
2947 	 * layer should be enabled
2948 	 */
2949 	if (!c->isdbt_layer_enabled) {
2950 		dprintk("no layer modulation specified");
2951 		return 0;
2952 	}
2953 
2954 	/*
2955 	 * Check if the per-layer parameters aren't auto and
2956 	 * disable a layer if segment count is 0 or invalid.
2957 	 */
2958 	for (i = 0; i < 3; i++) {
2959 		if (!(c->isdbt_layer_enabled & 1 << i))
2960 			continue;
2961 
2962 		if ((c->layer[i].segment_count > 13) ||
2963 		    (c->layer[i].segment_count == 0)) {
2964 			c->isdbt_layer_enabled &= ~(1 << i);
2965 			continue;
2966 		}
2967 
2968 		n_segs += c->layer[i].segment_count;
2969 
2970 		if ((c->layer[i].modulation == QAM_AUTO) ||
2971 		    (c->layer[i].fec == FEC_AUTO)) {
2972 			dprintk("layer %c has either modulation or FEC auto",
2973 				'A' + i);
2974 			return 0;
2975 		}
2976 	}
2977 
2978 	/*
2979 	 * Userspace specified a wrong number of segments.
2980 	 *	fallback to auto mode.
2981 	 */
2982 	if (n_segs == 0 || n_segs > 13) {
2983 		dprintk("number of segments is invalid");
2984 		return 0;
2985 	}
2986 
2987 	/* Everything looks ok for manual mode */
2988 	return 1;
2989 }
2990 
2991 static int dib8000_tune(struct dvb_frontend *fe)
2992 {
2993 	struct dib8000_state *state = fe->demodulator_priv;
2994 	struct dtv_frontend_properties *c = &state->fe[0]->dtv_property_cache;
2995 	enum frontend_tune_state *tune_state = &state->tune_state;
2996 
2997 	u16 locks, deeper_interleaver = 0, i;
2998 	int ret = 1; /* 1 symbol duration (in 100us unit) delay most of the time */
2999 
3000 	unsigned long *timeout = &state->timeout;
3001 	unsigned long now = jiffies;
3002 #ifdef DIB8000_AGC_FREEZE
3003 	u16 agc1, agc2;
3004 #endif
3005 
3006 	u32 corm[4] = {0, 0, 0, 0};
3007 	u8 find_index, max_value;
3008 
3009 #if 0
3010 	if (*tune_state < CT_DEMOD_STOP)
3011 		dprintk("IN: context status = %d, TUNE_STATE %d autosearch step = %u jiffies = %lu",
3012 			state->channel_parameters_set, *tune_state, state->autosearch_state, now);
3013 #endif
3014 
3015 	switch (*tune_state) {
3016 	case CT_DEMOD_START: /* 30 */
3017 		dib8000_reset_stats(fe);
3018 
3019 		if (state->revision == 0x8090)
3020 			dib8090p_init_sdram(state);
3021 		state->status = FE_STATUS_TUNE_PENDING;
3022 		state->channel_parameters_set = is_manual_mode(c);
3023 
3024 		dprintk("Tuning channel on %s search mode",
3025 			state->channel_parameters_set ? "manual" : "auto");
3026 
3027 		dib8000_viterbi_state(state, 0); /* force chan dec in restart */
3028 
3029 		/* Layer monitor */
3030 		dib8000_write_word(state, 285, dib8000_read_word(state, 285) & 0x60);
3031 
3032 		dib8000_set_frequency_offset(state);
3033 		dib8000_set_bandwidth(fe, c->bandwidth_hz / 1000);
3034 
3035 		if (state->channel_parameters_set == 0) { /* The channel struct is unknown, search it ! */
3036 #ifdef DIB8000_AGC_FREEZE
3037 			if (state->revision != 0x8090) {
3038 				state->agc1_max = dib8000_read_word(state, 108);
3039 				state->agc1_min = dib8000_read_word(state, 109);
3040 				state->agc2_max = dib8000_read_word(state, 110);
3041 				state->agc2_min = dib8000_read_word(state, 111);
3042 				agc1 = dib8000_read_word(state, 388);
3043 				agc2 = dib8000_read_word(state, 389);
3044 				dib8000_write_word(state, 108, agc1);
3045 				dib8000_write_word(state, 109, agc1);
3046 				dib8000_write_word(state, 110, agc2);
3047 				dib8000_write_word(state, 111, agc2);
3048 			}
3049 #endif
3050 			state->autosearch_state = AS_SEARCHING_FFT;
3051 			state->found_nfft = TRANSMISSION_MODE_AUTO;
3052 			state->found_guard = GUARD_INTERVAL_AUTO;
3053 			*tune_state = CT_DEMOD_SEARCH_NEXT;
3054 		} else { /* we already know the channel struct so TUNE only ! */
3055 			state->autosearch_state = AS_DONE;
3056 			*tune_state = CT_DEMOD_STEP_3;
3057 		}
3058 		state->symbol_duration = dib8000_get_symbol_duration(state);
3059 		break;
3060 
3061 	case CT_DEMOD_SEARCH_NEXT: /* 51 */
3062 		dib8000_autosearch_start(fe);
3063 		if (state->revision == 0x8090)
3064 			ret = 50;
3065 		else
3066 			ret = 15;
3067 		*tune_state = CT_DEMOD_STEP_1;
3068 		break;
3069 
3070 	case CT_DEMOD_STEP_1: /* 31 */
3071 		switch (dib8000_autosearch_irq(fe)) {
3072 		case 1: /* fail */
3073 			state->status = FE_STATUS_TUNE_FAILED;
3074 			state->autosearch_state = AS_DONE;
3075 			*tune_state = CT_DEMOD_STOP; /* else we are done here */
3076 			break;
3077 		case 2: /* Succes */
3078 			state->status = FE_STATUS_FFT_SUCCESS; /* signal to the upper layer, that there was a channel found and the parameters can be read */
3079 			*tune_state = CT_DEMOD_STEP_3;
3080 			if (state->autosearch_state == AS_SEARCHING_GUARD)
3081 				*tune_state = CT_DEMOD_STEP_2;
3082 			else
3083 				state->autosearch_state = AS_DONE;
3084 			break;
3085 		case 3: /* Autosearch FFT max correlation endded */
3086 			*tune_state = CT_DEMOD_STEP_2;
3087 			break;
3088 		}
3089 		break;
3090 
3091 	case CT_DEMOD_STEP_2:
3092 		switch (state->autosearch_state) {
3093 		case AS_SEARCHING_FFT:
3094 			/* searching for the correct FFT */
3095 			if (state->revision == 0x8090) {
3096 				corm[2] = (dib8000_read_word(state, 596) << 16) | (dib8000_read_word(state, 597));
3097 				corm[1] = (dib8000_read_word(state, 598) << 16) | (dib8000_read_word(state, 599));
3098 				corm[0] = (dib8000_read_word(state, 600) << 16) | (dib8000_read_word(state, 601));
3099 			} else {
3100 				corm[2] = (dib8000_read_word(state, 594) << 16) | (dib8000_read_word(state, 595));
3101 				corm[1] = (dib8000_read_word(state, 596) << 16) | (dib8000_read_word(state, 597));
3102 				corm[0] = (dib8000_read_word(state, 598) << 16) | (dib8000_read_word(state, 599));
3103 			}
3104 			/* dprintk("corm fft: %u %u %u", corm[0], corm[1], corm[2]); */
3105 
3106 			max_value = 0;
3107 			for (find_index = 1 ; find_index < 3 ; find_index++) {
3108 				if (corm[max_value] < corm[find_index])
3109 					max_value = find_index ;
3110 			}
3111 
3112 			switch (max_value) {
3113 			case 0:
3114 				state->found_nfft = TRANSMISSION_MODE_2K;
3115 				break;
3116 			case 1:
3117 				state->found_nfft = TRANSMISSION_MODE_4K;
3118 				break;
3119 			case 2:
3120 			default:
3121 				state->found_nfft = TRANSMISSION_MODE_8K;
3122 				break;
3123 			}
3124 			/* dprintk("Autosearch FFT has found Mode %d", max_value + 1); */
3125 
3126 			*tune_state = CT_DEMOD_SEARCH_NEXT;
3127 			state->autosearch_state = AS_SEARCHING_GUARD;
3128 			if (state->revision == 0x8090)
3129 				ret = 50;
3130 			else
3131 				ret = 10;
3132 			break;
3133 		case AS_SEARCHING_GUARD:
3134 			/* searching for the correct guard interval */
3135 			if (state->revision == 0x8090)
3136 				state->found_guard = dib8000_read_word(state, 572) & 0x3;
3137 			else
3138 				state->found_guard = dib8000_read_word(state, 570) & 0x3;
3139 			/* dprintk("guard interval found=%i", state->found_guard); */
3140 
3141 			*tune_state = CT_DEMOD_STEP_3;
3142 			break;
3143 		default:
3144 			/* the demod should never be in this state */
3145 			state->status = FE_STATUS_TUNE_FAILED;
3146 			state->autosearch_state = AS_DONE;
3147 			*tune_state = CT_DEMOD_STOP; /* else we are done here */
3148 			break;
3149 		}
3150 		break;
3151 
3152 	case CT_DEMOD_STEP_3: /* 33 */
3153 		dib8000_set_isdbt_loop_params(state, LOOP_TUNE_1);
3154 		dib8000_set_isdbt_common_channel(state, 0, 0);/* setting the known channel parameters here */
3155 		*tune_state = CT_DEMOD_STEP_4;
3156 		break;
3157 
3158 	case CT_DEMOD_STEP_4: /* (34) */
3159 		dib8000_demod_restart(state);
3160 
3161 		dib8000_set_sync_wait(state);
3162 		dib8000_set_diversity_in(state->fe[0], state->diversity_onoff);
3163 
3164 		locks = (dib8000_read_word(state, 180) >> 6) & 0x3f; /* P_coff_winlen ? */
3165 		/* coff should lock over P_coff_winlen ofdm symbols : give 3 times this length to lock */
3166 		*timeout = dib8000_get_timeout(state, 2 * locks, SYMBOL_DEPENDENT_ON);
3167 		*tune_state = CT_DEMOD_STEP_5;
3168 		break;
3169 
3170 	case CT_DEMOD_STEP_5: /* (35) */
3171 		locks = dib8000_read_lock(fe);
3172 		if (locks & (0x3 << 11)) { /* coff-lock and off_cpil_lock achieved */
3173 			dib8000_update_timf(state); /* we achieved a coff_cpil_lock - it's time to update the timf */
3174 			if (!state->differential_constellation) {
3175 				/* 2 times lmod4_win_len + 10 symbols (pipe delay after coff + nb to compute a 1st correlation) */
3176 				*timeout = dib8000_get_timeout(state, (20 * ((dib8000_read_word(state, 188)>>5)&0x1f)), SYMBOL_DEPENDENT_ON);
3177 				*tune_state = CT_DEMOD_STEP_7;
3178 			} else {
3179 				*tune_state = CT_DEMOD_STEP_8;
3180 			}
3181 		} else if (time_after(now, *timeout)) {
3182 			*tune_state = CT_DEMOD_STEP_6; /* goto check for diversity input connection */
3183 		}
3184 		break;
3185 
3186 	case CT_DEMOD_STEP_6: /* (36)  if there is an input (diversity) */
3187 		if ((state->fe[1] != NULL) && (state->output_mode != OUTMODE_DIVERSITY)) {
3188 			/* 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 */
3189 			if (dib8000_get_status(state->fe[1]) <= FE_STATUS_STD_SUCCESS) /* Something is locked on the input fe */
3190 				*tune_state = CT_DEMOD_STEP_8; /* go for mpeg */
3191 			else if (dib8000_get_status(state->fe[1]) >= FE_STATUS_TUNE_TIME_TOO_SHORT) { /* fe in input failled also, break the current one */
3192 				*tune_state = CT_DEMOD_STOP; /* else we are done here ; step 8 will close the loops and exit */
3193 				dib8000_viterbi_state(state, 1); /* start viterbi chandec */
3194 				dib8000_set_isdbt_loop_params(state, LOOP_TUNE_2);
3195 				state->status = FE_STATUS_TUNE_FAILED;
3196 			}
3197 		} else {
3198 			dib8000_viterbi_state(state, 1); /* start viterbi chandec */
3199 			dib8000_set_isdbt_loop_params(state, LOOP_TUNE_2);
3200 			*tune_state = CT_DEMOD_STOP; /* else we are done here ; step 8 will close the loops and exit */
3201 			state->status = FE_STATUS_TUNE_FAILED;
3202 		}
3203 		break;
3204 
3205 	case CT_DEMOD_STEP_7: /* 37 */
3206 		locks = dib8000_read_lock(fe);
3207 		if (locks & (1<<10)) { /* lmod4_lock */
3208 			ret = 14; /* wait for 14 symbols */
3209 			*tune_state = CT_DEMOD_STEP_8;
3210 		} else if (time_after(now, *timeout))
3211 			*tune_state = CT_DEMOD_STEP_6; /* goto check for diversity input connection */
3212 		break;
3213 
3214 	case CT_DEMOD_STEP_8: /* 38 */
3215 		dib8000_viterbi_state(state, 1); /* start viterbi chandec */
3216 		dib8000_set_isdbt_loop_params(state, LOOP_TUNE_2);
3217 
3218 		/* mpeg will never lock on this condition because init_prbs is not set : search for it !*/
3219 		if (c->isdbt_sb_mode
3220 		    && c->isdbt_sb_subchannel < 14
3221 		    && !state->differential_constellation) {
3222 			state->subchannel = 0;
3223 			*tune_state = CT_DEMOD_STEP_11;
3224 		} else {
3225 			*tune_state = CT_DEMOD_STEP_9;
3226 			state->status = FE_STATUS_LOCKED;
3227 		}
3228 		break;
3229 
3230 	case CT_DEMOD_STEP_9: /* 39 */
3231 		if ((state->revision == 0x8090) || ((dib8000_read_word(state, 1291) >> 9) & 0x1)) { /* fe capable of deinterleaving : esram */
3232 			/* defines timeout for mpeg lock depending on interleaver length of longest layer */
3233 			for (i = 0; i < 3; i++) {
3234 				if (c->layer[i].interleaving >= deeper_interleaver) {
3235 					dprintk("layer%i: time interleaver = %d ", i, c->layer[i].interleaving);
3236 					if (c->layer[i].segment_count > 0) { /* valid layer */
3237 						deeper_interleaver = c->layer[0].interleaving;
3238 						state->longest_intlv_layer = i;
3239 					}
3240 				}
3241 			}
3242 
3243 			if (deeper_interleaver == 0)
3244 				locks = 2; /* locks is the tmp local variable name */
3245 			else if (deeper_interleaver == 3)
3246 				locks = 8;
3247 			else
3248 				locks = 2 * deeper_interleaver;
3249 
3250 			if (state->diversity_onoff != 0) /* because of diversity sync */
3251 				locks *= 2;
3252 
3253 			*timeout = now + msecs_to_jiffies(200 * locks); /* give the mpeg lock 800ms if sram is present */
3254 			dprintk("Deeper interleaver mode = %d on layer %d : timeout mult factor = %d => will use timeout = %ld",
3255 				deeper_interleaver, state->longest_intlv_layer, locks, *timeout);
3256 
3257 			*tune_state = CT_DEMOD_STEP_10;
3258 		} else
3259 			*tune_state = CT_DEMOD_STOP;
3260 		break;
3261 
3262 	case CT_DEMOD_STEP_10: /* 40 */
3263 		locks = dib8000_read_lock(fe);
3264 		if (locks&(1<<(7-state->longest_intlv_layer))) { /* mpeg lock : check the longest one */
3265 			dprintk("ISDB-T layer locks: Layer A %s, Layer B %s, Layer C %s",
3266 				c->layer[0].segment_count ? (locks >> 7) & 0x1 ? "locked" : "NOT LOCKED" : "not enabled",
3267 				c->layer[1].segment_count ? (locks >> 6) & 0x1 ? "locked" : "NOT LOCKED" : "not enabled",
3268 				c->layer[2].segment_count ? (locks >> 5) & 0x1 ? "locked" : "NOT LOCKED" : "not enabled");
3269 			if (c->isdbt_sb_mode
3270 			    && c->isdbt_sb_subchannel < 14
3271 			    && !state->differential_constellation)
3272 				/* signal to the upper layer, that there was a channel found and the parameters can be read */
3273 				state->status = FE_STATUS_DEMOD_SUCCESS;
3274 			else
3275 				state->status = FE_STATUS_DATA_LOCKED;
3276 			*tune_state = CT_DEMOD_STOP;
3277 		} else if (time_after(now, *timeout)) {
3278 			if (c->isdbt_sb_mode
3279 			    && c->isdbt_sb_subchannel < 14
3280 			    && !state->differential_constellation) { /* continue to try init prbs autosearch */
3281 				state->subchannel += 3;
3282 				*tune_state = CT_DEMOD_STEP_11;
3283 			} 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 */
3284 				if (locks & (0x7 << 5)) {
3285 					dprintk("Not all ISDB-T layers locked in %d ms: Layer A %s, Layer B %s, Layer C %s",
3286 						jiffies_to_msecs(now - *timeout),
3287 						c->layer[0].segment_count ? (locks >> 7) & 0x1 ? "locked" : "NOT LOCKED" : "not enabled",
3288 						c->layer[1].segment_count ? (locks >> 6) & 0x1 ? "locked" : "NOT LOCKED" : "not enabled",
3289 						c->layer[2].segment_count ? (locks >> 5) & 0x1 ? "locked" : "NOT LOCKED" : "not enabled");
3290 
3291 					state->status = FE_STATUS_DATA_LOCKED;
3292 				} else
3293 					state->status = FE_STATUS_TUNE_FAILED;
3294 				*tune_state = CT_DEMOD_STOP;
3295 			}
3296 		}
3297 		break;
3298 
3299 	case CT_DEMOD_STEP_11:  /* 41 : init prbs autosearch */
3300 		if (state->subchannel <= 41) {
3301 			dib8000_set_subchannel_prbs(state, dib8000_get_init_prbs(state, state->subchannel));
3302 			*tune_state = CT_DEMOD_STEP_9;
3303 		} else {
3304 			*tune_state = CT_DEMOD_STOP;
3305 			state->status = FE_STATUS_TUNE_FAILED;
3306 		}
3307 		break;
3308 
3309 	default:
3310 		break;
3311 	}
3312 
3313 	/* tuning is finished - cleanup the demod */
3314 	switch (*tune_state) {
3315 	case CT_DEMOD_STOP: /* (42) */
3316 #ifdef DIB8000_AGC_FREEZE
3317 		if ((state->revision != 0x8090) && (state->agc1_max != 0)) {
3318 			dib8000_write_word(state, 108, state->agc1_max);
3319 			dib8000_write_word(state, 109, state->agc1_min);
3320 			dib8000_write_word(state, 110, state->agc2_max);
3321 			dib8000_write_word(state, 111, state->agc2_min);
3322 			state->agc1_max = 0;
3323 			state->agc1_min = 0;
3324 			state->agc2_max = 0;
3325 			state->agc2_min = 0;
3326 		}
3327 #endif
3328 		ret = 0;
3329 		break;
3330 	default:
3331 		break;
3332 	}
3333 
3334 	if ((ret > 0) && (*tune_state > CT_DEMOD_STEP_3))
3335 		return ret * state->symbol_duration;
3336 	if ((ret > 0) && (ret < state->symbol_duration))
3337 		return state->symbol_duration; /* at least one symbol */
3338 	return ret;
3339 }
3340 
3341 static int dib8000_wakeup(struct dvb_frontend *fe)
3342 {
3343 	struct dib8000_state *state = fe->demodulator_priv;
3344 	u8 index_frontend;
3345 	int ret;
3346 
3347 	dib8000_set_power_mode(state, DIB8000_POWER_ALL);
3348 	dib8000_set_adc_state(state, DIBX000_ADC_ON);
3349 	if (dib8000_set_adc_state(state, DIBX000_SLOW_ADC_ON) != 0)
3350 		dprintk("could not start Slow ADC");
3351 
3352 	if (state->revision == 0x8090)
3353 		dib8000_sad_calib(state);
3354 
3355 	for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
3356 		ret = state->fe[index_frontend]->ops.init(state->fe[index_frontend]);
3357 		if (ret < 0)
3358 			return ret;
3359 	}
3360 
3361 	return 0;
3362 }
3363 
3364 static int dib8000_sleep(struct dvb_frontend *fe)
3365 {
3366 	struct dib8000_state *state = fe->demodulator_priv;
3367 	u8 index_frontend;
3368 	int ret;
3369 
3370 	for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
3371 		ret = state->fe[index_frontend]->ops.sleep(state->fe[index_frontend]);
3372 		if (ret < 0)
3373 			return ret;
3374 	}
3375 
3376 	if (state->revision != 0x8090)
3377 		dib8000_set_output_mode(fe, OUTMODE_HIGH_Z);
3378 	dib8000_set_power_mode(state, DIB8000_POWER_INTERFACE_ONLY);
3379 	return dib8000_set_adc_state(state, DIBX000_SLOW_ADC_OFF) | dib8000_set_adc_state(state, DIBX000_ADC_OFF);
3380 }
3381 
3382 static int dib8000_read_status(struct dvb_frontend *fe, fe_status_t * stat);
3383 
3384 static int dib8000_get_frontend(struct dvb_frontend *fe)
3385 {
3386 	struct dib8000_state *state = fe->demodulator_priv;
3387 	u16 i, val = 0;
3388 	fe_status_t stat = 0;
3389 	u8 index_frontend, sub_index_frontend;
3390 
3391 	fe->dtv_property_cache.bandwidth_hz = 6000000;
3392 
3393 	/*
3394 	 * If called to early, get_frontend makes dib8000_tune to either
3395 	 * not lock or not sync. This causes dvbv5-scan/dvbv5-zap to fail.
3396 	 * So, let's just return if frontend 0 has not locked.
3397 	 */
3398 	dib8000_read_status(fe, &stat);
3399 	if (!(stat & FE_HAS_SYNC))
3400 		return 0;
3401 
3402 	dprintk("dib8000_get_frontend: TMCC lock");
3403 	for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
3404 		state->fe[index_frontend]->ops.read_status(state->fe[index_frontend], &stat);
3405 		if (stat&FE_HAS_SYNC) {
3406 			dprintk("TMCC lock on the slave%i", index_frontend);
3407 			/* synchronize the cache with the other frontends */
3408 			state->fe[index_frontend]->ops.get_frontend(state->fe[index_frontend]);
3409 			for (sub_index_frontend = 0; (sub_index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[sub_index_frontend] != NULL); sub_index_frontend++) {
3410 				if (sub_index_frontend != index_frontend) {
3411 					state->fe[sub_index_frontend]->dtv_property_cache.isdbt_sb_mode = state->fe[index_frontend]->dtv_property_cache.isdbt_sb_mode;
3412 					state->fe[sub_index_frontend]->dtv_property_cache.inversion = state->fe[index_frontend]->dtv_property_cache.inversion;
3413 					state->fe[sub_index_frontend]->dtv_property_cache.transmission_mode = state->fe[index_frontend]->dtv_property_cache.transmission_mode;
3414 					state->fe[sub_index_frontend]->dtv_property_cache.guard_interval = state->fe[index_frontend]->dtv_property_cache.guard_interval;
3415 					state->fe[sub_index_frontend]->dtv_property_cache.isdbt_partial_reception = state->fe[index_frontend]->dtv_property_cache.isdbt_partial_reception;
3416 					for (i = 0; i < 3; i++) {
3417 						state->fe[sub_index_frontend]->dtv_property_cache.layer[i].segment_count = state->fe[index_frontend]->dtv_property_cache.layer[i].segment_count;
3418 						state->fe[sub_index_frontend]->dtv_property_cache.layer[i].interleaving = state->fe[index_frontend]->dtv_property_cache.layer[i].interleaving;
3419 						state->fe[sub_index_frontend]->dtv_property_cache.layer[i].fec = state->fe[index_frontend]->dtv_property_cache.layer[i].fec;
3420 						state->fe[sub_index_frontend]->dtv_property_cache.layer[i].modulation = state->fe[index_frontend]->dtv_property_cache.layer[i].modulation;
3421 					}
3422 				}
3423 			}
3424 			return 0;
3425 		}
3426 	}
3427 
3428 	fe->dtv_property_cache.isdbt_sb_mode = dib8000_read_word(state, 508) & 0x1;
3429 
3430 	if (state->revision == 0x8090)
3431 		val = dib8000_read_word(state, 572);
3432 	else
3433 		val = dib8000_read_word(state, 570);
3434 	fe->dtv_property_cache.inversion = (val & 0x40) >> 6;
3435 	switch ((val & 0x30) >> 4) {
3436 	case 1:
3437 		fe->dtv_property_cache.transmission_mode = TRANSMISSION_MODE_2K;
3438 		dprintk("dib8000_get_frontend: transmission mode 2K");
3439 		break;
3440 	case 2:
3441 		fe->dtv_property_cache.transmission_mode = TRANSMISSION_MODE_4K;
3442 		dprintk("dib8000_get_frontend: transmission mode 4K");
3443 		break;
3444 	case 3:
3445 	default:
3446 		fe->dtv_property_cache.transmission_mode = TRANSMISSION_MODE_8K;
3447 		dprintk("dib8000_get_frontend: transmission mode 8K");
3448 		break;
3449 	}
3450 
3451 	switch (val & 0x3) {
3452 	case 0:
3453 		fe->dtv_property_cache.guard_interval = GUARD_INTERVAL_1_32;
3454 		dprintk("dib8000_get_frontend: Guard Interval = 1/32 ");
3455 		break;
3456 	case 1:
3457 		fe->dtv_property_cache.guard_interval = GUARD_INTERVAL_1_16;
3458 		dprintk("dib8000_get_frontend: Guard Interval = 1/16 ");
3459 		break;
3460 	case 2:
3461 		dprintk("dib8000_get_frontend: Guard Interval = 1/8 ");
3462 		fe->dtv_property_cache.guard_interval = GUARD_INTERVAL_1_8;
3463 		break;
3464 	case 3:
3465 		dprintk("dib8000_get_frontend: Guard Interval = 1/4 ");
3466 		fe->dtv_property_cache.guard_interval = GUARD_INTERVAL_1_4;
3467 		break;
3468 	}
3469 
3470 	val = dib8000_read_word(state, 505);
3471 	fe->dtv_property_cache.isdbt_partial_reception = val & 1;
3472 	dprintk("dib8000_get_frontend: partial_reception = %d ", fe->dtv_property_cache.isdbt_partial_reception);
3473 
3474 	for (i = 0; i < 3; i++) {
3475 		int show;
3476 
3477 		val = dib8000_read_word(state, 493 + i) & 0x0f;
3478 		fe->dtv_property_cache.layer[i].segment_count = val;
3479 
3480 		if (val == 0 || val > 13)
3481 			show = 0;
3482 		else
3483 			show = 1;
3484 
3485 		if (show)
3486 			dprintk("dib8000_get_frontend: Layer %d segments = %d ",
3487 				i, fe->dtv_property_cache.layer[i].segment_count);
3488 
3489 		val = dib8000_read_word(state, 499 + i) & 0x3;
3490 		/* Interleaving can be 0, 1, 2 or 4 */
3491 		if (val == 3)
3492 			val = 4;
3493 		fe->dtv_property_cache.layer[i].interleaving = val;
3494 		if (show)
3495 			dprintk("dib8000_get_frontend: Layer %d time_intlv = %d ",
3496 				i, fe->dtv_property_cache.layer[i].interleaving);
3497 
3498 		val = dib8000_read_word(state, 481 + i);
3499 		switch (val & 0x7) {
3500 		case 1:
3501 			fe->dtv_property_cache.layer[i].fec = FEC_1_2;
3502 			if (show)
3503 				dprintk("dib8000_get_frontend: Layer %d Code Rate = 1/2 ", i);
3504 			break;
3505 		case 2:
3506 			fe->dtv_property_cache.layer[i].fec = FEC_2_3;
3507 			if (show)
3508 				dprintk("dib8000_get_frontend: Layer %d Code Rate = 2/3 ", i);
3509 			break;
3510 		case 3:
3511 			fe->dtv_property_cache.layer[i].fec = FEC_3_4;
3512 			if (show)
3513 				dprintk("dib8000_get_frontend: Layer %d Code Rate = 3/4 ", i);
3514 			break;
3515 		case 5:
3516 			fe->dtv_property_cache.layer[i].fec = FEC_5_6;
3517 			if (show)
3518 				dprintk("dib8000_get_frontend: Layer %d Code Rate = 5/6 ", i);
3519 			break;
3520 		default:
3521 			fe->dtv_property_cache.layer[i].fec = FEC_7_8;
3522 			if (show)
3523 				dprintk("dib8000_get_frontend: Layer %d Code Rate = 7/8 ", i);
3524 			break;
3525 		}
3526 
3527 		val = dib8000_read_word(state, 487 + i);
3528 		switch (val & 0x3) {
3529 		case 0:
3530 			fe->dtv_property_cache.layer[i].modulation = DQPSK;
3531 			if (show)
3532 				dprintk("dib8000_get_frontend: Layer %d DQPSK ", i);
3533 			break;
3534 		case 1:
3535 			fe->dtv_property_cache.layer[i].modulation = QPSK;
3536 			if (show)
3537 				dprintk("dib8000_get_frontend: Layer %d QPSK ", i);
3538 			break;
3539 		case 2:
3540 			fe->dtv_property_cache.layer[i].modulation = QAM_16;
3541 			if (show)
3542 				dprintk("dib8000_get_frontend: Layer %d QAM16 ", i);
3543 			break;
3544 		case 3:
3545 		default:
3546 			fe->dtv_property_cache.layer[i].modulation = QAM_64;
3547 			if (show)
3548 				dprintk("dib8000_get_frontend: Layer %d QAM64 ", i);
3549 			break;
3550 		}
3551 	}
3552 
3553 	/* synchronize the cache with the other frontends */
3554 	for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
3555 		state->fe[index_frontend]->dtv_property_cache.isdbt_sb_mode = fe->dtv_property_cache.isdbt_sb_mode;
3556 		state->fe[index_frontend]->dtv_property_cache.inversion = fe->dtv_property_cache.inversion;
3557 		state->fe[index_frontend]->dtv_property_cache.transmission_mode = fe->dtv_property_cache.transmission_mode;
3558 		state->fe[index_frontend]->dtv_property_cache.guard_interval = fe->dtv_property_cache.guard_interval;
3559 		state->fe[index_frontend]->dtv_property_cache.isdbt_partial_reception = fe->dtv_property_cache.isdbt_partial_reception;
3560 		for (i = 0; i < 3; i++) {
3561 			state->fe[index_frontend]->dtv_property_cache.layer[i].segment_count = fe->dtv_property_cache.layer[i].segment_count;
3562 			state->fe[index_frontend]->dtv_property_cache.layer[i].interleaving = fe->dtv_property_cache.layer[i].interleaving;
3563 			state->fe[index_frontend]->dtv_property_cache.layer[i].fec = fe->dtv_property_cache.layer[i].fec;
3564 			state->fe[index_frontend]->dtv_property_cache.layer[i].modulation = fe->dtv_property_cache.layer[i].modulation;
3565 		}
3566 	}
3567 	return 0;
3568 }
3569 
3570 static int dib8000_set_frontend(struct dvb_frontend *fe)
3571 {
3572 	struct dib8000_state *state = fe->demodulator_priv;
3573 	struct dtv_frontend_properties *c = &state->fe[0]->dtv_property_cache;
3574 	int l, i, active, time, time_slave = 0;
3575 	u8 exit_condition, index_frontend;
3576 	unsigned long delay, callback_time;
3577 
3578 	if (c->frequency == 0) {
3579 		dprintk("dib8000: must at least specify frequency ");
3580 		return 0;
3581 	}
3582 
3583 	if (c->bandwidth_hz == 0) {
3584 		dprintk("dib8000: no bandwidth specified, set to default ");
3585 		c->bandwidth_hz = 6000000;
3586 	}
3587 
3588 	for (index_frontend = 0; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
3589 		/* synchronization of the cache */
3590 		state->fe[index_frontend]->dtv_property_cache.delivery_system = SYS_ISDBT;
3591 		memcpy(&state->fe[index_frontend]->dtv_property_cache, &fe->dtv_property_cache, sizeof(struct dtv_frontend_properties));
3592 
3593 		/* set output mode and diversity input */
3594 		if (state->revision != 0x8090) {
3595 			dib8000_set_diversity_in(state->fe[index_frontend], 1);
3596 			if (index_frontend != 0)
3597 				dib8000_set_output_mode(state->fe[index_frontend],
3598 						OUTMODE_DIVERSITY);
3599 			else
3600 				dib8000_set_output_mode(state->fe[0], OUTMODE_HIGH_Z);
3601 		} else {
3602 			dib8096p_set_diversity_in(state->fe[index_frontend], 1);
3603 			if (index_frontend != 0)
3604 				dib8096p_set_output_mode(state->fe[index_frontend],
3605 						OUTMODE_DIVERSITY);
3606 			else
3607 				dib8096p_set_output_mode(state->fe[0], OUTMODE_HIGH_Z);
3608 		}
3609 
3610 		/* tune the tuner */
3611 		if (state->fe[index_frontend]->ops.tuner_ops.set_params)
3612 			state->fe[index_frontend]->ops.tuner_ops.set_params(state->fe[index_frontend]);
3613 
3614 		dib8000_set_tune_state(state->fe[index_frontend], CT_AGC_START);
3615 	}
3616 
3617 	/* turn off the diversity of the last chip */
3618 	if (state->revision != 0x8090)
3619 		dib8000_set_diversity_in(state->fe[index_frontend - 1], 0);
3620 	else
3621 		dib8096p_set_diversity_in(state->fe[index_frontend - 1], 0);
3622 
3623 	/* start up the AGC */
3624 	do {
3625 		time = dib8000_agc_startup(state->fe[0]);
3626 		for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
3627 			time_slave = dib8000_agc_startup(state->fe[index_frontend]);
3628 			if (time == 0)
3629 				time = time_slave;
3630 			else if ((time_slave != 0) && (time_slave > time))
3631 				time = time_slave;
3632 		}
3633 		if (time == 0)
3634 			break;
3635 
3636 		/*
3637 		 * Despite dib8000_agc_startup returns time at a 0.1 ms range,
3638 		 * the actual sleep time depends on CONFIG_HZ. The worse case
3639 		 * is when CONFIG_HZ=100. In such case, the minimum granularity
3640 		 * is 10ms. On some real field tests, the tuner sometimes don't
3641 		 * lock when this timer is lower than 10ms. So, enforce a 10ms
3642 		 * granularity.
3643 		 */
3644 		time = 10 * (time + 99)/100;
3645 		usleep_range(time * 1000, (time + 1) * 1000);
3646 		exit_condition = 1;
3647 		for (index_frontend = 0; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
3648 			if (dib8000_get_tune_state(state->fe[index_frontend]) != CT_AGC_STOP) {
3649 				exit_condition = 0;
3650 				break;
3651 			}
3652 		}
3653 	} while (exit_condition == 0);
3654 
3655 	for (index_frontend = 0; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++)
3656 		dib8000_set_tune_state(state->fe[index_frontend], CT_DEMOD_START);
3657 
3658 	active = 1;
3659 	do {
3660 		callback_time = 0;
3661 		for (index_frontend = 0; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
3662 			delay = dib8000_tune(state->fe[index_frontend]);
3663 			if (delay != 0) {
3664 				delay = jiffies + usecs_to_jiffies(100 * delay);
3665 				if (!callback_time || delay < callback_time)
3666 					callback_time = delay;
3667 			}
3668 
3669 			/* we are in autosearch */
3670 			if (state->channel_parameters_set == 0) { /* searching */
3671 				if ((dib8000_get_status(state->fe[index_frontend]) == FE_STATUS_DEMOD_SUCCESS) || (dib8000_get_status(state->fe[index_frontend]) == FE_STATUS_FFT_SUCCESS)) {
3672 					dprintk("autosearch succeeded on fe%i", index_frontend);
3673 					dib8000_get_frontend(state->fe[index_frontend]); /* we read the channel parameters from the frontend which was successful */
3674 					state->channel_parameters_set = 1;
3675 
3676 					for (l = 0; (l < MAX_NUMBER_OF_FRONTENDS) && (state->fe[l] != NULL); l++) {
3677 						if (l != index_frontend) { /* and for all frontend except the successful one */
3678 							dprintk("Restarting frontend %d\n", l);
3679 							dib8000_tune_restart_from_demod(state->fe[l]);
3680 
3681 							state->fe[l]->dtv_property_cache.isdbt_sb_mode = state->fe[index_frontend]->dtv_property_cache.isdbt_sb_mode;
3682 							state->fe[l]->dtv_property_cache.inversion = state->fe[index_frontend]->dtv_property_cache.inversion;
3683 							state->fe[l]->dtv_property_cache.transmission_mode = state->fe[index_frontend]->dtv_property_cache.transmission_mode;
3684 							state->fe[l]->dtv_property_cache.guard_interval = state->fe[index_frontend]->dtv_property_cache.guard_interval;
3685 							state->fe[l]->dtv_property_cache.isdbt_partial_reception = state->fe[index_frontend]->dtv_property_cache.isdbt_partial_reception;
3686 							for (i = 0; i < 3; i++) {
3687 								state->fe[l]->dtv_property_cache.layer[i].segment_count = state->fe[index_frontend]->dtv_property_cache.layer[i].segment_count;
3688 								state->fe[l]->dtv_property_cache.layer[i].interleaving = state->fe[index_frontend]->dtv_property_cache.layer[i].interleaving;
3689 								state->fe[l]->dtv_property_cache.layer[i].fec = state->fe[index_frontend]->dtv_property_cache.layer[i].fec;
3690 								state->fe[l]->dtv_property_cache.layer[i].modulation = state->fe[index_frontend]->dtv_property_cache.layer[i].modulation;
3691 							}
3692 
3693 						}
3694 					}
3695 				}
3696 			}
3697 		}
3698 		/* tuning is done when the master frontend is done (failed or success) */
3699 		if (dib8000_get_status(state->fe[0]) == FE_STATUS_TUNE_FAILED ||
3700 				dib8000_get_status(state->fe[0]) == FE_STATUS_LOCKED ||
3701 				dib8000_get_status(state->fe[0]) == FE_STATUS_DATA_LOCKED) {
3702 			active = 0;
3703 			/* we need to wait for all frontends to be finished */
3704 			for (index_frontend = 0; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
3705 				if (dib8000_get_tune_state(state->fe[index_frontend]) != CT_DEMOD_STOP)
3706 					active = 1;
3707 			}
3708 			if (active == 0)
3709 				dprintk("tuning done with status %d", dib8000_get_status(state->fe[0]));
3710 		}
3711 
3712 		if ((active == 1) && (callback_time == 0)) {
3713 			dprintk("strange callback time something went wrong");
3714 			active = 0;
3715 		}
3716 
3717 		while ((active == 1) && (time_before(jiffies, callback_time)))
3718 			msleep(100);
3719 	} while (active);
3720 
3721 	/* set output mode */
3722 	if (state->revision != 0x8090)
3723 		dib8000_set_output_mode(state->fe[0], state->cfg.output_mode);
3724 	else {
3725 		dib8096p_set_output_mode(state->fe[0], state->cfg.output_mode);
3726 		if (state->cfg.enMpegOutput == 0) {
3727 			dib8096p_setDibTxMux(state, MPEG_ON_DIBTX);
3728 			dib8096p_setHostBusMux(state, DIBTX_ON_HOSTBUS);
3729 		}
3730 	}
3731 
3732 	return 0;
3733 }
3734 
3735 static int dib8000_get_stats(struct dvb_frontend *fe, fe_status_t stat);
3736 
3737 static int dib8000_read_status(struct dvb_frontend *fe, fe_status_t * stat)
3738 {
3739 	struct dib8000_state *state = fe->demodulator_priv;
3740 	u16 lock_slave = 0, lock;
3741 	u8 index_frontend;
3742 
3743 	lock = dib8000_read_lock(fe);
3744 	for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++)
3745 		lock_slave |= dib8000_read_lock(state->fe[index_frontend]);
3746 
3747 	*stat = 0;
3748 
3749 	if (((lock >> 13) & 1) || ((lock_slave >> 13) & 1))
3750 		*stat |= FE_HAS_SIGNAL;
3751 
3752 	if (((lock >> 8) & 1) || ((lock_slave >> 8) & 1)) /* Equal */
3753 		*stat |= FE_HAS_CARRIER;
3754 
3755 	if ((((lock >> 1) & 0xf) == 0xf) || (((lock_slave >> 1) & 0xf) == 0xf)) /* TMCC_SYNC */
3756 		*stat |= FE_HAS_SYNC;
3757 
3758 	if ((((lock >> 12) & 1) || ((lock_slave >> 12) & 1)) && ((lock >> 5) & 7)) /* FEC MPEG */
3759 		*stat |= FE_HAS_LOCK;
3760 
3761 	if (((lock >> 12) & 1) || ((lock_slave >> 12) & 1)) {
3762 		lock = dib8000_read_word(state, 554); /* Viterbi Layer A */
3763 		if (lock & 0x01)
3764 			*stat |= FE_HAS_VITERBI;
3765 
3766 		lock = dib8000_read_word(state, 555); /* Viterbi Layer B */
3767 		if (lock & 0x01)
3768 			*stat |= FE_HAS_VITERBI;
3769 
3770 		lock = dib8000_read_word(state, 556); /* Viterbi Layer C */
3771 		if (lock & 0x01)
3772 			*stat |= FE_HAS_VITERBI;
3773 	}
3774 	dib8000_get_stats(fe, *stat);
3775 
3776 	return 0;
3777 }
3778 
3779 static int dib8000_read_ber(struct dvb_frontend *fe, u32 * ber)
3780 {
3781 	struct dib8000_state *state = fe->demodulator_priv;
3782 
3783 	/* 13 segments */
3784 	if (state->revision == 0x8090)
3785 		*ber = (dib8000_read_word(state, 562) << 16) |
3786 			dib8000_read_word(state, 563);
3787 	else
3788 		*ber = (dib8000_read_word(state, 560) << 16) |
3789 			dib8000_read_word(state, 561);
3790 	return 0;
3791 }
3792 
3793 static int dib8000_read_unc_blocks(struct dvb_frontend *fe, u32 * unc)
3794 {
3795 	struct dib8000_state *state = fe->demodulator_priv;
3796 
3797 	/* packet error on 13 seg */
3798 	if (state->revision == 0x8090)
3799 		*unc = dib8000_read_word(state, 567);
3800 	else
3801 		*unc = dib8000_read_word(state, 565);
3802 	return 0;
3803 }
3804 
3805 static int dib8000_read_signal_strength(struct dvb_frontend *fe, u16 * strength)
3806 {
3807 	struct dib8000_state *state = fe->demodulator_priv;
3808 	u8 index_frontend;
3809 	u16 val;
3810 
3811 	*strength = 0;
3812 	for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
3813 		state->fe[index_frontend]->ops.read_signal_strength(state->fe[index_frontend], &val);
3814 		if (val > 65535 - *strength)
3815 			*strength = 65535;
3816 		else
3817 			*strength += val;
3818 	}
3819 
3820 	val = 65535 - dib8000_read_word(state, 390);
3821 	if (val > 65535 - *strength)
3822 		*strength = 65535;
3823 	else
3824 		*strength += val;
3825 	return 0;
3826 }
3827 
3828 static u32 dib8000_get_snr(struct dvb_frontend *fe)
3829 {
3830 	struct dib8000_state *state = fe->demodulator_priv;
3831 	u32 n, s, exp;
3832 	u16 val;
3833 
3834 	if (state->revision != 0x8090)
3835 		val = dib8000_read_word(state, 542);
3836 	else
3837 		val = dib8000_read_word(state, 544);
3838 	n = (val >> 6) & 0xff;
3839 	exp = (val & 0x3f);
3840 	if ((exp & 0x20) != 0)
3841 		exp -= 0x40;
3842 	n <<= exp+16;
3843 
3844 	if (state->revision != 0x8090)
3845 		val = dib8000_read_word(state, 543);
3846 	else
3847 		val = dib8000_read_word(state, 545);
3848 	s = (val >> 6) & 0xff;
3849 	exp = (val & 0x3f);
3850 	if ((exp & 0x20) != 0)
3851 		exp -= 0x40;
3852 	s <<= exp+16;
3853 
3854 	if (n > 0) {
3855 		u32 t = (s/n) << 16;
3856 		return t + ((s << 16) - n*t) / n;
3857 	}
3858 	return 0xffffffff;
3859 }
3860 
3861 static int dib8000_read_snr(struct dvb_frontend *fe, u16 * snr)
3862 {
3863 	struct dib8000_state *state = fe->demodulator_priv;
3864 	u8 index_frontend;
3865 	u32 snr_master;
3866 
3867 	snr_master = dib8000_get_snr(fe);
3868 	for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++)
3869 		snr_master += dib8000_get_snr(state->fe[index_frontend]);
3870 
3871 	if ((snr_master >> 16) != 0) {
3872 		snr_master = 10*intlog10(snr_master>>16);
3873 		*snr = snr_master / ((1 << 24) / 10);
3874 	}
3875 	else
3876 		*snr = 0;
3877 
3878 	return 0;
3879 }
3880 
3881 struct per_layer_regs {
3882 	u16 lock, ber, per;
3883 };
3884 
3885 static const struct per_layer_regs per_layer_regs[] = {
3886 	{ 554, 560, 562 },
3887 	{ 555, 576, 578 },
3888 	{ 556, 581, 583 },
3889 };
3890 
3891 struct linear_segments {
3892 	unsigned x;
3893 	signed y;
3894 };
3895 
3896 /*
3897  * Table to estimate signal strength in dBm.
3898  * This table was empirically determinated by measuring the signal
3899  * strength generated by a DTA-2111 RF generator directly connected into
3900  * a dib8076 device (a PixelView PV-D231U stick), using a good quality
3901  * 3 meters RC6 cable and good RC6 connectors.
3902  * The real value can actually be different on other devices, depending
3903  * on several factors, like if LNA is enabled or not, if diversity is
3904  * enabled, type of connectors, etc.
3905  * Yet, it is better to use this measure in dB than a random non-linear
3906  * percentage value, especially for antenna adjustments.
3907  * On my tests, the precision of the measure using this table is about
3908  * 0.5 dB, with sounds reasonable enough.
3909  */
3910 static struct linear_segments strength_to_db_table[] = {
3911 	{ 55953, 108500 },	/* -22.5 dBm */
3912 	{ 55394, 108000 },
3913 	{ 53834, 107000 },
3914 	{ 52863, 106000 },
3915 	{ 52239, 105000 },
3916 	{ 52012, 104000 },
3917 	{ 51803, 103000 },
3918 	{ 51566, 102000 },
3919 	{ 51356, 101000 },
3920 	{ 51112, 100000 },
3921 	{ 50869,  99000 },
3922 	{ 50600,  98000 },
3923 	{ 50363,  97000 },
3924 	{ 50117,  96000 },	/* -35 dBm */
3925 	{ 49889,  95000 },
3926 	{ 49680,  94000 },
3927 	{ 49493,  93000 },
3928 	{ 49302,  92000 },
3929 	{ 48929,  91000 },
3930 	{ 48416,  90000 },
3931 	{ 48035,  89000 },
3932 	{ 47593,  88000 },
3933 	{ 47282,  87000 },
3934 	{ 46953,  86000 },
3935 	{ 46698,  85000 },
3936 	{ 45617,  84000 },
3937 	{ 44773,  83000 },
3938 	{ 43845,  82000 },
3939 	{ 43020,  81000 },
3940 	{ 42010,  80000 },	/* -51 dBm */
3941 	{     0,      0 },
3942 };
3943 
3944 static u32 interpolate_value(u32 value, struct linear_segments *segments,
3945 			     unsigned len)
3946 {
3947 	u64 tmp64;
3948 	u32 dx;
3949 	s32 dy;
3950 	int i, ret;
3951 
3952 	if (value >= segments[0].x)
3953 		return segments[0].y;
3954 	if (value < segments[len-1].x)
3955 		return segments[len-1].y;
3956 
3957 	for (i = 1; i < len - 1; i++) {
3958 		/* If value is identical, no need to interpolate */
3959 		if (value == segments[i].x)
3960 			return segments[i].y;
3961 		if (value > segments[i].x)
3962 			break;
3963 	}
3964 
3965 	/* Linear interpolation between the two (x,y) points */
3966 	dy = segments[i - 1].y - segments[i].y;
3967 	dx = segments[i - 1].x - segments[i].x;
3968 
3969 	tmp64 = value - segments[i].x;
3970 	tmp64 *= dy;
3971 	do_div(tmp64, dx);
3972 	ret = segments[i].y + tmp64;
3973 
3974 	return ret;
3975 }
3976 
3977 static u32 dib8000_get_time_us(struct dvb_frontend *fe, int layer)
3978 {
3979 	struct dib8000_state *state = fe->demodulator_priv;
3980 	struct dtv_frontend_properties *c = &state->fe[0]->dtv_property_cache;
3981 	int ini_layer, end_layer, i;
3982 	u64 time_us, tmp64;
3983 	u32 tmp, denom;
3984 	int guard, rate_num, rate_denum = 1, bits_per_symbol, nsegs;
3985 	int interleaving = 0, fft_div;
3986 
3987 	if (layer >= 0) {
3988 		ini_layer = layer;
3989 		end_layer = layer + 1;
3990 	} else {
3991 		ini_layer = 0;
3992 		end_layer = 3;
3993 	}
3994 
3995 	switch (c->guard_interval) {
3996 	case GUARD_INTERVAL_1_4:
3997 		guard = 4;
3998 		break;
3999 	case GUARD_INTERVAL_1_8:
4000 		guard = 8;
4001 		break;
4002 	case GUARD_INTERVAL_1_16:
4003 		guard = 16;
4004 		break;
4005 	default:
4006 	case GUARD_INTERVAL_1_32:
4007 		guard = 32;
4008 		break;
4009 	}
4010 
4011 	switch (c->transmission_mode) {
4012 	case TRANSMISSION_MODE_2K:
4013 		fft_div = 4;
4014 		break;
4015 	case TRANSMISSION_MODE_4K:
4016 		fft_div = 2;
4017 		break;
4018 	default:
4019 	case TRANSMISSION_MODE_8K:
4020 		fft_div = 1;
4021 		break;
4022 	}
4023 
4024 	denom = 0;
4025 	for (i = ini_layer; i < end_layer; i++) {
4026 		nsegs = c->layer[i].segment_count;
4027 		if (nsegs == 0 || nsegs > 13)
4028 			continue;
4029 
4030 		switch (c->layer[i].modulation) {
4031 		case DQPSK:
4032 		case QPSK:
4033 			bits_per_symbol = 2;
4034 			break;
4035 		case QAM_16:
4036 			bits_per_symbol = 4;
4037 			break;
4038 		default:
4039 		case QAM_64:
4040 			bits_per_symbol = 6;
4041 			break;
4042 		}
4043 
4044 		switch (c->layer[i].fec) {
4045 		case FEC_1_2:
4046 			rate_num = 1;
4047 			rate_denum = 2;
4048 			break;
4049 		case FEC_2_3:
4050 			rate_num = 2;
4051 			rate_denum = 3;
4052 			break;
4053 		case FEC_3_4:
4054 			rate_num = 3;
4055 			rate_denum = 4;
4056 			break;
4057 		case FEC_5_6:
4058 			rate_num = 5;
4059 			rate_denum = 6;
4060 			break;
4061 		default:
4062 		case FEC_7_8:
4063 			rate_num = 7;
4064 			rate_denum = 8;
4065 			break;
4066 		}
4067 
4068 		interleaving = c->layer[i].interleaving;
4069 
4070 		denom += bits_per_symbol * rate_num * fft_div * nsegs * 384;
4071 	}
4072 
4073 	/* If all goes wrong, wait for 1s for the next stats */
4074 	if (!denom)
4075 		return 0;
4076 
4077 	/* Estimate the period for the total bit rate */
4078 	time_us = rate_denum * (1008 * 1562500L);
4079 	tmp64 = time_us;
4080 	do_div(tmp64, guard);
4081 	time_us = time_us + tmp64;
4082 	time_us += denom / 2;
4083 	do_div(time_us, denom);
4084 
4085 	tmp = 1008 * 96 * interleaving;
4086 	time_us += tmp + tmp / guard;
4087 
4088 	return time_us;
4089 }
4090 
4091 static int dib8000_get_stats(struct dvb_frontend *fe, fe_status_t stat)
4092 {
4093 	struct dib8000_state *state = fe->demodulator_priv;
4094 	struct dtv_frontend_properties *c = &state->fe[0]->dtv_property_cache;
4095 	int i;
4096 	int show_per_stats = 0;
4097 	u32 time_us = 0, snr, val;
4098 	u64 blocks;
4099 	s32 db;
4100 	u16 strength;
4101 
4102 	/* Get Signal strength */
4103 	dib8000_read_signal_strength(fe, &strength);
4104 	val = strength;
4105 	db = interpolate_value(val,
4106 			       strength_to_db_table,
4107 			       ARRAY_SIZE(strength_to_db_table)) - 131000;
4108 	c->strength.stat[0].svalue = db;
4109 
4110 	/* UCB/BER/CNR measures require lock */
4111 	if (!(stat & FE_HAS_LOCK)) {
4112 		c->cnr.len = 1;
4113 		c->block_count.len = 1;
4114 		c->block_error.len = 1;
4115 		c->post_bit_error.len = 1;
4116 		c->post_bit_count.len = 1;
4117 		c->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
4118 		c->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
4119 		c->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
4120 		c->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
4121 		c->block_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
4122 		return 0;
4123 	}
4124 
4125 	/* Check if time for stats was elapsed */
4126 	if (time_after(jiffies, state->per_jiffies_stats)) {
4127 		state->per_jiffies_stats = jiffies + msecs_to_jiffies(1000);
4128 
4129 		/* Get SNR */
4130 		snr = dib8000_get_snr(fe);
4131 		for (i = 1; i < MAX_NUMBER_OF_FRONTENDS; i++) {
4132 			if (state->fe[i])
4133 				snr += dib8000_get_snr(state->fe[i]);
4134 		}
4135 		snr = snr >> 16;
4136 
4137 		if (snr) {
4138 			snr = 10 * intlog10(snr);
4139 			snr = (1000L * snr) >> 24;
4140 		} else {
4141 			snr = 0;
4142 		}
4143 		c->cnr.stat[0].svalue = snr;
4144 		c->cnr.stat[0].scale = FE_SCALE_DECIBEL;
4145 
4146 		/* Get UCB measures */
4147 		dib8000_read_unc_blocks(fe, &val);
4148 		if (val < state->init_ucb)
4149 			state->init_ucb += 0x100000000LL;
4150 
4151 		c->block_error.stat[0].scale = FE_SCALE_COUNTER;
4152 		c->block_error.stat[0].uvalue = val + state->init_ucb;
4153 
4154 		/* Estimate the number of packets based on bitrate */
4155 		if (!time_us)
4156 			time_us = dib8000_get_time_us(fe, -1);
4157 
4158 		if (time_us) {
4159 			blocks = 1250000ULL * 1000000ULL;
4160 			do_div(blocks, time_us * 8 * 204);
4161 			c->block_count.stat[0].scale = FE_SCALE_COUNTER;
4162 			c->block_count.stat[0].uvalue += blocks;
4163 		}
4164 
4165 		show_per_stats = 1;
4166 	}
4167 
4168 	/* Get post-BER measures */
4169 	if (time_after(jiffies, state->ber_jiffies_stats)) {
4170 		time_us = dib8000_get_time_us(fe, -1);
4171 		state->ber_jiffies_stats = jiffies + msecs_to_jiffies((time_us + 500) / 1000);
4172 
4173 		dprintk("Next all layers stats available in %u us.", time_us);
4174 
4175 		dib8000_read_ber(fe, &val);
4176 		c->post_bit_error.stat[0].scale = FE_SCALE_COUNTER;
4177 		c->post_bit_error.stat[0].uvalue += val;
4178 
4179 		c->post_bit_count.stat[0].scale = FE_SCALE_COUNTER;
4180 		c->post_bit_count.stat[0].uvalue += 100000000;
4181 	}
4182 
4183 	if (state->revision < 0x8002)
4184 		return 0;
4185 
4186 	c->block_error.len = 4;
4187 	c->post_bit_error.len = 4;
4188 	c->post_bit_count.len = 4;
4189 
4190 	for (i = 0; i < 3; i++) {
4191 		unsigned nsegs = c->layer[i].segment_count;
4192 
4193 		if (nsegs == 0 || nsegs > 13)
4194 			continue;
4195 
4196 		time_us = 0;
4197 
4198 		if (time_after(jiffies, state->ber_jiffies_stats_layer[i])) {
4199 			time_us = dib8000_get_time_us(fe, i);
4200 
4201 			state->ber_jiffies_stats_layer[i] = jiffies + msecs_to_jiffies((time_us + 500) / 1000);
4202 			dprintk("Next layer %c  stats will be available in %u us\n",
4203 				'A' + i, time_us);
4204 
4205 			val = dib8000_read_word(state, per_layer_regs[i].ber);
4206 			c->post_bit_error.stat[1 + i].scale = FE_SCALE_COUNTER;
4207 			c->post_bit_error.stat[1 + i].uvalue += val;
4208 
4209 			c->post_bit_count.stat[1 + i].scale = FE_SCALE_COUNTER;
4210 			c->post_bit_count.stat[1 + i].uvalue += 100000000;
4211 		}
4212 
4213 		if (show_per_stats) {
4214 			val = dib8000_read_word(state, per_layer_regs[i].per);
4215 
4216 			c->block_error.stat[1 + i].scale = FE_SCALE_COUNTER;
4217 			c->block_error.stat[1 + i].uvalue += val;
4218 
4219 			if (!time_us)
4220 				time_us = dib8000_get_time_us(fe, i);
4221 			if (time_us) {
4222 				blocks = 1250000ULL * 1000000ULL;
4223 				do_div(blocks, time_us * 8 * 204);
4224 				c->block_count.stat[0].scale = FE_SCALE_COUNTER;
4225 				c->block_count.stat[0].uvalue += blocks;
4226 			}
4227 		}
4228 	}
4229 	return 0;
4230 }
4231 
4232 static int dib8000_set_slave_frontend(struct dvb_frontend *fe, struct dvb_frontend *fe_slave)
4233 {
4234 	struct dib8000_state *state = fe->demodulator_priv;
4235 	u8 index_frontend = 1;
4236 
4237 	while ((index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL))
4238 		index_frontend++;
4239 	if (index_frontend < MAX_NUMBER_OF_FRONTENDS) {
4240 		dprintk("set slave fe %p to index %i", fe_slave, index_frontend);
4241 		state->fe[index_frontend] = fe_slave;
4242 		return 0;
4243 	}
4244 
4245 	dprintk("too many slave frontend");
4246 	return -ENOMEM;
4247 }
4248 
4249 static int dib8000_remove_slave_frontend(struct dvb_frontend *fe)
4250 {
4251 	struct dib8000_state *state = fe->demodulator_priv;
4252 	u8 index_frontend = 1;
4253 
4254 	while ((index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL))
4255 		index_frontend++;
4256 	if (index_frontend != 1) {
4257 		dprintk("remove slave fe %p (index %i)", state->fe[index_frontend-1], index_frontend-1);
4258 		state->fe[index_frontend] = NULL;
4259 		return 0;
4260 	}
4261 
4262 	dprintk("no frontend to be removed");
4263 	return -ENODEV;
4264 }
4265 
4266 static struct dvb_frontend *dib8000_get_slave_frontend(struct dvb_frontend *fe, int slave_index)
4267 {
4268 	struct dib8000_state *state = fe->demodulator_priv;
4269 
4270 	if (slave_index >= MAX_NUMBER_OF_FRONTENDS)
4271 		return NULL;
4272 	return state->fe[slave_index];
4273 }
4274 
4275 static int dib8000_i2c_enumeration(struct i2c_adapter *host, int no_of_demods,
4276 		u8 default_addr, u8 first_addr, u8 is_dib8096p)
4277 {
4278 	int k = 0, ret = 0;
4279 	u8 new_addr = 0;
4280 	struct i2c_device client = {.adap = host };
4281 
4282 	client.i2c_write_buffer = kzalloc(4 * sizeof(u8), GFP_KERNEL);
4283 	if (!client.i2c_write_buffer) {
4284 		dprintk("%s: not enough memory", __func__);
4285 		return -ENOMEM;
4286 	}
4287 	client.i2c_read_buffer = kzalloc(4 * sizeof(u8), GFP_KERNEL);
4288 	if (!client.i2c_read_buffer) {
4289 		dprintk("%s: not enough memory", __func__);
4290 		ret = -ENOMEM;
4291 		goto error_memory_read;
4292 	}
4293 	client.i2c_buffer_lock = kzalloc(sizeof(struct mutex), GFP_KERNEL);
4294 	if (!client.i2c_buffer_lock) {
4295 		dprintk("%s: not enough memory", __func__);
4296 		ret = -ENOMEM;
4297 		goto error_memory_lock;
4298 	}
4299 	mutex_init(client.i2c_buffer_lock);
4300 
4301 	for (k = no_of_demods - 1; k >= 0; k--) {
4302 		/* designated i2c address */
4303 		new_addr = first_addr + (k << 1);
4304 
4305 		client.addr = new_addr;
4306 		if (!is_dib8096p)
4307 			dib8000_i2c_write16(&client, 1287, 0x0003);	/* sram lead in, rdy */
4308 		if (dib8000_identify(&client) == 0) {
4309 			/* sram lead in, rdy */
4310 			if (!is_dib8096p)
4311 				dib8000_i2c_write16(&client, 1287, 0x0003);
4312 			client.addr = default_addr;
4313 			if (dib8000_identify(&client) == 0) {
4314 				dprintk("#%d: not identified", k);
4315 				ret  = -EINVAL;
4316 				goto error;
4317 			}
4318 		}
4319 
4320 		/* start diversity to pull_down div_str - just for i2c-enumeration */
4321 		dib8000_i2c_write16(&client, 1286, (1 << 10) | (4 << 6));
4322 
4323 		/* set new i2c address and force divstart */
4324 		dib8000_i2c_write16(&client, 1285, (new_addr << 2) | 0x2);
4325 		client.addr = new_addr;
4326 		dib8000_identify(&client);
4327 
4328 		dprintk("IC %d initialized (to i2c_address 0x%x)", k, new_addr);
4329 	}
4330 
4331 	for (k = 0; k < no_of_demods; k++) {
4332 		new_addr = first_addr | (k << 1);
4333 		client.addr = new_addr;
4334 
4335 		// unforce divstr
4336 		dib8000_i2c_write16(&client, 1285, new_addr << 2);
4337 
4338 		/* deactivate div - it was just for i2c-enumeration */
4339 		dib8000_i2c_write16(&client, 1286, 0);
4340 	}
4341 
4342 error:
4343 	kfree(client.i2c_buffer_lock);
4344 error_memory_lock:
4345 	kfree(client.i2c_read_buffer);
4346 error_memory_read:
4347 	kfree(client.i2c_write_buffer);
4348 
4349 	return ret;
4350 }
4351 
4352 static int dib8000_fe_get_tune_settings(struct dvb_frontend *fe, struct dvb_frontend_tune_settings *tune)
4353 {
4354 	tune->min_delay_ms = 1000;
4355 	tune->step_size = 0;
4356 	tune->max_drift = 0;
4357 	return 0;
4358 }
4359 
4360 static void dib8000_release(struct dvb_frontend *fe)
4361 {
4362 	struct dib8000_state *st = fe->demodulator_priv;
4363 	u8 index_frontend;
4364 
4365 	for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (st->fe[index_frontend] != NULL); index_frontend++)
4366 		dvb_frontend_detach(st->fe[index_frontend]);
4367 
4368 	dibx000_exit_i2c_master(&st->i2c_master);
4369 	i2c_del_adapter(&st->dib8096p_tuner_adap);
4370 	kfree(st->fe[0]);
4371 	kfree(st);
4372 }
4373 
4374 static struct i2c_adapter *dib8000_get_i2c_master(struct dvb_frontend *fe, enum dibx000_i2c_interface intf, int gating)
4375 {
4376 	struct dib8000_state *st = fe->demodulator_priv;
4377 	return dibx000_get_i2c_adapter(&st->i2c_master, intf, gating);
4378 }
4379 
4380 static int dib8000_pid_filter_ctrl(struct dvb_frontend *fe, u8 onoff)
4381 {
4382 	struct dib8000_state *st = fe->demodulator_priv;
4383 	u16 val = dib8000_read_word(st, 299) & 0xffef;
4384 	val |= (onoff & 0x1) << 4;
4385 
4386 	dprintk("pid filter enabled %d", onoff);
4387 	return dib8000_write_word(st, 299, val);
4388 }
4389 
4390 static int dib8000_pid_filter(struct dvb_frontend *fe, u8 id, u16 pid, u8 onoff)
4391 {
4392 	struct dib8000_state *st = fe->demodulator_priv;
4393 	dprintk("Index %x, PID %d, OnOff %d", id, pid, onoff);
4394 	return dib8000_write_word(st, 305 + id, onoff ? (1 << 13) | pid : 0);
4395 }
4396 
4397 static const struct dvb_frontend_ops dib8000_ops = {
4398 	.delsys = { SYS_ISDBT },
4399 	.info = {
4400 		 .name = "DiBcom 8000 ISDB-T",
4401 		 .frequency_min = 44250000,
4402 		 .frequency_max = 867250000,
4403 		 .frequency_stepsize = 62500,
4404 		 .caps = FE_CAN_INVERSION_AUTO |
4405 		 FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
4406 		 FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
4407 		 FE_CAN_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_64 | FE_CAN_QAM_AUTO |
4408 		 FE_CAN_TRANSMISSION_MODE_AUTO | FE_CAN_GUARD_INTERVAL_AUTO | FE_CAN_RECOVER | FE_CAN_HIERARCHY_AUTO,
4409 		 },
4410 
4411 	.release = dib8000_release,
4412 
4413 	.init = dib8000_wakeup,
4414 	.sleep = dib8000_sleep,
4415 
4416 	.set_frontend = dib8000_set_frontend,
4417 	.get_tune_settings = dib8000_fe_get_tune_settings,
4418 	.get_frontend = dib8000_get_frontend,
4419 
4420 	.read_status = dib8000_read_status,
4421 	.read_ber = dib8000_read_ber,
4422 	.read_signal_strength = dib8000_read_signal_strength,
4423 	.read_snr = dib8000_read_snr,
4424 	.read_ucblocks = dib8000_read_unc_blocks,
4425 };
4426 
4427 static struct dvb_frontend *dib8000_init(struct i2c_adapter *i2c_adap, u8 i2c_addr, struct dib8000_config *cfg)
4428 {
4429 	struct dvb_frontend *fe;
4430 	struct dib8000_state *state;
4431 
4432 	dprintk("dib8000_init");
4433 
4434 	state = kzalloc(sizeof(struct dib8000_state), GFP_KERNEL);
4435 	if (state == NULL)
4436 		return NULL;
4437 	fe = kzalloc(sizeof(struct dvb_frontend), GFP_KERNEL);
4438 	if (fe == NULL)
4439 		goto error;
4440 
4441 	memcpy(&state->cfg, cfg, sizeof(struct dib8000_config));
4442 	state->i2c.adap = i2c_adap;
4443 	state->i2c.addr = i2c_addr;
4444 	state->i2c.i2c_write_buffer = state->i2c_write_buffer;
4445 	state->i2c.i2c_read_buffer = state->i2c_read_buffer;
4446 	mutex_init(&state->i2c_buffer_lock);
4447 	state->i2c.i2c_buffer_lock = &state->i2c_buffer_lock;
4448 	state->gpio_val = cfg->gpio_val;
4449 	state->gpio_dir = cfg->gpio_dir;
4450 
4451 	/* Ensure the output mode remains at the previous default if it's
4452 	 * not specifically set by the caller.
4453 	 */
4454 	if ((state->cfg.output_mode != OUTMODE_MPEG2_SERIAL) && (state->cfg.output_mode != OUTMODE_MPEG2_PAR_GATED_CLK))
4455 		state->cfg.output_mode = OUTMODE_MPEG2_FIFO;
4456 
4457 	state->fe[0] = fe;
4458 	fe->demodulator_priv = state;
4459 	memcpy(&state->fe[0]->ops, &dib8000_ops, sizeof(struct dvb_frontend_ops));
4460 
4461 	state->timf_default = cfg->pll->timf;
4462 
4463 	if (dib8000_identify(&state->i2c) == 0)
4464 		goto error;
4465 
4466 	dibx000_init_i2c_master(&state->i2c_master, DIB8000, state->i2c.adap, state->i2c.addr);
4467 
4468 	/* init 8096p tuner adapter */
4469 	strncpy(state->dib8096p_tuner_adap.name, "DiB8096P tuner interface",
4470 			sizeof(state->dib8096p_tuner_adap.name));
4471 	state->dib8096p_tuner_adap.algo = &dib8096p_tuner_xfer_algo;
4472 	state->dib8096p_tuner_adap.algo_data = NULL;
4473 	state->dib8096p_tuner_adap.dev.parent = state->i2c.adap->dev.parent;
4474 	i2c_set_adapdata(&state->dib8096p_tuner_adap, state);
4475 	i2c_add_adapter(&state->dib8096p_tuner_adap);
4476 
4477 	dib8000_reset(fe);
4478 
4479 	dib8000_write_word(state, 285, (dib8000_read_word(state, 285) & ~0x60) | (3 << 5));	/* ber_rs_len = 3 */
4480 	state->current_demod_bw = 6000;
4481 
4482 	return fe;
4483 
4484 error:
4485 	kfree(state);
4486 	return NULL;
4487 }
4488 
4489 void *dib8000_attach(struct dib8000_ops *ops)
4490 {
4491 	if (!ops)
4492 		return NULL;
4493 
4494 	ops->pwm_agc_reset = dib8000_pwm_agc_reset;
4495 	ops->get_dc_power = dib8090p_get_dc_power;
4496 	ops->set_gpio = dib8000_set_gpio;
4497 	ops->get_slave_frontend = dib8000_get_slave_frontend;
4498 	ops->set_tune_state = dib8000_set_tune_state;
4499 	ops->pid_filter_ctrl = dib8000_pid_filter_ctrl;
4500 	ops->remove_slave_frontend = dib8000_remove_slave_frontend;
4501 	ops->get_adc_power = dib8000_get_adc_power;
4502 	ops->update_pll = dib8000_update_pll;
4503 	ops->tuner_sleep = dib8096p_tuner_sleep;
4504 	ops->get_tune_state = dib8000_get_tune_state;
4505 	ops->get_i2c_tuner = dib8096p_get_i2c_tuner;
4506 	ops->set_slave_frontend = dib8000_set_slave_frontend;
4507 	ops->pid_filter = dib8000_pid_filter;
4508 	ops->ctrl_timf = dib8000_ctrl_timf;
4509 	ops->init = dib8000_init;
4510 	ops->get_i2c_master = dib8000_get_i2c_master;
4511 	ops->i2c_enumeration = dib8000_i2c_enumeration;
4512 	ops->set_wbd_ref = dib8000_set_wbd_ref;
4513 
4514 	return ops;
4515 }
4516 EXPORT_SYMBOL(dib8000_attach);
4517 
4518 MODULE_AUTHOR("Olivier Grenie <Olivier.Grenie@dibcom.fr, " "Patrick Boettcher <pboettcher@dibcom.fr>");
4519 MODULE_DESCRIPTION("Driver for the DiBcom 8000 ISDB-T demodulator");
4520 MODULE_LICENSE("GPL");
4521