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