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