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