xref: /linux/drivers/media/dvb-frontends/dib7000p.c (revision 32786fdc9506aeba98278c1844d4bfb766863832)
1 /*
2  * Linux-DVB Driver for DiBcom's second generation DiB7000P (PC).
3  *
4  * Copyright (C) 2005-7 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 
11 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
12 
13 #include <linux/kernel.h>
14 #include <linux/slab.h>
15 #include <linux/i2c.h>
16 #include <linux/mutex.h>
17 #include <asm/div64.h>
18 
19 #include "dvb_math.h"
20 #include "dvb_frontend.h"
21 
22 #include "dib7000p.h"
23 
24 static int debug;
25 module_param(debug, int, 0644);
26 MODULE_PARM_DESC(debug, "turn on debugging (default: 0)");
27 
28 static int buggy_sfn_workaround;
29 module_param(buggy_sfn_workaround, int, 0644);
30 MODULE_PARM_DESC(buggy_sfn_workaround, "Enable work-around for buggy SFNs (default: 0)");
31 
32 #define dprintk(fmt, arg...) do {					\
33 	if (debug)							\
34 		printk(KERN_DEBUG pr_fmt("%s: " fmt),			\
35 		       __func__, ##arg);				\
36 } while (0)
37 
38 struct i2c_device {
39 	struct i2c_adapter *i2c_adap;
40 	u8 i2c_addr;
41 };
42 
43 struct dib7000p_state {
44 	struct dvb_frontend demod;
45 	struct dib7000p_config cfg;
46 
47 	u8 i2c_addr;
48 	struct i2c_adapter *i2c_adap;
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 
59 	u8 div_force_off:1;
60 	u8 div_state:1;
61 	u16 div_sync_wait;
62 
63 	u8 agc_state;
64 
65 	u16 gpio_dir;
66 	u16 gpio_val;
67 
68 	u8 sfn_workaround_active:1;
69 
70 #define SOC7090 0x7090
71 	u16 version;
72 
73 	u16 tuner_enable;
74 	struct i2c_adapter dib7090_tuner_adap;
75 
76 	/* for the I2C transfer */
77 	struct i2c_msg msg[2];
78 	u8 i2c_write_buffer[4];
79 	u8 i2c_read_buffer[2];
80 	struct mutex i2c_buffer_lock;
81 
82 	u8 input_mode_mpeg;
83 
84 	/* for DVBv5 stats */
85 	s64 old_ucb;
86 	unsigned long per_jiffies_stats;
87 	unsigned long ber_jiffies_stats;
88 	unsigned long get_stats_time;
89 };
90 
91 enum dib7000p_power_mode {
92 	DIB7000P_POWER_ALL = 0,
93 	DIB7000P_POWER_ANALOG_ADC,
94 	DIB7000P_POWER_INTERFACE_ONLY,
95 };
96 
97 /* dib7090 specific fonctions */
98 static int dib7090_set_output_mode(struct dvb_frontend *fe, int mode);
99 static int dib7090_set_diversity_in(struct dvb_frontend *fe, int onoff);
100 static void dib7090_setDibTxMux(struct dib7000p_state *state, int mode);
101 static void dib7090_setHostBusMux(struct dib7000p_state *state, int mode);
102 
103 static u16 dib7000p_read_word(struct dib7000p_state *state, u16 reg)
104 {
105 	u16 ret;
106 
107 	if (mutex_lock_interruptible(&state->i2c_buffer_lock) < 0) {
108 		dprintk("could not acquire lock\n");
109 		return 0;
110 	}
111 
112 	state->i2c_write_buffer[0] = reg >> 8;
113 	state->i2c_write_buffer[1] = reg & 0xff;
114 
115 	memset(state->msg, 0, 2 * sizeof(struct i2c_msg));
116 	state->msg[0].addr = state->i2c_addr >> 1;
117 	state->msg[0].flags = 0;
118 	state->msg[0].buf = state->i2c_write_buffer;
119 	state->msg[0].len = 2;
120 	state->msg[1].addr = state->i2c_addr >> 1;
121 	state->msg[1].flags = I2C_M_RD;
122 	state->msg[1].buf = state->i2c_read_buffer;
123 	state->msg[1].len = 2;
124 
125 	if (i2c_transfer(state->i2c_adap, state->msg, 2) != 2)
126 		dprintk("i2c read error on %d\n", reg);
127 
128 	ret = (state->i2c_read_buffer[0] << 8) | state->i2c_read_buffer[1];
129 	mutex_unlock(&state->i2c_buffer_lock);
130 	return ret;
131 }
132 
133 static int dib7000p_write_word(struct dib7000p_state *state, u16 reg, u16 val)
134 {
135 	int ret;
136 
137 	if (mutex_lock_interruptible(&state->i2c_buffer_lock) < 0) {
138 		dprintk("could not acquire lock\n");
139 		return -EINVAL;
140 	}
141 
142 	state->i2c_write_buffer[0] = (reg >> 8) & 0xff;
143 	state->i2c_write_buffer[1] = reg & 0xff;
144 	state->i2c_write_buffer[2] = (val >> 8) & 0xff;
145 	state->i2c_write_buffer[3] = val & 0xff;
146 
147 	memset(&state->msg[0], 0, sizeof(struct i2c_msg));
148 	state->msg[0].addr = state->i2c_addr >> 1;
149 	state->msg[0].flags = 0;
150 	state->msg[0].buf = state->i2c_write_buffer;
151 	state->msg[0].len = 4;
152 
153 	ret = (i2c_transfer(state->i2c_adap, state->msg, 1) != 1 ?
154 			-EREMOTEIO : 0);
155 	mutex_unlock(&state->i2c_buffer_lock);
156 	return ret;
157 }
158 
159 static void dib7000p_write_tab(struct dib7000p_state *state, u16 * buf)
160 {
161 	u16 l = 0, r, *n;
162 	n = buf;
163 	l = *n++;
164 	while (l) {
165 		r = *n++;
166 
167 		do {
168 			dib7000p_write_word(state, r, *n++);
169 			r++;
170 		} while (--l);
171 		l = *n++;
172 	}
173 }
174 
175 static int dib7000p_set_output_mode(struct dib7000p_state *state, int mode)
176 {
177 	int ret = 0;
178 	u16 outreg, fifo_threshold, smo_mode;
179 
180 	outreg = 0;
181 	fifo_threshold = 1792;
182 	smo_mode = (dib7000p_read_word(state, 235) & 0x0050) | (1 << 1);
183 
184 	dprintk("setting output mode for demod %p to %d\n", &state->demod, mode);
185 
186 	switch (mode) {
187 	case OUTMODE_MPEG2_PAR_GATED_CLK:
188 		outreg = (1 << 10);	/* 0x0400 */
189 		break;
190 	case OUTMODE_MPEG2_PAR_CONT_CLK:
191 		outreg = (1 << 10) | (1 << 6);	/* 0x0440 */
192 		break;
193 	case OUTMODE_MPEG2_SERIAL:
194 		outreg = (1 << 10) | (2 << 6) | (0 << 1);	/* 0x0480 */
195 		break;
196 	case OUTMODE_DIVERSITY:
197 		if (state->cfg.hostbus_diversity)
198 			outreg = (1 << 10) | (4 << 6);	/* 0x0500 */
199 		else
200 			outreg = (1 << 11);
201 		break;
202 	case OUTMODE_MPEG2_FIFO:
203 		smo_mode |= (3 << 1);
204 		fifo_threshold = 512;
205 		outreg = (1 << 10) | (5 << 6);
206 		break;
207 	case OUTMODE_ANALOG_ADC:
208 		outreg = (1 << 10) | (3 << 6);
209 		break;
210 	case OUTMODE_HIGH_Z:
211 		outreg = 0;
212 		break;
213 	default:
214 		dprintk("Unhandled output_mode passed to be set for demod %p\n", &state->demod);
215 		break;
216 	}
217 
218 	if (state->cfg.output_mpeg2_in_188_bytes)
219 		smo_mode |= (1 << 5);
220 
221 	ret |= dib7000p_write_word(state, 235, smo_mode);
222 	ret |= dib7000p_write_word(state, 236, fifo_threshold);	/* synchronous fread */
223 	if (state->version != SOC7090)
224 		ret |= dib7000p_write_word(state, 1286, outreg);	/* P_Div_active */
225 
226 	return ret;
227 }
228 
229 static int dib7000p_set_diversity_in(struct dvb_frontend *demod, int onoff)
230 {
231 	struct dib7000p_state *state = demod->demodulator_priv;
232 
233 	if (state->div_force_off) {
234 		dprintk("diversity combination deactivated - forced by COFDM parameters\n");
235 		onoff = 0;
236 		dib7000p_write_word(state, 207, 0);
237 	} else
238 		dib7000p_write_word(state, 207, (state->div_sync_wait << 4) | (1 << 2) | (2 << 0));
239 
240 	state->div_state = (u8) onoff;
241 
242 	if (onoff) {
243 		dib7000p_write_word(state, 204, 6);
244 		dib7000p_write_word(state, 205, 16);
245 		/* P_dvsy_sync_mode = 0, P_dvsy_sync_enable=1, P_dvcb_comb_mode=2 */
246 	} else {
247 		dib7000p_write_word(state, 204, 1);
248 		dib7000p_write_word(state, 205, 0);
249 	}
250 
251 	return 0;
252 }
253 
254 static int dib7000p_set_power_mode(struct dib7000p_state *state, enum dib7000p_power_mode mode)
255 {
256 	/* by default everything is powered off */
257 	u16 reg_774 = 0x3fff, reg_775 = 0xffff, reg_776 = 0x0007, reg_899 = 0x0003, reg_1280 = (0xfe00) | (dib7000p_read_word(state, 1280) & 0x01ff);
258 
259 	/* now, depending on the requested mode, we power on */
260 	switch (mode) {
261 		/* power up everything in the demod */
262 	case DIB7000P_POWER_ALL:
263 		reg_774 = 0x0000;
264 		reg_775 = 0x0000;
265 		reg_776 = 0x0;
266 		reg_899 = 0x0;
267 		if (state->version == SOC7090)
268 			reg_1280 &= 0x001f;
269 		else
270 			reg_1280 &= 0x01ff;
271 		break;
272 
273 	case DIB7000P_POWER_ANALOG_ADC:
274 		/* dem, cfg, iqc, sad, agc */
275 		reg_774 &= ~((1 << 15) | (1 << 14) | (1 << 11) | (1 << 10) | (1 << 9));
276 		/* nud */
277 		reg_776 &= ~((1 << 0));
278 		/* Dout */
279 		if (state->version != SOC7090)
280 			reg_1280 &= ~((1 << 11));
281 		reg_1280 &= ~(1 << 6);
282 		/* fall through wanted to enable the interfaces */
283 
284 		/* just leave power on the control-interfaces: GPIO and (I2C or SDIO) */
285 	case DIB7000P_POWER_INTERFACE_ONLY:	/* TODO power up either SDIO or I2C */
286 		if (state->version == SOC7090)
287 			reg_1280 &= ~((1 << 7) | (1 << 5));
288 		else
289 			reg_1280 &= ~((1 << 14) | (1 << 13) | (1 << 12) | (1 << 10));
290 		break;
291 
292 /* TODO following stuff is just converted from the dib7000-driver - check when is used what */
293 	}
294 
295 	dib7000p_write_word(state, 774, reg_774);
296 	dib7000p_write_word(state, 775, reg_775);
297 	dib7000p_write_word(state, 776, reg_776);
298 	dib7000p_write_word(state, 1280, reg_1280);
299 	if (state->version != SOC7090)
300 		dib7000p_write_word(state, 899, reg_899);
301 
302 	return 0;
303 }
304 
305 static void dib7000p_set_adc_state(struct dib7000p_state *state, enum dibx000_adc_states no)
306 {
307 	u16 reg_908 = 0, reg_909 = 0;
308 	u16 reg;
309 
310 	if (state->version != SOC7090) {
311 		reg_908 = dib7000p_read_word(state, 908);
312 		reg_909 = dib7000p_read_word(state, 909);
313 	}
314 
315 	switch (no) {
316 	case DIBX000_SLOW_ADC_ON:
317 		if (state->version == SOC7090) {
318 			reg = dib7000p_read_word(state, 1925);
319 
320 			dib7000p_write_word(state, 1925, reg | (1 << 4) | (1 << 2));	/* en_slowAdc = 1 & reset_sladc = 1 */
321 
322 			reg = dib7000p_read_word(state, 1925);	/* read acces to make it works... strange ... */
323 			msleep(200);
324 			dib7000p_write_word(state, 1925, reg & ~(1 << 4));	/* en_slowAdc = 1 & reset_sladc = 0 */
325 
326 			reg = dib7000p_read_word(state, 72) & ~((0x3 << 14) | (0x3 << 12));
327 			dib7000p_write_word(state, 72, reg | (1 << 14) | (3 << 12) | 524);	/* ref = Vin1 => Vbg ; sel = Vin0 or Vin3 ; (Vin2 = Vcm) */
328 		} else {
329 			reg_909 |= (1 << 1) | (1 << 0);
330 			dib7000p_write_word(state, 909, reg_909);
331 			reg_909 &= ~(1 << 1);
332 		}
333 		break;
334 
335 	case DIBX000_SLOW_ADC_OFF:
336 		if (state->version == SOC7090) {
337 			reg = dib7000p_read_word(state, 1925);
338 			dib7000p_write_word(state, 1925, (reg & ~(1 << 2)) | (1 << 4));	/* reset_sladc = 1 en_slowAdc = 0 */
339 		} else
340 			reg_909 |= (1 << 1) | (1 << 0);
341 		break;
342 
343 	case DIBX000_ADC_ON:
344 		reg_908 &= 0x0fff;
345 		reg_909 &= 0x0003;
346 		break;
347 
348 	case DIBX000_ADC_OFF:
349 		reg_908 |= (1 << 14) | (1 << 13) | (1 << 12);
350 		reg_909 |= (1 << 5) | (1 << 4) | (1 << 3) | (1 << 2);
351 		break;
352 
353 	case DIBX000_VBG_ENABLE:
354 		reg_908 &= ~(1 << 15);
355 		break;
356 
357 	case DIBX000_VBG_DISABLE:
358 		reg_908 |= (1 << 15);
359 		break;
360 
361 	default:
362 		break;
363 	}
364 
365 //	dprintk( "908: %x, 909: %x\n", reg_908, reg_909);
366 
367 	reg_909 |= (state->cfg.disable_sample_and_hold & 1) << 4;
368 	reg_908 |= (state->cfg.enable_current_mirror & 1) << 7;
369 
370 	if (state->version != SOC7090) {
371 		dib7000p_write_word(state, 908, reg_908);
372 		dib7000p_write_word(state, 909, reg_909);
373 	}
374 }
375 
376 static int dib7000p_set_bandwidth(struct dib7000p_state *state, u32 bw)
377 {
378 	u32 timf;
379 
380 	// store the current bandwidth for later use
381 	state->current_bandwidth = bw;
382 
383 	if (state->timf == 0) {
384 		dprintk("using default timf\n");
385 		timf = state->cfg.bw->timf;
386 	} else {
387 		dprintk("using updated timf\n");
388 		timf = state->timf;
389 	}
390 
391 	timf = timf * (bw / 50) / 160;
392 
393 	dib7000p_write_word(state, 23, (u16) ((timf >> 16) & 0xffff));
394 	dib7000p_write_word(state, 24, (u16) ((timf) & 0xffff));
395 
396 	return 0;
397 }
398 
399 static int dib7000p_sad_calib(struct dib7000p_state *state)
400 {
401 /* internal */
402 	dib7000p_write_word(state, 73, (0 << 1) | (0 << 0));
403 
404 	if (state->version == SOC7090)
405 		dib7000p_write_word(state, 74, 2048);
406 	else
407 		dib7000p_write_word(state, 74, 776);
408 
409 	/* do the calibration */
410 	dib7000p_write_word(state, 73, (1 << 0));
411 	dib7000p_write_word(state, 73, (0 << 0));
412 
413 	msleep(1);
414 
415 	return 0;
416 }
417 
418 static int dib7000p_set_wbd_ref(struct dvb_frontend *demod, u16 value)
419 {
420 	struct dib7000p_state *state = demod->demodulator_priv;
421 	if (value > 4095)
422 		value = 4095;
423 	state->wbd_ref = value;
424 	return dib7000p_write_word(state, 105, (dib7000p_read_word(state, 105) & 0xf000) | value);
425 }
426 
427 static int dib7000p_get_agc_values(struct dvb_frontend *fe,
428 		u16 *agc_global, u16 *agc1, u16 *agc2, u16 *wbd)
429 {
430 	struct dib7000p_state *state = fe->demodulator_priv;
431 
432 	if (agc_global != NULL)
433 		*agc_global = dib7000p_read_word(state, 394);
434 	if (agc1 != NULL)
435 		*agc1 = dib7000p_read_word(state, 392);
436 	if (agc2 != NULL)
437 		*agc2 = dib7000p_read_word(state, 393);
438 	if (wbd != NULL)
439 		*wbd = dib7000p_read_word(state, 397);
440 
441 	return 0;
442 }
443 
444 static int dib7000p_set_agc1_min(struct dvb_frontend *fe, u16 v)
445 {
446 	struct dib7000p_state *state = fe->demodulator_priv;
447 	return dib7000p_write_word(state, 108,  v);
448 }
449 
450 static void dib7000p_reset_pll(struct dib7000p_state *state)
451 {
452 	struct dibx000_bandwidth_config *bw = &state->cfg.bw[0];
453 	u16 clk_cfg0;
454 
455 	if (state->version == SOC7090) {
456 		dib7000p_write_word(state, 1856, (!bw->pll_reset << 13) | (bw->pll_range << 12) | (bw->pll_ratio << 6) | (bw->pll_prediv));
457 
458 		while (((dib7000p_read_word(state, 1856) >> 15) & 0x1) != 1)
459 			;
460 
461 		dib7000p_write_word(state, 1857, dib7000p_read_word(state, 1857) | (!bw->pll_bypass << 15));
462 	} else {
463 		/* force PLL bypass */
464 		clk_cfg0 = (1 << 15) | ((bw->pll_ratio & 0x3f) << 9) |
465 			(bw->modulo << 7) | (bw->ADClkSrc << 6) | (bw->IO_CLK_en_core << 5) | (bw->bypclk_div << 2) | (bw->enable_refdiv << 1) | (0 << 0);
466 
467 		dib7000p_write_word(state, 900, clk_cfg0);
468 
469 		/* P_pll_cfg */
470 		dib7000p_write_word(state, 903, (bw->pll_prediv << 5) | (((bw->pll_ratio >> 6) & 0x3) << 3) | (bw->pll_range << 1) | bw->pll_reset);
471 		clk_cfg0 = (bw->pll_bypass << 15) | (clk_cfg0 & 0x7fff);
472 		dib7000p_write_word(state, 900, clk_cfg0);
473 	}
474 
475 	dib7000p_write_word(state, 18, (u16) (((bw->internal * 1000) >> 16) & 0xffff));
476 	dib7000p_write_word(state, 19, (u16) ((bw->internal * 1000) & 0xffff));
477 	dib7000p_write_word(state, 21, (u16) ((bw->ifreq >> 16) & 0xffff));
478 	dib7000p_write_word(state, 22, (u16) ((bw->ifreq) & 0xffff));
479 
480 	dib7000p_write_word(state, 72, bw->sad_cfg);
481 }
482 
483 static u32 dib7000p_get_internal_freq(struct dib7000p_state *state)
484 {
485 	u32 internal = (u32) dib7000p_read_word(state, 18) << 16;
486 	internal |= (u32) dib7000p_read_word(state, 19);
487 	internal /= 1000;
488 
489 	return internal;
490 }
491 
492 static int dib7000p_update_pll(struct dvb_frontend *fe, struct dibx000_bandwidth_config *bw)
493 {
494 	struct dib7000p_state *state = fe->demodulator_priv;
495 	u16 reg_1857, reg_1856 = dib7000p_read_word(state, 1856);
496 	u8 loopdiv, prediv;
497 	u32 internal, xtal;
498 
499 	/* get back old values */
500 	prediv = reg_1856 & 0x3f;
501 	loopdiv = (reg_1856 >> 6) & 0x3f;
502 
503 	if ((bw != NULL) && (bw->pll_prediv != prediv || bw->pll_ratio != loopdiv)) {
504 		dprintk("Updating pll (prediv: old =  %d new = %d ; loopdiv : old = %d new = %d)\n", prediv, bw->pll_prediv, loopdiv, bw->pll_ratio);
505 		reg_1856 &= 0xf000;
506 		reg_1857 = dib7000p_read_word(state, 1857);
507 		dib7000p_write_word(state, 1857, reg_1857 & ~(1 << 15));
508 
509 		dib7000p_write_word(state, 1856, reg_1856 | ((bw->pll_ratio & 0x3f) << 6) | (bw->pll_prediv & 0x3f));
510 
511 		/* write new system clk into P_sec_len */
512 		internal = dib7000p_get_internal_freq(state);
513 		xtal = (internal / loopdiv) * prediv;
514 		internal = 1000 * (xtal / bw->pll_prediv) * bw->pll_ratio;	/* new internal */
515 		dib7000p_write_word(state, 18, (u16) ((internal >> 16) & 0xffff));
516 		dib7000p_write_word(state, 19, (u16) (internal & 0xffff));
517 
518 		dib7000p_write_word(state, 1857, reg_1857 | (1 << 15));
519 
520 		while (((dib7000p_read_word(state, 1856) >> 15) & 0x1) != 1)
521 			dprintk("Waiting for PLL to lock\n");
522 
523 		return 0;
524 	}
525 	return -EIO;
526 }
527 
528 static int dib7000p_reset_gpio(struct dib7000p_state *st)
529 {
530 	/* reset the GPIOs */
531 	dprintk("gpio dir: %x: val: %x, pwm_pos: %x\n", st->gpio_dir, st->gpio_val, st->cfg.gpio_pwm_pos);
532 
533 	dib7000p_write_word(st, 1029, st->gpio_dir);
534 	dib7000p_write_word(st, 1030, st->gpio_val);
535 
536 	/* TODO 1031 is P_gpio_od */
537 
538 	dib7000p_write_word(st, 1032, st->cfg.gpio_pwm_pos);
539 
540 	dib7000p_write_word(st, 1037, st->cfg.pwm_freq_div);
541 	return 0;
542 }
543 
544 static int dib7000p_cfg_gpio(struct dib7000p_state *st, u8 num, u8 dir, u8 val)
545 {
546 	st->gpio_dir = dib7000p_read_word(st, 1029);
547 	st->gpio_dir &= ~(1 << num);	/* reset the direction bit */
548 	st->gpio_dir |= (dir & 0x1) << num;	/* set the new direction */
549 	dib7000p_write_word(st, 1029, st->gpio_dir);
550 
551 	st->gpio_val = dib7000p_read_word(st, 1030);
552 	st->gpio_val &= ~(1 << num);	/* reset the direction bit */
553 	st->gpio_val |= (val & 0x01) << num;	/* set the new value */
554 	dib7000p_write_word(st, 1030, st->gpio_val);
555 
556 	return 0;
557 }
558 
559 static int dib7000p_set_gpio(struct dvb_frontend *demod, u8 num, u8 dir, u8 val)
560 {
561 	struct dib7000p_state *state = demod->demodulator_priv;
562 	return dib7000p_cfg_gpio(state, num, dir, val);
563 }
564 
565 static u16 dib7000p_defaults[] = {
566 	// auto search configuration
567 	3, 2,
568 	0x0004,
569 	(1<<3)|(1<<11)|(1<<12)|(1<<13),
570 	0x0814,			/* Equal Lock */
571 
572 	12, 6,
573 	0x001b,
574 	0x7740,
575 	0x005b,
576 	0x8d80,
577 	0x01c9,
578 	0xc380,
579 	0x0000,
580 	0x0080,
581 	0x0000,
582 	0x0090,
583 	0x0001,
584 	0xd4c0,
585 
586 	1, 26,
587 	0x6680,
588 
589 	/* set ADC level to -16 */
590 	11, 79,
591 	(1 << 13) - 825 - 117,
592 	(1 << 13) - 837 - 117,
593 	(1 << 13) - 811 - 117,
594 	(1 << 13) - 766 - 117,
595 	(1 << 13) - 737 - 117,
596 	(1 << 13) - 693 - 117,
597 	(1 << 13) - 648 - 117,
598 	(1 << 13) - 619 - 117,
599 	(1 << 13) - 575 - 117,
600 	(1 << 13) - 531 - 117,
601 	(1 << 13) - 501 - 117,
602 
603 	1, 142,
604 	0x0410,
605 
606 	/* disable power smoothing */
607 	8, 145,
608 	0,
609 	0,
610 	0,
611 	0,
612 	0,
613 	0,
614 	0,
615 	0,
616 
617 	1, 154,
618 	1 << 13,
619 
620 	1, 168,
621 	0x0ccd,
622 
623 	1, 183,
624 	0x200f,
625 
626 	1, 212,
627 		0x169,
628 
629 	5, 187,
630 	0x023d,
631 	0x00a4,
632 	0x00a4,
633 	0x7ff0,
634 	0x3ccc,
635 
636 	1, 198,
637 	0x800,
638 
639 	1, 222,
640 	0x0010,
641 
642 	1, 235,
643 	0x0062,
644 
645 	0,
646 };
647 
648 static void dib7000p_reset_stats(struct dvb_frontend *fe);
649 
650 static int dib7000p_demod_reset(struct dib7000p_state *state)
651 {
652 	dib7000p_set_power_mode(state, DIB7000P_POWER_ALL);
653 
654 	if (state->version == SOC7090)
655 		dibx000_reset_i2c_master(&state->i2c_master);
656 
657 	dib7000p_set_adc_state(state, DIBX000_VBG_ENABLE);
658 
659 	/* restart all parts */
660 	dib7000p_write_word(state, 770, 0xffff);
661 	dib7000p_write_word(state, 771, 0xffff);
662 	dib7000p_write_word(state, 772, 0x001f);
663 	dib7000p_write_word(state, 1280, 0x001f - ((1 << 4) | (1 << 3)));
664 
665 	dib7000p_write_word(state, 770, 0);
666 	dib7000p_write_word(state, 771, 0);
667 	dib7000p_write_word(state, 772, 0);
668 	dib7000p_write_word(state, 1280, 0);
669 
670 	if (state->version != SOC7090) {
671 		dib7000p_write_word(state,  898, 0x0003);
672 		dib7000p_write_word(state,  898, 0);
673 	}
674 
675 	/* default */
676 	dib7000p_reset_pll(state);
677 
678 	if (dib7000p_reset_gpio(state) != 0)
679 		dprintk("GPIO reset was not successful.\n");
680 
681 	if (state->version == SOC7090) {
682 		dib7000p_write_word(state, 899, 0);
683 
684 		/* impulse noise */
685 		dib7000p_write_word(state, 42, (1<<5) | 3); /* P_iqc_thsat_ipc = 1 ; P_iqc_win2 = 3 */
686 		dib7000p_write_word(state, 43, 0x2d4); /*-300 fag P_iqc_dect_min = -280 */
687 		dib7000p_write_word(state, 44, 300); /* 300 fag P_iqc_dect_min = +280 */
688 		dib7000p_write_word(state, 273, (0<<6) | 30);
689 	}
690 	if (dib7000p_set_output_mode(state, OUTMODE_HIGH_Z) != 0)
691 		dprintk("OUTPUT_MODE could not be reset.\n");
692 
693 	dib7000p_set_adc_state(state, DIBX000_SLOW_ADC_ON);
694 	dib7000p_sad_calib(state);
695 	dib7000p_set_adc_state(state, DIBX000_SLOW_ADC_OFF);
696 
697 	/* unforce divstr regardless whether i2c enumeration was done or not */
698 	dib7000p_write_word(state, 1285, dib7000p_read_word(state, 1285) & ~(1 << 1));
699 
700 	dib7000p_set_bandwidth(state, 8000);
701 
702 	if (state->version == SOC7090) {
703 		dib7000p_write_word(state, 36, 0x0755);/* P_iqc_impnc_on =1 & P_iqc_corr_inh = 1 for impulsive noise */
704 	} else {
705 		if (state->cfg.tuner_is_baseband)
706 			dib7000p_write_word(state, 36, 0x0755);
707 		else
708 			dib7000p_write_word(state, 36, 0x1f55);
709 	}
710 
711 	dib7000p_write_tab(state, dib7000p_defaults);
712 	if (state->version != SOC7090) {
713 		dib7000p_write_word(state, 901, 0x0006);
714 		dib7000p_write_word(state, 902, (3 << 10) | (1 << 6));
715 		dib7000p_write_word(state, 905, 0x2c8e);
716 	}
717 
718 	dib7000p_set_power_mode(state, DIB7000P_POWER_INTERFACE_ONLY);
719 
720 	return 0;
721 }
722 
723 static void dib7000p_pll_clk_cfg(struct dib7000p_state *state)
724 {
725 	u16 tmp = 0;
726 	tmp = dib7000p_read_word(state, 903);
727 	dib7000p_write_word(state, 903, (tmp | 0x1));
728 	tmp = dib7000p_read_word(state, 900);
729 	dib7000p_write_word(state, 900, (tmp & 0x7fff) | (1 << 6));
730 }
731 
732 static void dib7000p_restart_agc(struct dib7000p_state *state)
733 {
734 	// P_restart_iqc & P_restart_agc
735 	dib7000p_write_word(state, 770, (1 << 11) | (1 << 9));
736 	dib7000p_write_word(state, 770, 0x0000);
737 }
738 
739 static int dib7000p_update_lna(struct dib7000p_state *state)
740 {
741 	u16 dyn_gain;
742 
743 	if (state->cfg.update_lna) {
744 		dyn_gain = dib7000p_read_word(state, 394);
745 		if (state->cfg.update_lna(&state->demod, dyn_gain)) {
746 			dib7000p_restart_agc(state);
747 			return 1;
748 		}
749 	}
750 
751 	return 0;
752 }
753 
754 static int dib7000p_set_agc_config(struct dib7000p_state *state, u8 band)
755 {
756 	struct dibx000_agc_config *agc = NULL;
757 	int i;
758 	if (state->current_band == band && state->current_agc != NULL)
759 		return 0;
760 	state->current_band = band;
761 
762 	for (i = 0; i < state->cfg.agc_config_count; i++)
763 		if (state->cfg.agc[i].band_caps & band) {
764 			agc = &state->cfg.agc[i];
765 			break;
766 		}
767 
768 	if (agc == NULL) {
769 		dprintk("no valid AGC configuration found for band 0x%02x\n", band);
770 		return -EINVAL;
771 	}
772 
773 	state->current_agc = agc;
774 
775 	/* AGC */
776 	dib7000p_write_word(state, 75, agc->setup);
777 	dib7000p_write_word(state, 76, agc->inv_gain);
778 	dib7000p_write_word(state, 77, agc->time_stabiliz);
779 	dib7000p_write_word(state, 100, (agc->alpha_level << 12) | agc->thlock);
780 
781 	// Demod AGC loop configuration
782 	dib7000p_write_word(state, 101, (agc->alpha_mant << 5) | agc->alpha_exp);
783 	dib7000p_write_word(state, 102, (agc->beta_mant << 6) | agc->beta_exp);
784 
785 	/* AGC continued */
786 	dprintk("WBD: ref: %d, sel: %d, active: %d, alpha: %d\n",
787 		state->wbd_ref != 0 ? state->wbd_ref : agc->wbd_ref, agc->wbd_sel, !agc->perform_agc_softsplit, agc->wbd_sel);
788 
789 	if (state->wbd_ref != 0)
790 		dib7000p_write_word(state, 105, (agc->wbd_inv << 12) | state->wbd_ref);
791 	else
792 		dib7000p_write_word(state, 105, (agc->wbd_inv << 12) | agc->wbd_ref);
793 
794 	dib7000p_write_word(state, 106, (agc->wbd_sel << 13) | (agc->wbd_alpha << 9) | (agc->perform_agc_softsplit << 8));
795 
796 	dib7000p_write_word(state, 107, agc->agc1_max);
797 	dib7000p_write_word(state, 108, agc->agc1_min);
798 	dib7000p_write_word(state, 109, agc->agc2_max);
799 	dib7000p_write_word(state, 110, agc->agc2_min);
800 	dib7000p_write_word(state, 111, (agc->agc1_pt1 << 8) | agc->agc1_pt2);
801 	dib7000p_write_word(state, 112, agc->agc1_pt3);
802 	dib7000p_write_word(state, 113, (agc->agc1_slope1 << 8) | agc->agc1_slope2);
803 	dib7000p_write_word(state, 114, (agc->agc2_pt1 << 8) | agc->agc2_pt2);
804 	dib7000p_write_word(state, 115, (agc->agc2_slope1 << 8) | agc->agc2_slope2);
805 	return 0;
806 }
807 
808 static void dib7000p_set_dds(struct dib7000p_state *state, s32 offset_khz)
809 {
810 	u32 internal = dib7000p_get_internal_freq(state);
811 	s32 unit_khz_dds_val = 67108864 / (internal);	/* 2**26 / Fsampling is the unit 1KHz offset */
812 	u32 abs_offset_khz = ABS(offset_khz);
813 	u32 dds = state->cfg.bw->ifreq & 0x1ffffff;
814 	u8 invert = !!(state->cfg.bw->ifreq & (1 << 25));
815 
816 	dprintk("setting a frequency offset of %dkHz internal freq = %d invert = %d\n", offset_khz, internal, invert);
817 
818 	if (offset_khz < 0)
819 		unit_khz_dds_val *= -1;
820 
821 	/* IF tuner */
822 	if (invert)
823 		dds -= (abs_offset_khz * unit_khz_dds_val);	/* /100 because of /100 on the unit_khz_dds_val line calc for better accuracy */
824 	else
825 		dds += (abs_offset_khz * unit_khz_dds_val);
826 
827 	if (abs_offset_khz <= (internal / 2)) {	/* Max dds offset is the half of the demod freq */
828 		dib7000p_write_word(state, 21, (u16) (((dds >> 16) & 0x1ff) | (0 << 10) | (invert << 9)));
829 		dib7000p_write_word(state, 22, (u16) (dds & 0xffff));
830 	}
831 }
832 
833 static int dib7000p_agc_startup(struct dvb_frontend *demod)
834 {
835 	struct dtv_frontend_properties *ch = &demod->dtv_property_cache;
836 	struct dib7000p_state *state = demod->demodulator_priv;
837 	int ret = -1;
838 	u8 *agc_state = &state->agc_state;
839 	u8 agc_split;
840 	u16 reg;
841 	u32 upd_demod_gain_period = 0x1000;
842 	s32 frequency_offset = 0;
843 
844 	switch (state->agc_state) {
845 	case 0:
846 		dib7000p_set_power_mode(state, DIB7000P_POWER_ALL);
847 		if (state->version == SOC7090) {
848 			reg = dib7000p_read_word(state, 0x79b) & 0xff00;
849 			dib7000p_write_word(state, 0x79a, upd_demod_gain_period & 0xFFFF);	/* lsb */
850 			dib7000p_write_word(state, 0x79b, reg | (1 << 14) | ((upd_demod_gain_period >> 16) & 0xFF));
851 
852 			/* enable adc i & q */
853 			reg = dib7000p_read_word(state, 0x780);
854 			dib7000p_write_word(state, 0x780, (reg | (0x3)) & (~(1 << 7)));
855 		} else {
856 			dib7000p_set_adc_state(state, DIBX000_ADC_ON);
857 			dib7000p_pll_clk_cfg(state);
858 		}
859 
860 		if (dib7000p_set_agc_config(state, BAND_OF_FREQUENCY(ch->frequency / 1000)) != 0)
861 			return -1;
862 
863 		if (demod->ops.tuner_ops.get_frequency) {
864 			u32 frequency_tuner;
865 
866 			demod->ops.tuner_ops.get_frequency(demod, &frequency_tuner);
867 			frequency_offset = (s32)frequency_tuner / 1000 - ch->frequency / 1000;
868 		}
869 
870 		dib7000p_set_dds(state, frequency_offset);
871 		ret = 7;
872 		(*agc_state)++;
873 		break;
874 
875 	case 1:
876 		if (state->cfg.agc_control)
877 			state->cfg.agc_control(&state->demod, 1);
878 
879 		dib7000p_write_word(state, 78, 32768);
880 		if (!state->current_agc->perform_agc_softsplit) {
881 			/* we are using the wbd - so slow AGC startup */
882 			/* force 0 split on WBD and restart AGC */
883 			dib7000p_write_word(state, 106, (state->current_agc->wbd_sel << 13) | (state->current_agc->wbd_alpha << 9) | (1 << 8));
884 			(*agc_state)++;
885 			ret = 5;
886 		} else {
887 			/* default AGC startup */
888 			(*agc_state) = 4;
889 			/* wait AGC rough lock time */
890 			ret = 7;
891 		}
892 
893 		dib7000p_restart_agc(state);
894 		break;
895 
896 	case 2:		/* fast split search path after 5sec */
897 		dib7000p_write_word(state, 75, state->current_agc->setup | (1 << 4));	/* freeze AGC loop */
898 		dib7000p_write_word(state, 106, (state->current_agc->wbd_sel << 13) | (2 << 9) | (0 << 8));	/* fast split search 0.25kHz */
899 		(*agc_state)++;
900 		ret = 14;
901 		break;
902 
903 	case 3:		/* split search ended */
904 		agc_split = (u8) dib7000p_read_word(state, 396);	/* store the split value for the next time */
905 		dib7000p_write_word(state, 78, dib7000p_read_word(state, 394));	/* set AGC gain start value */
906 
907 		dib7000p_write_word(state, 75, state->current_agc->setup);	/* std AGC loop */
908 		dib7000p_write_word(state, 106, (state->current_agc->wbd_sel << 13) | (state->current_agc->wbd_alpha << 9) | agc_split);	/* standard split search */
909 
910 		dib7000p_restart_agc(state);
911 
912 		dprintk("SPLIT %p: %hd\n", demod, agc_split);
913 
914 		(*agc_state)++;
915 		ret = 5;
916 		break;
917 
918 	case 4:		/* LNA startup */
919 		ret = 7;
920 
921 		if (dib7000p_update_lna(state))
922 			ret = 5;
923 		else
924 			(*agc_state)++;
925 		break;
926 
927 	case 5:
928 		if (state->cfg.agc_control)
929 			state->cfg.agc_control(&state->demod, 0);
930 		(*agc_state)++;
931 		break;
932 	default:
933 		break;
934 	}
935 	return ret;
936 }
937 
938 static void dib7000p_update_timf(struct dib7000p_state *state)
939 {
940 	u32 timf = (dib7000p_read_word(state, 427) << 16) | dib7000p_read_word(state, 428);
941 	state->timf = timf * 160 / (state->current_bandwidth / 50);
942 	dib7000p_write_word(state, 23, (u16) (timf >> 16));
943 	dib7000p_write_word(state, 24, (u16) (timf & 0xffff));
944 	dprintk("updated timf_frequency: %d (default: %d)\n", state->timf, state->cfg.bw->timf);
945 
946 }
947 
948 static u32 dib7000p_ctrl_timf(struct dvb_frontend *fe, u8 op, u32 timf)
949 {
950 	struct dib7000p_state *state = fe->demodulator_priv;
951 	switch (op) {
952 	case DEMOD_TIMF_SET:
953 		state->timf = timf;
954 		break;
955 	case DEMOD_TIMF_UPDATE:
956 		dib7000p_update_timf(state);
957 		break;
958 	case DEMOD_TIMF_GET:
959 		break;
960 	}
961 	dib7000p_set_bandwidth(state, state->current_bandwidth);
962 	return state->timf;
963 }
964 
965 static void dib7000p_set_channel(struct dib7000p_state *state,
966 				 struct dtv_frontend_properties *ch, u8 seq)
967 {
968 	u16 value, est[4];
969 
970 	dib7000p_set_bandwidth(state, BANDWIDTH_TO_KHZ(ch->bandwidth_hz));
971 
972 	/* nfft, guard, qam, alpha */
973 	value = 0;
974 	switch (ch->transmission_mode) {
975 	case TRANSMISSION_MODE_2K:
976 		value |= (0 << 7);
977 		break;
978 	case TRANSMISSION_MODE_4K:
979 		value |= (2 << 7);
980 		break;
981 	default:
982 	case TRANSMISSION_MODE_8K:
983 		value |= (1 << 7);
984 		break;
985 	}
986 	switch (ch->guard_interval) {
987 	case GUARD_INTERVAL_1_32:
988 		value |= (0 << 5);
989 		break;
990 	case GUARD_INTERVAL_1_16:
991 		value |= (1 << 5);
992 		break;
993 	case GUARD_INTERVAL_1_4:
994 		value |= (3 << 5);
995 		break;
996 	default:
997 	case GUARD_INTERVAL_1_8:
998 		value |= (2 << 5);
999 		break;
1000 	}
1001 	switch (ch->modulation) {
1002 	case QPSK:
1003 		value |= (0 << 3);
1004 		break;
1005 	case QAM_16:
1006 		value |= (1 << 3);
1007 		break;
1008 	default:
1009 	case QAM_64:
1010 		value |= (2 << 3);
1011 		break;
1012 	}
1013 	switch (HIERARCHY_1) {
1014 	case HIERARCHY_2:
1015 		value |= 2;
1016 		break;
1017 	case HIERARCHY_4:
1018 		value |= 4;
1019 		break;
1020 	default:
1021 	case HIERARCHY_1:
1022 		value |= 1;
1023 		break;
1024 	}
1025 	dib7000p_write_word(state, 0, value);
1026 	dib7000p_write_word(state, 5, (seq << 4) | 1);	/* do not force tps, search list 0 */
1027 
1028 	/* P_dintl_native, P_dintlv_inv, P_hrch, P_code_rate, P_select_hp */
1029 	value = 0;
1030 	if (1 != 0)
1031 		value |= (1 << 6);
1032 	if (ch->hierarchy == 1)
1033 		value |= (1 << 4);
1034 	if (1 == 1)
1035 		value |= 1;
1036 	switch ((ch->hierarchy == 0 || 1 == 1) ? ch->code_rate_HP : ch->code_rate_LP) {
1037 	case FEC_2_3:
1038 		value |= (2 << 1);
1039 		break;
1040 	case FEC_3_4:
1041 		value |= (3 << 1);
1042 		break;
1043 	case FEC_5_6:
1044 		value |= (5 << 1);
1045 		break;
1046 	case FEC_7_8:
1047 		value |= (7 << 1);
1048 		break;
1049 	default:
1050 	case FEC_1_2:
1051 		value |= (1 << 1);
1052 		break;
1053 	}
1054 	dib7000p_write_word(state, 208, value);
1055 
1056 	/* offset loop parameters */
1057 	dib7000p_write_word(state, 26, 0x6680);
1058 	dib7000p_write_word(state, 32, 0x0003);
1059 	dib7000p_write_word(state, 29, 0x1273);
1060 	dib7000p_write_word(state, 33, 0x0005);
1061 
1062 	/* P_dvsy_sync_wait */
1063 	switch (ch->transmission_mode) {
1064 	case TRANSMISSION_MODE_8K:
1065 		value = 256;
1066 		break;
1067 	case TRANSMISSION_MODE_4K:
1068 		value = 128;
1069 		break;
1070 	case TRANSMISSION_MODE_2K:
1071 	default:
1072 		value = 64;
1073 		break;
1074 	}
1075 	switch (ch->guard_interval) {
1076 	case GUARD_INTERVAL_1_16:
1077 		value *= 2;
1078 		break;
1079 	case GUARD_INTERVAL_1_8:
1080 		value *= 4;
1081 		break;
1082 	case GUARD_INTERVAL_1_4:
1083 		value *= 8;
1084 		break;
1085 	default:
1086 	case GUARD_INTERVAL_1_32:
1087 		value *= 1;
1088 		break;
1089 	}
1090 	if (state->cfg.diversity_delay == 0)
1091 		state->div_sync_wait = (value * 3) / 2 + 48;
1092 	else
1093 		state->div_sync_wait = (value * 3) / 2 + state->cfg.diversity_delay;
1094 
1095 	/* deactive the possibility of diversity reception if extended interleaver */
1096 	state->div_force_off = !1 && ch->transmission_mode != TRANSMISSION_MODE_8K;
1097 	dib7000p_set_diversity_in(&state->demod, state->div_state);
1098 
1099 	/* channel estimation fine configuration */
1100 	switch (ch->modulation) {
1101 	case QAM_64:
1102 		est[0] = 0x0148;	/* P_adp_regul_cnt 0.04 */
1103 		est[1] = 0xfff0;	/* P_adp_noise_cnt -0.002 */
1104 		est[2] = 0x00a4;	/* P_adp_regul_ext 0.02 */
1105 		est[3] = 0xfff8;	/* P_adp_noise_ext -0.001 */
1106 		break;
1107 	case QAM_16:
1108 		est[0] = 0x023d;	/* P_adp_regul_cnt 0.07 */
1109 		est[1] = 0xffdf;	/* P_adp_noise_cnt -0.004 */
1110 		est[2] = 0x00a4;	/* P_adp_regul_ext 0.02 */
1111 		est[3] = 0xfff0;	/* P_adp_noise_ext -0.002 */
1112 		break;
1113 	default:
1114 		est[0] = 0x099a;	/* P_adp_regul_cnt 0.3 */
1115 		est[1] = 0xffae;	/* P_adp_noise_cnt -0.01 */
1116 		est[2] = 0x0333;	/* P_adp_regul_ext 0.1 */
1117 		est[3] = 0xfff8;	/* P_adp_noise_ext -0.002 */
1118 		break;
1119 	}
1120 	for (value = 0; value < 4; value++)
1121 		dib7000p_write_word(state, 187 + value, est[value]);
1122 }
1123 
1124 static int dib7000p_autosearch_start(struct dvb_frontend *demod)
1125 {
1126 	struct dtv_frontend_properties *ch = &demod->dtv_property_cache;
1127 	struct dib7000p_state *state = demod->demodulator_priv;
1128 	struct dtv_frontend_properties schan;
1129 	u32 value, factor;
1130 	u32 internal = dib7000p_get_internal_freq(state);
1131 
1132 	schan = *ch;
1133 	schan.modulation = QAM_64;
1134 	schan.guard_interval = GUARD_INTERVAL_1_32;
1135 	schan.transmission_mode = TRANSMISSION_MODE_8K;
1136 	schan.code_rate_HP = FEC_2_3;
1137 	schan.code_rate_LP = FEC_3_4;
1138 	schan.hierarchy = 0;
1139 
1140 	dib7000p_set_channel(state, &schan, 7);
1141 
1142 	factor = BANDWIDTH_TO_KHZ(ch->bandwidth_hz);
1143 	if (factor >= 5000) {
1144 		if (state->version == SOC7090)
1145 			factor = 2;
1146 		else
1147 			factor = 1;
1148 	} else
1149 		factor = 6;
1150 
1151 	value = 30 * internal * factor;
1152 	dib7000p_write_word(state, 6, (u16) ((value >> 16) & 0xffff));
1153 	dib7000p_write_word(state, 7, (u16) (value & 0xffff));
1154 	value = 100 * internal * factor;
1155 	dib7000p_write_word(state, 8, (u16) ((value >> 16) & 0xffff));
1156 	dib7000p_write_word(state, 9, (u16) (value & 0xffff));
1157 	value = 500 * internal * factor;
1158 	dib7000p_write_word(state, 10, (u16) ((value >> 16) & 0xffff));
1159 	dib7000p_write_word(state, 11, (u16) (value & 0xffff));
1160 
1161 	value = dib7000p_read_word(state, 0);
1162 	dib7000p_write_word(state, 0, (u16) ((1 << 9) | value));
1163 	dib7000p_read_word(state, 1284);
1164 	dib7000p_write_word(state, 0, (u16) value);
1165 
1166 	return 0;
1167 }
1168 
1169 static int dib7000p_autosearch_is_irq(struct dvb_frontend *demod)
1170 {
1171 	struct dib7000p_state *state = demod->demodulator_priv;
1172 	u16 irq_pending = dib7000p_read_word(state, 1284);
1173 
1174 	if (irq_pending & 0x1)
1175 		return 1;
1176 
1177 	if (irq_pending & 0x2)
1178 		return 2;
1179 
1180 	return 0;
1181 }
1182 
1183 static void dib7000p_spur_protect(struct dib7000p_state *state, u32 rf_khz, u32 bw)
1184 {
1185 	static s16 notch[] = { 16143, 14402, 12238, 9713, 6902, 3888, 759, -2392 };
1186 	static u8 sine[] = { 0, 2, 3, 5, 6, 8, 9, 11, 13, 14, 16, 17, 19, 20, 22,
1187 		24, 25, 27, 28, 30, 31, 33, 34, 36, 38, 39, 41, 42, 44, 45, 47, 48, 50, 51,
1188 		53, 55, 56, 58, 59, 61, 62, 64, 65, 67, 68, 70, 71, 73, 74, 76, 77, 79, 80,
1189 		82, 83, 85, 86, 88, 89, 91, 92, 94, 95, 97, 98, 99, 101, 102, 104, 105,
1190 		107, 108, 109, 111, 112, 114, 115, 117, 118, 119, 121, 122, 123, 125, 126,
1191 		128, 129, 130, 132, 133, 134, 136, 137, 138, 140, 141, 142, 144, 145, 146,
1192 		147, 149, 150, 151, 152, 154, 155, 156, 157, 159, 160, 161, 162, 164, 165,
1193 		166, 167, 168, 170, 171, 172, 173, 174, 175, 177, 178, 179, 180, 181, 182,
1194 		183, 184, 185, 186, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198,
1195 		199, 200, 201, 202, 203, 204, 205, 206, 207, 207, 208, 209, 210, 211, 212,
1196 		213, 214, 215, 215, 216, 217, 218, 219, 220, 220, 221, 222, 223, 224, 224,
1197 		225, 226, 227, 227, 228, 229, 229, 230, 231, 231, 232, 233, 233, 234, 235,
1198 		235, 236, 237, 237, 238, 238, 239, 239, 240, 241, 241, 242, 242, 243, 243,
1199 		244, 244, 245, 245, 245, 246, 246, 247, 247, 248, 248, 248, 249, 249, 249,
1200 		250, 250, 250, 251, 251, 251, 252, 252, 252, 252, 253, 253, 253, 253, 254,
1201 		254, 254, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
1202 		255, 255, 255, 255, 255, 255
1203 	};
1204 
1205 	u32 xtal = state->cfg.bw->xtal_hz / 1000;
1206 	int f_rel = DIV_ROUND_CLOSEST(rf_khz, xtal) * xtal - rf_khz;
1207 	int k;
1208 	int coef_re[8], coef_im[8];
1209 	int bw_khz = bw;
1210 	u32 pha;
1211 
1212 	dprintk("relative position of the Spur: %dk (RF: %dk, XTAL: %dk)\n", f_rel, rf_khz, xtal);
1213 
1214 	if (f_rel < -bw_khz / 2 || f_rel > bw_khz / 2)
1215 		return;
1216 
1217 	bw_khz /= 100;
1218 
1219 	dib7000p_write_word(state, 142, 0x0610);
1220 
1221 	for (k = 0; k < 8; k++) {
1222 		pha = ((f_rel * (k + 1) * 112 * 80 / bw_khz) / 1000) & 0x3ff;
1223 
1224 		if (pha == 0) {
1225 			coef_re[k] = 256;
1226 			coef_im[k] = 0;
1227 		} else if (pha < 256) {
1228 			coef_re[k] = sine[256 - (pha & 0xff)];
1229 			coef_im[k] = sine[pha & 0xff];
1230 		} else if (pha == 256) {
1231 			coef_re[k] = 0;
1232 			coef_im[k] = 256;
1233 		} else if (pha < 512) {
1234 			coef_re[k] = -sine[pha & 0xff];
1235 			coef_im[k] = sine[256 - (pha & 0xff)];
1236 		} else if (pha == 512) {
1237 			coef_re[k] = -256;
1238 			coef_im[k] = 0;
1239 		} else if (pha < 768) {
1240 			coef_re[k] = -sine[256 - (pha & 0xff)];
1241 			coef_im[k] = -sine[pha & 0xff];
1242 		} else if (pha == 768) {
1243 			coef_re[k] = 0;
1244 			coef_im[k] = -256;
1245 		} else {
1246 			coef_re[k] = sine[pha & 0xff];
1247 			coef_im[k] = -sine[256 - (pha & 0xff)];
1248 		}
1249 
1250 		coef_re[k] *= notch[k];
1251 		coef_re[k] += (1 << 14);
1252 		if (coef_re[k] >= (1 << 24))
1253 			coef_re[k] = (1 << 24) - 1;
1254 		coef_re[k] /= (1 << 15);
1255 
1256 		coef_im[k] *= notch[k];
1257 		coef_im[k] += (1 << 14);
1258 		if (coef_im[k] >= (1 << 24))
1259 			coef_im[k] = (1 << 24) - 1;
1260 		coef_im[k] /= (1 << 15);
1261 
1262 		dprintk("PALF COEF: %d re: %d im: %d\n", k, coef_re[k], coef_im[k]);
1263 
1264 		dib7000p_write_word(state, 143, (0 << 14) | (k << 10) | (coef_re[k] & 0x3ff));
1265 		dib7000p_write_word(state, 144, coef_im[k] & 0x3ff);
1266 		dib7000p_write_word(state, 143, (1 << 14) | (k << 10) | (coef_re[k] & 0x3ff));
1267 	}
1268 	dib7000p_write_word(state, 143, 0);
1269 }
1270 
1271 static int dib7000p_tune(struct dvb_frontend *demod)
1272 {
1273 	struct dtv_frontend_properties *ch = &demod->dtv_property_cache;
1274 	struct dib7000p_state *state = demod->demodulator_priv;
1275 	u16 tmp = 0;
1276 
1277 	if (ch != NULL)
1278 		dib7000p_set_channel(state, ch, 0);
1279 	else
1280 		return -EINVAL;
1281 
1282 	// restart demod
1283 	dib7000p_write_word(state, 770, 0x4000);
1284 	dib7000p_write_word(state, 770, 0x0000);
1285 	msleep(45);
1286 
1287 	/* P_ctrl_inh_cor=0, P_ctrl_alpha_cor=4, P_ctrl_inh_isi=0, P_ctrl_alpha_isi=3, P_ctrl_inh_cor4=1, P_ctrl_alpha_cor4=3 */
1288 	tmp = (0 << 14) | (4 << 10) | (0 << 9) | (3 << 5) | (1 << 4) | (0x3);
1289 	if (state->sfn_workaround_active) {
1290 		dprintk("SFN workaround is active\n");
1291 		tmp |= (1 << 9);
1292 		dib7000p_write_word(state, 166, 0x4000);
1293 	} else {
1294 		dib7000p_write_word(state, 166, 0x0000);
1295 	}
1296 	dib7000p_write_word(state, 29, tmp);
1297 
1298 	// never achieved a lock with that bandwidth so far - wait for osc-freq to update
1299 	if (state->timf == 0)
1300 		msleep(200);
1301 
1302 	/* offset loop parameters */
1303 
1304 	/* P_timf_alpha, P_corm_alpha=6, P_corm_thres=0x80 */
1305 	tmp = (6 << 8) | 0x80;
1306 	switch (ch->transmission_mode) {
1307 	case TRANSMISSION_MODE_2K:
1308 		tmp |= (2 << 12);
1309 		break;
1310 	case TRANSMISSION_MODE_4K:
1311 		tmp |= (3 << 12);
1312 		break;
1313 	default:
1314 	case TRANSMISSION_MODE_8K:
1315 		tmp |= (4 << 12);
1316 		break;
1317 	}
1318 	dib7000p_write_word(state, 26, tmp);	/* timf_a(6xxx) */
1319 
1320 	/* P_ctrl_freeze_pha_shift=0, P_ctrl_pha_off_max */
1321 	tmp = (0 << 4);
1322 	switch (ch->transmission_mode) {
1323 	case TRANSMISSION_MODE_2K:
1324 		tmp |= 0x6;
1325 		break;
1326 	case TRANSMISSION_MODE_4K:
1327 		tmp |= 0x7;
1328 		break;
1329 	default:
1330 	case TRANSMISSION_MODE_8K:
1331 		tmp |= 0x8;
1332 		break;
1333 	}
1334 	dib7000p_write_word(state, 32, tmp);
1335 
1336 	/* P_ctrl_sfreq_inh=0, P_ctrl_sfreq_step */
1337 	tmp = (0 << 4);
1338 	switch (ch->transmission_mode) {
1339 	case TRANSMISSION_MODE_2K:
1340 		tmp |= 0x6;
1341 		break;
1342 	case TRANSMISSION_MODE_4K:
1343 		tmp |= 0x7;
1344 		break;
1345 	default:
1346 	case TRANSMISSION_MODE_8K:
1347 		tmp |= 0x8;
1348 		break;
1349 	}
1350 	dib7000p_write_word(state, 33, tmp);
1351 
1352 	tmp = dib7000p_read_word(state, 509);
1353 	if (!((tmp >> 6) & 0x1)) {
1354 		/* restart the fec */
1355 		tmp = dib7000p_read_word(state, 771);
1356 		dib7000p_write_word(state, 771, tmp | (1 << 1));
1357 		dib7000p_write_word(state, 771, tmp);
1358 		msleep(40);
1359 		tmp = dib7000p_read_word(state, 509);
1360 	}
1361 	// we achieved a lock - it's time to update the osc freq
1362 	if ((tmp >> 6) & 0x1) {
1363 		dib7000p_update_timf(state);
1364 		/* P_timf_alpha += 2 */
1365 		tmp = dib7000p_read_word(state, 26);
1366 		dib7000p_write_word(state, 26, (tmp & ~(0xf << 12)) | ((((tmp >> 12) & 0xf) + 5) << 12));
1367 	}
1368 
1369 	if (state->cfg.spur_protect)
1370 		dib7000p_spur_protect(state, ch->frequency / 1000, BANDWIDTH_TO_KHZ(ch->bandwidth_hz));
1371 
1372 	dib7000p_set_bandwidth(state, BANDWIDTH_TO_KHZ(ch->bandwidth_hz));
1373 
1374 	dib7000p_reset_stats(demod);
1375 
1376 	return 0;
1377 }
1378 
1379 static int dib7000p_wakeup(struct dvb_frontend *demod)
1380 {
1381 	struct dib7000p_state *state = demod->demodulator_priv;
1382 	dib7000p_set_power_mode(state, DIB7000P_POWER_ALL);
1383 	dib7000p_set_adc_state(state, DIBX000_SLOW_ADC_ON);
1384 	if (state->version == SOC7090)
1385 		dib7000p_sad_calib(state);
1386 	return 0;
1387 }
1388 
1389 static int dib7000p_sleep(struct dvb_frontend *demod)
1390 {
1391 	struct dib7000p_state *state = demod->demodulator_priv;
1392 	if (state->version == SOC7090)
1393 		return dib7000p_set_power_mode(state, DIB7000P_POWER_INTERFACE_ONLY);
1394 	return dib7000p_set_output_mode(state, OUTMODE_HIGH_Z) | dib7000p_set_power_mode(state, DIB7000P_POWER_INTERFACE_ONLY);
1395 }
1396 
1397 static int dib7000p_identify(struct dib7000p_state *st)
1398 {
1399 	u16 value;
1400 	dprintk("checking demod on I2C address: %d (%x)\n", st->i2c_addr, st->i2c_addr);
1401 
1402 	if ((value = dib7000p_read_word(st, 768)) != 0x01b3) {
1403 		dprintk("wrong Vendor ID (read=0x%x)\n", value);
1404 		return -EREMOTEIO;
1405 	}
1406 
1407 	if ((value = dib7000p_read_word(st, 769)) != 0x4000) {
1408 		dprintk("wrong Device ID (%x)\n", value);
1409 		return -EREMOTEIO;
1410 	}
1411 
1412 	return 0;
1413 }
1414 
1415 static int dib7000p_get_frontend(struct dvb_frontend *fe,
1416 				 struct dtv_frontend_properties *fep)
1417 {
1418 	struct dib7000p_state *state = fe->demodulator_priv;
1419 	u16 tps = dib7000p_read_word(state, 463);
1420 
1421 	fep->inversion = INVERSION_AUTO;
1422 
1423 	fep->bandwidth_hz = BANDWIDTH_TO_HZ(state->current_bandwidth);
1424 
1425 	switch ((tps >> 8) & 0x3) {
1426 	case 0:
1427 		fep->transmission_mode = TRANSMISSION_MODE_2K;
1428 		break;
1429 	case 1:
1430 		fep->transmission_mode = TRANSMISSION_MODE_8K;
1431 		break;
1432 	/* case 2: fep->transmission_mode = TRANSMISSION_MODE_4K; break; */
1433 	}
1434 
1435 	switch (tps & 0x3) {
1436 	case 0:
1437 		fep->guard_interval = GUARD_INTERVAL_1_32;
1438 		break;
1439 	case 1:
1440 		fep->guard_interval = GUARD_INTERVAL_1_16;
1441 		break;
1442 	case 2:
1443 		fep->guard_interval = GUARD_INTERVAL_1_8;
1444 		break;
1445 	case 3:
1446 		fep->guard_interval = GUARD_INTERVAL_1_4;
1447 		break;
1448 	}
1449 
1450 	switch ((tps >> 14) & 0x3) {
1451 	case 0:
1452 		fep->modulation = QPSK;
1453 		break;
1454 	case 1:
1455 		fep->modulation = QAM_16;
1456 		break;
1457 	case 2:
1458 	default:
1459 		fep->modulation = QAM_64;
1460 		break;
1461 	}
1462 
1463 	/* as long as the frontend_param structure is fixed for hierarchical transmission I refuse to use it */
1464 	/* (tps >> 13) & 0x1 == hrch is used, (tps >> 10) & 0x7 == alpha */
1465 
1466 	fep->hierarchy = HIERARCHY_NONE;
1467 	switch ((tps >> 5) & 0x7) {
1468 	case 1:
1469 		fep->code_rate_HP = FEC_1_2;
1470 		break;
1471 	case 2:
1472 		fep->code_rate_HP = FEC_2_3;
1473 		break;
1474 	case 3:
1475 		fep->code_rate_HP = FEC_3_4;
1476 		break;
1477 	case 5:
1478 		fep->code_rate_HP = FEC_5_6;
1479 		break;
1480 	case 7:
1481 	default:
1482 		fep->code_rate_HP = FEC_7_8;
1483 		break;
1484 
1485 	}
1486 
1487 	switch ((tps >> 2) & 0x7) {
1488 	case 1:
1489 		fep->code_rate_LP = FEC_1_2;
1490 		break;
1491 	case 2:
1492 		fep->code_rate_LP = FEC_2_3;
1493 		break;
1494 	case 3:
1495 		fep->code_rate_LP = FEC_3_4;
1496 		break;
1497 	case 5:
1498 		fep->code_rate_LP = FEC_5_6;
1499 		break;
1500 	case 7:
1501 	default:
1502 		fep->code_rate_LP = FEC_7_8;
1503 		break;
1504 	}
1505 
1506 	/* native interleaver: (dib7000p_read_word(state, 464) >>  5) & 0x1 */
1507 
1508 	return 0;
1509 }
1510 
1511 static int dib7000p_set_frontend(struct dvb_frontend *fe)
1512 {
1513 	struct dtv_frontend_properties *fep = &fe->dtv_property_cache;
1514 	struct dib7000p_state *state = fe->demodulator_priv;
1515 	int time, ret;
1516 
1517 	if (state->version == SOC7090)
1518 		dib7090_set_diversity_in(fe, 0);
1519 	else
1520 		dib7000p_set_output_mode(state, OUTMODE_HIGH_Z);
1521 
1522 	/* maybe the parameter has been changed */
1523 	state->sfn_workaround_active = buggy_sfn_workaround;
1524 
1525 	if (fe->ops.tuner_ops.set_params)
1526 		fe->ops.tuner_ops.set_params(fe);
1527 
1528 	/* start up the AGC */
1529 	state->agc_state = 0;
1530 	do {
1531 		time = dib7000p_agc_startup(fe);
1532 		if (time != -1)
1533 			msleep(time);
1534 	} while (time != -1);
1535 
1536 	if (fep->transmission_mode == TRANSMISSION_MODE_AUTO ||
1537 		fep->guard_interval == GUARD_INTERVAL_AUTO || fep->modulation == QAM_AUTO || fep->code_rate_HP == FEC_AUTO) {
1538 		int i = 800, found;
1539 
1540 		dib7000p_autosearch_start(fe);
1541 		do {
1542 			msleep(1);
1543 			found = dib7000p_autosearch_is_irq(fe);
1544 		} while (found == 0 && i--);
1545 
1546 		dprintk("autosearch returns: %d\n", found);
1547 		if (found == 0 || found == 1)
1548 			return 0;
1549 
1550 		dib7000p_get_frontend(fe, fep);
1551 	}
1552 
1553 	ret = dib7000p_tune(fe);
1554 
1555 	/* make this a config parameter */
1556 	if (state->version == SOC7090) {
1557 		dib7090_set_output_mode(fe, state->cfg.output_mode);
1558 		if (state->cfg.enMpegOutput == 0) {
1559 			dib7090_setDibTxMux(state, MPEG_ON_DIBTX);
1560 			dib7090_setHostBusMux(state, DIBTX_ON_HOSTBUS);
1561 		}
1562 	} else
1563 		dib7000p_set_output_mode(state, state->cfg.output_mode);
1564 
1565 	return ret;
1566 }
1567 
1568 static int dib7000p_get_stats(struct dvb_frontend *fe, enum fe_status stat);
1569 
1570 static int dib7000p_read_status(struct dvb_frontend *fe, enum fe_status *stat)
1571 {
1572 	struct dib7000p_state *state = fe->demodulator_priv;
1573 	u16 lock = dib7000p_read_word(state, 509);
1574 
1575 	*stat = 0;
1576 
1577 	if (lock & 0x8000)
1578 		*stat |= FE_HAS_SIGNAL;
1579 	if (lock & 0x3000)
1580 		*stat |= FE_HAS_CARRIER;
1581 	if (lock & 0x0100)
1582 		*stat |= FE_HAS_VITERBI;
1583 	if (lock & 0x0010)
1584 		*stat |= FE_HAS_SYNC;
1585 	if ((lock & 0x0038) == 0x38)
1586 		*stat |= FE_HAS_LOCK;
1587 
1588 	dib7000p_get_stats(fe, *stat);
1589 
1590 	return 0;
1591 }
1592 
1593 static int dib7000p_read_ber(struct dvb_frontend *fe, u32 * ber)
1594 {
1595 	struct dib7000p_state *state = fe->demodulator_priv;
1596 	*ber = (dib7000p_read_word(state, 500) << 16) | dib7000p_read_word(state, 501);
1597 	return 0;
1598 }
1599 
1600 static int dib7000p_read_unc_blocks(struct dvb_frontend *fe, u32 * unc)
1601 {
1602 	struct dib7000p_state *state = fe->demodulator_priv;
1603 	*unc = dib7000p_read_word(state, 506);
1604 	return 0;
1605 }
1606 
1607 static int dib7000p_read_signal_strength(struct dvb_frontend *fe, u16 * strength)
1608 {
1609 	struct dib7000p_state *state = fe->demodulator_priv;
1610 	u16 val = dib7000p_read_word(state, 394);
1611 	*strength = 65535 - val;
1612 	return 0;
1613 }
1614 
1615 static u32 dib7000p_get_snr(struct dvb_frontend *fe)
1616 {
1617 	struct dib7000p_state *state = fe->demodulator_priv;
1618 	u16 val;
1619 	s32 signal_mant, signal_exp, noise_mant, noise_exp;
1620 	u32 result = 0;
1621 
1622 	val = dib7000p_read_word(state, 479);
1623 	noise_mant = (val >> 4) & 0xff;
1624 	noise_exp = ((val & 0xf) << 2);
1625 	val = dib7000p_read_word(state, 480);
1626 	noise_exp += ((val >> 14) & 0x3);
1627 	if ((noise_exp & 0x20) != 0)
1628 		noise_exp -= 0x40;
1629 
1630 	signal_mant = (val >> 6) & 0xFF;
1631 	signal_exp = (val & 0x3F);
1632 	if ((signal_exp & 0x20) != 0)
1633 		signal_exp -= 0x40;
1634 
1635 	if (signal_mant != 0)
1636 		result = intlog10(2) * 10 * signal_exp + 10 * intlog10(signal_mant);
1637 	else
1638 		result = intlog10(2) * 10 * signal_exp - 100;
1639 
1640 	if (noise_mant != 0)
1641 		result -= intlog10(2) * 10 * noise_exp + 10 * intlog10(noise_mant);
1642 	else
1643 		result -= intlog10(2) * 10 * noise_exp - 100;
1644 
1645 	return result;
1646 }
1647 
1648 static int dib7000p_read_snr(struct dvb_frontend *fe, u16 *snr)
1649 {
1650 	u32 result;
1651 
1652 	result = dib7000p_get_snr(fe);
1653 
1654 	*snr = result / ((1 << 24) / 10);
1655 	return 0;
1656 }
1657 
1658 static void dib7000p_reset_stats(struct dvb_frontend *demod)
1659 {
1660 	struct dib7000p_state *state = demod->demodulator_priv;
1661 	struct dtv_frontend_properties *c = &demod->dtv_property_cache;
1662 	u32 ucb;
1663 
1664 	memset(&c->strength, 0, sizeof(c->strength));
1665 	memset(&c->cnr, 0, sizeof(c->cnr));
1666 	memset(&c->post_bit_error, 0, sizeof(c->post_bit_error));
1667 	memset(&c->post_bit_count, 0, sizeof(c->post_bit_count));
1668 	memset(&c->block_error, 0, sizeof(c->block_error));
1669 
1670 	c->strength.len = 1;
1671 	c->cnr.len = 1;
1672 	c->block_error.len = 1;
1673 	c->block_count.len = 1;
1674 	c->post_bit_error.len = 1;
1675 	c->post_bit_count.len = 1;
1676 
1677 	c->strength.stat[0].scale = FE_SCALE_DECIBEL;
1678 	c->strength.stat[0].uvalue = 0;
1679 
1680 	c->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
1681 	c->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
1682 	c->block_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
1683 	c->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
1684 	c->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
1685 
1686 	dib7000p_read_unc_blocks(demod, &ucb);
1687 
1688 	state->old_ucb = ucb;
1689 	state->ber_jiffies_stats = 0;
1690 	state->per_jiffies_stats = 0;
1691 }
1692 
1693 struct linear_segments {
1694 	unsigned x;
1695 	signed y;
1696 };
1697 
1698 /*
1699  * Table to estimate signal strength in dBm.
1700  * This table should be empirically determinated by measuring the signal
1701  * strength generated by a RF generator directly connected into
1702  * a device.
1703  * This table was determinated by measuring the signal strength generated
1704  * by a DTA-2111 RF generator directly connected into a dib7000p device
1705  * (a Hauppauge Nova-TD stick), using a good quality 3 meters length
1706  * RC6 cable and good RC6 connectors, connected directly to antenna 1.
1707  * As the minimum output power of DTA-2111 is -31dBm, a 16 dBm attenuator
1708  * were used, for the lower power values.
1709  * The real value can actually be on other devices, or even at the
1710  * second antena input, depending on several factors, like if LNA
1711  * is enabled or not, if diversity is enabled, type of connectors, etc.
1712  * Yet, it is better to use this measure in dB than a random non-linear
1713  * percentage value, especially for antenna adjustments.
1714  * On my tests, the precision of the measure using this table is about
1715  * 0.5 dB, with sounds reasonable enough to adjust antennas.
1716  */
1717 #define DB_OFFSET 131000
1718 
1719 static struct linear_segments strength_to_db_table[] = {
1720 	{ 63630, DB_OFFSET - 20500},
1721 	{ 62273, DB_OFFSET - 21000},
1722 	{ 60162, DB_OFFSET - 22000},
1723 	{ 58730, DB_OFFSET - 23000},
1724 	{ 58294, DB_OFFSET - 24000},
1725 	{ 57778, DB_OFFSET - 25000},
1726 	{ 57320, DB_OFFSET - 26000},
1727 	{ 56779, DB_OFFSET - 27000},
1728 	{ 56293, DB_OFFSET - 28000},
1729 	{ 55724, DB_OFFSET - 29000},
1730 	{ 55145, DB_OFFSET - 30000},
1731 	{ 54680, DB_OFFSET - 31000},
1732 	{ 54293, DB_OFFSET - 32000},
1733 	{ 53813, DB_OFFSET - 33000},
1734 	{ 53427, DB_OFFSET - 34000},
1735 	{ 52981, DB_OFFSET - 35000},
1736 
1737 	{ 52636, DB_OFFSET - 36000},
1738 	{ 52014, DB_OFFSET - 37000},
1739 	{ 51674, DB_OFFSET - 38000},
1740 	{ 50692, DB_OFFSET - 39000},
1741 	{ 49824, DB_OFFSET - 40000},
1742 	{ 49052, DB_OFFSET - 41000},
1743 	{ 48436, DB_OFFSET - 42000},
1744 	{ 47836, DB_OFFSET - 43000},
1745 	{ 47368, DB_OFFSET - 44000},
1746 	{ 46468, DB_OFFSET - 45000},
1747 	{ 45597, DB_OFFSET - 46000},
1748 	{ 44586, DB_OFFSET - 47000},
1749 	{ 43667, DB_OFFSET - 48000},
1750 	{ 42673, DB_OFFSET - 49000},
1751 	{ 41816, DB_OFFSET - 50000},
1752 	{ 40876, DB_OFFSET - 51000},
1753 	{     0,      0},
1754 };
1755 
1756 static u32 interpolate_value(u32 value, struct linear_segments *segments,
1757 			     unsigned len)
1758 {
1759 	u64 tmp64;
1760 	u32 dx;
1761 	s32 dy;
1762 	int i, ret;
1763 
1764 	if (value >= segments[0].x)
1765 		return segments[0].y;
1766 	if (value < segments[len-1].x)
1767 		return segments[len-1].y;
1768 
1769 	for (i = 1; i < len - 1; i++) {
1770 		/* If value is identical, no need to interpolate */
1771 		if (value == segments[i].x)
1772 			return segments[i].y;
1773 		if (value > segments[i].x)
1774 			break;
1775 	}
1776 
1777 	/* Linear interpolation between the two (x,y) points */
1778 	dy = segments[i - 1].y - segments[i].y;
1779 	dx = segments[i - 1].x - segments[i].x;
1780 
1781 	tmp64 = value - segments[i].x;
1782 	tmp64 *= dy;
1783 	do_div(tmp64, dx);
1784 	ret = segments[i].y + tmp64;
1785 
1786 	return ret;
1787 }
1788 
1789 /* FIXME: may require changes - this one was borrowed from dib8000 */
1790 static u32 dib7000p_get_time_us(struct dvb_frontend *demod)
1791 {
1792 	struct dtv_frontend_properties *c = &demod->dtv_property_cache;
1793 	u64 time_us, tmp64;
1794 	u32 tmp, denom;
1795 	int guard, rate_num, rate_denum = 1, bits_per_symbol;
1796 	int interleaving = 0, fft_div;
1797 
1798 	switch (c->guard_interval) {
1799 	case GUARD_INTERVAL_1_4:
1800 		guard = 4;
1801 		break;
1802 	case GUARD_INTERVAL_1_8:
1803 		guard = 8;
1804 		break;
1805 	case GUARD_INTERVAL_1_16:
1806 		guard = 16;
1807 		break;
1808 	default:
1809 	case GUARD_INTERVAL_1_32:
1810 		guard = 32;
1811 		break;
1812 	}
1813 
1814 	switch (c->transmission_mode) {
1815 	case TRANSMISSION_MODE_2K:
1816 		fft_div = 4;
1817 		break;
1818 	case TRANSMISSION_MODE_4K:
1819 		fft_div = 2;
1820 		break;
1821 	default:
1822 	case TRANSMISSION_MODE_8K:
1823 		fft_div = 1;
1824 		break;
1825 	}
1826 
1827 	switch (c->modulation) {
1828 	case DQPSK:
1829 	case QPSK:
1830 		bits_per_symbol = 2;
1831 		break;
1832 	case QAM_16:
1833 		bits_per_symbol = 4;
1834 		break;
1835 	default:
1836 	case QAM_64:
1837 		bits_per_symbol = 6;
1838 		break;
1839 	}
1840 
1841 	switch ((c->hierarchy == 0 || 1 == 1) ? c->code_rate_HP : c->code_rate_LP) {
1842 	case FEC_1_2:
1843 		rate_num = 1;
1844 		rate_denum = 2;
1845 		break;
1846 	case FEC_2_3:
1847 		rate_num = 2;
1848 		rate_denum = 3;
1849 		break;
1850 	case FEC_3_4:
1851 		rate_num = 3;
1852 		rate_denum = 4;
1853 		break;
1854 	case FEC_5_6:
1855 		rate_num = 5;
1856 		rate_denum = 6;
1857 		break;
1858 	default:
1859 	case FEC_7_8:
1860 		rate_num = 7;
1861 		rate_denum = 8;
1862 		break;
1863 	}
1864 
1865 	interleaving = interleaving;
1866 
1867 	denom = bits_per_symbol * rate_num * fft_div * 384;
1868 
1869 	/* If calculus gets wrong, wait for 1s for the next stats */
1870 	if (!denom)
1871 		return 0;
1872 
1873 	/* Estimate the period for the total bit rate */
1874 	time_us = rate_denum * (1008 * 1562500L);
1875 	tmp64 = time_us;
1876 	do_div(tmp64, guard);
1877 	time_us = time_us + tmp64;
1878 	time_us += denom / 2;
1879 	do_div(time_us, denom);
1880 
1881 	tmp = 1008 * 96 * interleaving;
1882 	time_us += tmp + tmp / guard;
1883 
1884 	return time_us;
1885 }
1886 
1887 static int dib7000p_get_stats(struct dvb_frontend *demod, enum fe_status stat)
1888 {
1889 	struct dib7000p_state *state = demod->demodulator_priv;
1890 	struct dtv_frontend_properties *c = &demod->dtv_property_cache;
1891 	int show_per_stats = 0;
1892 	u32 time_us = 0, val, snr;
1893 	u64 blocks, ucb;
1894 	s32 db;
1895 	u16 strength;
1896 
1897 	/* Get Signal strength */
1898 	dib7000p_read_signal_strength(demod, &strength);
1899 	val = strength;
1900 	db = interpolate_value(val,
1901 			       strength_to_db_table,
1902 			       ARRAY_SIZE(strength_to_db_table)) - DB_OFFSET;
1903 	c->strength.stat[0].svalue = db;
1904 
1905 	/* UCB/BER/CNR measures require lock */
1906 	if (!(stat & FE_HAS_LOCK)) {
1907 		c->cnr.len = 1;
1908 		c->block_count.len = 1;
1909 		c->block_error.len = 1;
1910 		c->post_bit_error.len = 1;
1911 		c->post_bit_count.len = 1;
1912 		c->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
1913 		c->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
1914 		c->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
1915 		c->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
1916 		c->block_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
1917 		return 0;
1918 	}
1919 
1920 	/* Check if time for stats was elapsed */
1921 	if (time_after(jiffies, state->per_jiffies_stats)) {
1922 		state->per_jiffies_stats = jiffies + msecs_to_jiffies(1000);
1923 
1924 		/* Get SNR */
1925 		snr = dib7000p_get_snr(demod);
1926 		if (snr)
1927 			snr = (1000L * snr) >> 24;
1928 		else
1929 			snr = 0;
1930 		c->cnr.stat[0].svalue = snr;
1931 		c->cnr.stat[0].scale = FE_SCALE_DECIBEL;
1932 
1933 		/* Get UCB measures */
1934 		dib7000p_read_unc_blocks(demod, &val);
1935 		ucb = val - state->old_ucb;
1936 		if (val < state->old_ucb)
1937 			ucb += 0x100000000LL;
1938 
1939 		c->block_error.stat[0].scale = FE_SCALE_COUNTER;
1940 		c->block_error.stat[0].uvalue = ucb;
1941 
1942 		/* Estimate the number of packets based on bitrate */
1943 		if (!time_us)
1944 			time_us = dib7000p_get_time_us(demod);
1945 
1946 		if (time_us) {
1947 			blocks = 1250000ULL * 1000000ULL;
1948 			do_div(blocks, time_us * 8 * 204);
1949 			c->block_count.stat[0].scale = FE_SCALE_COUNTER;
1950 			c->block_count.stat[0].uvalue += blocks;
1951 		}
1952 
1953 		show_per_stats = 1;
1954 	}
1955 
1956 	/* Get post-BER measures */
1957 	if (time_after(jiffies, state->ber_jiffies_stats)) {
1958 		time_us = dib7000p_get_time_us(demod);
1959 		state->ber_jiffies_stats = jiffies + msecs_to_jiffies((time_us + 500) / 1000);
1960 
1961 		dprintk("Next all layers stats available in %u us.\n", time_us);
1962 
1963 		dib7000p_read_ber(demod, &val);
1964 		c->post_bit_error.stat[0].scale = FE_SCALE_COUNTER;
1965 		c->post_bit_error.stat[0].uvalue += val;
1966 
1967 		c->post_bit_count.stat[0].scale = FE_SCALE_COUNTER;
1968 		c->post_bit_count.stat[0].uvalue += 100000000;
1969 	}
1970 
1971 	/* Get PER measures */
1972 	if (show_per_stats) {
1973 		dib7000p_read_unc_blocks(demod, &val);
1974 
1975 		c->block_error.stat[0].scale = FE_SCALE_COUNTER;
1976 		c->block_error.stat[0].uvalue += val;
1977 
1978 		time_us = dib7000p_get_time_us(demod);
1979 		if (time_us) {
1980 			blocks = 1250000ULL * 1000000ULL;
1981 			do_div(blocks, time_us * 8 * 204);
1982 			c->block_count.stat[0].scale = FE_SCALE_COUNTER;
1983 			c->block_count.stat[0].uvalue += blocks;
1984 		}
1985 	}
1986 	return 0;
1987 }
1988 
1989 static int dib7000p_fe_get_tune_settings(struct dvb_frontend *fe, struct dvb_frontend_tune_settings *tune)
1990 {
1991 	tune->min_delay_ms = 1000;
1992 	return 0;
1993 }
1994 
1995 static void dib7000p_release(struct dvb_frontend *demod)
1996 {
1997 	struct dib7000p_state *st = demod->demodulator_priv;
1998 	dibx000_exit_i2c_master(&st->i2c_master);
1999 	i2c_del_adapter(&st->dib7090_tuner_adap);
2000 	kfree(st);
2001 }
2002 
2003 static int dib7000pc_detection(struct i2c_adapter *i2c_adap)
2004 {
2005 	u8 *tx, *rx;
2006 	struct i2c_msg msg[2] = {
2007 		{.addr = 18 >> 1, .flags = 0, .len = 2},
2008 		{.addr = 18 >> 1, .flags = I2C_M_RD, .len = 2},
2009 	};
2010 	int ret = 0;
2011 
2012 	tx = kzalloc(2*sizeof(u8), GFP_KERNEL);
2013 	if (!tx)
2014 		return -ENOMEM;
2015 	rx = kzalloc(2*sizeof(u8), GFP_KERNEL);
2016 	if (!rx) {
2017 		ret = -ENOMEM;
2018 		goto rx_memory_error;
2019 	}
2020 
2021 	msg[0].buf = tx;
2022 	msg[1].buf = rx;
2023 
2024 	tx[0] = 0x03;
2025 	tx[1] = 0x00;
2026 
2027 	if (i2c_transfer(i2c_adap, msg, 2) == 2)
2028 		if (rx[0] == 0x01 && rx[1] == 0xb3) {
2029 			dprintk("-D-  DiB7000PC detected\n");
2030 			return 1;
2031 		}
2032 
2033 	msg[0].addr = msg[1].addr = 0x40;
2034 
2035 	if (i2c_transfer(i2c_adap, msg, 2) == 2)
2036 		if (rx[0] == 0x01 && rx[1] == 0xb3) {
2037 			dprintk("-D-  DiB7000PC detected\n");
2038 			return 1;
2039 		}
2040 
2041 	dprintk("-D-  DiB7000PC not detected\n");
2042 
2043 	kfree(rx);
2044 rx_memory_error:
2045 	kfree(tx);
2046 	return ret;
2047 }
2048 
2049 static struct i2c_adapter *dib7000p_get_i2c_master(struct dvb_frontend *demod, enum dibx000_i2c_interface intf, int gating)
2050 {
2051 	struct dib7000p_state *st = demod->demodulator_priv;
2052 	return dibx000_get_i2c_adapter(&st->i2c_master, intf, gating);
2053 }
2054 
2055 static int dib7000p_pid_filter_ctrl(struct dvb_frontend *fe, u8 onoff)
2056 {
2057 	struct dib7000p_state *state = fe->demodulator_priv;
2058 	u16 val = dib7000p_read_word(state, 235) & 0xffef;
2059 	val |= (onoff & 0x1) << 4;
2060 	dprintk("PID filter enabled %d\n", onoff);
2061 	return dib7000p_write_word(state, 235, val);
2062 }
2063 
2064 static int dib7000p_pid_filter(struct dvb_frontend *fe, u8 id, u16 pid, u8 onoff)
2065 {
2066 	struct dib7000p_state *state = fe->demodulator_priv;
2067 	dprintk("PID filter: index %x, PID %d, OnOff %d\n", id, pid, onoff);
2068 	return dib7000p_write_word(state, 241 + id, onoff ? (1 << 13) | pid : 0);
2069 }
2070 
2071 static int dib7000p_i2c_enumeration(struct i2c_adapter *i2c, int no_of_demods, u8 default_addr, struct dib7000p_config cfg[])
2072 {
2073 	struct dib7000p_state *dpst;
2074 	int k = 0;
2075 	u8 new_addr = 0;
2076 
2077 	dpst = kzalloc(sizeof(struct dib7000p_state), GFP_KERNEL);
2078 	if (!dpst)
2079 		return -ENOMEM;
2080 
2081 	dpst->i2c_adap = i2c;
2082 	mutex_init(&dpst->i2c_buffer_lock);
2083 
2084 	for (k = no_of_demods - 1; k >= 0; k--) {
2085 		dpst->cfg = cfg[k];
2086 
2087 		/* designated i2c address */
2088 		if (cfg[k].default_i2c_addr != 0)
2089 			new_addr = cfg[k].default_i2c_addr + (k << 1);
2090 		else
2091 			new_addr = (0x40 + k) << 1;
2092 		dpst->i2c_addr = new_addr;
2093 		dib7000p_write_word(dpst, 1287, 0x0003);	/* sram lead in, rdy */
2094 		if (dib7000p_identify(dpst) != 0) {
2095 			dpst->i2c_addr = default_addr;
2096 			dib7000p_write_word(dpst, 1287, 0x0003);	/* sram lead in, rdy */
2097 			if (dib7000p_identify(dpst) != 0) {
2098 				dprintk("DiB7000P #%d: not identified\n", k);
2099 				kfree(dpst);
2100 				return -EIO;
2101 			}
2102 		}
2103 
2104 		/* start diversity to pull_down div_str - just for i2c-enumeration */
2105 		dib7000p_set_output_mode(dpst, OUTMODE_DIVERSITY);
2106 
2107 		/* set new i2c address and force divstart */
2108 		dib7000p_write_word(dpst, 1285, (new_addr << 2) | 0x2);
2109 
2110 		dprintk("IC %d initialized (to i2c_address 0x%x)\n", k, new_addr);
2111 	}
2112 
2113 	for (k = 0; k < no_of_demods; k++) {
2114 		dpst->cfg = cfg[k];
2115 		if (cfg[k].default_i2c_addr != 0)
2116 			dpst->i2c_addr = (cfg[k].default_i2c_addr + k) << 1;
2117 		else
2118 			dpst->i2c_addr = (0x40 + k) << 1;
2119 
2120 		// unforce divstr
2121 		dib7000p_write_word(dpst, 1285, dpst->i2c_addr << 2);
2122 
2123 		/* deactivate div - it was just for i2c-enumeration */
2124 		dib7000p_set_output_mode(dpst, OUTMODE_HIGH_Z);
2125 	}
2126 
2127 	kfree(dpst);
2128 	return 0;
2129 }
2130 
2131 static const s32 lut_1000ln_mant[] = {
2132 	6908, 6956, 7003, 7047, 7090, 7131, 7170, 7208, 7244, 7279, 7313, 7346, 7377, 7408, 7438, 7467, 7495, 7523, 7549, 7575, 7600
2133 };
2134 
2135 static s32 dib7000p_get_adc_power(struct dvb_frontend *fe)
2136 {
2137 	struct dib7000p_state *state = fe->demodulator_priv;
2138 	u32 tmp_val = 0, exp = 0, mant = 0;
2139 	s32 pow_i;
2140 	u16 buf[2];
2141 	u8 ix = 0;
2142 
2143 	buf[0] = dib7000p_read_word(state, 0x184);
2144 	buf[1] = dib7000p_read_word(state, 0x185);
2145 	pow_i = (buf[0] << 16) | buf[1];
2146 	dprintk("raw pow_i = %d\n", pow_i);
2147 
2148 	tmp_val = pow_i;
2149 	while (tmp_val >>= 1)
2150 		exp++;
2151 
2152 	mant = (pow_i * 1000 / (1 << exp));
2153 	dprintk(" mant = %d exp = %d\n", mant / 1000, exp);
2154 
2155 	ix = (u8) ((mant - 1000) / 100);	/* index of the LUT */
2156 	dprintk(" ix = %d\n", ix);
2157 
2158 	pow_i = (lut_1000ln_mant[ix] + 693 * (exp - 20) - 6908);
2159 	pow_i = (pow_i << 8) / 1000;
2160 	dprintk(" pow_i = %d\n", pow_i);
2161 
2162 	return pow_i;
2163 }
2164 
2165 static int map_addr_to_serpar_number(struct i2c_msg *msg)
2166 {
2167 	if ((msg->buf[0] <= 15))
2168 		msg->buf[0] -= 1;
2169 	else if (msg->buf[0] == 17)
2170 		msg->buf[0] = 15;
2171 	else if (msg->buf[0] == 16)
2172 		msg->buf[0] = 17;
2173 	else if (msg->buf[0] == 19)
2174 		msg->buf[0] = 16;
2175 	else if (msg->buf[0] >= 21 && msg->buf[0] <= 25)
2176 		msg->buf[0] -= 3;
2177 	else if (msg->buf[0] == 28)
2178 		msg->buf[0] = 23;
2179 	else
2180 		return -EINVAL;
2181 	return 0;
2182 }
2183 
2184 static int w7090p_tuner_write_serpar(struct i2c_adapter *i2c_adap, struct i2c_msg msg[], int num)
2185 {
2186 	struct dib7000p_state *state = i2c_get_adapdata(i2c_adap);
2187 	u8 n_overflow = 1;
2188 	u16 i = 1000;
2189 	u16 serpar_num = msg[0].buf[0];
2190 
2191 	while (n_overflow == 1 && i) {
2192 		n_overflow = (dib7000p_read_word(state, 1984) >> 1) & 0x1;
2193 		i--;
2194 		if (i == 0)
2195 			dprintk("Tuner ITF: write busy (overflow)\n");
2196 	}
2197 	dib7000p_write_word(state, 1985, (1 << 6) | (serpar_num & 0x3f));
2198 	dib7000p_write_word(state, 1986, (msg[0].buf[1] << 8) | msg[0].buf[2]);
2199 
2200 	return num;
2201 }
2202 
2203 static int w7090p_tuner_read_serpar(struct i2c_adapter *i2c_adap, struct i2c_msg msg[], int num)
2204 {
2205 	struct dib7000p_state *state = i2c_get_adapdata(i2c_adap);
2206 	u8 n_overflow = 1, n_empty = 1;
2207 	u16 i = 1000;
2208 	u16 serpar_num = msg[0].buf[0];
2209 	u16 read_word;
2210 
2211 	while (n_overflow == 1 && i) {
2212 		n_overflow = (dib7000p_read_word(state, 1984) >> 1) & 0x1;
2213 		i--;
2214 		if (i == 0)
2215 			dprintk("TunerITF: read busy (overflow)\n");
2216 	}
2217 	dib7000p_write_word(state, 1985, (0 << 6) | (serpar_num & 0x3f));
2218 
2219 	i = 1000;
2220 	while (n_empty == 1 && i) {
2221 		n_empty = dib7000p_read_word(state, 1984) & 0x1;
2222 		i--;
2223 		if (i == 0)
2224 			dprintk("TunerITF: read busy (empty)\n");
2225 	}
2226 	read_word = dib7000p_read_word(state, 1987);
2227 	msg[1].buf[0] = (read_word >> 8) & 0xff;
2228 	msg[1].buf[1] = (read_word) & 0xff;
2229 
2230 	return num;
2231 }
2232 
2233 static int w7090p_tuner_rw_serpar(struct i2c_adapter *i2c_adap, struct i2c_msg msg[], int num)
2234 {
2235 	if (map_addr_to_serpar_number(&msg[0]) == 0) {	/* else = Tuner regs to ignore : DIG_CFG, CTRL_RF_LT, PLL_CFG, PWM1_REG, ADCCLK, DIG_CFG_3; SLEEP_EN... */
2236 		if (num == 1) {	/* write */
2237 			return w7090p_tuner_write_serpar(i2c_adap, msg, 1);
2238 		} else {	/* read */
2239 			return w7090p_tuner_read_serpar(i2c_adap, msg, 2);
2240 		}
2241 	}
2242 	return num;
2243 }
2244 
2245 static int dib7090p_rw_on_apb(struct i2c_adapter *i2c_adap,
2246 		struct i2c_msg msg[], int num, u16 apb_address)
2247 {
2248 	struct dib7000p_state *state = i2c_get_adapdata(i2c_adap);
2249 	u16 word;
2250 
2251 	if (num == 1) {		/* write */
2252 		dib7000p_write_word(state, apb_address, ((msg[0].buf[1] << 8) | (msg[0].buf[2])));
2253 	} else {
2254 		word = dib7000p_read_word(state, apb_address);
2255 		msg[1].buf[0] = (word >> 8) & 0xff;
2256 		msg[1].buf[1] = (word) & 0xff;
2257 	}
2258 
2259 	return num;
2260 }
2261 
2262 static int dib7090_tuner_xfer(struct i2c_adapter *i2c_adap, struct i2c_msg msg[], int num)
2263 {
2264 	struct dib7000p_state *state = i2c_get_adapdata(i2c_adap);
2265 
2266 	u16 apb_address = 0, word;
2267 	int i = 0;
2268 	switch (msg[0].buf[0]) {
2269 	case 0x12:
2270 		apb_address = 1920;
2271 		break;
2272 	case 0x14:
2273 		apb_address = 1921;
2274 		break;
2275 	case 0x24:
2276 		apb_address = 1922;
2277 		break;
2278 	case 0x1a:
2279 		apb_address = 1923;
2280 		break;
2281 	case 0x22:
2282 		apb_address = 1924;
2283 		break;
2284 	case 0x33:
2285 		apb_address = 1926;
2286 		break;
2287 	case 0x34:
2288 		apb_address = 1927;
2289 		break;
2290 	case 0x35:
2291 		apb_address = 1928;
2292 		break;
2293 	case 0x36:
2294 		apb_address = 1929;
2295 		break;
2296 	case 0x37:
2297 		apb_address = 1930;
2298 		break;
2299 	case 0x38:
2300 		apb_address = 1931;
2301 		break;
2302 	case 0x39:
2303 		apb_address = 1932;
2304 		break;
2305 	case 0x2a:
2306 		apb_address = 1935;
2307 		break;
2308 	case 0x2b:
2309 		apb_address = 1936;
2310 		break;
2311 	case 0x2c:
2312 		apb_address = 1937;
2313 		break;
2314 	case 0x2d:
2315 		apb_address = 1938;
2316 		break;
2317 	case 0x2e:
2318 		apb_address = 1939;
2319 		break;
2320 	case 0x2f:
2321 		apb_address = 1940;
2322 		break;
2323 	case 0x30:
2324 		apb_address = 1941;
2325 		break;
2326 	case 0x31:
2327 		apb_address = 1942;
2328 		break;
2329 	case 0x32:
2330 		apb_address = 1943;
2331 		break;
2332 	case 0x3e:
2333 		apb_address = 1944;
2334 		break;
2335 	case 0x3f:
2336 		apb_address = 1945;
2337 		break;
2338 	case 0x40:
2339 		apb_address = 1948;
2340 		break;
2341 	case 0x25:
2342 		apb_address = 914;
2343 		break;
2344 	case 0x26:
2345 		apb_address = 915;
2346 		break;
2347 	case 0x27:
2348 		apb_address = 917;
2349 		break;
2350 	case 0x28:
2351 		apb_address = 916;
2352 		break;
2353 	case 0x1d:
2354 		i = ((dib7000p_read_word(state, 72) >> 12) & 0x3);
2355 		word = dib7000p_read_word(state, 384 + i);
2356 		msg[1].buf[0] = (word >> 8) & 0xff;
2357 		msg[1].buf[1] = (word) & 0xff;
2358 		return num;
2359 	case 0x1f:
2360 		if (num == 1) {	/* write */
2361 			word = (u16) ((msg[0].buf[1] << 8) | msg[0].buf[2]);
2362 			word &= 0x3;
2363 			word = (dib7000p_read_word(state, 72) & ~(3 << 12)) | (word << 12);
2364 			dib7000p_write_word(state, 72, word);	/* Set the proper input */
2365 			return num;
2366 		}
2367 	}
2368 
2369 	if (apb_address != 0)	/* R/W acces via APB */
2370 		return dib7090p_rw_on_apb(i2c_adap, msg, num, apb_address);
2371 	else			/* R/W access via SERPAR  */
2372 		return w7090p_tuner_rw_serpar(i2c_adap, msg, num);
2373 
2374 	return 0;
2375 }
2376 
2377 static u32 dib7000p_i2c_func(struct i2c_adapter *adapter)
2378 {
2379 	return I2C_FUNC_I2C;
2380 }
2381 
2382 static struct i2c_algorithm dib7090_tuner_xfer_algo = {
2383 	.master_xfer = dib7090_tuner_xfer,
2384 	.functionality = dib7000p_i2c_func,
2385 };
2386 
2387 static struct i2c_adapter *dib7090_get_i2c_tuner(struct dvb_frontend *fe)
2388 {
2389 	struct dib7000p_state *st = fe->demodulator_priv;
2390 	return &st->dib7090_tuner_adap;
2391 }
2392 
2393 static int dib7090_host_bus_drive(struct dib7000p_state *state, u8 drive)
2394 {
2395 	u16 reg;
2396 
2397 	/* drive host bus 2, 3, 4 */
2398 	reg = dib7000p_read_word(state, 1798) & ~((0x7) | (0x7 << 6) | (0x7 << 12));
2399 	reg |= (drive << 12) | (drive << 6) | drive;
2400 	dib7000p_write_word(state, 1798, reg);
2401 
2402 	/* drive host bus 5,6 */
2403 	reg = dib7000p_read_word(state, 1799) & ~((0x7 << 2) | (0x7 << 8));
2404 	reg |= (drive << 8) | (drive << 2);
2405 	dib7000p_write_word(state, 1799, reg);
2406 
2407 	/* drive host bus 7, 8, 9 */
2408 	reg = dib7000p_read_word(state, 1800) & ~((0x7) | (0x7 << 6) | (0x7 << 12));
2409 	reg |= (drive << 12) | (drive << 6) | drive;
2410 	dib7000p_write_word(state, 1800, reg);
2411 
2412 	/* drive host bus 10, 11 */
2413 	reg = dib7000p_read_word(state, 1801) & ~((0x7 << 2) | (0x7 << 8));
2414 	reg |= (drive << 8) | (drive << 2);
2415 	dib7000p_write_word(state, 1801, reg);
2416 
2417 	/* drive host bus 12, 13, 14 */
2418 	reg = dib7000p_read_word(state, 1802) & ~((0x7) | (0x7 << 6) | (0x7 << 12));
2419 	reg |= (drive << 12) | (drive << 6) | drive;
2420 	dib7000p_write_word(state, 1802, reg);
2421 
2422 	return 0;
2423 }
2424 
2425 static u32 dib7090_calcSyncFreq(u32 P_Kin, u32 P_Kout, u32 insertExtSynchro, u32 syncSize)
2426 {
2427 	u32 quantif = 3;
2428 	u32 nom = (insertExtSynchro * P_Kin + syncSize);
2429 	u32 denom = P_Kout;
2430 	u32 syncFreq = ((nom << quantif) / denom);
2431 
2432 	if ((syncFreq & ((1 << quantif) - 1)) != 0)
2433 		syncFreq = (syncFreq >> quantif) + 1;
2434 	else
2435 		syncFreq = (syncFreq >> quantif);
2436 
2437 	if (syncFreq != 0)
2438 		syncFreq = syncFreq - 1;
2439 
2440 	return syncFreq;
2441 }
2442 
2443 static int dib7090_cfg_DibTx(struct dib7000p_state *state, u32 P_Kin, u32 P_Kout, u32 insertExtSynchro, u32 synchroMode, u32 syncWord, u32 syncSize)
2444 {
2445 	dprintk("Configure DibStream Tx\n");
2446 
2447 	dib7000p_write_word(state, 1615, 1);
2448 	dib7000p_write_word(state, 1603, P_Kin);
2449 	dib7000p_write_word(state, 1605, P_Kout);
2450 	dib7000p_write_word(state, 1606, insertExtSynchro);
2451 	dib7000p_write_word(state, 1608, synchroMode);
2452 	dib7000p_write_word(state, 1609, (syncWord >> 16) & 0xffff);
2453 	dib7000p_write_word(state, 1610, syncWord & 0xffff);
2454 	dib7000p_write_word(state, 1612, syncSize);
2455 	dib7000p_write_word(state, 1615, 0);
2456 
2457 	return 0;
2458 }
2459 
2460 static int dib7090_cfg_DibRx(struct dib7000p_state *state, u32 P_Kin, u32 P_Kout, u32 synchroMode, u32 insertExtSynchro, u32 syncWord, u32 syncSize,
2461 		u32 dataOutRate)
2462 {
2463 	u32 syncFreq;
2464 
2465 	dprintk("Configure DibStream Rx\n");
2466 	if ((P_Kin != 0) && (P_Kout != 0)) {
2467 		syncFreq = dib7090_calcSyncFreq(P_Kin, P_Kout, insertExtSynchro, syncSize);
2468 		dib7000p_write_word(state, 1542, syncFreq);
2469 	}
2470 	dib7000p_write_word(state, 1554, 1);
2471 	dib7000p_write_word(state, 1536, P_Kin);
2472 	dib7000p_write_word(state, 1537, P_Kout);
2473 	dib7000p_write_word(state, 1539, synchroMode);
2474 	dib7000p_write_word(state, 1540, (syncWord >> 16) & 0xffff);
2475 	dib7000p_write_word(state, 1541, syncWord & 0xffff);
2476 	dib7000p_write_word(state, 1543, syncSize);
2477 	dib7000p_write_word(state, 1544, dataOutRate);
2478 	dib7000p_write_word(state, 1554, 0);
2479 
2480 	return 0;
2481 }
2482 
2483 static void dib7090_enMpegMux(struct dib7000p_state *state, int onoff)
2484 {
2485 	u16 reg_1287 = dib7000p_read_word(state, 1287);
2486 
2487 	switch (onoff) {
2488 	case 1:
2489 			reg_1287 &= ~(1<<7);
2490 			break;
2491 	case 0:
2492 			reg_1287 |= (1<<7);
2493 			break;
2494 	}
2495 
2496 	dib7000p_write_word(state, 1287, reg_1287);
2497 }
2498 
2499 static void dib7090_configMpegMux(struct dib7000p_state *state,
2500 		u16 pulseWidth, u16 enSerialMode, u16 enSerialClkDiv2)
2501 {
2502 	dprintk("Enable Mpeg mux\n");
2503 
2504 	dib7090_enMpegMux(state, 0);
2505 
2506 	/* If the input mode is MPEG do not divide the serial clock */
2507 	if ((enSerialMode == 1) && (state->input_mode_mpeg == 1))
2508 		enSerialClkDiv2 = 0;
2509 
2510 	dib7000p_write_word(state, 1287, ((pulseWidth & 0x1f) << 2)
2511 			| ((enSerialMode & 0x1) << 1)
2512 			| (enSerialClkDiv2 & 0x1));
2513 
2514 	dib7090_enMpegMux(state, 1);
2515 }
2516 
2517 static void dib7090_setDibTxMux(struct dib7000p_state *state, int mode)
2518 {
2519 	u16 reg_1288 = dib7000p_read_word(state, 1288) & ~(0x7 << 7);
2520 
2521 	switch (mode) {
2522 	case MPEG_ON_DIBTX:
2523 			dprintk("SET MPEG ON DIBSTREAM TX\n");
2524 			dib7090_cfg_DibTx(state, 8, 5, 0, 0, 0, 0);
2525 			reg_1288 |= (1<<9);
2526 			break;
2527 	case DIV_ON_DIBTX:
2528 			dprintk("SET DIV_OUT ON DIBSTREAM TX\n");
2529 			dib7090_cfg_DibTx(state, 5, 5, 0, 0, 0, 0);
2530 			reg_1288 |= (1<<8);
2531 			break;
2532 	case ADC_ON_DIBTX:
2533 			dprintk("SET ADC_OUT ON DIBSTREAM TX\n");
2534 			dib7090_cfg_DibTx(state, 20, 5, 10, 0, 0, 0);
2535 			reg_1288 |= (1<<7);
2536 			break;
2537 	default:
2538 			break;
2539 	}
2540 	dib7000p_write_word(state, 1288, reg_1288);
2541 }
2542 
2543 static void dib7090_setHostBusMux(struct dib7000p_state *state, int mode)
2544 {
2545 	u16 reg_1288 = dib7000p_read_word(state, 1288) & ~(0x7 << 4);
2546 
2547 	switch (mode) {
2548 	case DEMOUT_ON_HOSTBUS:
2549 			dprintk("SET DEM OUT OLD INTERF ON HOST BUS\n");
2550 			dib7090_enMpegMux(state, 0);
2551 			reg_1288 |= (1<<6);
2552 			break;
2553 	case DIBTX_ON_HOSTBUS:
2554 			dprintk("SET DIBSTREAM TX ON HOST BUS\n");
2555 			dib7090_enMpegMux(state, 0);
2556 			reg_1288 |= (1<<5);
2557 			break;
2558 	case MPEG_ON_HOSTBUS:
2559 			dprintk("SET MPEG MUX ON HOST BUS\n");
2560 			reg_1288 |= (1<<4);
2561 			break;
2562 	default:
2563 			break;
2564 	}
2565 	dib7000p_write_word(state, 1288, reg_1288);
2566 }
2567 
2568 static int dib7090_set_diversity_in(struct dvb_frontend *fe, int onoff)
2569 {
2570 	struct dib7000p_state *state = fe->demodulator_priv;
2571 	u16 reg_1287;
2572 
2573 	switch (onoff) {
2574 	case 0: /* only use the internal way - not the diversity input */
2575 			dprintk("%s mode OFF : by default Enable Mpeg INPUT\n", __func__);
2576 			dib7090_cfg_DibRx(state, 8, 5, 0, 0, 0, 8, 0);
2577 
2578 			/* Do not divide the serial clock of MPEG MUX */
2579 			/* in SERIAL MODE in case input mode MPEG is used */
2580 			reg_1287 = dib7000p_read_word(state, 1287);
2581 			/* enSerialClkDiv2 == 1 ? */
2582 			if ((reg_1287 & 0x1) == 1) {
2583 				/* force enSerialClkDiv2 = 0 */
2584 				reg_1287 &= ~0x1;
2585 				dib7000p_write_word(state, 1287, reg_1287);
2586 			}
2587 			state->input_mode_mpeg = 1;
2588 			break;
2589 	case 1: /* both ways */
2590 	case 2: /* only the diversity input */
2591 			dprintk("%s ON : Enable diversity INPUT\n", __func__);
2592 			dib7090_cfg_DibRx(state, 5, 5, 0, 0, 0, 0, 0);
2593 			state->input_mode_mpeg = 0;
2594 			break;
2595 	}
2596 
2597 	dib7000p_set_diversity_in(&state->demod, onoff);
2598 	return 0;
2599 }
2600 
2601 static int dib7090_set_output_mode(struct dvb_frontend *fe, int mode)
2602 {
2603 	struct dib7000p_state *state = fe->demodulator_priv;
2604 
2605 	u16 outreg, smo_mode, fifo_threshold;
2606 	u8 prefer_mpeg_mux_use = 1;
2607 	int ret = 0;
2608 
2609 	dib7090_host_bus_drive(state, 1);
2610 
2611 	fifo_threshold = 1792;
2612 	smo_mode = (dib7000p_read_word(state, 235) & 0x0050) | (1 << 1);
2613 	outreg = dib7000p_read_word(state, 1286) & ~((1 << 10) | (0x7 << 6) | (1 << 1));
2614 
2615 	switch (mode) {
2616 	case OUTMODE_HIGH_Z:
2617 		outreg = 0;
2618 		break;
2619 
2620 	case OUTMODE_MPEG2_SERIAL:
2621 		if (prefer_mpeg_mux_use) {
2622 			dprintk("setting output mode TS_SERIAL using Mpeg Mux\n");
2623 			dib7090_configMpegMux(state, 3, 1, 1);
2624 			dib7090_setHostBusMux(state, MPEG_ON_HOSTBUS);
2625 		} else {/* Use Smooth block */
2626 			dprintk("setting output mode TS_SERIAL using Smooth bloc\n");
2627 			dib7090_setHostBusMux(state, DEMOUT_ON_HOSTBUS);
2628 			outreg |= (2<<6) | (0 << 1);
2629 		}
2630 		break;
2631 
2632 	case OUTMODE_MPEG2_PAR_GATED_CLK:
2633 		if (prefer_mpeg_mux_use) {
2634 			dprintk("setting output mode TS_PARALLEL_GATED using Mpeg Mux\n");
2635 			dib7090_configMpegMux(state, 2, 0, 0);
2636 			dib7090_setHostBusMux(state, MPEG_ON_HOSTBUS);
2637 		} else { /* Use Smooth block */
2638 			dprintk("setting output mode TS_PARALLEL_GATED using Smooth block\n");
2639 			dib7090_setHostBusMux(state, DEMOUT_ON_HOSTBUS);
2640 			outreg |= (0<<6);
2641 		}
2642 		break;
2643 
2644 	case OUTMODE_MPEG2_PAR_CONT_CLK:	/* Using Smooth block only */
2645 		dprintk("setting output mode TS_PARALLEL_CONT using Smooth block\n");
2646 		dib7090_setHostBusMux(state, DEMOUT_ON_HOSTBUS);
2647 		outreg |= (1<<6);
2648 		break;
2649 
2650 	case OUTMODE_MPEG2_FIFO:	/* Using Smooth block because not supported by new Mpeg Mux bloc */
2651 		dprintk("setting output mode TS_FIFO using Smooth block\n");
2652 		dib7090_setHostBusMux(state, DEMOUT_ON_HOSTBUS);
2653 		outreg |= (5<<6);
2654 		smo_mode |= (3 << 1);
2655 		fifo_threshold = 512;
2656 		break;
2657 
2658 	case OUTMODE_DIVERSITY:
2659 		dprintk("setting output mode MODE_DIVERSITY\n");
2660 		dib7090_setDibTxMux(state, DIV_ON_DIBTX);
2661 		dib7090_setHostBusMux(state, DIBTX_ON_HOSTBUS);
2662 		break;
2663 
2664 	case OUTMODE_ANALOG_ADC:
2665 		dprintk("setting output mode MODE_ANALOG_ADC\n");
2666 		dib7090_setDibTxMux(state, ADC_ON_DIBTX);
2667 		dib7090_setHostBusMux(state, DIBTX_ON_HOSTBUS);
2668 		break;
2669 	}
2670 	if (mode != OUTMODE_HIGH_Z)
2671 		outreg |= (1 << 10);
2672 
2673 	if (state->cfg.output_mpeg2_in_188_bytes)
2674 		smo_mode |= (1 << 5);
2675 
2676 	ret |= dib7000p_write_word(state, 235, smo_mode);
2677 	ret |= dib7000p_write_word(state, 236, fifo_threshold);	/* synchronous fread */
2678 	ret |= dib7000p_write_word(state, 1286, outreg);
2679 
2680 	return ret;
2681 }
2682 
2683 static int dib7090_tuner_sleep(struct dvb_frontend *fe, int onoff)
2684 {
2685 	struct dib7000p_state *state = fe->demodulator_priv;
2686 	u16 en_cur_state;
2687 
2688 	dprintk("sleep dib7090: %d\n", onoff);
2689 
2690 	en_cur_state = dib7000p_read_word(state, 1922);
2691 
2692 	if (en_cur_state > 0xff)
2693 		state->tuner_enable = en_cur_state;
2694 
2695 	if (onoff)
2696 		en_cur_state &= 0x00ff;
2697 	else {
2698 		if (state->tuner_enable != 0)
2699 			en_cur_state = state->tuner_enable;
2700 	}
2701 
2702 	dib7000p_write_word(state, 1922, en_cur_state);
2703 
2704 	return 0;
2705 }
2706 
2707 static int dib7090_get_adc_power(struct dvb_frontend *fe)
2708 {
2709 	return dib7000p_get_adc_power(fe);
2710 }
2711 
2712 static int dib7090_slave_reset(struct dvb_frontend *fe)
2713 {
2714 	struct dib7000p_state *state = fe->demodulator_priv;
2715 	u16 reg;
2716 
2717 	reg = dib7000p_read_word(state, 1794);
2718 	dib7000p_write_word(state, 1794, reg | (4 << 12));
2719 
2720 	dib7000p_write_word(state, 1032, 0xffff);
2721 	return 0;
2722 }
2723 
2724 static const struct dvb_frontend_ops dib7000p_ops;
2725 static struct dvb_frontend *dib7000p_init(struct i2c_adapter *i2c_adap, u8 i2c_addr, struct dib7000p_config *cfg)
2726 {
2727 	struct dvb_frontend *demod;
2728 	struct dib7000p_state *st;
2729 	st = kzalloc(sizeof(struct dib7000p_state), GFP_KERNEL);
2730 	if (st == NULL)
2731 		return NULL;
2732 
2733 	memcpy(&st->cfg, cfg, sizeof(struct dib7000p_config));
2734 	st->i2c_adap = i2c_adap;
2735 	st->i2c_addr = i2c_addr;
2736 	st->gpio_val = cfg->gpio_val;
2737 	st->gpio_dir = cfg->gpio_dir;
2738 
2739 	/* Ensure the output mode remains at the previous default if it's
2740 	 * not specifically set by the caller.
2741 	 */
2742 	if ((st->cfg.output_mode != OUTMODE_MPEG2_SERIAL) && (st->cfg.output_mode != OUTMODE_MPEG2_PAR_GATED_CLK))
2743 		st->cfg.output_mode = OUTMODE_MPEG2_FIFO;
2744 
2745 	demod = &st->demod;
2746 	demod->demodulator_priv = st;
2747 	memcpy(&st->demod.ops, &dib7000p_ops, sizeof(struct dvb_frontend_ops));
2748 	mutex_init(&st->i2c_buffer_lock);
2749 
2750 	dib7000p_write_word(st, 1287, 0x0003);	/* sram lead in, rdy */
2751 
2752 	if (dib7000p_identify(st) != 0)
2753 		goto error;
2754 
2755 	st->version = dib7000p_read_word(st, 897);
2756 
2757 	/* FIXME: make sure the dev.parent field is initialized, or else
2758 	   request_firmware() will hit an OOPS (this should be moved somewhere
2759 	   more common) */
2760 	st->i2c_master.gated_tuner_i2c_adap.dev.parent = i2c_adap->dev.parent;
2761 
2762 	dibx000_init_i2c_master(&st->i2c_master, DIB7000P, st->i2c_adap, st->i2c_addr);
2763 
2764 	/* init 7090 tuner adapter */
2765 	strncpy(st->dib7090_tuner_adap.name, "DiB7090 tuner interface", sizeof(st->dib7090_tuner_adap.name));
2766 	st->dib7090_tuner_adap.algo = &dib7090_tuner_xfer_algo;
2767 	st->dib7090_tuner_adap.algo_data = NULL;
2768 	st->dib7090_tuner_adap.dev.parent = st->i2c_adap->dev.parent;
2769 	i2c_set_adapdata(&st->dib7090_tuner_adap, st);
2770 	i2c_add_adapter(&st->dib7090_tuner_adap);
2771 
2772 	dib7000p_demod_reset(st);
2773 
2774 	dib7000p_reset_stats(demod);
2775 
2776 	if (st->version == SOC7090) {
2777 		dib7090_set_output_mode(demod, st->cfg.output_mode);
2778 		dib7090_set_diversity_in(demod, 0);
2779 	}
2780 
2781 	return demod;
2782 
2783 error:
2784 	kfree(st);
2785 	return NULL;
2786 }
2787 
2788 void *dib7000p_attach(struct dib7000p_ops *ops)
2789 {
2790 	if (!ops)
2791 		return NULL;
2792 
2793 	ops->slave_reset = dib7090_slave_reset;
2794 	ops->get_adc_power = dib7090_get_adc_power;
2795 	ops->dib7000pc_detection = dib7000pc_detection;
2796 	ops->get_i2c_tuner = dib7090_get_i2c_tuner;
2797 	ops->tuner_sleep = dib7090_tuner_sleep;
2798 	ops->init = dib7000p_init;
2799 	ops->set_agc1_min = dib7000p_set_agc1_min;
2800 	ops->set_gpio = dib7000p_set_gpio;
2801 	ops->i2c_enumeration = dib7000p_i2c_enumeration;
2802 	ops->pid_filter = dib7000p_pid_filter;
2803 	ops->pid_filter_ctrl = dib7000p_pid_filter_ctrl;
2804 	ops->get_i2c_master = dib7000p_get_i2c_master;
2805 	ops->update_pll = dib7000p_update_pll;
2806 	ops->ctrl_timf = dib7000p_ctrl_timf;
2807 	ops->get_agc_values = dib7000p_get_agc_values;
2808 	ops->set_wbd_ref = dib7000p_set_wbd_ref;
2809 
2810 	return ops;
2811 }
2812 EXPORT_SYMBOL(dib7000p_attach);
2813 
2814 static const struct dvb_frontend_ops dib7000p_ops = {
2815 	.delsys = { SYS_DVBT },
2816 	.info = {
2817 		 .name = "DiBcom 7000PC",
2818 		 .frequency_min = 44250000,
2819 		 .frequency_max = 867250000,
2820 		 .frequency_stepsize = 62500,
2821 		 .caps = FE_CAN_INVERSION_AUTO |
2822 		 FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
2823 		 FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
2824 		 FE_CAN_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_64 | FE_CAN_QAM_AUTO |
2825 		 FE_CAN_TRANSMISSION_MODE_AUTO | FE_CAN_GUARD_INTERVAL_AUTO | FE_CAN_RECOVER | FE_CAN_HIERARCHY_AUTO,
2826 		 },
2827 
2828 	.release = dib7000p_release,
2829 
2830 	.init = dib7000p_wakeup,
2831 	.sleep = dib7000p_sleep,
2832 
2833 	.set_frontend = dib7000p_set_frontend,
2834 	.get_tune_settings = dib7000p_fe_get_tune_settings,
2835 	.get_frontend = dib7000p_get_frontend,
2836 
2837 	.read_status = dib7000p_read_status,
2838 	.read_ber = dib7000p_read_ber,
2839 	.read_signal_strength = dib7000p_read_signal_strength,
2840 	.read_snr = dib7000p_read_snr,
2841 	.read_ucblocks = dib7000p_read_unc_blocks,
2842 };
2843 
2844 MODULE_AUTHOR("Olivier Grenie <olivie.grenie@parrot.com>");
2845 MODULE_AUTHOR("Patrick Boettcher <patrick.boettcher@posteo.de>");
2846 MODULE_DESCRIPTION("Driver for the DiBcom 7000PC COFDM demodulator");
2847 MODULE_LICENSE("GPL");
2848