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 
15 #include "dvb_math.h"
16 
17 #include "dvb_frontend.h"
18 
19 #include "dib8000.h"
20 
21 #define LAYER_ALL -1
22 #define LAYER_A   1
23 #define LAYER_B   2
24 #define LAYER_C   3
25 
26 #define FE_CALLBACK_TIME_NEVER 0xffffffff
27 #define MAX_NUMBER_OF_FRONTENDS 6
28 
29 static int debug;
30 module_param(debug, int, 0644);
31 MODULE_PARM_DESC(debug, "turn on debugging (default: 0)");
32 
33 #define dprintk(args...) do { if (debug) { printk(KERN_DEBUG "DiB8000: "); printk(args); printk("\n"); } } while (0)
34 
35 #define FE_STATUS_TUNE_FAILED 0
36 
37 struct i2c_device {
38 	struct i2c_adapter *adap;
39 	u8 addr;
40 	u8 *i2c_write_buffer;
41 	u8 *i2c_read_buffer;
42 	struct mutex *i2c_buffer_lock;
43 };
44 
45 struct dib8000_state {
46 	struct dib8000_config cfg;
47 
48 	struct i2c_device i2c;
49 
50 	struct dibx000_i2c_master i2c_master;
51 
52 	u16 wbd_ref;
53 
54 	u8 current_band;
55 	u32 current_bandwidth;
56 	struct dibx000_agc_config *current_agc;
57 	u32 timf;
58 	u32 timf_default;
59 
60 	u8 div_force_off:1;
61 	u8 div_state:1;
62 	u16 div_sync_wait;
63 
64 	u8 agc_state;
65 	u8 differential_constellation;
66 	u8 diversity_onoff;
67 
68 	s16 ber_monitored_layer;
69 	u16 gpio_dir;
70 	u16 gpio_val;
71 
72 	u16 revision;
73 	u8 isdbt_cfg_loaded;
74 	enum frontend_tune_state tune_state;
75 	u32 status;
76 
77 	struct dvb_frontend *fe[MAX_NUMBER_OF_FRONTENDS];
78 
79 	/* for the I2C transfer */
80 	struct i2c_msg msg[2];
81 	u8 i2c_write_buffer[4];
82 	u8 i2c_read_buffer[2];
83 	struct mutex i2c_buffer_lock;
84 	u8 input_mode_mpeg;
85 
86 	u16 tuner_enable;
87 	struct i2c_adapter dib8096p_tuner_adap;
88 };
89 
90 enum dib8000_power_mode {
91 	DIB8000_POWER_ALL = 0,
92 	DIB8000_POWER_INTERFACE_ONLY,
93 };
94 
95 static u16 dib8000_i2c_read16(struct i2c_device *i2c, u16 reg)
96 {
97 	u16 ret;
98 	struct i2c_msg msg[2] = {
99 		{.addr = i2c->addr >> 1, .flags = 0, .len = 2},
100 		{.addr = i2c->addr >> 1, .flags = I2C_M_RD, .len = 2},
101 	};
102 
103 	if (mutex_lock_interruptible(i2c->i2c_buffer_lock) < 0) {
104 		dprintk("could not acquire lock");
105 		return 0;
106 	}
107 
108 	msg[0].buf    = i2c->i2c_write_buffer;
109 	msg[0].buf[0] = reg >> 8;
110 	msg[0].buf[1] = reg & 0xff;
111 	msg[1].buf    = i2c->i2c_read_buffer;
112 
113 	if (i2c_transfer(i2c->adap, msg, 2) != 2)
114 		dprintk("i2c read error on %d", reg);
115 
116 	ret = (msg[1].buf[0] << 8) | msg[1].buf[1];
117 	mutex_unlock(i2c->i2c_buffer_lock);
118 	return ret;
119 }
120 
121 static u16 dib8000_read_word(struct dib8000_state *state, u16 reg)
122 {
123 	u16 ret;
124 
125 	if (mutex_lock_interruptible(&state->i2c_buffer_lock) < 0) {
126 		dprintk("could not acquire lock");
127 		return 0;
128 	}
129 
130 	state->i2c_write_buffer[0] = reg >> 8;
131 	state->i2c_write_buffer[1] = reg & 0xff;
132 
133 	memset(state->msg, 0, 2 * sizeof(struct i2c_msg));
134 	state->msg[0].addr = state->i2c.addr >> 1;
135 	state->msg[0].flags = 0;
136 	state->msg[0].buf = state->i2c_write_buffer;
137 	state->msg[0].len = 2;
138 	state->msg[1].addr = state->i2c.addr >> 1;
139 	state->msg[1].flags = I2C_M_RD;
140 	state->msg[1].buf = state->i2c_read_buffer;
141 	state->msg[1].len = 2;
142 
143 	if (i2c_transfer(state->i2c.adap, state->msg, 2) != 2)
144 		dprintk("i2c read error on %d", reg);
145 
146 	ret = (state->i2c_read_buffer[0] << 8) | state->i2c_read_buffer[1];
147 	mutex_unlock(&state->i2c_buffer_lock);
148 
149 	return ret;
150 }
151 
152 static u32 dib8000_read32(struct dib8000_state *state, u16 reg)
153 {
154 	u16 rw[2];
155 
156 	rw[0] = dib8000_read_word(state, reg + 0);
157 	rw[1] = dib8000_read_word(state, reg + 1);
158 
159 	return ((rw[0] << 16) | (rw[1]));
160 }
161 
162 static int dib8000_i2c_write16(struct i2c_device *i2c, u16 reg, u16 val)
163 {
164 	struct i2c_msg msg = {.addr = i2c->addr >> 1, .flags = 0, .len = 4};
165 	int ret = 0;
166 
167 	if (mutex_lock_interruptible(i2c->i2c_buffer_lock) < 0) {
168 		dprintk("could not acquire lock");
169 		return -EINVAL;
170 	}
171 
172 	msg.buf    = i2c->i2c_write_buffer;
173 	msg.buf[0] = (reg >> 8) & 0xff;
174 	msg.buf[1] = reg & 0xff;
175 	msg.buf[2] = (val >> 8) & 0xff;
176 	msg.buf[3] = val & 0xff;
177 
178 	ret = i2c_transfer(i2c->adap, &msg, 1) != 1 ? -EREMOTEIO : 0;
179 	mutex_unlock(i2c->i2c_buffer_lock);
180 
181 	return ret;
182 }
183 
184 static int dib8000_write_word(struct dib8000_state *state, u16 reg, u16 val)
185 {
186 	int ret;
187 
188 	if (mutex_lock_interruptible(&state->i2c_buffer_lock) < 0) {
189 		dprintk("could not acquire lock");
190 		return -EINVAL;
191 	}
192 
193 	state->i2c_write_buffer[0] = (reg >> 8) & 0xff;
194 	state->i2c_write_buffer[1] = reg & 0xff;
195 	state->i2c_write_buffer[2] = (val >> 8) & 0xff;
196 	state->i2c_write_buffer[3] = val & 0xff;
197 
198 	memset(&state->msg[0], 0, sizeof(struct i2c_msg));
199 	state->msg[0].addr = state->i2c.addr >> 1;
200 	state->msg[0].flags = 0;
201 	state->msg[0].buf = state->i2c_write_buffer;
202 	state->msg[0].len = 4;
203 
204 	ret = (i2c_transfer(state->i2c.adap, state->msg, 1) != 1 ?
205 			-EREMOTEIO : 0);
206 	mutex_unlock(&state->i2c_buffer_lock);
207 
208 	return ret;
209 }
210 
211 static const s16 coeff_2k_sb_1seg_dqpsk[8] = {
212 	(769 << 5) | 0x0a, (745 << 5) | 0x03, (595 << 5) | 0x0d, (769 << 5) | 0x0a, (920 << 5) | 0x09, (784 << 5) | 0x02, (519 << 5) | 0x0c,
213 		(920 << 5) | 0x09
214 };
215 
216 static const s16 coeff_2k_sb_1seg[8] = {
217 	(692 << 5) | 0x0b, (683 << 5) | 0x01, (519 << 5) | 0x09, (692 << 5) | 0x0b, 0 | 0x1f, 0 | 0x1f, 0 | 0x1f, 0 | 0x1f
218 };
219 
220 static const s16 coeff_2k_sb_3seg_0dqpsk_1dqpsk[8] = {
221 	(832 << 5) | 0x10, (912 << 5) | 0x05, (900 << 5) | 0x12, (832 << 5) | 0x10, (-931 << 5) | 0x0f, (912 << 5) | 0x04, (807 << 5) | 0x11,
222 		(-931 << 5) | 0x0f
223 };
224 
225 static const s16 coeff_2k_sb_3seg_0dqpsk[8] = {
226 	(622 << 5) | 0x0c, (941 << 5) | 0x04, (796 << 5) | 0x10, (622 << 5) | 0x0c, (982 << 5) | 0x0c, (519 << 5) | 0x02, (572 << 5) | 0x0e,
227 		(982 << 5) | 0x0c
228 };
229 
230 static const s16 coeff_2k_sb_3seg_1dqpsk[8] = {
231 	(699 << 5) | 0x14, (607 << 5) | 0x04, (944 << 5) | 0x13, (699 << 5) | 0x14, (-720 << 5) | 0x0d, (640 << 5) | 0x03, (866 << 5) | 0x12,
232 		(-720 << 5) | 0x0d
233 };
234 
235 static const s16 coeff_2k_sb_3seg[8] = {
236 	(664 << 5) | 0x0c, (925 << 5) | 0x03, (937 << 5) | 0x10, (664 << 5) | 0x0c, (-610 << 5) | 0x0a, (697 << 5) | 0x01, (836 << 5) | 0x0e,
237 		(-610 << 5) | 0x0a
238 };
239 
240 static const s16 coeff_4k_sb_1seg_dqpsk[8] = {
241 	(-955 << 5) | 0x0e, (687 << 5) | 0x04, (818 << 5) | 0x10, (-955 << 5) | 0x0e, (-922 << 5) | 0x0d, (750 << 5) | 0x03, (665 << 5) | 0x0f,
242 		(-922 << 5) | 0x0d
243 };
244 
245 static const s16 coeff_4k_sb_1seg[8] = {
246 	(638 << 5) | 0x0d, (683 << 5) | 0x02, (638 << 5) | 0x0d, (638 << 5) | 0x0d, (-655 << 5) | 0x0a, (517 << 5) | 0x00, (698 << 5) | 0x0d,
247 		(-655 << 5) | 0x0a
248 };
249 
250 static const s16 coeff_4k_sb_3seg_0dqpsk_1dqpsk[8] = {
251 	(-707 << 5) | 0x14, (910 << 5) | 0x06, (889 << 5) | 0x16, (-707 << 5) | 0x14, (-958 << 5) | 0x13, (993 << 5) | 0x05, (523 << 5) | 0x14,
252 		(-958 << 5) | 0x13
253 };
254 
255 static const s16 coeff_4k_sb_3seg_0dqpsk[8] = {
256 	(-723 << 5) | 0x13, (910 << 5) | 0x05, (777 << 5) | 0x14, (-723 << 5) | 0x13, (-568 << 5) | 0x0f, (547 << 5) | 0x03, (696 << 5) | 0x12,
257 		(-568 << 5) | 0x0f
258 };
259 
260 static const s16 coeff_4k_sb_3seg_1dqpsk[8] = {
261 	(-940 << 5) | 0x15, (607 << 5) | 0x05, (915 << 5) | 0x16, (-940 << 5) | 0x15, (-848 << 5) | 0x13, (683 << 5) | 0x04, (543 << 5) | 0x14,
262 		(-848 << 5) | 0x13
263 };
264 
265 static const s16 coeff_4k_sb_3seg[8] = {
266 	(612 << 5) | 0x12, (910 << 5) | 0x04, (864 << 5) | 0x14, (612 << 5) | 0x12, (-869 << 5) | 0x13, (683 << 5) | 0x02, (869 << 5) | 0x12,
267 		(-869 << 5) | 0x13
268 };
269 
270 static const s16 coeff_8k_sb_1seg_dqpsk[8] = {
271 	(-835 << 5) | 0x12, (684 << 5) | 0x05, (735 << 5) | 0x14, (-835 << 5) | 0x12, (-598 << 5) | 0x10, (781 << 5) | 0x04, (739 << 5) | 0x13,
272 		(-598 << 5) | 0x10
273 };
274 
275 static const s16 coeff_8k_sb_1seg[8] = {
276 	(673 << 5) | 0x0f, (683 << 5) | 0x03, (808 << 5) | 0x12, (673 << 5) | 0x0f, (585 << 5) | 0x0f, (512 << 5) | 0x01, (780 << 5) | 0x0f,
277 		(585 << 5) | 0x0f
278 };
279 
280 static const s16 coeff_8k_sb_3seg_0dqpsk_1dqpsk[8] = {
281 	(863 << 5) | 0x17, (930 << 5) | 0x07, (878 << 5) | 0x19, (863 << 5) | 0x17, (0 << 5) | 0x14, (521 << 5) | 0x05, (980 << 5) | 0x18,
282 		(0 << 5) | 0x14
283 };
284 
285 static const s16 coeff_8k_sb_3seg_0dqpsk[8] = {
286 	(-924 << 5) | 0x17, (910 << 5) | 0x06, (774 << 5) | 0x17, (-924 << 5) | 0x17, (-877 << 5) | 0x15, (565 << 5) | 0x04, (553 << 5) | 0x15,
287 		(-877 << 5) | 0x15
288 };
289 
290 static const s16 coeff_8k_sb_3seg_1dqpsk[8] = {
291 	(-921 << 5) | 0x19, (607 << 5) | 0x06, (881 << 5) | 0x19, (-921 << 5) | 0x19, (-921 << 5) | 0x14, (713 << 5) | 0x05, (1018 << 5) | 0x18,
292 		(-921 << 5) | 0x14
293 };
294 
295 static const s16 coeff_8k_sb_3seg[8] = {
296 	(514 << 5) | 0x14, (910 << 5) | 0x05, (861 << 5) | 0x17, (514 << 5) | 0x14, (690 << 5) | 0x14, (683 << 5) | 0x03, (662 << 5) | 0x15,
297 		(690 << 5) | 0x14
298 };
299 
300 static const s16 ana_fe_coeff_3seg[24] = {
301 	81, 80, 78, 74, 68, 61, 54, 45, 37, 28, 19, 11, 4, 1022, 1017, 1013, 1010, 1008, 1008, 1008, 1008, 1010, 1014, 1017
302 };
303 
304 static const s16 ana_fe_coeff_1seg[24] = {
305 	249, 226, 164, 82, 5, 981, 970, 988, 1018, 20, 31, 26, 8, 1012, 1000, 1018, 1012, 8, 15, 14, 9, 3, 1017, 1003
306 };
307 
308 static const s16 ana_fe_coeff_13seg[24] = {
309 	396, 305, 105, -51, -77, -12, 41, 31, -11, -30, -11, 14, 15, -2, -13, -7, 5, 8, 1, -6, -7, -3, 0, 1
310 };
311 
312 static u16 fft_to_mode(struct dib8000_state *state)
313 {
314 	u16 mode;
315 	switch (state->fe[0]->dtv_property_cache.transmission_mode) {
316 	case TRANSMISSION_MODE_2K:
317 		mode = 1;
318 		break;
319 	case TRANSMISSION_MODE_4K:
320 		mode = 2;
321 		break;
322 	default:
323 	case TRANSMISSION_MODE_AUTO:
324 	case TRANSMISSION_MODE_8K:
325 		mode = 3;
326 		break;
327 	}
328 	return mode;
329 }
330 
331 static void dib8000_set_acquisition_mode(struct dib8000_state *state)
332 {
333 	u16 nud = dib8000_read_word(state, 298);
334 	nud |= (1 << 3) | (1 << 0);
335 	dprintk("acquisition mode activated");
336 	dib8000_write_word(state, 298, nud);
337 }
338 static int dib8000_set_output_mode(struct dvb_frontend *fe, int mode)
339 {
340 	struct dib8000_state *state = fe->demodulator_priv;
341 
342 	u16 outreg, fifo_threshold, smo_mode, sram = 0x0205;	/* by default SDRAM deintlv is enabled */
343 
344 	outreg = 0;
345 	fifo_threshold = 1792;
346 	smo_mode = (dib8000_read_word(state, 299) & 0x0050) | (1 << 1);
347 
348 	dprintk("-I-	Setting output mode for demod %p to %d",
349 			&state->fe[0], mode);
350 
351 	switch (mode) {
352 	case OUTMODE_MPEG2_PAR_GATED_CLK:	// STBs with parallel gated clock
353 		outreg = (1 << 10);	/* 0x0400 */
354 		break;
355 	case OUTMODE_MPEG2_PAR_CONT_CLK:	// STBs with parallel continues clock
356 		outreg = (1 << 10) | (1 << 6);	/* 0x0440 */
357 		break;
358 	case OUTMODE_MPEG2_SERIAL:	// STBs with serial input
359 		outreg = (1 << 10) | (2 << 6) | (0 << 1);	/* 0x0482 */
360 		break;
361 	case OUTMODE_DIVERSITY:
362 		if (state->cfg.hostbus_diversity) {
363 			outreg = (1 << 10) | (4 << 6);	/* 0x0500 */
364 			sram &= 0xfdff;
365 		} else
366 			sram |= 0x0c00;
367 		break;
368 	case OUTMODE_MPEG2_FIFO:	// e.g. USB feeding
369 		smo_mode |= (3 << 1);
370 		fifo_threshold = 512;
371 		outreg = (1 << 10) | (5 << 6);
372 		break;
373 	case OUTMODE_HIGH_Z:	// disable
374 		outreg = 0;
375 		break;
376 
377 	case OUTMODE_ANALOG_ADC:
378 		outreg = (1 << 10) | (3 << 6);
379 		dib8000_set_acquisition_mode(state);
380 		break;
381 
382 	default:
383 		dprintk("Unhandled output_mode passed to be set for demod %p",
384 				&state->fe[0]);
385 		return -EINVAL;
386 	}
387 
388 	if (state->cfg.output_mpeg2_in_188_bytes)
389 		smo_mode |= (1 << 5);
390 
391 	dib8000_write_word(state, 299, smo_mode);
392 	dib8000_write_word(state, 300, fifo_threshold);	/* synchronous fread */
393 	dib8000_write_word(state, 1286, outreg);
394 	dib8000_write_word(state, 1291, sram);
395 
396 	return 0;
397 }
398 
399 static int dib8000_set_diversity_in(struct dvb_frontend *fe, int onoff)
400 {
401 	struct dib8000_state *state = fe->demodulator_priv;
402 	u16 sync_wait = dib8000_read_word(state, 273) & 0xfff0;
403 
404 	if (!state->differential_constellation) {
405 		dib8000_write_word(state, 272, 1 << 9);	//dvsy_off_lmod4 = 1
406 		dib8000_write_word(state, 273, sync_wait | (1 << 2) | 2);	// sync_enable = 1; comb_mode = 2
407 	} else {
408 		dib8000_write_word(state, 272, 0);	//dvsy_off_lmod4 = 0
409 		dib8000_write_word(state, 273, sync_wait);	// sync_enable = 0; comb_mode = 0
410 	}
411 	state->diversity_onoff = onoff;
412 
413 	switch (onoff) {
414 	case 0:		/* only use the internal way - not the diversity input */
415 		dib8000_write_word(state, 270, 1);
416 		dib8000_write_word(state, 271, 0);
417 		break;
418 	case 1:		/* both ways */
419 		dib8000_write_word(state, 270, 6);
420 		dib8000_write_word(state, 271, 6);
421 		break;
422 	case 2:		/* only the diversity input */
423 		dib8000_write_word(state, 270, 0);
424 		dib8000_write_word(state, 271, 1);
425 		break;
426 	}
427 	return 0;
428 }
429 
430 static void dib8000_set_power_mode(struct dib8000_state *state, enum dib8000_power_mode mode)
431 {
432 	/* by default everything is going to be powered off */
433 	u16 reg_774 = 0x3fff, reg_775 = 0xffff, reg_776 = 0xffff,
434 		reg_900 = (dib8000_read_word(state, 900) & 0xfffc) | 0x3,
435 		reg_1280;
436 
437 	if (state->revision != 0x8090)
438 		reg_1280 = (dib8000_read_word(state, 1280) & 0x00ff) | 0xff00;
439 	else
440 		reg_1280 = (dib8000_read_word(state, 1280) & 0x707f) | 0x8f80;
441 
442 	/* now, depending on the requested mode, we power on */
443 	switch (mode) {
444 		/* power up everything in the demod */
445 	case DIB8000_POWER_ALL:
446 		reg_774 = 0x0000;
447 		reg_775 = 0x0000;
448 		reg_776 = 0x0000;
449 		reg_900 &= 0xfffc;
450 		if (state->revision != 0x8090)
451 			reg_1280 &= 0x00ff;
452 		else
453 			reg_1280 &= 0x707f;
454 		break;
455 	case DIB8000_POWER_INTERFACE_ONLY:
456 		if (state->revision != 0x8090)
457 			reg_1280 &= 0x00ff;
458 		else
459 			reg_1280 &= 0xfa7b;
460 		break;
461 	}
462 
463 	dprintk("powermode : 774 : %x ; 775 : %x; 776 : %x ; 900 : %x; 1280 : %x", reg_774, reg_775, reg_776, reg_900, reg_1280);
464 	dib8000_write_word(state, 774, reg_774);
465 	dib8000_write_word(state, 775, reg_775);
466 	dib8000_write_word(state, 776, reg_776);
467 	dib8000_write_word(state, 900, reg_900);
468 	dib8000_write_word(state, 1280, reg_1280);
469 }
470 
471 static int dib8000_init_sdram(struct dib8000_state *state)
472 {
473 	u16 reg = 0;
474 	dprintk("Init sdram");
475 
476 	reg = dib8000_read_word(state, 274)&0xfff0;
477 	/* P_dintlv_delay_ram = 7 because of MobileSdram */
478 	dib8000_write_word(state, 274, reg | 0x7);
479 
480 	dib8000_write_word(state, 1803, (7<<2));
481 
482 	reg = dib8000_read_word(state, 1280);
483 	/* force restart P_restart_sdram */
484 	dib8000_write_word(state, 1280,  reg | (1<<2));
485 
486 	/* release restart P_restart_sdram */
487 	dib8000_write_word(state, 1280,  reg);
488 
489 	return 0;
490 }
491 
492 static int dib8000_set_adc_state(struct dib8000_state *state, enum dibx000_adc_states no)
493 {
494 	int ret = 0;
495 	u16 reg, reg_907 = dib8000_read_word(state, 907);
496 	u16 reg_908 = dib8000_read_word(state, 908);
497 
498 	switch (no) {
499 	case DIBX000_SLOW_ADC_ON:
500 		if (state->revision != 0x8090) {
501 			reg_908 |= (1 << 1) | (1 << 0);
502 			ret |= dib8000_write_word(state, 908, reg_908);
503 			reg_908 &= ~(1 << 1);
504 		} else {
505 			reg = dib8000_read_word(state, 1925);
506 			/* en_slowAdc = 1 & reset_sladc = 1 */
507 			dib8000_write_word(state, 1925, reg |
508 					(1<<4) | (1<<2));
509 
510 			/* read acces to make it works... strange ... */
511 			reg = dib8000_read_word(state, 1925);
512 			msleep(20);
513 			/* en_slowAdc = 1 & reset_sladc = 0 */
514 			dib8000_write_word(state, 1925, reg & ~(1<<4));
515 
516 			reg = dib8000_read_word(state, 921) & ~((0x3 << 14)
517 					| (0x3 << 12));
518 			/* ref = Vin1 => Vbg ; sel = Vin0 or Vin3 ;
519 			   (Vin2 = Vcm) */
520 			dib8000_write_word(state, 921, reg | (1 << 14)
521 					| (3 << 12));
522 		}
523 		break;
524 
525 	case DIBX000_SLOW_ADC_OFF:
526 		if (state->revision == 0x8090) {
527 			reg = dib8000_read_word(state, 1925);
528 			/* reset_sladc = 1 en_slowAdc = 0 */
529 			dib8000_write_word(state, 1925,
530 					(reg & ~(1<<2)) | (1<<4));
531 		}
532 		reg_908 |= (1 << 1) | (1 << 0);
533 		break;
534 
535 	case DIBX000_ADC_ON:
536 		reg_907 &= 0x0fff;
537 		reg_908 &= 0x0003;
538 		break;
539 
540 	case DIBX000_ADC_OFF:	// leave the VBG voltage on
541 		reg_907 |= (1 << 14) | (1 << 13) | (1 << 12);
542 		reg_908 |= (1 << 5) | (1 << 4) | (1 << 3) | (1 << 2);
543 		break;
544 
545 	case DIBX000_VBG_ENABLE:
546 		reg_907 &= ~(1 << 15);
547 		break;
548 
549 	case DIBX000_VBG_DISABLE:
550 		reg_907 |= (1 << 15);
551 		break;
552 
553 	default:
554 		break;
555 	}
556 
557 	ret |= dib8000_write_word(state, 907, reg_907);
558 	ret |= dib8000_write_word(state, 908, reg_908);
559 
560 	return ret;
561 }
562 
563 static int dib8000_set_bandwidth(struct dvb_frontend *fe, u32 bw)
564 {
565 	struct dib8000_state *state = fe->demodulator_priv;
566 	u32 timf;
567 
568 	if (bw == 0)
569 		bw = 6000;
570 
571 	if (state->timf == 0) {
572 		dprintk("using default timf");
573 		timf = state->timf_default;
574 	} else {
575 		dprintk("using updated timf");
576 		timf = state->timf;
577 	}
578 
579 	dib8000_write_word(state, 29, (u16) ((timf >> 16) & 0xffff));
580 	dib8000_write_word(state, 30, (u16) ((timf) & 0xffff));
581 
582 	return 0;
583 }
584 
585 static int dib8000_sad_calib(struct dib8000_state *state)
586 {
587 	if (state->revision == 0x8090) {
588 		dprintk("%s: the sad calibration is not needed for the dib8096P",
589 				__func__);
590 		return 0;
591 	}
592 	/* internal */
593 	dib8000_write_word(state, 923, (0 << 1) | (0 << 0));
594 	dib8000_write_word(state, 924, 776);	// 0.625*3.3 / 4096
595 
596 	/* do the calibration */
597 	dib8000_write_word(state, 923, (1 << 0));
598 	dib8000_write_word(state, 923, (0 << 0));
599 
600 	msleep(1);
601 	return 0;
602 }
603 
604 int dib8000_set_wbd_ref(struct dvb_frontend *fe, u16 value)
605 {
606 	struct dib8000_state *state = fe->demodulator_priv;
607 	if (value > 4095)
608 		value = 4095;
609 	state->wbd_ref = value;
610 	return dib8000_write_word(state, 106, value);
611 }
612 
613 EXPORT_SYMBOL(dib8000_set_wbd_ref);
614 static void dib8000_reset_pll_common(struct dib8000_state *state, const struct dibx000_bandwidth_config *bw)
615 {
616 	dprintk("ifreq: %d %x, inversion: %d", bw->ifreq, bw->ifreq, bw->ifreq >> 25);
617 	if (state->revision != 0x8090) {
618 		dib8000_write_word(state, 23,
619 				(u16) (((bw->internal * 1000) >> 16) & 0xffff));
620 		dib8000_write_word(state, 24,
621 				(u16) ((bw->internal * 1000) & 0xffff));
622 	} else {
623 		dib8000_write_word(state, 23, (u16) (((bw->internal / 2 * 1000) >> 16) & 0xffff));
624 		dib8000_write_word(state, 24,
625 				(u16) ((bw->internal  / 2 * 1000) & 0xffff));
626 	}
627 	dib8000_write_word(state, 27, (u16) ((bw->ifreq >> 16) & 0x01ff));
628 	dib8000_write_word(state, 28, (u16) (bw->ifreq & 0xffff));
629 	dib8000_write_word(state, 26, (u16) ((bw->ifreq >> 25) & 0x0003));
630 
631 	if (state->revision != 0x8090)
632 		dib8000_write_word(state, 922, bw->sad_cfg);
633 }
634 
635 static void dib8000_reset_pll(struct dib8000_state *state)
636 {
637 	const struct dibx000_bandwidth_config *pll = state->cfg.pll;
638 	u16 clk_cfg1, reg;
639 
640 	if (state->revision != 0x8090) {
641 		dib8000_write_word(state, 901,
642 				(pll->pll_prediv << 8) | (pll->pll_ratio << 0));
643 
644 		clk_cfg1 = (1 << 10) | (0 << 9) | (pll->IO_CLK_en_core << 8) |
645 			(pll->bypclk_div << 5) | (pll->enable_refdiv << 4) |
646 			(1 << 3) | (pll->pll_range << 1) |
647 			(pll->pll_reset << 0);
648 
649 		dib8000_write_word(state, 902, clk_cfg1);
650 		clk_cfg1 = (clk_cfg1 & 0xfff7) | (pll->pll_bypass << 3);
651 		dib8000_write_word(state, 902, clk_cfg1);
652 
653 		dprintk("clk_cfg1: 0x%04x", clk_cfg1);
654 
655 		/* smpl_cfg: P_refclksel=2, P_ensmplsel=1 nodivsmpl=1 */
656 		if (state->cfg.pll->ADClkSrc == 0)
657 			dib8000_write_word(state, 904,
658 					(0 << 15) | (0 << 12) | (0 << 10) |
659 					(pll->modulo << 8) |
660 					(pll->ADClkSrc << 7) | (0 << 1));
661 		else if (state->cfg.refclksel != 0)
662 			dib8000_write_word(state, 904, (0 << 15) | (1 << 12) |
663 					((state->cfg.refclksel & 0x3) << 10) |
664 					(pll->modulo << 8) |
665 					(pll->ADClkSrc << 7) | (0 << 1));
666 		else
667 			dib8000_write_word(state, 904, (0 << 15) | (1 << 12) |
668 					(3 << 10) | (pll->modulo << 8) |
669 					(pll->ADClkSrc << 7) | (0 << 1));
670 	} else {
671 		dib8000_write_word(state, 1856, (!pll->pll_reset<<13) |
672 				(pll->pll_range<<12) | (pll->pll_ratio<<6) |
673 				(pll->pll_prediv));
674 
675 		reg = dib8000_read_word(state, 1857);
676 		dib8000_write_word(state, 1857, reg|(!pll->pll_bypass<<15));
677 
678 		reg = dib8000_read_word(state, 1858); /* Force clk out pll /2 */
679 		dib8000_write_word(state, 1858, reg | 1);
680 
681 		dib8000_write_word(state, 904, (pll->modulo << 8));
682 	}
683 
684 	dib8000_reset_pll_common(state, pll);
685 }
686 
687 int dib8000_update_pll(struct dvb_frontend *fe,
688 		struct dibx000_bandwidth_config *pll)
689 {
690 	struct dib8000_state *state = fe->demodulator_priv;
691 	u16 reg_1857, reg_1856 = dib8000_read_word(state, 1856);
692 	u8 loopdiv, prediv;
693 	u32 internal, xtal;
694 
695 	/* get back old values */
696 	prediv = reg_1856 & 0x3f;
697 	loopdiv = (reg_1856 >> 6) & 0x3f;
698 
699 	if ((pll != NULL) && (pll->pll_prediv != prediv ||
700 				pll->pll_ratio != loopdiv)) {
701 		dprintk("Updating pll (prediv: old =  %d new = %d ; loopdiv : old = %d new = %d)", prediv, pll->pll_prediv, loopdiv, pll->pll_ratio);
702 		reg_1856 &= 0xf000;
703 		reg_1857 = dib8000_read_word(state, 1857);
704 		/* disable PLL */
705 		dib8000_write_word(state, 1857, reg_1857 & ~(1 << 15));
706 
707 		dib8000_write_word(state, 1856, reg_1856 |
708 				((pll->pll_ratio & 0x3f) << 6) |
709 				(pll->pll_prediv & 0x3f));
710 
711 		/* write new system clk into P_sec_len */
712 		internal = dib8000_read32(state, 23) / 1000;
713 		dprintk("Old Internal = %d", internal);
714 		xtal = 2 * (internal / loopdiv) * prediv;
715 		internal = 1000 * (xtal/pll->pll_prediv) * pll->pll_ratio;
716 		dprintk("Xtal = %d , New Fmem = %d New Fdemod = %d, New Fsampling = %d", xtal, internal/1000, internal/2000, internal/8000);
717 		dprintk("New Internal = %d", internal);
718 
719 		dib8000_write_word(state, 23,
720 				(u16) (((internal / 2) >> 16) & 0xffff));
721 		dib8000_write_word(state, 24, (u16) ((internal / 2) & 0xffff));
722 		/* enable PLL */
723 		dib8000_write_word(state, 1857, reg_1857 | (1 << 15));
724 
725 		while (((dib8000_read_word(state, 1856)>>15)&0x1) != 1)
726 			dprintk("Waiting for PLL to lock");
727 
728 		/* verify */
729 		reg_1856 = dib8000_read_word(state, 1856);
730 		dprintk("PLL Updated with prediv = %d and loopdiv = %d",
731 				reg_1856&0x3f, (reg_1856>>6)&0x3f);
732 
733 		return 0;
734 	}
735 	return -EINVAL;
736 }
737 EXPORT_SYMBOL(dib8000_update_pll);
738 
739 
740 static int dib8000_reset_gpio(struct dib8000_state *st)
741 {
742 	/* reset the GPIOs */
743 	dib8000_write_word(st, 1029, st->cfg.gpio_dir);
744 	dib8000_write_word(st, 1030, st->cfg.gpio_val);
745 
746 	/* TODO 782 is P_gpio_od */
747 
748 	dib8000_write_word(st, 1032, st->cfg.gpio_pwm_pos);
749 
750 	dib8000_write_word(st, 1037, st->cfg.pwm_freq_div);
751 	return 0;
752 }
753 
754 static int dib8000_cfg_gpio(struct dib8000_state *st, u8 num, u8 dir, u8 val)
755 {
756 	st->cfg.gpio_dir = dib8000_read_word(st, 1029);
757 	st->cfg.gpio_dir &= ~(1 << num);	/* reset the direction bit */
758 	st->cfg.gpio_dir |= (dir & 0x1) << num;	/* set the new direction */
759 	dib8000_write_word(st, 1029, st->cfg.gpio_dir);
760 
761 	st->cfg.gpio_val = dib8000_read_word(st, 1030);
762 	st->cfg.gpio_val &= ~(1 << num);	/* reset the direction bit */
763 	st->cfg.gpio_val |= (val & 0x01) << num;	/* set the new value */
764 	dib8000_write_word(st, 1030, st->cfg.gpio_val);
765 
766 	dprintk("gpio dir: %x: gpio val: %x", st->cfg.gpio_dir, st->cfg.gpio_val);
767 
768 	return 0;
769 }
770 
771 int dib8000_set_gpio(struct dvb_frontend *fe, u8 num, u8 dir, u8 val)
772 {
773 	struct dib8000_state *state = fe->demodulator_priv;
774 	return dib8000_cfg_gpio(state, num, dir, val);
775 }
776 
777 EXPORT_SYMBOL(dib8000_set_gpio);
778 static const u16 dib8000_defaults[] = {
779 	/* auto search configuration - lock0 by default waiting
780 	 * for cpil_lock; lock1 cpil_lock; lock2 tmcc_sync_lock */
781 	3, 7,
782 	0x0004,
783 	0x0400,
784 	0x0814,
785 
786 	12, 11,
787 	0x001b,
788 	0x7740,
789 	0x005b,
790 	0x8d80,
791 	0x01c9,
792 	0xc380,
793 	0x0000,
794 	0x0080,
795 	0x0000,
796 	0x0090,
797 	0x0001,
798 	0xd4c0,
799 
800 	/*1, 32,
801 		0x6680 // P_corm_thres Lock algorithms configuration */
802 
803 	11, 80,			/* set ADC level to -16 */
804 	(1 << 13) - 825 - 117,
805 	(1 << 13) - 837 - 117,
806 	(1 << 13) - 811 - 117,
807 	(1 << 13) - 766 - 117,
808 	(1 << 13) - 737 - 117,
809 	(1 << 13) - 693 - 117,
810 	(1 << 13) - 648 - 117,
811 	(1 << 13) - 619 - 117,
812 	(1 << 13) - 575 - 117,
813 	(1 << 13) - 531 - 117,
814 	(1 << 13) - 501 - 117,
815 
816 	4, 108,
817 	0,
818 	0,
819 	0,
820 	0,
821 
822 	1, 175,
823 	0x0410,
824 	1, 179,
825 	8192,			// P_fft_nb_to_cut
826 
827 	6, 181,
828 	0x2800,			// P_coff_corthres_ ( 2k 4k 8k ) 0x2800
829 	0x2800,
830 	0x2800,
831 	0x2800,			// P_coff_cpilthres_ ( 2k 4k 8k ) 0x2800
832 	0x2800,
833 	0x2800,
834 
835 	2, 193,
836 	0x0666,			// P_pha3_thres
837 	0x0000,			// P_cti_use_cpe, P_cti_use_prog
838 
839 	2, 205,
840 	0x200f,			// P_cspu_regul, P_cspu_win_cut
841 	0x000f,			// P_des_shift_work
842 
843 	5, 215,
844 	0x023d,			// P_adp_regul_cnt
845 	0x00a4,			// P_adp_noise_cnt
846 	0x00a4,			// P_adp_regul_ext
847 	0x7ff0,			// P_adp_noise_ext
848 	0x3ccc,			// P_adp_fil
849 
850 	1, 230,
851 	0x0000,			// P_2d_byp_ti_num
852 
853 	1, 263,
854 	0x800,			//P_equal_thres_wgn
855 
856 	1, 268,
857 	(2 << 9) | 39,		// P_equal_ctrl_synchro, P_equal_speedmode
858 
859 	1, 270,
860 	0x0001,			// P_div_lock0_wait
861 	1, 285,
862 	0x0020,			//p_fec_
863 	1, 299,
864 	0x0062,			/* P_smo_mode, P_smo_rs_discard, P_smo_fifo_flush, P_smo_pid_parse, P_smo_error_discard */
865 
866 	1, 338,
867 	(1 << 12) |		// P_ctrl_corm_thres4pre_freq_inh=1
868 		(1 << 10) |
869 		(0 << 9) |		/* P_ctrl_pre_freq_inh=0 */
870 		(3 << 5) |		/* P_ctrl_pre_freq_step=3 */
871 		(1 << 0),		/* P_pre_freq_win_len=1 */
872 
873 	0,
874 };
875 
876 static u16 dib8000_identify(struct i2c_device *client)
877 {
878 	u16 value;
879 
880 	//because of glitches sometimes
881 	value = dib8000_i2c_read16(client, 896);
882 
883 	if ((value = dib8000_i2c_read16(client, 896)) != 0x01b3) {
884 		dprintk("wrong Vendor ID (read=0x%x)", value);
885 		return 0;
886 	}
887 
888 	value = dib8000_i2c_read16(client, 897);
889 	if (value != 0x8000 && value != 0x8001 &&
890 			value != 0x8002 && value != 0x8090) {
891 		dprintk("wrong Device ID (%x)", value);
892 		return 0;
893 	}
894 
895 	switch (value) {
896 	case 0x8000:
897 		dprintk("found DiB8000A");
898 		break;
899 	case 0x8001:
900 		dprintk("found DiB8000B");
901 		break;
902 	case 0x8002:
903 		dprintk("found DiB8000C");
904 		break;
905 	case 0x8090:
906 		dprintk("found DiB8096P");
907 		break;
908 	}
909 	return value;
910 }
911 
912 static int dib8000_reset(struct dvb_frontend *fe)
913 {
914 	struct dib8000_state *state = fe->demodulator_priv;
915 
916 	if ((state->revision = dib8000_identify(&state->i2c)) == 0)
917 		return -EINVAL;
918 
919 	/* sram lead in, rdy */
920 	if (state->revision != 0x8090)
921 		dib8000_write_word(state, 1287, 0x0003);
922 
923 	if (state->revision == 0x8000)
924 		dprintk("error : dib8000 MA not supported");
925 
926 	dibx000_reset_i2c_master(&state->i2c_master);
927 
928 	dib8000_set_power_mode(state, DIB8000_POWER_ALL);
929 
930 	/* always leave the VBG voltage on - it consumes almost nothing but takes a long time to start */
931 	dib8000_set_adc_state(state, DIBX000_VBG_ENABLE);
932 
933 	/* restart all parts */
934 	dib8000_write_word(state, 770, 0xffff);
935 	dib8000_write_word(state, 771, 0xffff);
936 	dib8000_write_word(state, 772, 0xfffc);
937 	if (state->revision == 0x8090)
938 		dib8000_write_word(state, 1280, 0x0045);
939 	else
940 		dib8000_write_word(state, 1280, 0x004d);
941 	dib8000_write_word(state, 1281, 0x000c);
942 
943 	dib8000_write_word(state, 770, 0x0000);
944 	dib8000_write_word(state, 771, 0x0000);
945 	dib8000_write_word(state, 772, 0x0000);
946 	dib8000_write_word(state, 898, 0x0004);	// sad
947 	dib8000_write_word(state, 1280, 0x0000);
948 	dib8000_write_word(state, 1281, 0x0000);
949 
950 	/* drives */
951 	if (state->revision != 0x8090) {
952 		if (state->cfg.drives)
953 			dib8000_write_word(state, 906, state->cfg.drives);
954 		else {
955 			dprintk("using standard PAD-drive-settings, please adjust settings in config-struct to be optimal.");
956 			/* min drive SDRAM - not optimal - adjust */
957 			dib8000_write_word(state, 906, 0x2d98);
958 		}
959 	}
960 
961 	dib8000_reset_pll(state);
962 	if (state->revision != 0x8090)
963 		dib8000_write_word(state, 898, 0x0004);
964 
965 	if (dib8000_reset_gpio(state) != 0)
966 		dprintk("GPIO reset was not successful.");
967 
968 	if ((state->revision != 0x8090) &&
969 			(dib8000_set_output_mode(fe, OUTMODE_HIGH_Z) != 0))
970 		dprintk("OUTPUT_MODE could not be resetted.");
971 
972 	state->current_agc = NULL;
973 
974 	// P_iqc_alpha_pha, P_iqc_alpha_amp, P_iqc_dcc_alpha, ...
975 	/* P_iqc_ca2 = 0; P_iqc_impnc_on = 0; P_iqc_mode = 0; */
976 	if (state->cfg.pll->ifreq == 0)
977 		dib8000_write_word(state, 40, 0x0755);	/* P_iqc_corr_inh = 0 enable IQcorr block */
978 	else
979 		dib8000_write_word(state, 40, 0x1f55);	/* P_iqc_corr_inh = 1 disable IQcorr block */
980 
981 	{
982 		u16 l = 0, r;
983 		const u16 *n;
984 		n = dib8000_defaults;
985 		l = *n++;
986 		while (l) {
987 			r = *n++;
988 			do {
989 				dib8000_write_word(state, r, *n++);
990 				r++;
991 			} while (--l);
992 			l = *n++;
993 		}
994 	}
995 	if (state->revision != 0x8090)
996 		dib8000_write_word(state, 903, (0 << 4) | 2);
997 	state->isdbt_cfg_loaded = 0;
998 
999 	//div_cfg override for special configs
1000 	if (state->cfg.div_cfg != 0)
1001 		dib8000_write_word(state, 903, state->cfg.div_cfg);
1002 
1003 	/* unforce divstr regardless whether i2c enumeration was done or not */
1004 	dib8000_write_word(state, 1285, dib8000_read_word(state, 1285) & ~(1 << 1));
1005 
1006 	dib8000_set_bandwidth(fe, 6000);
1007 
1008 	dib8000_set_adc_state(state, DIBX000_SLOW_ADC_ON);
1009 	if (state->revision != 0x8090) {
1010 		dib8000_sad_calib(state);
1011 		dib8000_set_adc_state(state, DIBX000_SLOW_ADC_OFF);
1012 	}
1013 
1014 	dib8000_set_power_mode(state, DIB8000_POWER_INTERFACE_ONLY);
1015 
1016 	return 0;
1017 }
1018 
1019 static void dib8000_restart_agc(struct dib8000_state *state)
1020 {
1021 	// P_restart_iqc & P_restart_agc
1022 	dib8000_write_word(state, 770, 0x0a00);
1023 	dib8000_write_word(state, 770, 0x0000);
1024 }
1025 
1026 static int dib8000_update_lna(struct dib8000_state *state)
1027 {
1028 	u16 dyn_gain;
1029 
1030 	if (state->cfg.update_lna) {
1031 		// read dyn_gain here (because it is demod-dependent and not tuner)
1032 		dyn_gain = dib8000_read_word(state, 390);
1033 
1034 		if (state->cfg.update_lna(state->fe[0], dyn_gain)) {
1035 			dib8000_restart_agc(state);
1036 			return 1;
1037 		}
1038 	}
1039 	return 0;
1040 }
1041 
1042 static int dib8000_set_agc_config(struct dib8000_state *state, u8 band)
1043 {
1044 	struct dibx000_agc_config *agc = NULL;
1045 	int i;
1046 	u16 reg;
1047 
1048 	if (state->current_band == band && state->current_agc != NULL)
1049 		return 0;
1050 	state->current_band = band;
1051 
1052 	for (i = 0; i < state->cfg.agc_config_count; i++)
1053 		if (state->cfg.agc[i].band_caps & band) {
1054 			agc = &state->cfg.agc[i];
1055 			break;
1056 		}
1057 
1058 	if (agc == NULL) {
1059 		dprintk("no valid AGC configuration found for band 0x%02x", band);
1060 		return -EINVAL;
1061 	}
1062 
1063 	state->current_agc = agc;
1064 
1065 	/* AGC */
1066 	dib8000_write_word(state, 76, agc->setup);
1067 	dib8000_write_word(state, 77, agc->inv_gain);
1068 	dib8000_write_word(state, 78, agc->time_stabiliz);
1069 	dib8000_write_word(state, 101, (agc->alpha_level << 12) | agc->thlock);
1070 
1071 	// Demod AGC loop configuration
1072 	dib8000_write_word(state, 102, (agc->alpha_mant << 5) | agc->alpha_exp);
1073 	dib8000_write_word(state, 103, (agc->beta_mant << 6) | agc->beta_exp);
1074 
1075 	dprintk("WBD: ref: %d, sel: %d, active: %d, alpha: %d",
1076 		state->wbd_ref != 0 ? state->wbd_ref : agc->wbd_ref, agc->wbd_sel, !agc->perform_agc_softsplit, agc->wbd_sel);
1077 
1078 	/* AGC continued */
1079 	if (state->wbd_ref != 0)
1080 		dib8000_write_word(state, 106, state->wbd_ref);
1081 	else			// use default
1082 		dib8000_write_word(state, 106, agc->wbd_ref);
1083 
1084 	if (state->revision == 0x8090) {
1085 		reg = dib8000_read_word(state, 922) & (0x3 << 2);
1086 		dib8000_write_word(state, 922, reg | (agc->wbd_sel << 2));
1087 	}
1088 
1089 	dib8000_write_word(state, 107, (agc->wbd_alpha << 9) | (agc->perform_agc_softsplit << 8));
1090 	dib8000_write_word(state, 108, agc->agc1_max);
1091 	dib8000_write_word(state, 109, agc->agc1_min);
1092 	dib8000_write_word(state, 110, agc->agc2_max);
1093 	dib8000_write_word(state, 111, agc->agc2_min);
1094 	dib8000_write_word(state, 112, (agc->agc1_pt1 << 8) | agc->agc1_pt2);
1095 	dib8000_write_word(state, 113, (agc->agc1_slope1 << 8) | agc->agc1_slope2);
1096 	dib8000_write_word(state, 114, (agc->agc2_pt1 << 8) | agc->agc2_pt2);
1097 	dib8000_write_word(state, 115, (agc->agc2_slope1 << 8) | agc->agc2_slope2);
1098 
1099 	dib8000_write_word(state, 75, agc->agc1_pt3);
1100 	if (state->revision != 0x8090)
1101 		dib8000_write_word(state, 923,
1102 				(dib8000_read_word(state, 923) & 0xffe3) |
1103 				(agc->wbd_inv << 4) | (agc->wbd_sel << 2));
1104 
1105 	return 0;
1106 }
1107 
1108 void dib8000_pwm_agc_reset(struct dvb_frontend *fe)
1109 {
1110 	struct dib8000_state *state = fe->demodulator_priv;
1111 	dib8000_set_adc_state(state, DIBX000_ADC_ON);
1112 	dib8000_set_agc_config(state, (unsigned char)(BAND_OF_FREQUENCY(fe->dtv_property_cache.frequency / 1000)));
1113 }
1114 EXPORT_SYMBOL(dib8000_pwm_agc_reset);
1115 
1116 static int dib8000_agc_soft_split(struct dib8000_state *state)
1117 {
1118 	u16 agc, split_offset;
1119 
1120 	if (!state->current_agc || !state->current_agc->perform_agc_softsplit || state->current_agc->split.max == 0)
1121 		return FE_CALLBACK_TIME_NEVER;
1122 
1123 	// n_agc_global
1124 	agc = dib8000_read_word(state, 390);
1125 
1126 	if (agc > state->current_agc->split.min_thres)
1127 		split_offset = state->current_agc->split.min;
1128 	else if (agc < state->current_agc->split.max_thres)
1129 		split_offset = state->current_agc->split.max;
1130 	else
1131 		split_offset = state->current_agc->split.max *
1132 			(agc - state->current_agc->split.min_thres) /
1133 			(state->current_agc->split.max_thres - state->current_agc->split.min_thres);
1134 
1135 	dprintk("AGC split_offset: %d", split_offset);
1136 
1137 	// P_agc_force_split and P_agc_split_offset
1138 	dib8000_write_word(state, 107, (dib8000_read_word(state, 107) & 0xff00) | split_offset);
1139 	return 5000;
1140 }
1141 
1142 static int dib8000_agc_startup(struct dvb_frontend *fe)
1143 {
1144 	struct dib8000_state *state = fe->demodulator_priv;
1145 	enum frontend_tune_state *tune_state = &state->tune_state;
1146 	int ret = 0;
1147 	u16 reg, upd_demod_gain_period = 0x8000;
1148 
1149 	switch (*tune_state) {
1150 	case CT_AGC_START:
1151 		// set power-up level: interf+analog+AGC
1152 
1153 		if (state->revision != 0x8090)
1154 			dib8000_set_adc_state(state, DIBX000_ADC_ON);
1155 		else {
1156 			dib8000_set_power_mode(state, DIB8000_POWER_ALL);
1157 
1158 			reg = dib8000_read_word(state, 1947)&0xff00;
1159 			dib8000_write_word(state, 1946,
1160 					upd_demod_gain_period & 0xFFFF);
1161 			/* bit 14 = enDemodGain */
1162 			dib8000_write_word(state, 1947, reg | (1<<14) |
1163 					((upd_demod_gain_period >> 16) & 0xFF));
1164 
1165 			/* enable adc i & q */
1166 			reg = dib8000_read_word(state, 1920);
1167 			dib8000_write_word(state, 1920, (reg | 0x3) &
1168 					(~(1 << 7)));
1169 		}
1170 
1171 		if (dib8000_set_agc_config(state, (unsigned char)(BAND_OF_FREQUENCY(fe->dtv_property_cache.frequency / 1000))) != 0) {
1172 			*tune_state = CT_AGC_STOP;
1173 			state->status = FE_STATUS_TUNE_FAILED;
1174 			break;
1175 		}
1176 
1177 		ret = 70;
1178 		*tune_state = CT_AGC_STEP_0;
1179 		break;
1180 
1181 	case CT_AGC_STEP_0:
1182 		//AGC initialization
1183 		if (state->cfg.agc_control)
1184 			state->cfg.agc_control(fe, 1);
1185 
1186 		dib8000_restart_agc(state);
1187 
1188 		// wait AGC rough lock time
1189 		ret = 50;
1190 		*tune_state = CT_AGC_STEP_1;
1191 		break;
1192 
1193 	case CT_AGC_STEP_1:
1194 		// wait AGC accurate lock time
1195 		ret = 70;
1196 
1197 		if (dib8000_update_lna(state))
1198 			// wait only AGC rough lock time
1199 			ret = 50;
1200 		else
1201 			*tune_state = CT_AGC_STEP_2;
1202 		break;
1203 
1204 	case CT_AGC_STEP_2:
1205 		dib8000_agc_soft_split(state);
1206 
1207 		if (state->cfg.agc_control)
1208 			state->cfg.agc_control(fe, 0);
1209 
1210 		*tune_state = CT_AGC_STOP;
1211 		break;
1212 	default:
1213 		ret = dib8000_agc_soft_split(state);
1214 		break;
1215 	}
1216 	return ret;
1217 
1218 }
1219 
1220 static void dib8096p_host_bus_drive(struct dib8000_state *state, u8 drive)
1221 {
1222 	u16 reg;
1223 
1224 	drive &= 0x7;
1225 
1226 	/* drive host bus 2, 3, 4 */
1227 	reg = dib8000_read_word(state, 1798) &
1228 		~(0x7 | (0x7 << 6) | (0x7 << 12));
1229 	reg |= (drive<<12) | (drive<<6) | drive;
1230 	dib8000_write_word(state, 1798, reg);
1231 
1232 	/* drive host bus 5,6 */
1233 	reg = dib8000_read_word(state, 1799) & ~((0x7 << 2) | (0x7 << 8));
1234 	reg |= (drive<<8) | (drive<<2);
1235 	dib8000_write_word(state, 1799, reg);
1236 
1237 	/* drive host bus 7, 8, 9 */
1238 	reg = dib8000_read_word(state, 1800) &
1239 		~(0x7 | (0x7 << 6) | (0x7 << 12));
1240 	reg |= (drive<<12) | (drive<<6) | drive;
1241 	dib8000_write_word(state, 1800, reg);
1242 
1243 	/* drive host bus 10, 11 */
1244 	reg = dib8000_read_word(state, 1801) & ~((0x7 << 2) | (0x7 << 8));
1245 	reg |= (drive<<8) | (drive<<2);
1246 	dib8000_write_word(state, 1801, reg);
1247 
1248 	/* drive host bus 12, 13, 14 */
1249 	reg = dib8000_read_word(state, 1802) &
1250 		~(0x7 | (0x7 << 6) | (0x7 << 12));
1251 	reg |= (drive<<12) | (drive<<6) | drive;
1252 	dib8000_write_word(state, 1802, reg);
1253 }
1254 
1255 static u32 dib8096p_calcSyncFreq(u32 P_Kin, u32 P_Kout,
1256 		u32 insertExtSynchro, u32 syncSize)
1257 {
1258 	u32 quantif = 3;
1259 	u32 nom = (insertExtSynchro * P_Kin+syncSize);
1260 	u32 denom = P_Kout;
1261 	u32 syncFreq = ((nom << quantif) / denom);
1262 
1263 	if ((syncFreq & ((1 << quantif) - 1)) != 0)
1264 		syncFreq = (syncFreq >> quantif) + 1;
1265 	else
1266 		syncFreq = (syncFreq >> quantif);
1267 
1268 	if (syncFreq != 0)
1269 		syncFreq = syncFreq - 1;
1270 
1271 	return syncFreq;
1272 }
1273 
1274 static void dib8096p_cfg_DibTx(struct dib8000_state *state, u32 P_Kin,
1275 		u32 P_Kout, u32 insertExtSynchro, u32 synchroMode,
1276 		u32 syncWord, u32 syncSize)
1277 {
1278 	dprintk("Configure DibStream Tx");
1279 
1280 	dib8000_write_word(state, 1615, 1);
1281 	dib8000_write_word(state, 1603, P_Kin);
1282 	dib8000_write_word(state, 1605, P_Kout);
1283 	dib8000_write_word(state, 1606, insertExtSynchro);
1284 	dib8000_write_word(state, 1608, synchroMode);
1285 	dib8000_write_word(state, 1609, (syncWord >> 16) & 0xffff);
1286 	dib8000_write_word(state, 1610, syncWord & 0xffff);
1287 	dib8000_write_word(state, 1612, syncSize);
1288 	dib8000_write_word(state, 1615, 0);
1289 }
1290 
1291 static void dib8096p_cfg_DibRx(struct dib8000_state *state, u32 P_Kin,
1292 		u32 P_Kout, u32 synchroMode, u32 insertExtSynchro,
1293 		u32 syncWord, u32 syncSize, u32 dataOutRate)
1294 {
1295 	u32 syncFreq;
1296 
1297 	dprintk("Configure DibStream Rx synchroMode = %d", synchroMode);
1298 
1299 	if ((P_Kin != 0) && (P_Kout != 0)) {
1300 		syncFreq = dib8096p_calcSyncFreq(P_Kin, P_Kout,
1301 				insertExtSynchro, syncSize);
1302 		dib8000_write_word(state, 1542, syncFreq);
1303 	}
1304 
1305 	dib8000_write_word(state, 1554, 1);
1306 	dib8000_write_word(state, 1536, P_Kin);
1307 	dib8000_write_word(state, 1537, P_Kout);
1308 	dib8000_write_word(state, 1539, synchroMode);
1309 	dib8000_write_word(state, 1540, (syncWord >> 16) & 0xffff);
1310 	dib8000_write_word(state, 1541, syncWord & 0xffff);
1311 	dib8000_write_word(state, 1543, syncSize);
1312 	dib8000_write_word(state, 1544, dataOutRate);
1313 	dib8000_write_word(state, 1554, 0);
1314 }
1315 
1316 static void dib8096p_enMpegMux(struct dib8000_state *state, int onoff)
1317 {
1318 	u16 reg_1287;
1319 
1320 	reg_1287 = dib8000_read_word(state, 1287);
1321 
1322 	switch (onoff) {
1323 	case 1:
1324 			reg_1287 &= ~(1 << 8);
1325 			break;
1326 	case 0:
1327 			reg_1287 |= (1 << 8);
1328 			break;
1329 	}
1330 
1331 	dib8000_write_word(state, 1287, reg_1287);
1332 }
1333 
1334 static void dib8096p_configMpegMux(struct dib8000_state *state,
1335 		u16 pulseWidth, u16 enSerialMode, u16 enSerialClkDiv2)
1336 {
1337 	u16 reg_1287;
1338 
1339 	dprintk("Enable Mpeg mux");
1340 
1341 	dib8096p_enMpegMux(state, 0);
1342 
1343 	/* If the input mode is MPEG do not divide the serial clock */
1344 	if ((enSerialMode == 1) && (state->input_mode_mpeg == 1))
1345 		enSerialClkDiv2 = 0;
1346 
1347 	reg_1287 = ((pulseWidth & 0x1f) << 3) |
1348 		((enSerialMode & 0x1) << 2) | (enSerialClkDiv2 & 0x1);
1349 	dib8000_write_word(state, 1287, reg_1287);
1350 
1351 	dib8096p_enMpegMux(state, 1);
1352 }
1353 
1354 static void dib8096p_setDibTxMux(struct dib8000_state *state, int mode)
1355 {
1356 	u16 reg_1288 = dib8000_read_word(state, 1288) & ~(0x7 << 7);
1357 
1358 	switch (mode) {
1359 	case MPEG_ON_DIBTX:
1360 			dprintk("SET MPEG ON DIBSTREAM TX");
1361 			dib8096p_cfg_DibTx(state, 8, 5, 0, 0, 0, 0);
1362 			reg_1288 |= (1 << 9); break;
1363 	case DIV_ON_DIBTX:
1364 			dprintk("SET DIV_OUT ON DIBSTREAM TX");
1365 			dib8096p_cfg_DibTx(state, 5, 5, 0, 0, 0, 0);
1366 			reg_1288 |= (1 << 8); break;
1367 	case ADC_ON_DIBTX:
1368 			dprintk("SET ADC_OUT ON DIBSTREAM TX");
1369 			dib8096p_cfg_DibTx(state, 20, 5, 10, 0, 0, 0);
1370 			reg_1288 |= (1 << 7); break;
1371 	default:
1372 			break;
1373 	}
1374 	dib8000_write_word(state, 1288, reg_1288);
1375 }
1376 
1377 static void dib8096p_setHostBusMux(struct dib8000_state *state, int mode)
1378 {
1379 	u16 reg_1288 = dib8000_read_word(state, 1288) & ~(0x7 << 4);
1380 
1381 	switch (mode) {
1382 	case DEMOUT_ON_HOSTBUS:
1383 			dprintk("SET DEM OUT OLD INTERF ON HOST BUS");
1384 			dib8096p_enMpegMux(state, 0);
1385 			reg_1288 |= (1 << 6);
1386 			break;
1387 	case DIBTX_ON_HOSTBUS:
1388 			dprintk("SET DIBSTREAM TX ON HOST BUS");
1389 			dib8096p_enMpegMux(state, 0);
1390 			reg_1288 |= (1 << 5);
1391 			break;
1392 	case MPEG_ON_HOSTBUS:
1393 			dprintk("SET MPEG MUX ON HOST BUS");
1394 			reg_1288 |= (1 << 4);
1395 			break;
1396 	default:
1397 			break;
1398 	}
1399 	dib8000_write_word(state, 1288, reg_1288);
1400 }
1401 
1402 static int dib8096p_set_diversity_in(struct dvb_frontend *fe, int onoff)
1403 {
1404 	struct dib8000_state *state = fe->demodulator_priv;
1405 	u16 reg_1287;
1406 
1407 	switch (onoff) {
1408 	case 0: /* only use the internal way - not the diversity input */
1409 			dprintk("%s mode OFF : by default Enable Mpeg INPUT",
1410 					__func__);
1411 			/* outputRate = 8 */
1412 			dib8096p_cfg_DibRx(state, 8, 5, 0, 0, 0, 8, 0);
1413 
1414 			/* Do not divide the serial clock of MPEG MUX in
1415 			   SERIAL MODE in case input mode MPEG is used */
1416 			reg_1287 = dib8000_read_word(state, 1287);
1417 			/* enSerialClkDiv2 == 1 ? */
1418 			if ((reg_1287 & 0x1) == 1) {
1419 				/* force enSerialClkDiv2 = 0 */
1420 				reg_1287 &= ~0x1;
1421 				dib8000_write_word(state, 1287, reg_1287);
1422 			}
1423 			state->input_mode_mpeg = 1;
1424 			break;
1425 	case 1: /* both ways */
1426 	case 2: /* only the diversity input */
1427 			dprintk("%s ON : Enable diversity INPUT", __func__);
1428 			dib8096p_cfg_DibRx(state, 5, 5, 0, 0, 0, 0, 0);
1429 			state->input_mode_mpeg = 0;
1430 			break;
1431 	}
1432 
1433 	dib8000_set_diversity_in(state->fe[0], onoff);
1434 	return 0;
1435 }
1436 
1437 static int dib8096p_set_output_mode(struct dvb_frontend *fe, int mode)
1438 {
1439 	struct dib8000_state *state = fe->demodulator_priv;
1440 	u16 outreg, smo_mode, fifo_threshold;
1441 	u8 prefer_mpeg_mux_use = 1;
1442 	int ret = 0;
1443 
1444 	dib8096p_host_bus_drive(state, 1);
1445 
1446 	fifo_threshold = 1792;
1447 	smo_mode = (dib8000_read_word(state, 299) & 0x0050) | (1 << 1);
1448 	outreg   = dib8000_read_word(state, 1286) &
1449 		~((1 << 10) | (0x7 << 6) | (1 << 1));
1450 
1451 	switch (mode) {
1452 	case OUTMODE_HIGH_Z:
1453 			outreg = 0;
1454 			break;
1455 
1456 	case OUTMODE_MPEG2_SERIAL:
1457 			if (prefer_mpeg_mux_use) {
1458 				dprintk("dib8096P setting output mode TS_SERIAL using Mpeg Mux");
1459 				dib8096p_configMpegMux(state, 3, 1, 1);
1460 				dib8096p_setHostBusMux(state, MPEG_ON_HOSTBUS);
1461 			} else {/* Use Smooth block */
1462 				dprintk("dib8096P setting output mode TS_SERIAL using Smooth bloc");
1463 				dib8096p_setHostBusMux(state,
1464 						DEMOUT_ON_HOSTBUS);
1465 				outreg |= (2 << 6) | (0 << 1);
1466 			}
1467 			break;
1468 
1469 	case OUTMODE_MPEG2_PAR_GATED_CLK:
1470 			if (prefer_mpeg_mux_use) {
1471 				dprintk("dib8096P setting output mode TS_PARALLEL_GATED using Mpeg Mux");
1472 				dib8096p_configMpegMux(state, 2, 0, 0);
1473 				dib8096p_setHostBusMux(state, MPEG_ON_HOSTBUS);
1474 			} else { /* Use Smooth block */
1475 				dprintk("dib8096P setting output mode TS_PARALLEL_GATED using Smooth block");
1476 				dib8096p_setHostBusMux(state,
1477 						DEMOUT_ON_HOSTBUS);
1478 				outreg |= (0 << 6);
1479 			}
1480 			break;
1481 
1482 	case OUTMODE_MPEG2_PAR_CONT_CLK: /* Using Smooth block only */
1483 			dprintk("dib8096P setting output mode TS_PARALLEL_CONT using Smooth block");
1484 			dib8096p_setHostBusMux(state, DEMOUT_ON_HOSTBUS);
1485 			outreg |= (1 << 6);
1486 			break;
1487 
1488 	case OUTMODE_MPEG2_FIFO:
1489 			/* Using Smooth block because not supported
1490 			   by new Mpeg Mux bloc */
1491 			dprintk("dib8096P setting output mode TS_FIFO using Smooth block");
1492 			dib8096p_setHostBusMux(state, DEMOUT_ON_HOSTBUS);
1493 			outreg |= (5 << 6);
1494 			smo_mode |= (3 << 1);
1495 			fifo_threshold = 512;
1496 			break;
1497 
1498 	case OUTMODE_DIVERSITY:
1499 			dprintk("dib8096P setting output mode MODE_DIVERSITY");
1500 			dib8096p_setDibTxMux(state, DIV_ON_DIBTX);
1501 			dib8096p_setHostBusMux(state, DIBTX_ON_HOSTBUS);
1502 			break;
1503 
1504 	case OUTMODE_ANALOG_ADC:
1505 			dprintk("dib8096P setting output mode MODE_ANALOG_ADC");
1506 			dib8096p_setDibTxMux(state, ADC_ON_DIBTX);
1507 			dib8096p_setHostBusMux(state, DIBTX_ON_HOSTBUS);
1508 			break;
1509 	}
1510 
1511 	if (mode != OUTMODE_HIGH_Z)
1512 		outreg |= (1<<10);
1513 
1514 	dprintk("output_mpeg2_in_188_bytes = %d",
1515 			state->cfg.output_mpeg2_in_188_bytes);
1516 	if (state->cfg.output_mpeg2_in_188_bytes)
1517 		smo_mode |= (1 << 5);
1518 
1519 	ret |= dib8000_write_word(state, 299, smo_mode);
1520 	/* synchronous fread */
1521 	ret |= dib8000_write_word(state, 299 + 1, fifo_threshold);
1522 	ret |= dib8000_write_word(state, 1286, outreg);
1523 
1524 	return ret;
1525 }
1526 
1527 static int map_addr_to_serpar_number(struct i2c_msg *msg)
1528 {
1529 	if (msg->buf[0] <= 15)
1530 		msg->buf[0] -= 1;
1531 	else if (msg->buf[0] == 17)
1532 		msg->buf[0] = 15;
1533 	else if (msg->buf[0] == 16)
1534 		msg->buf[0] = 17;
1535 	else if (msg->buf[0] == 19)
1536 		msg->buf[0] = 16;
1537 	else if (msg->buf[0] >= 21 && msg->buf[0] <= 25)
1538 		msg->buf[0] -= 3;
1539 	else if (msg->buf[0] == 28)
1540 		msg->buf[0] = 23;
1541 	else if (msg->buf[0] == 99)
1542 		msg->buf[0] = 99;
1543 	else
1544 		return -EINVAL;
1545 	return 0;
1546 }
1547 
1548 static int dib8096p_tuner_write_serpar(struct i2c_adapter *i2c_adap,
1549 		struct i2c_msg msg[], int num)
1550 {
1551 	struct dib8000_state *state = i2c_get_adapdata(i2c_adap);
1552 	u8 n_overflow = 1;
1553 	u16 i = 1000;
1554 	u16 serpar_num = msg[0].buf[0];
1555 
1556 	while (n_overflow == 1 && i) {
1557 		n_overflow = (dib8000_read_word(state, 1984) >> 1) & 0x1;
1558 		i--;
1559 		if (i == 0)
1560 			dprintk("Tuner ITF: write busy (overflow)");
1561 	}
1562 	dib8000_write_word(state, 1985, (1 << 6) | (serpar_num & 0x3f));
1563 	dib8000_write_word(state, 1986, (msg[0].buf[1] << 8) | msg[0].buf[2]);
1564 
1565 	return num;
1566 }
1567 
1568 static int dib8096p_tuner_read_serpar(struct i2c_adapter *i2c_adap,
1569 		struct i2c_msg msg[], int num)
1570 {
1571 	struct dib8000_state *state = i2c_get_adapdata(i2c_adap);
1572 	u8 n_overflow = 1, n_empty = 1;
1573 	u16 i = 1000;
1574 	u16 serpar_num = msg[0].buf[0];
1575 	u16 read_word;
1576 
1577 	while (n_overflow == 1 && i) {
1578 		n_overflow = (dib8000_read_word(state, 1984) >> 1) & 0x1;
1579 		i--;
1580 		if (i == 0)
1581 			dprintk("TunerITF: read busy (overflow)");
1582 	}
1583 	dib8000_write_word(state, 1985, (0<<6) | (serpar_num&0x3f));
1584 
1585 	i = 1000;
1586 	while (n_empty == 1 && i) {
1587 		n_empty = dib8000_read_word(state, 1984)&0x1;
1588 		i--;
1589 		if (i == 0)
1590 			dprintk("TunerITF: read busy (empty)");
1591 	}
1592 
1593 	read_word = dib8000_read_word(state, 1987);
1594 	msg[1].buf[0] = (read_word >> 8) & 0xff;
1595 	msg[1].buf[1] = (read_word) & 0xff;
1596 
1597 	return num;
1598 }
1599 
1600 static int dib8096p_tuner_rw_serpar(struct i2c_adapter *i2c_adap,
1601 		struct i2c_msg msg[], int num)
1602 {
1603 	if (map_addr_to_serpar_number(&msg[0]) == 0) {
1604 		if (num == 1) /* write */
1605 			return dib8096p_tuner_write_serpar(i2c_adap, msg, 1);
1606 		else /* read */
1607 			return dib8096p_tuner_read_serpar(i2c_adap, msg, 2);
1608 	}
1609 	return num;
1610 }
1611 
1612 static int dib8096p_rw_on_apb(struct i2c_adapter *i2c_adap,
1613 		struct i2c_msg msg[], int num, u16 apb_address)
1614 {
1615 	struct dib8000_state *state = i2c_get_adapdata(i2c_adap);
1616 	u16 word;
1617 
1618 	if (num == 1) {		/* write */
1619 		dib8000_write_word(state, apb_address,
1620 				((msg[0].buf[1] << 8) | (msg[0].buf[2])));
1621 	} else {
1622 		word = dib8000_read_word(state, apb_address);
1623 		msg[1].buf[0] = (word >> 8) & 0xff;
1624 		msg[1].buf[1] = (word) & 0xff;
1625 	}
1626 	return num;
1627 }
1628 
1629 static int dib8096p_tuner_xfer(struct i2c_adapter *i2c_adap,
1630 		struct i2c_msg msg[], int num)
1631 {
1632 	struct dib8000_state *state = i2c_get_adapdata(i2c_adap);
1633 	u16 apb_address = 0, word;
1634 	int i = 0;
1635 
1636 	switch (msg[0].buf[0]) {
1637 	case 0x12:
1638 			apb_address = 1920;
1639 			break;
1640 	case 0x14:
1641 			apb_address = 1921;
1642 			break;
1643 	case 0x24:
1644 			apb_address = 1922;
1645 			break;
1646 	case 0x1a:
1647 			apb_address = 1923;
1648 			break;
1649 	case 0x22:
1650 			apb_address = 1924;
1651 			break;
1652 	case 0x33:
1653 			apb_address = 1926;
1654 			break;
1655 	case 0x34:
1656 			apb_address = 1927;
1657 			break;
1658 	case 0x35:
1659 			apb_address = 1928;
1660 			break;
1661 	case 0x36:
1662 			apb_address = 1929;
1663 			break;
1664 	case 0x37:
1665 			apb_address = 1930;
1666 			break;
1667 	case 0x38:
1668 			apb_address = 1931;
1669 			break;
1670 	case 0x39:
1671 			apb_address = 1932;
1672 			break;
1673 	case 0x2a:
1674 			apb_address = 1935;
1675 			break;
1676 	case 0x2b:
1677 			apb_address = 1936;
1678 			break;
1679 	case 0x2c:
1680 			apb_address = 1937;
1681 			break;
1682 	case 0x2d:
1683 			apb_address = 1938;
1684 			break;
1685 	case 0x2e:
1686 			apb_address = 1939;
1687 			break;
1688 	case 0x2f:
1689 			apb_address = 1940;
1690 			break;
1691 	case 0x30:
1692 			apb_address = 1941;
1693 			break;
1694 	case 0x31:
1695 			apb_address = 1942;
1696 			break;
1697 	case 0x32:
1698 			apb_address = 1943;
1699 			break;
1700 	case 0x3e:
1701 			apb_address = 1944;
1702 			break;
1703 	case 0x3f:
1704 			apb_address = 1945;
1705 			break;
1706 	case 0x40:
1707 			apb_address = 1948;
1708 			break;
1709 	case 0x25:
1710 			apb_address = 936;
1711 			break;
1712 	case 0x26:
1713 			apb_address = 937;
1714 			break;
1715 	case 0x27:
1716 			apb_address = 938;
1717 			break;
1718 	case 0x28:
1719 			apb_address = 939;
1720 			break;
1721 	case 0x1d:
1722 			/* get sad sel request */
1723 			i = ((dib8000_read_word(state, 921) >> 12)&0x3);
1724 			word = dib8000_read_word(state, 924+i);
1725 			msg[1].buf[0] = (word >> 8) & 0xff;
1726 			msg[1].buf[1] = (word) & 0xff;
1727 			return num;
1728 	case 0x1f:
1729 			if (num == 1) {	/* write */
1730 				word = (u16) ((msg[0].buf[1] << 8) |
1731 						msg[0].buf[2]);
1732 				/* in the VGAMODE Sel are located on bit 0/1 */
1733 				word &= 0x3;
1734 				word = (dib8000_read_word(state, 921) &
1735 						~(3<<12)) | (word<<12);
1736 				/* Set the proper input */
1737 				dib8000_write_word(state, 921, word);
1738 				return num;
1739 			}
1740 	}
1741 
1742 	if (apb_address != 0) /* R/W acces via APB */
1743 		return dib8096p_rw_on_apb(i2c_adap, msg, num, apb_address);
1744 	else  /* R/W access via SERPAR  */
1745 		return dib8096p_tuner_rw_serpar(i2c_adap, msg, num);
1746 
1747 	return 0;
1748 }
1749 
1750 static u32 dib8096p_i2c_func(struct i2c_adapter *adapter)
1751 {
1752 	return I2C_FUNC_I2C;
1753 }
1754 
1755 static struct i2c_algorithm dib8096p_tuner_xfer_algo = {
1756 	.master_xfer = dib8096p_tuner_xfer,
1757 	.functionality = dib8096p_i2c_func,
1758 };
1759 
1760 struct i2c_adapter *dib8096p_get_i2c_tuner(struct dvb_frontend *fe)
1761 {
1762 	struct dib8000_state *st = fe->demodulator_priv;
1763 	return &st->dib8096p_tuner_adap;
1764 }
1765 EXPORT_SYMBOL(dib8096p_get_i2c_tuner);
1766 
1767 int dib8096p_tuner_sleep(struct dvb_frontend *fe, int onoff)
1768 {
1769 	struct dib8000_state *state = fe->demodulator_priv;
1770 	u16 en_cur_state;
1771 
1772 	dprintk("sleep dib8096p: %d", onoff);
1773 
1774 	en_cur_state = dib8000_read_word(state, 1922);
1775 
1776 	/* LNAs and MIX are ON and therefore it is a valid configuration */
1777 	if (en_cur_state > 0xff)
1778 		state->tuner_enable = en_cur_state ;
1779 
1780 	if (onoff)
1781 		en_cur_state &= 0x00ff;
1782 	else {
1783 		if (state->tuner_enable != 0)
1784 			en_cur_state = state->tuner_enable;
1785 	}
1786 
1787 	dib8000_write_word(state, 1922, en_cur_state);
1788 
1789 	return 0;
1790 }
1791 EXPORT_SYMBOL(dib8096p_tuner_sleep);
1792 
1793 static const s32 lut_1000ln_mant[] =
1794 {
1795 	908, 7003, 7090, 7170, 7244, 7313, 7377, 7438, 7495, 7549, 7600
1796 };
1797 
1798 s32 dib8000_get_adc_power(struct dvb_frontend *fe, u8 mode)
1799 {
1800 	struct dib8000_state *state = fe->demodulator_priv;
1801 	u32 ix = 0, tmp_val = 0, exp = 0, mant = 0;
1802 	s32 val;
1803 
1804 	val = dib8000_read32(state, 384);
1805 	if (mode) {
1806 		tmp_val = val;
1807 		while (tmp_val >>= 1)
1808 			exp++;
1809 		mant = (val * 1000 / (1<<exp));
1810 		ix = (u8)((mant-1000)/100); /* index of the LUT */
1811 		val = (lut_1000ln_mant[ix] + 693*(exp-20) - 6908);
1812 		val = (val*256)/1000;
1813 	}
1814 	return val;
1815 }
1816 EXPORT_SYMBOL(dib8000_get_adc_power);
1817 
1818 int dib8090p_get_dc_power(struct dvb_frontend *fe, u8 IQ)
1819 {
1820 	struct dib8000_state *state = fe->demodulator_priv;
1821 	int val = 0;
1822 
1823 	switch (IQ) {
1824 	case 1:
1825 			val = dib8000_read_word(state, 403);
1826 			break;
1827 	case 0:
1828 			val = dib8000_read_word(state, 404);
1829 			break;
1830 	}
1831 	if (val  & 0x200)
1832 		val -= 1024;
1833 
1834 	return val;
1835 }
1836 EXPORT_SYMBOL(dib8090p_get_dc_power);
1837 
1838 static void dib8000_update_timf(struct dib8000_state *state)
1839 {
1840 	u32 timf = state->timf = dib8000_read32(state, 435);
1841 
1842 	dib8000_write_word(state, 29, (u16) (timf >> 16));
1843 	dib8000_write_word(state, 30, (u16) (timf & 0xffff));
1844 	dprintk("Updated timing frequency: %d (default: %d)", state->timf, state->timf_default);
1845 }
1846 
1847 u32 dib8000_ctrl_timf(struct dvb_frontend *fe, uint8_t op, uint32_t timf)
1848 {
1849 	struct dib8000_state *state = fe->demodulator_priv;
1850 
1851 	switch (op) {
1852 	case DEMOD_TIMF_SET:
1853 			state->timf = timf;
1854 			break;
1855 	case DEMOD_TIMF_UPDATE:
1856 			dib8000_update_timf(state);
1857 			break;
1858 	case DEMOD_TIMF_GET:
1859 			break;
1860 	}
1861 	dib8000_set_bandwidth(state->fe[0], 6000);
1862 
1863 	return state->timf;
1864 }
1865 EXPORT_SYMBOL(dib8000_ctrl_timf);
1866 
1867 static const u16 adc_target_16dB[11] = {
1868 	(1 << 13) - 825 - 117,
1869 	(1 << 13) - 837 - 117,
1870 	(1 << 13) - 811 - 117,
1871 	(1 << 13) - 766 - 117,
1872 	(1 << 13) - 737 - 117,
1873 	(1 << 13) - 693 - 117,
1874 	(1 << 13) - 648 - 117,
1875 	(1 << 13) - 619 - 117,
1876 	(1 << 13) - 575 - 117,
1877 	(1 << 13) - 531 - 117,
1878 	(1 << 13) - 501 - 117
1879 };
1880 static const u8 permu_seg[] = { 6, 5, 7, 4, 8, 3, 9, 2, 10, 1, 11, 0, 12 };
1881 
1882 static void dib8000_set_channel(struct dib8000_state *state, u8 seq, u8 autosearching)
1883 {
1884 	u16 mode, max_constellation, seg_diff_mask = 0, nbseg_diff = 0;
1885 	u8 guard, crate, constellation, timeI;
1886 	u16 i, coeff[4], P_cfr_left_edge = 0, P_cfr_right_edge = 0, seg_mask13 = 0x1fff;	// All 13 segments enabled
1887 	const s16 *ncoeff = NULL, *ana_fe;
1888 	u16 tmcc_pow = 0;
1889 	u16 coff_pow = 0x2800;
1890 	u16 init_prbs = 0xfff;
1891 	u16 ana_gain = 0;
1892 
1893 	if (state->revision == 0x8090)
1894 		dib8000_init_sdram(state);
1895 
1896 	if (state->ber_monitored_layer != LAYER_ALL)
1897 		dib8000_write_word(state, 285, (dib8000_read_word(state, 285) & 0x60) | state->ber_monitored_layer);
1898 	else
1899 		dib8000_write_word(state, 285, dib8000_read_word(state, 285) & 0x60);
1900 
1901 	i = dib8000_read_word(state, 26) & 1;	// P_dds_invspec
1902 	dib8000_write_word(state, 26, state->fe[0]->dtv_property_cache.inversion^i);
1903 
1904 	if (state->fe[0]->dtv_property_cache.isdbt_sb_mode) {
1905 		//compute new dds_freq for the seg and adjust prbs
1906 		int seg_offset =
1907 			state->fe[0]->dtv_property_cache.isdbt_sb_segment_idx -
1908 			(state->fe[0]->dtv_property_cache.isdbt_sb_segment_count / 2) -
1909 			(state->fe[0]->dtv_property_cache.isdbt_sb_segment_count % 2);
1910 		int clk = state->cfg.pll->internal;
1911 		u32 segtodds = ((u32) (430 << 23) / clk) << 3;	// segtodds = SegBW / Fclk * pow(2,26)
1912 		int dds_offset = seg_offset * segtodds;
1913 		int new_dds, sub_channel;
1914 		if ((state->fe[0]->dtv_property_cache.isdbt_sb_segment_count % 2) == 0)
1915 			dds_offset -= (int)(segtodds / 2);
1916 
1917 		if (state->cfg.pll->ifreq == 0) {
1918 			if ((state->fe[0]->dtv_property_cache.inversion ^ i) == 0) {
1919 				dib8000_write_word(state, 26, dib8000_read_word(state, 26) | 1);
1920 				new_dds = dds_offset;
1921 			} else
1922 				new_dds = dds_offset;
1923 
1924 			// We shift tuning frequency if the wanted segment is :
1925 			//  - the segment of center frequency with an odd total number of segments
1926 			//  - the segment to the left of center frequency with an even total number of segments
1927 			//  - the segment to the right of center frequency with an even total number of segments
1928 			if ((state->fe[0]->dtv_property_cache.delivery_system == SYS_ISDBT)
1929 				&& (state->fe[0]->dtv_property_cache.isdbt_sb_mode == 1)
1930 					&& (((state->fe[0]->dtv_property_cache.isdbt_sb_segment_count % 2)
1931 					  && (state->fe[0]->dtv_property_cache.isdbt_sb_segment_idx ==
1932 				  ((state->fe[0]->dtv_property_cache.isdbt_sb_segment_count / 2) + 1)))
1933 					 || (((state->fe[0]->dtv_property_cache.isdbt_sb_segment_count % 2) == 0)
1934 						 && (state->fe[0]->dtv_property_cache.isdbt_sb_segment_idx == (state->fe[0]->dtv_property_cache.isdbt_sb_segment_count / 2)))
1935 					 || (((state->fe[0]->dtv_property_cache.isdbt_sb_segment_count % 2) == 0)
1936 						 && (state->fe[0]->dtv_property_cache.isdbt_sb_segment_idx ==
1937 							 ((state->fe[0]->dtv_property_cache.isdbt_sb_segment_count / 2) + 1)))
1938 					)) {
1939 				new_dds -= ((u32) (850 << 22) / clk) << 4;	// new_dds = 850 (freq shift in KHz) / Fclk * pow(2,26)
1940 			}
1941 		} else {
1942 			if ((state->fe[0]->dtv_property_cache.inversion ^ i) == 0)
1943 				new_dds = state->cfg.pll->ifreq - dds_offset;
1944 			else
1945 				new_dds = state->cfg.pll->ifreq + dds_offset;
1946 		}
1947 		dib8000_write_word(state, 27, (u16) ((new_dds >> 16) & 0x01ff));
1948 		dib8000_write_word(state, 28, (u16) (new_dds & 0xffff));
1949 		if (state->fe[0]->dtv_property_cache.isdbt_sb_segment_count % 2)
1950 			sub_channel = ((state->fe[0]->dtv_property_cache.isdbt_sb_subchannel + (3 * seg_offset) + 1) % 41) / 3;
1951 		else
1952 			sub_channel = ((state->fe[0]->dtv_property_cache.isdbt_sb_subchannel + (3 * seg_offset)) % 41) / 3;
1953 		sub_channel -= 6;
1954 
1955 		if (state->fe[0]->dtv_property_cache.transmission_mode == TRANSMISSION_MODE_2K
1956 				|| state->fe[0]->dtv_property_cache.transmission_mode == TRANSMISSION_MODE_4K) {
1957 			dib8000_write_word(state, 219, dib8000_read_word(state, 219) | 0x1);	//adp_pass =1
1958 			dib8000_write_word(state, 190, dib8000_read_word(state, 190) | (0x1 << 14));	//pha3_force_pha_shift = 1
1959 		} else {
1960 			dib8000_write_word(state, 219, dib8000_read_word(state, 219) & 0xfffe);	//adp_pass =0
1961 			dib8000_write_word(state, 190, dib8000_read_word(state, 190) & 0xbfff);	//pha3_force_pha_shift = 0
1962 		}
1963 
1964 		switch (state->fe[0]->dtv_property_cache.transmission_mode) {
1965 		case TRANSMISSION_MODE_2K:
1966 			switch (sub_channel) {
1967 			case -6:
1968 				init_prbs = 0x0;
1969 				break;	// 41, 0, 1
1970 			case -5:
1971 				init_prbs = 0x423;
1972 				break;	// 02~04
1973 			case -4:
1974 				init_prbs = 0x9;
1975 				break;	// 05~07
1976 			case -3:
1977 				init_prbs = 0x5C7;
1978 				break;	// 08~10
1979 			case -2:
1980 				init_prbs = 0x7A6;
1981 				break;	// 11~13
1982 			case -1:
1983 				init_prbs = 0x3D8;
1984 				break;	// 14~16
1985 			case 0:
1986 				init_prbs = 0x527;
1987 				break;	// 17~19
1988 			case 1:
1989 				init_prbs = 0x7FF;
1990 				break;	// 20~22
1991 			case 2:
1992 				init_prbs = 0x79B;
1993 				break;	// 23~25
1994 			case 3:
1995 				init_prbs = 0x3D6;
1996 				break;	// 26~28
1997 			case 4:
1998 				init_prbs = 0x3A2;
1999 				break;	// 29~31
2000 			case 5:
2001 				init_prbs = 0x53B;
2002 				break;	// 32~34
2003 			case 6:
2004 				init_prbs = 0x2F4;
2005 				break;	// 35~37
2006 			default:
2007 			case 7:
2008 				init_prbs = 0x213;
2009 				break;	// 38~40
2010 			}
2011 			break;
2012 
2013 		case TRANSMISSION_MODE_4K:
2014 			switch (sub_channel) {
2015 			case -6:
2016 				init_prbs = 0x0;
2017 				break;	// 41, 0, 1
2018 			case -5:
2019 				init_prbs = 0x208;
2020 				break;	// 02~04
2021 			case -4:
2022 				init_prbs = 0xC3;
2023 				break;	// 05~07
2024 			case -3:
2025 				init_prbs = 0x7B9;
2026 				break;	// 08~10
2027 			case -2:
2028 				init_prbs = 0x423;
2029 				break;	// 11~13
2030 			case -1:
2031 				init_prbs = 0x5C7;
2032 				break;	// 14~16
2033 			case 0:
2034 				init_prbs = 0x3D8;
2035 				break;	// 17~19
2036 			case 1:
2037 				init_prbs = 0x7FF;
2038 				break;	// 20~22
2039 			case 2:
2040 				init_prbs = 0x3D6;
2041 				break;	// 23~25
2042 			case 3:
2043 				init_prbs = 0x53B;
2044 				break;	// 26~28
2045 			case 4:
2046 				init_prbs = 0x213;
2047 				break;	// 29~31
2048 			case 5:
2049 				init_prbs = 0x29;
2050 				break;	// 32~34
2051 			case 6:
2052 				init_prbs = 0xD0;
2053 				break;	// 35~37
2054 			default:
2055 			case 7:
2056 				init_prbs = 0x48E;
2057 				break;	// 38~40
2058 			}
2059 			break;
2060 
2061 		default:
2062 		case TRANSMISSION_MODE_8K:
2063 			switch (sub_channel) {
2064 			case -6:
2065 				init_prbs = 0x0;
2066 				break;	// 41, 0, 1
2067 			case -5:
2068 				init_prbs = 0x740;
2069 				break;	// 02~04
2070 			case -4:
2071 				init_prbs = 0x069;
2072 				break;	// 05~07
2073 			case -3:
2074 				init_prbs = 0x7DD;
2075 				break;	// 08~10
2076 			case -2:
2077 				init_prbs = 0x208;
2078 				break;	// 11~13
2079 			case -1:
2080 				init_prbs = 0x7B9;
2081 				break;	// 14~16
2082 			case 0:
2083 				init_prbs = 0x5C7;
2084 				break;	// 17~19
2085 			case 1:
2086 				init_prbs = 0x7FF;
2087 				break;	// 20~22
2088 			case 2:
2089 				init_prbs = 0x53B;
2090 				break;	// 23~25
2091 			case 3:
2092 				init_prbs = 0x29;
2093 				break;	// 26~28
2094 			case 4:
2095 				init_prbs = 0x48E;
2096 				break;	// 29~31
2097 			case 5:
2098 				init_prbs = 0x4C4;
2099 				break;	// 32~34
2100 			case 6:
2101 				init_prbs = 0x367;
2102 				break;	// 33~37
2103 			default:
2104 			case 7:
2105 				init_prbs = 0x684;
2106 				break;	// 38~40
2107 			}
2108 			break;
2109 		}
2110 	} else {
2111 		dib8000_write_word(state, 27, (u16) ((state->cfg.pll->ifreq >> 16) & 0x01ff));
2112 		dib8000_write_word(state, 28, (u16) (state->cfg.pll->ifreq & 0xffff));
2113 		dib8000_write_word(state, 26, (u16) ((state->cfg.pll->ifreq >> 25) & 0x0003));
2114 	}
2115 	/*P_mode == ?? */
2116 	dib8000_write_word(state, 10, (seq << 4));
2117 	//  dib8000_write_word(state, 287, (dib8000_read_word(state, 287) & 0xe000) | 0x1000);
2118 
2119 	switch (state->fe[0]->dtv_property_cache.guard_interval) {
2120 	case GUARD_INTERVAL_1_32:
2121 		guard = 0;
2122 		break;
2123 	case GUARD_INTERVAL_1_16:
2124 		guard = 1;
2125 		break;
2126 	case GUARD_INTERVAL_1_8:
2127 		guard = 2;
2128 		break;
2129 	case GUARD_INTERVAL_1_4:
2130 	default:
2131 		guard = 3;
2132 		break;
2133 	}
2134 
2135 	dib8000_write_word(state, 1, (init_prbs << 2) | (guard & 0x3));	// ADDR 1
2136 
2137 	max_constellation = DQPSK;
2138 	for (i = 0; i < 3; i++) {
2139 		switch (state->fe[0]->dtv_property_cache.layer[i].modulation) {
2140 		case DQPSK:
2141 			constellation = 0;
2142 			break;
2143 		case QPSK:
2144 			constellation = 1;
2145 			break;
2146 		case QAM_16:
2147 			constellation = 2;
2148 			break;
2149 		case QAM_64:
2150 		default:
2151 			constellation = 3;
2152 			break;
2153 		}
2154 
2155 		switch (state->fe[0]->dtv_property_cache.layer[i].fec) {
2156 		case FEC_1_2:
2157 			crate = 1;
2158 			break;
2159 		case FEC_2_3:
2160 			crate = 2;
2161 			break;
2162 		case FEC_3_4:
2163 			crate = 3;
2164 			break;
2165 		case FEC_5_6:
2166 			crate = 5;
2167 			break;
2168 		case FEC_7_8:
2169 		default:
2170 			crate = 7;
2171 			break;
2172 		}
2173 
2174 		if ((state->fe[0]->dtv_property_cache.layer[i].interleaving > 0) &&
2175 				((state->fe[0]->dtv_property_cache.layer[i].interleaving <= 3) ||
2176 				 (state->fe[0]->dtv_property_cache.layer[i].interleaving == 4 && state->fe[0]->dtv_property_cache.isdbt_sb_mode == 1))
2177 			)
2178 			timeI = state->fe[0]->dtv_property_cache.layer[i].interleaving;
2179 		else
2180 			timeI = 0;
2181 		dib8000_write_word(state, 2 + i, (constellation << 10) | ((state->fe[0]->dtv_property_cache.layer[i].segment_count & 0xf) << 6) |
2182 					(crate << 3) | timeI);
2183 		if (state->fe[0]->dtv_property_cache.layer[i].segment_count > 0) {
2184 			switch (max_constellation) {
2185 			case DQPSK:
2186 			case QPSK:
2187 				if (state->fe[0]->dtv_property_cache.layer[i].modulation == QAM_16 ||
2188 					state->fe[0]->dtv_property_cache.layer[i].modulation == QAM_64)
2189 					max_constellation = state->fe[0]->dtv_property_cache.layer[i].modulation;
2190 				break;
2191 			case QAM_16:
2192 				if (state->fe[0]->dtv_property_cache.layer[i].modulation == QAM_64)
2193 					max_constellation = state->fe[0]->dtv_property_cache.layer[i].modulation;
2194 				break;
2195 			}
2196 		}
2197 	}
2198 
2199 	mode = fft_to_mode(state);
2200 
2201 	//dib8000_write_word(state, 5, 13); /*p_last_seg = 13*/
2202 
2203 	dib8000_write_word(state, 274, (dib8000_read_word(state, 274) & 0xffcf) |
2204 				((state->fe[0]->dtv_property_cache.isdbt_partial_reception & 1) << 5) | ((state->fe[0]->dtv_property_cache.
2205 												 isdbt_sb_mode & 1) << 4));
2206 
2207 	dprintk("mode = %d ; guard = %d", mode, state->fe[0]->dtv_property_cache.guard_interval);
2208 
2209 	/* signal optimization parameter */
2210 
2211 	if (state->fe[0]->dtv_property_cache.isdbt_partial_reception) {
2212 		seg_diff_mask = (state->fe[0]->dtv_property_cache.layer[0].modulation == DQPSK) << permu_seg[0];
2213 		for (i = 1; i < 3; i++)
2214 			nbseg_diff +=
2215 				(state->fe[0]->dtv_property_cache.layer[i].modulation == DQPSK) * state->fe[0]->dtv_property_cache.layer[i].segment_count;
2216 		for (i = 0; i < nbseg_diff; i++)
2217 			seg_diff_mask |= 1 << permu_seg[i + 1];
2218 	} else {
2219 		for (i = 0; i < 3; i++)
2220 			nbseg_diff +=
2221 				(state->fe[0]->dtv_property_cache.layer[i].modulation == DQPSK) * state->fe[0]->dtv_property_cache.layer[i].segment_count;
2222 		for (i = 0; i < nbseg_diff; i++)
2223 			seg_diff_mask |= 1 << permu_seg[i];
2224 	}
2225 	dprintk("nbseg_diff = %X (%d)", seg_diff_mask, seg_diff_mask);
2226 
2227 	state->differential_constellation = (seg_diff_mask != 0);
2228 	if (state->revision != 0x8090)
2229 		dib8000_set_diversity_in(state->fe[0], state->diversity_onoff);
2230 	else
2231 		dib8096p_set_diversity_in(state->fe[0], state->diversity_onoff);
2232 
2233 	if (state->fe[0]->dtv_property_cache.isdbt_sb_mode == 1) {
2234 		if (state->fe[0]->dtv_property_cache.isdbt_partial_reception == 1)
2235 			seg_mask13 = 0x00E0;
2236 		else		// 1-segment
2237 			seg_mask13 = 0x0040;
2238 	} else
2239 		seg_mask13 = 0x1fff;
2240 
2241 	// WRITE: Mode & Diff mask
2242 	dib8000_write_word(state, 0, (mode << 13) | seg_diff_mask);
2243 
2244 	if ((seg_diff_mask) || (state->fe[0]->dtv_property_cache.isdbt_sb_mode))
2245 		dib8000_write_word(state, 268, (dib8000_read_word(state, 268) & 0xF9FF) | 0x0200);
2246 	else
2247 		dib8000_write_word(state, 268, (2 << 9) | 39);	//init value
2248 
2249 	// ---- SMALL ----
2250 	// P_small_seg_diff
2251 	dib8000_write_word(state, 352, seg_diff_mask);	// ADDR 352
2252 
2253 	dib8000_write_word(state, 353, seg_mask13);	// ADDR 353
2254 
2255 /*	// P_small_narrow_band=0, P_small_last_seg=13, P_small_offset_num_car=5 */
2256 
2257 	// ---- SMALL ----
2258 	if (state->fe[0]->dtv_property_cache.isdbt_sb_mode == 1) {
2259 		switch (state->fe[0]->dtv_property_cache.transmission_mode) {
2260 		case TRANSMISSION_MODE_2K:
2261 			if (state->fe[0]->dtv_property_cache.isdbt_partial_reception == 0) {
2262 				if (state->fe[0]->dtv_property_cache.layer[0].modulation == DQPSK)
2263 					ncoeff = coeff_2k_sb_1seg_dqpsk;
2264 				else	// QPSK or QAM
2265 					ncoeff = coeff_2k_sb_1seg;
2266 			} else {	// 3-segments
2267 				if (state->fe[0]->dtv_property_cache.layer[0].modulation == DQPSK) {
2268 					if (state->fe[0]->dtv_property_cache.layer[1].modulation == DQPSK)
2269 						ncoeff = coeff_2k_sb_3seg_0dqpsk_1dqpsk;
2270 					else	// QPSK or QAM on external segments
2271 						ncoeff = coeff_2k_sb_3seg_0dqpsk;
2272 				} else {	// QPSK or QAM on central segment
2273 					if (state->fe[0]->dtv_property_cache.layer[1].modulation == DQPSK)
2274 						ncoeff = coeff_2k_sb_3seg_1dqpsk;
2275 					else	// QPSK or QAM on external segments
2276 						ncoeff = coeff_2k_sb_3seg;
2277 				}
2278 			}
2279 			break;
2280 
2281 		case TRANSMISSION_MODE_4K:
2282 			if (state->fe[0]->dtv_property_cache.isdbt_partial_reception == 0) {
2283 				if (state->fe[0]->dtv_property_cache.layer[0].modulation == DQPSK)
2284 					ncoeff = coeff_4k_sb_1seg_dqpsk;
2285 				else	// QPSK or QAM
2286 					ncoeff = coeff_4k_sb_1seg;
2287 			} else {	// 3-segments
2288 				if (state->fe[0]->dtv_property_cache.layer[0].modulation == DQPSK) {
2289 					if (state->fe[0]->dtv_property_cache.layer[1].modulation == DQPSK) {
2290 						ncoeff = coeff_4k_sb_3seg_0dqpsk_1dqpsk;
2291 					} else {	// QPSK or QAM on external segments
2292 						ncoeff = coeff_4k_sb_3seg_0dqpsk;
2293 					}
2294 				} else {	// QPSK or QAM on central segment
2295 					if (state->fe[0]->dtv_property_cache.layer[1].modulation == DQPSK) {
2296 						ncoeff = coeff_4k_sb_3seg_1dqpsk;
2297 					} else	// QPSK or QAM on external segments
2298 						ncoeff = coeff_4k_sb_3seg;
2299 				}
2300 			}
2301 			break;
2302 
2303 		case TRANSMISSION_MODE_AUTO:
2304 		case TRANSMISSION_MODE_8K:
2305 		default:
2306 			if (state->fe[0]->dtv_property_cache.isdbt_partial_reception == 0) {
2307 				if (state->fe[0]->dtv_property_cache.layer[0].modulation == DQPSK)
2308 					ncoeff = coeff_8k_sb_1seg_dqpsk;
2309 				else	// QPSK or QAM
2310 					ncoeff = coeff_8k_sb_1seg;
2311 			} else {	// 3-segments
2312 				if (state->fe[0]->dtv_property_cache.layer[0].modulation == DQPSK) {
2313 					if (state->fe[0]->dtv_property_cache.layer[1].modulation == DQPSK) {
2314 						ncoeff = coeff_8k_sb_3seg_0dqpsk_1dqpsk;
2315 					} else {	// QPSK or QAM on external segments
2316 						ncoeff = coeff_8k_sb_3seg_0dqpsk;
2317 					}
2318 				} else {	// QPSK or QAM on central segment
2319 					if (state->fe[0]->dtv_property_cache.layer[1].modulation == DQPSK) {
2320 						ncoeff = coeff_8k_sb_3seg_1dqpsk;
2321 					} else	// QPSK or QAM on external segments
2322 						ncoeff = coeff_8k_sb_3seg;
2323 				}
2324 			}
2325 			break;
2326 		}
2327 		for (i = 0; i < 8; i++)
2328 			dib8000_write_word(state, 343 + i, ncoeff[i]);
2329 	}
2330 
2331 	// P_small_coef_ext_enable=ISDB-Tsb, P_small_narrow_band=ISDB-Tsb, P_small_last_seg=13, P_small_offset_num_car=5
2332 	dib8000_write_word(state, 351,
2333 				(state->fe[0]->dtv_property_cache.isdbt_sb_mode << 9) | (state->fe[0]->dtv_property_cache.isdbt_sb_mode << 8) | (13 << 4) | 5);
2334 
2335 	// ---- COFF ----
2336 	// Carloff, the most robust
2337 	if (state->fe[0]->dtv_property_cache.isdbt_sb_mode == 1) {
2338 
2339 		// P_coff_cpil_alpha=4, P_coff_inh=0, P_coff_cpil_winlen=64
2340 		// 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
2341 		dib8000_write_word(state, 187,
2342 					(4 << 12) | (0 << 11) | (63 << 5) | (0x3 << 3) | ((~state->fe[0]->dtv_property_cache.isdbt_partial_reception & 1) << 2)
2343 					| 0x3);
2344 
2345 /*		// P_small_coef_ext_enable = 1 */
2346 /*		dib8000_write_word(state, 351, dib8000_read_word(state, 351) | 0x200); */
2347 
2348 		if (state->fe[0]->dtv_property_cache.isdbt_partial_reception == 0) {
2349 
2350 			// 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)
2351 			if (mode == 3)
2352 				dib8000_write_word(state, 180, 0x1fcf | ((mode - 1) << 14));
2353 			else
2354 				dib8000_write_word(state, 180, 0x0fcf | ((mode - 1) << 14));
2355 			// P_ctrl_corm_thres4pre_freq_inh=1,P_ctrl_pre_freq_mode_sat=1,
2356 			// P_ctrl_pre_freq_inh=0, P_ctrl_pre_freq_step = 5, P_pre_freq_win_len=4
2357 			dib8000_write_word(state, 338, (1 << 12) | (1 << 10) | (0 << 9) | (5 << 5) | 4);
2358 			// P_ctrl_pre_freq_win_len=16, P_ctrl_pre_freq_thres_lockin=8
2359 			dib8000_write_word(state, 340, (16 << 6) | (8 << 0));
2360 			// P_ctrl_pre_freq_thres_lockout=6, P_small_use_tmcc/ac/cp=1
2361 			dib8000_write_word(state, 341, (6 << 3) | (1 << 2) | (1 << 1) | (1 << 0));
2362 
2363 			// P_coff_corthres_8k, 4k, 2k and P_coff_cpilthres_8k, 4k, 2k
2364 			dib8000_write_word(state, 181, 300);
2365 			dib8000_write_word(state, 182, 150);
2366 			dib8000_write_word(state, 183, 80);
2367 			dib8000_write_word(state, 184, 300);
2368 			dib8000_write_word(state, 185, 150);
2369 			dib8000_write_word(state, 186, 80);
2370 		} else {	// Sound Broadcasting mode 3 seg
2371 			// P_coff_one_seg_sym= 1, P_coff_one_seg_width= 1, P_coff_winlen=63, P_coff_thres_lock=15
2372 			/*	if (mode == 3) */
2373 			/*		dib8000_write_word(state, 180, 0x2fca | ((0) << 14)); */
2374 			/*	else */
2375 			/*		dib8000_write_word(state, 180, 0x2fca | ((1) << 14)); */
2376 			dib8000_write_word(state, 180, 0x1fcf | (1 << 14));
2377 
2378 			// P_ctrl_corm_thres4pre_freq_inh = 1, P_ctrl_pre_freq_mode_sat=1,
2379 			// P_ctrl_pre_freq_inh=0, P_ctrl_pre_freq_step = 4, P_pre_freq_win_len=4
2380 			dib8000_write_word(state, 338, (1 << 12) | (1 << 10) | (0 << 9) | (4 << 5) | 4);
2381 			// P_ctrl_pre_freq_win_len=16, P_ctrl_pre_freq_thres_lockin=8
2382 			dib8000_write_word(state, 340, (16 << 6) | (8 << 0));
2383 			//P_ctrl_pre_freq_thres_lockout=6, P_small_use_tmcc/ac/cp=1
2384 			dib8000_write_word(state, 341, (6 << 3) | (1 << 2) | (1 << 1) | (1 << 0));
2385 
2386 			// P_coff_corthres_8k, 4k, 2k and P_coff_cpilthres_8k, 4k, 2k
2387 			dib8000_write_word(state, 181, 350);
2388 			dib8000_write_word(state, 182, 300);
2389 			dib8000_write_word(state, 183, 250);
2390 			dib8000_write_word(state, 184, 350);
2391 			dib8000_write_word(state, 185, 300);
2392 			dib8000_write_word(state, 186, 250);
2393 		}
2394 
2395 	} else if (state->isdbt_cfg_loaded == 0) {	// if not Sound Broadcasting mode : put default values for 13 segments
2396 		dib8000_write_word(state, 180, (16 << 6) | 9);
2397 		dib8000_write_word(state, 187, (4 << 12) | (8 << 5) | 0x2);
2398 		coff_pow = 0x2800;
2399 		for (i = 0; i < 6; i++)
2400 			dib8000_write_word(state, 181 + i, coff_pow);
2401 
2402 		// P_ctrl_corm_thres4pre_freq_inh=1, P_ctrl_pre_freq_mode_sat=1,
2403 		// 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
2404 		dib8000_write_word(state, 338, (1 << 12) | (1 << 10) | (0 << 9) | (3 << 5) | 1);
2405 
2406 		// P_ctrl_pre_freq_win_len=8, P_ctrl_pre_freq_thres_lockin=6
2407 		dib8000_write_word(state, 340, (8 << 6) | (6 << 0));
2408 		// P_ctrl_pre_freq_thres_lockout=4, P_small_use_tmcc/ac/cp=1
2409 		dib8000_write_word(state, 341, (4 << 3) | (1 << 2) | (1 << 1) | (1 << 0));
2410 	}
2411 	// ---- FFT ----
2412 	if (state->fe[0]->dtv_property_cache.isdbt_sb_mode == 1 && state->fe[0]->dtv_property_cache.isdbt_partial_reception == 0)
2413 		dib8000_write_word(state, 178, 64);	// P_fft_powrange=64
2414 	else
2415 		dib8000_write_word(state, 178, 32);	// P_fft_powrange=32
2416 
2417 	/* make the cpil_coff_lock more robust but slower p_coff_winlen
2418 	 * 6bits; p_coff_thres_lock 6bits (for coff lock if needed)
2419 	 */
2420 	/* if ( ( nbseg_diff>0)&&(nbseg_diff<13))
2421 		dib8000_write_word(state, 187, (dib8000_read_word(state, 187) & 0xfffb) | (1 << 3)); */
2422 
2423 	dib8000_write_word(state, 189, ~seg_mask13 | seg_diff_mask);	/* P_lmod4_seg_inh       */
2424 	dib8000_write_word(state, 192, ~seg_mask13 | seg_diff_mask);	/* P_pha3_seg_inh        */
2425 	dib8000_write_word(state, 225, ~seg_mask13 | seg_diff_mask);	/* P_tac_seg_inh         */
2426 	if ((!state->fe[0]->dtv_property_cache.isdbt_sb_mode) && (state->cfg.pll->ifreq == 0))
2427 		dib8000_write_word(state, 266, ~seg_mask13 | seg_diff_mask | 0x40);	/* P_equal_noise_seg_inh */
2428 	else
2429 		dib8000_write_word(state, 266, ~seg_mask13 | seg_diff_mask);	/* P_equal_noise_seg_inh */
2430 	dib8000_write_word(state, 287, ~seg_mask13 | 0x1000);	/* P_tmcc_seg_inh        */
2431 	//dib8000_write_word(state, 288, ~seg_mask13 | seg_diff_mask); /* P_tmcc_seg_eq_inh */
2432 	if (!autosearching)
2433 		dib8000_write_word(state, 288, (~seg_mask13 | seg_diff_mask) & 0x1fff);	/* P_tmcc_seg_eq_inh */
2434 	else
2435 		dib8000_write_word(state, 288, 0x1fff);	//disable equalisation of the tmcc when autosearch to be able to find the DQPSK channels.
2436 	dprintk("287 = %X (%d)", ~seg_mask13 | 0x1000, ~seg_mask13 | 0x1000);
2437 
2438 	dib8000_write_word(state, 211, seg_mask13 & (~seg_diff_mask));	/* P_des_seg_enabled     */
2439 
2440 	/* offset loop parameters */
2441 	if (state->fe[0]->dtv_property_cache.isdbt_sb_mode == 1) {
2442 		if (state->fe[0]->dtv_property_cache.isdbt_partial_reception == 0)
2443 			/* P_timf_alpha = (11-P_mode), P_corm_alpha=6, P_corm_thres=0x80 */
2444 			dib8000_write_word(state, 32, ((11 - mode) << 12) | (6 << 8) | 0x40);
2445 
2446 		else		// Sound Broadcasting mode 3 seg
2447 			/* P_timf_alpha = (10-P_mode), P_corm_alpha=6, P_corm_thres=0x80 */
2448 			dib8000_write_word(state, 32, ((10 - mode) << 12) | (6 << 8) | 0x60);
2449 	} else
2450 		// TODO in 13 seg, timf_alpha can always be the same or not ?
2451 		/* P_timf_alpha = (9-P_mode, P_corm_alpha=6, P_corm_thres=0x80 */
2452 		dib8000_write_word(state, 32, ((9 - mode) << 12) | (6 << 8) | 0x80);
2453 
2454 	if (state->fe[0]->dtv_property_cache.isdbt_sb_mode == 1) {
2455 		if (state->fe[0]->dtv_property_cache.isdbt_partial_reception == 0)
2456 			/* P_ctrl_pha_off_max=3   P_ctrl_sfreq_inh =0  P_ctrl_sfreq_step = (11-P_mode)  */
2457 			dib8000_write_word(state, 37, (3 << 5) | (0 << 4) | (10 - mode));
2458 
2459 		else		// Sound Broadcasting mode 3 seg
2460 			/* P_ctrl_pha_off_max=3   P_ctrl_sfreq_inh =0  P_ctrl_sfreq_step = (10-P_mode)  */
2461 			dib8000_write_word(state, 37, (3 << 5) | (0 << 4) | (9 - mode));
2462 	} else
2463 		/* P_ctrl_pha_off_max=3   P_ctrl_sfreq_inh =0  P_ctrl_sfreq_step = 9  */
2464 		dib8000_write_word(state, 37, (3 << 5) | (0 << 4) | (8 - mode));
2465 
2466 	/* P_dvsy_sync_wait - reuse mode */
2467 	switch (state->fe[0]->dtv_property_cache.transmission_mode) {
2468 	case TRANSMISSION_MODE_8K:
2469 		mode = 256;
2470 		break;
2471 	case TRANSMISSION_MODE_4K:
2472 		mode = 128;
2473 		break;
2474 	default:
2475 	case TRANSMISSION_MODE_2K:
2476 		mode = 64;
2477 		break;
2478 	}
2479 	if (state->cfg.diversity_delay == 0)
2480 		mode = (mode * (1 << (guard)) * 3) / 2 + 48;	// add 50% SFN margin + compensate for one DVSY-fifo
2481 	else
2482 		mode = (mode * (1 << (guard)) * 3) / 2 + state->cfg.diversity_delay;	// add 50% SFN margin + compensate for DVSY-fifo
2483 	mode <<= 4;
2484 	dib8000_write_word(state, 273, (dib8000_read_word(state, 273) & 0x000f) | mode);
2485 
2486 	/* channel estimation fine configuration */
2487 	switch (max_constellation) {
2488 	case QAM_64:
2489 		ana_gain = 0x7;	// -1 : avoid def_est saturation when ADC target is -16dB
2490 		coeff[0] = 0x0148;	/* P_adp_regul_cnt 0.04 */
2491 		coeff[1] = 0xfff0;	/* P_adp_noise_cnt -0.002 */
2492 		coeff[2] = 0x00a4;	/* P_adp_regul_ext 0.02 */
2493 		coeff[3] = 0xfff8;	/* P_adp_noise_ext -0.001 */
2494 		//if (!state->cfg.hostbus_diversity) //if diversity, we should prehaps use the configuration of the max_constallation -1
2495 		break;
2496 	case QAM_16:
2497 		ana_gain = 0x7;	// -1 : avoid def_est saturation when ADC target is -16dB
2498 		coeff[0] = 0x023d;	/* P_adp_regul_cnt 0.07 */
2499 		coeff[1] = 0xffdf;	/* P_adp_noise_cnt -0.004 */
2500 		coeff[2] = 0x00a4;	/* P_adp_regul_ext 0.02 */
2501 		coeff[3] = 0xfff0;	/* P_adp_noise_ext -0.002 */
2502 		//if (!((state->cfg.hostbus_diversity) && (max_constellation == QAM_16)))
2503 		break;
2504 	default:
2505 		ana_gain = 0;	// 0 : goes along with ADC target at -22dB to keep good mobile performance and lock at sensitivity level
2506 		coeff[0] = 0x099a;	/* P_adp_regul_cnt 0.3 */
2507 		coeff[1] = 0xffae;	/* P_adp_noise_cnt -0.01 */
2508 		coeff[2] = 0x0333;	/* P_adp_regul_ext 0.1 */
2509 		coeff[3] = 0xfff8;	/* P_adp_noise_ext -0.002 */
2510 		break;
2511 	}
2512 	for (mode = 0; mode < 4; mode++)
2513 		dib8000_write_word(state, 215 + mode, coeff[mode]);
2514 
2515 	// update ana_gain depending on max constellation
2516 	dib8000_write_word(state, 116, ana_gain);
2517 	// update ADC target depending on ana_gain
2518 	if (ana_gain) {		// set -16dB ADC target for ana_gain=-1
2519 		for (i = 0; i < 10; i++)
2520 			dib8000_write_word(state, 80 + i, adc_target_16dB[i]);
2521 	} else {		// set -22dB ADC target for ana_gain=0
2522 		for (i = 0; i < 10; i++)
2523 			dib8000_write_word(state, 80 + i, adc_target_16dB[i] - 355);
2524 	}
2525 
2526 	// ---- ANA_FE ----
2527 	if (state->fe[0]->dtv_property_cache.isdbt_sb_mode) {
2528 		if (state->fe[0]->dtv_property_cache.isdbt_partial_reception == 1)
2529 			ana_fe = ana_fe_coeff_3seg;
2530 		else		// 1-segment
2531 			ana_fe = ana_fe_coeff_1seg;
2532 	} else
2533 		ana_fe = ana_fe_coeff_13seg;
2534 
2535 	if (state->fe[0]->dtv_property_cache.isdbt_sb_mode == 1 || state->isdbt_cfg_loaded == 0)
2536 		for (mode = 0; mode < 24; mode++)
2537 			dib8000_write_word(state, 117 + mode, ana_fe[mode]);
2538 
2539 	// ---- CHAN_BLK ----
2540 	for (i = 0; i < 13; i++) {
2541 		if ((((~seg_diff_mask) >> i) & 1) == 1) {
2542 			P_cfr_left_edge += (1 << i) * ((i == 0) || ((((seg_mask13 & (~seg_diff_mask)) >> (i - 1)) & 1) == 0));
2543 			P_cfr_right_edge += (1 << i) * ((i == 12) || ((((seg_mask13 & (~seg_diff_mask)) >> (i + 1)) & 1) == 0));
2544 		}
2545 	}
2546 	dib8000_write_word(state, 222, P_cfr_left_edge);	// P_cfr_left_edge
2547 	dib8000_write_word(state, 223, P_cfr_right_edge);	// P_cfr_right_edge
2548 	// "P_cspu_left_edge"  not used => do not care
2549 	// "P_cspu_right_edge" not used => do not care
2550 
2551 	if (state->fe[0]->dtv_property_cache.isdbt_sb_mode == 1) {
2552 		dib8000_write_word(state, 228, 1);	// P_2d_mode_byp=1
2553 		dib8000_write_word(state, 205, dib8000_read_word(state, 205) & 0xfff0);	// P_cspu_win_cut = 0
2554 		if (state->fe[0]->dtv_property_cache.isdbt_partial_reception == 0
2555 			&& state->fe[0]->dtv_property_cache.transmission_mode == TRANSMISSION_MODE_2K) {
2556 			//dib8000_write_word(state, 219, dib8000_read_word(state, 219) & 0xfffe); // P_adp_pass = 0
2557 			dib8000_write_word(state, 265, 15);	// P_equal_noise_sel = 15
2558 		}
2559 	} else if (state->isdbt_cfg_loaded == 0) {
2560 		dib8000_write_word(state, 228, 0);	// default value
2561 		dib8000_write_word(state, 265, 31);	// default value
2562 		dib8000_write_word(state, 205, 0x200f);	// init value
2563 	}
2564 	// ---- TMCC ----
2565 	for (i = 0; i < 3; i++)
2566 		tmcc_pow +=
2567 			(((state->fe[0]->dtv_property_cache.layer[i].modulation == DQPSK) * 4 + 1) * state->fe[0]->dtv_property_cache.layer[i].segment_count);
2568 	// Quantif of "P_tmcc_dec_thres_?k" is (0, 5+mode, 9);
2569 	// Threshold is set at 1/4 of max power.
2570 	tmcc_pow *= (1 << (9 - 2));
2571 
2572 	dib8000_write_word(state, 290, tmcc_pow);	// P_tmcc_dec_thres_2k
2573 	dib8000_write_word(state, 291, tmcc_pow);	// P_tmcc_dec_thres_4k
2574 	dib8000_write_word(state, 292, tmcc_pow);	// P_tmcc_dec_thres_8k
2575 	//dib8000_write_word(state, 287, (1 << 13) | 0x1000 );
2576 	// ---- PHA3 ----
2577 
2578 	if (state->isdbt_cfg_loaded == 0)
2579 		dib8000_write_word(state, 250, 3285);	/*p_2d_hspeed_thr0 */
2580 
2581 	if (state->fe[0]->dtv_property_cache.isdbt_sb_mode == 1)
2582 		state->isdbt_cfg_loaded = 0;
2583 	else
2584 		state->isdbt_cfg_loaded = 1;
2585 
2586 }
2587 
2588 static int dib8000_autosearch_start(struct dvb_frontend *fe)
2589 {
2590 	u8 factor;
2591 	u32 value;
2592 	struct dib8000_state *state = fe->demodulator_priv;
2593 
2594 	int slist = 0;
2595 
2596 	state->fe[0]->dtv_property_cache.inversion = 0;
2597 	if (!state->fe[0]->dtv_property_cache.isdbt_sb_mode)
2598 		state->fe[0]->dtv_property_cache.layer[0].segment_count = 13;
2599 	state->fe[0]->dtv_property_cache.layer[0].modulation = QAM_64;
2600 	state->fe[0]->dtv_property_cache.layer[0].fec = FEC_2_3;
2601 	state->fe[0]->dtv_property_cache.layer[0].interleaving = 0;
2602 
2603 	//choose the right list, in sb, always do everything
2604 	if (state->fe[0]->dtv_property_cache.isdbt_sb_mode) {
2605 		state->fe[0]->dtv_property_cache.transmission_mode = TRANSMISSION_MODE_8K;
2606 		state->fe[0]->dtv_property_cache.guard_interval = GUARD_INTERVAL_1_8;
2607 		slist = 7;
2608 		dib8000_write_word(state, 0, (dib8000_read_word(state, 0) & 0x9fff) | (1 << 13));
2609 	} else {
2610 		if (state->fe[0]->dtv_property_cache.guard_interval == GUARD_INTERVAL_AUTO) {
2611 			if (state->fe[0]->dtv_property_cache.transmission_mode == TRANSMISSION_MODE_AUTO) {
2612 				slist = 7;
2613 				dib8000_write_word(state, 0, (dib8000_read_word(state, 0) & 0x9fff) | (1 << 13));	// P_mode = 1 to have autosearch start ok with mode2
2614 			} else
2615 				slist = 3;
2616 		} else {
2617 			if (state->fe[0]->dtv_property_cache.transmission_mode == TRANSMISSION_MODE_AUTO) {
2618 				slist = 2;
2619 				dib8000_write_word(state, 0, (dib8000_read_word(state, 0) & 0x9fff) | (1 << 13));	// P_mode = 1
2620 			} else
2621 				slist = 0;
2622 		}
2623 
2624 		if (state->fe[0]->dtv_property_cache.transmission_mode == TRANSMISSION_MODE_AUTO)
2625 			state->fe[0]->dtv_property_cache.transmission_mode = TRANSMISSION_MODE_8K;
2626 		if (state->fe[0]->dtv_property_cache.guard_interval == GUARD_INTERVAL_AUTO)
2627 			state->fe[0]->dtv_property_cache.guard_interval = GUARD_INTERVAL_1_8;
2628 
2629 		dprintk("using list for autosearch : %d", slist);
2630 		dib8000_set_channel(state, (unsigned char)slist, 1);
2631 		//dib8000_write_word(state, 0, (dib8000_read_word(state, 0) & 0x9fff) | (1 << 13));  // P_mode = 1
2632 
2633 		factor = 1;
2634 
2635 		//set lock_mask values
2636 		dib8000_write_word(state, 6, 0x4);
2637 		dib8000_write_word(state, 7, 0x8);
2638 		dib8000_write_word(state, 8, 0x1000);
2639 
2640 		//set lock_mask wait time values
2641 		value = 50 * state->cfg.pll->internal * factor;
2642 		dib8000_write_word(state, 11, (u16) ((value >> 16) & 0xffff));	// lock0 wait time
2643 		dib8000_write_word(state, 12, (u16) (value & 0xffff));	// lock0 wait time
2644 		value = 100 * state->cfg.pll->internal * factor;
2645 		dib8000_write_word(state, 13, (u16) ((value >> 16) & 0xffff));	// lock1 wait time
2646 		dib8000_write_word(state, 14, (u16) (value & 0xffff));	// lock1 wait time
2647 		value = 1000 * state->cfg.pll->internal * factor;
2648 		dib8000_write_word(state, 15, (u16) ((value >> 16) & 0xffff));	// lock2 wait time
2649 		dib8000_write_word(state, 16, (u16) (value & 0xffff));	// lock2 wait time
2650 
2651 		value = dib8000_read_word(state, 0);
2652 		dib8000_write_word(state, 0, (u16) ((1 << 15) | value));
2653 		dib8000_read_word(state, 1284);	// reset the INT. n_irq_pending
2654 		dib8000_write_word(state, 0, (u16) value);
2655 
2656 	}
2657 
2658 	return 0;
2659 }
2660 
2661 static int dib8000_autosearch_irq(struct dvb_frontend *fe)
2662 {
2663 	struct dib8000_state *state = fe->demodulator_priv;
2664 	u16 irq_pending = dib8000_read_word(state, 1284);
2665 
2666 	if (irq_pending & 0x1) {	// failed
2667 		dprintk("dib8000_autosearch_irq failed");
2668 		return 1;
2669 	}
2670 
2671 	if (irq_pending & 0x2) {	// succeeded
2672 		dprintk("dib8000_autosearch_irq succeeded");
2673 		return 2;
2674 	}
2675 
2676 	return 0;		// still pending
2677 }
2678 
2679 static int dib8000_tune(struct dvb_frontend *fe)
2680 {
2681 	struct dib8000_state *state = fe->demodulator_priv;
2682 	int ret = 0;
2683 	u16 lock, value, mode;
2684 
2685 	// we are already tuned - just resuming from suspend
2686 	if (state == NULL)
2687 		return -EINVAL;
2688 
2689 	mode = fft_to_mode(state);
2690 
2691 	dib8000_set_bandwidth(fe, state->fe[0]->dtv_property_cache.bandwidth_hz / 1000);
2692 	dib8000_set_channel(state, 0, 0);
2693 
2694 	// restart demod
2695 	ret |= dib8000_write_word(state, 770, 0x4000);
2696 	ret |= dib8000_write_word(state, 770, 0x0000);
2697 	msleep(45);
2698 
2699 	/* P_ctrl_inh_cor=0, P_ctrl_alpha_cor=4, P_ctrl_inh_isi=0, P_ctrl_alpha_isi=3 */
2700 	/*  ret |= dib8000_write_word(state, 29, (0 << 9) | (4 << 5) | (0 << 4) | (3 << 0) );  workaround inh_isi stays at 1 */
2701 
2702 	// never achieved a lock before - wait for timfreq to update
2703 	if (state->timf == 0) {
2704 		if (state->fe[0]->dtv_property_cache.isdbt_sb_mode == 1) {
2705 			if (state->fe[0]->dtv_property_cache.isdbt_partial_reception == 0)
2706 				msleep(300);
2707 			else	// Sound Broadcasting mode 3 seg
2708 				msleep(500);
2709 		} else		// 13 seg
2710 			msleep(200);
2711 	}
2712 	if (state->fe[0]->dtv_property_cache.isdbt_sb_mode == 1) {
2713 		if (state->fe[0]->dtv_property_cache.isdbt_partial_reception == 0) {
2714 
2715 			/* P_timf_alpha = (13-P_mode) , P_corm_alpha=6, P_corm_thres=0x40  alpha to check on board */
2716 			dib8000_write_word(state, 32, ((13 - mode) << 12) | (6 << 8) | 0x40);
2717 			//dib8000_write_word(state, 32, (8 << 12) | (6 << 8) | 0x80);
2718 
2719 			/*  P_ctrl_sfreq_step= (12-P_mode)   P_ctrl_sfreq_inh =0     P_ctrl_pha_off_max  */
2720 			ret |= dib8000_write_word(state, 37, (12 - mode) | ((5 + mode) << 5));
2721 
2722 		} else {	// Sound Broadcasting mode 3 seg
2723 
2724 			/* P_timf_alpha = (12-P_mode) , P_corm_alpha=6, P_corm_thres=0x60  alpha to check on board */
2725 			dib8000_write_word(state, 32, ((12 - mode) << 12) | (6 << 8) | 0x60);
2726 
2727 			ret |= dib8000_write_word(state, 37, (11 - mode) | ((5 + mode) << 5));
2728 		}
2729 
2730 	} else {		// 13 seg
2731 		/* P_timf_alpha = 8 , P_corm_alpha=6, P_corm_thres=0x80  alpha to check on board */
2732 		dib8000_write_word(state, 32, ((11 - mode) << 12) | (6 << 8) | 0x80);
2733 
2734 		ret |= dib8000_write_word(state, 37, (10 - mode) | ((5 + mode) << 5));
2735 
2736 	}
2737 
2738 	// we achieved a coff_cpil_lock - it's time to update the timf
2739 	if (state->revision != 0x8090)
2740 		lock = dib8000_read_word(state, 568);
2741 	else
2742 		lock = dib8000_read_word(state, 570);
2743 	if ((lock >> 11) & 0x1)
2744 		dib8000_update_timf(state);
2745 
2746 	//now that tune is finished, lock0 should lock on fec_mpeg to output this lock on MP_LOCK. It's changed in autosearch start
2747 	dib8000_write_word(state, 6, 0x200);
2748 
2749 	if (state->revision == 0x8002) {
2750 		value = dib8000_read_word(state, 903);
2751 		dib8000_write_word(state, 903, value & ~(1 << 3));
2752 		msleep(1);
2753 		dib8000_write_word(state, 903, value | (1 << 3));
2754 	}
2755 
2756 	return ret;
2757 }
2758 
2759 static int dib8000_wakeup(struct dvb_frontend *fe)
2760 {
2761 	struct dib8000_state *state = fe->demodulator_priv;
2762 	u8 index_frontend;
2763 	int ret;
2764 
2765 	dib8000_set_power_mode(state, DIB8000_POWER_ALL);
2766 	dib8000_set_adc_state(state, DIBX000_ADC_ON);
2767 	if (dib8000_set_adc_state(state, DIBX000_SLOW_ADC_ON) != 0)
2768 		dprintk("could not start Slow ADC");
2769 
2770 	if (state->revision != 0x8090)
2771 		dib8000_sad_calib(state);
2772 
2773 	for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
2774 		ret = state->fe[index_frontend]->ops.init(state->fe[index_frontend]);
2775 		if (ret < 0)
2776 			return ret;
2777 	}
2778 
2779 	return 0;
2780 }
2781 
2782 static int dib8000_sleep(struct dvb_frontend *fe)
2783 {
2784 	struct dib8000_state *state = fe->demodulator_priv;
2785 	u8 index_frontend;
2786 	int ret;
2787 
2788 	for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
2789 		ret = state->fe[index_frontend]->ops.sleep(state->fe[index_frontend]);
2790 		if (ret < 0)
2791 			return ret;
2792 	}
2793 
2794 	if (state->revision != 0x8090)
2795 		dib8000_set_output_mode(fe, OUTMODE_HIGH_Z);
2796 	dib8000_set_power_mode(state, DIB8000_POWER_INTERFACE_ONLY);
2797 	return dib8000_set_adc_state(state, DIBX000_SLOW_ADC_OFF) | dib8000_set_adc_state(state, DIBX000_ADC_OFF);
2798 }
2799 
2800 enum frontend_tune_state dib8000_get_tune_state(struct dvb_frontend *fe)
2801 {
2802 	struct dib8000_state *state = fe->demodulator_priv;
2803 	return state->tune_state;
2804 }
2805 EXPORT_SYMBOL(dib8000_get_tune_state);
2806 
2807 int dib8000_set_tune_state(struct dvb_frontend *fe, enum frontend_tune_state tune_state)
2808 {
2809 	struct dib8000_state *state = fe->demodulator_priv;
2810 	state->tune_state = tune_state;
2811 	return 0;
2812 }
2813 EXPORT_SYMBOL(dib8000_set_tune_state);
2814 
2815 static int dib8000_get_frontend(struct dvb_frontend *fe)
2816 {
2817 	struct dib8000_state *state = fe->demodulator_priv;
2818 	u16 i, val = 0;
2819 	fe_status_t stat;
2820 	u8 index_frontend, sub_index_frontend;
2821 
2822 	fe->dtv_property_cache.bandwidth_hz = 6000000;
2823 
2824 	for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
2825 		state->fe[index_frontend]->ops.read_status(state->fe[index_frontend], &stat);
2826 		if (stat&FE_HAS_SYNC) {
2827 			dprintk("TMCC lock on the slave%i", index_frontend);
2828 			/* synchronize the cache with the other frontends */
2829 			state->fe[index_frontend]->ops.get_frontend(state->fe[index_frontend]);
2830 			for (sub_index_frontend = 0; (sub_index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[sub_index_frontend] != NULL); sub_index_frontend++) {
2831 				if (sub_index_frontend != index_frontend) {
2832 					state->fe[sub_index_frontend]->dtv_property_cache.isdbt_sb_mode = state->fe[index_frontend]->dtv_property_cache.isdbt_sb_mode;
2833 					state->fe[sub_index_frontend]->dtv_property_cache.inversion = state->fe[index_frontend]->dtv_property_cache.inversion;
2834 					state->fe[sub_index_frontend]->dtv_property_cache.transmission_mode = state->fe[index_frontend]->dtv_property_cache.transmission_mode;
2835 					state->fe[sub_index_frontend]->dtv_property_cache.guard_interval = state->fe[index_frontend]->dtv_property_cache.guard_interval;
2836 					state->fe[sub_index_frontend]->dtv_property_cache.isdbt_partial_reception = state->fe[index_frontend]->dtv_property_cache.isdbt_partial_reception;
2837 					for (i = 0; i < 3; i++) {
2838 						state->fe[sub_index_frontend]->dtv_property_cache.layer[i].segment_count = state->fe[index_frontend]->dtv_property_cache.layer[i].segment_count;
2839 						state->fe[sub_index_frontend]->dtv_property_cache.layer[i].interleaving = state->fe[index_frontend]->dtv_property_cache.layer[i].interleaving;
2840 						state->fe[sub_index_frontend]->dtv_property_cache.layer[i].fec = state->fe[index_frontend]->dtv_property_cache.layer[i].fec;
2841 						state->fe[sub_index_frontend]->dtv_property_cache.layer[i].modulation = state->fe[index_frontend]->dtv_property_cache.layer[i].modulation;
2842 					}
2843 				}
2844 			}
2845 			return 0;
2846 		}
2847 	}
2848 
2849 	fe->dtv_property_cache.isdbt_sb_mode = dib8000_read_word(state, 508) & 0x1;
2850 
2851 	if (state->revision == 0x8090)
2852 		val = dib8000_read_word(state, 572);
2853 	else
2854 		val = dib8000_read_word(state, 570);
2855 	fe->dtv_property_cache.inversion = (val & 0x40) >> 6;
2856 	switch ((val & 0x30) >> 4) {
2857 	case 1:
2858 		fe->dtv_property_cache.transmission_mode = TRANSMISSION_MODE_2K;
2859 		break;
2860 	case 3:
2861 	default:
2862 		fe->dtv_property_cache.transmission_mode = TRANSMISSION_MODE_8K;
2863 		break;
2864 	}
2865 
2866 	switch (val & 0x3) {
2867 	case 0:
2868 		fe->dtv_property_cache.guard_interval = GUARD_INTERVAL_1_32;
2869 		dprintk("dib8000_get_frontend GI = 1/32 ");
2870 		break;
2871 	case 1:
2872 		fe->dtv_property_cache.guard_interval = GUARD_INTERVAL_1_16;
2873 		dprintk("dib8000_get_frontend GI = 1/16 ");
2874 		break;
2875 	case 2:
2876 		dprintk("dib8000_get_frontend GI = 1/8 ");
2877 		fe->dtv_property_cache.guard_interval = GUARD_INTERVAL_1_8;
2878 		break;
2879 	case 3:
2880 		dprintk("dib8000_get_frontend GI = 1/4 ");
2881 		fe->dtv_property_cache.guard_interval = GUARD_INTERVAL_1_4;
2882 		break;
2883 	}
2884 
2885 	val = dib8000_read_word(state, 505);
2886 	fe->dtv_property_cache.isdbt_partial_reception = val & 1;
2887 	dprintk("dib8000_get_frontend : partial_reception = %d ", fe->dtv_property_cache.isdbt_partial_reception);
2888 
2889 	for (i = 0; i < 3; i++) {
2890 		val = dib8000_read_word(state, 493 + i);
2891 		fe->dtv_property_cache.layer[i].segment_count = val & 0x0F;
2892 		dprintk("dib8000_get_frontend : Layer %d segments = %d ", i, fe->dtv_property_cache.layer[i].segment_count);
2893 
2894 		val = dib8000_read_word(state, 499 + i);
2895 		fe->dtv_property_cache.layer[i].interleaving = val & 0x3;
2896 		dprintk("dib8000_get_frontend : Layer %d time_intlv = %d ", i, fe->dtv_property_cache.layer[i].interleaving);
2897 
2898 		val = dib8000_read_word(state, 481 + i);
2899 		switch (val & 0x7) {
2900 		case 1:
2901 			fe->dtv_property_cache.layer[i].fec = FEC_1_2;
2902 			dprintk("dib8000_get_frontend : Layer %d Code Rate = 1/2 ", i);
2903 			break;
2904 		case 2:
2905 			fe->dtv_property_cache.layer[i].fec = FEC_2_3;
2906 			dprintk("dib8000_get_frontend : Layer %d Code Rate = 2/3 ", i);
2907 			break;
2908 		case 3:
2909 			fe->dtv_property_cache.layer[i].fec = FEC_3_4;
2910 			dprintk("dib8000_get_frontend : Layer %d Code Rate = 3/4 ", i);
2911 			break;
2912 		case 5:
2913 			fe->dtv_property_cache.layer[i].fec = FEC_5_6;
2914 			dprintk("dib8000_get_frontend : Layer %d Code Rate = 5/6 ", i);
2915 			break;
2916 		default:
2917 			fe->dtv_property_cache.layer[i].fec = FEC_7_8;
2918 			dprintk("dib8000_get_frontend : Layer %d Code Rate = 7/8 ", i);
2919 			break;
2920 		}
2921 
2922 		val = dib8000_read_word(state, 487 + i);
2923 		switch (val & 0x3) {
2924 		case 0:
2925 			dprintk("dib8000_get_frontend : Layer %d DQPSK ", i);
2926 			fe->dtv_property_cache.layer[i].modulation = DQPSK;
2927 			break;
2928 		case 1:
2929 			fe->dtv_property_cache.layer[i].modulation = QPSK;
2930 			dprintk("dib8000_get_frontend : Layer %d QPSK ", i);
2931 			break;
2932 		case 2:
2933 			fe->dtv_property_cache.layer[i].modulation = QAM_16;
2934 			dprintk("dib8000_get_frontend : Layer %d QAM16 ", i);
2935 			break;
2936 		case 3:
2937 		default:
2938 			dprintk("dib8000_get_frontend : Layer %d QAM64 ", i);
2939 			fe->dtv_property_cache.layer[i].modulation = QAM_64;
2940 			break;
2941 		}
2942 	}
2943 
2944 	/* synchronize the cache with the other frontends */
2945 	for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
2946 		state->fe[index_frontend]->dtv_property_cache.isdbt_sb_mode = fe->dtv_property_cache.isdbt_sb_mode;
2947 		state->fe[index_frontend]->dtv_property_cache.inversion = fe->dtv_property_cache.inversion;
2948 		state->fe[index_frontend]->dtv_property_cache.transmission_mode = fe->dtv_property_cache.transmission_mode;
2949 		state->fe[index_frontend]->dtv_property_cache.guard_interval = fe->dtv_property_cache.guard_interval;
2950 		state->fe[index_frontend]->dtv_property_cache.isdbt_partial_reception = fe->dtv_property_cache.isdbt_partial_reception;
2951 		for (i = 0; i < 3; i++) {
2952 			state->fe[index_frontend]->dtv_property_cache.layer[i].segment_count = fe->dtv_property_cache.layer[i].segment_count;
2953 			state->fe[index_frontend]->dtv_property_cache.layer[i].interleaving = fe->dtv_property_cache.layer[i].interleaving;
2954 			state->fe[index_frontend]->dtv_property_cache.layer[i].fec = fe->dtv_property_cache.layer[i].fec;
2955 			state->fe[index_frontend]->dtv_property_cache.layer[i].modulation = fe->dtv_property_cache.layer[i].modulation;
2956 		}
2957 	}
2958 	return 0;
2959 }
2960 
2961 static int dib8000_set_frontend(struct dvb_frontend *fe)
2962 {
2963 	struct dib8000_state *state = fe->demodulator_priv;
2964 	u8 nbr_pending, exit_condition, index_frontend;
2965 	s8 index_frontend_success = -1;
2966 	int time, ret;
2967 	int  time_slave = FE_CALLBACK_TIME_NEVER;
2968 
2969 	if (state->fe[0]->dtv_property_cache.frequency == 0) {
2970 		dprintk("dib8000: must at least specify frequency ");
2971 		return 0;
2972 	}
2973 
2974 	if (state->fe[0]->dtv_property_cache.bandwidth_hz == 0) {
2975 		dprintk("dib8000: no bandwidth specified, set to default ");
2976 		state->fe[0]->dtv_property_cache.bandwidth_hz = 6000000;
2977 	}
2978 
2979 	for (index_frontend = 0; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
2980 		/* synchronization of the cache */
2981 		state->fe[index_frontend]->dtv_property_cache.delivery_system = SYS_ISDBT;
2982 		memcpy(&state->fe[index_frontend]->dtv_property_cache, &fe->dtv_property_cache, sizeof(struct dtv_frontend_properties));
2983 
2984 		if (state->revision != 0x8090)
2985 			dib8000_set_output_mode(state->fe[index_frontend],
2986 					OUTMODE_HIGH_Z);
2987 		else
2988 			dib8096p_set_output_mode(state->fe[index_frontend],
2989 					OUTMODE_HIGH_Z);
2990 		if (state->fe[index_frontend]->ops.tuner_ops.set_params)
2991 			state->fe[index_frontend]->ops.tuner_ops.set_params(state->fe[index_frontend]);
2992 
2993 		dib8000_set_tune_state(state->fe[index_frontend], CT_AGC_START);
2994 	}
2995 
2996 	/* start up the AGC */
2997 	do {
2998 		time = dib8000_agc_startup(state->fe[0]);
2999 		for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
3000 			time_slave = dib8000_agc_startup(state->fe[index_frontend]);
3001 			if (time == FE_CALLBACK_TIME_NEVER)
3002 				time = time_slave;
3003 			else if ((time_slave != FE_CALLBACK_TIME_NEVER) && (time_slave > time))
3004 				time = time_slave;
3005 		}
3006 		if (time != FE_CALLBACK_TIME_NEVER)
3007 			msleep(time / 10);
3008 		else
3009 			break;
3010 		exit_condition = 1;
3011 		for (index_frontend = 0; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
3012 			if (dib8000_get_tune_state(state->fe[index_frontend]) != CT_AGC_STOP) {
3013 				exit_condition = 0;
3014 				break;
3015 			}
3016 		}
3017 	} while (exit_condition == 0);
3018 
3019 	for (index_frontend = 0; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++)
3020 		dib8000_set_tune_state(state->fe[index_frontend], CT_DEMOD_START);
3021 
3022 	if ((state->fe[0]->dtv_property_cache.delivery_system != SYS_ISDBT) ||
3023 			(state->fe[0]->dtv_property_cache.inversion == INVERSION_AUTO) ||
3024 			(state->fe[0]->dtv_property_cache.transmission_mode == TRANSMISSION_MODE_AUTO) ||
3025 			(state->fe[0]->dtv_property_cache.guard_interval == GUARD_INTERVAL_AUTO) ||
3026 			(((state->fe[0]->dtv_property_cache.isdbt_layer_enabled & (1 << 0)) != 0) &&
3027 			 (state->fe[0]->dtv_property_cache.layer[0].segment_count != 0xff) &&
3028 			 (state->fe[0]->dtv_property_cache.layer[0].segment_count != 0) &&
3029 			 ((state->fe[0]->dtv_property_cache.layer[0].modulation == QAM_AUTO) ||
3030 			  (state->fe[0]->dtv_property_cache.layer[0].fec == FEC_AUTO))) ||
3031 			(((state->fe[0]->dtv_property_cache.isdbt_layer_enabled & (1 << 1)) != 0) &&
3032 			 (state->fe[0]->dtv_property_cache.layer[1].segment_count != 0xff) &&
3033 			 (state->fe[0]->dtv_property_cache.layer[1].segment_count != 0) &&
3034 			 ((state->fe[0]->dtv_property_cache.layer[1].modulation == QAM_AUTO) ||
3035 			  (state->fe[0]->dtv_property_cache.layer[1].fec == FEC_AUTO))) ||
3036 			(((state->fe[0]->dtv_property_cache.isdbt_layer_enabled & (1 << 2)) != 0) &&
3037 			 (state->fe[0]->dtv_property_cache.layer[2].segment_count != 0xff) &&
3038 			 (state->fe[0]->dtv_property_cache.layer[2].segment_count != 0) &&
3039 			 ((state->fe[0]->dtv_property_cache.layer[2].modulation == QAM_AUTO) ||
3040 			  (state->fe[0]->dtv_property_cache.layer[2].fec == FEC_AUTO))) ||
3041 			(((state->fe[0]->dtv_property_cache.layer[0].segment_count == 0) ||
3042 			  ((state->fe[0]->dtv_property_cache.isdbt_layer_enabled & (1 << 0)) == 0)) &&
3043 			 ((state->fe[0]->dtv_property_cache.layer[1].segment_count == 0) ||
3044 			  ((state->fe[0]->dtv_property_cache.isdbt_layer_enabled & (2 << 0)) == 0)) &&
3045 			 ((state->fe[0]->dtv_property_cache.layer[2].segment_count == 0) || ((state->fe[0]->dtv_property_cache.isdbt_layer_enabled & (3 << 0)) == 0)))) {
3046 		int i = 100;
3047 		u8 found = 0;
3048 		u8 tune_failed = 0;
3049 
3050 		for (index_frontend = 0; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
3051 			dib8000_set_bandwidth(state->fe[index_frontend], fe->dtv_property_cache.bandwidth_hz / 1000);
3052 			dib8000_autosearch_start(state->fe[index_frontend]);
3053 		}
3054 
3055 		do {
3056 			msleep(20);
3057 			nbr_pending = 0;
3058 			exit_condition = 0; /* 0: tune pending; 1: tune failed; 2:tune success */
3059 			for (index_frontend = 0; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
3060 				if (((tune_failed >> index_frontend) & 0x1) == 0) {
3061 					found = dib8000_autosearch_irq(state->fe[index_frontend]);
3062 					switch (found) {
3063 					case 0: /* tune pending */
3064 						 nbr_pending++;
3065 						 break;
3066 					case 2:
3067 						 dprintk("autosearch succeed on the frontend%i", index_frontend);
3068 						 exit_condition = 2;
3069 						 index_frontend_success = index_frontend;
3070 						 break;
3071 					default:
3072 						 dprintk("unhandled autosearch result");
3073 					case 1:
3074 						 tune_failed |= (1 << index_frontend);
3075 						 dprintk("autosearch failed for the frontend%i", index_frontend);
3076 						 break;
3077 					}
3078 				}
3079 			}
3080 
3081 			/* if all tune are done and no success, exit: tune failed */
3082 			if ((nbr_pending == 0) && (exit_condition == 0))
3083 				exit_condition = 1;
3084 		} while ((exit_condition == 0) && i--);
3085 
3086 		if (exit_condition == 1) { /* tune failed */
3087 			dprintk("tune failed");
3088 			return 0;
3089 		}
3090 
3091 		dprintk("tune success on frontend%i", index_frontend_success);
3092 
3093 		dib8000_get_frontend(fe);
3094 	}
3095 
3096 	for (index_frontend = 0, ret = 0; (ret >= 0) && (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++)
3097 		ret = dib8000_tune(state->fe[index_frontend]);
3098 
3099 	/* set output mode and diversity input */
3100 	if (state->revision != 0x8090) {
3101 		dib8000_set_output_mode(state->fe[0], state->cfg.output_mode);
3102 		for (index_frontend = 1;
3103 				(index_frontend < MAX_NUMBER_OF_FRONTENDS) &&
3104 				(state->fe[index_frontend] != NULL);
3105 				index_frontend++) {
3106 			dib8000_set_output_mode(state->fe[index_frontend],
3107 					OUTMODE_DIVERSITY);
3108 			dib8000_set_diversity_in(state->fe[index_frontend-1], 1);
3109 		}
3110 
3111 		/* turn off the diversity of the last chip */
3112 		dib8000_set_diversity_in(state->fe[index_frontend-1], 0);
3113 	} else {
3114 		dib8096p_set_output_mode(state->fe[0], state->cfg.output_mode);
3115 		if (state->cfg.enMpegOutput == 0) {
3116 			dib8096p_setDibTxMux(state, MPEG_ON_DIBTX);
3117 			dib8096p_setHostBusMux(state, DIBTX_ON_HOSTBUS);
3118 		}
3119 		for (index_frontend = 1;
3120 				(index_frontend < MAX_NUMBER_OF_FRONTENDS) &&
3121 				(state->fe[index_frontend] != NULL);
3122 				index_frontend++) {
3123 			dib8096p_set_output_mode(state->fe[index_frontend],
3124 					OUTMODE_DIVERSITY);
3125 			dib8096p_set_diversity_in(state->fe[index_frontend-1], 1);
3126 		}
3127 
3128 		/* turn off the diversity of the last chip */
3129 		dib8096p_set_diversity_in(state->fe[index_frontend-1], 0);
3130 	}
3131 
3132 	return ret;
3133 }
3134 
3135 static u16 dib8000_read_lock(struct dvb_frontend *fe)
3136 {
3137 	struct dib8000_state *state = fe->demodulator_priv;
3138 
3139 	if (state->revision == 0x8090)
3140 		return dib8000_read_word(state, 570);
3141 	return dib8000_read_word(state, 568);
3142 }
3143 
3144 static int dib8000_read_status(struct dvb_frontend *fe, fe_status_t * stat)
3145 {
3146 	struct dib8000_state *state = fe->demodulator_priv;
3147 	u16 lock_slave = 0, lock;
3148 	u8 index_frontend;
3149 
3150 	if (state->revision == 0x8090)
3151 		lock = dib8000_read_word(state, 570);
3152 	else
3153 		lock = dib8000_read_word(state, 568);
3154 
3155 	for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++)
3156 		lock_slave |= dib8000_read_lock(state->fe[index_frontend]);
3157 
3158 	*stat = 0;
3159 
3160 	if (((lock >> 13) & 1) || ((lock_slave >> 13) & 1))
3161 		*stat |= FE_HAS_SIGNAL;
3162 
3163 	if (((lock >> 8) & 1) || ((lock_slave >> 8) & 1)) /* Equal */
3164 		*stat |= FE_HAS_CARRIER;
3165 
3166 	if ((((lock >> 1) & 0xf) == 0xf) || (((lock_slave >> 1) & 0xf) == 0xf)) /* TMCC_SYNC */
3167 		*stat |= FE_HAS_SYNC;
3168 
3169 	if ((((lock >> 12) & 1) || ((lock_slave >> 12) & 1)) && ((lock >> 5) & 7)) /* FEC MPEG */
3170 		*stat |= FE_HAS_LOCK;
3171 
3172 	if (((lock >> 12) & 1) || ((lock_slave >> 12) & 1)) {
3173 		lock = dib8000_read_word(state, 554); /* Viterbi Layer A */
3174 		if (lock & 0x01)
3175 			*stat |= FE_HAS_VITERBI;
3176 
3177 		lock = dib8000_read_word(state, 555); /* Viterbi Layer B */
3178 		if (lock & 0x01)
3179 			*stat |= FE_HAS_VITERBI;
3180 
3181 		lock = dib8000_read_word(state, 556); /* Viterbi Layer C */
3182 		if (lock & 0x01)
3183 			*stat |= FE_HAS_VITERBI;
3184 	}
3185 
3186 	return 0;
3187 }
3188 
3189 static int dib8000_read_ber(struct dvb_frontend *fe, u32 * ber)
3190 {
3191 	struct dib8000_state *state = fe->demodulator_priv;
3192 
3193 	/* 13 segments */
3194 	if (state->revision == 0x8090)
3195 		*ber = (dib8000_read_word(state, 562) << 16) |
3196 			dib8000_read_word(state, 563);
3197 	else
3198 		*ber = (dib8000_read_word(state, 560) << 16) |
3199 			dib8000_read_word(state, 561);
3200 	return 0;
3201 }
3202 
3203 static int dib8000_read_unc_blocks(struct dvb_frontend *fe, u32 * unc)
3204 {
3205 	struct dib8000_state *state = fe->demodulator_priv;
3206 
3207 	/* packet error on 13 seg */
3208 	if (state->revision == 0x8090)
3209 		*unc = dib8000_read_word(state, 567);
3210 	else
3211 		*unc = dib8000_read_word(state, 565);
3212 	return 0;
3213 }
3214 
3215 static int dib8000_read_signal_strength(struct dvb_frontend *fe, u16 * strength)
3216 {
3217 	struct dib8000_state *state = fe->demodulator_priv;
3218 	u8 index_frontend;
3219 	u16 val;
3220 
3221 	*strength = 0;
3222 	for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
3223 		state->fe[index_frontend]->ops.read_signal_strength(state->fe[index_frontend], &val);
3224 		if (val > 65535 - *strength)
3225 			*strength = 65535;
3226 		else
3227 			*strength += val;
3228 	}
3229 
3230 	val = 65535 - dib8000_read_word(state, 390);
3231 	if (val > 65535 - *strength)
3232 		*strength = 65535;
3233 	else
3234 		*strength += val;
3235 	return 0;
3236 }
3237 
3238 static u32 dib8000_get_snr(struct dvb_frontend *fe)
3239 {
3240 	struct dib8000_state *state = fe->demodulator_priv;
3241 	u32 n, s, exp;
3242 	u16 val;
3243 
3244 	if (state->revision != 0x8090)
3245 		val = dib8000_read_word(state, 542);
3246 	else
3247 		val = dib8000_read_word(state, 544);
3248 	n = (val >> 6) & 0xff;
3249 	exp = (val & 0x3f);
3250 	if ((exp & 0x20) != 0)
3251 		exp -= 0x40;
3252 	n <<= exp+16;
3253 
3254 	if (state->revision != 0x8090)
3255 		val = dib8000_read_word(state, 543);
3256 	else
3257 		val = dib8000_read_word(state, 545);
3258 	s = (val >> 6) & 0xff;
3259 	exp = (val & 0x3f);
3260 	if ((exp & 0x20) != 0)
3261 		exp -= 0x40;
3262 	s <<= exp+16;
3263 
3264 	if (n > 0) {
3265 		u32 t = (s/n) << 16;
3266 		return t + ((s << 16) - n*t) / n;
3267 	}
3268 	return 0xffffffff;
3269 }
3270 
3271 static int dib8000_read_snr(struct dvb_frontend *fe, u16 * snr)
3272 {
3273 	struct dib8000_state *state = fe->demodulator_priv;
3274 	u8 index_frontend;
3275 	u32 snr_master;
3276 
3277 	snr_master = dib8000_get_snr(fe);
3278 	for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++)
3279 		snr_master += dib8000_get_snr(state->fe[index_frontend]);
3280 
3281 	if ((snr_master >> 16) != 0) {
3282 		snr_master = 10*intlog10(snr_master>>16);
3283 		*snr = snr_master / ((1 << 24) / 10);
3284 	}
3285 	else
3286 		*snr = 0;
3287 
3288 	return 0;
3289 }
3290 
3291 int dib8000_set_slave_frontend(struct dvb_frontend *fe, struct dvb_frontend *fe_slave)
3292 {
3293 	struct dib8000_state *state = fe->demodulator_priv;
3294 	u8 index_frontend = 1;
3295 
3296 	while ((index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL))
3297 		index_frontend++;
3298 	if (index_frontend < MAX_NUMBER_OF_FRONTENDS) {
3299 		dprintk("set slave fe %p to index %i", fe_slave, index_frontend);
3300 		state->fe[index_frontend] = fe_slave;
3301 		return 0;
3302 	}
3303 
3304 	dprintk("too many slave frontend");
3305 	return -ENOMEM;
3306 }
3307 EXPORT_SYMBOL(dib8000_set_slave_frontend);
3308 
3309 int dib8000_remove_slave_frontend(struct dvb_frontend *fe)
3310 {
3311 	struct dib8000_state *state = fe->demodulator_priv;
3312 	u8 index_frontend = 1;
3313 
3314 	while ((index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL))
3315 		index_frontend++;
3316 	if (index_frontend != 1) {
3317 		dprintk("remove slave fe %p (index %i)", state->fe[index_frontend-1], index_frontend-1);
3318 		state->fe[index_frontend] = NULL;
3319 		return 0;
3320 	}
3321 
3322 	dprintk("no frontend to be removed");
3323 	return -ENODEV;
3324 }
3325 EXPORT_SYMBOL(dib8000_remove_slave_frontend);
3326 
3327 struct dvb_frontend *dib8000_get_slave_frontend(struct dvb_frontend *fe, int slave_index)
3328 {
3329 	struct dib8000_state *state = fe->demodulator_priv;
3330 
3331 	if (slave_index >= MAX_NUMBER_OF_FRONTENDS)
3332 		return NULL;
3333 	return state->fe[slave_index];
3334 }
3335 EXPORT_SYMBOL(dib8000_get_slave_frontend);
3336 
3337 
3338 int dib8000_i2c_enumeration(struct i2c_adapter *host, int no_of_demods,
3339 		u8 default_addr, u8 first_addr, u8 is_dib8096p)
3340 {
3341 	int k = 0, ret = 0;
3342 	u8 new_addr = 0;
3343 	struct i2c_device client = {.adap = host };
3344 
3345 	client.i2c_write_buffer = kzalloc(4 * sizeof(u8), GFP_KERNEL);
3346 	if (!client.i2c_write_buffer) {
3347 		dprintk("%s: not enough memory", __func__);
3348 		return -ENOMEM;
3349 	}
3350 	client.i2c_read_buffer = kzalloc(4 * sizeof(u8), GFP_KERNEL);
3351 	if (!client.i2c_read_buffer) {
3352 		dprintk("%s: not enough memory", __func__);
3353 		ret = -ENOMEM;
3354 		goto error_memory_read;
3355 	}
3356 	client.i2c_buffer_lock = kzalloc(sizeof(struct mutex), GFP_KERNEL);
3357 	if (!client.i2c_buffer_lock) {
3358 		dprintk("%s: not enough memory", __func__);
3359 		ret = -ENOMEM;
3360 		goto error_memory_lock;
3361 	}
3362 	mutex_init(client.i2c_buffer_lock);
3363 
3364 	for (k = no_of_demods - 1; k >= 0; k--) {
3365 		/* designated i2c address */
3366 		new_addr = first_addr + (k << 1);
3367 
3368 		client.addr = new_addr;
3369 		if (!is_dib8096p)
3370 			dib8000_i2c_write16(&client, 1287, 0x0003);	/* sram lead in, rdy */
3371 		if (dib8000_identify(&client) == 0) {
3372 			/* sram lead in, rdy */
3373 			if (!is_dib8096p)
3374 				dib8000_i2c_write16(&client, 1287, 0x0003);
3375 			client.addr = default_addr;
3376 			if (dib8000_identify(&client) == 0) {
3377 				dprintk("#%d: not identified", k);
3378 				ret  = -EINVAL;
3379 				goto error;
3380 			}
3381 		}
3382 
3383 		/* start diversity to pull_down div_str - just for i2c-enumeration */
3384 		dib8000_i2c_write16(&client, 1286, (1 << 10) | (4 << 6));
3385 
3386 		/* set new i2c address and force divstart */
3387 		dib8000_i2c_write16(&client, 1285, (new_addr << 2) | 0x2);
3388 		client.addr = new_addr;
3389 		dib8000_identify(&client);
3390 
3391 		dprintk("IC %d initialized (to i2c_address 0x%x)", k, new_addr);
3392 	}
3393 
3394 	for (k = 0; k < no_of_demods; k++) {
3395 		new_addr = first_addr | (k << 1);
3396 		client.addr = new_addr;
3397 
3398 		// unforce divstr
3399 		dib8000_i2c_write16(&client, 1285, new_addr << 2);
3400 
3401 		/* deactivate div - it was just for i2c-enumeration */
3402 		dib8000_i2c_write16(&client, 1286, 0);
3403 	}
3404 
3405 error:
3406 	kfree(client.i2c_buffer_lock);
3407 error_memory_lock:
3408 	kfree(client.i2c_read_buffer);
3409 error_memory_read:
3410 	kfree(client.i2c_write_buffer);
3411 
3412 	return ret;
3413 }
3414 
3415 EXPORT_SYMBOL(dib8000_i2c_enumeration);
3416 static int dib8000_fe_get_tune_settings(struct dvb_frontend *fe, struct dvb_frontend_tune_settings *tune)
3417 {
3418 	tune->min_delay_ms = 1000;
3419 	tune->step_size = 0;
3420 	tune->max_drift = 0;
3421 	return 0;
3422 }
3423 
3424 static void dib8000_release(struct dvb_frontend *fe)
3425 {
3426 	struct dib8000_state *st = fe->demodulator_priv;
3427 	u8 index_frontend;
3428 
3429 	for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (st->fe[index_frontend] != NULL); index_frontend++)
3430 		dvb_frontend_detach(st->fe[index_frontend]);
3431 
3432 	dibx000_exit_i2c_master(&st->i2c_master);
3433 	i2c_del_adapter(&st->dib8096p_tuner_adap);
3434 	kfree(st->fe[0]);
3435 	kfree(st);
3436 }
3437 
3438 struct i2c_adapter *dib8000_get_i2c_master(struct dvb_frontend *fe, enum dibx000_i2c_interface intf, int gating)
3439 {
3440 	struct dib8000_state *st = fe->demodulator_priv;
3441 	return dibx000_get_i2c_adapter(&st->i2c_master, intf, gating);
3442 }
3443 
3444 EXPORT_SYMBOL(dib8000_get_i2c_master);
3445 
3446 int dib8000_pid_filter_ctrl(struct dvb_frontend *fe, u8 onoff)
3447 {
3448 	struct dib8000_state *st = fe->demodulator_priv;
3449 	u16 val = dib8000_read_word(st, 299) & 0xffef;
3450 	val |= (onoff & 0x1) << 4;
3451 
3452 	dprintk("pid filter enabled %d", onoff);
3453 	return dib8000_write_word(st, 299, val);
3454 }
3455 EXPORT_SYMBOL(dib8000_pid_filter_ctrl);
3456 
3457 int dib8000_pid_filter(struct dvb_frontend *fe, u8 id, u16 pid, u8 onoff)
3458 {
3459 	struct dib8000_state *st = fe->demodulator_priv;
3460 	dprintk("Index %x, PID %d, OnOff %d", id, pid, onoff);
3461 	return dib8000_write_word(st, 305 + id, onoff ? (1 << 13) | pid : 0);
3462 }
3463 EXPORT_SYMBOL(dib8000_pid_filter);
3464 
3465 static const struct dvb_frontend_ops dib8000_ops = {
3466 	.delsys = { SYS_ISDBT },
3467 	.info = {
3468 		 .name = "DiBcom 8000 ISDB-T",
3469 		 .frequency_min = 44250000,
3470 		 .frequency_max = 867250000,
3471 		 .frequency_stepsize = 62500,
3472 		 .caps = FE_CAN_INVERSION_AUTO |
3473 		 FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
3474 		 FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
3475 		 FE_CAN_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_64 | FE_CAN_QAM_AUTO |
3476 		 FE_CAN_TRANSMISSION_MODE_AUTO | FE_CAN_GUARD_INTERVAL_AUTO | FE_CAN_RECOVER | FE_CAN_HIERARCHY_AUTO,
3477 		 },
3478 
3479 	.release = dib8000_release,
3480 
3481 	.init = dib8000_wakeup,
3482 	.sleep = dib8000_sleep,
3483 
3484 	.set_frontend = dib8000_set_frontend,
3485 	.get_tune_settings = dib8000_fe_get_tune_settings,
3486 	.get_frontend = dib8000_get_frontend,
3487 
3488 	.read_status = dib8000_read_status,
3489 	.read_ber = dib8000_read_ber,
3490 	.read_signal_strength = dib8000_read_signal_strength,
3491 	.read_snr = dib8000_read_snr,
3492 	.read_ucblocks = dib8000_read_unc_blocks,
3493 };
3494 
3495 struct dvb_frontend *dib8000_attach(struct i2c_adapter *i2c_adap, u8 i2c_addr, struct dib8000_config *cfg)
3496 {
3497 	struct dvb_frontend *fe;
3498 	struct dib8000_state *state;
3499 
3500 	dprintk("dib8000_attach");
3501 
3502 	state = kzalloc(sizeof(struct dib8000_state), GFP_KERNEL);
3503 	if (state == NULL)
3504 		return NULL;
3505 	fe = kzalloc(sizeof(struct dvb_frontend), GFP_KERNEL);
3506 	if (fe == NULL)
3507 		goto error;
3508 
3509 	memcpy(&state->cfg, cfg, sizeof(struct dib8000_config));
3510 	state->i2c.adap = i2c_adap;
3511 	state->i2c.addr = i2c_addr;
3512 	state->i2c.i2c_write_buffer = state->i2c_write_buffer;
3513 	state->i2c.i2c_read_buffer = state->i2c_read_buffer;
3514 	mutex_init(&state->i2c_buffer_lock);
3515 	state->i2c.i2c_buffer_lock = &state->i2c_buffer_lock;
3516 	state->gpio_val = cfg->gpio_val;
3517 	state->gpio_dir = cfg->gpio_dir;
3518 
3519 	/* Ensure the output mode remains at the previous default if it's
3520 	 * not specifically set by the caller.
3521 	 */
3522 	if ((state->cfg.output_mode != OUTMODE_MPEG2_SERIAL) && (state->cfg.output_mode != OUTMODE_MPEG2_PAR_GATED_CLK))
3523 		state->cfg.output_mode = OUTMODE_MPEG2_FIFO;
3524 
3525 	state->fe[0] = fe;
3526 	fe->demodulator_priv = state;
3527 	memcpy(&state->fe[0]->ops, &dib8000_ops, sizeof(struct dvb_frontend_ops));
3528 
3529 	state->timf_default = cfg->pll->timf;
3530 
3531 	if (dib8000_identify(&state->i2c) == 0)
3532 		goto error;
3533 
3534 	dibx000_init_i2c_master(&state->i2c_master, DIB8000, state->i2c.adap, state->i2c.addr);
3535 
3536 	/* init 8096p tuner adapter */
3537 	strncpy(state->dib8096p_tuner_adap.name, "DiB8096P tuner interface",
3538 			sizeof(state->dib8096p_tuner_adap.name));
3539 	state->dib8096p_tuner_adap.algo = &dib8096p_tuner_xfer_algo;
3540 	state->dib8096p_tuner_adap.algo_data = NULL;
3541 	state->dib8096p_tuner_adap.dev.parent = state->i2c.adap->dev.parent;
3542 	i2c_set_adapdata(&state->dib8096p_tuner_adap, state);
3543 	i2c_add_adapter(&state->dib8096p_tuner_adap);
3544 
3545 	dib8000_reset(fe);
3546 
3547 	dib8000_write_word(state, 285, (dib8000_read_word(state, 285) & ~0x60) | (3 << 5));	/* ber_rs_len = 3 */
3548 
3549 	return fe;
3550 
3551  error:
3552 	kfree(state);
3553 	return NULL;
3554 }
3555 
3556 EXPORT_SYMBOL(dib8000_attach);
3557 
3558 MODULE_AUTHOR("Olivier Grenie <Olivier.Grenie@dibcom.fr, " "Patrick Boettcher <pboettcher@dibcom.fr>");
3559 MODULE_DESCRIPTION("Driver for the DiBcom 8000 ISDB-T demodulator");
3560 MODULE_LICENSE("GPL");
3561