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