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