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