1 /*
2  * drxk_hard: DRX-K DVB-C/T demodulator driver
3  *
4  * Copyright (C) 2010-2011 Digital Devices GmbH
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
8  * version 2 only, as published by the Free Software Foundation.
9  *
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * To obtain the license, point your browser to
17  * http://www.gnu.org/copyleft/gpl.html
18  */
19 
20 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
21 
22 #include <linux/kernel.h>
23 #include <linux/module.h>
24 #include <linux/moduleparam.h>
25 #include <linux/init.h>
26 #include <linux/delay.h>
27 #include <linux/firmware.h>
28 #include <linux/i2c.h>
29 #include <linux/hardirq.h>
30 #include <asm/div64.h>
31 
32 #include <media/dvb_frontend.h>
33 #include "drxk.h"
34 #include "drxk_hard.h"
35 #include <media/dvb_math.h>
36 
37 static int power_down_dvbt(struct drxk_state *state, bool set_power_mode);
38 static int power_down_qam(struct drxk_state *state);
39 static int set_dvbt_standard(struct drxk_state *state,
40 			   enum operation_mode o_mode);
41 static int set_qam_standard(struct drxk_state *state,
42 			  enum operation_mode o_mode);
43 static int set_qam(struct drxk_state *state, u16 intermediate_freqk_hz,
44 		  s32 tuner_freq_offset);
45 static int set_dvbt_standard(struct drxk_state *state,
46 			   enum operation_mode o_mode);
47 static int dvbt_start(struct drxk_state *state);
48 static int set_dvbt(struct drxk_state *state, u16 intermediate_freqk_hz,
49 		   s32 tuner_freq_offset);
50 static int get_qam_lock_status(struct drxk_state *state, u32 *p_lock_status);
51 static int get_dvbt_lock_status(struct drxk_state *state, u32 *p_lock_status);
52 static int switch_antenna_to_qam(struct drxk_state *state);
53 static int switch_antenna_to_dvbt(struct drxk_state *state);
54 
55 static bool is_dvbt(struct drxk_state *state)
56 {
57 	return state->m_operation_mode == OM_DVBT;
58 }
59 
60 static bool is_qam(struct drxk_state *state)
61 {
62 	return state->m_operation_mode == OM_QAM_ITU_A ||
63 	    state->m_operation_mode == OM_QAM_ITU_B ||
64 	    state->m_operation_mode == OM_QAM_ITU_C;
65 }
66 
67 #define NOA1ROM 0
68 
69 #define DRXDAP_FASI_SHORT_FORMAT(addr) (((addr) & 0xFC30FF80) == 0)
70 #define DRXDAP_FASI_LONG_FORMAT(addr)  (((addr) & 0xFC30FF80) != 0)
71 
72 #define DEFAULT_MER_83  165
73 #define DEFAULT_MER_93  250
74 
75 #ifndef DRXK_MPEG_SERIAL_OUTPUT_PIN_DRIVE_STRENGTH
76 #define DRXK_MPEG_SERIAL_OUTPUT_PIN_DRIVE_STRENGTH (0x02)
77 #endif
78 
79 #ifndef DRXK_MPEG_PARALLEL_OUTPUT_PIN_DRIVE_STRENGTH
80 #define DRXK_MPEG_PARALLEL_OUTPUT_PIN_DRIVE_STRENGTH (0x03)
81 #endif
82 
83 #define DEFAULT_DRXK_MPEG_LOCK_TIMEOUT 700
84 #define DEFAULT_DRXK_DEMOD_LOCK_TIMEOUT 500
85 
86 #ifndef DRXK_KI_RAGC_ATV
87 #define DRXK_KI_RAGC_ATV   4
88 #endif
89 #ifndef DRXK_KI_IAGC_ATV
90 #define DRXK_KI_IAGC_ATV   6
91 #endif
92 #ifndef DRXK_KI_DAGC_ATV
93 #define DRXK_KI_DAGC_ATV   7
94 #endif
95 
96 #ifndef DRXK_KI_RAGC_QAM
97 #define DRXK_KI_RAGC_QAM   3
98 #endif
99 #ifndef DRXK_KI_IAGC_QAM
100 #define DRXK_KI_IAGC_QAM   4
101 #endif
102 #ifndef DRXK_KI_DAGC_QAM
103 #define DRXK_KI_DAGC_QAM   7
104 #endif
105 #ifndef DRXK_KI_RAGC_DVBT
106 #define DRXK_KI_RAGC_DVBT  (IsA1WithPatchCode(state) ? 3 : 2)
107 #endif
108 #ifndef DRXK_KI_IAGC_DVBT
109 #define DRXK_KI_IAGC_DVBT  (IsA1WithPatchCode(state) ? 4 : 2)
110 #endif
111 #ifndef DRXK_KI_DAGC_DVBT
112 #define DRXK_KI_DAGC_DVBT  (IsA1WithPatchCode(state) ? 10 : 7)
113 #endif
114 
115 #ifndef DRXK_AGC_DAC_OFFSET
116 #define DRXK_AGC_DAC_OFFSET (0x800)
117 #endif
118 
119 #ifndef DRXK_BANDWIDTH_8MHZ_IN_HZ
120 #define DRXK_BANDWIDTH_8MHZ_IN_HZ  (0x8B8249L)
121 #endif
122 
123 #ifndef DRXK_BANDWIDTH_7MHZ_IN_HZ
124 #define DRXK_BANDWIDTH_7MHZ_IN_HZ  (0x7A1200L)
125 #endif
126 
127 #ifndef DRXK_BANDWIDTH_6MHZ_IN_HZ
128 #define DRXK_BANDWIDTH_6MHZ_IN_HZ  (0x68A1B6L)
129 #endif
130 
131 #ifndef DRXK_QAM_SYMBOLRATE_MAX
132 #define DRXK_QAM_SYMBOLRATE_MAX         (7233000)
133 #endif
134 
135 #define DRXK_BL_ROM_OFFSET_TAPS_DVBT    56
136 #define DRXK_BL_ROM_OFFSET_TAPS_ITU_A   64
137 #define DRXK_BL_ROM_OFFSET_TAPS_ITU_C   0x5FE0
138 #define DRXK_BL_ROM_OFFSET_TAPS_BG      24
139 #define DRXK_BL_ROM_OFFSET_TAPS_DKILLP  32
140 #define DRXK_BL_ROM_OFFSET_TAPS_NTSC    40
141 #define DRXK_BL_ROM_OFFSET_TAPS_FM      48
142 #define DRXK_BL_ROM_OFFSET_UCODE        0
143 
144 #define DRXK_BLC_TIMEOUT                100
145 
146 #define DRXK_BLCC_NR_ELEMENTS_TAPS      2
147 #define DRXK_BLCC_NR_ELEMENTS_UCODE     6
148 
149 #define DRXK_BLDC_NR_ELEMENTS_TAPS      28
150 
151 #ifndef DRXK_OFDM_NE_NOTCH_WIDTH
152 #define DRXK_OFDM_NE_NOTCH_WIDTH             (4)
153 #endif
154 
155 #define DRXK_QAM_SL_SIG_POWER_QAM16       (40960)
156 #define DRXK_QAM_SL_SIG_POWER_QAM32       (20480)
157 #define DRXK_QAM_SL_SIG_POWER_QAM64       (43008)
158 #define DRXK_QAM_SL_SIG_POWER_QAM128      (20992)
159 #define DRXK_QAM_SL_SIG_POWER_QAM256      (43520)
160 
161 static unsigned int debug;
162 module_param(debug, int, 0644);
163 MODULE_PARM_DESC(debug, "enable debug messages");
164 
165 #define dprintk(level, fmt, arg...) do {				\
166 if (debug >= level)							\
167 	printk(KERN_DEBUG KBUILD_MODNAME ": %s " fmt, __func__, ##arg);	\
168 } while (0)
169 
170 
171 static inline u32 MulDiv32(u32 a, u32 b, u32 c)
172 {
173 	u64 tmp64;
174 
175 	tmp64 = (u64) a * (u64) b;
176 	do_div(tmp64, c);
177 
178 	return (u32) tmp64;
179 }
180 
181 static inline u32 Frac28a(u32 a, u32 c)
182 {
183 	int i = 0;
184 	u32 Q1 = 0;
185 	u32 R0 = 0;
186 
187 	R0 = (a % c) << 4;	/* 32-28 == 4 shifts possible at max */
188 	Q1 = a / c;		/*
189 				 * integer part, only the 4 least significant
190 				 * bits will be visible in the result
191 				 */
192 
193 	/* division using radix 16, 7 nibbles in the result */
194 	for (i = 0; i < 7; i++) {
195 		Q1 = (Q1 << 4) | (R0 / c);
196 		R0 = (R0 % c) << 4;
197 	}
198 	/* rounding */
199 	if ((R0 >> 3) >= c)
200 		Q1++;
201 
202 	return Q1;
203 }
204 
205 static inline u32 log10times100(u32 value)
206 {
207 	return (100L * intlog10(value)) >> 24;
208 }
209 
210 /***************************************************************************/
211 /* I2C **********************************************************************/
212 /***************************************************************************/
213 
214 static int drxk_i2c_lock(struct drxk_state *state)
215 {
216 	i2c_lock_adapter(state->i2c);
217 	state->drxk_i2c_exclusive_lock = true;
218 
219 	return 0;
220 }
221 
222 static void drxk_i2c_unlock(struct drxk_state *state)
223 {
224 	if (!state->drxk_i2c_exclusive_lock)
225 		return;
226 
227 	i2c_unlock_adapter(state->i2c);
228 	state->drxk_i2c_exclusive_lock = false;
229 }
230 
231 static int drxk_i2c_transfer(struct drxk_state *state, struct i2c_msg *msgs,
232 			     unsigned len)
233 {
234 	if (state->drxk_i2c_exclusive_lock)
235 		return __i2c_transfer(state->i2c, msgs, len);
236 	else
237 		return i2c_transfer(state->i2c, msgs, len);
238 }
239 
240 static int i2c_read1(struct drxk_state *state, u8 adr, u8 *val)
241 {
242 	struct i2c_msg msgs[1] = { {.addr = adr, .flags = I2C_M_RD,
243 				    .buf = val, .len = 1}
244 	};
245 
246 	return drxk_i2c_transfer(state, msgs, 1);
247 }
248 
249 static int i2c_write(struct drxk_state *state, u8 adr, u8 *data, int len)
250 {
251 	int status;
252 	struct i2c_msg msg = {
253 	    .addr = adr, .flags = 0, .buf = data, .len = len };
254 
255 	dprintk(3, ":");
256 	if (debug > 2) {
257 		int i;
258 		for (i = 0; i < len; i++)
259 			pr_cont(" %02x", data[i]);
260 		pr_cont("\n");
261 	}
262 	status = drxk_i2c_transfer(state, &msg, 1);
263 	if (status >= 0 && status != 1)
264 		status = -EIO;
265 
266 	if (status < 0)
267 		pr_err("i2c write error at addr 0x%02x\n", adr);
268 
269 	return status;
270 }
271 
272 static int i2c_read(struct drxk_state *state,
273 		    u8 adr, u8 *msg, int len, u8 *answ, int alen)
274 {
275 	int status;
276 	struct i2c_msg msgs[2] = {
277 		{.addr = adr, .flags = 0,
278 				    .buf = msg, .len = len},
279 		{.addr = adr, .flags = I2C_M_RD,
280 		 .buf = answ, .len = alen}
281 	};
282 
283 	status = drxk_i2c_transfer(state, msgs, 2);
284 	if (status != 2) {
285 		if (debug > 2)
286 			pr_cont(": ERROR!\n");
287 		if (status >= 0)
288 			status = -EIO;
289 
290 		pr_err("i2c read error at addr 0x%02x\n", adr);
291 		return status;
292 	}
293 	if (debug > 2) {
294 		int i;
295 		dprintk(2, ": read from");
296 		for (i = 0; i < len; i++)
297 			pr_cont(" %02x", msg[i]);
298 		pr_cont(", value = ");
299 		for (i = 0; i < alen; i++)
300 			pr_cont(" %02x", answ[i]);
301 		pr_cont("\n");
302 	}
303 	return 0;
304 }
305 
306 static int read16_flags(struct drxk_state *state, u32 reg, u16 *data, u8 flags)
307 {
308 	int status;
309 	u8 adr = state->demod_address, mm1[4], mm2[2], len;
310 
311 	if (state->single_master)
312 		flags |= 0xC0;
313 
314 	if (DRXDAP_FASI_LONG_FORMAT(reg) || (flags != 0)) {
315 		mm1[0] = (((reg << 1) & 0xFF) | 0x01);
316 		mm1[1] = ((reg >> 16) & 0xFF);
317 		mm1[2] = ((reg >> 24) & 0xFF) | flags;
318 		mm1[3] = ((reg >> 7) & 0xFF);
319 		len = 4;
320 	} else {
321 		mm1[0] = ((reg << 1) & 0xFF);
322 		mm1[1] = (((reg >> 16) & 0x0F) | ((reg >> 18) & 0xF0));
323 		len = 2;
324 	}
325 	dprintk(2, "(0x%08x, 0x%02x)\n", reg, flags);
326 	status = i2c_read(state, adr, mm1, len, mm2, 2);
327 	if (status < 0)
328 		return status;
329 	if (data)
330 		*data = mm2[0] | (mm2[1] << 8);
331 
332 	return 0;
333 }
334 
335 static int read16(struct drxk_state *state, u32 reg, u16 *data)
336 {
337 	return read16_flags(state, reg, data, 0);
338 }
339 
340 static int read32_flags(struct drxk_state *state, u32 reg, u32 *data, u8 flags)
341 {
342 	int status;
343 	u8 adr = state->demod_address, mm1[4], mm2[4], len;
344 
345 	if (state->single_master)
346 		flags |= 0xC0;
347 
348 	if (DRXDAP_FASI_LONG_FORMAT(reg) || (flags != 0)) {
349 		mm1[0] = (((reg << 1) & 0xFF) | 0x01);
350 		mm1[1] = ((reg >> 16) & 0xFF);
351 		mm1[2] = ((reg >> 24) & 0xFF) | flags;
352 		mm1[3] = ((reg >> 7) & 0xFF);
353 		len = 4;
354 	} else {
355 		mm1[0] = ((reg << 1) & 0xFF);
356 		mm1[1] = (((reg >> 16) & 0x0F) | ((reg >> 18) & 0xF0));
357 		len = 2;
358 	}
359 	dprintk(2, "(0x%08x, 0x%02x)\n", reg, flags);
360 	status = i2c_read(state, adr, mm1, len, mm2, 4);
361 	if (status < 0)
362 		return status;
363 	if (data)
364 		*data = mm2[0] | (mm2[1] << 8) |
365 		    (mm2[2] << 16) | (mm2[3] << 24);
366 
367 	return 0;
368 }
369 
370 static int read32(struct drxk_state *state, u32 reg, u32 *data)
371 {
372 	return read32_flags(state, reg, data, 0);
373 }
374 
375 static int write16_flags(struct drxk_state *state, u32 reg, u16 data, u8 flags)
376 {
377 	u8 adr = state->demod_address, mm[6], len;
378 
379 	if (state->single_master)
380 		flags |= 0xC0;
381 	if (DRXDAP_FASI_LONG_FORMAT(reg) || (flags != 0)) {
382 		mm[0] = (((reg << 1) & 0xFF) | 0x01);
383 		mm[1] = ((reg >> 16) & 0xFF);
384 		mm[2] = ((reg >> 24) & 0xFF) | flags;
385 		mm[3] = ((reg >> 7) & 0xFF);
386 		len = 4;
387 	} else {
388 		mm[0] = ((reg << 1) & 0xFF);
389 		mm[1] = (((reg >> 16) & 0x0F) | ((reg >> 18) & 0xF0));
390 		len = 2;
391 	}
392 	mm[len] = data & 0xff;
393 	mm[len + 1] = (data >> 8) & 0xff;
394 
395 	dprintk(2, "(0x%08x, 0x%04x, 0x%02x)\n", reg, data, flags);
396 	return i2c_write(state, adr, mm, len + 2);
397 }
398 
399 static int write16(struct drxk_state *state, u32 reg, u16 data)
400 {
401 	return write16_flags(state, reg, data, 0);
402 }
403 
404 static int write32_flags(struct drxk_state *state, u32 reg, u32 data, u8 flags)
405 {
406 	u8 adr = state->demod_address, mm[8], len;
407 
408 	if (state->single_master)
409 		flags |= 0xC0;
410 	if (DRXDAP_FASI_LONG_FORMAT(reg) || (flags != 0)) {
411 		mm[0] = (((reg << 1) & 0xFF) | 0x01);
412 		mm[1] = ((reg >> 16) & 0xFF);
413 		mm[2] = ((reg >> 24) & 0xFF) | flags;
414 		mm[3] = ((reg >> 7) & 0xFF);
415 		len = 4;
416 	} else {
417 		mm[0] = ((reg << 1) & 0xFF);
418 		mm[1] = (((reg >> 16) & 0x0F) | ((reg >> 18) & 0xF0));
419 		len = 2;
420 	}
421 	mm[len] = data & 0xff;
422 	mm[len + 1] = (data >> 8) & 0xff;
423 	mm[len + 2] = (data >> 16) & 0xff;
424 	mm[len + 3] = (data >> 24) & 0xff;
425 	dprintk(2, "(0x%08x, 0x%08x, 0x%02x)\n", reg, data, flags);
426 
427 	return i2c_write(state, adr, mm, len + 4);
428 }
429 
430 static int write32(struct drxk_state *state, u32 reg, u32 data)
431 {
432 	return write32_flags(state, reg, data, 0);
433 }
434 
435 static int write_block(struct drxk_state *state, u32 address,
436 		      const int block_size, const u8 p_block[])
437 {
438 	int status = 0, blk_size = block_size;
439 	u8 flags = 0;
440 
441 	if (state->single_master)
442 		flags |= 0xC0;
443 
444 	while (blk_size > 0) {
445 		int chunk = blk_size > state->m_chunk_size ?
446 		    state->m_chunk_size : blk_size;
447 		u8 *adr_buf = &state->chunk[0];
448 		u32 adr_length = 0;
449 
450 		if (DRXDAP_FASI_LONG_FORMAT(address) || (flags != 0)) {
451 			adr_buf[0] = (((address << 1) & 0xFF) | 0x01);
452 			adr_buf[1] = ((address >> 16) & 0xFF);
453 			adr_buf[2] = ((address >> 24) & 0xFF);
454 			adr_buf[3] = ((address >> 7) & 0xFF);
455 			adr_buf[2] |= flags;
456 			adr_length = 4;
457 			if (chunk == state->m_chunk_size)
458 				chunk -= 2;
459 		} else {
460 			adr_buf[0] = ((address << 1) & 0xFF);
461 			adr_buf[1] = (((address >> 16) & 0x0F) |
462 				     ((address >> 18) & 0xF0));
463 			adr_length = 2;
464 		}
465 		memcpy(&state->chunk[adr_length], p_block, chunk);
466 		dprintk(2, "(0x%08x, 0x%02x)\n", address, flags);
467 		if (debug > 1) {
468 			int i;
469 			if (p_block)
470 				for (i = 0; i < chunk; i++)
471 					pr_cont(" %02x", p_block[i]);
472 			pr_cont("\n");
473 		}
474 		status = i2c_write(state, state->demod_address,
475 				   &state->chunk[0], chunk + adr_length);
476 		if (status < 0) {
477 			pr_err("%s: i2c write error at addr 0x%02x\n",
478 			       __func__, address);
479 			break;
480 		}
481 		p_block += chunk;
482 		address += (chunk >> 1);
483 		blk_size -= chunk;
484 	}
485 	return status;
486 }
487 
488 #ifndef DRXK_MAX_RETRIES_POWERUP
489 #define DRXK_MAX_RETRIES_POWERUP 20
490 #endif
491 
492 static int power_up_device(struct drxk_state *state)
493 {
494 	int status;
495 	u8 data = 0;
496 	u16 retry_count = 0;
497 
498 	dprintk(1, "\n");
499 
500 	status = i2c_read1(state, state->demod_address, &data);
501 	if (status < 0) {
502 		do {
503 			data = 0;
504 			status = i2c_write(state, state->demod_address,
505 					   &data, 1);
506 			usleep_range(10000, 11000);
507 			retry_count++;
508 			if (status < 0)
509 				continue;
510 			status = i2c_read1(state, state->demod_address,
511 					   &data);
512 		} while (status < 0 &&
513 			 (retry_count < DRXK_MAX_RETRIES_POWERUP));
514 		if (status < 0 && retry_count >= DRXK_MAX_RETRIES_POWERUP)
515 			goto error;
516 	}
517 
518 	/* Make sure all clk domains are active */
519 	status = write16(state, SIO_CC_PWD_MODE__A, SIO_CC_PWD_MODE_LEVEL_NONE);
520 	if (status < 0)
521 		goto error;
522 	status = write16(state, SIO_CC_UPDATE__A, SIO_CC_UPDATE_KEY);
523 	if (status < 0)
524 		goto error;
525 	/* Enable pll lock tests */
526 	status = write16(state, SIO_CC_PLL_LOCK__A, 1);
527 	if (status < 0)
528 		goto error;
529 
530 	state->m_current_power_mode = DRX_POWER_UP;
531 
532 error:
533 	if (status < 0)
534 		pr_err("Error %d on %s\n", status, __func__);
535 
536 	return status;
537 }
538 
539 
540 static int init_state(struct drxk_state *state)
541 {
542 	/*
543 	 * FIXME: most (all?) of the values below should be moved into
544 	 * struct drxk_config, as they are probably board-specific
545 	 */
546 	u32 ul_vsb_if_agc_mode = DRXK_AGC_CTRL_AUTO;
547 	u32 ul_vsb_if_agc_output_level = 0;
548 	u32 ul_vsb_if_agc_min_level = 0;
549 	u32 ul_vsb_if_agc_max_level = 0x7FFF;
550 	u32 ul_vsb_if_agc_speed = 3;
551 
552 	u32 ul_vsb_rf_agc_mode = DRXK_AGC_CTRL_AUTO;
553 	u32 ul_vsb_rf_agc_output_level = 0;
554 	u32 ul_vsb_rf_agc_min_level = 0;
555 	u32 ul_vsb_rf_agc_max_level = 0x7FFF;
556 	u32 ul_vsb_rf_agc_speed = 3;
557 	u32 ul_vsb_rf_agc_top = 9500;
558 	u32 ul_vsb_rf_agc_cut_off_current = 4000;
559 
560 	u32 ul_atv_if_agc_mode = DRXK_AGC_CTRL_AUTO;
561 	u32 ul_atv_if_agc_output_level = 0;
562 	u32 ul_atv_if_agc_min_level = 0;
563 	u32 ul_atv_if_agc_max_level = 0;
564 	u32 ul_atv_if_agc_speed = 3;
565 
566 	u32 ul_atv_rf_agc_mode = DRXK_AGC_CTRL_OFF;
567 	u32 ul_atv_rf_agc_output_level = 0;
568 	u32 ul_atv_rf_agc_min_level = 0;
569 	u32 ul_atv_rf_agc_max_level = 0;
570 	u32 ul_atv_rf_agc_top = 9500;
571 	u32 ul_atv_rf_agc_cut_off_current = 4000;
572 	u32 ul_atv_rf_agc_speed = 3;
573 
574 	u32 ulQual83 = DEFAULT_MER_83;
575 	u32 ulQual93 = DEFAULT_MER_93;
576 
577 	u32 ul_mpeg_lock_time_out = DEFAULT_DRXK_MPEG_LOCK_TIMEOUT;
578 	u32 ul_demod_lock_time_out = DEFAULT_DRXK_DEMOD_LOCK_TIMEOUT;
579 
580 	/* io_pad_cfg register (8 bit reg.) MSB bit is 1 (default value) */
581 	/* io_pad_cfg_mode output mode is drive always */
582 	/* io_pad_cfg_drive is set to power 2 (23 mA) */
583 	u32 ul_gpio_cfg = 0x0113;
584 	u32 ul_invert_ts_clock = 0;
585 	u32 ul_ts_data_strength = DRXK_MPEG_SERIAL_OUTPUT_PIN_DRIVE_STRENGTH;
586 	u32 ul_dvbt_bitrate = 50000000;
587 	u32 ul_dvbc_bitrate = DRXK_QAM_SYMBOLRATE_MAX * 8;
588 
589 	u32 ul_insert_rs_byte = 0;
590 
591 	u32 ul_rf_mirror = 1;
592 	u32 ul_power_down = 0;
593 
594 	dprintk(1, "\n");
595 
596 	state->m_has_lna = false;
597 	state->m_has_dvbt = false;
598 	state->m_has_dvbc = false;
599 	state->m_has_atv = false;
600 	state->m_has_oob = false;
601 	state->m_has_audio = false;
602 
603 	if (!state->m_chunk_size)
604 		state->m_chunk_size = 124;
605 
606 	state->m_osc_clock_freq = 0;
607 	state->m_smart_ant_inverted = false;
608 	state->m_b_p_down_open_bridge = false;
609 
610 	/* real system clock frequency in kHz */
611 	state->m_sys_clock_freq = 151875;
612 	/* Timing div, 250ns/Psys */
613 	/* Timing div, = (delay (nano seconds) * sysclk (kHz))/ 1000 */
614 	state->m_hi_cfg_timing_div = ((state->m_sys_clock_freq / 1000) *
615 				   HI_I2C_DELAY) / 1000;
616 	/* Clipping */
617 	if (state->m_hi_cfg_timing_div > SIO_HI_RA_RAM_PAR_2_CFG_DIV__M)
618 		state->m_hi_cfg_timing_div = SIO_HI_RA_RAM_PAR_2_CFG_DIV__M;
619 	state->m_hi_cfg_wake_up_key = (state->demod_address << 1);
620 	/* port/bridge/power down ctrl */
621 	state->m_hi_cfg_ctrl = SIO_HI_RA_RAM_PAR_5_CFG_SLV0_SLAVE;
622 
623 	state->m_b_power_down = (ul_power_down != 0);
624 
625 	state->m_drxk_a3_patch_code = false;
626 
627 	/* Init AGC and PGA parameters */
628 	/* VSB IF */
629 	state->m_vsb_if_agc_cfg.ctrl_mode = ul_vsb_if_agc_mode;
630 	state->m_vsb_if_agc_cfg.output_level = ul_vsb_if_agc_output_level;
631 	state->m_vsb_if_agc_cfg.min_output_level = ul_vsb_if_agc_min_level;
632 	state->m_vsb_if_agc_cfg.max_output_level = ul_vsb_if_agc_max_level;
633 	state->m_vsb_if_agc_cfg.speed = ul_vsb_if_agc_speed;
634 	state->m_vsb_pga_cfg = 140;
635 
636 	/* VSB RF */
637 	state->m_vsb_rf_agc_cfg.ctrl_mode = ul_vsb_rf_agc_mode;
638 	state->m_vsb_rf_agc_cfg.output_level = ul_vsb_rf_agc_output_level;
639 	state->m_vsb_rf_agc_cfg.min_output_level = ul_vsb_rf_agc_min_level;
640 	state->m_vsb_rf_agc_cfg.max_output_level = ul_vsb_rf_agc_max_level;
641 	state->m_vsb_rf_agc_cfg.speed = ul_vsb_rf_agc_speed;
642 	state->m_vsb_rf_agc_cfg.top = ul_vsb_rf_agc_top;
643 	state->m_vsb_rf_agc_cfg.cut_off_current = ul_vsb_rf_agc_cut_off_current;
644 	state->m_vsb_pre_saw_cfg.reference = 0x07;
645 	state->m_vsb_pre_saw_cfg.use_pre_saw = true;
646 
647 	state->m_Quality83percent = DEFAULT_MER_83;
648 	state->m_Quality93percent = DEFAULT_MER_93;
649 	if (ulQual93 <= 500 && ulQual83 < ulQual93) {
650 		state->m_Quality83percent = ulQual83;
651 		state->m_Quality93percent = ulQual93;
652 	}
653 
654 	/* ATV IF */
655 	state->m_atv_if_agc_cfg.ctrl_mode = ul_atv_if_agc_mode;
656 	state->m_atv_if_agc_cfg.output_level = ul_atv_if_agc_output_level;
657 	state->m_atv_if_agc_cfg.min_output_level = ul_atv_if_agc_min_level;
658 	state->m_atv_if_agc_cfg.max_output_level = ul_atv_if_agc_max_level;
659 	state->m_atv_if_agc_cfg.speed = ul_atv_if_agc_speed;
660 
661 	/* ATV RF */
662 	state->m_atv_rf_agc_cfg.ctrl_mode = ul_atv_rf_agc_mode;
663 	state->m_atv_rf_agc_cfg.output_level = ul_atv_rf_agc_output_level;
664 	state->m_atv_rf_agc_cfg.min_output_level = ul_atv_rf_agc_min_level;
665 	state->m_atv_rf_agc_cfg.max_output_level = ul_atv_rf_agc_max_level;
666 	state->m_atv_rf_agc_cfg.speed = ul_atv_rf_agc_speed;
667 	state->m_atv_rf_agc_cfg.top = ul_atv_rf_agc_top;
668 	state->m_atv_rf_agc_cfg.cut_off_current = ul_atv_rf_agc_cut_off_current;
669 	state->m_atv_pre_saw_cfg.reference = 0x04;
670 	state->m_atv_pre_saw_cfg.use_pre_saw = true;
671 
672 
673 	/* DVBT RF */
674 	state->m_dvbt_rf_agc_cfg.ctrl_mode = DRXK_AGC_CTRL_OFF;
675 	state->m_dvbt_rf_agc_cfg.output_level = 0;
676 	state->m_dvbt_rf_agc_cfg.min_output_level = 0;
677 	state->m_dvbt_rf_agc_cfg.max_output_level = 0xFFFF;
678 	state->m_dvbt_rf_agc_cfg.top = 0x2100;
679 	state->m_dvbt_rf_agc_cfg.cut_off_current = 4000;
680 	state->m_dvbt_rf_agc_cfg.speed = 1;
681 
682 
683 	/* DVBT IF */
684 	state->m_dvbt_if_agc_cfg.ctrl_mode = DRXK_AGC_CTRL_AUTO;
685 	state->m_dvbt_if_agc_cfg.output_level = 0;
686 	state->m_dvbt_if_agc_cfg.min_output_level = 0;
687 	state->m_dvbt_if_agc_cfg.max_output_level = 9000;
688 	state->m_dvbt_if_agc_cfg.top = 13424;
689 	state->m_dvbt_if_agc_cfg.cut_off_current = 0;
690 	state->m_dvbt_if_agc_cfg.speed = 3;
691 	state->m_dvbt_if_agc_cfg.fast_clip_ctrl_delay = 30;
692 	state->m_dvbt_if_agc_cfg.ingain_tgt_max = 30000;
693 	/* state->m_dvbtPgaCfg = 140; */
694 
695 	state->m_dvbt_pre_saw_cfg.reference = 4;
696 	state->m_dvbt_pre_saw_cfg.use_pre_saw = false;
697 
698 	/* QAM RF */
699 	state->m_qam_rf_agc_cfg.ctrl_mode = DRXK_AGC_CTRL_OFF;
700 	state->m_qam_rf_agc_cfg.output_level = 0;
701 	state->m_qam_rf_agc_cfg.min_output_level = 6023;
702 	state->m_qam_rf_agc_cfg.max_output_level = 27000;
703 	state->m_qam_rf_agc_cfg.top = 0x2380;
704 	state->m_qam_rf_agc_cfg.cut_off_current = 4000;
705 	state->m_qam_rf_agc_cfg.speed = 3;
706 
707 	/* QAM IF */
708 	state->m_qam_if_agc_cfg.ctrl_mode = DRXK_AGC_CTRL_AUTO;
709 	state->m_qam_if_agc_cfg.output_level = 0;
710 	state->m_qam_if_agc_cfg.min_output_level = 0;
711 	state->m_qam_if_agc_cfg.max_output_level = 9000;
712 	state->m_qam_if_agc_cfg.top = 0x0511;
713 	state->m_qam_if_agc_cfg.cut_off_current = 0;
714 	state->m_qam_if_agc_cfg.speed = 3;
715 	state->m_qam_if_agc_cfg.ingain_tgt_max = 5119;
716 	state->m_qam_if_agc_cfg.fast_clip_ctrl_delay = 50;
717 
718 	state->m_qam_pga_cfg = 140;
719 	state->m_qam_pre_saw_cfg.reference = 4;
720 	state->m_qam_pre_saw_cfg.use_pre_saw = false;
721 
722 	state->m_operation_mode = OM_NONE;
723 	state->m_drxk_state = DRXK_UNINITIALIZED;
724 
725 	/* MPEG output configuration */
726 	state->m_enable_mpeg_output = true;	/* If TRUE; enable MPEG ouput */
727 	state->m_insert_rs_byte = false;	/* If TRUE; insert RS byte */
728 	state->m_invert_data = false;	/* If TRUE; invert DATA signals */
729 	state->m_invert_err = false;	/* If TRUE; invert ERR signal */
730 	state->m_invert_str = false;	/* If TRUE; invert STR signals */
731 	state->m_invert_val = false;	/* If TRUE; invert VAL signals */
732 	state->m_invert_clk = (ul_invert_ts_clock != 0);	/* If TRUE; invert CLK signals */
733 
734 	/* If TRUE; static MPEG clockrate will be used;
735 	   otherwise clockrate will adapt to the bitrate of the TS */
736 
737 	state->m_dvbt_bitrate = ul_dvbt_bitrate;
738 	state->m_dvbc_bitrate = ul_dvbc_bitrate;
739 
740 	state->m_ts_data_strength = (ul_ts_data_strength & 0x07);
741 
742 	/* Maximum bitrate in b/s in case static clockrate is selected */
743 	state->m_mpeg_ts_static_bitrate = 19392658;
744 	state->m_disable_te_ihandling = false;
745 
746 	if (ul_insert_rs_byte)
747 		state->m_insert_rs_byte = true;
748 
749 	state->m_mpeg_lock_time_out = DEFAULT_DRXK_MPEG_LOCK_TIMEOUT;
750 	if (ul_mpeg_lock_time_out < 10000)
751 		state->m_mpeg_lock_time_out = ul_mpeg_lock_time_out;
752 	state->m_demod_lock_time_out = DEFAULT_DRXK_DEMOD_LOCK_TIMEOUT;
753 	if (ul_demod_lock_time_out < 10000)
754 		state->m_demod_lock_time_out = ul_demod_lock_time_out;
755 
756 	/* QAM defaults */
757 	state->m_constellation = DRX_CONSTELLATION_AUTO;
758 	state->m_qam_interleave_mode = DRXK_QAM_I12_J17;
759 	state->m_fec_rs_plen = 204 * 8;	/* fecRsPlen  annex A */
760 	state->m_fec_rs_prescale = 1;
761 
762 	state->m_sqi_speed = DRXK_DVBT_SQI_SPEED_MEDIUM;
763 	state->m_agcfast_clip_ctrl_delay = 0;
764 
765 	state->m_gpio_cfg = ul_gpio_cfg;
766 
767 	state->m_b_power_down = false;
768 	state->m_current_power_mode = DRX_POWER_DOWN;
769 
770 	state->m_rfmirror = (ul_rf_mirror == 0);
771 	state->m_if_agc_pol = false;
772 	return 0;
773 }
774 
775 static int drxx_open(struct drxk_state *state)
776 {
777 	int status = 0;
778 	u32 jtag = 0;
779 	u16 bid = 0;
780 	u16 key = 0;
781 
782 	dprintk(1, "\n");
783 	/* stop lock indicator process */
784 	status = write16(state, SCU_RAM_GPIO__A,
785 			 SCU_RAM_GPIO_HW_LOCK_IND_DISABLE);
786 	if (status < 0)
787 		goto error;
788 	/* Check device id */
789 	status = read16(state, SIO_TOP_COMM_KEY__A, &key);
790 	if (status < 0)
791 		goto error;
792 	status = write16(state, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY_KEY);
793 	if (status < 0)
794 		goto error;
795 	status = read32(state, SIO_TOP_JTAGID_LO__A, &jtag);
796 	if (status < 0)
797 		goto error;
798 	status = read16(state, SIO_PDR_UIO_IN_HI__A, &bid);
799 	if (status < 0)
800 		goto error;
801 	status = write16(state, SIO_TOP_COMM_KEY__A, key);
802 error:
803 	if (status < 0)
804 		pr_err("Error %d on %s\n", status, __func__);
805 	return status;
806 }
807 
808 static int get_device_capabilities(struct drxk_state *state)
809 {
810 	u16 sio_pdr_ohw_cfg = 0;
811 	u32 sio_top_jtagid_lo = 0;
812 	int status;
813 	const char *spin = "";
814 
815 	dprintk(1, "\n");
816 
817 	/* driver 0.9.0 */
818 	/* stop lock indicator process */
819 	status = write16(state, SCU_RAM_GPIO__A,
820 			 SCU_RAM_GPIO_HW_LOCK_IND_DISABLE);
821 	if (status < 0)
822 		goto error;
823 	status = write16(state, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY_KEY);
824 	if (status < 0)
825 		goto error;
826 	status = read16(state, SIO_PDR_OHW_CFG__A, &sio_pdr_ohw_cfg);
827 	if (status < 0)
828 		goto error;
829 	status = write16(state, SIO_TOP_COMM_KEY__A, 0x0000);
830 	if (status < 0)
831 		goto error;
832 
833 	switch ((sio_pdr_ohw_cfg & SIO_PDR_OHW_CFG_FREF_SEL__M)) {
834 	case 0:
835 		/* ignore (bypass ?) */
836 		break;
837 	case 1:
838 		/* 27 MHz */
839 		state->m_osc_clock_freq = 27000;
840 		break;
841 	case 2:
842 		/* 20.25 MHz */
843 		state->m_osc_clock_freq = 20250;
844 		break;
845 	case 3:
846 		/* 4 MHz */
847 		state->m_osc_clock_freq = 20250;
848 		break;
849 	default:
850 		pr_err("Clock Frequency is unknown\n");
851 		return -EINVAL;
852 	}
853 	/*
854 		Determine device capabilities
855 		Based on pinning v14
856 		*/
857 	status = read32(state, SIO_TOP_JTAGID_LO__A, &sio_top_jtagid_lo);
858 	if (status < 0)
859 		goto error;
860 
861 	pr_info("status = 0x%08x\n", sio_top_jtagid_lo);
862 
863 	/* driver 0.9.0 */
864 	switch ((sio_top_jtagid_lo >> 29) & 0xF) {
865 	case 0:
866 		state->m_device_spin = DRXK_SPIN_A1;
867 		spin = "A1";
868 		break;
869 	case 2:
870 		state->m_device_spin = DRXK_SPIN_A2;
871 		spin = "A2";
872 		break;
873 	case 3:
874 		state->m_device_spin = DRXK_SPIN_A3;
875 		spin = "A3";
876 		break;
877 	default:
878 		state->m_device_spin = DRXK_SPIN_UNKNOWN;
879 		status = -EINVAL;
880 		pr_err("Spin %d unknown\n", (sio_top_jtagid_lo >> 29) & 0xF);
881 		goto error2;
882 	}
883 	switch ((sio_top_jtagid_lo >> 12) & 0xFF) {
884 	case 0x13:
885 		/* typeId = DRX3913K_TYPE_ID */
886 		state->m_has_lna = false;
887 		state->m_has_oob = false;
888 		state->m_has_atv = false;
889 		state->m_has_audio = false;
890 		state->m_has_dvbt = true;
891 		state->m_has_dvbc = true;
892 		state->m_has_sawsw = true;
893 		state->m_has_gpio2 = false;
894 		state->m_has_gpio1 = false;
895 		state->m_has_irqn = false;
896 		break;
897 	case 0x15:
898 		/* typeId = DRX3915K_TYPE_ID */
899 		state->m_has_lna = false;
900 		state->m_has_oob = false;
901 		state->m_has_atv = true;
902 		state->m_has_audio = false;
903 		state->m_has_dvbt = true;
904 		state->m_has_dvbc = false;
905 		state->m_has_sawsw = true;
906 		state->m_has_gpio2 = true;
907 		state->m_has_gpio1 = true;
908 		state->m_has_irqn = false;
909 		break;
910 	case 0x16:
911 		/* typeId = DRX3916K_TYPE_ID */
912 		state->m_has_lna = false;
913 		state->m_has_oob = false;
914 		state->m_has_atv = true;
915 		state->m_has_audio = false;
916 		state->m_has_dvbt = true;
917 		state->m_has_dvbc = false;
918 		state->m_has_sawsw = true;
919 		state->m_has_gpio2 = true;
920 		state->m_has_gpio1 = true;
921 		state->m_has_irqn = false;
922 		break;
923 	case 0x18:
924 		/* typeId = DRX3918K_TYPE_ID */
925 		state->m_has_lna = false;
926 		state->m_has_oob = false;
927 		state->m_has_atv = true;
928 		state->m_has_audio = true;
929 		state->m_has_dvbt = true;
930 		state->m_has_dvbc = false;
931 		state->m_has_sawsw = true;
932 		state->m_has_gpio2 = true;
933 		state->m_has_gpio1 = true;
934 		state->m_has_irqn = false;
935 		break;
936 	case 0x21:
937 		/* typeId = DRX3921K_TYPE_ID */
938 		state->m_has_lna = false;
939 		state->m_has_oob = false;
940 		state->m_has_atv = true;
941 		state->m_has_audio = true;
942 		state->m_has_dvbt = true;
943 		state->m_has_dvbc = true;
944 		state->m_has_sawsw = true;
945 		state->m_has_gpio2 = true;
946 		state->m_has_gpio1 = true;
947 		state->m_has_irqn = false;
948 		break;
949 	case 0x23:
950 		/* typeId = DRX3923K_TYPE_ID */
951 		state->m_has_lna = false;
952 		state->m_has_oob = false;
953 		state->m_has_atv = true;
954 		state->m_has_audio = true;
955 		state->m_has_dvbt = true;
956 		state->m_has_dvbc = true;
957 		state->m_has_sawsw = true;
958 		state->m_has_gpio2 = true;
959 		state->m_has_gpio1 = true;
960 		state->m_has_irqn = false;
961 		break;
962 	case 0x25:
963 		/* typeId = DRX3925K_TYPE_ID */
964 		state->m_has_lna = false;
965 		state->m_has_oob = false;
966 		state->m_has_atv = true;
967 		state->m_has_audio = true;
968 		state->m_has_dvbt = true;
969 		state->m_has_dvbc = true;
970 		state->m_has_sawsw = true;
971 		state->m_has_gpio2 = true;
972 		state->m_has_gpio1 = true;
973 		state->m_has_irqn = false;
974 		break;
975 	case 0x26:
976 		/* typeId = DRX3926K_TYPE_ID */
977 		state->m_has_lna = false;
978 		state->m_has_oob = false;
979 		state->m_has_atv = true;
980 		state->m_has_audio = false;
981 		state->m_has_dvbt = true;
982 		state->m_has_dvbc = true;
983 		state->m_has_sawsw = true;
984 		state->m_has_gpio2 = true;
985 		state->m_has_gpio1 = true;
986 		state->m_has_irqn = false;
987 		break;
988 	default:
989 		pr_err("DeviceID 0x%02x not supported\n",
990 			((sio_top_jtagid_lo >> 12) & 0xFF));
991 		status = -EINVAL;
992 		goto error2;
993 	}
994 
995 	pr_info("detected a drx-39%02xk, spin %s, xtal %d.%03d MHz\n",
996 	       ((sio_top_jtagid_lo >> 12) & 0xFF), spin,
997 	       state->m_osc_clock_freq / 1000,
998 	       state->m_osc_clock_freq % 1000);
999 
1000 error:
1001 	if (status < 0)
1002 		pr_err("Error %d on %s\n", status, __func__);
1003 
1004 error2:
1005 	return status;
1006 }
1007 
1008 static int hi_command(struct drxk_state *state, u16 cmd, u16 *p_result)
1009 {
1010 	int status;
1011 	bool powerdown_cmd;
1012 
1013 	dprintk(1, "\n");
1014 
1015 	/* Write command */
1016 	status = write16(state, SIO_HI_RA_RAM_CMD__A, cmd);
1017 	if (status < 0)
1018 		goto error;
1019 	if (cmd == SIO_HI_RA_RAM_CMD_RESET)
1020 		usleep_range(1000, 2000);
1021 
1022 	powerdown_cmd =
1023 	    (bool) ((cmd == SIO_HI_RA_RAM_CMD_CONFIG) &&
1024 		    ((state->m_hi_cfg_ctrl) &
1025 		     SIO_HI_RA_RAM_PAR_5_CFG_SLEEP__M) ==
1026 		    SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ);
1027 	if (!powerdown_cmd) {
1028 		/* Wait until command rdy */
1029 		u32 retry_count = 0;
1030 		u16 wait_cmd;
1031 
1032 		do {
1033 			usleep_range(1000, 2000);
1034 			retry_count += 1;
1035 			status = read16(state, SIO_HI_RA_RAM_CMD__A,
1036 					  &wait_cmd);
1037 		} while ((status < 0) && (retry_count < DRXK_MAX_RETRIES)
1038 			 && (wait_cmd != 0));
1039 		if (status < 0)
1040 			goto error;
1041 		status = read16(state, SIO_HI_RA_RAM_RES__A, p_result);
1042 	}
1043 error:
1044 	if (status < 0)
1045 		pr_err("Error %d on %s\n", status, __func__);
1046 
1047 	return status;
1048 }
1049 
1050 static int hi_cfg_command(struct drxk_state *state)
1051 {
1052 	int status;
1053 
1054 	dprintk(1, "\n");
1055 
1056 	mutex_lock(&state->mutex);
1057 
1058 	status = write16(state, SIO_HI_RA_RAM_PAR_6__A,
1059 			 state->m_hi_cfg_timeout);
1060 	if (status < 0)
1061 		goto error;
1062 	status = write16(state, SIO_HI_RA_RAM_PAR_5__A,
1063 			 state->m_hi_cfg_ctrl);
1064 	if (status < 0)
1065 		goto error;
1066 	status = write16(state, SIO_HI_RA_RAM_PAR_4__A,
1067 			 state->m_hi_cfg_wake_up_key);
1068 	if (status < 0)
1069 		goto error;
1070 	status = write16(state, SIO_HI_RA_RAM_PAR_3__A,
1071 			 state->m_hi_cfg_bridge_delay);
1072 	if (status < 0)
1073 		goto error;
1074 	status = write16(state, SIO_HI_RA_RAM_PAR_2__A,
1075 			 state->m_hi_cfg_timing_div);
1076 	if (status < 0)
1077 		goto error;
1078 	status = write16(state, SIO_HI_RA_RAM_PAR_1__A,
1079 			 SIO_HI_RA_RAM_PAR_1_PAR1_SEC_KEY);
1080 	if (status < 0)
1081 		goto error;
1082 	status = hi_command(state, SIO_HI_RA_RAM_CMD_CONFIG, NULL);
1083 	if (status < 0)
1084 		goto error;
1085 
1086 	state->m_hi_cfg_ctrl &= ~SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ;
1087 error:
1088 	mutex_unlock(&state->mutex);
1089 	if (status < 0)
1090 		pr_err("Error %d on %s\n", status, __func__);
1091 	return status;
1092 }
1093 
1094 static int init_hi(struct drxk_state *state)
1095 {
1096 	dprintk(1, "\n");
1097 
1098 	state->m_hi_cfg_wake_up_key = (state->demod_address << 1);
1099 	state->m_hi_cfg_timeout = 0x96FF;
1100 	/* port/bridge/power down ctrl */
1101 	state->m_hi_cfg_ctrl = SIO_HI_RA_RAM_PAR_5_CFG_SLV0_SLAVE;
1102 
1103 	return hi_cfg_command(state);
1104 }
1105 
1106 static int mpegts_configure_pins(struct drxk_state *state, bool mpeg_enable)
1107 {
1108 	int status = -1;
1109 	u16 sio_pdr_mclk_cfg = 0;
1110 	u16 sio_pdr_mdx_cfg = 0;
1111 	u16 err_cfg = 0;
1112 
1113 	dprintk(1, ": mpeg %s, %s mode\n",
1114 		mpeg_enable ? "enable" : "disable",
1115 		state->m_enable_parallel ? "parallel" : "serial");
1116 
1117 	/* stop lock indicator process */
1118 	status = write16(state, SCU_RAM_GPIO__A,
1119 			 SCU_RAM_GPIO_HW_LOCK_IND_DISABLE);
1120 	if (status < 0)
1121 		goto error;
1122 
1123 	/*  MPEG TS pad configuration */
1124 	status = write16(state, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY_KEY);
1125 	if (status < 0)
1126 		goto error;
1127 
1128 	if (!mpeg_enable) {
1129 		/*  Set MPEG TS pads to inputmode */
1130 		status = write16(state, SIO_PDR_MSTRT_CFG__A, 0x0000);
1131 		if (status < 0)
1132 			goto error;
1133 		status = write16(state, SIO_PDR_MERR_CFG__A, 0x0000);
1134 		if (status < 0)
1135 			goto error;
1136 		status = write16(state, SIO_PDR_MCLK_CFG__A, 0x0000);
1137 		if (status < 0)
1138 			goto error;
1139 		status = write16(state, SIO_PDR_MVAL_CFG__A, 0x0000);
1140 		if (status < 0)
1141 			goto error;
1142 		status = write16(state, SIO_PDR_MD0_CFG__A, 0x0000);
1143 		if (status < 0)
1144 			goto error;
1145 		status = write16(state, SIO_PDR_MD1_CFG__A, 0x0000);
1146 		if (status < 0)
1147 			goto error;
1148 		status = write16(state, SIO_PDR_MD2_CFG__A, 0x0000);
1149 		if (status < 0)
1150 			goto error;
1151 		status = write16(state, SIO_PDR_MD3_CFG__A, 0x0000);
1152 		if (status < 0)
1153 			goto error;
1154 		status = write16(state, SIO_PDR_MD4_CFG__A, 0x0000);
1155 		if (status < 0)
1156 			goto error;
1157 		status = write16(state, SIO_PDR_MD5_CFG__A, 0x0000);
1158 		if (status < 0)
1159 			goto error;
1160 		status = write16(state, SIO_PDR_MD6_CFG__A, 0x0000);
1161 		if (status < 0)
1162 			goto error;
1163 		status = write16(state, SIO_PDR_MD7_CFG__A, 0x0000);
1164 		if (status < 0)
1165 			goto error;
1166 	} else {
1167 		/* Enable MPEG output */
1168 		sio_pdr_mdx_cfg =
1169 			((state->m_ts_data_strength <<
1170 			SIO_PDR_MD0_CFG_DRIVE__B) | 0x0003);
1171 		sio_pdr_mclk_cfg = ((state->m_ts_clockk_strength <<
1172 					SIO_PDR_MCLK_CFG_DRIVE__B) |
1173 					0x0003);
1174 
1175 		status = write16(state, SIO_PDR_MSTRT_CFG__A, sio_pdr_mdx_cfg);
1176 		if (status < 0)
1177 			goto error;
1178 
1179 		if (state->enable_merr_cfg)
1180 			err_cfg = sio_pdr_mdx_cfg;
1181 
1182 		status = write16(state, SIO_PDR_MERR_CFG__A, err_cfg);
1183 		if (status < 0)
1184 			goto error;
1185 		status = write16(state, SIO_PDR_MVAL_CFG__A, err_cfg);
1186 		if (status < 0)
1187 			goto error;
1188 
1189 		if (state->m_enable_parallel) {
1190 			/* parallel -> enable MD1 to MD7 */
1191 			status = write16(state, SIO_PDR_MD1_CFG__A,
1192 					 sio_pdr_mdx_cfg);
1193 			if (status < 0)
1194 				goto error;
1195 			status = write16(state, SIO_PDR_MD2_CFG__A,
1196 					 sio_pdr_mdx_cfg);
1197 			if (status < 0)
1198 				goto error;
1199 			status = write16(state, SIO_PDR_MD3_CFG__A,
1200 					 sio_pdr_mdx_cfg);
1201 			if (status < 0)
1202 				goto error;
1203 			status = write16(state, SIO_PDR_MD4_CFG__A,
1204 					 sio_pdr_mdx_cfg);
1205 			if (status < 0)
1206 				goto error;
1207 			status = write16(state, SIO_PDR_MD5_CFG__A,
1208 					 sio_pdr_mdx_cfg);
1209 			if (status < 0)
1210 				goto error;
1211 			status = write16(state, SIO_PDR_MD6_CFG__A,
1212 					 sio_pdr_mdx_cfg);
1213 			if (status < 0)
1214 				goto error;
1215 			status = write16(state, SIO_PDR_MD7_CFG__A,
1216 					 sio_pdr_mdx_cfg);
1217 			if (status < 0)
1218 				goto error;
1219 		} else {
1220 			sio_pdr_mdx_cfg = ((state->m_ts_data_strength <<
1221 						SIO_PDR_MD0_CFG_DRIVE__B)
1222 					| 0x0003);
1223 			/* serial -> disable MD1 to MD7 */
1224 			status = write16(state, SIO_PDR_MD1_CFG__A, 0x0000);
1225 			if (status < 0)
1226 				goto error;
1227 			status = write16(state, SIO_PDR_MD2_CFG__A, 0x0000);
1228 			if (status < 0)
1229 				goto error;
1230 			status = write16(state, SIO_PDR_MD3_CFG__A, 0x0000);
1231 			if (status < 0)
1232 				goto error;
1233 			status = write16(state, SIO_PDR_MD4_CFG__A, 0x0000);
1234 			if (status < 0)
1235 				goto error;
1236 			status = write16(state, SIO_PDR_MD5_CFG__A, 0x0000);
1237 			if (status < 0)
1238 				goto error;
1239 			status = write16(state, SIO_PDR_MD6_CFG__A, 0x0000);
1240 			if (status < 0)
1241 				goto error;
1242 			status = write16(state, SIO_PDR_MD7_CFG__A, 0x0000);
1243 			if (status < 0)
1244 				goto error;
1245 		}
1246 		status = write16(state, SIO_PDR_MCLK_CFG__A, sio_pdr_mclk_cfg);
1247 		if (status < 0)
1248 			goto error;
1249 		status = write16(state, SIO_PDR_MD0_CFG__A, sio_pdr_mdx_cfg);
1250 		if (status < 0)
1251 			goto error;
1252 	}
1253 	/*  Enable MB output over MPEG pads and ctl input */
1254 	status = write16(state, SIO_PDR_MON_CFG__A, 0x0000);
1255 	if (status < 0)
1256 		goto error;
1257 	/*  Write nomagic word to enable pdr reg write */
1258 	status = write16(state, SIO_TOP_COMM_KEY__A, 0x0000);
1259 error:
1260 	if (status < 0)
1261 		pr_err("Error %d on %s\n", status, __func__);
1262 	return status;
1263 }
1264 
1265 static int mpegts_disable(struct drxk_state *state)
1266 {
1267 	dprintk(1, "\n");
1268 
1269 	return mpegts_configure_pins(state, false);
1270 }
1271 
1272 static int bl_chain_cmd(struct drxk_state *state,
1273 		      u16 rom_offset, u16 nr_of_elements, u32 time_out)
1274 {
1275 	u16 bl_status = 0;
1276 	int status;
1277 	unsigned long end;
1278 
1279 	dprintk(1, "\n");
1280 	mutex_lock(&state->mutex);
1281 	status = write16(state, SIO_BL_MODE__A, SIO_BL_MODE_CHAIN);
1282 	if (status < 0)
1283 		goto error;
1284 	status = write16(state, SIO_BL_CHAIN_ADDR__A, rom_offset);
1285 	if (status < 0)
1286 		goto error;
1287 	status = write16(state, SIO_BL_CHAIN_LEN__A, nr_of_elements);
1288 	if (status < 0)
1289 		goto error;
1290 	status = write16(state, SIO_BL_ENABLE__A, SIO_BL_ENABLE_ON);
1291 	if (status < 0)
1292 		goto error;
1293 
1294 	end = jiffies + msecs_to_jiffies(time_out);
1295 	do {
1296 		usleep_range(1000, 2000);
1297 		status = read16(state, SIO_BL_STATUS__A, &bl_status);
1298 		if (status < 0)
1299 			goto error;
1300 	} while ((bl_status == 0x1) &&
1301 			((time_is_after_jiffies(end))));
1302 
1303 	if (bl_status == 0x1) {
1304 		pr_err("SIO not ready\n");
1305 		status = -EINVAL;
1306 		goto error2;
1307 	}
1308 error:
1309 	if (status < 0)
1310 		pr_err("Error %d on %s\n", status, __func__);
1311 error2:
1312 	mutex_unlock(&state->mutex);
1313 	return status;
1314 }
1315 
1316 
1317 static int download_microcode(struct drxk_state *state,
1318 			     const u8 p_mc_image[], u32 length)
1319 {
1320 	const u8 *p_src = p_mc_image;
1321 	u32 address;
1322 	u16 n_blocks;
1323 	u16 block_size;
1324 	u32 offset = 0;
1325 	u32 i;
1326 	int status = 0;
1327 
1328 	dprintk(1, "\n");
1329 
1330 	/* down the drain (we don't care about MAGIC_WORD) */
1331 #if 0
1332 	/* For future reference */
1333 	drain = (p_src[0] << 8) | p_src[1];
1334 #endif
1335 	p_src += sizeof(u16);
1336 	offset += sizeof(u16);
1337 	n_blocks = (p_src[0] << 8) | p_src[1];
1338 	p_src += sizeof(u16);
1339 	offset += sizeof(u16);
1340 
1341 	for (i = 0; i < n_blocks; i += 1) {
1342 		address = (p_src[0] << 24) | (p_src[1] << 16) |
1343 		    (p_src[2] << 8) | p_src[3];
1344 		p_src += sizeof(u32);
1345 		offset += sizeof(u32);
1346 
1347 		block_size = ((p_src[0] << 8) | p_src[1]) * sizeof(u16);
1348 		p_src += sizeof(u16);
1349 		offset += sizeof(u16);
1350 
1351 #if 0
1352 		/* For future reference */
1353 		flags = (p_src[0] << 8) | p_src[1];
1354 #endif
1355 		p_src += sizeof(u16);
1356 		offset += sizeof(u16);
1357 
1358 #if 0
1359 		/* For future reference */
1360 		block_crc = (p_src[0] << 8) | p_src[1];
1361 #endif
1362 		p_src += sizeof(u16);
1363 		offset += sizeof(u16);
1364 
1365 		if (offset + block_size > length) {
1366 			pr_err("Firmware is corrupted.\n");
1367 			return -EINVAL;
1368 		}
1369 
1370 		status = write_block(state, address, block_size, p_src);
1371 		if (status < 0) {
1372 			pr_err("Error %d while loading firmware\n", status);
1373 			break;
1374 		}
1375 		p_src += block_size;
1376 		offset += block_size;
1377 	}
1378 	return status;
1379 }
1380 
1381 static int dvbt_enable_ofdm_token_ring(struct drxk_state *state, bool enable)
1382 {
1383 	int status;
1384 	u16 data = 0;
1385 	u16 desired_ctrl = SIO_OFDM_SH_OFDM_RING_ENABLE_ON;
1386 	u16 desired_status = SIO_OFDM_SH_OFDM_RING_STATUS_ENABLED;
1387 	unsigned long end;
1388 
1389 	dprintk(1, "\n");
1390 
1391 	if (!enable) {
1392 		desired_ctrl = SIO_OFDM_SH_OFDM_RING_ENABLE_OFF;
1393 		desired_status = SIO_OFDM_SH_OFDM_RING_STATUS_DOWN;
1394 	}
1395 
1396 	status = read16(state, SIO_OFDM_SH_OFDM_RING_STATUS__A, &data);
1397 	if (status >= 0 && data == desired_status) {
1398 		/* tokenring already has correct status */
1399 		return status;
1400 	}
1401 	/* Disable/enable dvbt tokenring bridge   */
1402 	status = write16(state, SIO_OFDM_SH_OFDM_RING_ENABLE__A, desired_ctrl);
1403 
1404 	end = jiffies + msecs_to_jiffies(DRXK_OFDM_TR_SHUTDOWN_TIMEOUT);
1405 	do {
1406 		status = read16(state, SIO_OFDM_SH_OFDM_RING_STATUS__A, &data);
1407 		if ((status >= 0 && data == desired_status)
1408 		    || time_is_after_jiffies(end))
1409 			break;
1410 		usleep_range(1000, 2000);
1411 	} while (1);
1412 	if (data != desired_status) {
1413 		pr_err("SIO not ready\n");
1414 		return -EINVAL;
1415 	}
1416 	return status;
1417 }
1418 
1419 static int mpegts_stop(struct drxk_state *state)
1420 {
1421 	int status = 0;
1422 	u16 fec_oc_snc_mode = 0;
1423 	u16 fec_oc_ipr_mode = 0;
1424 
1425 	dprintk(1, "\n");
1426 
1427 	/* Graceful shutdown (byte boundaries) */
1428 	status = read16(state, FEC_OC_SNC_MODE__A, &fec_oc_snc_mode);
1429 	if (status < 0)
1430 		goto error;
1431 	fec_oc_snc_mode |= FEC_OC_SNC_MODE_SHUTDOWN__M;
1432 	status = write16(state, FEC_OC_SNC_MODE__A, fec_oc_snc_mode);
1433 	if (status < 0)
1434 		goto error;
1435 
1436 	/* Suppress MCLK during absence of data */
1437 	status = read16(state, FEC_OC_IPR_MODE__A, &fec_oc_ipr_mode);
1438 	if (status < 0)
1439 		goto error;
1440 	fec_oc_ipr_mode |= FEC_OC_IPR_MODE_MCLK_DIS_DAT_ABS__M;
1441 	status = write16(state, FEC_OC_IPR_MODE__A, fec_oc_ipr_mode);
1442 
1443 error:
1444 	if (status < 0)
1445 		pr_err("Error %d on %s\n", status, __func__);
1446 
1447 	return status;
1448 }
1449 
1450 static int scu_command(struct drxk_state *state,
1451 		       u16 cmd, u8 parameter_len,
1452 		       u16 *parameter, u8 result_len, u16 *result)
1453 {
1454 #if (SCU_RAM_PARAM_0__A - SCU_RAM_PARAM_15__A) != 15
1455 #error DRXK register mapping no longer compatible with this routine!
1456 #endif
1457 	u16 cur_cmd = 0;
1458 	int status = -EINVAL;
1459 	unsigned long end;
1460 	u8 buffer[34];
1461 	int cnt = 0, ii;
1462 	const char *p;
1463 	char errname[30];
1464 
1465 	dprintk(1, "\n");
1466 
1467 	if ((cmd == 0) || ((parameter_len > 0) && (parameter == NULL)) ||
1468 	    ((result_len > 0) && (result == NULL))) {
1469 		pr_err("Error %d on %s\n", status, __func__);
1470 		return status;
1471 	}
1472 
1473 	mutex_lock(&state->mutex);
1474 
1475 	/* assume that the command register is ready
1476 		since it is checked afterwards */
1477 	for (ii = parameter_len - 1; ii >= 0; ii -= 1) {
1478 		buffer[cnt++] = (parameter[ii] & 0xFF);
1479 		buffer[cnt++] = ((parameter[ii] >> 8) & 0xFF);
1480 	}
1481 	buffer[cnt++] = (cmd & 0xFF);
1482 	buffer[cnt++] = ((cmd >> 8) & 0xFF);
1483 
1484 	write_block(state, SCU_RAM_PARAM_0__A -
1485 			(parameter_len - 1), cnt, buffer);
1486 	/* Wait until SCU has processed command */
1487 	end = jiffies + msecs_to_jiffies(DRXK_MAX_WAITTIME);
1488 	do {
1489 		usleep_range(1000, 2000);
1490 		status = read16(state, SCU_RAM_COMMAND__A, &cur_cmd);
1491 		if (status < 0)
1492 			goto error;
1493 	} while (!(cur_cmd == DRX_SCU_READY) && (time_is_after_jiffies(end)));
1494 	if (cur_cmd != DRX_SCU_READY) {
1495 		pr_err("SCU not ready\n");
1496 		status = -EIO;
1497 		goto error2;
1498 	}
1499 	/* read results */
1500 	if ((result_len > 0) && (result != NULL)) {
1501 		s16 err;
1502 		int ii;
1503 
1504 		for (ii = result_len - 1; ii >= 0; ii -= 1) {
1505 			status = read16(state, SCU_RAM_PARAM_0__A - ii,
1506 					&result[ii]);
1507 			if (status < 0)
1508 				goto error;
1509 		}
1510 
1511 		/* Check if an error was reported by SCU */
1512 		err = (s16)result[0];
1513 		if (err >= 0)
1514 			goto error;
1515 
1516 		/* check for the known error codes */
1517 		switch (err) {
1518 		case SCU_RESULT_UNKCMD:
1519 			p = "SCU_RESULT_UNKCMD";
1520 			break;
1521 		case SCU_RESULT_UNKSTD:
1522 			p = "SCU_RESULT_UNKSTD";
1523 			break;
1524 		case SCU_RESULT_SIZE:
1525 			p = "SCU_RESULT_SIZE";
1526 			break;
1527 		case SCU_RESULT_INVPAR:
1528 			p = "SCU_RESULT_INVPAR";
1529 			break;
1530 		default: /* Other negative values are errors */
1531 			sprintf(errname, "ERROR: %d\n", err);
1532 			p = errname;
1533 		}
1534 		pr_err("%s while sending cmd 0x%04x with params:", p, cmd);
1535 		print_hex_dump_bytes("drxk: ", DUMP_PREFIX_NONE, buffer, cnt);
1536 		status = -EINVAL;
1537 		goto error2;
1538 	}
1539 
1540 error:
1541 	if (status < 0)
1542 		pr_err("Error %d on %s\n", status, __func__);
1543 error2:
1544 	mutex_unlock(&state->mutex);
1545 	return status;
1546 }
1547 
1548 static int set_iqm_af(struct drxk_state *state, bool active)
1549 {
1550 	u16 data = 0;
1551 	int status;
1552 
1553 	dprintk(1, "\n");
1554 
1555 	/* Configure IQM */
1556 	status = read16(state, IQM_AF_STDBY__A, &data);
1557 	if (status < 0)
1558 		goto error;
1559 
1560 	if (!active) {
1561 		data |= (IQM_AF_STDBY_STDBY_ADC_STANDBY
1562 				| IQM_AF_STDBY_STDBY_AMP_STANDBY
1563 				| IQM_AF_STDBY_STDBY_PD_STANDBY
1564 				| IQM_AF_STDBY_STDBY_TAGC_IF_STANDBY
1565 				| IQM_AF_STDBY_STDBY_TAGC_RF_STANDBY);
1566 	} else {
1567 		data &= ((~IQM_AF_STDBY_STDBY_ADC_STANDBY)
1568 				& (~IQM_AF_STDBY_STDBY_AMP_STANDBY)
1569 				& (~IQM_AF_STDBY_STDBY_PD_STANDBY)
1570 				& (~IQM_AF_STDBY_STDBY_TAGC_IF_STANDBY)
1571 				& (~IQM_AF_STDBY_STDBY_TAGC_RF_STANDBY)
1572 			);
1573 	}
1574 	status = write16(state, IQM_AF_STDBY__A, data);
1575 
1576 error:
1577 	if (status < 0)
1578 		pr_err("Error %d on %s\n", status, __func__);
1579 	return status;
1580 }
1581 
1582 static int ctrl_power_mode(struct drxk_state *state, enum drx_power_mode *mode)
1583 {
1584 	int status = 0;
1585 	u16 sio_cc_pwd_mode = 0;
1586 
1587 	dprintk(1, "\n");
1588 
1589 	/* Check arguments */
1590 	if (mode == NULL)
1591 		return -EINVAL;
1592 
1593 	switch (*mode) {
1594 	case DRX_POWER_UP:
1595 		sio_cc_pwd_mode = SIO_CC_PWD_MODE_LEVEL_NONE;
1596 		break;
1597 	case DRXK_POWER_DOWN_OFDM:
1598 		sio_cc_pwd_mode = SIO_CC_PWD_MODE_LEVEL_OFDM;
1599 		break;
1600 	case DRXK_POWER_DOWN_CORE:
1601 		sio_cc_pwd_mode = SIO_CC_PWD_MODE_LEVEL_CLOCK;
1602 		break;
1603 	case DRXK_POWER_DOWN_PLL:
1604 		sio_cc_pwd_mode = SIO_CC_PWD_MODE_LEVEL_PLL;
1605 		break;
1606 	case DRX_POWER_DOWN:
1607 		sio_cc_pwd_mode = SIO_CC_PWD_MODE_LEVEL_OSC;
1608 		break;
1609 	default:
1610 		/* Unknow sleep mode */
1611 		return -EINVAL;
1612 	}
1613 
1614 	/* If already in requested power mode, do nothing */
1615 	if (state->m_current_power_mode == *mode)
1616 		return 0;
1617 
1618 	/* For next steps make sure to start from DRX_POWER_UP mode */
1619 	if (state->m_current_power_mode != DRX_POWER_UP) {
1620 		status = power_up_device(state);
1621 		if (status < 0)
1622 			goto error;
1623 		status = dvbt_enable_ofdm_token_ring(state, true);
1624 		if (status < 0)
1625 			goto error;
1626 	}
1627 
1628 	if (*mode == DRX_POWER_UP) {
1629 		/* Restore analog & pin configuration */
1630 	} else {
1631 		/* Power down to requested mode */
1632 		/* Backup some register settings */
1633 		/* Set pins with possible pull-ups connected
1634 		   to them in input mode */
1635 		/* Analog power down */
1636 		/* ADC power down */
1637 		/* Power down device */
1638 		/* stop all comm_exec */
1639 		/* Stop and power down previous standard */
1640 		switch (state->m_operation_mode) {
1641 		case OM_DVBT:
1642 			status = mpegts_stop(state);
1643 			if (status < 0)
1644 				goto error;
1645 			status = power_down_dvbt(state, false);
1646 			if (status < 0)
1647 				goto error;
1648 			break;
1649 		case OM_QAM_ITU_A:
1650 		case OM_QAM_ITU_C:
1651 			status = mpegts_stop(state);
1652 			if (status < 0)
1653 				goto error;
1654 			status = power_down_qam(state);
1655 			if (status < 0)
1656 				goto error;
1657 			break;
1658 		default:
1659 			break;
1660 		}
1661 		status = dvbt_enable_ofdm_token_ring(state, false);
1662 		if (status < 0)
1663 			goto error;
1664 		status = write16(state, SIO_CC_PWD_MODE__A, sio_cc_pwd_mode);
1665 		if (status < 0)
1666 			goto error;
1667 		status = write16(state, SIO_CC_UPDATE__A, SIO_CC_UPDATE_KEY);
1668 		if (status < 0)
1669 			goto error;
1670 
1671 		if (*mode != DRXK_POWER_DOWN_OFDM) {
1672 			state->m_hi_cfg_ctrl |=
1673 				SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ;
1674 			status = hi_cfg_command(state);
1675 			if (status < 0)
1676 				goto error;
1677 		}
1678 	}
1679 	state->m_current_power_mode = *mode;
1680 
1681 error:
1682 	if (status < 0)
1683 		pr_err("Error %d on %s\n", status, __func__);
1684 
1685 	return status;
1686 }
1687 
1688 static int power_down_dvbt(struct drxk_state *state, bool set_power_mode)
1689 {
1690 	enum drx_power_mode power_mode = DRXK_POWER_DOWN_OFDM;
1691 	u16 cmd_result = 0;
1692 	u16 data = 0;
1693 	int status;
1694 
1695 	dprintk(1, "\n");
1696 
1697 	status = read16(state, SCU_COMM_EXEC__A, &data);
1698 	if (status < 0)
1699 		goto error;
1700 	if (data == SCU_COMM_EXEC_ACTIVE) {
1701 		/* Send OFDM stop command */
1702 		status = scu_command(state,
1703 				     SCU_RAM_COMMAND_STANDARD_OFDM
1704 				     | SCU_RAM_COMMAND_CMD_DEMOD_STOP,
1705 				     0, NULL, 1, &cmd_result);
1706 		if (status < 0)
1707 			goto error;
1708 		/* Send OFDM reset command */
1709 		status = scu_command(state,
1710 				     SCU_RAM_COMMAND_STANDARD_OFDM
1711 				     | SCU_RAM_COMMAND_CMD_DEMOD_RESET,
1712 				     0, NULL, 1, &cmd_result);
1713 		if (status < 0)
1714 			goto error;
1715 	}
1716 
1717 	/* Reset datapath for OFDM, processors first */
1718 	status = write16(state, OFDM_SC_COMM_EXEC__A, OFDM_SC_COMM_EXEC_STOP);
1719 	if (status < 0)
1720 		goto error;
1721 	status = write16(state, OFDM_LC_COMM_EXEC__A, OFDM_LC_COMM_EXEC_STOP);
1722 	if (status < 0)
1723 		goto error;
1724 	status = write16(state, IQM_COMM_EXEC__A, IQM_COMM_EXEC_B_STOP);
1725 	if (status < 0)
1726 		goto error;
1727 
1728 	/* powerdown AFE                   */
1729 	status = set_iqm_af(state, false);
1730 	if (status < 0)
1731 		goto error;
1732 
1733 	/* powerdown to OFDM mode          */
1734 	if (set_power_mode) {
1735 		status = ctrl_power_mode(state, &power_mode);
1736 		if (status < 0)
1737 			goto error;
1738 	}
1739 error:
1740 	if (status < 0)
1741 		pr_err("Error %d on %s\n", status, __func__);
1742 	return status;
1743 }
1744 
1745 static int setoperation_mode(struct drxk_state *state,
1746 			    enum operation_mode o_mode)
1747 {
1748 	int status = 0;
1749 
1750 	dprintk(1, "\n");
1751 	/*
1752 	   Stop and power down previous standard
1753 	   TODO investigate total power down instead of partial
1754 	   power down depending on "previous" standard.
1755 	 */
1756 
1757 	/* disable HW lock indicator */
1758 	status = write16(state, SCU_RAM_GPIO__A,
1759 			 SCU_RAM_GPIO_HW_LOCK_IND_DISABLE);
1760 	if (status < 0)
1761 		goto error;
1762 
1763 	/* Device is already at the required mode */
1764 	if (state->m_operation_mode == o_mode)
1765 		return 0;
1766 
1767 	switch (state->m_operation_mode) {
1768 		/* OM_NONE was added for start up */
1769 	case OM_NONE:
1770 		break;
1771 	case OM_DVBT:
1772 		status = mpegts_stop(state);
1773 		if (status < 0)
1774 			goto error;
1775 		status = power_down_dvbt(state, true);
1776 		if (status < 0)
1777 			goto error;
1778 		state->m_operation_mode = OM_NONE;
1779 		break;
1780 	case OM_QAM_ITU_A:	/* fallthrough */
1781 	case OM_QAM_ITU_C:
1782 		status = mpegts_stop(state);
1783 		if (status < 0)
1784 			goto error;
1785 		status = power_down_qam(state);
1786 		if (status < 0)
1787 			goto error;
1788 		state->m_operation_mode = OM_NONE;
1789 		break;
1790 	case OM_QAM_ITU_B:
1791 	default:
1792 		status = -EINVAL;
1793 		goto error;
1794 	}
1795 
1796 	/*
1797 		Power up new standard
1798 		*/
1799 	switch (o_mode) {
1800 	case OM_DVBT:
1801 		dprintk(1, ": DVB-T\n");
1802 		state->m_operation_mode = o_mode;
1803 		status = set_dvbt_standard(state, o_mode);
1804 		if (status < 0)
1805 			goto error;
1806 		break;
1807 	case OM_QAM_ITU_A:	/* fallthrough */
1808 	case OM_QAM_ITU_C:
1809 		dprintk(1, ": DVB-C Annex %c\n",
1810 			(state->m_operation_mode == OM_QAM_ITU_A) ? 'A' : 'C');
1811 		state->m_operation_mode = o_mode;
1812 		status = set_qam_standard(state, o_mode);
1813 		if (status < 0)
1814 			goto error;
1815 		break;
1816 	case OM_QAM_ITU_B:
1817 	default:
1818 		status = -EINVAL;
1819 	}
1820 error:
1821 	if (status < 0)
1822 		pr_err("Error %d on %s\n", status, __func__);
1823 	return status;
1824 }
1825 
1826 static int start(struct drxk_state *state, s32 offset_freq,
1827 		 s32 intermediate_frequency)
1828 {
1829 	int status = -EINVAL;
1830 
1831 	u16 i_freqk_hz;
1832 	s32 offsetk_hz = offset_freq / 1000;
1833 
1834 	dprintk(1, "\n");
1835 	if (state->m_drxk_state != DRXK_STOPPED &&
1836 		state->m_drxk_state != DRXK_DTV_STARTED)
1837 		goto error;
1838 
1839 	state->m_b_mirror_freq_spect = (state->props.inversion == INVERSION_ON);
1840 
1841 	if (intermediate_frequency < 0) {
1842 		state->m_b_mirror_freq_spect = !state->m_b_mirror_freq_spect;
1843 		intermediate_frequency = -intermediate_frequency;
1844 	}
1845 
1846 	switch (state->m_operation_mode) {
1847 	case OM_QAM_ITU_A:
1848 	case OM_QAM_ITU_C:
1849 		i_freqk_hz = (intermediate_frequency / 1000);
1850 		status = set_qam(state, i_freqk_hz, offsetk_hz);
1851 		if (status < 0)
1852 			goto error;
1853 		state->m_drxk_state = DRXK_DTV_STARTED;
1854 		break;
1855 	case OM_DVBT:
1856 		i_freqk_hz = (intermediate_frequency / 1000);
1857 		status = mpegts_stop(state);
1858 		if (status < 0)
1859 			goto error;
1860 		status = set_dvbt(state, i_freqk_hz, offsetk_hz);
1861 		if (status < 0)
1862 			goto error;
1863 		status = dvbt_start(state);
1864 		if (status < 0)
1865 			goto error;
1866 		state->m_drxk_state = DRXK_DTV_STARTED;
1867 		break;
1868 	default:
1869 		break;
1870 	}
1871 error:
1872 	if (status < 0)
1873 		pr_err("Error %d on %s\n", status, __func__);
1874 	return status;
1875 }
1876 
1877 static int shut_down(struct drxk_state *state)
1878 {
1879 	dprintk(1, "\n");
1880 
1881 	mpegts_stop(state);
1882 	return 0;
1883 }
1884 
1885 static int get_lock_status(struct drxk_state *state, u32 *p_lock_status)
1886 {
1887 	int status = -EINVAL;
1888 
1889 	dprintk(1, "\n");
1890 
1891 	if (p_lock_status == NULL)
1892 		goto error;
1893 
1894 	*p_lock_status = NOT_LOCKED;
1895 
1896 	/* define the SCU command code */
1897 	switch (state->m_operation_mode) {
1898 	case OM_QAM_ITU_A:
1899 	case OM_QAM_ITU_B:
1900 	case OM_QAM_ITU_C:
1901 		status = get_qam_lock_status(state, p_lock_status);
1902 		break;
1903 	case OM_DVBT:
1904 		status = get_dvbt_lock_status(state, p_lock_status);
1905 		break;
1906 	default:
1907 		pr_debug("Unsupported operation mode %d in %s\n",
1908 			state->m_operation_mode, __func__);
1909 		return 0;
1910 	}
1911 error:
1912 	if (status < 0)
1913 		pr_err("Error %d on %s\n", status, __func__);
1914 	return status;
1915 }
1916 
1917 static int mpegts_start(struct drxk_state *state)
1918 {
1919 	int status;
1920 
1921 	u16 fec_oc_snc_mode = 0;
1922 
1923 	/* Allow OC to sync again */
1924 	status = read16(state, FEC_OC_SNC_MODE__A, &fec_oc_snc_mode);
1925 	if (status < 0)
1926 		goto error;
1927 	fec_oc_snc_mode &= ~FEC_OC_SNC_MODE_SHUTDOWN__M;
1928 	status = write16(state, FEC_OC_SNC_MODE__A, fec_oc_snc_mode);
1929 	if (status < 0)
1930 		goto error;
1931 	status = write16(state, FEC_OC_SNC_UNLOCK__A, 1);
1932 error:
1933 	if (status < 0)
1934 		pr_err("Error %d on %s\n", status, __func__);
1935 	return status;
1936 }
1937 
1938 static int mpegts_dto_init(struct drxk_state *state)
1939 {
1940 	int status;
1941 
1942 	dprintk(1, "\n");
1943 
1944 	/* Rate integration settings */
1945 	status = write16(state, FEC_OC_RCN_CTL_STEP_LO__A, 0x0000);
1946 	if (status < 0)
1947 		goto error;
1948 	status = write16(state, FEC_OC_RCN_CTL_STEP_HI__A, 0x000C);
1949 	if (status < 0)
1950 		goto error;
1951 	status = write16(state, FEC_OC_RCN_GAIN__A, 0x000A);
1952 	if (status < 0)
1953 		goto error;
1954 	status = write16(state, FEC_OC_AVR_PARM_A__A, 0x0008);
1955 	if (status < 0)
1956 		goto error;
1957 	status = write16(state, FEC_OC_AVR_PARM_B__A, 0x0006);
1958 	if (status < 0)
1959 		goto error;
1960 	status = write16(state, FEC_OC_TMD_HI_MARGIN__A, 0x0680);
1961 	if (status < 0)
1962 		goto error;
1963 	status = write16(state, FEC_OC_TMD_LO_MARGIN__A, 0x0080);
1964 	if (status < 0)
1965 		goto error;
1966 	status = write16(state, FEC_OC_TMD_COUNT__A, 0x03F4);
1967 	if (status < 0)
1968 		goto error;
1969 
1970 	/* Additional configuration */
1971 	status = write16(state, FEC_OC_OCR_INVERT__A, 0);
1972 	if (status < 0)
1973 		goto error;
1974 	status = write16(state, FEC_OC_SNC_LWM__A, 2);
1975 	if (status < 0)
1976 		goto error;
1977 	status = write16(state, FEC_OC_SNC_HWM__A, 12);
1978 error:
1979 	if (status < 0)
1980 		pr_err("Error %d on %s\n", status, __func__);
1981 
1982 	return status;
1983 }
1984 
1985 static int mpegts_dto_setup(struct drxk_state *state,
1986 			  enum operation_mode o_mode)
1987 {
1988 	int status;
1989 
1990 	u16 fec_oc_reg_mode = 0;	/* FEC_OC_MODE       register value */
1991 	u16 fec_oc_reg_ipr_mode = 0;	/* FEC_OC_IPR_MODE   register value */
1992 	u16 fec_oc_dto_mode = 0;	/* FEC_OC_IPR_INVERT register value */
1993 	u16 fec_oc_fct_mode = 0;	/* FEC_OC_IPR_INVERT register value */
1994 	u16 fec_oc_dto_period = 2;	/* FEC_OC_IPR_INVERT register value */
1995 	u16 fec_oc_dto_burst_len = 188;	/* FEC_OC_IPR_INVERT register value */
1996 	u32 fec_oc_rcn_ctl_rate = 0;	/* FEC_OC_IPR_INVERT register value */
1997 	u16 fec_oc_tmd_mode = 0;
1998 	u16 fec_oc_tmd_int_upd_rate = 0;
1999 	u32 max_bit_rate = 0;
2000 	bool static_clk = false;
2001 
2002 	dprintk(1, "\n");
2003 
2004 	/* Check insertion of the Reed-Solomon parity bytes */
2005 	status = read16(state, FEC_OC_MODE__A, &fec_oc_reg_mode);
2006 	if (status < 0)
2007 		goto error;
2008 	status = read16(state, FEC_OC_IPR_MODE__A, &fec_oc_reg_ipr_mode);
2009 	if (status < 0)
2010 		goto error;
2011 	fec_oc_reg_mode &= (~FEC_OC_MODE_PARITY__M);
2012 	fec_oc_reg_ipr_mode &= (~FEC_OC_IPR_MODE_MVAL_DIS_PAR__M);
2013 	if (state->m_insert_rs_byte) {
2014 		/* enable parity symbol forward */
2015 		fec_oc_reg_mode |= FEC_OC_MODE_PARITY__M;
2016 		/* MVAL disable during parity bytes */
2017 		fec_oc_reg_ipr_mode |= FEC_OC_IPR_MODE_MVAL_DIS_PAR__M;
2018 		/* TS burst length to 204 */
2019 		fec_oc_dto_burst_len = 204;
2020 	}
2021 
2022 	/* Check serial or parallel output */
2023 	fec_oc_reg_ipr_mode &= (~(FEC_OC_IPR_MODE_SERIAL__M));
2024 	if (!state->m_enable_parallel) {
2025 		/* MPEG data output is serial -> set ipr_mode[0] */
2026 		fec_oc_reg_ipr_mode |= FEC_OC_IPR_MODE_SERIAL__M;
2027 	}
2028 
2029 	switch (o_mode) {
2030 	case OM_DVBT:
2031 		max_bit_rate = state->m_dvbt_bitrate;
2032 		fec_oc_tmd_mode = 3;
2033 		fec_oc_rcn_ctl_rate = 0xC00000;
2034 		static_clk = state->m_dvbt_static_clk;
2035 		break;
2036 	case OM_QAM_ITU_A:	/* fallthrough */
2037 	case OM_QAM_ITU_C:
2038 		fec_oc_tmd_mode = 0x0004;
2039 		fec_oc_rcn_ctl_rate = 0xD2B4EE;	/* good for >63 Mb/s */
2040 		max_bit_rate = state->m_dvbc_bitrate;
2041 		static_clk = state->m_dvbc_static_clk;
2042 		break;
2043 	default:
2044 		status = -EINVAL;
2045 	}		/* switch (standard) */
2046 	if (status < 0)
2047 		goto error;
2048 
2049 	/* Configure DTO's */
2050 	if (static_clk) {
2051 		u32 bit_rate = 0;
2052 
2053 		/* Rational DTO for MCLK source (static MCLK rate),
2054 			Dynamic DTO for optimal grouping
2055 			(avoid intra-packet gaps),
2056 			DTO offset enable to sync TS burst with MSTRT */
2057 		fec_oc_dto_mode = (FEC_OC_DTO_MODE_DYNAMIC__M |
2058 				FEC_OC_DTO_MODE_OFFSET_ENABLE__M);
2059 		fec_oc_fct_mode = (FEC_OC_FCT_MODE_RAT_ENA__M |
2060 				FEC_OC_FCT_MODE_VIRT_ENA__M);
2061 
2062 		/* Check user defined bitrate */
2063 		bit_rate = max_bit_rate;
2064 		if (bit_rate > 75900000UL) {	/* max is 75.9 Mb/s */
2065 			bit_rate = 75900000UL;
2066 		}
2067 		/* Rational DTO period:
2068 			dto_period = (Fsys / bitrate) - 2
2069 
2070 			result should be floored,
2071 			to make sure >= requested bitrate
2072 			*/
2073 		fec_oc_dto_period = (u16) (((state->m_sys_clock_freq)
2074 						* 1000) / bit_rate);
2075 		if (fec_oc_dto_period <= 2)
2076 			fec_oc_dto_period = 0;
2077 		else
2078 			fec_oc_dto_period -= 2;
2079 		fec_oc_tmd_int_upd_rate = 8;
2080 	} else {
2081 		/* (commonAttr->static_clk == false) => dynamic mode */
2082 		fec_oc_dto_mode = FEC_OC_DTO_MODE_DYNAMIC__M;
2083 		fec_oc_fct_mode = FEC_OC_FCT_MODE__PRE;
2084 		fec_oc_tmd_int_upd_rate = 5;
2085 	}
2086 
2087 	/* Write appropriate registers with requested configuration */
2088 	status = write16(state, FEC_OC_DTO_BURST_LEN__A, fec_oc_dto_burst_len);
2089 	if (status < 0)
2090 		goto error;
2091 	status = write16(state, FEC_OC_DTO_PERIOD__A, fec_oc_dto_period);
2092 	if (status < 0)
2093 		goto error;
2094 	status = write16(state, FEC_OC_DTO_MODE__A, fec_oc_dto_mode);
2095 	if (status < 0)
2096 		goto error;
2097 	status = write16(state, FEC_OC_FCT_MODE__A, fec_oc_fct_mode);
2098 	if (status < 0)
2099 		goto error;
2100 	status = write16(state, FEC_OC_MODE__A, fec_oc_reg_mode);
2101 	if (status < 0)
2102 		goto error;
2103 	status = write16(state, FEC_OC_IPR_MODE__A, fec_oc_reg_ipr_mode);
2104 	if (status < 0)
2105 		goto error;
2106 
2107 	/* Rate integration settings */
2108 	status = write32(state, FEC_OC_RCN_CTL_RATE_LO__A, fec_oc_rcn_ctl_rate);
2109 	if (status < 0)
2110 		goto error;
2111 	status = write16(state, FEC_OC_TMD_INT_UPD_RATE__A,
2112 			 fec_oc_tmd_int_upd_rate);
2113 	if (status < 0)
2114 		goto error;
2115 	status = write16(state, FEC_OC_TMD_MODE__A, fec_oc_tmd_mode);
2116 error:
2117 	if (status < 0)
2118 		pr_err("Error %d on %s\n", status, __func__);
2119 	return status;
2120 }
2121 
2122 static int mpegts_configure_polarity(struct drxk_state *state)
2123 {
2124 	u16 fec_oc_reg_ipr_invert = 0;
2125 
2126 	/* Data mask for the output data byte */
2127 	u16 invert_data_mask =
2128 	    FEC_OC_IPR_INVERT_MD7__M | FEC_OC_IPR_INVERT_MD6__M |
2129 	    FEC_OC_IPR_INVERT_MD5__M | FEC_OC_IPR_INVERT_MD4__M |
2130 	    FEC_OC_IPR_INVERT_MD3__M | FEC_OC_IPR_INVERT_MD2__M |
2131 	    FEC_OC_IPR_INVERT_MD1__M | FEC_OC_IPR_INVERT_MD0__M;
2132 
2133 	dprintk(1, "\n");
2134 
2135 	/* Control selective inversion of output bits */
2136 	fec_oc_reg_ipr_invert &= (~(invert_data_mask));
2137 	if (state->m_invert_data)
2138 		fec_oc_reg_ipr_invert |= invert_data_mask;
2139 	fec_oc_reg_ipr_invert &= (~(FEC_OC_IPR_INVERT_MERR__M));
2140 	if (state->m_invert_err)
2141 		fec_oc_reg_ipr_invert |= FEC_OC_IPR_INVERT_MERR__M;
2142 	fec_oc_reg_ipr_invert &= (~(FEC_OC_IPR_INVERT_MSTRT__M));
2143 	if (state->m_invert_str)
2144 		fec_oc_reg_ipr_invert |= FEC_OC_IPR_INVERT_MSTRT__M;
2145 	fec_oc_reg_ipr_invert &= (~(FEC_OC_IPR_INVERT_MVAL__M));
2146 	if (state->m_invert_val)
2147 		fec_oc_reg_ipr_invert |= FEC_OC_IPR_INVERT_MVAL__M;
2148 	fec_oc_reg_ipr_invert &= (~(FEC_OC_IPR_INVERT_MCLK__M));
2149 	if (state->m_invert_clk)
2150 		fec_oc_reg_ipr_invert |= FEC_OC_IPR_INVERT_MCLK__M;
2151 
2152 	return write16(state, FEC_OC_IPR_INVERT__A, fec_oc_reg_ipr_invert);
2153 }
2154 
2155 #define   SCU_RAM_AGC_KI_INV_RF_POL__M 0x4000
2156 
2157 static int set_agc_rf(struct drxk_state *state,
2158 		    struct s_cfg_agc *p_agc_cfg, bool is_dtv)
2159 {
2160 	int status = -EINVAL;
2161 	u16 data = 0;
2162 	struct s_cfg_agc *p_if_agc_settings;
2163 
2164 	dprintk(1, "\n");
2165 
2166 	if (p_agc_cfg == NULL)
2167 		goto error;
2168 
2169 	switch (p_agc_cfg->ctrl_mode) {
2170 	case DRXK_AGC_CTRL_AUTO:
2171 		/* Enable RF AGC DAC */
2172 		status = read16(state, IQM_AF_STDBY__A, &data);
2173 		if (status < 0)
2174 			goto error;
2175 		data &= ~IQM_AF_STDBY_STDBY_TAGC_RF_STANDBY;
2176 		status = write16(state, IQM_AF_STDBY__A, data);
2177 		if (status < 0)
2178 			goto error;
2179 		status = read16(state, SCU_RAM_AGC_CONFIG__A, &data);
2180 		if (status < 0)
2181 			goto error;
2182 
2183 		/* Enable SCU RF AGC loop */
2184 		data &= ~SCU_RAM_AGC_CONFIG_DISABLE_RF_AGC__M;
2185 
2186 		/* Polarity */
2187 		if (state->m_rf_agc_pol)
2188 			data |= SCU_RAM_AGC_CONFIG_INV_RF_POL__M;
2189 		else
2190 			data &= ~SCU_RAM_AGC_CONFIG_INV_RF_POL__M;
2191 		status = write16(state, SCU_RAM_AGC_CONFIG__A, data);
2192 		if (status < 0)
2193 			goto error;
2194 
2195 		/* Set speed (using complementary reduction value) */
2196 		status = read16(state, SCU_RAM_AGC_KI_RED__A, &data);
2197 		if (status < 0)
2198 			goto error;
2199 
2200 		data &= ~SCU_RAM_AGC_KI_RED_RAGC_RED__M;
2201 		data |= (~(p_agc_cfg->speed <<
2202 				SCU_RAM_AGC_KI_RED_RAGC_RED__B)
2203 				& SCU_RAM_AGC_KI_RED_RAGC_RED__M);
2204 
2205 		status = write16(state, SCU_RAM_AGC_KI_RED__A, data);
2206 		if (status < 0)
2207 			goto error;
2208 
2209 		if (is_dvbt(state))
2210 			p_if_agc_settings = &state->m_dvbt_if_agc_cfg;
2211 		else if (is_qam(state))
2212 			p_if_agc_settings = &state->m_qam_if_agc_cfg;
2213 		else
2214 			p_if_agc_settings = &state->m_atv_if_agc_cfg;
2215 		if (p_if_agc_settings == NULL) {
2216 			status = -EINVAL;
2217 			goto error;
2218 		}
2219 
2220 		/* Set TOP, only if IF-AGC is in AUTO mode */
2221 		if (p_if_agc_settings->ctrl_mode == DRXK_AGC_CTRL_AUTO) {
2222 			status = write16(state,
2223 					 SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A,
2224 					 p_agc_cfg->top);
2225 			if (status < 0)
2226 				goto error;
2227 		}
2228 
2229 		/* Cut-Off current */
2230 		status = write16(state, SCU_RAM_AGC_RF_IACCU_HI_CO__A,
2231 				 p_agc_cfg->cut_off_current);
2232 		if (status < 0)
2233 			goto error;
2234 
2235 		/* Max. output level */
2236 		status = write16(state, SCU_RAM_AGC_RF_MAX__A,
2237 				 p_agc_cfg->max_output_level);
2238 		if (status < 0)
2239 			goto error;
2240 
2241 		break;
2242 
2243 	case DRXK_AGC_CTRL_USER:
2244 		/* Enable RF AGC DAC */
2245 		status = read16(state, IQM_AF_STDBY__A, &data);
2246 		if (status < 0)
2247 			goto error;
2248 		data &= ~IQM_AF_STDBY_STDBY_TAGC_RF_STANDBY;
2249 		status = write16(state, IQM_AF_STDBY__A, data);
2250 		if (status < 0)
2251 			goto error;
2252 
2253 		/* Disable SCU RF AGC loop */
2254 		status = read16(state, SCU_RAM_AGC_CONFIG__A, &data);
2255 		if (status < 0)
2256 			goto error;
2257 		data |= SCU_RAM_AGC_CONFIG_DISABLE_RF_AGC__M;
2258 		if (state->m_rf_agc_pol)
2259 			data |= SCU_RAM_AGC_CONFIG_INV_RF_POL__M;
2260 		else
2261 			data &= ~SCU_RAM_AGC_CONFIG_INV_RF_POL__M;
2262 		status = write16(state, SCU_RAM_AGC_CONFIG__A, data);
2263 		if (status < 0)
2264 			goto error;
2265 
2266 		/* SCU c.o.c. to 0, enabling full control range */
2267 		status = write16(state, SCU_RAM_AGC_RF_IACCU_HI_CO__A, 0);
2268 		if (status < 0)
2269 			goto error;
2270 
2271 		/* Write value to output pin */
2272 		status = write16(state, SCU_RAM_AGC_RF_IACCU_HI__A,
2273 				 p_agc_cfg->output_level);
2274 		if (status < 0)
2275 			goto error;
2276 		break;
2277 
2278 	case DRXK_AGC_CTRL_OFF:
2279 		/* Disable RF AGC DAC */
2280 		status = read16(state, IQM_AF_STDBY__A, &data);
2281 		if (status < 0)
2282 			goto error;
2283 		data |= IQM_AF_STDBY_STDBY_TAGC_RF_STANDBY;
2284 		status = write16(state, IQM_AF_STDBY__A, data);
2285 		if (status < 0)
2286 			goto error;
2287 
2288 		/* Disable SCU RF AGC loop */
2289 		status = read16(state, SCU_RAM_AGC_CONFIG__A, &data);
2290 		if (status < 0)
2291 			goto error;
2292 		data |= SCU_RAM_AGC_CONFIG_DISABLE_RF_AGC__M;
2293 		status = write16(state, SCU_RAM_AGC_CONFIG__A, data);
2294 		if (status < 0)
2295 			goto error;
2296 		break;
2297 
2298 	default:
2299 		status = -EINVAL;
2300 
2301 	}
2302 error:
2303 	if (status < 0)
2304 		pr_err("Error %d on %s\n", status, __func__);
2305 	return status;
2306 }
2307 
2308 #define SCU_RAM_AGC_KI_INV_IF_POL__M 0x2000
2309 
2310 static int set_agc_if(struct drxk_state *state,
2311 		    struct s_cfg_agc *p_agc_cfg, bool is_dtv)
2312 {
2313 	u16 data = 0;
2314 	int status = 0;
2315 	struct s_cfg_agc *p_rf_agc_settings;
2316 
2317 	dprintk(1, "\n");
2318 
2319 	switch (p_agc_cfg->ctrl_mode) {
2320 	case DRXK_AGC_CTRL_AUTO:
2321 
2322 		/* Enable IF AGC DAC */
2323 		status = read16(state, IQM_AF_STDBY__A, &data);
2324 		if (status < 0)
2325 			goto error;
2326 		data &= ~IQM_AF_STDBY_STDBY_TAGC_IF_STANDBY;
2327 		status = write16(state, IQM_AF_STDBY__A, data);
2328 		if (status < 0)
2329 			goto error;
2330 
2331 		status = read16(state, SCU_RAM_AGC_CONFIG__A, &data);
2332 		if (status < 0)
2333 			goto error;
2334 
2335 		/* Enable SCU IF AGC loop */
2336 		data &= ~SCU_RAM_AGC_CONFIG_DISABLE_IF_AGC__M;
2337 
2338 		/* Polarity */
2339 		if (state->m_if_agc_pol)
2340 			data |= SCU_RAM_AGC_CONFIG_INV_IF_POL__M;
2341 		else
2342 			data &= ~SCU_RAM_AGC_CONFIG_INV_IF_POL__M;
2343 		status = write16(state, SCU_RAM_AGC_CONFIG__A, data);
2344 		if (status < 0)
2345 			goto error;
2346 
2347 		/* Set speed (using complementary reduction value) */
2348 		status = read16(state, SCU_RAM_AGC_KI_RED__A, &data);
2349 		if (status < 0)
2350 			goto error;
2351 		data &= ~SCU_RAM_AGC_KI_RED_IAGC_RED__M;
2352 		data |= (~(p_agc_cfg->speed <<
2353 				SCU_RAM_AGC_KI_RED_IAGC_RED__B)
2354 				& SCU_RAM_AGC_KI_RED_IAGC_RED__M);
2355 
2356 		status = write16(state, SCU_RAM_AGC_KI_RED__A, data);
2357 		if (status < 0)
2358 			goto error;
2359 
2360 		if (is_qam(state))
2361 			p_rf_agc_settings = &state->m_qam_rf_agc_cfg;
2362 		else
2363 			p_rf_agc_settings = &state->m_atv_rf_agc_cfg;
2364 		if (p_rf_agc_settings == NULL)
2365 			return -1;
2366 		/* Restore TOP */
2367 		status = write16(state, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A,
2368 				 p_rf_agc_settings->top);
2369 		if (status < 0)
2370 			goto error;
2371 		break;
2372 
2373 	case DRXK_AGC_CTRL_USER:
2374 
2375 		/* Enable IF AGC DAC */
2376 		status = read16(state, IQM_AF_STDBY__A, &data);
2377 		if (status < 0)
2378 			goto error;
2379 		data &= ~IQM_AF_STDBY_STDBY_TAGC_IF_STANDBY;
2380 		status = write16(state, IQM_AF_STDBY__A, data);
2381 		if (status < 0)
2382 			goto error;
2383 
2384 		status = read16(state, SCU_RAM_AGC_CONFIG__A, &data);
2385 		if (status < 0)
2386 			goto error;
2387 
2388 		/* Disable SCU IF AGC loop */
2389 		data |= SCU_RAM_AGC_CONFIG_DISABLE_IF_AGC__M;
2390 
2391 		/* Polarity */
2392 		if (state->m_if_agc_pol)
2393 			data |= SCU_RAM_AGC_CONFIG_INV_IF_POL__M;
2394 		else
2395 			data &= ~SCU_RAM_AGC_CONFIG_INV_IF_POL__M;
2396 		status = write16(state, SCU_RAM_AGC_CONFIG__A, data);
2397 		if (status < 0)
2398 			goto error;
2399 
2400 		/* Write value to output pin */
2401 		status = write16(state, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A,
2402 				 p_agc_cfg->output_level);
2403 		if (status < 0)
2404 			goto error;
2405 		break;
2406 
2407 	case DRXK_AGC_CTRL_OFF:
2408 
2409 		/* Disable If AGC DAC */
2410 		status = read16(state, IQM_AF_STDBY__A, &data);
2411 		if (status < 0)
2412 			goto error;
2413 		data |= IQM_AF_STDBY_STDBY_TAGC_IF_STANDBY;
2414 		status = write16(state, IQM_AF_STDBY__A, data);
2415 		if (status < 0)
2416 			goto error;
2417 
2418 		/* Disable SCU IF AGC loop */
2419 		status = read16(state, SCU_RAM_AGC_CONFIG__A, &data);
2420 		if (status < 0)
2421 			goto error;
2422 		data |= SCU_RAM_AGC_CONFIG_DISABLE_IF_AGC__M;
2423 		status = write16(state, SCU_RAM_AGC_CONFIG__A, data);
2424 		if (status < 0)
2425 			goto error;
2426 		break;
2427 	}		/* switch (agcSettingsIf->ctrl_mode) */
2428 
2429 	/* always set the top to support
2430 		configurations without if-loop */
2431 	status = write16(state, SCU_RAM_AGC_INGAIN_TGT_MIN__A, p_agc_cfg->top);
2432 error:
2433 	if (status < 0)
2434 		pr_err("Error %d on %s\n", status, __func__);
2435 	return status;
2436 }
2437 
2438 static int get_qam_signal_to_noise(struct drxk_state *state,
2439 			       s32 *p_signal_to_noise)
2440 {
2441 	int status = 0;
2442 	u16 qam_sl_err_power = 0;	/* accum. error between
2443 					raw and sliced symbols */
2444 	u32 qam_sl_sig_power = 0;	/* used for MER, depends of
2445 					QAM modulation */
2446 	u32 qam_sl_mer = 0;	/* QAM MER */
2447 
2448 	dprintk(1, "\n");
2449 
2450 	/* MER calculation */
2451 
2452 	/* get the register value needed for MER */
2453 	status = read16(state, QAM_SL_ERR_POWER__A, &qam_sl_err_power);
2454 	if (status < 0) {
2455 		pr_err("Error %d on %s\n", status, __func__);
2456 		return -EINVAL;
2457 	}
2458 
2459 	switch (state->props.modulation) {
2460 	case QAM_16:
2461 		qam_sl_sig_power = DRXK_QAM_SL_SIG_POWER_QAM16 << 2;
2462 		break;
2463 	case QAM_32:
2464 		qam_sl_sig_power = DRXK_QAM_SL_SIG_POWER_QAM32 << 2;
2465 		break;
2466 	case QAM_64:
2467 		qam_sl_sig_power = DRXK_QAM_SL_SIG_POWER_QAM64 << 2;
2468 		break;
2469 	case QAM_128:
2470 		qam_sl_sig_power = DRXK_QAM_SL_SIG_POWER_QAM128 << 2;
2471 		break;
2472 	default:
2473 	case QAM_256:
2474 		qam_sl_sig_power = DRXK_QAM_SL_SIG_POWER_QAM256 << 2;
2475 		break;
2476 	}
2477 
2478 	if (qam_sl_err_power > 0) {
2479 		qam_sl_mer = log10times100(qam_sl_sig_power) -
2480 			log10times100((u32) qam_sl_err_power);
2481 	}
2482 	*p_signal_to_noise = qam_sl_mer;
2483 
2484 	return status;
2485 }
2486 
2487 static int get_dvbt_signal_to_noise(struct drxk_state *state,
2488 				s32 *p_signal_to_noise)
2489 {
2490 	int status;
2491 	u16 reg_data = 0;
2492 	u32 eq_reg_td_sqr_err_i = 0;
2493 	u32 eq_reg_td_sqr_err_q = 0;
2494 	u16 eq_reg_td_sqr_err_exp = 0;
2495 	u16 eq_reg_td_tps_pwr_ofs = 0;
2496 	u16 eq_reg_td_req_smb_cnt = 0;
2497 	u32 tps_cnt = 0;
2498 	u32 sqr_err_iq = 0;
2499 	u32 a = 0;
2500 	u32 b = 0;
2501 	u32 c = 0;
2502 	u32 i_mer = 0;
2503 	u16 transmission_params = 0;
2504 
2505 	dprintk(1, "\n");
2506 
2507 	status = read16(state, OFDM_EQ_TOP_TD_TPS_PWR_OFS__A,
2508 			&eq_reg_td_tps_pwr_ofs);
2509 	if (status < 0)
2510 		goto error;
2511 	status = read16(state, OFDM_EQ_TOP_TD_REQ_SMB_CNT__A,
2512 			&eq_reg_td_req_smb_cnt);
2513 	if (status < 0)
2514 		goto error;
2515 	status = read16(state, OFDM_EQ_TOP_TD_SQR_ERR_EXP__A,
2516 			&eq_reg_td_sqr_err_exp);
2517 	if (status < 0)
2518 		goto error;
2519 	status = read16(state, OFDM_EQ_TOP_TD_SQR_ERR_I__A,
2520 			&reg_data);
2521 	if (status < 0)
2522 		goto error;
2523 	/* Extend SQR_ERR_I operational range */
2524 	eq_reg_td_sqr_err_i = (u32) reg_data;
2525 	if ((eq_reg_td_sqr_err_exp > 11) &&
2526 		(eq_reg_td_sqr_err_i < 0x00000FFFUL)) {
2527 		eq_reg_td_sqr_err_i += 0x00010000UL;
2528 	}
2529 	status = read16(state, OFDM_EQ_TOP_TD_SQR_ERR_Q__A, &reg_data);
2530 	if (status < 0)
2531 		goto error;
2532 	/* Extend SQR_ERR_Q operational range */
2533 	eq_reg_td_sqr_err_q = (u32) reg_data;
2534 	if ((eq_reg_td_sqr_err_exp > 11) &&
2535 		(eq_reg_td_sqr_err_q < 0x00000FFFUL))
2536 		eq_reg_td_sqr_err_q += 0x00010000UL;
2537 
2538 	status = read16(state, OFDM_SC_RA_RAM_OP_PARAM__A,
2539 			&transmission_params);
2540 	if (status < 0)
2541 		goto error;
2542 
2543 	/* Check input data for MER */
2544 
2545 	/* MER calculation (in 0.1 dB) without math.h */
2546 	if ((eq_reg_td_tps_pwr_ofs == 0) || (eq_reg_td_req_smb_cnt == 0))
2547 		i_mer = 0;
2548 	else if ((eq_reg_td_sqr_err_i + eq_reg_td_sqr_err_q) == 0) {
2549 		/* No error at all, this must be the HW reset value
2550 			* Apparently no first measurement yet
2551 			* Set MER to 0.0 */
2552 		i_mer = 0;
2553 	} else {
2554 		sqr_err_iq = (eq_reg_td_sqr_err_i + eq_reg_td_sqr_err_q) <<
2555 			eq_reg_td_sqr_err_exp;
2556 		if ((transmission_params &
2557 			OFDM_SC_RA_RAM_OP_PARAM_MODE__M)
2558 			== OFDM_SC_RA_RAM_OP_PARAM_MODE_2K)
2559 			tps_cnt = 17;
2560 		else
2561 			tps_cnt = 68;
2562 
2563 		/* IMER = 100 * log10 (x)
2564 			where x = (eq_reg_td_tps_pwr_ofs^2 *
2565 			eq_reg_td_req_smb_cnt * tps_cnt)/sqr_err_iq
2566 
2567 			=> IMER = a + b -c
2568 			where a = 100 * log10 (eq_reg_td_tps_pwr_ofs^2)
2569 			b = 100 * log10 (eq_reg_td_req_smb_cnt * tps_cnt)
2570 			c = 100 * log10 (sqr_err_iq)
2571 			*/
2572 
2573 		/* log(x) x = 9bits * 9bits->18 bits  */
2574 		a = log10times100(eq_reg_td_tps_pwr_ofs *
2575 					eq_reg_td_tps_pwr_ofs);
2576 		/* log(x) x = 16bits * 7bits->23 bits  */
2577 		b = log10times100(eq_reg_td_req_smb_cnt * tps_cnt);
2578 		/* log(x) x = (16bits + 16bits) << 15 ->32 bits  */
2579 		c = log10times100(sqr_err_iq);
2580 
2581 		i_mer = a + b - c;
2582 	}
2583 	*p_signal_to_noise = i_mer;
2584 
2585 error:
2586 	if (status < 0)
2587 		pr_err("Error %d on %s\n", status, __func__);
2588 	return status;
2589 }
2590 
2591 static int get_signal_to_noise(struct drxk_state *state, s32 *p_signal_to_noise)
2592 {
2593 	dprintk(1, "\n");
2594 
2595 	*p_signal_to_noise = 0;
2596 	switch (state->m_operation_mode) {
2597 	case OM_DVBT:
2598 		return get_dvbt_signal_to_noise(state, p_signal_to_noise);
2599 	case OM_QAM_ITU_A:
2600 	case OM_QAM_ITU_C:
2601 		return get_qam_signal_to_noise(state, p_signal_to_noise);
2602 	default:
2603 		break;
2604 	}
2605 	return 0;
2606 }
2607 
2608 #if 0
2609 static int get_dvbt_quality(struct drxk_state *state, s32 *p_quality)
2610 {
2611 	/* SNR Values for quasi errorfree reception rom Nordig 2.2 */
2612 	int status = 0;
2613 
2614 	dprintk(1, "\n");
2615 
2616 	static s32 QE_SN[] = {
2617 		51,		/* QPSK 1/2 */
2618 		69,		/* QPSK 2/3 */
2619 		79,		/* QPSK 3/4 */
2620 		89,		/* QPSK 5/6 */
2621 		97,		/* QPSK 7/8 */
2622 		108,		/* 16-QAM 1/2 */
2623 		131,		/* 16-QAM 2/3 */
2624 		146,		/* 16-QAM 3/4 */
2625 		156,		/* 16-QAM 5/6 */
2626 		160,		/* 16-QAM 7/8 */
2627 		165,		/* 64-QAM 1/2 */
2628 		187,		/* 64-QAM 2/3 */
2629 		202,		/* 64-QAM 3/4 */
2630 		216,		/* 64-QAM 5/6 */
2631 		225,		/* 64-QAM 7/8 */
2632 	};
2633 
2634 	*p_quality = 0;
2635 
2636 	do {
2637 		s32 signal_to_noise = 0;
2638 		u16 constellation = 0;
2639 		u16 code_rate = 0;
2640 		u32 signal_to_noise_rel;
2641 		u32 ber_quality;
2642 
2643 		status = get_dvbt_signal_to_noise(state, &signal_to_noise);
2644 		if (status < 0)
2645 			break;
2646 		status = read16(state, OFDM_EQ_TOP_TD_TPS_CONST__A,
2647 				&constellation);
2648 		if (status < 0)
2649 			break;
2650 		constellation &= OFDM_EQ_TOP_TD_TPS_CONST__M;
2651 
2652 		status = read16(state, OFDM_EQ_TOP_TD_TPS_CODE_HP__A,
2653 				&code_rate);
2654 		if (status < 0)
2655 			break;
2656 		code_rate &= OFDM_EQ_TOP_TD_TPS_CODE_HP__M;
2657 
2658 		if (constellation > OFDM_EQ_TOP_TD_TPS_CONST_64QAM ||
2659 		    code_rate > OFDM_EQ_TOP_TD_TPS_CODE_LP_7_8)
2660 			break;
2661 		signal_to_noise_rel = signal_to_noise -
2662 		    QE_SN[constellation * 5 + code_rate];
2663 		ber_quality = 100;
2664 
2665 		if (signal_to_noise_rel < -70)
2666 			*p_quality = 0;
2667 		else if (signal_to_noise_rel < 30)
2668 			*p_quality = ((signal_to_noise_rel + 70) *
2669 				     ber_quality) / 100;
2670 		else
2671 			*p_quality = ber_quality;
2672 	} while (0);
2673 	return 0;
2674 };
2675 
2676 static int get_dvbc_quality(struct drxk_state *state, s32 *p_quality)
2677 {
2678 	int status = 0;
2679 	*p_quality = 0;
2680 
2681 	dprintk(1, "\n");
2682 
2683 	do {
2684 		u32 signal_to_noise = 0;
2685 		u32 ber_quality = 100;
2686 		u32 signal_to_noise_rel = 0;
2687 
2688 		status = get_qam_signal_to_noise(state, &signal_to_noise);
2689 		if (status < 0)
2690 			break;
2691 
2692 		switch (state->props.modulation) {
2693 		case QAM_16:
2694 			signal_to_noise_rel = signal_to_noise - 200;
2695 			break;
2696 		case QAM_32:
2697 			signal_to_noise_rel = signal_to_noise - 230;
2698 			break;	/* Not in NorDig */
2699 		case QAM_64:
2700 			signal_to_noise_rel = signal_to_noise - 260;
2701 			break;
2702 		case QAM_128:
2703 			signal_to_noise_rel = signal_to_noise - 290;
2704 			break;
2705 		default:
2706 		case QAM_256:
2707 			signal_to_noise_rel = signal_to_noise - 320;
2708 			break;
2709 		}
2710 
2711 		if (signal_to_noise_rel < -70)
2712 			*p_quality = 0;
2713 		else if (signal_to_noise_rel < 30)
2714 			*p_quality = ((signal_to_noise_rel + 70) *
2715 				     ber_quality) / 100;
2716 		else
2717 			*p_quality = ber_quality;
2718 	} while (0);
2719 
2720 	return status;
2721 }
2722 
2723 static int get_quality(struct drxk_state *state, s32 *p_quality)
2724 {
2725 	dprintk(1, "\n");
2726 
2727 	switch (state->m_operation_mode) {
2728 	case OM_DVBT:
2729 		return get_dvbt_quality(state, p_quality);
2730 	case OM_QAM_ITU_A:
2731 		return get_dvbc_quality(state, p_quality);
2732 	default:
2733 		break;
2734 	}
2735 
2736 	return 0;
2737 }
2738 #endif
2739 
2740 /* Free data ram in SIO HI */
2741 #define SIO_HI_RA_RAM_USR_BEGIN__A 0x420040
2742 #define SIO_HI_RA_RAM_USR_END__A   0x420060
2743 
2744 #define DRXK_HI_ATOMIC_BUF_START (SIO_HI_RA_RAM_USR_BEGIN__A)
2745 #define DRXK_HI_ATOMIC_BUF_END   (SIO_HI_RA_RAM_USR_BEGIN__A + 7)
2746 #define DRXK_HI_ATOMIC_READ      SIO_HI_RA_RAM_PAR_3_ACP_RW_READ
2747 #define DRXK_HI_ATOMIC_WRITE     SIO_HI_RA_RAM_PAR_3_ACP_RW_WRITE
2748 
2749 #define DRXDAP_FASI_ADDR2BLOCK(addr)  (((addr) >> 22) & 0x3F)
2750 #define DRXDAP_FASI_ADDR2BANK(addr)   (((addr) >> 16) & 0x3F)
2751 #define DRXDAP_FASI_ADDR2OFFSET(addr) ((addr) & 0x7FFF)
2752 
2753 static int ConfigureI2CBridge(struct drxk_state *state, bool b_enable_bridge)
2754 {
2755 	int status = -EINVAL;
2756 
2757 	dprintk(1, "\n");
2758 
2759 	if (state->m_drxk_state == DRXK_UNINITIALIZED)
2760 		return 0;
2761 	if (state->m_drxk_state == DRXK_POWERED_DOWN)
2762 		goto error;
2763 
2764 	if (state->no_i2c_bridge)
2765 		return 0;
2766 
2767 	status = write16(state, SIO_HI_RA_RAM_PAR_1__A,
2768 			 SIO_HI_RA_RAM_PAR_1_PAR1_SEC_KEY);
2769 	if (status < 0)
2770 		goto error;
2771 	if (b_enable_bridge) {
2772 		status = write16(state, SIO_HI_RA_RAM_PAR_2__A,
2773 				 SIO_HI_RA_RAM_PAR_2_BRD_CFG_CLOSED);
2774 		if (status < 0)
2775 			goto error;
2776 	} else {
2777 		status = write16(state, SIO_HI_RA_RAM_PAR_2__A,
2778 				 SIO_HI_RA_RAM_PAR_2_BRD_CFG_OPEN);
2779 		if (status < 0)
2780 			goto error;
2781 	}
2782 
2783 	status = hi_command(state, SIO_HI_RA_RAM_CMD_BRDCTRL, NULL);
2784 
2785 error:
2786 	if (status < 0)
2787 		pr_err("Error %d on %s\n", status, __func__);
2788 	return status;
2789 }
2790 
2791 static int set_pre_saw(struct drxk_state *state,
2792 		     struct s_cfg_pre_saw *p_pre_saw_cfg)
2793 {
2794 	int status = -EINVAL;
2795 
2796 	dprintk(1, "\n");
2797 
2798 	if ((p_pre_saw_cfg == NULL)
2799 	    || (p_pre_saw_cfg->reference > IQM_AF_PDREF__M))
2800 		goto error;
2801 
2802 	status = write16(state, IQM_AF_PDREF__A, p_pre_saw_cfg->reference);
2803 error:
2804 	if (status < 0)
2805 		pr_err("Error %d on %s\n", status, __func__);
2806 	return status;
2807 }
2808 
2809 static int bl_direct_cmd(struct drxk_state *state, u32 target_addr,
2810 		       u16 rom_offset, u16 nr_of_elements, u32 time_out)
2811 {
2812 	u16 bl_status = 0;
2813 	u16 offset = (u16) ((target_addr >> 0) & 0x00FFFF);
2814 	u16 blockbank = (u16) ((target_addr >> 16) & 0x000FFF);
2815 	int status;
2816 	unsigned long end;
2817 
2818 	dprintk(1, "\n");
2819 
2820 	mutex_lock(&state->mutex);
2821 	status = write16(state, SIO_BL_MODE__A, SIO_BL_MODE_DIRECT);
2822 	if (status < 0)
2823 		goto error;
2824 	status = write16(state, SIO_BL_TGT_HDR__A, blockbank);
2825 	if (status < 0)
2826 		goto error;
2827 	status = write16(state, SIO_BL_TGT_ADDR__A, offset);
2828 	if (status < 0)
2829 		goto error;
2830 	status = write16(state, SIO_BL_SRC_ADDR__A, rom_offset);
2831 	if (status < 0)
2832 		goto error;
2833 	status = write16(state, SIO_BL_SRC_LEN__A, nr_of_elements);
2834 	if (status < 0)
2835 		goto error;
2836 	status = write16(state, SIO_BL_ENABLE__A, SIO_BL_ENABLE_ON);
2837 	if (status < 0)
2838 		goto error;
2839 
2840 	end = jiffies + msecs_to_jiffies(time_out);
2841 	do {
2842 		status = read16(state, SIO_BL_STATUS__A, &bl_status);
2843 		if (status < 0)
2844 			goto error;
2845 	} while ((bl_status == 0x1) && time_is_after_jiffies(end));
2846 	if (bl_status == 0x1) {
2847 		pr_err("SIO not ready\n");
2848 		status = -EINVAL;
2849 		goto error2;
2850 	}
2851 error:
2852 	if (status < 0)
2853 		pr_err("Error %d on %s\n", status, __func__);
2854 error2:
2855 	mutex_unlock(&state->mutex);
2856 	return status;
2857 
2858 }
2859 
2860 static int adc_sync_measurement(struct drxk_state *state, u16 *count)
2861 {
2862 	u16 data = 0;
2863 	int status;
2864 
2865 	dprintk(1, "\n");
2866 
2867 	/* start measurement */
2868 	status = write16(state, IQM_AF_COMM_EXEC__A, IQM_AF_COMM_EXEC_ACTIVE);
2869 	if (status < 0)
2870 		goto error;
2871 	status = write16(state, IQM_AF_START_LOCK__A, 1);
2872 	if (status < 0)
2873 		goto error;
2874 
2875 	*count = 0;
2876 	status = read16(state, IQM_AF_PHASE0__A, &data);
2877 	if (status < 0)
2878 		goto error;
2879 	if (data == 127)
2880 		*count = *count + 1;
2881 	status = read16(state, IQM_AF_PHASE1__A, &data);
2882 	if (status < 0)
2883 		goto error;
2884 	if (data == 127)
2885 		*count = *count + 1;
2886 	status = read16(state, IQM_AF_PHASE2__A, &data);
2887 	if (status < 0)
2888 		goto error;
2889 	if (data == 127)
2890 		*count = *count + 1;
2891 
2892 error:
2893 	if (status < 0)
2894 		pr_err("Error %d on %s\n", status, __func__);
2895 	return status;
2896 }
2897 
2898 static int adc_synchronization(struct drxk_state *state)
2899 {
2900 	u16 count = 0;
2901 	int status;
2902 
2903 	dprintk(1, "\n");
2904 
2905 	status = adc_sync_measurement(state, &count);
2906 	if (status < 0)
2907 		goto error;
2908 
2909 	if (count == 1) {
2910 		/* Try sampling on a different edge */
2911 		u16 clk_neg = 0;
2912 
2913 		status = read16(state, IQM_AF_CLKNEG__A, &clk_neg);
2914 		if (status < 0)
2915 			goto error;
2916 		if ((clk_neg & IQM_AF_CLKNEG_CLKNEGDATA__M) ==
2917 			IQM_AF_CLKNEG_CLKNEGDATA_CLK_ADC_DATA_POS) {
2918 			clk_neg &= (~(IQM_AF_CLKNEG_CLKNEGDATA__M));
2919 			clk_neg |=
2920 				IQM_AF_CLKNEG_CLKNEGDATA_CLK_ADC_DATA_NEG;
2921 		} else {
2922 			clk_neg &= (~(IQM_AF_CLKNEG_CLKNEGDATA__M));
2923 			clk_neg |=
2924 				IQM_AF_CLKNEG_CLKNEGDATA_CLK_ADC_DATA_POS;
2925 		}
2926 		status = write16(state, IQM_AF_CLKNEG__A, clk_neg);
2927 		if (status < 0)
2928 			goto error;
2929 		status = adc_sync_measurement(state, &count);
2930 		if (status < 0)
2931 			goto error;
2932 	}
2933 
2934 	if (count < 2)
2935 		status = -EINVAL;
2936 error:
2937 	if (status < 0)
2938 		pr_err("Error %d on %s\n", status, __func__);
2939 	return status;
2940 }
2941 
2942 static int set_frequency_shifter(struct drxk_state *state,
2943 			       u16 intermediate_freqk_hz,
2944 			       s32 tuner_freq_offset, bool is_dtv)
2945 {
2946 	bool select_pos_image = false;
2947 	u32 rf_freq_residual = tuner_freq_offset;
2948 	u32 fm_frequency_shift = 0;
2949 	bool tuner_mirror = !state->m_b_mirror_freq_spect;
2950 	u32 adc_freq;
2951 	bool adc_flip;
2952 	int status;
2953 	u32 if_freq_actual;
2954 	u32 sampling_frequency = (u32) (state->m_sys_clock_freq / 3);
2955 	u32 frequency_shift;
2956 	bool image_to_select;
2957 
2958 	dprintk(1, "\n");
2959 
2960 	/*
2961 	   Program frequency shifter
2962 	   No need to account for mirroring on RF
2963 	 */
2964 	if (is_dtv) {
2965 		if ((state->m_operation_mode == OM_QAM_ITU_A) ||
2966 		    (state->m_operation_mode == OM_QAM_ITU_C) ||
2967 		    (state->m_operation_mode == OM_DVBT))
2968 			select_pos_image = true;
2969 		else
2970 			select_pos_image = false;
2971 	}
2972 	if (tuner_mirror)
2973 		/* tuner doesn't mirror */
2974 		if_freq_actual = intermediate_freqk_hz +
2975 		    rf_freq_residual + fm_frequency_shift;
2976 	else
2977 		/* tuner mirrors */
2978 		if_freq_actual = intermediate_freqk_hz -
2979 		    rf_freq_residual - fm_frequency_shift;
2980 	if (if_freq_actual > sampling_frequency / 2) {
2981 		/* adc mirrors */
2982 		adc_freq = sampling_frequency - if_freq_actual;
2983 		adc_flip = true;
2984 	} else {
2985 		/* adc doesn't mirror */
2986 		adc_freq = if_freq_actual;
2987 		adc_flip = false;
2988 	}
2989 
2990 	frequency_shift = adc_freq;
2991 	image_to_select = state->m_rfmirror ^ tuner_mirror ^
2992 	    adc_flip ^ select_pos_image;
2993 	state->m_iqm_fs_rate_ofs =
2994 	    Frac28a((frequency_shift), sampling_frequency);
2995 
2996 	if (image_to_select)
2997 		state->m_iqm_fs_rate_ofs = ~state->m_iqm_fs_rate_ofs + 1;
2998 
2999 	/* Program frequency shifter with tuner offset compensation */
3000 	/* frequency_shift += tuner_freq_offset; TODO */
3001 	status = write32(state, IQM_FS_RATE_OFS_LO__A,
3002 			 state->m_iqm_fs_rate_ofs);
3003 	if (status < 0)
3004 		pr_err("Error %d on %s\n", status, __func__);
3005 	return status;
3006 }
3007 
3008 static int init_agc(struct drxk_state *state, bool is_dtv)
3009 {
3010 	u16 ingain_tgt = 0;
3011 	u16 ingain_tgt_min = 0;
3012 	u16 ingain_tgt_max = 0;
3013 	u16 clp_cyclen = 0;
3014 	u16 clp_sum_min = 0;
3015 	u16 clp_dir_to = 0;
3016 	u16 sns_sum_min = 0;
3017 	u16 sns_sum_max = 0;
3018 	u16 clp_sum_max = 0;
3019 	u16 sns_dir_to = 0;
3020 	u16 ki_innergain_min = 0;
3021 	u16 if_iaccu_hi_tgt = 0;
3022 	u16 if_iaccu_hi_tgt_min = 0;
3023 	u16 if_iaccu_hi_tgt_max = 0;
3024 	u16 data = 0;
3025 	u16 fast_clp_ctrl_delay = 0;
3026 	u16 clp_ctrl_mode = 0;
3027 	int status = 0;
3028 
3029 	dprintk(1, "\n");
3030 
3031 	/* Common settings */
3032 	sns_sum_max = 1023;
3033 	if_iaccu_hi_tgt_min = 2047;
3034 	clp_cyclen = 500;
3035 	clp_sum_max = 1023;
3036 
3037 	/* AGCInit() not available for DVBT; init done in microcode */
3038 	if (!is_qam(state)) {
3039 		pr_err("%s: mode %d is not DVB-C\n",
3040 		       __func__, state->m_operation_mode);
3041 		return -EINVAL;
3042 	}
3043 
3044 	/* FIXME: Analog TV AGC require different settings */
3045 
3046 	/* Standard specific settings */
3047 	clp_sum_min = 8;
3048 	clp_dir_to = (u16) -9;
3049 	clp_ctrl_mode = 0;
3050 	sns_sum_min = 8;
3051 	sns_dir_to = (u16) -9;
3052 	ki_innergain_min = (u16) -1030;
3053 	if_iaccu_hi_tgt_max = 0x2380;
3054 	if_iaccu_hi_tgt = 0x2380;
3055 	ingain_tgt_min = 0x0511;
3056 	ingain_tgt = 0x0511;
3057 	ingain_tgt_max = 5119;
3058 	fast_clp_ctrl_delay = state->m_qam_if_agc_cfg.fast_clip_ctrl_delay;
3059 
3060 	status = write16(state, SCU_RAM_AGC_FAST_CLP_CTRL_DELAY__A,
3061 			 fast_clp_ctrl_delay);
3062 	if (status < 0)
3063 		goto error;
3064 
3065 	status = write16(state, SCU_RAM_AGC_CLP_CTRL_MODE__A, clp_ctrl_mode);
3066 	if (status < 0)
3067 		goto error;
3068 	status = write16(state, SCU_RAM_AGC_INGAIN_TGT__A, ingain_tgt);
3069 	if (status < 0)
3070 		goto error;
3071 	status = write16(state, SCU_RAM_AGC_INGAIN_TGT_MIN__A, ingain_tgt_min);
3072 	if (status < 0)
3073 		goto error;
3074 	status = write16(state, SCU_RAM_AGC_INGAIN_TGT_MAX__A, ingain_tgt_max);
3075 	if (status < 0)
3076 		goto error;
3077 	status = write16(state, SCU_RAM_AGC_IF_IACCU_HI_TGT_MIN__A,
3078 			 if_iaccu_hi_tgt_min);
3079 	if (status < 0)
3080 		goto error;
3081 	status = write16(state, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A,
3082 			 if_iaccu_hi_tgt_max);
3083 	if (status < 0)
3084 		goto error;
3085 	status = write16(state, SCU_RAM_AGC_IF_IACCU_HI__A, 0);
3086 	if (status < 0)
3087 		goto error;
3088 	status = write16(state, SCU_RAM_AGC_IF_IACCU_LO__A, 0);
3089 	if (status < 0)
3090 		goto error;
3091 	status = write16(state, SCU_RAM_AGC_RF_IACCU_HI__A, 0);
3092 	if (status < 0)
3093 		goto error;
3094 	status = write16(state, SCU_RAM_AGC_RF_IACCU_LO__A, 0);
3095 	if (status < 0)
3096 		goto error;
3097 	status = write16(state, SCU_RAM_AGC_CLP_SUM_MAX__A, clp_sum_max);
3098 	if (status < 0)
3099 		goto error;
3100 	status = write16(state, SCU_RAM_AGC_SNS_SUM_MAX__A, sns_sum_max);
3101 	if (status < 0)
3102 		goto error;
3103 
3104 	status = write16(state, SCU_RAM_AGC_KI_INNERGAIN_MIN__A,
3105 			 ki_innergain_min);
3106 	if (status < 0)
3107 		goto error;
3108 	status = write16(state, SCU_RAM_AGC_IF_IACCU_HI_TGT__A,
3109 			 if_iaccu_hi_tgt);
3110 	if (status < 0)
3111 		goto error;
3112 	status = write16(state, SCU_RAM_AGC_CLP_CYCLEN__A, clp_cyclen);
3113 	if (status < 0)
3114 		goto error;
3115 
3116 	status = write16(state, SCU_RAM_AGC_RF_SNS_DEV_MAX__A, 1023);
3117 	if (status < 0)
3118 		goto error;
3119 	status = write16(state, SCU_RAM_AGC_RF_SNS_DEV_MIN__A, (u16) -1023);
3120 	if (status < 0)
3121 		goto error;
3122 	status = write16(state, SCU_RAM_AGC_FAST_SNS_CTRL_DELAY__A, 50);
3123 	if (status < 0)
3124 		goto error;
3125 
3126 	status = write16(state, SCU_RAM_AGC_KI_MAXMINGAIN_TH__A, 20);
3127 	if (status < 0)
3128 		goto error;
3129 	status = write16(state, SCU_RAM_AGC_CLP_SUM_MIN__A, clp_sum_min);
3130 	if (status < 0)
3131 		goto error;
3132 	status = write16(state, SCU_RAM_AGC_SNS_SUM_MIN__A, sns_sum_min);
3133 	if (status < 0)
3134 		goto error;
3135 	status = write16(state, SCU_RAM_AGC_CLP_DIR_TO__A, clp_dir_to);
3136 	if (status < 0)
3137 		goto error;
3138 	status = write16(state, SCU_RAM_AGC_SNS_DIR_TO__A, sns_dir_to);
3139 	if (status < 0)
3140 		goto error;
3141 	status = write16(state, SCU_RAM_AGC_KI_MINGAIN__A, 0x7fff);
3142 	if (status < 0)
3143 		goto error;
3144 	status = write16(state, SCU_RAM_AGC_KI_MAXGAIN__A, 0x0);
3145 	if (status < 0)
3146 		goto error;
3147 	status = write16(state, SCU_RAM_AGC_KI_MIN__A, 0x0117);
3148 	if (status < 0)
3149 		goto error;
3150 	status = write16(state, SCU_RAM_AGC_KI_MAX__A, 0x0657);
3151 	if (status < 0)
3152 		goto error;
3153 	status = write16(state, SCU_RAM_AGC_CLP_SUM__A, 0);
3154 	if (status < 0)
3155 		goto error;
3156 	status = write16(state, SCU_RAM_AGC_CLP_CYCCNT__A, 0);
3157 	if (status < 0)
3158 		goto error;
3159 	status = write16(state, SCU_RAM_AGC_CLP_DIR_WD__A, 0);
3160 	if (status < 0)
3161 		goto error;
3162 	status = write16(state, SCU_RAM_AGC_CLP_DIR_STP__A, 1);
3163 	if (status < 0)
3164 		goto error;
3165 	status = write16(state, SCU_RAM_AGC_SNS_SUM__A, 0);
3166 	if (status < 0)
3167 		goto error;
3168 	status = write16(state, SCU_RAM_AGC_SNS_CYCCNT__A, 0);
3169 	if (status < 0)
3170 		goto error;
3171 	status = write16(state, SCU_RAM_AGC_SNS_DIR_WD__A, 0);
3172 	if (status < 0)
3173 		goto error;
3174 	status = write16(state, SCU_RAM_AGC_SNS_DIR_STP__A, 1);
3175 	if (status < 0)
3176 		goto error;
3177 	status = write16(state, SCU_RAM_AGC_SNS_CYCLEN__A, 500);
3178 	if (status < 0)
3179 		goto error;
3180 	status = write16(state, SCU_RAM_AGC_KI_CYCLEN__A, 500);
3181 	if (status < 0)
3182 		goto error;
3183 
3184 	/* Initialize inner-loop KI gain factors */
3185 	status = read16(state, SCU_RAM_AGC_KI__A, &data);
3186 	if (status < 0)
3187 		goto error;
3188 
3189 	data = 0x0657;
3190 	data &= ~SCU_RAM_AGC_KI_RF__M;
3191 	data |= (DRXK_KI_RAGC_QAM << SCU_RAM_AGC_KI_RF__B);
3192 	data &= ~SCU_RAM_AGC_KI_IF__M;
3193 	data |= (DRXK_KI_IAGC_QAM << SCU_RAM_AGC_KI_IF__B);
3194 
3195 	status = write16(state, SCU_RAM_AGC_KI__A, data);
3196 error:
3197 	if (status < 0)
3198 		pr_err("Error %d on %s\n", status, __func__);
3199 	return status;
3200 }
3201 
3202 static int dvbtqam_get_acc_pkt_err(struct drxk_state *state, u16 *packet_err)
3203 {
3204 	int status;
3205 
3206 	dprintk(1, "\n");
3207 	if (packet_err == NULL)
3208 		status = write16(state, SCU_RAM_FEC_ACCUM_PKT_FAILURES__A, 0);
3209 	else
3210 		status = read16(state, SCU_RAM_FEC_ACCUM_PKT_FAILURES__A,
3211 				packet_err);
3212 	if (status < 0)
3213 		pr_err("Error %d on %s\n", status, __func__);
3214 	return status;
3215 }
3216 
3217 static int dvbt_sc_command(struct drxk_state *state,
3218 			 u16 cmd, u16 subcmd,
3219 			 u16 param0, u16 param1, u16 param2,
3220 			 u16 param3, u16 param4)
3221 {
3222 	u16 cur_cmd = 0;
3223 	u16 err_code = 0;
3224 	u16 retry_cnt = 0;
3225 	u16 sc_exec = 0;
3226 	int status;
3227 
3228 	dprintk(1, "\n");
3229 	status = read16(state, OFDM_SC_COMM_EXEC__A, &sc_exec);
3230 	if (sc_exec != 1) {
3231 		/* SC is not running */
3232 		status = -EINVAL;
3233 	}
3234 	if (status < 0)
3235 		goto error;
3236 
3237 	/* Wait until sc is ready to receive command */
3238 	retry_cnt = 0;
3239 	do {
3240 		usleep_range(1000, 2000);
3241 		status = read16(state, OFDM_SC_RA_RAM_CMD__A, &cur_cmd);
3242 		retry_cnt++;
3243 	} while ((cur_cmd != 0) && (retry_cnt < DRXK_MAX_RETRIES));
3244 	if (retry_cnt >= DRXK_MAX_RETRIES && (status < 0))
3245 		goto error;
3246 
3247 	/* Write sub-command */
3248 	switch (cmd) {
3249 		/* All commands using sub-cmd */
3250 	case OFDM_SC_RA_RAM_CMD_PROC_START:
3251 	case OFDM_SC_RA_RAM_CMD_SET_PREF_PARAM:
3252 	case OFDM_SC_RA_RAM_CMD_PROGRAM_PARAM:
3253 		status = write16(state, OFDM_SC_RA_RAM_CMD_ADDR__A, subcmd);
3254 		if (status < 0)
3255 			goto error;
3256 		break;
3257 	default:
3258 		/* Do nothing */
3259 		break;
3260 	}
3261 
3262 	/* Write needed parameters and the command */
3263 	status = 0;
3264 	switch (cmd) {
3265 		/* All commands using 5 parameters */
3266 		/* All commands using 4 parameters */
3267 		/* All commands using 3 parameters */
3268 		/* All commands using 2 parameters */
3269 	case OFDM_SC_RA_RAM_CMD_PROC_START:
3270 	case OFDM_SC_RA_RAM_CMD_SET_PREF_PARAM:
3271 	case OFDM_SC_RA_RAM_CMD_PROGRAM_PARAM:
3272 		status |= write16(state, OFDM_SC_RA_RAM_PARAM1__A, param1);
3273 		/* All commands using 1 parameters */
3274 		/* fall through */
3275 	case OFDM_SC_RA_RAM_CMD_SET_ECHO_TIMING:
3276 	case OFDM_SC_RA_RAM_CMD_USER_IO:
3277 		status |= write16(state, OFDM_SC_RA_RAM_PARAM0__A, param0);
3278 		/* All commands using 0 parameters */
3279 		/* fall through */
3280 	case OFDM_SC_RA_RAM_CMD_GET_OP_PARAM:
3281 	case OFDM_SC_RA_RAM_CMD_NULL:
3282 		/* Write command */
3283 		status |= write16(state, OFDM_SC_RA_RAM_CMD__A, cmd);
3284 		break;
3285 	default:
3286 		/* Unknown command */
3287 		status = -EINVAL;
3288 	}
3289 	if (status < 0)
3290 		goto error;
3291 
3292 	/* Wait until sc is ready processing command */
3293 	retry_cnt = 0;
3294 	do {
3295 		usleep_range(1000, 2000);
3296 		status = read16(state, OFDM_SC_RA_RAM_CMD__A, &cur_cmd);
3297 		retry_cnt++;
3298 	} while ((cur_cmd != 0) && (retry_cnt < DRXK_MAX_RETRIES));
3299 	if (retry_cnt >= DRXK_MAX_RETRIES && (status < 0))
3300 		goto error;
3301 
3302 	/* Check for illegal cmd */
3303 	status = read16(state, OFDM_SC_RA_RAM_CMD_ADDR__A, &err_code);
3304 	if (err_code == 0xFFFF) {
3305 		/* illegal command */
3306 		status = -EINVAL;
3307 	}
3308 	if (status < 0)
3309 		goto error;
3310 
3311 	/* Retrieve results parameters from SC */
3312 	switch (cmd) {
3313 		/* All commands yielding 5 results */
3314 		/* All commands yielding 4 results */
3315 		/* All commands yielding 3 results */
3316 		/* All commands yielding 2 results */
3317 		/* All commands yielding 1 result */
3318 	case OFDM_SC_RA_RAM_CMD_USER_IO:
3319 	case OFDM_SC_RA_RAM_CMD_GET_OP_PARAM:
3320 		status = read16(state, OFDM_SC_RA_RAM_PARAM0__A, &(param0));
3321 		/* All commands yielding 0 results */
3322 	case OFDM_SC_RA_RAM_CMD_SET_ECHO_TIMING:
3323 	case OFDM_SC_RA_RAM_CMD_SET_TIMER:
3324 	case OFDM_SC_RA_RAM_CMD_PROC_START:
3325 	case OFDM_SC_RA_RAM_CMD_SET_PREF_PARAM:
3326 	case OFDM_SC_RA_RAM_CMD_PROGRAM_PARAM:
3327 	case OFDM_SC_RA_RAM_CMD_NULL:
3328 		break;
3329 	default:
3330 		/* Unknown command */
3331 		status = -EINVAL;
3332 		break;
3333 	}			/* switch (cmd->cmd) */
3334 error:
3335 	if (status < 0)
3336 		pr_err("Error %d on %s\n", status, __func__);
3337 	return status;
3338 }
3339 
3340 static int power_up_dvbt(struct drxk_state *state)
3341 {
3342 	enum drx_power_mode power_mode = DRX_POWER_UP;
3343 	int status;
3344 
3345 	dprintk(1, "\n");
3346 	status = ctrl_power_mode(state, &power_mode);
3347 	if (status < 0)
3348 		pr_err("Error %d on %s\n", status, __func__);
3349 	return status;
3350 }
3351 
3352 static int dvbt_ctrl_set_inc_enable(struct drxk_state *state, bool *enabled)
3353 {
3354 	int status;
3355 
3356 	dprintk(1, "\n");
3357 	if (*enabled)
3358 		status = write16(state, IQM_CF_BYPASSDET__A, 0);
3359 	else
3360 		status = write16(state, IQM_CF_BYPASSDET__A, 1);
3361 	if (status < 0)
3362 		pr_err("Error %d on %s\n", status, __func__);
3363 	return status;
3364 }
3365 
3366 #define DEFAULT_FR_THRES_8K     4000
3367 static int dvbt_ctrl_set_fr_enable(struct drxk_state *state, bool *enabled)
3368 {
3369 
3370 	int status;
3371 
3372 	dprintk(1, "\n");
3373 	if (*enabled) {
3374 		/* write mask to 1 */
3375 		status = write16(state, OFDM_SC_RA_RAM_FR_THRES_8K__A,
3376 				   DEFAULT_FR_THRES_8K);
3377 	} else {
3378 		/* write mask to 0 */
3379 		status = write16(state, OFDM_SC_RA_RAM_FR_THRES_8K__A, 0);
3380 	}
3381 	if (status < 0)
3382 		pr_err("Error %d on %s\n", status, __func__);
3383 
3384 	return status;
3385 }
3386 
3387 static int dvbt_ctrl_set_echo_threshold(struct drxk_state *state,
3388 				struct drxk_cfg_dvbt_echo_thres_t *echo_thres)
3389 {
3390 	u16 data = 0;
3391 	int status;
3392 
3393 	dprintk(1, "\n");
3394 	status = read16(state, OFDM_SC_RA_RAM_ECHO_THRES__A, &data);
3395 	if (status < 0)
3396 		goto error;
3397 
3398 	switch (echo_thres->fft_mode) {
3399 	case DRX_FFTMODE_2K:
3400 		data &= ~OFDM_SC_RA_RAM_ECHO_THRES_2K__M;
3401 		data |= ((echo_thres->threshold <<
3402 			OFDM_SC_RA_RAM_ECHO_THRES_2K__B)
3403 			& (OFDM_SC_RA_RAM_ECHO_THRES_2K__M));
3404 		break;
3405 	case DRX_FFTMODE_8K:
3406 		data &= ~OFDM_SC_RA_RAM_ECHO_THRES_8K__M;
3407 		data |= ((echo_thres->threshold <<
3408 			OFDM_SC_RA_RAM_ECHO_THRES_8K__B)
3409 			& (OFDM_SC_RA_RAM_ECHO_THRES_8K__M));
3410 		break;
3411 	default:
3412 		return -EINVAL;
3413 	}
3414 
3415 	status = write16(state, OFDM_SC_RA_RAM_ECHO_THRES__A, data);
3416 error:
3417 	if (status < 0)
3418 		pr_err("Error %d on %s\n", status, __func__);
3419 	return status;
3420 }
3421 
3422 static int dvbt_ctrl_set_sqi_speed(struct drxk_state *state,
3423 			       enum drxk_cfg_dvbt_sqi_speed *speed)
3424 {
3425 	int status = -EINVAL;
3426 
3427 	dprintk(1, "\n");
3428 
3429 	switch (*speed) {
3430 	case DRXK_DVBT_SQI_SPEED_FAST:
3431 	case DRXK_DVBT_SQI_SPEED_MEDIUM:
3432 	case DRXK_DVBT_SQI_SPEED_SLOW:
3433 		break;
3434 	default:
3435 		goto error;
3436 	}
3437 	status = write16(state, SCU_RAM_FEC_PRE_RS_BER_FILTER_SH__A,
3438 			   (u16) *speed);
3439 error:
3440 	if (status < 0)
3441 		pr_err("Error %d on %s\n", status, __func__);
3442 	return status;
3443 }
3444 
3445 /*============================================================================*/
3446 
3447 /*
3448 * \brief Activate DVBT specific presets
3449 * \param demod instance of demodulator.
3450 * \return DRXStatus_t.
3451 *
3452 * Called in DVBTSetStandard
3453 *
3454 */
3455 static int dvbt_activate_presets(struct drxk_state *state)
3456 {
3457 	int status;
3458 	bool setincenable = false;
3459 	bool setfrenable = true;
3460 
3461 	struct drxk_cfg_dvbt_echo_thres_t echo_thres2k = { 0, DRX_FFTMODE_2K };
3462 	struct drxk_cfg_dvbt_echo_thres_t echo_thres8k = { 0, DRX_FFTMODE_8K };
3463 
3464 	dprintk(1, "\n");
3465 	status = dvbt_ctrl_set_inc_enable(state, &setincenable);
3466 	if (status < 0)
3467 		goto error;
3468 	status = dvbt_ctrl_set_fr_enable(state, &setfrenable);
3469 	if (status < 0)
3470 		goto error;
3471 	status = dvbt_ctrl_set_echo_threshold(state, &echo_thres2k);
3472 	if (status < 0)
3473 		goto error;
3474 	status = dvbt_ctrl_set_echo_threshold(state, &echo_thres8k);
3475 	if (status < 0)
3476 		goto error;
3477 	status = write16(state, SCU_RAM_AGC_INGAIN_TGT_MAX__A,
3478 			 state->m_dvbt_if_agc_cfg.ingain_tgt_max);
3479 error:
3480 	if (status < 0)
3481 		pr_err("Error %d on %s\n", status, __func__);
3482 	return status;
3483 }
3484 
3485 /*============================================================================*/
3486 
3487 /*
3488 * \brief Initialize channelswitch-independent settings for DVBT.
3489 * \param demod instance of demodulator.
3490 * \return DRXStatus_t.
3491 *
3492 * For ROM code channel filter taps are loaded from the bootloader. For microcode
3493 * the DVB-T taps from the drxk_filters.h are used.
3494 */
3495 static int set_dvbt_standard(struct drxk_state *state,
3496 			   enum operation_mode o_mode)
3497 {
3498 	u16 cmd_result = 0;
3499 	u16 data = 0;
3500 	int status;
3501 
3502 	dprintk(1, "\n");
3503 
3504 	power_up_dvbt(state);
3505 	/* added antenna switch */
3506 	switch_antenna_to_dvbt(state);
3507 	/* send OFDM reset command */
3508 	status = scu_command(state,
3509 			     SCU_RAM_COMMAND_STANDARD_OFDM
3510 			     | SCU_RAM_COMMAND_CMD_DEMOD_RESET,
3511 			     0, NULL, 1, &cmd_result);
3512 	if (status < 0)
3513 		goto error;
3514 
3515 	/* send OFDM setenv command */
3516 	status = scu_command(state, SCU_RAM_COMMAND_STANDARD_OFDM
3517 			     | SCU_RAM_COMMAND_CMD_DEMOD_SET_ENV,
3518 			     0, NULL, 1, &cmd_result);
3519 	if (status < 0)
3520 		goto error;
3521 
3522 	/* reset datapath for OFDM, processors first */
3523 	status = write16(state, OFDM_SC_COMM_EXEC__A, OFDM_SC_COMM_EXEC_STOP);
3524 	if (status < 0)
3525 		goto error;
3526 	status = write16(state, OFDM_LC_COMM_EXEC__A, OFDM_LC_COMM_EXEC_STOP);
3527 	if (status < 0)
3528 		goto error;
3529 	status = write16(state, IQM_COMM_EXEC__A, IQM_COMM_EXEC_B_STOP);
3530 	if (status < 0)
3531 		goto error;
3532 
3533 	/* IQM setup */
3534 	/* synchronize on ofdstate->m_festart */
3535 	status = write16(state, IQM_AF_UPD_SEL__A, 1);
3536 	if (status < 0)
3537 		goto error;
3538 	/* window size for clipping ADC detection */
3539 	status = write16(state, IQM_AF_CLP_LEN__A, 0);
3540 	if (status < 0)
3541 		goto error;
3542 	/* window size for for sense pre-SAW detection */
3543 	status = write16(state, IQM_AF_SNS_LEN__A, 0);
3544 	if (status < 0)
3545 		goto error;
3546 	/* sense threshold for sense pre-SAW detection */
3547 	status = write16(state, IQM_AF_AMUX__A, IQM_AF_AMUX_SIGNAL2ADC);
3548 	if (status < 0)
3549 		goto error;
3550 	status = set_iqm_af(state, true);
3551 	if (status < 0)
3552 		goto error;
3553 
3554 	status = write16(state, IQM_AF_AGC_RF__A, 0);
3555 	if (status < 0)
3556 		goto error;
3557 
3558 	/* Impulse noise cruncher setup */
3559 	status = write16(state, IQM_AF_INC_LCT__A, 0);	/* crunch in IQM_CF */
3560 	if (status < 0)
3561 		goto error;
3562 	status = write16(state, IQM_CF_DET_LCT__A, 0);	/* detect in IQM_CF */
3563 	if (status < 0)
3564 		goto error;
3565 	status = write16(state, IQM_CF_WND_LEN__A, 3);	/* peak detector window length */
3566 	if (status < 0)
3567 		goto error;
3568 
3569 	status = write16(state, IQM_RC_STRETCH__A, 16);
3570 	if (status < 0)
3571 		goto error;
3572 	status = write16(state, IQM_CF_OUT_ENA__A, 0x4); /* enable output 2 */
3573 	if (status < 0)
3574 		goto error;
3575 	status = write16(state, IQM_CF_DS_ENA__A, 0x4);	/* decimate output 2 */
3576 	if (status < 0)
3577 		goto error;
3578 	status = write16(state, IQM_CF_SCALE__A, 1600);
3579 	if (status < 0)
3580 		goto error;
3581 	status = write16(state, IQM_CF_SCALE_SH__A, 0);
3582 	if (status < 0)
3583 		goto error;
3584 
3585 	/* virtual clipping threshold for clipping ADC detection */
3586 	status = write16(state, IQM_AF_CLP_TH__A, 448);
3587 	if (status < 0)
3588 		goto error;
3589 	status = write16(state, IQM_CF_DATATH__A, 495);	/* crunching threshold */
3590 	if (status < 0)
3591 		goto error;
3592 
3593 	status = bl_chain_cmd(state, DRXK_BL_ROM_OFFSET_TAPS_DVBT,
3594 			      DRXK_BLCC_NR_ELEMENTS_TAPS, DRXK_BLC_TIMEOUT);
3595 	if (status < 0)
3596 		goto error;
3597 
3598 	status = write16(state, IQM_CF_PKDTH__A, 2);	/* peak detector threshold */
3599 	if (status < 0)
3600 		goto error;
3601 	status = write16(state, IQM_CF_POW_MEAS_LEN__A, 2);
3602 	if (status < 0)
3603 		goto error;
3604 	/* enable power measurement interrupt */
3605 	status = write16(state, IQM_CF_COMM_INT_MSK__A, 1);
3606 	if (status < 0)
3607 		goto error;
3608 	status = write16(state, IQM_COMM_EXEC__A, IQM_COMM_EXEC_B_ACTIVE);
3609 	if (status < 0)
3610 		goto error;
3611 
3612 	/* IQM will not be reset from here, sync ADC and update/init AGC */
3613 	status = adc_synchronization(state);
3614 	if (status < 0)
3615 		goto error;
3616 	status = set_pre_saw(state, &state->m_dvbt_pre_saw_cfg);
3617 	if (status < 0)
3618 		goto error;
3619 
3620 	/* Halt SCU to enable safe non-atomic accesses */
3621 	status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_HOLD);
3622 	if (status < 0)
3623 		goto error;
3624 
3625 	status = set_agc_rf(state, &state->m_dvbt_rf_agc_cfg, true);
3626 	if (status < 0)
3627 		goto error;
3628 	status = set_agc_if(state, &state->m_dvbt_if_agc_cfg, true);
3629 	if (status < 0)
3630 		goto error;
3631 
3632 	/* Set Noise Estimation notch width and enable DC fix */
3633 	status = read16(state, OFDM_SC_RA_RAM_CONFIG__A, &data);
3634 	if (status < 0)
3635 		goto error;
3636 	data |= OFDM_SC_RA_RAM_CONFIG_NE_FIX_ENABLE__M;
3637 	status = write16(state, OFDM_SC_RA_RAM_CONFIG__A, data);
3638 	if (status < 0)
3639 		goto error;
3640 
3641 	/* Activate SCU to enable SCU commands */
3642 	status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE);
3643 	if (status < 0)
3644 		goto error;
3645 
3646 	if (!state->m_drxk_a3_rom_code) {
3647 		/* AGCInit() is not done for DVBT, so set agcfast_clip_ctrl_delay  */
3648 		status = write16(state, SCU_RAM_AGC_FAST_CLP_CTRL_DELAY__A,
3649 				 state->m_dvbt_if_agc_cfg.fast_clip_ctrl_delay);
3650 		if (status < 0)
3651 			goto error;
3652 	}
3653 
3654 	/* OFDM_SC setup */
3655 #ifdef COMPILE_FOR_NONRT
3656 	status = write16(state, OFDM_SC_RA_RAM_BE_OPT_DELAY__A, 1);
3657 	if (status < 0)
3658 		goto error;
3659 	status = write16(state, OFDM_SC_RA_RAM_BE_OPT_INIT_DELAY__A, 2);
3660 	if (status < 0)
3661 		goto error;
3662 #endif
3663 
3664 	/* FEC setup */
3665 	status = write16(state, FEC_DI_INPUT_CTL__A, 1);	/* OFDM input */
3666 	if (status < 0)
3667 		goto error;
3668 
3669 
3670 #ifdef COMPILE_FOR_NONRT
3671 	status = write16(state, FEC_RS_MEASUREMENT_PERIOD__A, 0x400);
3672 	if (status < 0)
3673 		goto error;
3674 #else
3675 	status = write16(state, FEC_RS_MEASUREMENT_PERIOD__A, 0x1000);
3676 	if (status < 0)
3677 		goto error;
3678 #endif
3679 	status = write16(state, FEC_RS_MEASUREMENT_PRESCALE__A, 0x0001);
3680 	if (status < 0)
3681 		goto error;
3682 
3683 	/* Setup MPEG bus */
3684 	status = mpegts_dto_setup(state, OM_DVBT);
3685 	if (status < 0)
3686 		goto error;
3687 	/* Set DVBT Presets */
3688 	status = dvbt_activate_presets(state);
3689 	if (status < 0)
3690 		goto error;
3691 
3692 error:
3693 	if (status < 0)
3694 		pr_err("Error %d on %s\n", status, __func__);
3695 	return status;
3696 }
3697 
3698 /*============================================================================*/
3699 /*
3700 * \brief start dvbt demodulating for channel.
3701 * \param demod instance of demodulator.
3702 * \return DRXStatus_t.
3703 */
3704 static int dvbt_start(struct drxk_state *state)
3705 {
3706 	u16 param1;
3707 	int status;
3708 	/* drxk_ofdm_sc_cmd_t scCmd; */
3709 
3710 	dprintk(1, "\n");
3711 	/* start correct processes to get in lock */
3712 	/* DRXK: OFDM_SC_RA_RAM_PROC_LOCKTRACK is no longer in mapfile! */
3713 	param1 = OFDM_SC_RA_RAM_LOCKTRACK_MIN;
3714 	status = dvbt_sc_command(state, OFDM_SC_RA_RAM_CMD_PROC_START, 0,
3715 				 OFDM_SC_RA_RAM_SW_EVENT_RUN_NMASK__M, param1,
3716 				 0, 0, 0);
3717 	if (status < 0)
3718 		goto error;
3719 	/* start FEC OC */
3720 	status = mpegts_start(state);
3721 	if (status < 0)
3722 		goto error;
3723 	status = write16(state, FEC_COMM_EXEC__A, FEC_COMM_EXEC_ACTIVE);
3724 	if (status < 0)
3725 		goto error;
3726 error:
3727 	if (status < 0)
3728 		pr_err("Error %d on %s\n", status, __func__);
3729 	return status;
3730 }
3731 
3732 
3733 /*============================================================================*/
3734 
3735 /*
3736 * \brief Set up dvbt demodulator for channel.
3737 * \param demod instance of demodulator.
3738 * \return DRXStatus_t.
3739 * // original DVBTSetChannel()
3740 */
3741 static int set_dvbt(struct drxk_state *state, u16 intermediate_freqk_hz,
3742 		   s32 tuner_freq_offset)
3743 {
3744 	u16 cmd_result = 0;
3745 	u16 transmission_params = 0;
3746 	u16 operation_mode = 0;
3747 	u32 iqm_rc_rate_ofs = 0;
3748 	u32 bandwidth = 0;
3749 	u16 param1;
3750 	int status;
3751 
3752 	dprintk(1, "IF =%d, TFO = %d\n",
3753 		intermediate_freqk_hz, tuner_freq_offset);
3754 
3755 	status = scu_command(state, SCU_RAM_COMMAND_STANDARD_OFDM
3756 			    | SCU_RAM_COMMAND_CMD_DEMOD_STOP,
3757 			    0, NULL, 1, &cmd_result);
3758 	if (status < 0)
3759 		goto error;
3760 
3761 	/* Halt SCU to enable safe non-atomic accesses */
3762 	status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_HOLD);
3763 	if (status < 0)
3764 		goto error;
3765 
3766 	/* Stop processors */
3767 	status = write16(state, OFDM_SC_COMM_EXEC__A, OFDM_SC_COMM_EXEC_STOP);
3768 	if (status < 0)
3769 		goto error;
3770 	status = write16(state, OFDM_LC_COMM_EXEC__A, OFDM_LC_COMM_EXEC_STOP);
3771 	if (status < 0)
3772 		goto error;
3773 
3774 	/* Mandatory fix, always stop CP, required to set spl offset back to
3775 		hardware default (is set to 0 by ucode during pilot detection */
3776 	status = write16(state, OFDM_CP_COMM_EXEC__A, OFDM_CP_COMM_EXEC_STOP);
3777 	if (status < 0)
3778 		goto error;
3779 
3780 	/*== Write channel settings to device ================================*/
3781 
3782 	/* mode */
3783 	switch (state->props.transmission_mode) {
3784 	case TRANSMISSION_MODE_AUTO:
3785 	default:
3786 		operation_mode |= OFDM_SC_RA_RAM_OP_AUTO_MODE__M;
3787 		/* try first guess DRX_FFTMODE_8K */
3788 		/* fall through */
3789 	case TRANSMISSION_MODE_8K:
3790 		transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_MODE_8K;
3791 		break;
3792 	case TRANSMISSION_MODE_2K:
3793 		transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_MODE_2K;
3794 		break;
3795 	}
3796 
3797 	/* guard */
3798 	switch (state->props.guard_interval) {
3799 	default:
3800 	case GUARD_INTERVAL_AUTO:
3801 		operation_mode |= OFDM_SC_RA_RAM_OP_AUTO_GUARD__M;
3802 		/* try first guess DRX_GUARD_1DIV4 */
3803 		/* fall through */
3804 	case GUARD_INTERVAL_1_4:
3805 		transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_GUARD_4;
3806 		break;
3807 	case GUARD_INTERVAL_1_32:
3808 		transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_GUARD_32;
3809 		break;
3810 	case GUARD_INTERVAL_1_16:
3811 		transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_GUARD_16;
3812 		break;
3813 	case GUARD_INTERVAL_1_8:
3814 		transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_GUARD_8;
3815 		break;
3816 	}
3817 
3818 	/* hierarchy */
3819 	switch (state->props.hierarchy) {
3820 	case HIERARCHY_AUTO:
3821 	case HIERARCHY_NONE:
3822 	default:
3823 		operation_mode |= OFDM_SC_RA_RAM_OP_AUTO_HIER__M;
3824 		/* try first guess SC_RA_RAM_OP_PARAM_HIER_NO */
3825 		/* transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_HIER_NO; */
3826 		/* fall through */
3827 	case HIERARCHY_1:
3828 		transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_HIER_A1;
3829 		break;
3830 	case HIERARCHY_2:
3831 		transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_HIER_A2;
3832 		break;
3833 	case HIERARCHY_4:
3834 		transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_HIER_A4;
3835 		break;
3836 	}
3837 
3838 
3839 	/* modulation */
3840 	switch (state->props.modulation) {
3841 	case QAM_AUTO:
3842 	default:
3843 		operation_mode |= OFDM_SC_RA_RAM_OP_AUTO_CONST__M;
3844 		/* try first guess DRX_CONSTELLATION_QAM64 */
3845 		/* fall through */
3846 	case QAM_64:
3847 		transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_CONST_QAM64;
3848 		break;
3849 	case QPSK:
3850 		transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_CONST_QPSK;
3851 		break;
3852 	case QAM_16:
3853 		transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_CONST_QAM16;
3854 		break;
3855 	}
3856 #if 0
3857 	/* No hierarchical channels support in BDA */
3858 	/* Priority (only for hierarchical channels) */
3859 	switch (channel->priority) {
3860 	case DRX_PRIORITY_LOW:
3861 		transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_PRIO_LO;
3862 		WR16(dev_addr, OFDM_EC_SB_PRIOR__A,
3863 			OFDM_EC_SB_PRIOR_LO);
3864 		break;
3865 	case DRX_PRIORITY_HIGH:
3866 		transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_PRIO_HI;
3867 		WR16(dev_addr, OFDM_EC_SB_PRIOR__A,
3868 			OFDM_EC_SB_PRIOR_HI));
3869 		break;
3870 	case DRX_PRIORITY_UNKNOWN:	/* fall through */
3871 	default:
3872 		status = -EINVAL;
3873 		goto error;
3874 	}
3875 #else
3876 	/* Set Priorty high */
3877 	transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_PRIO_HI;
3878 	status = write16(state, OFDM_EC_SB_PRIOR__A, OFDM_EC_SB_PRIOR_HI);
3879 	if (status < 0)
3880 		goto error;
3881 #endif
3882 
3883 	/* coderate */
3884 	switch (state->props.code_rate_HP) {
3885 	case FEC_AUTO:
3886 	default:
3887 		operation_mode |= OFDM_SC_RA_RAM_OP_AUTO_RATE__M;
3888 		/* try first guess DRX_CODERATE_2DIV3 */
3889 		/* fall through */
3890 	case FEC_2_3:
3891 		transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_RATE_2_3;
3892 		break;
3893 	case FEC_1_2:
3894 		transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_RATE_1_2;
3895 		break;
3896 	case FEC_3_4:
3897 		transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_RATE_3_4;
3898 		break;
3899 	case FEC_5_6:
3900 		transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_RATE_5_6;
3901 		break;
3902 	case FEC_7_8:
3903 		transmission_params |= OFDM_SC_RA_RAM_OP_PARAM_RATE_7_8;
3904 		break;
3905 	}
3906 
3907 	/*
3908 	 * SAW filter selection: normaly not necesarry, but if wanted
3909 	 * the application can select a SAW filter via the driver by
3910 	 * using UIOs
3911 	 */
3912 
3913 	/* First determine real bandwidth (Hz) */
3914 	/* Also set delay for impulse noise cruncher */
3915 	/*
3916 	 * Also set parameters for EC_OC fix, note EC_OC_REG_TMD_HIL_MAR is
3917 	 * changed by SC for fix for some 8K,1/8 guard but is restored by
3918 	 * InitEC and ResetEC functions
3919 	 */
3920 	switch (state->props.bandwidth_hz) {
3921 	case 0:
3922 		state->props.bandwidth_hz = 8000000;
3923 		/* fall through */
3924 	case 8000000:
3925 		bandwidth = DRXK_BANDWIDTH_8MHZ_IN_HZ;
3926 		status = write16(state, OFDM_SC_RA_RAM_SRMM_FIX_FACT_8K__A,
3927 				 3052);
3928 		if (status < 0)
3929 			goto error;
3930 		/* cochannel protection for PAL 8 MHz */
3931 		status = write16(state, OFDM_SC_RA_RAM_NI_INIT_8K_PER_LEFT__A,
3932 				 7);
3933 		if (status < 0)
3934 			goto error;
3935 		status = write16(state, OFDM_SC_RA_RAM_NI_INIT_8K_PER_RIGHT__A,
3936 				 7);
3937 		if (status < 0)
3938 			goto error;
3939 		status = write16(state, OFDM_SC_RA_RAM_NI_INIT_2K_PER_LEFT__A,
3940 				 7);
3941 		if (status < 0)
3942 			goto error;
3943 		status = write16(state, OFDM_SC_RA_RAM_NI_INIT_2K_PER_RIGHT__A,
3944 				 1);
3945 		if (status < 0)
3946 			goto error;
3947 		break;
3948 	case 7000000:
3949 		bandwidth = DRXK_BANDWIDTH_7MHZ_IN_HZ;
3950 		status = write16(state, OFDM_SC_RA_RAM_SRMM_FIX_FACT_8K__A,
3951 				 3491);
3952 		if (status < 0)
3953 			goto error;
3954 		/* cochannel protection for PAL 7 MHz */
3955 		status = write16(state, OFDM_SC_RA_RAM_NI_INIT_8K_PER_LEFT__A,
3956 				 8);
3957 		if (status < 0)
3958 			goto error;
3959 		status = write16(state, OFDM_SC_RA_RAM_NI_INIT_8K_PER_RIGHT__A,
3960 				 8);
3961 		if (status < 0)
3962 			goto error;
3963 		status = write16(state, OFDM_SC_RA_RAM_NI_INIT_2K_PER_LEFT__A,
3964 				 4);
3965 		if (status < 0)
3966 			goto error;
3967 		status = write16(state, OFDM_SC_RA_RAM_NI_INIT_2K_PER_RIGHT__A,
3968 				 1);
3969 		if (status < 0)
3970 			goto error;
3971 		break;
3972 	case 6000000:
3973 		bandwidth = DRXK_BANDWIDTH_6MHZ_IN_HZ;
3974 		status = write16(state, OFDM_SC_RA_RAM_SRMM_FIX_FACT_8K__A,
3975 				 4073);
3976 		if (status < 0)
3977 			goto error;
3978 		/* cochannel protection for NTSC 6 MHz */
3979 		status = write16(state, OFDM_SC_RA_RAM_NI_INIT_8K_PER_LEFT__A,
3980 				 19);
3981 		if (status < 0)
3982 			goto error;
3983 		status = write16(state, OFDM_SC_RA_RAM_NI_INIT_8K_PER_RIGHT__A,
3984 				 19);
3985 		if (status < 0)
3986 			goto error;
3987 		status = write16(state, OFDM_SC_RA_RAM_NI_INIT_2K_PER_LEFT__A,
3988 				 14);
3989 		if (status < 0)
3990 			goto error;
3991 		status = write16(state, OFDM_SC_RA_RAM_NI_INIT_2K_PER_RIGHT__A,
3992 				 1);
3993 		if (status < 0)
3994 			goto error;
3995 		break;
3996 	default:
3997 		status = -EINVAL;
3998 		goto error;
3999 	}
4000 
4001 	if (iqm_rc_rate_ofs == 0) {
4002 		/* Now compute IQM_RC_RATE_OFS
4003 			(((SysFreq/BandWidth)/2)/2) -1) * 2^23)
4004 			=>
4005 			((SysFreq / BandWidth) * (2^21)) - (2^23)
4006 			*/
4007 		/* (SysFreq / BandWidth) * (2^28)  */
4008 		/*
4009 		 * assert (MAX(sysClk)/MIN(bandwidth) < 16)
4010 		 *	=> assert(MAX(sysClk) < 16*MIN(bandwidth))
4011 		 *	=> assert(109714272 > 48000000) = true
4012 		 * so Frac 28 can be used
4013 		 */
4014 		iqm_rc_rate_ofs = Frac28a((u32)
4015 					((state->m_sys_clock_freq *
4016 						1000) / 3), bandwidth);
4017 		/* (SysFreq / BandWidth) * (2^21), rounding before truncating */
4018 		if ((iqm_rc_rate_ofs & 0x7fL) >= 0x40)
4019 			iqm_rc_rate_ofs += 0x80L;
4020 		iqm_rc_rate_ofs = iqm_rc_rate_ofs >> 7;
4021 		/* ((SysFreq / BandWidth) * (2^21)) - (2^23)  */
4022 		iqm_rc_rate_ofs = iqm_rc_rate_ofs - (1 << 23);
4023 	}
4024 
4025 	iqm_rc_rate_ofs &=
4026 		((((u32) IQM_RC_RATE_OFS_HI__M) <<
4027 		IQM_RC_RATE_OFS_LO__W) | IQM_RC_RATE_OFS_LO__M);
4028 	status = write32(state, IQM_RC_RATE_OFS_LO__A, iqm_rc_rate_ofs);
4029 	if (status < 0)
4030 		goto error;
4031 
4032 	/* Bandwidth setting done */
4033 
4034 #if 0
4035 	status = dvbt_set_frequency_shift(demod, channel, tuner_offset);
4036 	if (status < 0)
4037 		goto error;
4038 #endif
4039 	status = set_frequency_shifter(state, intermediate_freqk_hz,
4040 				       tuner_freq_offset, true);
4041 	if (status < 0)
4042 		goto error;
4043 
4044 	/*== start SC, write channel settings to SC ==========================*/
4045 
4046 	/* Activate SCU to enable SCU commands */
4047 	status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE);
4048 	if (status < 0)
4049 		goto error;
4050 
4051 	/* Enable SC after setting all other parameters */
4052 	status = write16(state, OFDM_SC_COMM_STATE__A, 0);
4053 	if (status < 0)
4054 		goto error;
4055 	status = write16(state, OFDM_SC_COMM_EXEC__A, 1);
4056 	if (status < 0)
4057 		goto error;
4058 
4059 
4060 	status = scu_command(state, SCU_RAM_COMMAND_STANDARD_OFDM
4061 			     | SCU_RAM_COMMAND_CMD_DEMOD_START,
4062 			     0, NULL, 1, &cmd_result);
4063 	if (status < 0)
4064 		goto error;
4065 
4066 	/* Write SC parameter registers, set all AUTO flags in operation mode */
4067 	param1 = (OFDM_SC_RA_RAM_OP_AUTO_MODE__M |
4068 			OFDM_SC_RA_RAM_OP_AUTO_GUARD__M |
4069 			OFDM_SC_RA_RAM_OP_AUTO_CONST__M |
4070 			OFDM_SC_RA_RAM_OP_AUTO_HIER__M |
4071 			OFDM_SC_RA_RAM_OP_AUTO_RATE__M);
4072 	status = dvbt_sc_command(state, OFDM_SC_RA_RAM_CMD_SET_PREF_PARAM,
4073 				0, transmission_params, param1, 0, 0, 0);
4074 	if (status < 0)
4075 		goto error;
4076 
4077 	if (!state->m_drxk_a3_rom_code)
4078 		status = dvbt_ctrl_set_sqi_speed(state, &state->m_sqi_speed);
4079 error:
4080 	if (status < 0)
4081 		pr_err("Error %d on %s\n", status, __func__);
4082 
4083 	return status;
4084 }
4085 
4086 
4087 /*============================================================================*/
4088 
4089 /*
4090 * \brief Retrieve lock status .
4091 * \param demod    Pointer to demodulator instance.
4092 * \param lockStat Pointer to lock status structure.
4093 * \return DRXStatus_t.
4094 *
4095 */
4096 static int get_dvbt_lock_status(struct drxk_state *state, u32 *p_lock_status)
4097 {
4098 	int status;
4099 	const u16 mpeg_lock_mask = (OFDM_SC_RA_RAM_LOCK_MPEG__M |
4100 				    OFDM_SC_RA_RAM_LOCK_FEC__M);
4101 	const u16 fec_lock_mask = (OFDM_SC_RA_RAM_LOCK_FEC__M);
4102 	const u16 demod_lock_mask = OFDM_SC_RA_RAM_LOCK_DEMOD__M;
4103 
4104 	u16 sc_ra_ram_lock = 0;
4105 	u16 sc_comm_exec = 0;
4106 
4107 	dprintk(1, "\n");
4108 
4109 	*p_lock_status = NOT_LOCKED;
4110 	/* driver 0.9.0 */
4111 	/* Check if SC is running */
4112 	status = read16(state, OFDM_SC_COMM_EXEC__A, &sc_comm_exec);
4113 	if (status < 0)
4114 		goto end;
4115 	if (sc_comm_exec == OFDM_SC_COMM_EXEC_STOP)
4116 		goto end;
4117 
4118 	status = read16(state, OFDM_SC_RA_RAM_LOCK__A, &sc_ra_ram_lock);
4119 	if (status < 0)
4120 		goto end;
4121 
4122 	if ((sc_ra_ram_lock & mpeg_lock_mask) == mpeg_lock_mask)
4123 		*p_lock_status = MPEG_LOCK;
4124 	else if ((sc_ra_ram_lock & fec_lock_mask) == fec_lock_mask)
4125 		*p_lock_status = FEC_LOCK;
4126 	else if ((sc_ra_ram_lock & demod_lock_mask) == demod_lock_mask)
4127 		*p_lock_status = DEMOD_LOCK;
4128 	else if (sc_ra_ram_lock & OFDM_SC_RA_RAM_LOCK_NODVBT__M)
4129 		*p_lock_status = NEVER_LOCK;
4130 end:
4131 	if (status < 0)
4132 		pr_err("Error %d on %s\n", status, __func__);
4133 
4134 	return status;
4135 }
4136 
4137 static int power_up_qam(struct drxk_state *state)
4138 {
4139 	enum drx_power_mode power_mode = DRXK_POWER_DOWN_OFDM;
4140 	int status;
4141 
4142 	dprintk(1, "\n");
4143 	status = ctrl_power_mode(state, &power_mode);
4144 	if (status < 0)
4145 		pr_err("Error %d on %s\n", status, __func__);
4146 
4147 	return status;
4148 }
4149 
4150 
4151 /* Power Down QAM */
4152 static int power_down_qam(struct drxk_state *state)
4153 {
4154 	u16 data = 0;
4155 	u16 cmd_result;
4156 	int status = 0;
4157 
4158 	dprintk(1, "\n");
4159 	status = read16(state, SCU_COMM_EXEC__A, &data);
4160 	if (status < 0)
4161 		goto error;
4162 	if (data == SCU_COMM_EXEC_ACTIVE) {
4163 		/*
4164 			STOP demodulator
4165 			QAM and HW blocks
4166 			*/
4167 		/* stop all comstate->m_exec */
4168 		status = write16(state, QAM_COMM_EXEC__A, QAM_COMM_EXEC_STOP);
4169 		if (status < 0)
4170 			goto error;
4171 		status = scu_command(state, SCU_RAM_COMMAND_STANDARD_QAM
4172 				     | SCU_RAM_COMMAND_CMD_DEMOD_STOP,
4173 				     0, NULL, 1, &cmd_result);
4174 		if (status < 0)
4175 			goto error;
4176 	}
4177 	/* powerdown AFE                   */
4178 	status = set_iqm_af(state, false);
4179 
4180 error:
4181 	if (status < 0)
4182 		pr_err("Error %d on %s\n", status, __func__);
4183 
4184 	return status;
4185 }
4186 
4187 /*============================================================================*/
4188 
4189 /*
4190 * \brief Setup of the QAM Measurement intervals for signal quality
4191 * \param demod instance of demod.
4192 * \param modulation current modulation.
4193 * \return DRXStatus_t.
4194 *
4195 *  NOTE:
4196 *  Take into account that for certain settings the errorcounters can overflow.
4197 *  The implementation does not check this.
4198 *
4199 */
4200 static int set_qam_measurement(struct drxk_state *state,
4201 			     enum e_drxk_constellation modulation,
4202 			     u32 symbol_rate)
4203 {
4204 	u32 fec_bits_desired = 0;	/* BER accounting period */
4205 	u32 fec_rs_period_total = 0;	/* Total period */
4206 	u16 fec_rs_prescale = 0;	/* ReedSolomon Measurement Prescale */
4207 	u16 fec_rs_period = 0;	/* Value for corresponding I2C register */
4208 	int status = 0;
4209 
4210 	dprintk(1, "\n");
4211 
4212 	fec_rs_prescale = 1;
4213 	/* fec_bits_desired = symbol_rate [kHz] *
4214 		FrameLenght [ms] *
4215 		(modulation + 1) *
4216 		SyncLoss (== 1) *
4217 		ViterbiLoss (==1)
4218 		*/
4219 	switch (modulation) {
4220 	case DRX_CONSTELLATION_QAM16:
4221 		fec_bits_desired = 4 * symbol_rate;
4222 		break;
4223 	case DRX_CONSTELLATION_QAM32:
4224 		fec_bits_desired = 5 * symbol_rate;
4225 		break;
4226 	case DRX_CONSTELLATION_QAM64:
4227 		fec_bits_desired = 6 * symbol_rate;
4228 		break;
4229 	case DRX_CONSTELLATION_QAM128:
4230 		fec_bits_desired = 7 * symbol_rate;
4231 		break;
4232 	case DRX_CONSTELLATION_QAM256:
4233 		fec_bits_desired = 8 * symbol_rate;
4234 		break;
4235 	default:
4236 		status = -EINVAL;
4237 	}
4238 	if (status < 0)
4239 		goto error;
4240 
4241 	fec_bits_desired /= 1000;	/* symbol_rate [Hz] -> symbol_rate [kHz] */
4242 	fec_bits_desired *= 500;	/* meas. period [ms] */
4243 
4244 	/* Annex A/C: bits/RsPeriod = 204 * 8 = 1632 */
4245 	/* fec_rs_period_total = fec_bits_desired / 1632 */
4246 	fec_rs_period_total = (fec_bits_desired / 1632UL) + 1;	/* roughly ceil */
4247 
4248 	/* fec_rs_period_total =  fec_rs_prescale * fec_rs_period  */
4249 	fec_rs_prescale = 1 + (u16) (fec_rs_period_total >> 16);
4250 	if (fec_rs_prescale == 0) {
4251 		/* Divide by zero (though impossible) */
4252 		status = -EINVAL;
4253 		if (status < 0)
4254 			goto error;
4255 	}
4256 	fec_rs_period =
4257 		((u16) fec_rs_period_total +
4258 		(fec_rs_prescale >> 1)) / fec_rs_prescale;
4259 
4260 	/* write corresponding registers */
4261 	status = write16(state, FEC_RS_MEASUREMENT_PERIOD__A, fec_rs_period);
4262 	if (status < 0)
4263 		goto error;
4264 	status = write16(state, FEC_RS_MEASUREMENT_PRESCALE__A,
4265 			 fec_rs_prescale);
4266 	if (status < 0)
4267 		goto error;
4268 	status = write16(state, FEC_OC_SNC_FAIL_PERIOD__A, fec_rs_period);
4269 error:
4270 	if (status < 0)
4271 		pr_err("Error %d on %s\n", status, __func__);
4272 	return status;
4273 }
4274 
4275 static int set_qam16(struct drxk_state *state)
4276 {
4277 	int status = 0;
4278 
4279 	dprintk(1, "\n");
4280 	/* QAM Equalizer Setup */
4281 	/* Equalizer */
4282 	status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD0__A, 13517);
4283 	if (status < 0)
4284 		goto error;
4285 	status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD1__A, 13517);
4286 	if (status < 0)
4287 		goto error;
4288 	status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD2__A, 13517);
4289 	if (status < 0)
4290 		goto error;
4291 	status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD3__A, 13517);
4292 	if (status < 0)
4293 		goto error;
4294 	status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD4__A, 13517);
4295 	if (status < 0)
4296 		goto error;
4297 	status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD5__A, 13517);
4298 	if (status < 0)
4299 		goto error;
4300 	/* Decision Feedback Equalizer */
4301 	status = write16(state, QAM_DQ_QUAL_FUN0__A, 2);
4302 	if (status < 0)
4303 		goto error;
4304 	status = write16(state, QAM_DQ_QUAL_FUN1__A, 2);
4305 	if (status < 0)
4306 		goto error;
4307 	status = write16(state, QAM_DQ_QUAL_FUN2__A, 2);
4308 	if (status < 0)
4309 		goto error;
4310 	status = write16(state, QAM_DQ_QUAL_FUN3__A, 2);
4311 	if (status < 0)
4312 		goto error;
4313 	status = write16(state, QAM_DQ_QUAL_FUN4__A, 2);
4314 	if (status < 0)
4315 		goto error;
4316 	status = write16(state, QAM_DQ_QUAL_FUN5__A, 0);
4317 	if (status < 0)
4318 		goto error;
4319 
4320 	status = write16(state, QAM_SY_SYNC_HWM__A, 5);
4321 	if (status < 0)
4322 		goto error;
4323 	status = write16(state, QAM_SY_SYNC_AWM__A, 4);
4324 	if (status < 0)
4325 		goto error;
4326 	status = write16(state, QAM_SY_SYNC_LWM__A, 3);
4327 	if (status < 0)
4328 		goto error;
4329 
4330 	/* QAM Slicer Settings */
4331 	status = write16(state, SCU_RAM_QAM_SL_SIG_POWER__A,
4332 			 DRXK_QAM_SL_SIG_POWER_QAM16);
4333 	if (status < 0)
4334 		goto error;
4335 
4336 	/* QAM Loop Controller Coeficients */
4337 	status = write16(state, SCU_RAM_QAM_LC_CA_FINE__A, 15);
4338 	if (status < 0)
4339 		goto error;
4340 	status = write16(state, SCU_RAM_QAM_LC_CA_COARSE__A, 40);
4341 	if (status < 0)
4342 		goto error;
4343 	status = write16(state, SCU_RAM_QAM_LC_EP_FINE__A, 12);
4344 	if (status < 0)
4345 		goto error;
4346 	status = write16(state, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24);
4347 	if (status < 0)
4348 		goto error;
4349 	status = write16(state, SCU_RAM_QAM_LC_EP_COARSE__A, 24);
4350 	if (status < 0)
4351 		goto error;
4352 	status = write16(state, SCU_RAM_QAM_LC_EI_FINE__A, 12);
4353 	if (status < 0)
4354 		goto error;
4355 	status = write16(state, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16);
4356 	if (status < 0)
4357 		goto error;
4358 	status = write16(state, SCU_RAM_QAM_LC_EI_COARSE__A, 16);
4359 	if (status < 0)
4360 		goto error;
4361 
4362 	status = write16(state, SCU_RAM_QAM_LC_CP_FINE__A, 5);
4363 	if (status < 0)
4364 		goto error;
4365 	status = write16(state, SCU_RAM_QAM_LC_CP_MEDIUM__A, 20);
4366 	if (status < 0)
4367 		goto error;
4368 	status = write16(state, SCU_RAM_QAM_LC_CP_COARSE__A, 80);
4369 	if (status < 0)
4370 		goto error;
4371 	status = write16(state, SCU_RAM_QAM_LC_CI_FINE__A, 5);
4372 	if (status < 0)
4373 		goto error;
4374 	status = write16(state, SCU_RAM_QAM_LC_CI_MEDIUM__A, 20);
4375 	if (status < 0)
4376 		goto error;
4377 	status = write16(state, SCU_RAM_QAM_LC_CI_COARSE__A, 50);
4378 	if (status < 0)
4379 		goto error;
4380 	status = write16(state, SCU_RAM_QAM_LC_CF_FINE__A, 16);
4381 	if (status < 0)
4382 		goto error;
4383 	status = write16(state, SCU_RAM_QAM_LC_CF_MEDIUM__A, 16);
4384 	if (status < 0)
4385 		goto error;
4386 	status = write16(state, SCU_RAM_QAM_LC_CF_COARSE__A, 32);
4387 	if (status < 0)
4388 		goto error;
4389 	status = write16(state, SCU_RAM_QAM_LC_CF1_FINE__A, 5);
4390 	if (status < 0)
4391 		goto error;
4392 	status = write16(state, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 10);
4393 	if (status < 0)
4394 		goto error;
4395 	status = write16(state, SCU_RAM_QAM_LC_CF1_COARSE__A, 10);
4396 	if (status < 0)
4397 		goto error;
4398 
4399 
4400 	/* QAM State Machine (FSM) Thresholds */
4401 
4402 	status = write16(state, SCU_RAM_QAM_FSM_RTH__A, 140);
4403 	if (status < 0)
4404 		goto error;
4405 	status = write16(state, SCU_RAM_QAM_FSM_FTH__A, 50);
4406 	if (status < 0)
4407 		goto error;
4408 	status = write16(state, SCU_RAM_QAM_FSM_CTH__A, 95);
4409 	if (status < 0)
4410 		goto error;
4411 	status = write16(state, SCU_RAM_QAM_FSM_PTH__A, 120);
4412 	if (status < 0)
4413 		goto error;
4414 	status = write16(state, SCU_RAM_QAM_FSM_QTH__A, 230);
4415 	if (status < 0)
4416 		goto error;
4417 	status = write16(state, SCU_RAM_QAM_FSM_MTH__A, 105);
4418 	if (status < 0)
4419 		goto error;
4420 
4421 	status = write16(state, SCU_RAM_QAM_FSM_RATE_LIM__A, 40);
4422 	if (status < 0)
4423 		goto error;
4424 	status = write16(state, SCU_RAM_QAM_FSM_COUNT_LIM__A, 4);
4425 	if (status < 0)
4426 		goto error;
4427 	status = write16(state, SCU_RAM_QAM_FSM_FREQ_LIM__A, 24);
4428 	if (status < 0)
4429 		goto error;
4430 
4431 
4432 	/* QAM FSM Tracking Parameters */
4433 
4434 	status = write16(state, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, (u16) 16);
4435 	if (status < 0)
4436 		goto error;
4437 	status = write16(state, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, (u16) 220);
4438 	if (status < 0)
4439 		goto error;
4440 	status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, (u16) 25);
4441 	if (status < 0)
4442 		goto error;
4443 	status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, (u16) 6);
4444 	if (status < 0)
4445 		goto error;
4446 	status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16) -24);
4447 	if (status < 0)
4448 		goto error;
4449 	status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16) -65);
4450 	if (status < 0)
4451 		goto error;
4452 	status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16) -127);
4453 	if (status < 0)
4454 		goto error;
4455 
4456 error:
4457 	if (status < 0)
4458 		pr_err("Error %d on %s\n", status, __func__);
4459 	return status;
4460 }
4461 
4462 /*============================================================================*/
4463 
4464 /*
4465 * \brief QAM32 specific setup
4466 * \param demod instance of demod.
4467 * \return DRXStatus_t.
4468 */
4469 static int set_qam32(struct drxk_state *state)
4470 {
4471 	int status = 0;
4472 
4473 	dprintk(1, "\n");
4474 
4475 	/* QAM Equalizer Setup */
4476 	/* Equalizer */
4477 	status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD0__A, 6707);
4478 	if (status < 0)
4479 		goto error;
4480 	status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD1__A, 6707);
4481 	if (status < 0)
4482 		goto error;
4483 	status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD2__A, 6707);
4484 	if (status < 0)
4485 		goto error;
4486 	status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD3__A, 6707);
4487 	if (status < 0)
4488 		goto error;
4489 	status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD4__A, 6707);
4490 	if (status < 0)
4491 		goto error;
4492 	status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD5__A, 6707);
4493 	if (status < 0)
4494 		goto error;
4495 
4496 	/* Decision Feedback Equalizer */
4497 	status = write16(state, QAM_DQ_QUAL_FUN0__A, 3);
4498 	if (status < 0)
4499 		goto error;
4500 	status = write16(state, QAM_DQ_QUAL_FUN1__A, 3);
4501 	if (status < 0)
4502 		goto error;
4503 	status = write16(state, QAM_DQ_QUAL_FUN2__A, 3);
4504 	if (status < 0)
4505 		goto error;
4506 	status = write16(state, QAM_DQ_QUAL_FUN3__A, 3);
4507 	if (status < 0)
4508 		goto error;
4509 	status = write16(state, QAM_DQ_QUAL_FUN4__A, 3);
4510 	if (status < 0)
4511 		goto error;
4512 	status = write16(state, QAM_DQ_QUAL_FUN5__A, 0);
4513 	if (status < 0)
4514 		goto error;
4515 
4516 	status = write16(state, QAM_SY_SYNC_HWM__A, 6);
4517 	if (status < 0)
4518 		goto error;
4519 	status = write16(state, QAM_SY_SYNC_AWM__A, 5);
4520 	if (status < 0)
4521 		goto error;
4522 	status = write16(state, QAM_SY_SYNC_LWM__A, 3);
4523 	if (status < 0)
4524 		goto error;
4525 
4526 	/* QAM Slicer Settings */
4527 
4528 	status = write16(state, SCU_RAM_QAM_SL_SIG_POWER__A,
4529 			 DRXK_QAM_SL_SIG_POWER_QAM32);
4530 	if (status < 0)
4531 		goto error;
4532 
4533 
4534 	/* QAM Loop Controller Coeficients */
4535 
4536 	status = write16(state, SCU_RAM_QAM_LC_CA_FINE__A, 15);
4537 	if (status < 0)
4538 		goto error;
4539 	status = write16(state, SCU_RAM_QAM_LC_CA_COARSE__A, 40);
4540 	if (status < 0)
4541 		goto error;
4542 	status = write16(state, SCU_RAM_QAM_LC_EP_FINE__A, 12);
4543 	if (status < 0)
4544 		goto error;
4545 	status = write16(state, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24);
4546 	if (status < 0)
4547 		goto error;
4548 	status = write16(state, SCU_RAM_QAM_LC_EP_COARSE__A, 24);
4549 	if (status < 0)
4550 		goto error;
4551 	status = write16(state, SCU_RAM_QAM_LC_EI_FINE__A, 12);
4552 	if (status < 0)
4553 		goto error;
4554 	status = write16(state, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16);
4555 	if (status < 0)
4556 		goto error;
4557 	status = write16(state, SCU_RAM_QAM_LC_EI_COARSE__A, 16);
4558 	if (status < 0)
4559 		goto error;
4560 
4561 	status = write16(state, SCU_RAM_QAM_LC_CP_FINE__A, 5);
4562 	if (status < 0)
4563 		goto error;
4564 	status = write16(state, SCU_RAM_QAM_LC_CP_MEDIUM__A, 20);
4565 	if (status < 0)
4566 		goto error;
4567 	status = write16(state, SCU_RAM_QAM_LC_CP_COARSE__A, 80);
4568 	if (status < 0)
4569 		goto error;
4570 	status = write16(state, SCU_RAM_QAM_LC_CI_FINE__A, 5);
4571 	if (status < 0)
4572 		goto error;
4573 	status = write16(state, SCU_RAM_QAM_LC_CI_MEDIUM__A, 20);
4574 	if (status < 0)
4575 		goto error;
4576 	status = write16(state, SCU_RAM_QAM_LC_CI_COARSE__A, 50);
4577 	if (status < 0)
4578 		goto error;
4579 	status = write16(state, SCU_RAM_QAM_LC_CF_FINE__A, 16);
4580 	if (status < 0)
4581 		goto error;
4582 	status = write16(state, SCU_RAM_QAM_LC_CF_MEDIUM__A, 16);
4583 	if (status < 0)
4584 		goto error;
4585 	status = write16(state, SCU_RAM_QAM_LC_CF_COARSE__A, 16);
4586 	if (status < 0)
4587 		goto error;
4588 	status = write16(state, SCU_RAM_QAM_LC_CF1_FINE__A, 5);
4589 	if (status < 0)
4590 		goto error;
4591 	status = write16(state, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 10);
4592 	if (status < 0)
4593 		goto error;
4594 	status = write16(state, SCU_RAM_QAM_LC_CF1_COARSE__A, 0);
4595 	if (status < 0)
4596 		goto error;
4597 
4598 
4599 	/* QAM State Machine (FSM) Thresholds */
4600 
4601 	status = write16(state, SCU_RAM_QAM_FSM_RTH__A, 90);
4602 	if (status < 0)
4603 		goto error;
4604 	status = write16(state, SCU_RAM_QAM_FSM_FTH__A, 50);
4605 	if (status < 0)
4606 		goto error;
4607 	status = write16(state, SCU_RAM_QAM_FSM_CTH__A, 80);
4608 	if (status < 0)
4609 		goto error;
4610 	status = write16(state, SCU_RAM_QAM_FSM_PTH__A, 100);
4611 	if (status < 0)
4612 		goto error;
4613 	status = write16(state, SCU_RAM_QAM_FSM_QTH__A, 170);
4614 	if (status < 0)
4615 		goto error;
4616 	status = write16(state, SCU_RAM_QAM_FSM_MTH__A, 100);
4617 	if (status < 0)
4618 		goto error;
4619 
4620 	status = write16(state, SCU_RAM_QAM_FSM_RATE_LIM__A, 40);
4621 	if (status < 0)
4622 		goto error;
4623 	status = write16(state, SCU_RAM_QAM_FSM_COUNT_LIM__A, 4);
4624 	if (status < 0)
4625 		goto error;
4626 	status = write16(state, SCU_RAM_QAM_FSM_FREQ_LIM__A, 10);
4627 	if (status < 0)
4628 		goto error;
4629 
4630 
4631 	/* QAM FSM Tracking Parameters */
4632 
4633 	status = write16(state, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, (u16) 12);
4634 	if (status < 0)
4635 		goto error;
4636 	status = write16(state, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, (u16) 140);
4637 	if (status < 0)
4638 		goto error;
4639 	status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, (u16) -8);
4640 	if (status < 0)
4641 		goto error;
4642 	status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, (u16) -16);
4643 	if (status < 0)
4644 		goto error;
4645 	status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16) -26);
4646 	if (status < 0)
4647 		goto error;
4648 	status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16) -56);
4649 	if (status < 0)
4650 		goto error;
4651 	status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16) -86);
4652 error:
4653 	if (status < 0)
4654 		pr_err("Error %d on %s\n", status, __func__);
4655 	return status;
4656 }
4657 
4658 /*============================================================================*/
4659 
4660 /*
4661 * \brief QAM64 specific setup
4662 * \param demod instance of demod.
4663 * \return DRXStatus_t.
4664 */
4665 static int set_qam64(struct drxk_state *state)
4666 {
4667 	int status = 0;
4668 
4669 	dprintk(1, "\n");
4670 	/* QAM Equalizer Setup */
4671 	/* Equalizer */
4672 	status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD0__A, 13336);
4673 	if (status < 0)
4674 		goto error;
4675 	status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD1__A, 12618);
4676 	if (status < 0)
4677 		goto error;
4678 	status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD2__A, 11988);
4679 	if (status < 0)
4680 		goto error;
4681 	status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD3__A, 13809);
4682 	if (status < 0)
4683 		goto error;
4684 	status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD4__A, 13809);
4685 	if (status < 0)
4686 		goto error;
4687 	status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD5__A, 15609);
4688 	if (status < 0)
4689 		goto error;
4690 
4691 	/* Decision Feedback Equalizer */
4692 	status = write16(state, QAM_DQ_QUAL_FUN0__A, 4);
4693 	if (status < 0)
4694 		goto error;
4695 	status = write16(state, QAM_DQ_QUAL_FUN1__A, 4);
4696 	if (status < 0)
4697 		goto error;
4698 	status = write16(state, QAM_DQ_QUAL_FUN2__A, 4);
4699 	if (status < 0)
4700 		goto error;
4701 	status = write16(state, QAM_DQ_QUAL_FUN3__A, 4);
4702 	if (status < 0)
4703 		goto error;
4704 	status = write16(state, QAM_DQ_QUAL_FUN4__A, 3);
4705 	if (status < 0)
4706 		goto error;
4707 	status = write16(state, QAM_DQ_QUAL_FUN5__A, 0);
4708 	if (status < 0)
4709 		goto error;
4710 
4711 	status = write16(state, QAM_SY_SYNC_HWM__A, 5);
4712 	if (status < 0)
4713 		goto error;
4714 	status = write16(state, QAM_SY_SYNC_AWM__A, 4);
4715 	if (status < 0)
4716 		goto error;
4717 	status = write16(state, QAM_SY_SYNC_LWM__A, 3);
4718 	if (status < 0)
4719 		goto error;
4720 
4721 	/* QAM Slicer Settings */
4722 	status = write16(state, SCU_RAM_QAM_SL_SIG_POWER__A,
4723 			 DRXK_QAM_SL_SIG_POWER_QAM64);
4724 	if (status < 0)
4725 		goto error;
4726 
4727 
4728 	/* QAM Loop Controller Coeficients */
4729 
4730 	status = write16(state, SCU_RAM_QAM_LC_CA_FINE__A, 15);
4731 	if (status < 0)
4732 		goto error;
4733 	status = write16(state, SCU_RAM_QAM_LC_CA_COARSE__A, 40);
4734 	if (status < 0)
4735 		goto error;
4736 	status = write16(state, SCU_RAM_QAM_LC_EP_FINE__A, 12);
4737 	if (status < 0)
4738 		goto error;
4739 	status = write16(state, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24);
4740 	if (status < 0)
4741 		goto error;
4742 	status = write16(state, SCU_RAM_QAM_LC_EP_COARSE__A, 24);
4743 	if (status < 0)
4744 		goto error;
4745 	status = write16(state, SCU_RAM_QAM_LC_EI_FINE__A, 12);
4746 	if (status < 0)
4747 		goto error;
4748 	status = write16(state, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16);
4749 	if (status < 0)
4750 		goto error;
4751 	status = write16(state, SCU_RAM_QAM_LC_EI_COARSE__A, 16);
4752 	if (status < 0)
4753 		goto error;
4754 
4755 	status = write16(state, SCU_RAM_QAM_LC_CP_FINE__A, 5);
4756 	if (status < 0)
4757 		goto error;
4758 	status = write16(state, SCU_RAM_QAM_LC_CP_MEDIUM__A, 30);
4759 	if (status < 0)
4760 		goto error;
4761 	status = write16(state, SCU_RAM_QAM_LC_CP_COARSE__A, 100);
4762 	if (status < 0)
4763 		goto error;
4764 	status = write16(state, SCU_RAM_QAM_LC_CI_FINE__A, 5);
4765 	if (status < 0)
4766 		goto error;
4767 	status = write16(state, SCU_RAM_QAM_LC_CI_MEDIUM__A, 30);
4768 	if (status < 0)
4769 		goto error;
4770 	status = write16(state, SCU_RAM_QAM_LC_CI_COARSE__A, 50);
4771 	if (status < 0)
4772 		goto error;
4773 	status = write16(state, SCU_RAM_QAM_LC_CF_FINE__A, 16);
4774 	if (status < 0)
4775 		goto error;
4776 	status = write16(state, SCU_RAM_QAM_LC_CF_MEDIUM__A, 25);
4777 	if (status < 0)
4778 		goto error;
4779 	status = write16(state, SCU_RAM_QAM_LC_CF_COARSE__A, 48);
4780 	if (status < 0)
4781 		goto error;
4782 	status = write16(state, SCU_RAM_QAM_LC_CF1_FINE__A, 5);
4783 	if (status < 0)
4784 		goto error;
4785 	status = write16(state, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 10);
4786 	if (status < 0)
4787 		goto error;
4788 	status = write16(state, SCU_RAM_QAM_LC_CF1_COARSE__A, 10);
4789 	if (status < 0)
4790 		goto error;
4791 
4792 
4793 	/* QAM State Machine (FSM) Thresholds */
4794 
4795 	status = write16(state, SCU_RAM_QAM_FSM_RTH__A, 100);
4796 	if (status < 0)
4797 		goto error;
4798 	status = write16(state, SCU_RAM_QAM_FSM_FTH__A, 60);
4799 	if (status < 0)
4800 		goto error;
4801 	status = write16(state, SCU_RAM_QAM_FSM_CTH__A, 80);
4802 	if (status < 0)
4803 		goto error;
4804 	status = write16(state, SCU_RAM_QAM_FSM_PTH__A, 110);
4805 	if (status < 0)
4806 		goto error;
4807 	status = write16(state, SCU_RAM_QAM_FSM_QTH__A, 200);
4808 	if (status < 0)
4809 		goto error;
4810 	status = write16(state, SCU_RAM_QAM_FSM_MTH__A, 95);
4811 	if (status < 0)
4812 		goto error;
4813 
4814 	status = write16(state, SCU_RAM_QAM_FSM_RATE_LIM__A, 40);
4815 	if (status < 0)
4816 		goto error;
4817 	status = write16(state, SCU_RAM_QAM_FSM_COUNT_LIM__A, 4);
4818 	if (status < 0)
4819 		goto error;
4820 	status = write16(state, SCU_RAM_QAM_FSM_FREQ_LIM__A, 15);
4821 	if (status < 0)
4822 		goto error;
4823 
4824 
4825 	/* QAM FSM Tracking Parameters */
4826 
4827 	status = write16(state, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, (u16) 12);
4828 	if (status < 0)
4829 		goto error;
4830 	status = write16(state, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, (u16) 141);
4831 	if (status < 0)
4832 		goto error;
4833 	status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, (u16) 7);
4834 	if (status < 0)
4835 		goto error;
4836 	status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, (u16) 0);
4837 	if (status < 0)
4838 		goto error;
4839 	status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16) -15);
4840 	if (status < 0)
4841 		goto error;
4842 	status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16) -45);
4843 	if (status < 0)
4844 		goto error;
4845 	status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16) -80);
4846 error:
4847 	if (status < 0)
4848 		pr_err("Error %d on %s\n", status, __func__);
4849 
4850 	return status;
4851 }
4852 
4853 /*============================================================================*/
4854 
4855 /*
4856 * \brief QAM128 specific setup
4857 * \param demod: instance of demod.
4858 * \return DRXStatus_t.
4859 */
4860 static int set_qam128(struct drxk_state *state)
4861 {
4862 	int status = 0;
4863 
4864 	dprintk(1, "\n");
4865 	/* QAM Equalizer Setup */
4866 	/* Equalizer */
4867 	status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD0__A, 6564);
4868 	if (status < 0)
4869 		goto error;
4870 	status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD1__A, 6598);
4871 	if (status < 0)
4872 		goto error;
4873 	status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD2__A, 6394);
4874 	if (status < 0)
4875 		goto error;
4876 	status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD3__A, 6409);
4877 	if (status < 0)
4878 		goto error;
4879 	status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD4__A, 6656);
4880 	if (status < 0)
4881 		goto error;
4882 	status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD5__A, 7238);
4883 	if (status < 0)
4884 		goto error;
4885 
4886 	/* Decision Feedback Equalizer */
4887 	status = write16(state, QAM_DQ_QUAL_FUN0__A, 6);
4888 	if (status < 0)
4889 		goto error;
4890 	status = write16(state, QAM_DQ_QUAL_FUN1__A, 6);
4891 	if (status < 0)
4892 		goto error;
4893 	status = write16(state, QAM_DQ_QUAL_FUN2__A, 6);
4894 	if (status < 0)
4895 		goto error;
4896 	status = write16(state, QAM_DQ_QUAL_FUN3__A, 6);
4897 	if (status < 0)
4898 		goto error;
4899 	status = write16(state, QAM_DQ_QUAL_FUN4__A, 5);
4900 	if (status < 0)
4901 		goto error;
4902 	status = write16(state, QAM_DQ_QUAL_FUN5__A, 0);
4903 	if (status < 0)
4904 		goto error;
4905 
4906 	status = write16(state, QAM_SY_SYNC_HWM__A, 6);
4907 	if (status < 0)
4908 		goto error;
4909 	status = write16(state, QAM_SY_SYNC_AWM__A, 5);
4910 	if (status < 0)
4911 		goto error;
4912 	status = write16(state, QAM_SY_SYNC_LWM__A, 3);
4913 	if (status < 0)
4914 		goto error;
4915 
4916 
4917 	/* QAM Slicer Settings */
4918 
4919 	status = write16(state, SCU_RAM_QAM_SL_SIG_POWER__A,
4920 			 DRXK_QAM_SL_SIG_POWER_QAM128);
4921 	if (status < 0)
4922 		goto error;
4923 
4924 
4925 	/* QAM Loop Controller Coeficients */
4926 
4927 	status = write16(state, SCU_RAM_QAM_LC_CA_FINE__A, 15);
4928 	if (status < 0)
4929 		goto error;
4930 	status = write16(state, SCU_RAM_QAM_LC_CA_COARSE__A, 40);
4931 	if (status < 0)
4932 		goto error;
4933 	status = write16(state, SCU_RAM_QAM_LC_EP_FINE__A, 12);
4934 	if (status < 0)
4935 		goto error;
4936 	status = write16(state, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24);
4937 	if (status < 0)
4938 		goto error;
4939 	status = write16(state, SCU_RAM_QAM_LC_EP_COARSE__A, 24);
4940 	if (status < 0)
4941 		goto error;
4942 	status = write16(state, SCU_RAM_QAM_LC_EI_FINE__A, 12);
4943 	if (status < 0)
4944 		goto error;
4945 	status = write16(state, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16);
4946 	if (status < 0)
4947 		goto error;
4948 	status = write16(state, SCU_RAM_QAM_LC_EI_COARSE__A, 16);
4949 	if (status < 0)
4950 		goto error;
4951 
4952 	status = write16(state, SCU_RAM_QAM_LC_CP_FINE__A, 5);
4953 	if (status < 0)
4954 		goto error;
4955 	status = write16(state, SCU_RAM_QAM_LC_CP_MEDIUM__A, 40);
4956 	if (status < 0)
4957 		goto error;
4958 	status = write16(state, SCU_RAM_QAM_LC_CP_COARSE__A, 120);
4959 	if (status < 0)
4960 		goto error;
4961 	status = write16(state, SCU_RAM_QAM_LC_CI_FINE__A, 5);
4962 	if (status < 0)
4963 		goto error;
4964 	status = write16(state, SCU_RAM_QAM_LC_CI_MEDIUM__A, 40);
4965 	if (status < 0)
4966 		goto error;
4967 	status = write16(state, SCU_RAM_QAM_LC_CI_COARSE__A, 60);
4968 	if (status < 0)
4969 		goto error;
4970 	status = write16(state, SCU_RAM_QAM_LC_CF_FINE__A, 16);
4971 	if (status < 0)
4972 		goto error;
4973 	status = write16(state, SCU_RAM_QAM_LC_CF_MEDIUM__A, 25);
4974 	if (status < 0)
4975 		goto error;
4976 	status = write16(state, SCU_RAM_QAM_LC_CF_COARSE__A, 64);
4977 	if (status < 0)
4978 		goto error;
4979 	status = write16(state, SCU_RAM_QAM_LC_CF1_FINE__A, 5);
4980 	if (status < 0)
4981 		goto error;
4982 	status = write16(state, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 10);
4983 	if (status < 0)
4984 		goto error;
4985 	status = write16(state, SCU_RAM_QAM_LC_CF1_COARSE__A, 0);
4986 	if (status < 0)
4987 		goto error;
4988 
4989 
4990 	/* QAM State Machine (FSM) Thresholds */
4991 
4992 	status = write16(state, SCU_RAM_QAM_FSM_RTH__A, 50);
4993 	if (status < 0)
4994 		goto error;
4995 	status = write16(state, SCU_RAM_QAM_FSM_FTH__A, 60);
4996 	if (status < 0)
4997 		goto error;
4998 	status = write16(state, SCU_RAM_QAM_FSM_CTH__A, 80);
4999 	if (status < 0)
5000 		goto error;
5001 	status = write16(state, SCU_RAM_QAM_FSM_PTH__A, 100);
5002 	if (status < 0)
5003 		goto error;
5004 	status = write16(state, SCU_RAM_QAM_FSM_QTH__A, 140);
5005 	if (status < 0)
5006 		goto error;
5007 	status = write16(state, SCU_RAM_QAM_FSM_MTH__A, 100);
5008 	if (status < 0)
5009 		goto error;
5010 
5011 	status = write16(state, SCU_RAM_QAM_FSM_RATE_LIM__A, 40);
5012 	if (status < 0)
5013 		goto error;
5014 	status = write16(state, SCU_RAM_QAM_FSM_COUNT_LIM__A, 5);
5015 	if (status < 0)
5016 		goto error;
5017 
5018 	status = write16(state, SCU_RAM_QAM_FSM_FREQ_LIM__A, 12);
5019 	if (status < 0)
5020 		goto error;
5021 
5022 	/* QAM FSM Tracking Parameters */
5023 
5024 	status = write16(state, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, (u16) 8);
5025 	if (status < 0)
5026 		goto error;
5027 	status = write16(state, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, (u16) 65);
5028 	if (status < 0)
5029 		goto error;
5030 	status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, (u16) 5);
5031 	if (status < 0)
5032 		goto error;
5033 	status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, (u16) 3);
5034 	if (status < 0)
5035 		goto error;
5036 	status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16) -1);
5037 	if (status < 0)
5038 		goto error;
5039 	status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16) -12);
5040 	if (status < 0)
5041 		goto error;
5042 	status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16) -23);
5043 error:
5044 	if (status < 0)
5045 		pr_err("Error %d on %s\n", status, __func__);
5046 
5047 	return status;
5048 }
5049 
5050 /*============================================================================*/
5051 
5052 /*
5053 * \brief QAM256 specific setup
5054 * \param demod: instance of demod.
5055 * \return DRXStatus_t.
5056 */
5057 static int set_qam256(struct drxk_state *state)
5058 {
5059 	int status = 0;
5060 
5061 	dprintk(1, "\n");
5062 	/* QAM Equalizer Setup */
5063 	/* Equalizer */
5064 	status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD0__A, 11502);
5065 	if (status < 0)
5066 		goto error;
5067 	status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD1__A, 12084);
5068 	if (status < 0)
5069 		goto error;
5070 	status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD2__A, 12543);
5071 	if (status < 0)
5072 		goto error;
5073 	status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD3__A, 12931);
5074 	if (status < 0)
5075 		goto error;
5076 	status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD4__A, 13629);
5077 	if (status < 0)
5078 		goto error;
5079 	status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD5__A, 15385);
5080 	if (status < 0)
5081 		goto error;
5082 
5083 	/* Decision Feedback Equalizer */
5084 	status = write16(state, QAM_DQ_QUAL_FUN0__A, 8);
5085 	if (status < 0)
5086 		goto error;
5087 	status = write16(state, QAM_DQ_QUAL_FUN1__A, 8);
5088 	if (status < 0)
5089 		goto error;
5090 	status = write16(state, QAM_DQ_QUAL_FUN2__A, 8);
5091 	if (status < 0)
5092 		goto error;
5093 	status = write16(state, QAM_DQ_QUAL_FUN3__A, 8);
5094 	if (status < 0)
5095 		goto error;
5096 	status = write16(state, QAM_DQ_QUAL_FUN4__A, 6);
5097 	if (status < 0)
5098 		goto error;
5099 	status = write16(state, QAM_DQ_QUAL_FUN5__A, 0);
5100 	if (status < 0)
5101 		goto error;
5102 
5103 	status = write16(state, QAM_SY_SYNC_HWM__A, 5);
5104 	if (status < 0)
5105 		goto error;
5106 	status = write16(state, QAM_SY_SYNC_AWM__A, 4);
5107 	if (status < 0)
5108 		goto error;
5109 	status = write16(state, QAM_SY_SYNC_LWM__A, 3);
5110 	if (status < 0)
5111 		goto error;
5112 
5113 	/* QAM Slicer Settings */
5114 
5115 	status = write16(state, SCU_RAM_QAM_SL_SIG_POWER__A,
5116 			 DRXK_QAM_SL_SIG_POWER_QAM256);
5117 	if (status < 0)
5118 		goto error;
5119 
5120 
5121 	/* QAM Loop Controller Coeficients */
5122 
5123 	status = write16(state, SCU_RAM_QAM_LC_CA_FINE__A, 15);
5124 	if (status < 0)
5125 		goto error;
5126 	status = write16(state, SCU_RAM_QAM_LC_CA_COARSE__A, 40);
5127 	if (status < 0)
5128 		goto error;
5129 	status = write16(state, SCU_RAM_QAM_LC_EP_FINE__A, 12);
5130 	if (status < 0)
5131 		goto error;
5132 	status = write16(state, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24);
5133 	if (status < 0)
5134 		goto error;
5135 	status = write16(state, SCU_RAM_QAM_LC_EP_COARSE__A, 24);
5136 	if (status < 0)
5137 		goto error;
5138 	status = write16(state, SCU_RAM_QAM_LC_EI_FINE__A, 12);
5139 	if (status < 0)
5140 		goto error;
5141 	status = write16(state, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16);
5142 	if (status < 0)
5143 		goto error;
5144 	status = write16(state, SCU_RAM_QAM_LC_EI_COARSE__A, 16);
5145 	if (status < 0)
5146 		goto error;
5147 
5148 	status = write16(state, SCU_RAM_QAM_LC_CP_FINE__A, 5);
5149 	if (status < 0)
5150 		goto error;
5151 	status = write16(state, SCU_RAM_QAM_LC_CP_MEDIUM__A, 50);
5152 	if (status < 0)
5153 		goto error;
5154 	status = write16(state, SCU_RAM_QAM_LC_CP_COARSE__A, 250);
5155 	if (status < 0)
5156 		goto error;
5157 	status = write16(state, SCU_RAM_QAM_LC_CI_FINE__A, 5);
5158 	if (status < 0)
5159 		goto error;
5160 	status = write16(state, SCU_RAM_QAM_LC_CI_MEDIUM__A, 50);
5161 	if (status < 0)
5162 		goto error;
5163 	status = write16(state, SCU_RAM_QAM_LC_CI_COARSE__A, 125);
5164 	if (status < 0)
5165 		goto error;
5166 	status = write16(state, SCU_RAM_QAM_LC_CF_FINE__A, 16);
5167 	if (status < 0)
5168 		goto error;
5169 	status = write16(state, SCU_RAM_QAM_LC_CF_MEDIUM__A, 25);
5170 	if (status < 0)
5171 		goto error;
5172 	status = write16(state, SCU_RAM_QAM_LC_CF_COARSE__A, 48);
5173 	if (status < 0)
5174 		goto error;
5175 	status = write16(state, SCU_RAM_QAM_LC_CF1_FINE__A, 5);
5176 	if (status < 0)
5177 		goto error;
5178 	status = write16(state, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 10);
5179 	if (status < 0)
5180 		goto error;
5181 	status = write16(state, SCU_RAM_QAM_LC_CF1_COARSE__A, 10);
5182 	if (status < 0)
5183 		goto error;
5184 
5185 
5186 	/* QAM State Machine (FSM) Thresholds */
5187 
5188 	status = write16(state, SCU_RAM_QAM_FSM_RTH__A, 50);
5189 	if (status < 0)
5190 		goto error;
5191 	status = write16(state, SCU_RAM_QAM_FSM_FTH__A, 60);
5192 	if (status < 0)
5193 		goto error;
5194 	status = write16(state, SCU_RAM_QAM_FSM_CTH__A, 80);
5195 	if (status < 0)
5196 		goto error;
5197 	status = write16(state, SCU_RAM_QAM_FSM_PTH__A, 100);
5198 	if (status < 0)
5199 		goto error;
5200 	status = write16(state, SCU_RAM_QAM_FSM_QTH__A, 150);
5201 	if (status < 0)
5202 		goto error;
5203 	status = write16(state, SCU_RAM_QAM_FSM_MTH__A, 110);
5204 	if (status < 0)
5205 		goto error;
5206 
5207 	status = write16(state, SCU_RAM_QAM_FSM_RATE_LIM__A, 40);
5208 	if (status < 0)
5209 		goto error;
5210 	status = write16(state, SCU_RAM_QAM_FSM_COUNT_LIM__A, 4);
5211 	if (status < 0)
5212 		goto error;
5213 	status = write16(state, SCU_RAM_QAM_FSM_FREQ_LIM__A, 12);
5214 	if (status < 0)
5215 		goto error;
5216 
5217 
5218 	/* QAM FSM Tracking Parameters */
5219 
5220 	status = write16(state, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, (u16) 8);
5221 	if (status < 0)
5222 		goto error;
5223 	status = write16(state, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, (u16) 74);
5224 	if (status < 0)
5225 		goto error;
5226 	status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, (u16) 18);
5227 	if (status < 0)
5228 		goto error;
5229 	status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, (u16) 13);
5230 	if (status < 0)
5231 		goto error;
5232 	status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16) 7);
5233 	if (status < 0)
5234 		goto error;
5235 	status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16) 0);
5236 	if (status < 0)
5237 		goto error;
5238 	status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16) -8);
5239 error:
5240 	if (status < 0)
5241 		pr_err("Error %d on %s\n", status, __func__);
5242 	return status;
5243 }
5244 
5245 
5246 /*============================================================================*/
5247 /*
5248 * \brief Reset QAM block.
5249 * \param demod:   instance of demod.
5250 * \param channel: pointer to channel data.
5251 * \return DRXStatus_t.
5252 */
5253 static int qam_reset_qam(struct drxk_state *state)
5254 {
5255 	int status;
5256 	u16 cmd_result;
5257 
5258 	dprintk(1, "\n");
5259 	/* Stop QAM comstate->m_exec */
5260 	status = write16(state, QAM_COMM_EXEC__A, QAM_COMM_EXEC_STOP);
5261 	if (status < 0)
5262 		goto error;
5263 
5264 	status = scu_command(state, SCU_RAM_COMMAND_STANDARD_QAM
5265 			     | SCU_RAM_COMMAND_CMD_DEMOD_RESET,
5266 			     0, NULL, 1, &cmd_result);
5267 error:
5268 	if (status < 0)
5269 		pr_err("Error %d on %s\n", status, __func__);
5270 	return status;
5271 }
5272 
5273 /*============================================================================*/
5274 
5275 /*
5276 * \brief Set QAM symbolrate.
5277 * \param demod:   instance of demod.
5278 * \param channel: pointer to channel data.
5279 * \return DRXStatus_t.
5280 */
5281 static int qam_set_symbolrate(struct drxk_state *state)
5282 {
5283 	u32 adc_frequency = 0;
5284 	u32 symb_freq = 0;
5285 	u32 iqm_rc_rate = 0;
5286 	u16 ratesel = 0;
5287 	u32 lc_symb_rate = 0;
5288 	int status;
5289 
5290 	dprintk(1, "\n");
5291 	/* Select & calculate correct IQM rate */
5292 	adc_frequency = (state->m_sys_clock_freq * 1000) / 3;
5293 	ratesel = 0;
5294 	if (state->props.symbol_rate <= 1188750)
5295 		ratesel = 3;
5296 	else if (state->props.symbol_rate <= 2377500)
5297 		ratesel = 2;
5298 	else if (state->props.symbol_rate <= 4755000)
5299 		ratesel = 1;
5300 	status = write16(state, IQM_FD_RATESEL__A, ratesel);
5301 	if (status < 0)
5302 		goto error;
5303 
5304 	/*
5305 		IqmRcRate = ((Fadc / (symbolrate * (4<<ratesel))) - 1) * (1<<23)
5306 		*/
5307 	symb_freq = state->props.symbol_rate * (1 << ratesel);
5308 	if (symb_freq == 0) {
5309 		/* Divide by zero */
5310 		status = -EINVAL;
5311 		goto error;
5312 	}
5313 	iqm_rc_rate = (adc_frequency / symb_freq) * (1 << 21) +
5314 		(Frac28a((adc_frequency % symb_freq), symb_freq) >> 7) -
5315 		(1 << 23);
5316 	status = write32(state, IQM_RC_RATE_OFS_LO__A, iqm_rc_rate);
5317 	if (status < 0)
5318 		goto error;
5319 	state->m_iqm_rc_rate = iqm_rc_rate;
5320 	/*
5321 		LcSymbFreq = round (.125 *  symbolrate / adc_freq * (1<<15))
5322 		*/
5323 	symb_freq = state->props.symbol_rate;
5324 	if (adc_frequency == 0) {
5325 		/* Divide by zero */
5326 		status = -EINVAL;
5327 		goto error;
5328 	}
5329 	lc_symb_rate = (symb_freq / adc_frequency) * (1 << 12) +
5330 		(Frac28a((symb_freq % adc_frequency), adc_frequency) >>
5331 		16);
5332 	if (lc_symb_rate > 511)
5333 		lc_symb_rate = 511;
5334 	status = write16(state, QAM_LC_SYMBOL_FREQ__A, (u16) lc_symb_rate);
5335 
5336 error:
5337 	if (status < 0)
5338 		pr_err("Error %d on %s\n", status, __func__);
5339 	return status;
5340 }
5341 
5342 /*============================================================================*/
5343 
5344 /*
5345 * \brief Get QAM lock status.
5346 * \param demod:   instance of demod.
5347 * \param channel: pointer to channel data.
5348 * \return DRXStatus_t.
5349 */
5350 
5351 static int get_qam_lock_status(struct drxk_state *state, u32 *p_lock_status)
5352 {
5353 	int status;
5354 	u16 result[2] = { 0, 0 };
5355 
5356 	dprintk(1, "\n");
5357 	*p_lock_status = NOT_LOCKED;
5358 	status = scu_command(state,
5359 			SCU_RAM_COMMAND_STANDARD_QAM |
5360 			SCU_RAM_COMMAND_CMD_DEMOD_GET_LOCK, 0, NULL, 2,
5361 			result);
5362 	if (status < 0)
5363 		pr_err("Error %d on %s\n", status, __func__);
5364 
5365 	if (result[1] < SCU_RAM_QAM_LOCKED_LOCKED_DEMOD_LOCKED) {
5366 		/* 0x0000 NOT LOCKED */
5367 	} else if (result[1] < SCU_RAM_QAM_LOCKED_LOCKED_LOCKED) {
5368 		/* 0x4000 DEMOD LOCKED */
5369 		*p_lock_status = DEMOD_LOCK;
5370 	} else if (result[1] < SCU_RAM_QAM_LOCKED_LOCKED_NEVER_LOCK) {
5371 		/* 0x8000 DEMOD + FEC LOCKED (system lock) */
5372 		*p_lock_status = MPEG_LOCK;
5373 	} else {
5374 		/* 0xC000 NEVER LOCKED */
5375 		/* (system will never be able to lock to the signal) */
5376 		/*
5377 		 * TODO: check this, intermediate & standard specific lock
5378 		 * states are not taken into account here
5379 		 */
5380 		*p_lock_status = NEVER_LOCK;
5381 	}
5382 	return status;
5383 }
5384 
5385 #define QAM_MIRROR__M         0x03
5386 #define QAM_MIRROR_NORMAL     0x00
5387 #define QAM_MIRRORED          0x01
5388 #define QAM_MIRROR_AUTO_ON    0x02
5389 #define QAM_LOCKRANGE__M      0x10
5390 #define QAM_LOCKRANGE_NORMAL  0x10
5391 
5392 static int qam_demodulator_command(struct drxk_state *state,
5393 				 int number_of_parameters)
5394 {
5395 	int status;
5396 	u16 cmd_result;
5397 	u16 set_param_parameters[4] = { 0, 0, 0, 0 };
5398 
5399 	set_param_parameters[0] = state->m_constellation;	/* modulation     */
5400 	set_param_parameters[1] = DRXK_QAM_I12_J17;	/* interleave mode   */
5401 
5402 	if (number_of_parameters == 2) {
5403 		u16 set_env_parameters[1] = { 0 };
5404 
5405 		if (state->m_operation_mode == OM_QAM_ITU_C)
5406 			set_env_parameters[0] = QAM_TOP_ANNEX_C;
5407 		else
5408 			set_env_parameters[0] = QAM_TOP_ANNEX_A;
5409 
5410 		status = scu_command(state,
5411 				     SCU_RAM_COMMAND_STANDARD_QAM
5412 				     | SCU_RAM_COMMAND_CMD_DEMOD_SET_ENV,
5413 				     1, set_env_parameters, 1, &cmd_result);
5414 		if (status < 0)
5415 			goto error;
5416 
5417 		status = scu_command(state,
5418 				     SCU_RAM_COMMAND_STANDARD_QAM
5419 				     | SCU_RAM_COMMAND_CMD_DEMOD_SET_PARAM,
5420 				     number_of_parameters, set_param_parameters,
5421 				     1, &cmd_result);
5422 	} else if (number_of_parameters == 4) {
5423 		if (state->m_operation_mode == OM_QAM_ITU_C)
5424 			set_param_parameters[2] = QAM_TOP_ANNEX_C;
5425 		else
5426 			set_param_parameters[2] = QAM_TOP_ANNEX_A;
5427 
5428 		set_param_parameters[3] |= (QAM_MIRROR_AUTO_ON);
5429 		/* Env parameters */
5430 		/* check for LOCKRANGE Extented */
5431 		/* set_param_parameters[3] |= QAM_LOCKRANGE_NORMAL; */
5432 
5433 		status = scu_command(state,
5434 				     SCU_RAM_COMMAND_STANDARD_QAM
5435 				     | SCU_RAM_COMMAND_CMD_DEMOD_SET_PARAM,
5436 				     number_of_parameters, set_param_parameters,
5437 				     1, &cmd_result);
5438 	} else {
5439 		pr_warn("Unknown QAM demodulator parameter count %d\n",
5440 			number_of_parameters);
5441 		status = -EINVAL;
5442 	}
5443 
5444 error:
5445 	if (status < 0)
5446 		pr_warn("Warning %d on %s\n", status, __func__);
5447 	return status;
5448 }
5449 
5450 static int set_qam(struct drxk_state *state, u16 intermediate_freqk_hz,
5451 		  s32 tuner_freq_offset)
5452 {
5453 	int status;
5454 	u16 cmd_result;
5455 	int qam_demod_param_count = state->qam_demod_parameter_count;
5456 
5457 	dprintk(1, "\n");
5458 	/*
5459 	 * STEP 1: reset demodulator
5460 	 *	resets FEC DI and FEC RS
5461 	 *	resets QAM block
5462 	 *	resets SCU variables
5463 	 */
5464 	status = write16(state, FEC_DI_COMM_EXEC__A, FEC_DI_COMM_EXEC_STOP);
5465 	if (status < 0)
5466 		goto error;
5467 	status = write16(state, FEC_RS_COMM_EXEC__A, FEC_RS_COMM_EXEC_STOP);
5468 	if (status < 0)
5469 		goto error;
5470 	status = qam_reset_qam(state);
5471 	if (status < 0)
5472 		goto error;
5473 
5474 	/*
5475 	 * STEP 2: configure demodulator
5476 	 *	-set params; resets IQM,QAM,FEC HW; initializes some
5477 	 *       SCU variables
5478 	 */
5479 	status = qam_set_symbolrate(state);
5480 	if (status < 0)
5481 		goto error;
5482 
5483 	/* Set params */
5484 	switch (state->props.modulation) {
5485 	case QAM_256:
5486 		state->m_constellation = DRX_CONSTELLATION_QAM256;
5487 		break;
5488 	case QAM_AUTO:
5489 	case QAM_64:
5490 		state->m_constellation = DRX_CONSTELLATION_QAM64;
5491 		break;
5492 	case QAM_16:
5493 		state->m_constellation = DRX_CONSTELLATION_QAM16;
5494 		break;
5495 	case QAM_32:
5496 		state->m_constellation = DRX_CONSTELLATION_QAM32;
5497 		break;
5498 	case QAM_128:
5499 		state->m_constellation = DRX_CONSTELLATION_QAM128;
5500 		break;
5501 	default:
5502 		status = -EINVAL;
5503 		break;
5504 	}
5505 	if (status < 0)
5506 		goto error;
5507 
5508 	/* Use the 4-parameter if it's requested or we're probing for
5509 	 * the correct command. */
5510 	if (state->qam_demod_parameter_count == 4
5511 		|| !state->qam_demod_parameter_count) {
5512 		qam_demod_param_count = 4;
5513 		status = qam_demodulator_command(state, qam_demod_param_count);
5514 	}
5515 
5516 	/* Use the 2-parameter command if it was requested or if we're
5517 	 * probing for the correct command and the 4-parameter command
5518 	 * failed. */
5519 	if (state->qam_demod_parameter_count == 2
5520 		|| (!state->qam_demod_parameter_count && status < 0)) {
5521 		qam_demod_param_count = 2;
5522 		status = qam_demodulator_command(state, qam_demod_param_count);
5523 	}
5524 
5525 	if (status < 0) {
5526 		dprintk(1, "Could not set demodulator parameters.\n");
5527 		dprintk(1,
5528 			"Make sure qam_demod_parameter_count (%d) is correct for your firmware (%s).\n",
5529 			state->qam_demod_parameter_count,
5530 			state->microcode_name);
5531 		goto error;
5532 	} else if (!state->qam_demod_parameter_count) {
5533 		dprintk(1,
5534 			"Auto-probing the QAM command parameters was successful - using %d parameters.\n",
5535 			qam_demod_param_count);
5536 
5537 		/*
5538 		 * One of our commands was successful. We don't need to
5539 		 * auto-probe anymore, now that we got the correct command.
5540 		 */
5541 		state->qam_demod_parameter_count = qam_demod_param_count;
5542 	}
5543 
5544 	/*
5545 	 * STEP 3: enable the system in a mode where the ADC provides valid
5546 	 * signal setup modulation independent registers
5547 	 */
5548 #if 0
5549 	status = set_frequency(channel, tuner_freq_offset));
5550 	if (status < 0)
5551 		goto error;
5552 #endif
5553 	status = set_frequency_shifter(state, intermediate_freqk_hz,
5554 				       tuner_freq_offset, true);
5555 	if (status < 0)
5556 		goto error;
5557 
5558 	/* Setup BER measurement */
5559 	status = set_qam_measurement(state, state->m_constellation,
5560 				     state->props.symbol_rate);
5561 	if (status < 0)
5562 		goto error;
5563 
5564 	/* Reset default values */
5565 	status = write16(state, IQM_CF_SCALE_SH__A, IQM_CF_SCALE_SH__PRE);
5566 	if (status < 0)
5567 		goto error;
5568 	status = write16(state, QAM_SY_TIMEOUT__A, QAM_SY_TIMEOUT__PRE);
5569 	if (status < 0)
5570 		goto error;
5571 
5572 	/* Reset default LC values */
5573 	status = write16(state, QAM_LC_RATE_LIMIT__A, 3);
5574 	if (status < 0)
5575 		goto error;
5576 	status = write16(state, QAM_LC_LPF_FACTORP__A, 4);
5577 	if (status < 0)
5578 		goto error;
5579 	status = write16(state, QAM_LC_LPF_FACTORI__A, 4);
5580 	if (status < 0)
5581 		goto error;
5582 	status = write16(state, QAM_LC_MODE__A, 7);
5583 	if (status < 0)
5584 		goto error;
5585 
5586 	status = write16(state, QAM_LC_QUAL_TAB0__A, 1);
5587 	if (status < 0)
5588 		goto error;
5589 	status = write16(state, QAM_LC_QUAL_TAB1__A, 1);
5590 	if (status < 0)
5591 		goto error;
5592 	status = write16(state, QAM_LC_QUAL_TAB2__A, 1);
5593 	if (status < 0)
5594 		goto error;
5595 	status = write16(state, QAM_LC_QUAL_TAB3__A, 1);
5596 	if (status < 0)
5597 		goto error;
5598 	status = write16(state, QAM_LC_QUAL_TAB4__A, 2);
5599 	if (status < 0)
5600 		goto error;
5601 	status = write16(state, QAM_LC_QUAL_TAB5__A, 2);
5602 	if (status < 0)
5603 		goto error;
5604 	status = write16(state, QAM_LC_QUAL_TAB6__A, 2);
5605 	if (status < 0)
5606 		goto error;
5607 	status = write16(state, QAM_LC_QUAL_TAB8__A, 2);
5608 	if (status < 0)
5609 		goto error;
5610 	status = write16(state, QAM_LC_QUAL_TAB9__A, 2);
5611 	if (status < 0)
5612 		goto error;
5613 	status = write16(state, QAM_LC_QUAL_TAB10__A, 2);
5614 	if (status < 0)
5615 		goto error;
5616 	status = write16(state, QAM_LC_QUAL_TAB12__A, 2);
5617 	if (status < 0)
5618 		goto error;
5619 	status = write16(state, QAM_LC_QUAL_TAB15__A, 3);
5620 	if (status < 0)
5621 		goto error;
5622 	status = write16(state, QAM_LC_QUAL_TAB16__A, 3);
5623 	if (status < 0)
5624 		goto error;
5625 	status = write16(state, QAM_LC_QUAL_TAB20__A, 4);
5626 	if (status < 0)
5627 		goto error;
5628 	status = write16(state, QAM_LC_QUAL_TAB25__A, 4);
5629 	if (status < 0)
5630 		goto error;
5631 
5632 	/* Mirroring, QAM-block starting point not inverted */
5633 	status = write16(state, QAM_SY_SP_INV__A,
5634 			 QAM_SY_SP_INV_SPECTRUM_INV_DIS);
5635 	if (status < 0)
5636 		goto error;
5637 
5638 	/* Halt SCU to enable safe non-atomic accesses */
5639 	status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_HOLD);
5640 	if (status < 0)
5641 		goto error;
5642 
5643 	/* STEP 4: modulation specific setup */
5644 	switch (state->props.modulation) {
5645 	case QAM_16:
5646 		status = set_qam16(state);
5647 		break;
5648 	case QAM_32:
5649 		status = set_qam32(state);
5650 		break;
5651 	case QAM_AUTO:
5652 	case QAM_64:
5653 		status = set_qam64(state);
5654 		break;
5655 	case QAM_128:
5656 		status = set_qam128(state);
5657 		break;
5658 	case QAM_256:
5659 		status = set_qam256(state);
5660 		break;
5661 	default:
5662 		status = -EINVAL;
5663 		break;
5664 	}
5665 	if (status < 0)
5666 		goto error;
5667 
5668 	/* Activate SCU to enable SCU commands */
5669 	status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE);
5670 	if (status < 0)
5671 		goto error;
5672 
5673 	/* Re-configure MPEG output, requires knowledge of channel bitrate */
5674 	/* extAttr->currentChannel.modulation = channel->modulation; */
5675 	/* extAttr->currentChannel.symbolrate    = channel->symbolrate; */
5676 	status = mpegts_dto_setup(state, state->m_operation_mode);
5677 	if (status < 0)
5678 		goto error;
5679 
5680 	/* start processes */
5681 	status = mpegts_start(state);
5682 	if (status < 0)
5683 		goto error;
5684 	status = write16(state, FEC_COMM_EXEC__A, FEC_COMM_EXEC_ACTIVE);
5685 	if (status < 0)
5686 		goto error;
5687 	status = write16(state, QAM_COMM_EXEC__A, QAM_COMM_EXEC_ACTIVE);
5688 	if (status < 0)
5689 		goto error;
5690 	status = write16(state, IQM_COMM_EXEC__A, IQM_COMM_EXEC_B_ACTIVE);
5691 	if (status < 0)
5692 		goto error;
5693 
5694 	/* STEP 5: start QAM demodulator (starts FEC, QAM and IQM HW) */
5695 	status = scu_command(state, SCU_RAM_COMMAND_STANDARD_QAM
5696 			     | SCU_RAM_COMMAND_CMD_DEMOD_START,
5697 			     0, NULL, 1, &cmd_result);
5698 	if (status < 0)
5699 		goto error;
5700 
5701 	/* update global DRXK data container */
5702 /*?     extAttr->qamInterleaveMode = DRXK_QAM_I12_J17; */
5703 
5704 error:
5705 	if (status < 0)
5706 		pr_err("Error %d on %s\n", status, __func__);
5707 	return status;
5708 }
5709 
5710 static int set_qam_standard(struct drxk_state *state,
5711 			  enum operation_mode o_mode)
5712 {
5713 	int status;
5714 #ifdef DRXK_QAM_TAPS
5715 #define DRXK_QAMA_TAPS_SELECT
5716 #include "drxk_filters.h"
5717 #undef DRXK_QAMA_TAPS_SELECT
5718 #endif
5719 
5720 	dprintk(1, "\n");
5721 
5722 	/* added antenna switch */
5723 	switch_antenna_to_qam(state);
5724 
5725 	/* Ensure correct power-up mode */
5726 	status = power_up_qam(state);
5727 	if (status < 0)
5728 		goto error;
5729 	/* Reset QAM block */
5730 	status = qam_reset_qam(state);
5731 	if (status < 0)
5732 		goto error;
5733 
5734 	/* Setup IQM */
5735 
5736 	status = write16(state, IQM_COMM_EXEC__A, IQM_COMM_EXEC_B_STOP);
5737 	if (status < 0)
5738 		goto error;
5739 	status = write16(state, IQM_AF_AMUX__A, IQM_AF_AMUX_SIGNAL2ADC);
5740 	if (status < 0)
5741 		goto error;
5742 
5743 	/* Upload IQM Channel Filter settings by
5744 		boot loader from ROM table */
5745 	switch (o_mode) {
5746 	case OM_QAM_ITU_A:
5747 		status = bl_chain_cmd(state, DRXK_BL_ROM_OFFSET_TAPS_ITU_A,
5748 				      DRXK_BLCC_NR_ELEMENTS_TAPS,
5749 			DRXK_BLC_TIMEOUT);
5750 		break;
5751 	case OM_QAM_ITU_C:
5752 		status = bl_direct_cmd(state, IQM_CF_TAP_RE0__A,
5753 				       DRXK_BL_ROM_OFFSET_TAPS_ITU_C,
5754 				       DRXK_BLDC_NR_ELEMENTS_TAPS,
5755 				       DRXK_BLC_TIMEOUT);
5756 		if (status < 0)
5757 			goto error;
5758 		status = bl_direct_cmd(state,
5759 				       IQM_CF_TAP_IM0__A,
5760 				       DRXK_BL_ROM_OFFSET_TAPS_ITU_C,
5761 				       DRXK_BLDC_NR_ELEMENTS_TAPS,
5762 				       DRXK_BLC_TIMEOUT);
5763 		break;
5764 	default:
5765 		status = -EINVAL;
5766 	}
5767 	if (status < 0)
5768 		goto error;
5769 
5770 	status = write16(state, IQM_CF_OUT_ENA__A, 1 << IQM_CF_OUT_ENA_QAM__B);
5771 	if (status < 0)
5772 		goto error;
5773 	status = write16(state, IQM_CF_SYMMETRIC__A, 0);
5774 	if (status < 0)
5775 		goto error;
5776 	status = write16(state, IQM_CF_MIDTAP__A,
5777 		     ((1 << IQM_CF_MIDTAP_RE__B) | (1 << IQM_CF_MIDTAP_IM__B)));
5778 	if (status < 0)
5779 		goto error;
5780 
5781 	status = write16(state, IQM_RC_STRETCH__A, 21);
5782 	if (status < 0)
5783 		goto error;
5784 	status = write16(state, IQM_AF_CLP_LEN__A, 0);
5785 	if (status < 0)
5786 		goto error;
5787 	status = write16(state, IQM_AF_CLP_TH__A, 448);
5788 	if (status < 0)
5789 		goto error;
5790 	status = write16(state, IQM_AF_SNS_LEN__A, 0);
5791 	if (status < 0)
5792 		goto error;
5793 	status = write16(state, IQM_CF_POW_MEAS_LEN__A, 0);
5794 	if (status < 0)
5795 		goto error;
5796 
5797 	status = write16(state, IQM_FS_ADJ_SEL__A, 1);
5798 	if (status < 0)
5799 		goto error;
5800 	status = write16(state, IQM_RC_ADJ_SEL__A, 1);
5801 	if (status < 0)
5802 		goto error;
5803 	status = write16(state, IQM_CF_ADJ_SEL__A, 1);
5804 	if (status < 0)
5805 		goto error;
5806 	status = write16(state, IQM_AF_UPD_SEL__A, 0);
5807 	if (status < 0)
5808 		goto error;
5809 
5810 	/* IQM Impulse Noise Processing Unit */
5811 	status = write16(state, IQM_CF_CLP_VAL__A, 500);
5812 	if (status < 0)
5813 		goto error;
5814 	status = write16(state, IQM_CF_DATATH__A, 1000);
5815 	if (status < 0)
5816 		goto error;
5817 	status = write16(state, IQM_CF_BYPASSDET__A, 1);
5818 	if (status < 0)
5819 		goto error;
5820 	status = write16(state, IQM_CF_DET_LCT__A, 0);
5821 	if (status < 0)
5822 		goto error;
5823 	status = write16(state, IQM_CF_WND_LEN__A, 1);
5824 	if (status < 0)
5825 		goto error;
5826 	status = write16(state, IQM_CF_PKDTH__A, 1);
5827 	if (status < 0)
5828 		goto error;
5829 	status = write16(state, IQM_AF_INC_BYPASS__A, 1);
5830 	if (status < 0)
5831 		goto error;
5832 
5833 	/* turn on IQMAF. Must be done before setAgc**() */
5834 	status = set_iqm_af(state, true);
5835 	if (status < 0)
5836 		goto error;
5837 	status = write16(state, IQM_AF_START_LOCK__A, 0x01);
5838 	if (status < 0)
5839 		goto error;
5840 
5841 	/* IQM will not be reset from here, sync ADC and update/init AGC */
5842 	status = adc_synchronization(state);
5843 	if (status < 0)
5844 		goto error;
5845 
5846 	/* Set the FSM step period */
5847 	status = write16(state, SCU_RAM_QAM_FSM_STEP_PERIOD__A, 2000);
5848 	if (status < 0)
5849 		goto error;
5850 
5851 	/* Halt SCU to enable safe non-atomic accesses */
5852 	status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_HOLD);
5853 	if (status < 0)
5854 		goto error;
5855 
5856 	/* No more resets of the IQM, current standard correctly set =>
5857 		now AGCs can be configured. */
5858 
5859 	status = init_agc(state, true);
5860 	if (status < 0)
5861 		goto error;
5862 	status = set_pre_saw(state, &(state->m_qam_pre_saw_cfg));
5863 	if (status < 0)
5864 		goto error;
5865 
5866 	/* Configure AGC's */
5867 	status = set_agc_rf(state, &(state->m_qam_rf_agc_cfg), true);
5868 	if (status < 0)
5869 		goto error;
5870 	status = set_agc_if(state, &(state->m_qam_if_agc_cfg), true);
5871 	if (status < 0)
5872 		goto error;
5873 
5874 	/* Activate SCU to enable SCU commands */
5875 	status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE);
5876 error:
5877 	if (status < 0)
5878 		pr_err("Error %d on %s\n", status, __func__);
5879 	return status;
5880 }
5881 
5882 static int write_gpio(struct drxk_state *state)
5883 {
5884 	int status;
5885 	u16 value = 0;
5886 
5887 	dprintk(1, "\n");
5888 	/* stop lock indicator process */
5889 	status = write16(state, SCU_RAM_GPIO__A,
5890 			 SCU_RAM_GPIO_HW_LOCK_IND_DISABLE);
5891 	if (status < 0)
5892 		goto error;
5893 
5894 	/*  Write magic word to enable pdr reg write               */
5895 	status = write16(state, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY_KEY);
5896 	if (status < 0)
5897 		goto error;
5898 
5899 	if (state->m_has_sawsw) {
5900 		if (state->uio_mask & 0x0001) { /* UIO-1 */
5901 			/* write to io pad configuration register - output mode */
5902 			status = write16(state, SIO_PDR_SMA_TX_CFG__A,
5903 					 state->m_gpio_cfg);
5904 			if (status < 0)
5905 				goto error;
5906 
5907 			/* use corresponding bit in io data output registar */
5908 			status = read16(state, SIO_PDR_UIO_OUT_LO__A, &value);
5909 			if (status < 0)
5910 				goto error;
5911 			if ((state->m_gpio & 0x0001) == 0)
5912 				value &= 0x7FFF;	/* write zero to 15th bit - 1st UIO */
5913 			else
5914 				value |= 0x8000;	/* write one to 15th bit - 1st UIO */
5915 			/* write back to io data output register */
5916 			status = write16(state, SIO_PDR_UIO_OUT_LO__A, value);
5917 			if (status < 0)
5918 				goto error;
5919 		}
5920 		if (state->uio_mask & 0x0002) { /* UIO-2 */
5921 			/* write to io pad configuration register - output mode */
5922 			status = write16(state, SIO_PDR_SMA_RX_CFG__A,
5923 					 state->m_gpio_cfg);
5924 			if (status < 0)
5925 				goto error;
5926 
5927 			/* use corresponding bit in io data output registar */
5928 			status = read16(state, SIO_PDR_UIO_OUT_LO__A, &value);
5929 			if (status < 0)
5930 				goto error;
5931 			if ((state->m_gpio & 0x0002) == 0)
5932 				value &= 0xBFFF;	/* write zero to 14th bit - 2st UIO */
5933 			else
5934 				value |= 0x4000;	/* write one to 14th bit - 2st UIO */
5935 			/* write back to io data output register */
5936 			status = write16(state, SIO_PDR_UIO_OUT_LO__A, value);
5937 			if (status < 0)
5938 				goto error;
5939 		}
5940 		if (state->uio_mask & 0x0004) { /* UIO-3 */
5941 			/* write to io pad configuration register - output mode */
5942 			status = write16(state, SIO_PDR_GPIO_CFG__A,
5943 					 state->m_gpio_cfg);
5944 			if (status < 0)
5945 				goto error;
5946 
5947 			/* use corresponding bit in io data output registar */
5948 			status = read16(state, SIO_PDR_UIO_OUT_LO__A, &value);
5949 			if (status < 0)
5950 				goto error;
5951 			if ((state->m_gpio & 0x0004) == 0)
5952 				value &= 0xFFFB;            /* write zero to 2nd bit - 3rd UIO */
5953 			else
5954 				value |= 0x0004;            /* write one to 2nd bit - 3rd UIO */
5955 			/* write back to io data output register */
5956 			status = write16(state, SIO_PDR_UIO_OUT_LO__A, value);
5957 			if (status < 0)
5958 				goto error;
5959 		}
5960 	}
5961 	/*  Write magic word to disable pdr reg write               */
5962 	status = write16(state, SIO_TOP_COMM_KEY__A, 0x0000);
5963 error:
5964 	if (status < 0)
5965 		pr_err("Error %d on %s\n", status, __func__);
5966 	return status;
5967 }
5968 
5969 static int switch_antenna_to_qam(struct drxk_state *state)
5970 {
5971 	int status = 0;
5972 	bool gpio_state;
5973 
5974 	dprintk(1, "\n");
5975 
5976 	if (!state->antenna_gpio)
5977 		return 0;
5978 
5979 	gpio_state = state->m_gpio & state->antenna_gpio;
5980 
5981 	if (state->antenna_dvbt ^ gpio_state) {
5982 		/* Antenna is on DVB-T mode. Switch */
5983 		if (state->antenna_dvbt)
5984 			state->m_gpio &= ~state->antenna_gpio;
5985 		else
5986 			state->m_gpio |= state->antenna_gpio;
5987 		status = write_gpio(state);
5988 	}
5989 	if (status < 0)
5990 		pr_err("Error %d on %s\n", status, __func__);
5991 	return status;
5992 }
5993 
5994 static int switch_antenna_to_dvbt(struct drxk_state *state)
5995 {
5996 	int status = 0;
5997 	bool gpio_state;
5998 
5999 	dprintk(1, "\n");
6000 
6001 	if (!state->antenna_gpio)
6002 		return 0;
6003 
6004 	gpio_state = state->m_gpio & state->antenna_gpio;
6005 
6006 	if (!(state->antenna_dvbt ^ gpio_state)) {
6007 		/* Antenna is on DVB-C mode. Switch */
6008 		if (state->antenna_dvbt)
6009 			state->m_gpio |= state->antenna_gpio;
6010 		else
6011 			state->m_gpio &= ~state->antenna_gpio;
6012 		status = write_gpio(state);
6013 	}
6014 	if (status < 0)
6015 		pr_err("Error %d on %s\n", status, __func__);
6016 	return status;
6017 }
6018 
6019 
6020 static int power_down_device(struct drxk_state *state)
6021 {
6022 	/* Power down to requested mode */
6023 	/* Backup some register settings */
6024 	/* Set pins with possible pull-ups connected to them in input mode */
6025 	/* Analog power down */
6026 	/* ADC power down */
6027 	/* Power down device */
6028 	int status;
6029 
6030 	dprintk(1, "\n");
6031 	if (state->m_b_p_down_open_bridge) {
6032 		/* Open I2C bridge before power down of DRXK */
6033 		status = ConfigureI2CBridge(state, true);
6034 		if (status < 0)
6035 			goto error;
6036 	}
6037 	/* driver 0.9.0 */
6038 	status = dvbt_enable_ofdm_token_ring(state, false);
6039 	if (status < 0)
6040 		goto error;
6041 
6042 	status = write16(state, SIO_CC_PWD_MODE__A,
6043 			 SIO_CC_PWD_MODE_LEVEL_CLOCK);
6044 	if (status < 0)
6045 		goto error;
6046 	status = write16(state, SIO_CC_UPDATE__A, SIO_CC_UPDATE_KEY);
6047 	if (status < 0)
6048 		goto error;
6049 	state->m_hi_cfg_ctrl |= SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ;
6050 	status = hi_cfg_command(state);
6051 error:
6052 	if (status < 0)
6053 		pr_err("Error %d on %s\n", status, __func__);
6054 
6055 	return status;
6056 }
6057 
6058 static int init_drxk(struct drxk_state *state)
6059 {
6060 	int status = 0, n = 0;
6061 	enum drx_power_mode power_mode = DRXK_POWER_DOWN_OFDM;
6062 	u16 driver_version;
6063 
6064 	dprintk(1, "\n");
6065 	if (state->m_drxk_state == DRXK_UNINITIALIZED) {
6066 		drxk_i2c_lock(state);
6067 		status = power_up_device(state);
6068 		if (status < 0)
6069 			goto error;
6070 		status = drxx_open(state);
6071 		if (status < 0)
6072 			goto error;
6073 		/* Soft reset of OFDM-, sys- and osc-clockdomain */
6074 		status = write16(state, SIO_CC_SOFT_RST__A,
6075 				 SIO_CC_SOFT_RST_OFDM__M
6076 				 | SIO_CC_SOFT_RST_SYS__M
6077 				 | SIO_CC_SOFT_RST_OSC__M);
6078 		if (status < 0)
6079 			goto error;
6080 		status = write16(state, SIO_CC_UPDATE__A, SIO_CC_UPDATE_KEY);
6081 		if (status < 0)
6082 			goto error;
6083 		/*
6084 		 * TODO is this needed? If yes, how much delay in
6085 		 * worst case scenario
6086 		 */
6087 		usleep_range(1000, 2000);
6088 		state->m_drxk_a3_patch_code = true;
6089 		status = get_device_capabilities(state);
6090 		if (status < 0)
6091 			goto error;
6092 
6093 		/* Bridge delay, uses oscilator clock */
6094 		/* Delay = (delay (nano seconds) * oscclk (kHz))/ 1000 */
6095 		/* SDA brdige delay */
6096 		state->m_hi_cfg_bridge_delay =
6097 			(u16) ((state->m_osc_clock_freq / 1000) *
6098 				HI_I2C_BRIDGE_DELAY) / 1000;
6099 		/* Clipping */
6100 		if (state->m_hi_cfg_bridge_delay >
6101 			SIO_HI_RA_RAM_PAR_3_CFG_DBL_SDA__M) {
6102 			state->m_hi_cfg_bridge_delay =
6103 				SIO_HI_RA_RAM_PAR_3_CFG_DBL_SDA__M;
6104 		}
6105 		/* SCL bridge delay, same as SDA for now */
6106 		state->m_hi_cfg_bridge_delay +=
6107 			state->m_hi_cfg_bridge_delay <<
6108 			SIO_HI_RA_RAM_PAR_3_CFG_DBL_SCL__B;
6109 
6110 		status = init_hi(state);
6111 		if (status < 0)
6112 			goto error;
6113 		/* disable various processes */
6114 #if NOA1ROM
6115 		if (!(state->m_DRXK_A1_ROM_CODE)
6116 			&& !(state->m_DRXK_A2_ROM_CODE))
6117 #endif
6118 		{
6119 			status = write16(state, SCU_RAM_GPIO__A,
6120 					 SCU_RAM_GPIO_HW_LOCK_IND_DISABLE);
6121 			if (status < 0)
6122 				goto error;
6123 		}
6124 
6125 		/* disable MPEG port */
6126 		status = mpegts_disable(state);
6127 		if (status < 0)
6128 			goto error;
6129 
6130 		/* Stop AUD and SCU */
6131 		status = write16(state, AUD_COMM_EXEC__A, AUD_COMM_EXEC_STOP);
6132 		if (status < 0)
6133 			goto error;
6134 		status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_STOP);
6135 		if (status < 0)
6136 			goto error;
6137 
6138 		/* enable token-ring bus through OFDM block for possible ucode upload */
6139 		status = write16(state, SIO_OFDM_SH_OFDM_RING_ENABLE__A,
6140 				 SIO_OFDM_SH_OFDM_RING_ENABLE_ON);
6141 		if (status < 0)
6142 			goto error;
6143 
6144 		/* include boot loader section */
6145 		status = write16(state, SIO_BL_COMM_EXEC__A,
6146 				 SIO_BL_COMM_EXEC_ACTIVE);
6147 		if (status < 0)
6148 			goto error;
6149 		status = bl_chain_cmd(state, 0, 6, 100);
6150 		if (status < 0)
6151 			goto error;
6152 
6153 		if (state->fw) {
6154 			status = download_microcode(state, state->fw->data,
6155 						   state->fw->size);
6156 			if (status < 0)
6157 				goto error;
6158 		}
6159 
6160 		/* disable token-ring bus through OFDM block for possible ucode upload */
6161 		status = write16(state, SIO_OFDM_SH_OFDM_RING_ENABLE__A,
6162 				 SIO_OFDM_SH_OFDM_RING_ENABLE_OFF);
6163 		if (status < 0)
6164 			goto error;
6165 
6166 		/* Run SCU for a little while to initialize microcode version numbers */
6167 		status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE);
6168 		if (status < 0)
6169 			goto error;
6170 		status = drxx_open(state);
6171 		if (status < 0)
6172 			goto error;
6173 		/* added for test */
6174 		msleep(30);
6175 
6176 		power_mode = DRXK_POWER_DOWN_OFDM;
6177 		status = ctrl_power_mode(state, &power_mode);
6178 		if (status < 0)
6179 			goto error;
6180 
6181 		/* Stamp driver version number in SCU data RAM in BCD code
6182 			Done to enable field application engineers to retrieve drxdriver version
6183 			via I2C from SCU RAM.
6184 			Not using SCU command interface for SCU register access since no
6185 			microcode may be present.
6186 			*/
6187 		driver_version =
6188 			(((DRXK_VERSION_MAJOR / 100) % 10) << 12) +
6189 			(((DRXK_VERSION_MAJOR / 10) % 10) << 8) +
6190 			((DRXK_VERSION_MAJOR % 10) << 4) +
6191 			(DRXK_VERSION_MINOR % 10);
6192 		status = write16(state, SCU_RAM_DRIVER_VER_HI__A,
6193 				 driver_version);
6194 		if (status < 0)
6195 			goto error;
6196 		driver_version =
6197 			(((DRXK_VERSION_PATCH / 1000) % 10) << 12) +
6198 			(((DRXK_VERSION_PATCH / 100) % 10) << 8) +
6199 			(((DRXK_VERSION_PATCH / 10) % 10) << 4) +
6200 			(DRXK_VERSION_PATCH % 10);
6201 		status = write16(state, SCU_RAM_DRIVER_VER_LO__A,
6202 				 driver_version);
6203 		if (status < 0)
6204 			goto error;
6205 
6206 		pr_info("DRXK driver version %d.%d.%d\n",
6207 			DRXK_VERSION_MAJOR, DRXK_VERSION_MINOR,
6208 			DRXK_VERSION_PATCH);
6209 
6210 		/*
6211 		 * Dirty fix of default values for ROM/PATCH microcode
6212 		 * Dirty because this fix makes it impossible to setup
6213 		 * suitable values before calling DRX_Open. This solution
6214 		 * requires changes to RF AGC speed to be done via the CTRL
6215 		 * function after calling DRX_Open
6216 		 */
6217 
6218 		/* m_dvbt_rf_agc_cfg.speed = 3; */
6219 
6220 		/* Reset driver debug flags to 0 */
6221 		status = write16(state, SCU_RAM_DRIVER_DEBUG__A, 0);
6222 		if (status < 0)
6223 			goto error;
6224 		/* driver 0.9.0 */
6225 		/* Setup FEC OC:
6226 			NOTE: No more full FEC resets allowed afterwards!! */
6227 		status = write16(state, FEC_COMM_EXEC__A, FEC_COMM_EXEC_STOP);
6228 		if (status < 0)
6229 			goto error;
6230 		/* MPEGTS functions are still the same */
6231 		status = mpegts_dto_init(state);
6232 		if (status < 0)
6233 			goto error;
6234 		status = mpegts_stop(state);
6235 		if (status < 0)
6236 			goto error;
6237 		status = mpegts_configure_polarity(state);
6238 		if (status < 0)
6239 			goto error;
6240 		status = mpegts_configure_pins(state, state->m_enable_mpeg_output);
6241 		if (status < 0)
6242 			goto error;
6243 		/* added: configure GPIO */
6244 		status = write_gpio(state);
6245 		if (status < 0)
6246 			goto error;
6247 
6248 		state->m_drxk_state = DRXK_STOPPED;
6249 
6250 		if (state->m_b_power_down) {
6251 			status = power_down_device(state);
6252 			if (status < 0)
6253 				goto error;
6254 			state->m_drxk_state = DRXK_POWERED_DOWN;
6255 		} else
6256 			state->m_drxk_state = DRXK_STOPPED;
6257 
6258 		/* Initialize the supported delivery systems */
6259 		n = 0;
6260 		if (state->m_has_dvbc) {
6261 			state->frontend.ops.delsys[n++] = SYS_DVBC_ANNEX_A;
6262 			state->frontend.ops.delsys[n++] = SYS_DVBC_ANNEX_C;
6263 			strlcat(state->frontend.ops.info.name, " DVB-C",
6264 				sizeof(state->frontend.ops.info.name));
6265 		}
6266 		if (state->m_has_dvbt) {
6267 			state->frontend.ops.delsys[n++] = SYS_DVBT;
6268 			strlcat(state->frontend.ops.info.name, " DVB-T",
6269 				sizeof(state->frontend.ops.info.name));
6270 		}
6271 		drxk_i2c_unlock(state);
6272 	}
6273 error:
6274 	if (status < 0) {
6275 		state->m_drxk_state = DRXK_NO_DEV;
6276 		drxk_i2c_unlock(state);
6277 		pr_err("Error %d on %s\n", status, __func__);
6278 	}
6279 
6280 	return status;
6281 }
6282 
6283 static void load_firmware_cb(const struct firmware *fw,
6284 			     void *context)
6285 {
6286 	struct drxk_state *state = context;
6287 
6288 	dprintk(1, ": %s\n", fw ? "firmware loaded" : "firmware not loaded");
6289 	if (!fw) {
6290 		pr_err("Could not load firmware file %s.\n",
6291 			state->microcode_name);
6292 		pr_info("Copy %s to your hotplug directory!\n",
6293 			state->microcode_name);
6294 		state->microcode_name = NULL;
6295 
6296 		/*
6297 		 * As firmware is now load asynchronous, it is not possible
6298 		 * anymore to fail at frontend attach. We might silently
6299 		 * return here, and hope that the driver won't crash.
6300 		 * We might also change all DVB callbacks to return -ENODEV
6301 		 * if the device is not initialized.
6302 		 * As the DRX-K devices have their own internal firmware,
6303 		 * let's just hope that it will match a firmware revision
6304 		 * compatible with this driver and proceed.
6305 		 */
6306 	}
6307 	state->fw = fw;
6308 
6309 	init_drxk(state);
6310 }
6311 
6312 static void drxk_release(struct dvb_frontend *fe)
6313 {
6314 	struct drxk_state *state = fe->demodulator_priv;
6315 
6316 	dprintk(1, "\n");
6317 	release_firmware(state->fw);
6318 
6319 	kfree(state);
6320 }
6321 
6322 static int drxk_sleep(struct dvb_frontend *fe)
6323 {
6324 	struct drxk_state *state = fe->demodulator_priv;
6325 
6326 	dprintk(1, "\n");
6327 
6328 	if (state->m_drxk_state == DRXK_NO_DEV)
6329 		return -ENODEV;
6330 	if (state->m_drxk_state == DRXK_UNINITIALIZED)
6331 		return 0;
6332 
6333 	shut_down(state);
6334 	return 0;
6335 }
6336 
6337 static int drxk_gate_ctrl(struct dvb_frontend *fe, int enable)
6338 {
6339 	struct drxk_state *state = fe->demodulator_priv;
6340 
6341 	dprintk(1, ": %s\n", enable ? "enable" : "disable");
6342 
6343 	if (state->m_drxk_state == DRXK_NO_DEV)
6344 		return -ENODEV;
6345 
6346 	return ConfigureI2CBridge(state, enable ? true : false);
6347 }
6348 
6349 static int drxk_set_parameters(struct dvb_frontend *fe)
6350 {
6351 	struct dtv_frontend_properties *p = &fe->dtv_property_cache;
6352 	u32 delsys  = p->delivery_system, old_delsys;
6353 	struct drxk_state *state = fe->demodulator_priv;
6354 	u32 IF;
6355 
6356 	dprintk(1, "\n");
6357 
6358 	if (state->m_drxk_state == DRXK_NO_DEV)
6359 		return -ENODEV;
6360 
6361 	if (state->m_drxk_state == DRXK_UNINITIALIZED)
6362 		return -EAGAIN;
6363 
6364 	if (!fe->ops.tuner_ops.get_if_frequency) {
6365 		pr_err("Error: get_if_frequency() not defined at tuner. Can't work without it!\n");
6366 		return -EINVAL;
6367 	}
6368 
6369 	if (fe->ops.i2c_gate_ctrl)
6370 		fe->ops.i2c_gate_ctrl(fe, 1);
6371 	if (fe->ops.tuner_ops.set_params)
6372 		fe->ops.tuner_ops.set_params(fe);
6373 	if (fe->ops.i2c_gate_ctrl)
6374 		fe->ops.i2c_gate_ctrl(fe, 0);
6375 
6376 	old_delsys = state->props.delivery_system;
6377 	state->props = *p;
6378 
6379 	if (old_delsys != delsys) {
6380 		shut_down(state);
6381 		switch (delsys) {
6382 		case SYS_DVBC_ANNEX_A:
6383 		case SYS_DVBC_ANNEX_C:
6384 			if (!state->m_has_dvbc)
6385 				return -EINVAL;
6386 			state->m_itut_annex_c = (delsys == SYS_DVBC_ANNEX_C) ?
6387 						true : false;
6388 			if (state->m_itut_annex_c)
6389 				setoperation_mode(state, OM_QAM_ITU_C);
6390 			else
6391 				setoperation_mode(state, OM_QAM_ITU_A);
6392 			break;
6393 		case SYS_DVBT:
6394 			if (!state->m_has_dvbt)
6395 				return -EINVAL;
6396 			setoperation_mode(state, OM_DVBT);
6397 			break;
6398 		default:
6399 			return -EINVAL;
6400 		}
6401 	}
6402 
6403 	fe->ops.tuner_ops.get_if_frequency(fe, &IF);
6404 	start(state, 0, IF);
6405 
6406 	/* After set_frontend, stats aren't available */
6407 	p->strength.stat[0].scale = FE_SCALE_RELATIVE;
6408 	p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6409 	p->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6410 	p->block_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6411 	p->pre_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6412 	p->pre_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6413 	p->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6414 	p->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6415 
6416 	/* printk(KERN_DEBUG "drxk: %s IF=%d done\n", __func__, IF); */
6417 
6418 	return 0;
6419 }
6420 
6421 static int get_strength(struct drxk_state *state, u64 *strength)
6422 {
6423 	int status;
6424 	struct s_cfg_agc   rf_agc, if_agc;
6425 	u32          total_gain  = 0;
6426 	u32          atten      = 0;
6427 	u32          agc_range   = 0;
6428 	u16            scu_lvl  = 0;
6429 	u16            scu_coc  = 0;
6430 	/* FIXME: those are part of the tuner presets */
6431 	u16 tuner_rf_gain         = 50; /* Default value on az6007 driver */
6432 	u16 tuner_if_gain         = 40; /* Default value on az6007 driver */
6433 
6434 	*strength = 0;
6435 
6436 	if (is_dvbt(state)) {
6437 		rf_agc = state->m_dvbt_rf_agc_cfg;
6438 		if_agc = state->m_dvbt_if_agc_cfg;
6439 	} else if (is_qam(state)) {
6440 		rf_agc = state->m_qam_rf_agc_cfg;
6441 		if_agc = state->m_qam_if_agc_cfg;
6442 	} else {
6443 		rf_agc = state->m_atv_rf_agc_cfg;
6444 		if_agc = state->m_atv_if_agc_cfg;
6445 	}
6446 
6447 	if (rf_agc.ctrl_mode == DRXK_AGC_CTRL_AUTO) {
6448 		/* SCU output_level */
6449 		status = read16(state, SCU_RAM_AGC_RF_IACCU_HI__A, &scu_lvl);
6450 		if (status < 0)
6451 			return status;
6452 
6453 		/* SCU c.o.c. */
6454 		status = read16(state, SCU_RAM_AGC_RF_IACCU_HI_CO__A, &scu_coc);
6455 		if (status < 0)
6456 			return status;
6457 
6458 		if (((u32) scu_lvl + (u32) scu_coc) < 0xffff)
6459 			rf_agc.output_level = scu_lvl + scu_coc;
6460 		else
6461 			rf_agc.output_level = 0xffff;
6462 
6463 		/* Take RF gain into account */
6464 		total_gain += tuner_rf_gain;
6465 
6466 		/* clip output value */
6467 		if (rf_agc.output_level < rf_agc.min_output_level)
6468 			rf_agc.output_level = rf_agc.min_output_level;
6469 		if (rf_agc.output_level > rf_agc.max_output_level)
6470 			rf_agc.output_level = rf_agc.max_output_level;
6471 
6472 		agc_range = (u32) (rf_agc.max_output_level - rf_agc.min_output_level);
6473 		if (agc_range > 0) {
6474 			atten += 100UL *
6475 				((u32)(tuner_rf_gain)) *
6476 				((u32)(rf_agc.output_level - rf_agc.min_output_level))
6477 				/ agc_range;
6478 		}
6479 	}
6480 
6481 	if (if_agc.ctrl_mode == DRXK_AGC_CTRL_AUTO) {
6482 		status = read16(state, SCU_RAM_AGC_IF_IACCU_HI__A,
6483 				&if_agc.output_level);
6484 		if (status < 0)
6485 			return status;
6486 
6487 		status = read16(state, SCU_RAM_AGC_INGAIN_TGT_MIN__A,
6488 				&if_agc.top);
6489 		if (status < 0)
6490 			return status;
6491 
6492 		/* Take IF gain into account */
6493 		total_gain += (u32) tuner_if_gain;
6494 
6495 		/* clip output value */
6496 		if (if_agc.output_level < if_agc.min_output_level)
6497 			if_agc.output_level = if_agc.min_output_level;
6498 		if (if_agc.output_level > if_agc.max_output_level)
6499 			if_agc.output_level = if_agc.max_output_level;
6500 
6501 		agc_range  = (u32)(if_agc.max_output_level - if_agc.min_output_level);
6502 		if (agc_range > 0) {
6503 			atten += 100UL *
6504 				((u32)(tuner_if_gain)) *
6505 				((u32)(if_agc.output_level - if_agc.min_output_level))
6506 				/ agc_range;
6507 		}
6508 	}
6509 
6510 	/*
6511 	 * Convert to 0..65535 scale.
6512 	 * If it can't be measured (AGC is disabled), just show 100%.
6513 	 */
6514 	if (total_gain > 0)
6515 		*strength = (65535UL * atten / total_gain / 100);
6516 	else
6517 		*strength = 65535;
6518 
6519 	return 0;
6520 }
6521 
6522 static int drxk_get_stats(struct dvb_frontend *fe)
6523 {
6524 	struct dtv_frontend_properties *c = &fe->dtv_property_cache;
6525 	struct drxk_state *state = fe->demodulator_priv;
6526 	int status;
6527 	u32 stat;
6528 	u16 reg16;
6529 	u32 post_bit_count;
6530 	u32 post_bit_err_count;
6531 	u32 post_bit_error_scale;
6532 	u32 pre_bit_err_count;
6533 	u32 pre_bit_count;
6534 	u32 pkt_count;
6535 	u32 pkt_error_count;
6536 	s32 cnr;
6537 
6538 	if (state->m_drxk_state == DRXK_NO_DEV)
6539 		return -ENODEV;
6540 	if (state->m_drxk_state == DRXK_UNINITIALIZED)
6541 		return -EAGAIN;
6542 
6543 	/* get status */
6544 	state->fe_status = 0;
6545 	get_lock_status(state, &stat);
6546 	if (stat == MPEG_LOCK)
6547 		state->fe_status |= 0x1f;
6548 	if (stat == FEC_LOCK)
6549 		state->fe_status |= 0x0f;
6550 	if (stat == DEMOD_LOCK)
6551 		state->fe_status |= 0x07;
6552 
6553 	/*
6554 	 * Estimate signal strength from AGC
6555 	 */
6556 	get_strength(state, &c->strength.stat[0].uvalue);
6557 	c->strength.stat[0].scale = FE_SCALE_RELATIVE;
6558 
6559 
6560 	if (stat >= DEMOD_LOCK) {
6561 		get_signal_to_noise(state, &cnr);
6562 		c->cnr.stat[0].svalue = cnr * 100;
6563 		c->cnr.stat[0].scale = FE_SCALE_DECIBEL;
6564 	} else {
6565 		c->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6566 	}
6567 
6568 	if (stat < FEC_LOCK) {
6569 		c->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6570 		c->block_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6571 		c->pre_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6572 		c->pre_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6573 		c->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6574 		c->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6575 		return 0;
6576 	}
6577 
6578 	/* Get post BER */
6579 
6580 	/* BER measurement is valid if at least FEC lock is achieved */
6581 
6582 	/*
6583 	 * OFDM_EC_VD_REQ_SMB_CNT__A and/or OFDM_EC_VD_REQ_BIT_CNT can be
6584 	 * written to set nr of symbols or bits over which to measure
6585 	 * EC_VD_REG_ERR_BIT_CNT__A . See CtrlSetCfg().
6586 	 */
6587 
6588 	/* Read registers for post/preViterbi BER calculation */
6589 	status = read16(state, OFDM_EC_VD_ERR_BIT_CNT__A, &reg16);
6590 	if (status < 0)
6591 		goto error;
6592 	pre_bit_err_count = reg16;
6593 
6594 	status = read16(state, OFDM_EC_VD_IN_BIT_CNT__A , &reg16);
6595 	if (status < 0)
6596 		goto error;
6597 	pre_bit_count = reg16;
6598 
6599 	/* Number of bit-errors */
6600 	status = read16(state, FEC_RS_NR_BIT_ERRORS__A, &reg16);
6601 	if (status < 0)
6602 		goto error;
6603 	post_bit_err_count = reg16;
6604 
6605 	status = read16(state, FEC_RS_MEASUREMENT_PRESCALE__A, &reg16);
6606 	if (status < 0)
6607 		goto error;
6608 	post_bit_error_scale = reg16;
6609 
6610 	status = read16(state, FEC_RS_MEASUREMENT_PERIOD__A, &reg16);
6611 	if (status < 0)
6612 		goto error;
6613 	pkt_count = reg16;
6614 
6615 	status = read16(state, SCU_RAM_FEC_ACCUM_PKT_FAILURES__A, &reg16);
6616 	if (status < 0)
6617 		goto error;
6618 	pkt_error_count = reg16;
6619 	write16(state, SCU_RAM_FEC_ACCUM_PKT_FAILURES__A, 0);
6620 
6621 	post_bit_err_count *= post_bit_error_scale;
6622 
6623 	post_bit_count = pkt_count * 204 * 8;
6624 
6625 	/* Store the results */
6626 	c->block_error.stat[0].scale = FE_SCALE_COUNTER;
6627 	c->block_error.stat[0].uvalue += pkt_error_count;
6628 	c->block_count.stat[0].scale = FE_SCALE_COUNTER;
6629 	c->block_count.stat[0].uvalue += pkt_count;
6630 
6631 	c->pre_bit_error.stat[0].scale = FE_SCALE_COUNTER;
6632 	c->pre_bit_error.stat[0].uvalue += pre_bit_err_count;
6633 	c->pre_bit_count.stat[0].scale = FE_SCALE_COUNTER;
6634 	c->pre_bit_count.stat[0].uvalue += pre_bit_count;
6635 
6636 	c->post_bit_error.stat[0].scale = FE_SCALE_COUNTER;
6637 	c->post_bit_error.stat[0].uvalue += post_bit_err_count;
6638 	c->post_bit_count.stat[0].scale = FE_SCALE_COUNTER;
6639 	c->post_bit_count.stat[0].uvalue += post_bit_count;
6640 
6641 error:
6642 	return status;
6643 }
6644 
6645 
6646 static int drxk_read_status(struct dvb_frontend *fe, enum fe_status *status)
6647 {
6648 	struct drxk_state *state = fe->demodulator_priv;
6649 	int rc;
6650 
6651 	dprintk(1, "\n");
6652 
6653 	rc = drxk_get_stats(fe);
6654 	if (rc < 0)
6655 		return rc;
6656 
6657 	*status = state->fe_status;
6658 
6659 	return 0;
6660 }
6661 
6662 static int drxk_read_signal_strength(struct dvb_frontend *fe,
6663 				     u16 *strength)
6664 {
6665 	struct drxk_state *state = fe->demodulator_priv;
6666 	struct dtv_frontend_properties *c = &fe->dtv_property_cache;
6667 
6668 	dprintk(1, "\n");
6669 
6670 	if (state->m_drxk_state == DRXK_NO_DEV)
6671 		return -ENODEV;
6672 	if (state->m_drxk_state == DRXK_UNINITIALIZED)
6673 		return -EAGAIN;
6674 
6675 	*strength = c->strength.stat[0].uvalue;
6676 	return 0;
6677 }
6678 
6679 static int drxk_read_snr(struct dvb_frontend *fe, u16 *snr)
6680 {
6681 	struct drxk_state *state = fe->demodulator_priv;
6682 	s32 snr2;
6683 
6684 	dprintk(1, "\n");
6685 
6686 	if (state->m_drxk_state == DRXK_NO_DEV)
6687 		return -ENODEV;
6688 	if (state->m_drxk_state == DRXK_UNINITIALIZED)
6689 		return -EAGAIN;
6690 
6691 	get_signal_to_noise(state, &snr2);
6692 
6693 	/* No negative SNR, clip to zero */
6694 	if (snr2 < 0)
6695 		snr2 = 0;
6696 	*snr = snr2 & 0xffff;
6697 	return 0;
6698 }
6699 
6700 static int drxk_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
6701 {
6702 	struct drxk_state *state = fe->demodulator_priv;
6703 	u16 err;
6704 
6705 	dprintk(1, "\n");
6706 
6707 	if (state->m_drxk_state == DRXK_NO_DEV)
6708 		return -ENODEV;
6709 	if (state->m_drxk_state == DRXK_UNINITIALIZED)
6710 		return -EAGAIN;
6711 
6712 	dvbtqam_get_acc_pkt_err(state, &err);
6713 	*ucblocks = (u32) err;
6714 	return 0;
6715 }
6716 
6717 static int drxk_get_tune_settings(struct dvb_frontend *fe,
6718 				  struct dvb_frontend_tune_settings *sets)
6719 {
6720 	struct drxk_state *state = fe->demodulator_priv;
6721 	struct dtv_frontend_properties *p = &fe->dtv_property_cache;
6722 
6723 	dprintk(1, "\n");
6724 
6725 	if (state->m_drxk_state == DRXK_NO_DEV)
6726 		return -ENODEV;
6727 	if (state->m_drxk_state == DRXK_UNINITIALIZED)
6728 		return -EAGAIN;
6729 
6730 	switch (p->delivery_system) {
6731 	case SYS_DVBC_ANNEX_A:
6732 	case SYS_DVBC_ANNEX_C:
6733 	case SYS_DVBT:
6734 		sets->min_delay_ms = 3000;
6735 		sets->max_drift = 0;
6736 		sets->step_size = 0;
6737 		return 0;
6738 	default:
6739 		return -EINVAL;
6740 	}
6741 }
6742 
6743 static const struct dvb_frontend_ops drxk_ops = {
6744 	/* .delsys will be filled dynamically */
6745 	.info = {
6746 		.name = "DRXK",
6747 		.frequency_min = 47000000,
6748 		.frequency_max = 865000000,
6749 		 /* For DVB-C */
6750 		.symbol_rate_min = 870000,
6751 		.symbol_rate_max = 11700000,
6752 		/* For DVB-T */
6753 		.frequency_stepsize = 166667,
6754 
6755 		.caps = FE_CAN_QAM_16 | FE_CAN_QAM_32 | FE_CAN_QAM_64 |
6756 			FE_CAN_QAM_128 | FE_CAN_QAM_256 | FE_CAN_FEC_AUTO |
6757 			FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
6758 			FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_MUTE_TS |
6759 			FE_CAN_TRANSMISSION_MODE_AUTO | FE_CAN_RECOVER |
6760 			FE_CAN_GUARD_INTERVAL_AUTO | FE_CAN_HIERARCHY_AUTO
6761 	},
6762 
6763 	.release = drxk_release,
6764 	.sleep = drxk_sleep,
6765 	.i2c_gate_ctrl = drxk_gate_ctrl,
6766 
6767 	.set_frontend = drxk_set_parameters,
6768 	.get_tune_settings = drxk_get_tune_settings,
6769 
6770 	.read_status = drxk_read_status,
6771 	.read_signal_strength = drxk_read_signal_strength,
6772 	.read_snr = drxk_read_snr,
6773 	.read_ucblocks = drxk_read_ucblocks,
6774 };
6775 
6776 struct dvb_frontend *drxk_attach(const struct drxk_config *config,
6777 				 struct i2c_adapter *i2c)
6778 {
6779 	struct dtv_frontend_properties *p;
6780 	struct drxk_state *state = NULL;
6781 	u8 adr = config->adr;
6782 	int status;
6783 
6784 	dprintk(1, "\n");
6785 	state = kzalloc(sizeof(struct drxk_state), GFP_KERNEL);
6786 	if (!state)
6787 		return NULL;
6788 
6789 	state->i2c = i2c;
6790 	state->demod_address = adr;
6791 	state->single_master = config->single_master;
6792 	state->microcode_name = config->microcode_name;
6793 	state->qam_demod_parameter_count = config->qam_demod_parameter_count;
6794 	state->no_i2c_bridge = config->no_i2c_bridge;
6795 	state->antenna_gpio = config->antenna_gpio;
6796 	state->antenna_dvbt = config->antenna_dvbt;
6797 	state->m_chunk_size = config->chunk_size;
6798 	state->enable_merr_cfg = config->enable_merr_cfg;
6799 
6800 	if (config->dynamic_clk) {
6801 		state->m_dvbt_static_clk = false;
6802 		state->m_dvbc_static_clk = false;
6803 	} else {
6804 		state->m_dvbt_static_clk = true;
6805 		state->m_dvbc_static_clk = true;
6806 	}
6807 
6808 
6809 	if (config->mpeg_out_clk_strength)
6810 		state->m_ts_clockk_strength = config->mpeg_out_clk_strength & 0x07;
6811 	else
6812 		state->m_ts_clockk_strength = 0x06;
6813 
6814 	if (config->parallel_ts)
6815 		state->m_enable_parallel = true;
6816 	else
6817 		state->m_enable_parallel = false;
6818 
6819 	/* NOTE: as more UIO bits will be used, add them to the mask */
6820 	state->uio_mask = config->antenna_gpio;
6821 
6822 	/* Default gpio to DVB-C */
6823 	if (!state->antenna_dvbt && state->antenna_gpio)
6824 		state->m_gpio |= state->antenna_gpio;
6825 	else
6826 		state->m_gpio &= ~state->antenna_gpio;
6827 
6828 	mutex_init(&state->mutex);
6829 
6830 	memcpy(&state->frontend.ops, &drxk_ops, sizeof(drxk_ops));
6831 	state->frontend.demodulator_priv = state;
6832 
6833 	init_state(state);
6834 
6835 	/* Load firmware and initialize DRX-K */
6836 	if (state->microcode_name) {
6837 		const struct firmware *fw = NULL;
6838 
6839 		status = request_firmware(&fw, state->microcode_name,
6840 					  state->i2c->dev.parent);
6841 		if (status < 0)
6842 			fw = NULL;
6843 		load_firmware_cb(fw, state);
6844 	} else if (init_drxk(state) < 0)
6845 		goto error;
6846 
6847 
6848 	/* Initialize stats */
6849 	p = &state->frontend.dtv_property_cache;
6850 	p->strength.len = 1;
6851 	p->cnr.len = 1;
6852 	p->block_error.len = 1;
6853 	p->block_count.len = 1;
6854 	p->pre_bit_error.len = 1;
6855 	p->pre_bit_count.len = 1;
6856 	p->post_bit_error.len = 1;
6857 	p->post_bit_count.len = 1;
6858 
6859 	p->strength.stat[0].scale = FE_SCALE_RELATIVE;
6860 	p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6861 	p->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6862 	p->block_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6863 	p->pre_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6864 	p->pre_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6865 	p->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6866 	p->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
6867 
6868 	pr_info("frontend initialized.\n");
6869 	return &state->frontend;
6870 
6871 error:
6872 	pr_err("not found\n");
6873 	kfree(state);
6874 	return NULL;
6875 }
6876 EXPORT_SYMBOL(drxk_attach);
6877 
6878 MODULE_DESCRIPTION("DRX-K driver");
6879 MODULE_AUTHOR("Ralph Metzler");
6880 MODULE_LICENSE("GPL");
6881