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