2 * drxk_hard: DRX-K DVB-C/T demodulator driver
4 * Copyright (C) 2010-2011 Digital Devices GmbH
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.
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.
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
21 * Or, point your browser to http://www.gnu.org/copyleft/gpl.html
24 #include <linux/kernel.h>
25 #include <linux/module.h>
26 #include <linux/moduleparam.h>
27 #include <linux/init.h>
28 #include <linux/delay.h>
29 #include <linux/firmware.h>
30 #include <linux/i2c.h>
31 #include <linux/version.h>
32 #include <asm/div64.h>
34 #include "dvb_frontend.h"
36 #include "drxk_hard.h"
38 static int PowerDownDVBT(struct drxk_state *state, bool setPowerMode);
39 static int PowerDownQAM(struct drxk_state *state);
40 static int SetDVBTStandard(struct drxk_state *state,
41 enum OperationMode oMode);
42 static int SetQAMStandard(struct drxk_state *state,
43 enum OperationMode oMode);
44 static int SetQAM(struct drxk_state *state, u16 IntermediateFreqkHz,
46 static int SetDVBTStandard(struct drxk_state *state,
47 enum OperationMode oMode);
48 static int DVBTStart(struct drxk_state *state);
49 static int SetDVBT(struct drxk_state *state, u16 IntermediateFreqkHz,
51 static int GetQAMLockStatus(struct drxk_state *state, u32 *pLockStatus);
52 static int GetDVBTLockStatus(struct drxk_state *state, u32 *pLockStatus);
53 static int SwitchAntennaToQAM(struct drxk_state *state);
54 static int SwitchAntennaToDVBT(struct drxk_state *state);
56 static bool IsDVBT(struct drxk_state *state)
58 return state->m_OperationMode == OM_DVBT;
61 static bool IsQAM(struct drxk_state *state)
63 return state->m_OperationMode == OM_QAM_ITU_A ||
64 state->m_OperationMode == OM_QAM_ITU_B ||
65 state->m_OperationMode == OM_QAM_ITU_C;
68 bool IsA1WithPatchCode(struct drxk_state *state)
70 return state->m_DRXK_A1_PATCH_CODE;
73 bool IsA1WithRomCode(struct drxk_state *state)
75 return state->m_DRXK_A1_ROM_CODE;
80 #define DRXDAP_FASI_SHORT_FORMAT(addr) (((addr) & 0xFC30FF80) == 0)
81 #define DRXDAP_FASI_LONG_FORMAT(addr) (((addr) & 0xFC30FF80) != 0)
83 #define DEFAULT_MER_83 165
84 #define DEFAULT_MER_93 250
86 #ifndef DRXK_MPEG_SERIAL_OUTPUT_PIN_DRIVE_STRENGTH
87 #define DRXK_MPEG_SERIAL_OUTPUT_PIN_DRIVE_STRENGTH (0x02)
90 #ifndef DRXK_MPEG_PARALLEL_OUTPUT_PIN_DRIVE_STRENGTH
91 #define DRXK_MPEG_PARALLEL_OUTPUT_PIN_DRIVE_STRENGTH (0x03)
94 #ifndef DRXK_MPEG_OUTPUT_CLK_DRIVE_STRENGTH
95 #define DRXK_MPEG_OUTPUT_CLK_DRIVE_STRENGTH (0x06)
98 #define DEFAULT_DRXK_MPEG_LOCK_TIMEOUT 700
99 #define DEFAULT_DRXK_DEMOD_LOCK_TIMEOUT 500
101 #ifndef DRXK_KI_RAGC_ATV
102 #define DRXK_KI_RAGC_ATV 4
104 #ifndef DRXK_KI_IAGC_ATV
105 #define DRXK_KI_IAGC_ATV 6
107 #ifndef DRXK_KI_DAGC_ATV
108 #define DRXK_KI_DAGC_ATV 7
111 #ifndef DRXK_KI_RAGC_QAM
112 #define DRXK_KI_RAGC_QAM 3
114 #ifndef DRXK_KI_IAGC_QAM
115 #define DRXK_KI_IAGC_QAM 4
117 #ifndef DRXK_KI_DAGC_QAM
118 #define DRXK_KI_DAGC_QAM 7
120 #ifndef DRXK_KI_RAGC_DVBT
121 #define DRXK_KI_RAGC_DVBT (IsA1WithPatchCode(state) ? 3 : 2)
123 #ifndef DRXK_KI_IAGC_DVBT
124 #define DRXK_KI_IAGC_DVBT (IsA1WithPatchCode(state) ? 4 : 2)
126 #ifndef DRXK_KI_DAGC_DVBT
127 #define DRXK_KI_DAGC_DVBT (IsA1WithPatchCode(state) ? 10 : 7)
130 #ifndef DRXK_AGC_DAC_OFFSET
131 #define DRXK_AGC_DAC_OFFSET (0x800)
134 #ifndef DRXK_BANDWIDTH_8MHZ_IN_HZ
135 #define DRXK_BANDWIDTH_8MHZ_IN_HZ (0x8B8249L)
138 #ifndef DRXK_BANDWIDTH_7MHZ_IN_HZ
139 #define DRXK_BANDWIDTH_7MHZ_IN_HZ (0x7A1200L)
142 #ifndef DRXK_BANDWIDTH_6MHZ_IN_HZ
143 #define DRXK_BANDWIDTH_6MHZ_IN_HZ (0x68A1B6L)
146 #ifndef DRXK_QAM_SYMBOLRATE_MAX
147 #define DRXK_QAM_SYMBOLRATE_MAX (7233000)
150 #define DRXK_BL_ROM_OFFSET_TAPS_DVBT 56
151 #define DRXK_BL_ROM_OFFSET_TAPS_ITU_A 64
152 #define DRXK_BL_ROM_OFFSET_TAPS_ITU_C 0x5FE0
153 #define DRXK_BL_ROM_OFFSET_TAPS_BG 24
154 #define DRXK_BL_ROM_OFFSET_TAPS_DKILLP 32
155 #define DRXK_BL_ROM_OFFSET_TAPS_NTSC 40
156 #define DRXK_BL_ROM_OFFSET_TAPS_FM 48
157 #define DRXK_BL_ROM_OFFSET_UCODE 0
159 #define DRXK_BLC_TIMEOUT 100
161 #define DRXK_BLCC_NR_ELEMENTS_TAPS 2
162 #define DRXK_BLCC_NR_ELEMENTS_UCODE 6
164 #define DRXK_BLDC_NR_ELEMENTS_TAPS 28
166 #ifndef DRXK_OFDM_NE_NOTCH_WIDTH
167 #define DRXK_OFDM_NE_NOTCH_WIDTH (4)
170 #define DRXK_QAM_SL_SIG_POWER_QAM16 (40960)
171 #define DRXK_QAM_SL_SIG_POWER_QAM32 (20480)
172 #define DRXK_QAM_SL_SIG_POWER_QAM64 (43008)
173 #define DRXK_QAM_SL_SIG_POWER_QAM128 (20992)
174 #define DRXK_QAM_SL_SIG_POWER_QAM256 (43520)
176 static unsigned int debug;
177 module_param(debug, int, 0644);
178 MODULE_PARM_DESC(debug, "enable debug messages");
180 #define dprintk(level, fmt, arg...) do { \
181 if (debug >= level) \
182 printk(KERN_DEBUG "drxk: %s" fmt, __func__, ## arg); \
186 static inline u32 MulDiv32(u32 a, u32 b, u32 c)
190 tmp64 = (u64) a * (u64) b;
196 inline u32 Frac28a(u32 a, u32 c)
202 R0 = (a % c) << 4; /* 32-28 == 4 shifts possible at max */
203 Q1 = a / c; /* integer part, only the 4 least significant bits
204 will be visible in the result */
206 /* division using radix 16, 7 nibbles in the result */
207 for (i = 0; i < 7; i++) {
208 Q1 = (Q1 << 4) | (R0 / c);
218 static u32 Log10Times100(u32 x)
220 static const u8 scale = 15;
221 static const u8 indexWidth = 5;
228 log2lut[n] = (1<<scale) * 200 * log2(1.0 + ((1.0/(1<<INDEXWIDTH)) * n))
229 0 <= n < ((1<<INDEXWIDTH)+1)
232 static const u32 log2lut[] = {
234 290941, /* 290941.300628 */
235 573196, /* 573196.476418 */
236 847269, /* 847269.179851 */
237 1113620, /* 1113620.489452 */
238 1372674, /* 1372673.576986 */
239 1624818, /* 1624817.752104 */
240 1870412, /* 1870411.981536 */
241 2109788, /* 2109787.962654 */
242 2343253, /* 2343252.817465 */
243 2571091, /* 2571091.461923 */
244 2793569, /* 2793568.696416 */
245 3010931, /* 3010931.055901 */
246 3223408, /* 3223408.452106 */
247 3431216, /* 3431215.635215 */
248 3634553, /* 3634553.498355 */
249 3833610, /* 3833610.244726 */
250 4028562, /* 4028562.434393 */
251 4219576, /* 4219575.925308 */
252 4406807, /* 4406806.721144 */
253 4590402, /* 4590401.736809 */
254 4770499, /* 4770499.491025 */
255 4947231, /* 4947230.734179 */
256 5120719, /* 5120719.018555 */
257 5291081, /* 5291081.217197 */
258 5458428, /* 5458427.996830 */
259 5622864, /* 5622864.249668 */
260 5784489, /* 5784489.488298 */
261 5943398, /* 5943398.207380 */
262 6099680, /* 6099680.215452 */
263 6253421, /* 6253420.939751 */
264 6404702, /* 6404701.706649 */
265 6553600, /* 6553600.000000 */
272 /* Scale x (normalize) */
273 /* computing y in log(x/y) = log(x) - log(y) */
274 if ((x & ((0xffffffff) << (scale + 1))) == 0) {
275 for (k = scale; k > 0; k--) {
276 if (x & (((u32) 1) << scale))
281 for (k = scale; k < 31; k++) {
282 if ((x & (((u32) (-1)) << (scale + 1))) == 0)
288 Now x has binary point between bit[scale] and bit[scale-1]
289 and 1.0 <= x < 2.0 */
291 /* correction for divison: log(x) = log(x/y)+log(y) */
292 y = k * ((((u32) 1) << scale) * 200);
294 /* remove integer part */
295 x &= ((((u32) 1) << scale) - 1);
297 i = (u8) (x >> (scale - indexWidth));
298 /* compute delta (x - a) */
299 d = x & ((((u32) 1) << (scale - indexWidth)) - 1);
300 /* compute log, multiplication (d* (..)) must be within range ! */
302 ((d * (log2lut[i + 1] - log2lut[i])) >> (scale - indexWidth));
303 /* Conver to log10() */
304 y /= 108853; /* (log2(10) << scale) */
312 /****************************************************************************/
313 /* I2C **********************************************************************/
314 /****************************************************************************/
316 static int i2c_read1(struct i2c_adapter *adapter, u8 adr, u8 *val)
318 struct i2c_msg msgs[1] = { {.addr = adr, .flags = I2C_M_RD,
319 .buf = val, .len = 1}
322 return i2c_transfer(adapter, msgs, 1);
325 static int i2c_write(struct i2c_adapter *adap, u8 adr, u8 *data, int len)
328 struct i2c_msg msg = {
329 .addr = adr, .flags = 0, .buf = data, .len = len };
334 for (i = 0; i < len; i++)
335 printk(KERN_CONT " %02x", data[i]);
336 printk(KERN_CONT "\n");
338 status = i2c_transfer(adap, &msg, 1);
339 if (status >= 0 && status != 1)
343 printk(KERN_ERR "drxk: i2c write error at addr 0x%02x\n", adr);
348 static int i2c_read(struct i2c_adapter *adap,
349 u8 adr, u8 *msg, int len, u8 *answ, int alen)
352 struct i2c_msg msgs[2] = {
353 {.addr = adr, .flags = 0,
354 .buf = msg, .len = len},
355 {.addr = adr, .flags = I2C_M_RD,
356 .buf = answ, .len = alen}
361 for (i = 0; i < len; i++)
362 printk(KERN_CONT " %02x", msg[i]);
363 printk(KERN_CONT "\n");
365 status = i2c_transfer(adap, msgs, 2);
368 printk(KERN_CONT ": ERROR!\n");
372 printk(KERN_ERR "drxk: i2c read error at addr 0x%02x\n", adr);
377 printk(KERN_CONT ": Read ");
378 for (i = 0; i < len; i++)
379 printk(KERN_CONT " %02x", msg[i]);
380 printk(KERN_CONT "\n");
385 static int read16_flags(struct drxk_state *state, u32 reg, u16 *data, u8 flags)
388 u8 adr = state->demod_address, mm1[4], mm2[2], len;
390 if (state->single_master)
393 if (DRXDAP_FASI_LONG_FORMAT(reg) || (flags != 0)) {
394 mm1[0] = (((reg << 1) & 0xFF) | 0x01);
395 mm1[1] = ((reg >> 16) & 0xFF);
396 mm1[2] = ((reg >> 24) & 0xFF) | flags;
397 mm1[3] = ((reg >> 7) & 0xFF);
400 mm1[0] = ((reg << 1) & 0xFF);
401 mm1[1] = (((reg >> 16) & 0x0F) | ((reg >> 18) & 0xF0));
404 dprintk(2, "(0x%08x, 0x%02x)\n", reg, flags);
405 status = i2c_read(state->i2c, adr, mm1, len, mm2, 2);
409 *data = mm2[0] | (mm2[1] << 8);
414 static int read16(struct drxk_state *state, u32 reg, u16 *data)
416 return read16_flags(state, reg, data, 0);
419 static int read32_flags(struct drxk_state *state, u32 reg, u32 *data, u8 flags)
422 u8 adr = state->demod_address, mm1[4], mm2[4], len;
424 if (state->single_master)
427 if (DRXDAP_FASI_LONG_FORMAT(reg) || (flags != 0)) {
428 mm1[0] = (((reg << 1) & 0xFF) | 0x01);
429 mm1[1] = ((reg >> 16) & 0xFF);
430 mm1[2] = ((reg >> 24) & 0xFF) | flags;
431 mm1[3] = ((reg >> 7) & 0xFF);
434 mm1[0] = ((reg << 1) & 0xFF);
435 mm1[1] = (((reg >> 16) & 0x0F) | ((reg >> 18) & 0xF0));
438 dprintk(2, "(0x%08x, 0x%02x)\n", reg, flags);
439 status = i2c_read(state->i2c, adr, mm1, len, mm2, 4);
443 *data = mm2[0] | (mm2[1] << 8) |
444 (mm2[2] << 16) | (mm2[3] << 24);
449 static int read32(struct drxk_state *state, u32 reg, u32 *data)
451 return read32_flags(state, reg, data, 0);
454 static int write16_flags(struct drxk_state *state, u32 reg, u16 data, u8 flags)
456 u8 adr = state->demod_address, mm[6], len;
458 if (state->single_master)
460 if (DRXDAP_FASI_LONG_FORMAT(reg) || (flags != 0)) {
461 mm[0] = (((reg << 1) & 0xFF) | 0x01);
462 mm[1] = ((reg >> 16) & 0xFF);
463 mm[2] = ((reg >> 24) & 0xFF) | flags;
464 mm[3] = ((reg >> 7) & 0xFF);
467 mm[0] = ((reg << 1) & 0xFF);
468 mm[1] = (((reg >> 16) & 0x0F) | ((reg >> 18) & 0xF0));
471 mm[len] = data & 0xff;
472 mm[len + 1] = (data >> 8) & 0xff;
474 dprintk(2, "(0x%08x, 0x%04x, 0x%02x)\n", reg, data, flags);
475 return i2c_write(state->i2c, adr, mm, len + 2);
478 static int write16(struct drxk_state *state, u32 reg, u16 data)
480 return write16_flags(state, reg, data, 0);
483 static int write32_flags(struct drxk_state *state, u32 reg, u32 data, u8 flags)
485 u8 adr = state->demod_address, mm[8], len;
487 if (state->single_master)
489 if (DRXDAP_FASI_LONG_FORMAT(reg) || (flags != 0)) {
490 mm[0] = (((reg << 1) & 0xFF) | 0x01);
491 mm[1] = ((reg >> 16) & 0xFF);
492 mm[2] = ((reg >> 24) & 0xFF) | flags;
493 mm[3] = ((reg >> 7) & 0xFF);
496 mm[0] = ((reg << 1) & 0xFF);
497 mm[1] = (((reg >> 16) & 0x0F) | ((reg >> 18) & 0xF0));
500 mm[len] = data & 0xff;
501 mm[len + 1] = (data >> 8) & 0xff;
502 mm[len + 2] = (data >> 16) & 0xff;
503 mm[len + 3] = (data >> 24) & 0xff;
504 dprintk(2, "(0x%08x, 0x%08x, 0x%02x)\n", reg, data, flags);
506 return i2c_write(state->i2c, adr, mm, len + 4);
509 static int write32(struct drxk_state *state, u32 reg, u32 data)
511 return write32_flags(state, reg, data, 0);
514 static int write_block(struct drxk_state *state, u32 Address,
515 const int BlockSize, const u8 pBlock[])
517 int status = 0, BlkSize = BlockSize;
520 if (state->single_master)
523 while (BlkSize > 0) {
524 int Chunk = BlkSize > state->m_ChunkSize ?
525 state->m_ChunkSize : BlkSize;
526 u8 *AdrBuf = &state->Chunk[0];
529 if (DRXDAP_FASI_LONG_FORMAT(Address) || (Flags != 0)) {
530 AdrBuf[0] = (((Address << 1) & 0xFF) | 0x01);
531 AdrBuf[1] = ((Address >> 16) & 0xFF);
532 AdrBuf[2] = ((Address >> 24) & 0xFF);
533 AdrBuf[3] = ((Address >> 7) & 0xFF);
536 if (Chunk == state->m_ChunkSize)
539 AdrBuf[0] = ((Address << 1) & 0xFF);
540 AdrBuf[1] = (((Address >> 16) & 0x0F) |
541 ((Address >> 18) & 0xF0));
544 memcpy(&state->Chunk[AdrLength], pBlock, Chunk);
545 dprintk(2, "(0x%08x, 0x%02x)\n", Address, Flags);
549 for (i = 0; i < Chunk; i++)
550 printk(KERN_CONT " %02x", pBlock[i]);
551 printk(KERN_CONT "\n");
553 status = i2c_write(state->i2c, state->demod_address,
554 &state->Chunk[0], Chunk + AdrLength);
556 printk(KERN_ERR "drxk: %s: i2c write error at addr 0x%02x\n",
561 Address += (Chunk >> 1);
567 #ifndef DRXK_MAX_RETRIES_POWERUP
568 #define DRXK_MAX_RETRIES_POWERUP 20
571 int PowerUpDevice(struct drxk_state *state)
579 status = i2c_read1(state->i2c, state->demod_address, &data);
583 status = i2c_write(state->i2c, state->demod_address,
589 status = i2c_read1(state->i2c, state->demod_address,
591 } while (status < 0 &&
592 (retryCount < DRXK_MAX_RETRIES_POWERUP));
593 if (status < 0 && retryCount >= DRXK_MAX_RETRIES_POWERUP)
597 /* Make sure all clk domains are active */
598 status = write16(state, SIO_CC_PWD_MODE__A, SIO_CC_PWD_MODE_LEVEL_NONE);
601 status = write16(state, SIO_CC_UPDATE__A, SIO_CC_UPDATE_KEY);
604 /* Enable pll lock tests */
605 status = write16(state, SIO_CC_PLL_LOCK__A, 1);
609 state->m_currentPowerMode = DRX_POWER_UP;
613 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
619 static int init_state(struct drxk_state *state)
622 * FIXME: most (all?) of the values bellow should be moved into
623 * struct drxk_config, as they are probably board-specific
625 u32 ulVSBIfAgcMode = DRXK_AGC_CTRL_AUTO;
626 u32 ulVSBIfAgcOutputLevel = 0;
627 u32 ulVSBIfAgcMinLevel = 0;
628 u32 ulVSBIfAgcMaxLevel = 0x7FFF;
629 u32 ulVSBIfAgcSpeed = 3;
631 u32 ulVSBRfAgcMode = DRXK_AGC_CTRL_AUTO;
632 u32 ulVSBRfAgcOutputLevel = 0;
633 u32 ulVSBRfAgcMinLevel = 0;
634 u32 ulVSBRfAgcMaxLevel = 0x7FFF;
635 u32 ulVSBRfAgcSpeed = 3;
636 u32 ulVSBRfAgcTop = 9500;
637 u32 ulVSBRfAgcCutOffCurrent = 4000;
639 u32 ulATVIfAgcMode = DRXK_AGC_CTRL_AUTO;
640 u32 ulATVIfAgcOutputLevel = 0;
641 u32 ulATVIfAgcMinLevel = 0;
642 u32 ulATVIfAgcMaxLevel = 0;
643 u32 ulATVIfAgcSpeed = 3;
645 u32 ulATVRfAgcMode = DRXK_AGC_CTRL_OFF;
646 u32 ulATVRfAgcOutputLevel = 0;
647 u32 ulATVRfAgcMinLevel = 0;
648 u32 ulATVRfAgcMaxLevel = 0;
649 u32 ulATVRfAgcTop = 9500;
650 u32 ulATVRfAgcCutOffCurrent = 4000;
651 u32 ulATVRfAgcSpeed = 3;
653 u32 ulQual83 = DEFAULT_MER_83;
654 u32 ulQual93 = DEFAULT_MER_93;
656 u32 ulDVBTStaticTSClock = 1;
657 u32 ulDVBCStaticTSClock = 1;
659 u32 ulMpegLockTimeOut = DEFAULT_DRXK_MPEG_LOCK_TIMEOUT;
660 u32 ulDemodLockTimeOut = DEFAULT_DRXK_DEMOD_LOCK_TIMEOUT;
662 /* io_pad_cfg register (8 bit reg.) MSB bit is 1 (default value) */
663 /* io_pad_cfg_mode output mode is drive always */
664 /* io_pad_cfg_drive is set to power 2 (23 mA) */
665 u32 ulGPIOCfg = 0x0113;
667 u32 ulSerialMode = 1;
668 u32 ulInvertTSClock = 0;
669 u32 ulTSDataStrength = DRXK_MPEG_SERIAL_OUTPUT_PIN_DRIVE_STRENGTH;
670 u32 ulTSClockkStrength = DRXK_MPEG_OUTPUT_CLK_DRIVE_STRENGTH;
671 u32 ulDVBTBitrate = 50000000;
672 u32 ulDVBCBitrate = DRXK_QAM_SYMBOLRATE_MAX * 8;
674 u32 ulInsertRSByte = 0;
681 state->m_hasLNA = false;
682 state->m_hasDVBT = false;
683 state->m_hasDVBC = false;
684 state->m_hasATV = false;
685 state->m_hasOOB = false;
686 state->m_hasAudio = false;
688 state->m_ChunkSize = 124;
690 state->m_oscClockFreq = 0;
691 state->m_smartAntInverted = false;
692 state->m_bPDownOpenBridge = false;
694 /* real system clock frequency in kHz */
695 state->m_sysClockFreq = 151875;
696 /* Timing div, 250ns/Psys */
697 /* Timing div, = (delay (nano seconds) * sysclk (kHz))/ 1000 */
698 state->m_HICfgTimingDiv = ((state->m_sysClockFreq / 1000) *
699 HI_I2C_DELAY) / 1000;
701 if (state->m_HICfgTimingDiv > SIO_HI_RA_RAM_PAR_2_CFG_DIV__M)
702 state->m_HICfgTimingDiv = SIO_HI_RA_RAM_PAR_2_CFG_DIV__M;
703 state->m_HICfgWakeUpKey = (state->demod_address << 1);
704 /* port/bridge/power down ctrl */
705 state->m_HICfgCtrl = SIO_HI_RA_RAM_PAR_5_CFG_SLV0_SLAVE;
707 state->m_bPowerDown = (ulPowerDown != 0);
709 state->m_DRXK_A1_PATCH_CODE = false;
710 state->m_DRXK_A1_ROM_CODE = false;
711 state->m_DRXK_A2_ROM_CODE = false;
712 state->m_DRXK_A3_ROM_CODE = false;
713 state->m_DRXK_A2_PATCH_CODE = false;
714 state->m_DRXK_A3_PATCH_CODE = false;
716 /* Init AGC and PGA parameters */
718 state->m_vsbIfAgcCfg.ctrlMode = (ulVSBIfAgcMode);
719 state->m_vsbIfAgcCfg.outputLevel = (ulVSBIfAgcOutputLevel);
720 state->m_vsbIfAgcCfg.minOutputLevel = (ulVSBIfAgcMinLevel);
721 state->m_vsbIfAgcCfg.maxOutputLevel = (ulVSBIfAgcMaxLevel);
722 state->m_vsbIfAgcCfg.speed = (ulVSBIfAgcSpeed);
723 state->m_vsbPgaCfg = 140;
726 state->m_vsbRfAgcCfg.ctrlMode = (ulVSBRfAgcMode);
727 state->m_vsbRfAgcCfg.outputLevel = (ulVSBRfAgcOutputLevel);
728 state->m_vsbRfAgcCfg.minOutputLevel = (ulVSBRfAgcMinLevel);
729 state->m_vsbRfAgcCfg.maxOutputLevel = (ulVSBRfAgcMaxLevel);
730 state->m_vsbRfAgcCfg.speed = (ulVSBRfAgcSpeed);
731 state->m_vsbRfAgcCfg.top = (ulVSBRfAgcTop);
732 state->m_vsbRfAgcCfg.cutOffCurrent = (ulVSBRfAgcCutOffCurrent);
733 state->m_vsbPreSawCfg.reference = 0x07;
734 state->m_vsbPreSawCfg.usePreSaw = true;
736 state->m_Quality83percent = DEFAULT_MER_83;
737 state->m_Quality93percent = DEFAULT_MER_93;
738 if (ulQual93 <= 500 && ulQual83 < ulQual93) {
739 state->m_Quality83percent = ulQual83;
740 state->m_Quality93percent = ulQual93;
744 state->m_atvIfAgcCfg.ctrlMode = (ulATVIfAgcMode);
745 state->m_atvIfAgcCfg.outputLevel = (ulATVIfAgcOutputLevel);
746 state->m_atvIfAgcCfg.minOutputLevel = (ulATVIfAgcMinLevel);
747 state->m_atvIfAgcCfg.maxOutputLevel = (ulATVIfAgcMaxLevel);
748 state->m_atvIfAgcCfg.speed = (ulATVIfAgcSpeed);
751 state->m_atvRfAgcCfg.ctrlMode = (ulATVRfAgcMode);
752 state->m_atvRfAgcCfg.outputLevel = (ulATVRfAgcOutputLevel);
753 state->m_atvRfAgcCfg.minOutputLevel = (ulATVRfAgcMinLevel);
754 state->m_atvRfAgcCfg.maxOutputLevel = (ulATVRfAgcMaxLevel);
755 state->m_atvRfAgcCfg.speed = (ulATVRfAgcSpeed);
756 state->m_atvRfAgcCfg.top = (ulATVRfAgcTop);
757 state->m_atvRfAgcCfg.cutOffCurrent = (ulATVRfAgcCutOffCurrent);
758 state->m_atvPreSawCfg.reference = 0x04;
759 state->m_atvPreSawCfg.usePreSaw = true;
763 state->m_dvbtRfAgcCfg.ctrlMode = DRXK_AGC_CTRL_OFF;
764 state->m_dvbtRfAgcCfg.outputLevel = 0;
765 state->m_dvbtRfAgcCfg.minOutputLevel = 0;
766 state->m_dvbtRfAgcCfg.maxOutputLevel = 0xFFFF;
767 state->m_dvbtRfAgcCfg.top = 0x2100;
768 state->m_dvbtRfAgcCfg.cutOffCurrent = 4000;
769 state->m_dvbtRfAgcCfg.speed = 1;
773 state->m_dvbtIfAgcCfg.ctrlMode = DRXK_AGC_CTRL_AUTO;
774 state->m_dvbtIfAgcCfg.outputLevel = 0;
775 state->m_dvbtIfAgcCfg.minOutputLevel = 0;
776 state->m_dvbtIfAgcCfg.maxOutputLevel = 9000;
777 state->m_dvbtIfAgcCfg.top = 13424;
778 state->m_dvbtIfAgcCfg.cutOffCurrent = 0;
779 state->m_dvbtIfAgcCfg.speed = 3;
780 state->m_dvbtIfAgcCfg.FastClipCtrlDelay = 30;
781 state->m_dvbtIfAgcCfg.IngainTgtMax = 30000;
782 /* state->m_dvbtPgaCfg = 140; */
784 state->m_dvbtPreSawCfg.reference = 4;
785 state->m_dvbtPreSawCfg.usePreSaw = false;
788 state->m_qamRfAgcCfg.ctrlMode = DRXK_AGC_CTRL_OFF;
789 state->m_qamRfAgcCfg.outputLevel = 0;
790 state->m_qamRfAgcCfg.minOutputLevel = 6023;
791 state->m_qamRfAgcCfg.maxOutputLevel = 27000;
792 state->m_qamRfAgcCfg.top = 0x2380;
793 state->m_qamRfAgcCfg.cutOffCurrent = 4000;
794 state->m_qamRfAgcCfg.speed = 3;
797 state->m_qamIfAgcCfg.ctrlMode = DRXK_AGC_CTRL_AUTO;
798 state->m_qamIfAgcCfg.outputLevel = 0;
799 state->m_qamIfAgcCfg.minOutputLevel = 0;
800 state->m_qamIfAgcCfg.maxOutputLevel = 9000;
801 state->m_qamIfAgcCfg.top = 0x0511;
802 state->m_qamIfAgcCfg.cutOffCurrent = 0;
803 state->m_qamIfAgcCfg.speed = 3;
804 state->m_qamIfAgcCfg.IngainTgtMax = 5119;
805 state->m_qamIfAgcCfg.FastClipCtrlDelay = 50;
807 state->m_qamPgaCfg = 140;
808 state->m_qamPreSawCfg.reference = 4;
809 state->m_qamPreSawCfg.usePreSaw = false;
811 state->m_OperationMode = OM_NONE;
812 state->m_DrxkState = DRXK_UNINITIALIZED;
814 /* MPEG output configuration */
815 state->m_enableMPEGOutput = true; /* If TRUE; enable MPEG ouput */
816 state->m_insertRSByte = false; /* If TRUE; insert RS byte */
817 state->m_enableParallel = true; /* If TRUE;
818 parallel out otherwise serial */
819 state->m_invertDATA = false; /* If TRUE; invert DATA signals */
820 state->m_invertERR = false; /* If TRUE; invert ERR signal */
821 state->m_invertSTR = false; /* If TRUE; invert STR signals */
822 state->m_invertVAL = false; /* If TRUE; invert VAL signals */
823 state->m_invertCLK = (ulInvertTSClock != 0); /* If TRUE; invert CLK signals */
824 state->m_DVBTStaticCLK = (ulDVBTStaticTSClock != 0);
825 state->m_DVBCStaticCLK = (ulDVBCStaticTSClock != 0);
826 /* If TRUE; static MPEG clockrate will be used;
827 otherwise clockrate will adapt to the bitrate of the TS */
829 state->m_DVBTBitrate = ulDVBTBitrate;
830 state->m_DVBCBitrate = ulDVBCBitrate;
832 state->m_TSDataStrength = (ulTSDataStrength & 0x07);
833 state->m_TSClockkStrength = (ulTSClockkStrength & 0x07);
835 /* Maximum bitrate in b/s in case static clockrate is selected */
836 state->m_mpegTsStaticBitrate = 19392658;
837 state->m_disableTEIhandling = false;
840 state->m_insertRSByte = true;
842 state->m_MpegLockTimeOut = DEFAULT_DRXK_MPEG_LOCK_TIMEOUT;
843 if (ulMpegLockTimeOut < 10000)
844 state->m_MpegLockTimeOut = ulMpegLockTimeOut;
845 state->m_DemodLockTimeOut = DEFAULT_DRXK_DEMOD_LOCK_TIMEOUT;
846 if (ulDemodLockTimeOut < 10000)
847 state->m_DemodLockTimeOut = ulDemodLockTimeOut;
850 state->m_Constellation = DRX_CONSTELLATION_AUTO;
851 state->m_qamInterleaveMode = DRXK_QAM_I12_J17;
852 state->m_fecRsPlen = 204 * 8; /* fecRsPlen annex A */
853 state->m_fecRsPrescale = 1;
855 state->m_sqiSpeed = DRXK_DVBT_SQI_SPEED_MEDIUM;
856 state->m_agcFastClipCtrlDelay = 0;
858 state->m_GPIOCfg = (ulGPIOCfg);
860 state->m_bPowerDown = false;
861 state->m_currentPowerMode = DRX_POWER_DOWN;
863 state->m_enableParallel = (ulSerialMode == 0);
865 state->m_rfmirror = (ulRfMirror == 0);
866 state->m_IfAgcPol = false;
870 static int DRXX_Open(struct drxk_state *state)
878 /* stop lock indicator process */
879 status = write16(state, SCU_RAM_GPIO__A, SCU_RAM_GPIO_HW_LOCK_IND_DISABLE);
882 /* Check device id */
883 status = read16(state, SIO_TOP_COMM_KEY__A, &key);
886 status = write16(state, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY_KEY);
889 status = read32(state, SIO_TOP_JTAGID_LO__A, &jtag);
892 status = read16(state, SIO_PDR_UIO_IN_HI__A, &bid);
895 status = write16(state, SIO_TOP_COMM_KEY__A, key);
898 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
902 static int GetDeviceCapabilities(struct drxk_state *state)
904 u16 sioPdrOhwCfg = 0;
905 u32 sioTopJtagidLo = 0;
907 const char *spin = "";
912 /* stop lock indicator process */
913 status = write16(state, SCU_RAM_GPIO__A, SCU_RAM_GPIO_HW_LOCK_IND_DISABLE);
916 status = write16(state, SIO_TOP_COMM_KEY__A, 0xFABA);
919 status = read16(state, SIO_PDR_OHW_CFG__A, &sioPdrOhwCfg);
922 status = write16(state, SIO_TOP_COMM_KEY__A, 0x0000);
926 switch ((sioPdrOhwCfg & SIO_PDR_OHW_CFG_FREF_SEL__M)) {
928 /* ignore (bypass ?) */
932 state->m_oscClockFreq = 27000;
936 state->m_oscClockFreq = 20250;
940 state->m_oscClockFreq = 20250;
943 printk(KERN_ERR "drxk: Clock Frequency is unkonwn\n");
947 Determine device capabilities
950 status = read32(state, SIO_TOP_JTAGID_LO__A, &sioTopJtagidLo);
954 switch ((sioTopJtagidLo >> 29) & 0xF) {
956 state->m_deviceSpin = DRXK_SPIN_A1;
960 state->m_deviceSpin = DRXK_SPIN_A2;
964 state->m_deviceSpin = DRXK_SPIN_A3;
968 state->m_deviceSpin = DRXK_SPIN_UNKNOWN;
970 printk(KERN_ERR "drxk: Spin unknown\n");
973 switch ((sioTopJtagidLo >> 12) & 0xFF) {
975 /* typeId = DRX3913K_TYPE_ID */
976 state->m_hasLNA = false;
977 state->m_hasOOB = false;
978 state->m_hasATV = false;
979 state->m_hasAudio = false;
980 state->m_hasDVBT = true;
981 state->m_hasDVBC = true;
982 state->m_hasSAWSW = true;
983 state->m_hasGPIO2 = false;
984 state->m_hasGPIO1 = false;
985 state->m_hasIRQN = false;
988 /* typeId = DRX3915K_TYPE_ID */
989 state->m_hasLNA = false;
990 state->m_hasOOB = false;
991 state->m_hasATV = true;
992 state->m_hasAudio = false;
993 state->m_hasDVBT = true;
994 state->m_hasDVBC = false;
995 state->m_hasSAWSW = true;
996 state->m_hasGPIO2 = true;
997 state->m_hasGPIO1 = true;
998 state->m_hasIRQN = false;
1001 /* typeId = DRX3916K_TYPE_ID */
1002 state->m_hasLNA = false;
1003 state->m_hasOOB = false;
1004 state->m_hasATV = true;
1005 state->m_hasAudio = false;
1006 state->m_hasDVBT = true;
1007 state->m_hasDVBC = false;
1008 state->m_hasSAWSW = true;
1009 state->m_hasGPIO2 = true;
1010 state->m_hasGPIO1 = true;
1011 state->m_hasIRQN = false;
1014 /* typeId = DRX3918K_TYPE_ID */
1015 state->m_hasLNA = false;
1016 state->m_hasOOB = false;
1017 state->m_hasATV = true;
1018 state->m_hasAudio = true;
1019 state->m_hasDVBT = true;
1020 state->m_hasDVBC = false;
1021 state->m_hasSAWSW = true;
1022 state->m_hasGPIO2 = true;
1023 state->m_hasGPIO1 = true;
1024 state->m_hasIRQN = false;
1027 /* typeId = DRX3921K_TYPE_ID */
1028 state->m_hasLNA = false;
1029 state->m_hasOOB = false;
1030 state->m_hasATV = true;
1031 state->m_hasAudio = true;
1032 state->m_hasDVBT = true;
1033 state->m_hasDVBC = true;
1034 state->m_hasSAWSW = true;
1035 state->m_hasGPIO2 = true;
1036 state->m_hasGPIO1 = true;
1037 state->m_hasIRQN = false;
1040 /* typeId = DRX3923K_TYPE_ID */
1041 state->m_hasLNA = false;
1042 state->m_hasOOB = false;
1043 state->m_hasATV = true;
1044 state->m_hasAudio = true;
1045 state->m_hasDVBT = true;
1046 state->m_hasDVBC = true;
1047 state->m_hasSAWSW = true;
1048 state->m_hasGPIO2 = true;
1049 state->m_hasGPIO1 = true;
1050 state->m_hasIRQN = false;
1053 /* typeId = DRX3925K_TYPE_ID */
1054 state->m_hasLNA = false;
1055 state->m_hasOOB = false;
1056 state->m_hasATV = true;
1057 state->m_hasAudio = true;
1058 state->m_hasDVBT = true;
1059 state->m_hasDVBC = true;
1060 state->m_hasSAWSW = true;
1061 state->m_hasGPIO2 = true;
1062 state->m_hasGPIO1 = true;
1063 state->m_hasIRQN = false;
1066 /* typeId = DRX3926K_TYPE_ID */
1067 state->m_hasLNA = false;
1068 state->m_hasOOB = false;
1069 state->m_hasATV = true;
1070 state->m_hasAudio = false;
1071 state->m_hasDVBT = true;
1072 state->m_hasDVBC = true;
1073 state->m_hasSAWSW = true;
1074 state->m_hasGPIO2 = true;
1075 state->m_hasGPIO1 = true;
1076 state->m_hasIRQN = false;
1079 printk(KERN_ERR "drxk: DeviceID not supported = %02x\n",
1080 ((sioTopJtagidLo >> 12) & 0xFF));
1086 "drxk: detected a drx-39%02xk, spin %s, xtal %d.%03d MHz\n",
1087 ((sioTopJtagidLo >> 12) & 0xFF), spin,
1088 state->m_oscClockFreq / 1000,
1089 state->m_oscClockFreq % 1000);
1093 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
1099 static int HI_Command(struct drxk_state *state, u16 cmd, u16 *pResult)
1107 status = write16(state, SIO_HI_RA_RAM_CMD__A, cmd);
1110 if (cmd == SIO_HI_RA_RAM_CMD_RESET)
1114 (bool) ((cmd == SIO_HI_RA_RAM_CMD_CONFIG) &&
1115 ((state->m_HICfgCtrl) &
1116 SIO_HI_RA_RAM_PAR_5_CFG_SLEEP__M) ==
1117 SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ);
1118 if (powerdown_cmd == false) {
1119 /* Wait until command rdy */
1126 status = read16(state, SIO_HI_RA_RAM_CMD__A,
1128 } while ((status < 0) && (retryCount < DRXK_MAX_RETRIES)
1132 status = read16(state, SIO_HI_RA_RAM_RES__A, pResult);
1136 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
1141 static int HI_CfgCommand(struct drxk_state *state)
1147 mutex_lock(&state->mutex);
1149 status = write16(state, SIO_HI_RA_RAM_PAR_6__A, state->m_HICfgTimeout);
1152 status = write16(state, SIO_HI_RA_RAM_PAR_5__A, state->m_HICfgCtrl);
1155 status = write16(state, SIO_HI_RA_RAM_PAR_4__A, state->m_HICfgWakeUpKey);
1158 status = write16(state, SIO_HI_RA_RAM_PAR_3__A, state->m_HICfgBridgeDelay);
1161 status = write16(state, SIO_HI_RA_RAM_PAR_2__A, state->m_HICfgTimingDiv);
1164 status = write16(state, SIO_HI_RA_RAM_PAR_1__A, SIO_HI_RA_RAM_PAR_1_PAR1_SEC_KEY);
1167 status = HI_Command(state, SIO_HI_RA_RAM_CMD_CONFIG, 0);
1171 state->m_HICfgCtrl &= ~SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ;
1173 mutex_unlock(&state->mutex);
1175 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
1179 static int InitHI(struct drxk_state *state)
1183 state->m_HICfgWakeUpKey = (state->demod_address << 1);
1184 state->m_HICfgTimeout = 0x96FF;
1185 /* port/bridge/power down ctrl */
1186 state->m_HICfgCtrl = SIO_HI_RA_RAM_PAR_5_CFG_SLV0_SLAVE;
1188 return HI_CfgCommand(state);
1191 static int MPEGTSConfigurePins(struct drxk_state *state, bool mpegEnable)
1194 u16 sioPdrMclkCfg = 0;
1195 u16 sioPdrMdxCfg = 0;
1199 /* stop lock indicator process */
1200 status = write16(state, SCU_RAM_GPIO__A, SCU_RAM_GPIO_HW_LOCK_IND_DISABLE);
1204 /* MPEG TS pad configuration */
1205 status = write16(state, SIO_TOP_COMM_KEY__A, 0xFABA);
1209 if (mpegEnable == false) {
1210 /* Set MPEG TS pads to inputmode */
1211 status = write16(state, SIO_PDR_MSTRT_CFG__A, 0x0000);
1214 status = write16(state, SIO_PDR_MERR_CFG__A, 0x0000);
1217 status = write16(state, SIO_PDR_MCLK_CFG__A, 0x0000);
1220 status = write16(state, SIO_PDR_MVAL_CFG__A, 0x0000);
1223 status = write16(state, SIO_PDR_MD0_CFG__A, 0x0000);
1226 status = write16(state, SIO_PDR_MD1_CFG__A, 0x0000);
1229 status = write16(state, SIO_PDR_MD2_CFG__A, 0x0000);
1232 status = write16(state, SIO_PDR_MD3_CFG__A, 0x0000);
1235 status = write16(state, SIO_PDR_MD4_CFG__A, 0x0000);
1238 status = write16(state, SIO_PDR_MD5_CFG__A, 0x0000);
1241 status = write16(state, SIO_PDR_MD6_CFG__A, 0x0000);
1244 status = write16(state, SIO_PDR_MD7_CFG__A, 0x0000);
1248 /* Enable MPEG output */
1250 ((state->m_TSDataStrength <<
1251 SIO_PDR_MD0_CFG_DRIVE__B) | 0x0003);
1252 sioPdrMclkCfg = ((state->m_TSClockkStrength <<
1253 SIO_PDR_MCLK_CFG_DRIVE__B) |
1256 status = write16(state, SIO_PDR_MSTRT_CFG__A, sioPdrMdxCfg);
1259 status = write16(state, SIO_PDR_MERR_CFG__A, 0x0000); /* Disable */
1262 status = write16(state, SIO_PDR_MVAL_CFG__A, 0x0000); /* Disable */
1265 if (state->m_enableParallel == true) {
1266 /* paralel -> enable MD1 to MD7 */
1267 status = write16(state, SIO_PDR_MD1_CFG__A, sioPdrMdxCfg);
1270 status = write16(state, SIO_PDR_MD2_CFG__A, sioPdrMdxCfg);
1273 status = write16(state, SIO_PDR_MD3_CFG__A, sioPdrMdxCfg);
1276 status = write16(state, SIO_PDR_MD4_CFG__A, sioPdrMdxCfg);
1279 status = write16(state, SIO_PDR_MD5_CFG__A, sioPdrMdxCfg);
1282 status = write16(state, SIO_PDR_MD6_CFG__A, sioPdrMdxCfg);
1285 status = write16(state, SIO_PDR_MD7_CFG__A, sioPdrMdxCfg);
1289 sioPdrMdxCfg = ((state->m_TSDataStrength <<
1290 SIO_PDR_MD0_CFG_DRIVE__B)
1292 /* serial -> disable MD1 to MD7 */
1293 status = write16(state, SIO_PDR_MD1_CFG__A, 0x0000);
1296 status = write16(state, SIO_PDR_MD2_CFG__A, 0x0000);
1299 status = write16(state, SIO_PDR_MD3_CFG__A, 0x0000);
1302 status = write16(state, SIO_PDR_MD4_CFG__A, 0x0000);
1305 status = write16(state, SIO_PDR_MD5_CFG__A, 0x0000);
1308 status = write16(state, SIO_PDR_MD6_CFG__A, 0x0000);
1311 status = write16(state, SIO_PDR_MD7_CFG__A, 0x0000);
1315 status = write16(state, SIO_PDR_MCLK_CFG__A, sioPdrMclkCfg);
1318 status = write16(state, SIO_PDR_MD0_CFG__A, sioPdrMdxCfg);
1322 /* Enable MB output over MPEG pads and ctl input */
1323 status = write16(state, SIO_PDR_MON_CFG__A, 0x0000);
1326 /* Write nomagic word to enable pdr reg write */
1327 status = write16(state, SIO_TOP_COMM_KEY__A, 0x0000);
1330 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
1334 static int MPEGTSDisable(struct drxk_state *state)
1338 return MPEGTSConfigurePins(state, false);
1341 static int BLChainCmd(struct drxk_state *state,
1342 u16 romOffset, u16 nrOfElements, u32 timeOut)
1349 mutex_lock(&state->mutex);
1350 status = write16(state, SIO_BL_MODE__A, SIO_BL_MODE_CHAIN);
1353 status = write16(state, SIO_BL_CHAIN_ADDR__A, romOffset);
1356 status = write16(state, SIO_BL_CHAIN_LEN__A, nrOfElements);
1359 status = write16(state, SIO_BL_ENABLE__A, SIO_BL_ENABLE_ON);
1363 end = jiffies + msecs_to_jiffies(timeOut);
1366 status = read16(state, SIO_BL_STATUS__A, &blStatus);
1369 } while ((blStatus == 0x1) &&
1370 ((time_is_after_jiffies(end))));
1372 if (blStatus == 0x1) {
1373 printk(KERN_ERR "drxk: SIO not ready\n");
1379 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
1381 mutex_unlock(&state->mutex);
1386 static int DownloadMicrocode(struct drxk_state *state,
1387 const u8 pMCImage[], u32 Length)
1389 const u8 *pSrc = pMCImage;
1402 /* down the drain (we don care about MAGIC_WORD) */
1403 Drain = (pSrc[0] << 8) | pSrc[1];
1404 pSrc += sizeof(u16);
1405 offset += sizeof(u16);
1406 nBlocks = (pSrc[0] << 8) | pSrc[1];
1407 pSrc += sizeof(u16);
1408 offset += sizeof(u16);
1410 for (i = 0; i < nBlocks; i += 1) {
1411 Address = (pSrc[0] << 24) | (pSrc[1] << 16) |
1412 (pSrc[2] << 8) | pSrc[3];
1413 pSrc += sizeof(u32);
1414 offset += sizeof(u32);
1416 BlockSize = ((pSrc[0] << 8) | pSrc[1]) * sizeof(u16);
1417 pSrc += sizeof(u16);
1418 offset += sizeof(u16);
1420 Flags = (pSrc[0] << 8) | pSrc[1];
1421 pSrc += sizeof(u16);
1422 offset += sizeof(u16);
1424 BlockCRC = (pSrc[0] << 8) | pSrc[1];
1425 pSrc += sizeof(u16);
1426 offset += sizeof(u16);
1428 if (offset + BlockSize > Length) {
1429 printk(KERN_ERR "drxk: Firmware is corrupted.\n");
1433 status = write_block(state, Address, BlockSize, pSrc);
1435 printk(KERN_ERR "drxk: Error %d while loading firmware\n", status);
1439 offset += BlockSize;
1444 static int DVBTEnableOFDMTokenRing(struct drxk_state *state, bool enable)
1448 u16 desiredCtrl = SIO_OFDM_SH_OFDM_RING_ENABLE_ON;
1449 u16 desiredStatus = SIO_OFDM_SH_OFDM_RING_STATUS_ENABLED;
1454 if (enable == false) {
1455 desiredCtrl = SIO_OFDM_SH_OFDM_RING_ENABLE_OFF;
1456 desiredStatus = SIO_OFDM_SH_OFDM_RING_STATUS_DOWN;
1459 status = read16(state, SIO_OFDM_SH_OFDM_RING_STATUS__A, &data);
1460 if (status >= 0 && data == desiredStatus) {
1461 /* tokenring already has correct status */
1464 /* Disable/enable dvbt tokenring bridge */
1465 status = write16(state, SIO_OFDM_SH_OFDM_RING_ENABLE__A, desiredCtrl);
1467 end = jiffies + msecs_to_jiffies(DRXK_OFDM_TR_SHUTDOWN_TIMEOUT);
1469 status = read16(state, SIO_OFDM_SH_OFDM_RING_STATUS__A, &data);
1470 if ((status >= 0 && data == desiredStatus) || time_is_after_jiffies(end))
1474 if (data != desiredStatus) {
1475 printk(KERN_ERR "drxk: SIO not ready\n");
1481 static int MPEGTSStop(struct drxk_state *state)
1484 u16 fecOcSncMode = 0;
1485 u16 fecOcIprMode = 0;
1489 /* Gracefull shutdown (byte boundaries) */
1490 status = read16(state, FEC_OC_SNC_MODE__A, &fecOcSncMode);
1493 fecOcSncMode |= FEC_OC_SNC_MODE_SHUTDOWN__M;
1494 status = write16(state, FEC_OC_SNC_MODE__A, fecOcSncMode);
1498 /* Suppress MCLK during absence of data */
1499 status = read16(state, FEC_OC_IPR_MODE__A, &fecOcIprMode);
1502 fecOcIprMode |= FEC_OC_IPR_MODE_MCLK_DIS_DAT_ABS__M;
1503 status = write16(state, FEC_OC_IPR_MODE__A, fecOcIprMode);
1507 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
1512 static int scu_command(struct drxk_state *state,
1513 u16 cmd, u8 parameterLen,
1514 u16 *parameter, u8 resultLen, u16 *result)
1516 #if (SCU_RAM_PARAM_0__A - SCU_RAM_PARAM_15__A) != 15
1517 #error DRXK register mapping no longer compatible with this routine!
1520 int status = -EINVAL;
1527 if ((cmd == 0) || ((parameterLen > 0) && (parameter == NULL)) ||
1528 ((resultLen > 0) && (result == NULL)))
1531 mutex_lock(&state->mutex);
1533 /* assume that the command register is ready
1534 since it is checked afterwards */
1535 for (ii = parameterLen - 1; ii >= 0; ii -= 1) {
1536 buffer[cnt++] = (parameter[ii] & 0xFF);
1537 buffer[cnt++] = ((parameter[ii] >> 8) & 0xFF);
1539 buffer[cnt++] = (cmd & 0xFF);
1540 buffer[cnt++] = ((cmd >> 8) & 0xFF);
1542 write_block(state, SCU_RAM_PARAM_0__A -
1543 (parameterLen - 1), cnt, buffer);
1544 /* Wait until SCU has processed command */
1545 end = jiffies + msecs_to_jiffies(DRXK_MAX_WAITTIME);
1548 status = read16(state, SCU_RAM_COMMAND__A, &curCmd);
1551 } while (!(curCmd == DRX_SCU_READY) && (time_is_after_jiffies(end)));
1552 if (curCmd != DRX_SCU_READY) {
1553 printk(KERN_ERR "drxk: SCU not ready\n");
1558 if ((resultLen > 0) && (result != NULL)) {
1562 for (ii = resultLen - 1; ii >= 0; ii -= 1) {
1563 status = read16(state, SCU_RAM_PARAM_0__A - ii, &result[ii]);
1568 /* Check if an error was reported by SCU */
1569 err = (s16)result[0];
1571 /* check a few fixed error codes */
1572 if (err == SCU_RESULT_UNKSTD) {
1573 printk(KERN_ERR "drxk: SCU_RESULT_UNKSTD\n");
1576 } else if (err == SCU_RESULT_UNKCMD) {
1577 printk(KERN_ERR "drxk: SCU_RESULT_UNKCMD\n");
1580 } else if (err < 0) {
1582 * here it is assumed that a nagative result means
1583 * error, and positive no error
1585 printk(KERN_ERR "drxk: %s ERROR: %d\n", __func__, err);
1593 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
1596 mutex_unlock(&state->mutex);
1600 static int SetIqmAf(struct drxk_state *state, bool active)
1608 status = read16(state, IQM_AF_STDBY__A, &data);
1613 data |= (IQM_AF_STDBY_STDBY_ADC_STANDBY
1614 | IQM_AF_STDBY_STDBY_AMP_STANDBY
1615 | IQM_AF_STDBY_STDBY_PD_STANDBY
1616 | IQM_AF_STDBY_STDBY_TAGC_IF_STANDBY
1617 | IQM_AF_STDBY_STDBY_TAGC_RF_STANDBY);
1619 data &= ((~IQM_AF_STDBY_STDBY_ADC_STANDBY)
1620 & (~IQM_AF_STDBY_STDBY_AMP_STANDBY)
1621 & (~IQM_AF_STDBY_STDBY_PD_STANDBY)
1622 & (~IQM_AF_STDBY_STDBY_TAGC_IF_STANDBY)
1623 & (~IQM_AF_STDBY_STDBY_TAGC_RF_STANDBY)
1626 status = write16(state, IQM_AF_STDBY__A, data);
1630 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
1634 static int CtrlPowerMode(struct drxk_state *state, enum DRXPowerMode *mode)
1637 u16 sioCcPwdMode = 0;
1641 /* Check arguments */
1647 sioCcPwdMode = SIO_CC_PWD_MODE_LEVEL_NONE;
1649 case DRXK_POWER_DOWN_OFDM:
1650 sioCcPwdMode = SIO_CC_PWD_MODE_LEVEL_OFDM;
1652 case DRXK_POWER_DOWN_CORE:
1653 sioCcPwdMode = SIO_CC_PWD_MODE_LEVEL_CLOCK;
1655 case DRXK_POWER_DOWN_PLL:
1656 sioCcPwdMode = SIO_CC_PWD_MODE_LEVEL_PLL;
1658 case DRX_POWER_DOWN:
1659 sioCcPwdMode = SIO_CC_PWD_MODE_LEVEL_OSC;
1662 /* Unknow sleep mode */
1667 /* If already in requested power mode, do nothing */
1668 if (state->m_currentPowerMode == *mode)
1671 /* For next steps make sure to start from DRX_POWER_UP mode */
1672 if (state->m_currentPowerMode != DRX_POWER_UP) {
1673 status = PowerUpDevice(state);
1676 status = DVBTEnableOFDMTokenRing(state, true);
1681 if (*mode == DRX_POWER_UP) {
1682 /* Restore analog & pin configuartion */
1684 /* Power down to requested mode */
1685 /* Backup some register settings */
1686 /* Set pins with possible pull-ups connected
1687 to them in input mode */
1688 /* Analog power down */
1689 /* ADC power down */
1690 /* Power down device */
1691 /* stop all comm_exec */
1692 /* Stop and power down previous standard */
1693 switch (state->m_OperationMode) {
1695 status = MPEGTSStop(state);
1698 status = PowerDownDVBT(state, false);
1704 status = MPEGTSStop(state);
1707 status = PowerDownQAM(state);
1714 status = DVBTEnableOFDMTokenRing(state, false);
1717 status = write16(state, SIO_CC_PWD_MODE__A, sioCcPwdMode);
1720 status = write16(state, SIO_CC_UPDATE__A, SIO_CC_UPDATE_KEY);
1724 if (*mode != DRXK_POWER_DOWN_OFDM) {
1725 state->m_HICfgCtrl |=
1726 SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ;
1727 status = HI_CfgCommand(state);
1732 state->m_currentPowerMode = *mode;
1736 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
1741 static int PowerDownDVBT(struct drxk_state *state, bool setPowerMode)
1743 enum DRXPowerMode powerMode = DRXK_POWER_DOWN_OFDM;
1750 status = read16(state, SCU_COMM_EXEC__A, &data);
1753 if (data == SCU_COMM_EXEC_ACTIVE) {
1754 /* Send OFDM stop command */
1755 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_OFDM | SCU_RAM_COMMAND_CMD_DEMOD_STOP, 0, NULL, 1, &cmdResult);
1758 /* Send OFDM reset command */
1759 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_OFDM | SCU_RAM_COMMAND_CMD_DEMOD_RESET, 0, NULL, 1, &cmdResult);
1764 /* Reset datapath for OFDM, processors first */
1765 status = write16(state, OFDM_SC_COMM_EXEC__A, OFDM_SC_COMM_EXEC_STOP);
1768 status = write16(state, OFDM_LC_COMM_EXEC__A, OFDM_LC_COMM_EXEC_STOP);
1771 status = write16(state, IQM_COMM_EXEC__A, IQM_COMM_EXEC_B_STOP);
1776 status = SetIqmAf(state, false);
1780 /* powerdown to OFDM mode */
1782 status = CtrlPowerMode(state, &powerMode);
1788 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
1792 static int SetOperationMode(struct drxk_state *state,
1793 enum OperationMode oMode)
1799 Stop and power down previous standard
1800 TODO investigate total power down instead of partial
1801 power down depending on "previous" standard.
1804 /* disable HW lock indicator */
1805 status = write16(state, SCU_RAM_GPIO__A, SCU_RAM_GPIO_HW_LOCK_IND_DISABLE);
1809 /* Device is already at the required mode */
1810 if (state->m_OperationMode == oMode)
1813 switch (state->m_OperationMode) {
1814 /* OM_NONE was added for start up */
1818 status = MPEGTSStop(state);
1821 status = PowerDownDVBT(state, true);
1824 state->m_OperationMode = OM_NONE;
1826 case OM_QAM_ITU_A: /* fallthrough */
1828 status = MPEGTSStop(state);
1831 status = PowerDownQAM(state);
1834 state->m_OperationMode = OM_NONE;
1843 Power up new standard
1847 state->m_OperationMode = oMode;
1848 status = SetDVBTStandard(state, oMode);
1852 case OM_QAM_ITU_A: /* fallthrough */
1854 state->m_OperationMode = oMode;
1855 status = SetQAMStandard(state, oMode);
1865 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
1869 static int Start(struct drxk_state *state, s32 offsetFreq,
1870 s32 IntermediateFrequency)
1872 int status = -EINVAL;
1875 s32 OffsetkHz = offsetFreq / 1000;
1878 if (state->m_DrxkState != DRXK_STOPPED &&
1879 state->m_DrxkState != DRXK_DTV_STARTED)
1882 state->m_bMirrorFreqSpect = (state->param.inversion == INVERSION_ON);
1884 if (IntermediateFrequency < 0) {
1885 state->m_bMirrorFreqSpect = !state->m_bMirrorFreqSpect;
1886 IntermediateFrequency = -IntermediateFrequency;
1889 switch (state->m_OperationMode) {
1892 IFreqkHz = (IntermediateFrequency / 1000);
1893 status = SetQAM(state, IFreqkHz, OffsetkHz);
1896 state->m_DrxkState = DRXK_DTV_STARTED;
1899 IFreqkHz = (IntermediateFrequency / 1000);
1900 status = MPEGTSStop(state);
1903 status = SetDVBT(state, IFreqkHz, OffsetkHz);
1906 status = DVBTStart(state);
1909 state->m_DrxkState = DRXK_DTV_STARTED;
1916 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
1920 static int ShutDown(struct drxk_state *state)
1928 static int GetLockStatus(struct drxk_state *state, u32 *pLockStatus,
1931 int status = -EINVAL;
1935 if (pLockStatus == NULL)
1938 *pLockStatus = NOT_LOCKED;
1940 /* define the SCU command code */
1941 switch (state->m_OperationMode) {
1945 status = GetQAMLockStatus(state, pLockStatus);
1948 status = GetDVBTLockStatus(state, pLockStatus);
1955 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
1959 static int MPEGTSStart(struct drxk_state *state)
1963 u16 fecOcSncMode = 0;
1965 /* Allow OC to sync again */
1966 status = read16(state, FEC_OC_SNC_MODE__A, &fecOcSncMode);
1969 fecOcSncMode &= ~FEC_OC_SNC_MODE_SHUTDOWN__M;
1970 status = write16(state, FEC_OC_SNC_MODE__A, fecOcSncMode);
1973 status = write16(state, FEC_OC_SNC_UNLOCK__A, 1);
1976 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
1980 static int MPEGTSDtoInit(struct drxk_state *state)
1986 /* Rate integration settings */
1987 status = write16(state, FEC_OC_RCN_CTL_STEP_LO__A, 0x0000);
1990 status = write16(state, FEC_OC_RCN_CTL_STEP_HI__A, 0x000C);
1993 status = write16(state, FEC_OC_RCN_GAIN__A, 0x000A);
1996 status = write16(state, FEC_OC_AVR_PARM_A__A, 0x0008);
1999 status = write16(state, FEC_OC_AVR_PARM_B__A, 0x0006);
2002 status = write16(state, FEC_OC_TMD_HI_MARGIN__A, 0x0680);
2005 status = write16(state, FEC_OC_TMD_LO_MARGIN__A, 0x0080);
2008 status = write16(state, FEC_OC_TMD_COUNT__A, 0x03F4);
2012 /* Additional configuration */
2013 status = write16(state, FEC_OC_OCR_INVERT__A, 0);
2016 status = write16(state, FEC_OC_SNC_LWM__A, 2);
2019 status = write16(state, FEC_OC_SNC_HWM__A, 12);
2022 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
2027 static int MPEGTSDtoSetup(struct drxk_state *state,
2028 enum OperationMode oMode)
2032 u16 fecOcRegMode = 0; /* FEC_OC_MODE register value */
2033 u16 fecOcRegIprMode = 0; /* FEC_OC_IPR_MODE register value */
2034 u16 fecOcDtoMode = 0; /* FEC_OC_IPR_INVERT register value */
2035 u16 fecOcFctMode = 0; /* FEC_OC_IPR_INVERT register value */
2036 u16 fecOcDtoPeriod = 2; /* FEC_OC_IPR_INVERT register value */
2037 u16 fecOcDtoBurstLen = 188; /* FEC_OC_IPR_INVERT register value */
2038 u32 fecOcRcnCtlRate = 0; /* FEC_OC_IPR_INVERT register value */
2039 u16 fecOcTmdMode = 0;
2040 u16 fecOcTmdIntUpdRate = 0;
2042 bool staticCLK = false;
2046 /* Check insertion of the Reed-Solomon parity bytes */
2047 status = read16(state, FEC_OC_MODE__A, &fecOcRegMode);
2050 status = read16(state, FEC_OC_IPR_MODE__A, &fecOcRegIprMode);
2053 fecOcRegMode &= (~FEC_OC_MODE_PARITY__M);
2054 fecOcRegIprMode &= (~FEC_OC_IPR_MODE_MVAL_DIS_PAR__M);
2055 if (state->m_insertRSByte == true) {
2056 /* enable parity symbol forward */
2057 fecOcRegMode |= FEC_OC_MODE_PARITY__M;
2058 /* MVAL disable during parity bytes */
2059 fecOcRegIprMode |= FEC_OC_IPR_MODE_MVAL_DIS_PAR__M;
2060 /* TS burst length to 204 */
2061 fecOcDtoBurstLen = 204;
2064 /* Check serial or parrallel output */
2065 fecOcRegIprMode &= (~(FEC_OC_IPR_MODE_SERIAL__M));
2066 if (state->m_enableParallel == false) {
2067 /* MPEG data output is serial -> set ipr_mode[0] */
2068 fecOcRegIprMode |= FEC_OC_IPR_MODE_SERIAL__M;
2073 maxBitRate = state->m_DVBTBitrate;
2075 fecOcRcnCtlRate = 0xC00000;
2076 staticCLK = state->m_DVBTStaticCLK;
2078 case OM_QAM_ITU_A: /* fallthrough */
2080 fecOcTmdMode = 0x0004;
2081 fecOcRcnCtlRate = 0xD2B4EE; /* good for >63 Mb/s */
2082 maxBitRate = state->m_DVBCBitrate;
2083 staticCLK = state->m_DVBCStaticCLK;
2087 } /* switch (standard) */
2091 /* Configure DTO's */
2095 /* Rational DTO for MCLK source (static MCLK rate),
2096 Dynamic DTO for optimal grouping
2097 (avoid intra-packet gaps),
2098 DTO offset enable to sync TS burst with MSTRT */
2099 fecOcDtoMode = (FEC_OC_DTO_MODE_DYNAMIC__M |
2100 FEC_OC_DTO_MODE_OFFSET_ENABLE__M);
2101 fecOcFctMode = (FEC_OC_FCT_MODE_RAT_ENA__M |
2102 FEC_OC_FCT_MODE_VIRT_ENA__M);
2104 /* Check user defined bitrate */
2105 bitRate = maxBitRate;
2106 if (bitRate > 75900000UL) { /* max is 75.9 Mb/s */
2107 bitRate = 75900000UL;
2109 /* Rational DTO period:
2110 dto_period = (Fsys / bitrate) - 2
2112 Result should be floored,
2113 to make sure >= requested bitrate
2115 fecOcDtoPeriod = (u16) (((state->m_sysClockFreq)
2117 if (fecOcDtoPeriod <= 2)
2120 fecOcDtoPeriod -= 2;
2121 fecOcTmdIntUpdRate = 8;
2123 /* (commonAttr->staticCLK == false) => dynamic mode */
2124 fecOcDtoMode = FEC_OC_DTO_MODE_DYNAMIC__M;
2125 fecOcFctMode = FEC_OC_FCT_MODE__PRE;
2126 fecOcTmdIntUpdRate = 5;
2129 /* Write appropriate registers with requested configuration */
2130 status = write16(state, FEC_OC_DTO_BURST_LEN__A, fecOcDtoBurstLen);
2133 status = write16(state, FEC_OC_DTO_PERIOD__A, fecOcDtoPeriod);
2136 status = write16(state, FEC_OC_DTO_MODE__A, fecOcDtoMode);
2139 status = write16(state, FEC_OC_FCT_MODE__A, fecOcFctMode);
2142 status = write16(state, FEC_OC_MODE__A, fecOcRegMode);
2145 status = write16(state, FEC_OC_IPR_MODE__A, fecOcRegIprMode);
2149 /* Rate integration settings */
2150 status = write32(state, FEC_OC_RCN_CTL_RATE_LO__A, fecOcRcnCtlRate);
2153 status = write16(state, FEC_OC_TMD_INT_UPD_RATE__A, fecOcTmdIntUpdRate);
2156 status = write16(state, FEC_OC_TMD_MODE__A, fecOcTmdMode);
2159 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
2163 static int MPEGTSConfigurePolarity(struct drxk_state *state)
2165 u16 fecOcRegIprInvert = 0;
2167 /* Data mask for the output data byte */
2168 u16 InvertDataMask =
2169 FEC_OC_IPR_INVERT_MD7__M | FEC_OC_IPR_INVERT_MD6__M |
2170 FEC_OC_IPR_INVERT_MD5__M | FEC_OC_IPR_INVERT_MD4__M |
2171 FEC_OC_IPR_INVERT_MD3__M | FEC_OC_IPR_INVERT_MD2__M |
2172 FEC_OC_IPR_INVERT_MD1__M | FEC_OC_IPR_INVERT_MD0__M;
2176 /* Control selective inversion of output bits */
2177 fecOcRegIprInvert &= (~(InvertDataMask));
2178 if (state->m_invertDATA == true)
2179 fecOcRegIprInvert |= InvertDataMask;
2180 fecOcRegIprInvert &= (~(FEC_OC_IPR_INVERT_MERR__M));
2181 if (state->m_invertERR == true)
2182 fecOcRegIprInvert |= FEC_OC_IPR_INVERT_MERR__M;
2183 fecOcRegIprInvert &= (~(FEC_OC_IPR_INVERT_MSTRT__M));
2184 if (state->m_invertSTR == true)
2185 fecOcRegIprInvert |= FEC_OC_IPR_INVERT_MSTRT__M;
2186 fecOcRegIprInvert &= (~(FEC_OC_IPR_INVERT_MVAL__M));
2187 if (state->m_invertVAL == true)
2188 fecOcRegIprInvert |= FEC_OC_IPR_INVERT_MVAL__M;
2189 fecOcRegIprInvert &= (~(FEC_OC_IPR_INVERT_MCLK__M));
2190 if (state->m_invertCLK == true)
2191 fecOcRegIprInvert |= FEC_OC_IPR_INVERT_MCLK__M;
2193 return write16(state, FEC_OC_IPR_INVERT__A, fecOcRegIprInvert);
2196 #define SCU_RAM_AGC_KI_INV_RF_POL__M 0x4000
2198 static int SetAgcRf(struct drxk_state *state,
2199 struct SCfgAgc *pAgcCfg, bool isDTV)
2201 int status = -EINVAL;
2203 struct SCfgAgc *pIfAgcSettings;
2207 if (pAgcCfg == NULL)
2210 switch (pAgcCfg->ctrlMode) {
2211 case DRXK_AGC_CTRL_AUTO:
2212 /* Enable RF AGC DAC */
2213 status = read16(state, IQM_AF_STDBY__A, &data);
2216 data &= ~IQM_AF_STDBY_STDBY_TAGC_RF_STANDBY;
2217 status = write16(state, IQM_AF_STDBY__A, data);
2220 status = read16(state, SCU_RAM_AGC_CONFIG__A, &data);
2224 /* Enable SCU RF AGC loop */
2225 data &= ~SCU_RAM_AGC_CONFIG_DISABLE_RF_AGC__M;
2228 if (state->m_RfAgcPol)
2229 data |= SCU_RAM_AGC_CONFIG_INV_RF_POL__M;
2231 data &= ~SCU_RAM_AGC_CONFIG_INV_RF_POL__M;
2232 status = write16(state, SCU_RAM_AGC_CONFIG__A, data);
2236 /* Set speed (using complementary reduction value) */
2237 status = read16(state, SCU_RAM_AGC_KI_RED__A, &data);
2241 data &= ~SCU_RAM_AGC_KI_RED_RAGC_RED__M;
2242 data |= (~(pAgcCfg->speed <<
2243 SCU_RAM_AGC_KI_RED_RAGC_RED__B)
2244 & SCU_RAM_AGC_KI_RED_RAGC_RED__M);
2246 status = write16(state, SCU_RAM_AGC_KI_RED__A, data);
2251 pIfAgcSettings = &state->m_dvbtIfAgcCfg;
2252 else if (IsQAM(state))
2253 pIfAgcSettings = &state->m_qamIfAgcCfg;
2255 pIfAgcSettings = &state->m_atvIfAgcCfg;
2256 if (pIfAgcSettings == NULL) {
2261 /* Set TOP, only if IF-AGC is in AUTO mode */
2262 if (pIfAgcSettings->ctrlMode == DRXK_AGC_CTRL_AUTO)
2263 status = write16(state, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A, pAgcCfg->top);
2267 /* Cut-Off current */
2268 status = write16(state, SCU_RAM_AGC_RF_IACCU_HI_CO__A, pAgcCfg->cutOffCurrent);
2272 /* Max. output level */
2273 status = write16(state, SCU_RAM_AGC_RF_MAX__A, pAgcCfg->maxOutputLevel);
2279 case DRXK_AGC_CTRL_USER:
2280 /* Enable RF AGC DAC */
2281 status = read16(state, IQM_AF_STDBY__A, &data);
2284 data &= ~IQM_AF_STDBY_STDBY_TAGC_RF_STANDBY;
2285 status = write16(state, IQM_AF_STDBY__A, data);
2289 /* Disable SCU RF AGC loop */
2290 status = read16(state, SCU_RAM_AGC_CONFIG__A, &data);
2293 data |= SCU_RAM_AGC_CONFIG_DISABLE_RF_AGC__M;
2294 if (state->m_RfAgcPol)
2295 data |= SCU_RAM_AGC_CONFIG_INV_RF_POL__M;
2297 data &= ~SCU_RAM_AGC_CONFIG_INV_RF_POL__M;
2298 status = write16(state, SCU_RAM_AGC_CONFIG__A, data);
2302 /* SCU c.o.c. to 0, enabling full control range */
2303 status = write16(state, SCU_RAM_AGC_RF_IACCU_HI_CO__A, 0);
2307 /* Write value to output pin */
2308 status = write16(state, SCU_RAM_AGC_RF_IACCU_HI__A, pAgcCfg->outputLevel);
2313 case DRXK_AGC_CTRL_OFF:
2314 /* Disable RF AGC DAC */
2315 status = read16(state, IQM_AF_STDBY__A, &data);
2318 data |= IQM_AF_STDBY_STDBY_TAGC_RF_STANDBY;
2319 status = write16(state, IQM_AF_STDBY__A, data);
2323 /* Disable SCU RF AGC loop */
2324 status = read16(state, SCU_RAM_AGC_CONFIG__A, &data);
2327 data |= SCU_RAM_AGC_CONFIG_DISABLE_RF_AGC__M;
2328 status = write16(state, SCU_RAM_AGC_CONFIG__A, data);
2339 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
2343 #define SCU_RAM_AGC_KI_INV_IF_POL__M 0x2000
2345 static int SetAgcIf(struct drxk_state *state,
2346 struct SCfgAgc *pAgcCfg, bool isDTV)
2350 struct SCfgAgc *pRfAgcSettings;
2354 switch (pAgcCfg->ctrlMode) {
2355 case DRXK_AGC_CTRL_AUTO:
2357 /* Enable IF AGC DAC */
2358 status = read16(state, IQM_AF_STDBY__A, &data);
2361 data &= ~IQM_AF_STDBY_STDBY_TAGC_IF_STANDBY;
2362 status = write16(state, IQM_AF_STDBY__A, data);
2366 status = read16(state, SCU_RAM_AGC_CONFIG__A, &data);
2370 /* Enable SCU IF AGC loop */
2371 data &= ~SCU_RAM_AGC_CONFIG_DISABLE_IF_AGC__M;
2374 if (state->m_IfAgcPol)
2375 data |= SCU_RAM_AGC_CONFIG_INV_IF_POL__M;
2377 data &= ~SCU_RAM_AGC_CONFIG_INV_IF_POL__M;
2378 status = write16(state, SCU_RAM_AGC_CONFIG__A, data);
2382 /* Set speed (using complementary reduction value) */
2383 status = read16(state, SCU_RAM_AGC_KI_RED__A, &data);
2386 data &= ~SCU_RAM_AGC_KI_RED_IAGC_RED__M;
2387 data |= (~(pAgcCfg->speed <<
2388 SCU_RAM_AGC_KI_RED_IAGC_RED__B)
2389 & SCU_RAM_AGC_KI_RED_IAGC_RED__M);
2391 status = write16(state, SCU_RAM_AGC_KI_RED__A, data);
2396 pRfAgcSettings = &state->m_qamRfAgcCfg;
2398 pRfAgcSettings = &state->m_atvRfAgcCfg;
2399 if (pRfAgcSettings == NULL)
2402 status = write16(state, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A, pRfAgcSettings->top);
2407 case DRXK_AGC_CTRL_USER:
2409 /* Enable IF AGC DAC */
2410 status = read16(state, IQM_AF_STDBY__A, &data);
2413 data &= ~IQM_AF_STDBY_STDBY_TAGC_IF_STANDBY;
2414 status = write16(state, IQM_AF_STDBY__A, data);
2418 status = read16(state, SCU_RAM_AGC_CONFIG__A, &data);
2422 /* Disable SCU IF AGC loop */
2423 data |= SCU_RAM_AGC_CONFIG_DISABLE_IF_AGC__M;
2426 if (state->m_IfAgcPol)
2427 data |= SCU_RAM_AGC_CONFIG_INV_IF_POL__M;
2429 data &= ~SCU_RAM_AGC_CONFIG_INV_IF_POL__M;
2430 status = write16(state, SCU_RAM_AGC_CONFIG__A, data);
2434 /* Write value to output pin */
2435 status = write16(state, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A, pAgcCfg->outputLevel);
2440 case DRXK_AGC_CTRL_OFF:
2442 /* Disable If AGC DAC */
2443 status = read16(state, IQM_AF_STDBY__A, &data);
2446 data |= IQM_AF_STDBY_STDBY_TAGC_IF_STANDBY;
2447 status = write16(state, IQM_AF_STDBY__A, data);
2451 /* Disable SCU IF AGC loop */
2452 status = read16(state, SCU_RAM_AGC_CONFIG__A, &data);
2455 data |= SCU_RAM_AGC_CONFIG_DISABLE_IF_AGC__M;
2456 status = write16(state, SCU_RAM_AGC_CONFIG__A, data);
2460 } /* switch (agcSettingsIf->ctrlMode) */
2462 /* always set the top to support
2463 configurations without if-loop */
2464 status = write16(state, SCU_RAM_AGC_INGAIN_TGT_MIN__A, pAgcCfg->top);
2467 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
2471 static int ReadIFAgc(struct drxk_state *state, u32 *pValue)
2479 status = read16(state, IQM_AF_AGC_IF__A, &agcDacLvl);
2481 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
2487 if (agcDacLvl > DRXK_AGC_DAC_OFFSET)
2488 Level = agcDacLvl - DRXK_AGC_DAC_OFFSET;
2490 *pValue = (14000 - Level) / 4;
2497 static int GetQAMSignalToNoise(struct drxk_state *state,
2498 s32 *pSignalToNoise)
2501 u16 qamSlErrPower = 0; /* accum. error between
2502 raw and sliced symbols */
2503 u32 qamSlSigPower = 0; /* used for MER, depends of
2504 QAM constellation */
2505 u32 qamSlMer = 0; /* QAM MER */
2509 /* MER calculation */
2511 /* get the register value needed for MER */
2512 status = read16(state, QAM_SL_ERR_POWER__A, &qamSlErrPower);
2514 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
2518 switch (state->param.u.qam.modulation) {
2520 qamSlSigPower = DRXK_QAM_SL_SIG_POWER_QAM16 << 2;
2523 qamSlSigPower = DRXK_QAM_SL_SIG_POWER_QAM32 << 2;
2526 qamSlSigPower = DRXK_QAM_SL_SIG_POWER_QAM64 << 2;
2529 qamSlSigPower = DRXK_QAM_SL_SIG_POWER_QAM128 << 2;
2533 qamSlSigPower = DRXK_QAM_SL_SIG_POWER_QAM256 << 2;
2537 if (qamSlErrPower > 0) {
2538 qamSlMer = Log10Times100(qamSlSigPower) -
2539 Log10Times100((u32) qamSlErrPower);
2541 *pSignalToNoise = qamSlMer;
2546 static int GetDVBTSignalToNoise(struct drxk_state *state,
2547 s32 *pSignalToNoise)
2551 u32 EqRegTdSqrErrI = 0;
2552 u32 EqRegTdSqrErrQ = 0;
2553 u16 EqRegTdSqrErrExp = 0;
2554 u16 EqRegTdTpsPwrOfs = 0;
2555 u16 EqRegTdReqSmbCnt = 0;
2562 u16 transmissionParams = 0;
2566 status = read16(state, OFDM_EQ_TOP_TD_TPS_PWR_OFS__A, &EqRegTdTpsPwrOfs);
2569 status = read16(state, OFDM_EQ_TOP_TD_REQ_SMB_CNT__A, &EqRegTdReqSmbCnt);
2572 status = read16(state, OFDM_EQ_TOP_TD_SQR_ERR_EXP__A, &EqRegTdSqrErrExp);
2575 status = read16(state, OFDM_EQ_TOP_TD_SQR_ERR_I__A, ®Data);
2578 /* Extend SQR_ERR_I operational range */
2579 EqRegTdSqrErrI = (u32) regData;
2580 if ((EqRegTdSqrErrExp > 11) &&
2581 (EqRegTdSqrErrI < 0x00000FFFUL)) {
2582 EqRegTdSqrErrI += 0x00010000UL;
2584 status = read16(state, OFDM_EQ_TOP_TD_SQR_ERR_Q__A, ®Data);
2587 /* Extend SQR_ERR_Q operational range */
2588 EqRegTdSqrErrQ = (u32) regData;
2589 if ((EqRegTdSqrErrExp > 11) &&
2590 (EqRegTdSqrErrQ < 0x00000FFFUL))
2591 EqRegTdSqrErrQ += 0x00010000UL;
2593 status = read16(state, OFDM_SC_RA_RAM_OP_PARAM__A, &transmissionParams);
2597 /* Check input data for MER */
2599 /* MER calculation (in 0.1 dB) without math.h */
2600 if ((EqRegTdTpsPwrOfs == 0) || (EqRegTdReqSmbCnt == 0))
2602 else if ((EqRegTdSqrErrI + EqRegTdSqrErrQ) == 0) {
2603 /* No error at all, this must be the HW reset value
2604 * Apparently no first measurement yet
2608 SqrErrIQ = (EqRegTdSqrErrI + EqRegTdSqrErrQ) <<
2610 if ((transmissionParams &
2611 OFDM_SC_RA_RAM_OP_PARAM_MODE__M)
2612 == OFDM_SC_RA_RAM_OP_PARAM_MODE_2K)
2617 /* IMER = 100 * log10 (x)
2618 where x = (EqRegTdTpsPwrOfs^2 *
2619 EqRegTdReqSmbCnt * tpsCnt)/SqrErrIQ
2622 where a = 100 * log10 (EqRegTdTpsPwrOfs^2)
2623 b = 100 * log10 (EqRegTdReqSmbCnt * tpsCnt)
2624 c = 100 * log10 (SqrErrIQ)
2627 /* log(x) x = 9bits * 9bits->18 bits */
2628 a = Log10Times100(EqRegTdTpsPwrOfs *
2630 /* log(x) x = 16bits * 7bits->23 bits */
2631 b = Log10Times100(EqRegTdReqSmbCnt * tpsCnt);
2632 /* log(x) x = (16bits + 16bits) << 15 ->32 bits */
2633 c = Log10Times100(SqrErrIQ);
2636 /* No negative MER, clip to zero */
2642 *pSignalToNoise = iMER;
2646 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
2650 static int GetSignalToNoise(struct drxk_state *state, s32 *pSignalToNoise)
2654 *pSignalToNoise = 0;
2655 switch (state->m_OperationMode) {
2657 return GetDVBTSignalToNoise(state, pSignalToNoise);
2660 return GetQAMSignalToNoise(state, pSignalToNoise);
2668 static int GetDVBTQuality(struct drxk_state *state, s32 *pQuality)
2670 /* SNR Values for quasi errorfree reception rom Nordig 2.2 */
2675 static s32 QE_SN[] = {
2681 108, /* 16-QAM 1/2 */
2682 131, /* 16-QAM 2/3 */
2683 146, /* 16-QAM 3/4 */
2684 156, /* 16-QAM 5/6 */
2685 160, /* 16-QAM 7/8 */
2686 165, /* 64-QAM 1/2 */
2687 187, /* 64-QAM 2/3 */
2688 202, /* 64-QAM 3/4 */
2689 216, /* 64-QAM 5/6 */
2690 225, /* 64-QAM 7/8 */
2696 s32 SignalToNoise = 0;
2697 u16 Constellation = 0;
2699 u32 SignalToNoiseRel;
2702 status = GetDVBTSignalToNoise(state, &SignalToNoise);
2705 status = read16(state, OFDM_EQ_TOP_TD_TPS_CONST__A, &Constellation);
2708 Constellation &= OFDM_EQ_TOP_TD_TPS_CONST__M;
2710 status = read16(state, OFDM_EQ_TOP_TD_TPS_CODE_HP__A, &CodeRate);
2713 CodeRate &= OFDM_EQ_TOP_TD_TPS_CODE_HP__M;
2715 if (Constellation > OFDM_EQ_TOP_TD_TPS_CONST_64QAM ||
2716 CodeRate > OFDM_EQ_TOP_TD_TPS_CODE_LP_7_8)
2718 SignalToNoiseRel = SignalToNoise -
2719 QE_SN[Constellation * 5 + CodeRate];
2722 if (SignalToNoiseRel < -70)
2724 else if (SignalToNoiseRel < 30)
2725 *pQuality = ((SignalToNoiseRel + 70) *
2728 *pQuality = BERQuality;
2733 static int GetDVBCQuality(struct drxk_state *state, s32 *pQuality)
2741 u32 SignalToNoise = 0;
2742 u32 BERQuality = 100;
2743 u32 SignalToNoiseRel = 0;
2745 status = GetQAMSignalToNoise(state, &SignalToNoise);
2749 switch (state->param.u.qam.modulation) {
2751 SignalToNoiseRel = SignalToNoise - 200;
2754 SignalToNoiseRel = SignalToNoise - 230;
2755 break; /* Not in NorDig */
2757 SignalToNoiseRel = SignalToNoise - 260;
2760 SignalToNoiseRel = SignalToNoise - 290;
2764 SignalToNoiseRel = SignalToNoise - 320;
2768 if (SignalToNoiseRel < -70)
2770 else if (SignalToNoiseRel < 30)
2771 *pQuality = ((SignalToNoiseRel + 70) *
2774 *pQuality = BERQuality;
2780 static int GetQuality(struct drxk_state *state, s32 *pQuality)
2784 switch (state->m_OperationMode) {
2786 return GetDVBTQuality(state, pQuality);
2788 return GetDVBCQuality(state, pQuality);
2797 /* Free data ram in SIO HI */
2798 #define SIO_HI_RA_RAM_USR_BEGIN__A 0x420040
2799 #define SIO_HI_RA_RAM_USR_END__A 0x420060
2801 #define DRXK_HI_ATOMIC_BUF_START (SIO_HI_RA_RAM_USR_BEGIN__A)
2802 #define DRXK_HI_ATOMIC_BUF_END (SIO_HI_RA_RAM_USR_BEGIN__A + 7)
2803 #define DRXK_HI_ATOMIC_READ SIO_HI_RA_RAM_PAR_3_ACP_RW_READ
2804 #define DRXK_HI_ATOMIC_WRITE SIO_HI_RA_RAM_PAR_3_ACP_RW_WRITE
2806 #define DRXDAP_FASI_ADDR2BLOCK(addr) (((addr) >> 22) & 0x3F)
2807 #define DRXDAP_FASI_ADDR2BANK(addr) (((addr) >> 16) & 0x3F)
2808 #define DRXDAP_FASI_ADDR2OFFSET(addr) ((addr) & 0x7FFF)
2810 static int ConfigureI2CBridge(struct drxk_state *state, bool bEnableBridge)
2812 int status = -EINVAL;
2816 if (state->m_DrxkState == DRXK_UNINITIALIZED)
2818 if (state->m_DrxkState == DRXK_POWERED_DOWN)
2821 if (state->no_i2c_bridge)
2824 status = write16(state, SIO_HI_RA_RAM_PAR_1__A, SIO_HI_RA_RAM_PAR_1_PAR1_SEC_KEY);
2827 if (bEnableBridge) {
2828 status = write16(state, SIO_HI_RA_RAM_PAR_2__A, SIO_HI_RA_RAM_PAR_2_BRD_CFG_CLOSED);
2832 status = write16(state, SIO_HI_RA_RAM_PAR_2__A, SIO_HI_RA_RAM_PAR_2_BRD_CFG_OPEN);
2837 status = HI_Command(state, SIO_HI_RA_RAM_CMD_BRDCTRL, 0);
2841 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
2845 static int SetPreSaw(struct drxk_state *state,
2846 struct SCfgPreSaw *pPreSawCfg)
2848 int status = -EINVAL;
2852 if ((pPreSawCfg == NULL)
2853 || (pPreSawCfg->reference > IQM_AF_PDREF__M))
2856 status = write16(state, IQM_AF_PDREF__A, pPreSawCfg->reference);
2859 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
2863 static int BLDirectCmd(struct drxk_state *state, u32 targetAddr,
2864 u16 romOffset, u16 nrOfElements, u32 timeOut)
2867 u16 offset = (u16) ((targetAddr >> 0) & 0x00FFFF);
2868 u16 blockbank = (u16) ((targetAddr >> 16) & 0x000FFF);
2874 mutex_lock(&state->mutex);
2875 status = write16(state, SIO_BL_MODE__A, SIO_BL_MODE_DIRECT);
2878 status = write16(state, SIO_BL_TGT_HDR__A, blockbank);
2881 status = write16(state, SIO_BL_TGT_ADDR__A, offset);
2884 status = write16(state, SIO_BL_SRC_ADDR__A, romOffset);
2887 status = write16(state, SIO_BL_SRC_LEN__A, nrOfElements);
2890 status = write16(state, SIO_BL_ENABLE__A, SIO_BL_ENABLE_ON);
2894 end = jiffies + msecs_to_jiffies(timeOut);
2896 status = read16(state, SIO_BL_STATUS__A, &blStatus);
2899 } while ((blStatus == 0x1) && time_is_after_jiffies(end));
2900 if (blStatus == 0x1) {
2901 printk(KERN_ERR "drxk: SIO not ready\n");
2907 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
2909 mutex_unlock(&state->mutex);
2914 static int ADCSyncMeasurement(struct drxk_state *state, u16 *count)
2921 /* Start measurement */
2922 status = write16(state, IQM_AF_COMM_EXEC__A, IQM_AF_COMM_EXEC_ACTIVE);
2925 status = write16(state, IQM_AF_START_LOCK__A, 1);
2930 status = read16(state, IQM_AF_PHASE0__A, &data);
2934 *count = *count + 1;
2935 status = read16(state, IQM_AF_PHASE1__A, &data);
2939 *count = *count + 1;
2940 status = read16(state, IQM_AF_PHASE2__A, &data);
2944 *count = *count + 1;
2948 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
2952 static int ADCSynchronization(struct drxk_state *state)
2959 status = ADCSyncMeasurement(state, &count);
2964 /* Try sampling on a diffrent edge */
2967 status = read16(state, IQM_AF_CLKNEG__A, &clkNeg);
2970 if ((clkNeg | IQM_AF_CLKNEG_CLKNEGDATA__M) ==
2971 IQM_AF_CLKNEG_CLKNEGDATA_CLK_ADC_DATA_POS) {
2972 clkNeg &= (~(IQM_AF_CLKNEG_CLKNEGDATA__M));
2974 IQM_AF_CLKNEG_CLKNEGDATA_CLK_ADC_DATA_NEG;
2976 clkNeg &= (~(IQM_AF_CLKNEG_CLKNEGDATA__M));
2978 IQM_AF_CLKNEG_CLKNEGDATA_CLK_ADC_DATA_POS;
2980 status = write16(state, IQM_AF_CLKNEG__A, clkNeg);
2983 status = ADCSyncMeasurement(state, &count);
2992 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
2996 static int SetFrequencyShifter(struct drxk_state *state,
2997 u16 intermediateFreqkHz,
2998 s32 tunerFreqOffset, bool isDTV)
3000 bool selectPosImage = false;
3001 u32 rfFreqResidual = tunerFreqOffset;
3002 u32 fmFrequencyShift = 0;
3003 bool tunerMirror = !state->m_bMirrorFreqSpect;
3008 u32 samplingFrequency = (u32) (state->m_sysClockFreq / 3);
3015 Program frequency shifter
3016 No need to account for mirroring on RF
3019 if ((state->m_OperationMode == OM_QAM_ITU_A) ||
3020 (state->m_OperationMode == OM_QAM_ITU_C) ||
3021 (state->m_OperationMode == OM_DVBT))
3022 selectPosImage = true;
3024 selectPosImage = false;
3027 /* tuner doesn't mirror */
3028 ifFreqActual = intermediateFreqkHz +
3029 rfFreqResidual + fmFrequencyShift;
3032 ifFreqActual = intermediateFreqkHz -
3033 rfFreqResidual - fmFrequencyShift;
3034 if (ifFreqActual > samplingFrequency / 2) {
3036 adcFreq = samplingFrequency - ifFreqActual;
3039 /* adc doesn't mirror */
3040 adcFreq = ifFreqActual;
3044 frequencyShift = adcFreq;
3045 imageToSelect = state->m_rfmirror ^ tunerMirror ^
3046 adcFlip ^ selectPosImage;
3047 state->m_IqmFsRateOfs =
3048 Frac28a((frequencyShift), samplingFrequency);
3051 state->m_IqmFsRateOfs = ~state->m_IqmFsRateOfs + 1;
3053 /* Program frequency shifter with tuner offset compensation */
3054 /* frequencyShift += tunerFreqOffset; TODO */
3055 status = write32(state, IQM_FS_RATE_OFS_LO__A,
3056 state->m_IqmFsRateOfs);
3058 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
3062 static int InitAGC(struct drxk_state *state, bool isDTV)
3065 u16 ingainTgtMin = 0;
3066 u16 ingainTgtMax = 0;
3074 u16 kiInnergainMin = 0;
3075 u16 ifIaccuHiTgt = 0;
3076 u16 ifIaccuHiTgtMin = 0;
3077 u16 ifIaccuHiTgtMax = 0;
3079 u16 fastClpCtrlDelay = 0;
3080 u16 clpCtrlMode = 0;
3085 /* Common settings */
3087 ifIaccuHiTgtMin = 2047;
3091 /* AGCInit() not available for DVBT; init done in microcode */
3092 if (!IsQAM(state)) {
3093 printk(KERN_ERR "drxk: %s: mode %d is not DVB-C\n", __func__, state->m_OperationMode);
3097 /* FIXME: Analog TV AGC require different settings */
3099 /* Standard specific settings */
3101 clpDirTo = (u16) -9;
3104 snsDirTo = (u16) -9;
3105 kiInnergainMin = (u16) -1030;
3106 ifIaccuHiTgtMax = 0x2380;
3107 ifIaccuHiTgt = 0x2380;
3108 ingainTgtMin = 0x0511;
3110 ingainTgtMax = 5119;
3111 fastClpCtrlDelay = state->m_qamIfAgcCfg.FastClipCtrlDelay;
3113 status = write16(state, SCU_RAM_AGC_FAST_CLP_CTRL_DELAY__A, fastClpCtrlDelay);
3117 status = write16(state, SCU_RAM_AGC_CLP_CTRL_MODE__A, clpCtrlMode);
3120 status = write16(state, SCU_RAM_AGC_INGAIN_TGT__A, ingainTgt);
3123 status = write16(state, SCU_RAM_AGC_INGAIN_TGT_MIN__A, ingainTgtMin);
3126 status = write16(state, SCU_RAM_AGC_INGAIN_TGT_MAX__A, ingainTgtMax);
3129 status = write16(state, SCU_RAM_AGC_IF_IACCU_HI_TGT_MIN__A, ifIaccuHiTgtMin);
3132 status = write16(state, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A, ifIaccuHiTgtMax);
3135 status = write16(state, SCU_RAM_AGC_IF_IACCU_HI__A, 0);
3138 status = write16(state, SCU_RAM_AGC_IF_IACCU_LO__A, 0);
3141 status = write16(state, SCU_RAM_AGC_RF_IACCU_HI__A, 0);
3144 status = write16(state, SCU_RAM_AGC_RF_IACCU_LO__A, 0);
3147 status = write16(state, SCU_RAM_AGC_CLP_SUM_MAX__A, clpSumMax);
3150 status = write16(state, SCU_RAM_AGC_SNS_SUM_MAX__A, snsSumMax);
3154 status = write16(state, SCU_RAM_AGC_KI_INNERGAIN_MIN__A, kiInnergainMin);
3157 status = write16(state, SCU_RAM_AGC_IF_IACCU_HI_TGT__A, ifIaccuHiTgt);
3160 status = write16(state, SCU_RAM_AGC_CLP_CYCLEN__A, clpCyclen);
3164 status = write16(state, SCU_RAM_AGC_RF_SNS_DEV_MAX__A, 1023);
3167 status = write16(state, SCU_RAM_AGC_RF_SNS_DEV_MIN__A, (u16) -1023);
3170 status = write16(state, SCU_RAM_AGC_FAST_SNS_CTRL_DELAY__A, 50);
3174 status = write16(state, SCU_RAM_AGC_KI_MAXMINGAIN_TH__A, 20);
3177 status = write16(state, SCU_RAM_AGC_CLP_SUM_MIN__A, clpSumMin);
3180 status = write16(state, SCU_RAM_AGC_SNS_SUM_MIN__A, snsSumMin);
3183 status = write16(state, SCU_RAM_AGC_CLP_DIR_TO__A, clpDirTo);
3186 status = write16(state, SCU_RAM_AGC_SNS_DIR_TO__A, snsDirTo);
3189 status = write16(state, SCU_RAM_AGC_KI_MINGAIN__A, 0x7fff);
3192 status = write16(state, SCU_RAM_AGC_KI_MAXGAIN__A, 0x0);
3195 status = write16(state, SCU_RAM_AGC_KI_MIN__A, 0x0117);
3198 status = write16(state, SCU_RAM_AGC_KI_MAX__A, 0x0657);
3201 status = write16(state, SCU_RAM_AGC_CLP_SUM__A, 0);
3204 status = write16(state, SCU_RAM_AGC_CLP_CYCCNT__A, 0);
3207 status = write16(state, SCU_RAM_AGC_CLP_DIR_WD__A, 0);
3210 status = write16(state, SCU_RAM_AGC_CLP_DIR_STP__A, 1);
3213 status = write16(state, SCU_RAM_AGC_SNS_SUM__A, 0);
3216 status = write16(state, SCU_RAM_AGC_SNS_CYCCNT__A, 0);
3219 status = write16(state, SCU_RAM_AGC_SNS_DIR_WD__A, 0);
3222 status = write16(state, SCU_RAM_AGC_SNS_DIR_STP__A, 1);
3225 status = write16(state, SCU_RAM_AGC_SNS_CYCLEN__A, 500);
3228 status = write16(state, SCU_RAM_AGC_KI_CYCLEN__A, 500);
3232 /* Initialize inner-loop KI gain factors */
3233 status = read16(state, SCU_RAM_AGC_KI__A, &data);
3238 data &= ~SCU_RAM_AGC_KI_RF__M;
3239 data |= (DRXK_KI_RAGC_QAM << SCU_RAM_AGC_KI_RF__B);
3240 data &= ~SCU_RAM_AGC_KI_IF__M;
3241 data |= (DRXK_KI_IAGC_QAM << SCU_RAM_AGC_KI_IF__B);
3243 status = write16(state, SCU_RAM_AGC_KI__A, data);
3246 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
3250 static int DVBTQAMGetAccPktErr(struct drxk_state *state, u16 *packetErr)
3255 if (packetErr == NULL)
3256 status = write16(state, SCU_RAM_FEC_ACCUM_PKT_FAILURES__A, 0);
3258 status = read16(state, SCU_RAM_FEC_ACCUM_PKT_FAILURES__A, packetErr);
3260 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
3264 static int DVBTScCommand(struct drxk_state *state,
3265 u16 cmd, u16 subcmd,
3266 u16 param0, u16 param1, u16 param2,
3267 u16 param3, u16 param4)
3276 status = read16(state, OFDM_SC_COMM_EXEC__A, &scExec);
3278 /* SC is not running */
3284 /* Wait until sc is ready to receive command */
3288 status = read16(state, OFDM_SC_RA_RAM_CMD__A, &curCmd);
3290 } while ((curCmd != 0) && (retryCnt < DRXK_MAX_RETRIES));
3291 if (retryCnt >= DRXK_MAX_RETRIES && (status < 0))
3294 /* Write sub-command */
3296 /* All commands using sub-cmd */
3297 case OFDM_SC_RA_RAM_CMD_PROC_START:
3298 case OFDM_SC_RA_RAM_CMD_SET_PREF_PARAM:
3299 case OFDM_SC_RA_RAM_CMD_PROGRAM_PARAM:
3300 status = write16(state, OFDM_SC_RA_RAM_CMD_ADDR__A, subcmd);
3309 /* Write needed parameters and the command */
3311 /* All commands using 5 parameters */
3312 /* All commands using 4 parameters */
3313 /* All commands using 3 parameters */
3314 /* All commands using 2 parameters */
3315 case OFDM_SC_RA_RAM_CMD_PROC_START:
3316 case OFDM_SC_RA_RAM_CMD_SET_PREF_PARAM:
3317 case OFDM_SC_RA_RAM_CMD_PROGRAM_PARAM:
3318 status = write16(state, OFDM_SC_RA_RAM_PARAM1__A, param1);
3319 /* All commands using 1 parameters */
3320 case OFDM_SC_RA_RAM_CMD_SET_ECHO_TIMING:
3321 case OFDM_SC_RA_RAM_CMD_USER_IO:
3322 status = write16(state, OFDM_SC_RA_RAM_PARAM0__A, param0);
3323 /* All commands using 0 parameters */
3324 case OFDM_SC_RA_RAM_CMD_GET_OP_PARAM:
3325 case OFDM_SC_RA_RAM_CMD_NULL:
3327 status = write16(state, OFDM_SC_RA_RAM_CMD__A, cmd);
3330 /* Unknown command */
3336 /* Wait until sc is ready processing command */
3340 status = read16(state, OFDM_SC_RA_RAM_CMD__A, &curCmd);
3342 } while ((curCmd != 0) && (retryCnt < DRXK_MAX_RETRIES));
3343 if (retryCnt >= DRXK_MAX_RETRIES && (status < 0))
3346 /* Check for illegal cmd */
3347 status = read16(state, OFDM_SC_RA_RAM_CMD_ADDR__A, &errCode);
3348 if (errCode == 0xFFFF) {
3349 /* illegal command */
3355 /* Retreive results parameters from SC */
3357 /* All commands yielding 5 results */
3358 /* All commands yielding 4 results */
3359 /* All commands yielding 3 results */
3360 /* All commands yielding 2 results */
3361 /* All commands yielding 1 result */
3362 case OFDM_SC_RA_RAM_CMD_USER_IO:
3363 case OFDM_SC_RA_RAM_CMD_GET_OP_PARAM:
3364 status = read16(state, OFDM_SC_RA_RAM_PARAM0__A, &(param0));
3365 /* All commands yielding 0 results */
3366 case OFDM_SC_RA_RAM_CMD_SET_ECHO_TIMING:
3367 case OFDM_SC_RA_RAM_CMD_SET_TIMER:
3368 case OFDM_SC_RA_RAM_CMD_PROC_START:
3369 case OFDM_SC_RA_RAM_CMD_SET_PREF_PARAM:
3370 case OFDM_SC_RA_RAM_CMD_PROGRAM_PARAM:
3371 case OFDM_SC_RA_RAM_CMD_NULL:
3374 /* Unknown command */
3377 } /* switch (cmd->cmd) */
3380 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
3384 static int PowerUpDVBT(struct drxk_state *state)
3386 enum DRXPowerMode powerMode = DRX_POWER_UP;
3390 status = CtrlPowerMode(state, &powerMode);
3392 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
3396 static int DVBTCtrlSetIncEnable(struct drxk_state *state, bool *enabled)
3401 if (*enabled == true)
3402 status = write16(state, IQM_CF_BYPASSDET__A, 0);
3404 status = write16(state, IQM_CF_BYPASSDET__A, 1);
3406 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
3410 #define DEFAULT_FR_THRES_8K 4000
3411 static int DVBTCtrlSetFrEnable(struct drxk_state *state, bool *enabled)
3417 if (*enabled == true) {
3418 /* write mask to 1 */
3419 status = write16(state, OFDM_SC_RA_RAM_FR_THRES_8K__A,
3420 DEFAULT_FR_THRES_8K);
3422 /* write mask to 0 */
3423 status = write16(state, OFDM_SC_RA_RAM_FR_THRES_8K__A, 0);
3426 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
3431 static int DVBTCtrlSetEchoThreshold(struct drxk_state *state,
3432 struct DRXKCfgDvbtEchoThres_t *echoThres)
3438 status = read16(state, OFDM_SC_RA_RAM_ECHO_THRES__A, &data);
3442 switch (echoThres->fftMode) {
3443 case DRX_FFTMODE_2K:
3444 data &= ~OFDM_SC_RA_RAM_ECHO_THRES_2K__M;
3445 data |= ((echoThres->threshold <<
3446 OFDM_SC_RA_RAM_ECHO_THRES_2K__B)
3447 & (OFDM_SC_RA_RAM_ECHO_THRES_2K__M));
3449 case DRX_FFTMODE_8K:
3450 data &= ~OFDM_SC_RA_RAM_ECHO_THRES_8K__M;
3451 data |= ((echoThres->threshold <<
3452 OFDM_SC_RA_RAM_ECHO_THRES_8K__B)
3453 & (OFDM_SC_RA_RAM_ECHO_THRES_8K__M));
3460 status = write16(state, OFDM_SC_RA_RAM_ECHO_THRES__A, data);
3463 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
3467 static int DVBTCtrlSetSqiSpeed(struct drxk_state *state,
3468 enum DRXKCfgDvbtSqiSpeed *speed)
3470 int status = -EINVAL;
3475 case DRXK_DVBT_SQI_SPEED_FAST:
3476 case DRXK_DVBT_SQI_SPEED_MEDIUM:
3477 case DRXK_DVBT_SQI_SPEED_SLOW:
3482 status = write16(state, SCU_RAM_FEC_PRE_RS_BER_FILTER_SH__A,
3486 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
3490 /*============================================================================*/
3493 * \brief Activate DVBT specific presets
3494 * \param demod instance of demodulator.
3495 * \return DRXStatus_t.
3497 * Called in DVBTSetStandard
3500 static int DVBTActivatePresets(struct drxk_state *state)
3503 bool setincenable = false;
3504 bool setfrenable = true;
3506 struct DRXKCfgDvbtEchoThres_t echoThres2k = { 0, DRX_FFTMODE_2K };
3507 struct DRXKCfgDvbtEchoThres_t echoThres8k = { 0, DRX_FFTMODE_8K };
3510 status = DVBTCtrlSetIncEnable(state, &setincenable);
3513 status = DVBTCtrlSetFrEnable(state, &setfrenable);
3516 status = DVBTCtrlSetEchoThreshold(state, &echoThres2k);
3519 status = DVBTCtrlSetEchoThreshold(state, &echoThres8k);
3522 status = write16(state, SCU_RAM_AGC_INGAIN_TGT_MAX__A, state->m_dvbtIfAgcCfg.IngainTgtMax);
3525 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
3529 /*============================================================================*/
3532 * \brief Initialize channelswitch-independent settings for DVBT.
3533 * \param demod instance of demodulator.
3534 * \return DRXStatus_t.
3536 * For ROM code channel filter taps are loaded from the bootloader. For microcode
3537 * the DVB-T taps from the drxk_filters.h are used.
3539 static int SetDVBTStandard(struct drxk_state *state,
3540 enum OperationMode oMode)
3549 /* added antenna switch */
3550 SwitchAntennaToDVBT(state);
3551 /* send OFDM reset command */
3552 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_OFDM | SCU_RAM_COMMAND_CMD_DEMOD_RESET, 0, NULL, 1, &cmdResult);
3556 /* send OFDM setenv command */
3557 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_OFDM | SCU_RAM_COMMAND_CMD_DEMOD_SET_ENV, 0, NULL, 1, &cmdResult);
3561 /* reset datapath for OFDM, processors first */
3562 status = write16(state, OFDM_SC_COMM_EXEC__A, OFDM_SC_COMM_EXEC_STOP);
3565 status = write16(state, OFDM_LC_COMM_EXEC__A, OFDM_LC_COMM_EXEC_STOP);
3568 status = write16(state, IQM_COMM_EXEC__A, IQM_COMM_EXEC_B_STOP);
3573 /* synchronize on ofdstate->m_festart */
3574 status = write16(state, IQM_AF_UPD_SEL__A, 1);
3577 /* window size for clipping ADC detection */
3578 status = write16(state, IQM_AF_CLP_LEN__A, 0);
3581 /* window size for for sense pre-SAW detection */
3582 status = write16(state, IQM_AF_SNS_LEN__A, 0);
3585 /* sense threshold for sense pre-SAW detection */
3586 status = write16(state, IQM_AF_AMUX__A, IQM_AF_AMUX_SIGNAL2ADC);
3589 status = SetIqmAf(state, true);
3593 status = write16(state, IQM_AF_AGC_RF__A, 0);
3597 /* Impulse noise cruncher setup */
3598 status = write16(state, IQM_AF_INC_LCT__A, 0); /* crunch in IQM_CF */
3601 status = write16(state, IQM_CF_DET_LCT__A, 0); /* detect in IQM_CF */
3604 status = write16(state, IQM_CF_WND_LEN__A, 3); /* peak detector window length */
3608 status = write16(state, IQM_RC_STRETCH__A, 16);
3611 status = write16(state, IQM_CF_OUT_ENA__A, 0x4); /* enable output 2 */
3614 status = write16(state, IQM_CF_DS_ENA__A, 0x4); /* decimate output 2 */
3617 status = write16(state, IQM_CF_SCALE__A, 1600);
3620 status = write16(state, IQM_CF_SCALE_SH__A, 0);
3624 /* virtual clipping threshold for clipping ADC detection */
3625 status = write16(state, IQM_AF_CLP_TH__A, 448);
3628 status = write16(state, IQM_CF_DATATH__A, 495); /* crunching threshold */
3632 status = BLChainCmd(state, DRXK_BL_ROM_OFFSET_TAPS_DVBT, DRXK_BLCC_NR_ELEMENTS_TAPS, DRXK_BLC_TIMEOUT);
3636 status = write16(state, IQM_CF_PKDTH__A, 2); /* peak detector threshold */
3639 status = write16(state, IQM_CF_POW_MEAS_LEN__A, 2);
3642 /* enable power measurement interrupt */
3643 status = write16(state, IQM_CF_COMM_INT_MSK__A, 1);
3646 status = write16(state, IQM_COMM_EXEC__A, IQM_COMM_EXEC_B_ACTIVE);
3650 /* IQM will not be reset from here, sync ADC and update/init AGC */
3651 status = ADCSynchronization(state);
3654 status = SetPreSaw(state, &state->m_dvbtPreSawCfg);
3658 /* Halt SCU to enable safe non-atomic accesses */
3659 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_HOLD);
3663 status = SetAgcRf(state, &state->m_dvbtRfAgcCfg, true);
3666 status = SetAgcIf(state, &state->m_dvbtIfAgcCfg, true);
3670 /* Set Noise Estimation notch width and enable DC fix */
3671 status = read16(state, OFDM_SC_RA_RAM_CONFIG__A, &data);
3674 data |= OFDM_SC_RA_RAM_CONFIG_NE_FIX_ENABLE__M;
3675 status = write16(state, OFDM_SC_RA_RAM_CONFIG__A, data);
3679 /* Activate SCU to enable SCU commands */
3680 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE);
3684 if (!state->m_DRXK_A3_ROM_CODE) {
3685 /* AGCInit() is not done for DVBT, so set agcFastClipCtrlDelay */
3686 status = write16(state, SCU_RAM_AGC_FAST_CLP_CTRL_DELAY__A, state->m_dvbtIfAgcCfg.FastClipCtrlDelay);
3692 #ifdef COMPILE_FOR_NONRT
3693 status = write16(state, OFDM_SC_RA_RAM_BE_OPT_DELAY__A, 1);
3696 status = write16(state, OFDM_SC_RA_RAM_BE_OPT_INIT_DELAY__A, 2);
3702 status = write16(state, FEC_DI_INPUT_CTL__A, 1); /* OFDM input */
3707 #ifdef COMPILE_FOR_NONRT
3708 status = write16(state, FEC_RS_MEASUREMENT_PERIOD__A, 0x400);
3712 status = write16(state, FEC_RS_MEASUREMENT_PERIOD__A, 0x1000);
3716 status = write16(state, FEC_RS_MEASUREMENT_PRESCALE__A, 0x0001);
3720 /* Setup MPEG bus */
3721 status = MPEGTSDtoSetup(state, OM_DVBT);
3724 /* Set DVBT Presets */
3725 status = DVBTActivatePresets(state);
3731 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
3735 /*============================================================================*/
3737 * \brief Start dvbt demodulating for channel.
3738 * \param demod instance of demodulator.
3739 * \return DRXStatus_t.
3741 static int DVBTStart(struct drxk_state *state)
3745 /* DRXKOfdmScCmd_t scCmd; */
3748 /* Start correct processes to get in lock */
3749 /* DRXK: OFDM_SC_RA_RAM_PROC_LOCKTRACK is no longer in mapfile! */
3750 param1 = OFDM_SC_RA_RAM_LOCKTRACK_MIN;
3751 status = DVBTScCommand(state, OFDM_SC_RA_RAM_CMD_PROC_START, 0, OFDM_SC_RA_RAM_SW_EVENT_RUN_NMASK__M, param1, 0, 0, 0);
3755 status = MPEGTSStart(state);
3758 status = write16(state, FEC_COMM_EXEC__A, FEC_COMM_EXEC_ACTIVE);
3763 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
3768 /*============================================================================*/
3771 * \brief Set up dvbt demodulator for channel.
3772 * \param demod instance of demodulator.
3773 * \return DRXStatus_t.
3774 * // original DVBTSetChannel()
3776 static int SetDVBT(struct drxk_state *state, u16 IntermediateFreqkHz,
3777 s32 tunerFreqOffset)
3780 u16 transmissionParams = 0;
3781 u16 operationMode = 0;
3782 u32 iqmRcRateOfs = 0;
3787 dprintk(1, "IF =%d, TFO = %d\n", IntermediateFreqkHz, tunerFreqOffset);
3789 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_OFDM | SCU_RAM_COMMAND_CMD_DEMOD_STOP, 0, NULL, 1, &cmdResult);
3793 /* Halt SCU to enable safe non-atomic accesses */
3794 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_HOLD);
3798 /* Stop processors */
3799 status = write16(state, OFDM_SC_COMM_EXEC__A, OFDM_SC_COMM_EXEC_STOP);
3802 status = write16(state, OFDM_LC_COMM_EXEC__A, OFDM_LC_COMM_EXEC_STOP);
3806 /* Mandatory fix, always stop CP, required to set spl offset back to
3807 hardware default (is set to 0 by ucode during pilot detection */
3808 status = write16(state, OFDM_CP_COMM_EXEC__A, OFDM_CP_COMM_EXEC_STOP);
3812 /*== Write channel settings to device =====================================*/
3815 switch (state->param.u.ofdm.transmission_mode) {
3816 case TRANSMISSION_MODE_AUTO:
3818 operationMode |= OFDM_SC_RA_RAM_OP_AUTO_MODE__M;
3819 /* fall through , try first guess DRX_FFTMODE_8K */
3820 case TRANSMISSION_MODE_8K:
3821 transmissionParams |= OFDM_SC_RA_RAM_OP_PARAM_MODE_8K;
3823 case TRANSMISSION_MODE_2K:
3824 transmissionParams |= OFDM_SC_RA_RAM_OP_PARAM_MODE_2K;
3829 switch (state->param.u.ofdm.guard_interval) {
3831 case GUARD_INTERVAL_AUTO:
3832 operationMode |= OFDM_SC_RA_RAM_OP_AUTO_GUARD__M;
3833 /* fall through , try first guess DRX_GUARD_1DIV4 */
3834 case GUARD_INTERVAL_1_4:
3835 transmissionParams |= OFDM_SC_RA_RAM_OP_PARAM_GUARD_4;
3837 case GUARD_INTERVAL_1_32:
3838 transmissionParams |= OFDM_SC_RA_RAM_OP_PARAM_GUARD_32;
3840 case GUARD_INTERVAL_1_16:
3841 transmissionParams |= OFDM_SC_RA_RAM_OP_PARAM_GUARD_16;
3843 case GUARD_INTERVAL_1_8:
3844 transmissionParams |= OFDM_SC_RA_RAM_OP_PARAM_GUARD_8;
3849 switch (state->param.u.ofdm.hierarchy_information) {
3850 case HIERARCHY_AUTO:
3851 case HIERARCHY_NONE:
3853 operationMode |= OFDM_SC_RA_RAM_OP_AUTO_HIER__M;
3854 /* fall through , try first guess SC_RA_RAM_OP_PARAM_HIER_NO */
3855 /* transmissionParams |= OFDM_SC_RA_RAM_OP_PARAM_HIER_NO; */
3858 transmissionParams |= OFDM_SC_RA_RAM_OP_PARAM_HIER_A1;
3861 transmissionParams |= OFDM_SC_RA_RAM_OP_PARAM_HIER_A2;
3864 transmissionParams |= OFDM_SC_RA_RAM_OP_PARAM_HIER_A4;
3870 switch (state->param.u.ofdm.constellation) {
3873 operationMode |= OFDM_SC_RA_RAM_OP_AUTO_CONST__M;
3874 /* fall through , try first guess DRX_CONSTELLATION_QAM64 */
3876 transmissionParams |= OFDM_SC_RA_RAM_OP_PARAM_CONST_QAM64;
3879 transmissionParams |= OFDM_SC_RA_RAM_OP_PARAM_CONST_QPSK;
3882 transmissionParams |= OFDM_SC_RA_RAM_OP_PARAM_CONST_QAM16;
3886 /* No hierachical channels support in BDA */
3887 /* Priority (only for hierarchical channels) */
3888 switch (channel->priority) {
3889 case DRX_PRIORITY_LOW:
3890 transmissionParams |= OFDM_SC_RA_RAM_OP_PARAM_PRIO_LO;
3891 WR16(devAddr, OFDM_EC_SB_PRIOR__A,
3892 OFDM_EC_SB_PRIOR_LO);
3894 case DRX_PRIORITY_HIGH:
3895 transmissionParams |= OFDM_SC_RA_RAM_OP_PARAM_PRIO_HI;
3896 WR16(devAddr, OFDM_EC_SB_PRIOR__A,
3897 OFDM_EC_SB_PRIOR_HI));
3899 case DRX_PRIORITY_UNKNOWN: /* fall through */
3905 /* Set Priorty high */
3906 transmissionParams |= OFDM_SC_RA_RAM_OP_PARAM_PRIO_HI;
3907 status = write16(state, OFDM_EC_SB_PRIOR__A, OFDM_EC_SB_PRIOR_HI);
3913 switch (state->param.u.ofdm.code_rate_HP) {
3916 operationMode |= OFDM_SC_RA_RAM_OP_AUTO_RATE__M;
3917 /* fall through , try first guess DRX_CODERATE_2DIV3 */
3919 transmissionParams |= OFDM_SC_RA_RAM_OP_PARAM_RATE_2_3;
3922 transmissionParams |= OFDM_SC_RA_RAM_OP_PARAM_RATE_1_2;
3925 transmissionParams |= OFDM_SC_RA_RAM_OP_PARAM_RATE_3_4;
3928 transmissionParams |= OFDM_SC_RA_RAM_OP_PARAM_RATE_5_6;
3931 transmissionParams |= OFDM_SC_RA_RAM_OP_PARAM_RATE_7_8;
3935 /* SAW filter selection: normaly not necesarry, but if wanted
3936 the application can select a SAW filter via the driver by using UIOs */
3937 /* First determine real bandwidth (Hz) */
3938 /* Also set delay for impulse noise cruncher */
3939 /* Also set parameters for EC_OC fix, note EC_OC_REG_TMD_HIL_MAR is changed
3940 by SC for fix for some 8K,1/8 guard but is restored by InitEC and ResetEC
3942 switch (state->param.u.ofdm.bandwidth) {
3943 case BANDWIDTH_AUTO:
3944 case BANDWIDTH_8_MHZ:
3945 bandwidth = DRXK_BANDWIDTH_8MHZ_IN_HZ;
3946 status = write16(state, OFDM_SC_RA_RAM_SRMM_FIX_FACT_8K__A, 3052);
3949 /* cochannel protection for PAL 8 MHz */
3950 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_8K_PER_LEFT__A, 7);
3953 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_8K_PER_RIGHT__A, 7);
3956 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_2K_PER_LEFT__A, 7);
3959 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_2K_PER_RIGHT__A, 1);
3963 case BANDWIDTH_7_MHZ:
3964 bandwidth = DRXK_BANDWIDTH_7MHZ_IN_HZ;
3965 status = write16(state, OFDM_SC_RA_RAM_SRMM_FIX_FACT_8K__A, 3491);
3968 /* cochannel protection for PAL 7 MHz */
3969 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_8K_PER_LEFT__A, 8);
3972 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_8K_PER_RIGHT__A, 8);
3975 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_2K_PER_LEFT__A, 4);
3978 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_2K_PER_RIGHT__A, 1);
3982 case BANDWIDTH_6_MHZ:
3983 bandwidth = DRXK_BANDWIDTH_6MHZ_IN_HZ;
3984 status = write16(state, OFDM_SC_RA_RAM_SRMM_FIX_FACT_8K__A, 4073);
3987 /* cochannel protection for NTSC 6 MHz */
3988 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_8K_PER_LEFT__A, 19);
3991 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_8K_PER_RIGHT__A, 19);
3994 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_2K_PER_LEFT__A, 14);
3997 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_2K_PER_RIGHT__A, 1);
4006 if (iqmRcRateOfs == 0) {
4007 /* Now compute IQM_RC_RATE_OFS
4008 (((SysFreq/BandWidth)/2)/2) -1) * 2^23)
4010 ((SysFreq / BandWidth) * (2^21)) - (2^23)
4012 /* (SysFreq / BandWidth) * (2^28) */
4013 /* assert (MAX(sysClk)/MIN(bandwidth) < 16)
4014 => assert(MAX(sysClk) < 16*MIN(bandwidth))
4015 => assert(109714272 > 48000000) = true so Frac 28 can be used */
4016 iqmRcRateOfs = Frac28a((u32)
4017 ((state->m_sysClockFreq *
4018 1000) / 3), bandwidth);
4019 /* (SysFreq / BandWidth) * (2^21), rounding before truncating */
4020 if ((iqmRcRateOfs & 0x7fL) >= 0x40)
4021 iqmRcRateOfs += 0x80L;
4022 iqmRcRateOfs = iqmRcRateOfs >> 7;
4023 /* ((SysFreq / BandWidth) * (2^21)) - (2^23) */
4024 iqmRcRateOfs = iqmRcRateOfs - (1 << 23);
4028 ((((u32) IQM_RC_RATE_OFS_HI__M) <<
4029 IQM_RC_RATE_OFS_LO__W) | IQM_RC_RATE_OFS_LO__M);
4030 status = write32(state, IQM_RC_RATE_OFS_LO__A, iqmRcRateOfs);
4034 /* Bandwidth setting done */
4037 status = DVBTSetFrequencyShift(demod, channel, tunerOffset);
4041 status = SetFrequencyShifter(state, IntermediateFreqkHz, tunerFreqOffset, true);
4045 /*== Start SC, write channel settings to SC ===============================*/
4047 /* Activate SCU to enable SCU commands */
4048 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE);
4052 /* Enable SC after setting all other parameters */
4053 status = write16(state, OFDM_SC_COMM_STATE__A, 0);
4056 status = write16(state, OFDM_SC_COMM_EXEC__A, 1);
4061 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_OFDM | SCU_RAM_COMMAND_CMD_DEMOD_START, 0, NULL, 1, &cmdResult);
4065 /* Write SC parameter registers, set all AUTO flags in operation mode */
4066 param1 = (OFDM_SC_RA_RAM_OP_AUTO_MODE__M |
4067 OFDM_SC_RA_RAM_OP_AUTO_GUARD__M |
4068 OFDM_SC_RA_RAM_OP_AUTO_CONST__M |
4069 OFDM_SC_RA_RAM_OP_AUTO_HIER__M |
4070 OFDM_SC_RA_RAM_OP_AUTO_RATE__M);
4071 status = DVBTScCommand(state, OFDM_SC_RA_RAM_CMD_SET_PREF_PARAM,
4072 0, transmissionParams, param1, 0, 0, 0);
4076 if (!state->m_DRXK_A3_ROM_CODE)
4077 status = DVBTCtrlSetSqiSpeed(state, &state->m_sqiSpeed);
4080 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
4086 /*============================================================================*/
4089 * \brief Retreive lock status .
4090 * \param demod Pointer to demodulator instance.
4091 * \param lockStat Pointer to lock status structure.
4092 * \return DRXStatus_t.
4095 static int GetDVBTLockStatus(struct drxk_state *state, u32 *pLockStatus)
4098 const u16 mpeg_lock_mask = (OFDM_SC_RA_RAM_LOCK_MPEG__M |
4099 OFDM_SC_RA_RAM_LOCK_FEC__M);
4100 const u16 fec_lock_mask = (OFDM_SC_RA_RAM_LOCK_FEC__M);
4101 const u16 demod_lock_mask = OFDM_SC_RA_RAM_LOCK_DEMOD__M;
4103 u16 ScRaRamLock = 0;
4108 *pLockStatus = NOT_LOCKED;
4110 /* Check if SC is running */
4111 status = read16(state, OFDM_SC_COMM_EXEC__A, &ScCommExec);
4114 if (ScCommExec == OFDM_SC_COMM_EXEC_STOP)
4117 status = read16(state, OFDM_SC_RA_RAM_LOCK__A, &ScRaRamLock);
4121 if ((ScRaRamLock & mpeg_lock_mask) == mpeg_lock_mask)
4122 *pLockStatus = MPEG_LOCK;
4123 else if ((ScRaRamLock & fec_lock_mask) == fec_lock_mask)
4124 *pLockStatus = FEC_LOCK;
4125 else if ((ScRaRamLock & demod_lock_mask) == demod_lock_mask)
4126 *pLockStatus = DEMOD_LOCK;
4127 else if (ScRaRamLock & OFDM_SC_RA_RAM_LOCK_NODVBT__M)
4128 *pLockStatus = NEVER_LOCK;
4131 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
4136 static int PowerUpQAM(struct drxk_state *state)
4138 enum DRXPowerMode powerMode = DRXK_POWER_DOWN_OFDM;
4142 status = CtrlPowerMode(state, &powerMode);
4144 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
4150 /** Power Down QAM */
4151 static int PowerDownQAM(struct drxk_state *state)
4158 status = read16(state, SCU_COMM_EXEC__A, &data);
4161 if (data == SCU_COMM_EXEC_ACTIVE) {
4166 /* stop all comstate->m_exec */
4167 status = write16(state, QAM_COMM_EXEC__A, QAM_COMM_EXEC_STOP);
4170 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_QAM | SCU_RAM_COMMAND_CMD_DEMOD_STOP, 0, NULL, 1, &cmdResult);
4175 status = SetIqmAf(state, false);
4179 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
4184 /*============================================================================*/
4187 * \brief Setup of the QAM Measurement intervals for signal quality
4188 * \param demod instance of demod.
4189 * \param constellation current constellation.
4190 * \return DRXStatus_t.
4193 * Take into account that for certain settings the errorcounters can overflow.
4194 * The implementation does not check this.
4197 static int SetQAMMeasurement(struct drxk_state *state,
4198 enum EDrxkConstellation constellation,
4201 u32 fecBitsDesired = 0; /* BER accounting period */
4202 u32 fecRsPeriodTotal = 0; /* Total period */
4203 u16 fecRsPrescale = 0; /* ReedSolomon Measurement Prescale */
4204 u16 fecRsPeriod = 0; /* Value for corresponding I2C register */
4210 /* fecBitsDesired = symbolRate [kHz] *
4212 (constellation + 1) *
4216 switch (constellation) {
4217 case DRX_CONSTELLATION_QAM16:
4218 fecBitsDesired = 4 * symbolRate;
4220 case DRX_CONSTELLATION_QAM32:
4221 fecBitsDesired = 5 * symbolRate;
4223 case DRX_CONSTELLATION_QAM64:
4224 fecBitsDesired = 6 * symbolRate;
4226 case DRX_CONSTELLATION_QAM128:
4227 fecBitsDesired = 7 * symbolRate;
4229 case DRX_CONSTELLATION_QAM256:
4230 fecBitsDesired = 8 * symbolRate;
4238 fecBitsDesired /= 1000; /* symbolRate [Hz] -> symbolRate [kHz] */
4239 fecBitsDesired *= 500; /* meas. period [ms] */
4241 /* Annex A/C: bits/RsPeriod = 204 * 8 = 1632 */
4242 /* fecRsPeriodTotal = fecBitsDesired / 1632 */
4243 fecRsPeriodTotal = (fecBitsDesired / 1632UL) + 1; /* roughly ceil */
4245 /* fecRsPeriodTotal = fecRsPrescale * fecRsPeriod */
4246 fecRsPrescale = 1 + (u16) (fecRsPeriodTotal >> 16);
4247 if (fecRsPrescale == 0) {
4248 /* Divide by zero (though impossible) */
4254 ((u16) fecRsPeriodTotal +
4255 (fecRsPrescale >> 1)) / fecRsPrescale;
4257 /* write corresponding registers */
4258 status = write16(state, FEC_RS_MEASUREMENT_PERIOD__A, fecRsPeriod);
4261 status = write16(state, FEC_RS_MEASUREMENT_PRESCALE__A, fecRsPrescale);
4264 status = write16(state, FEC_OC_SNC_FAIL_PERIOD__A, fecRsPeriod);
4267 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
4271 static int SetQAM16(struct drxk_state *state)
4276 /* QAM Equalizer Setup */
4278 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD0__A, 13517);
4281 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD1__A, 13517);
4284 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD2__A, 13517);
4287 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD3__A, 13517);
4290 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD4__A, 13517);
4293 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD5__A, 13517);
4296 /* Decision Feedback Equalizer */
4297 status = write16(state, QAM_DQ_QUAL_FUN0__A, 2);
4300 status = write16(state, QAM_DQ_QUAL_FUN1__A, 2);
4303 status = write16(state, QAM_DQ_QUAL_FUN2__A, 2);
4306 status = write16(state, QAM_DQ_QUAL_FUN3__A, 2);
4309 status = write16(state, QAM_DQ_QUAL_FUN4__A, 2);
4312 status = write16(state, QAM_DQ_QUAL_FUN5__A, 0);
4316 status = write16(state, QAM_SY_SYNC_HWM__A, 5);
4319 status = write16(state, QAM_SY_SYNC_AWM__A, 4);
4322 status = write16(state, QAM_SY_SYNC_LWM__A, 3);
4326 /* QAM Slicer Settings */
4327 status = write16(state, SCU_RAM_QAM_SL_SIG_POWER__A, DRXK_QAM_SL_SIG_POWER_QAM16);
4331 /* QAM Loop Controller Coeficients */
4332 status = write16(state, SCU_RAM_QAM_LC_CA_FINE__A, 15);
4335 status = write16(state, SCU_RAM_QAM_LC_CA_COARSE__A, 40);
4338 status = write16(state, SCU_RAM_QAM_LC_EP_FINE__A, 12);
4341 status = write16(state, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24);
4344 status = write16(state, SCU_RAM_QAM_LC_EP_COARSE__A, 24);
4347 status = write16(state, SCU_RAM_QAM_LC_EI_FINE__A, 12);
4350 status = write16(state, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16);
4353 status = write16(state, SCU_RAM_QAM_LC_EI_COARSE__A, 16);
4357 status = write16(state, SCU_RAM_QAM_LC_CP_FINE__A, 5);
4360 status = write16(state, SCU_RAM_QAM_LC_CP_MEDIUM__A, 20);
4363 status = write16(state, SCU_RAM_QAM_LC_CP_COARSE__A, 80);
4366 status = write16(state, SCU_RAM_QAM_LC_CI_FINE__A, 5);
4369 status = write16(state, SCU_RAM_QAM_LC_CI_MEDIUM__A, 20);
4372 status = write16(state, SCU_RAM_QAM_LC_CI_COARSE__A, 50);
4375 status = write16(state, SCU_RAM_QAM_LC_CF_FINE__A, 16);
4378 status = write16(state, SCU_RAM_QAM_LC_CF_MEDIUM__A, 16);
4381 status = write16(state, SCU_RAM_QAM_LC_CF_COARSE__A, 32);
4384 status = write16(state, SCU_RAM_QAM_LC_CF1_FINE__A, 5);
4387 status = write16(state, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 10);
4390 status = write16(state, SCU_RAM_QAM_LC_CF1_COARSE__A, 10);
4395 /* QAM State Machine (FSM) Thresholds */
4397 status = write16(state, SCU_RAM_QAM_FSM_RTH__A, 140);
4400 status = write16(state, SCU_RAM_QAM_FSM_FTH__A, 50);
4403 status = write16(state, SCU_RAM_QAM_FSM_CTH__A, 95);
4406 status = write16(state, SCU_RAM_QAM_FSM_PTH__A, 120);
4409 status = write16(state, SCU_RAM_QAM_FSM_QTH__A, 230);
4412 status = write16(state, SCU_RAM_QAM_FSM_MTH__A, 105);
4416 status = write16(state, SCU_RAM_QAM_FSM_RATE_LIM__A, 40);
4419 status = write16(state, SCU_RAM_QAM_FSM_COUNT_LIM__A, 4);
4422 status = write16(state, SCU_RAM_QAM_FSM_FREQ_LIM__A, 24);
4427 /* QAM FSM Tracking Parameters */
4429 status = write16(state, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, (u16) 16);
4432 status = write16(state, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, (u16) 220);
4435 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, (u16) 25);
4438 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, (u16) 6);
4441 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16) -24);
4444 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16) -65);
4447 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16) -127);
4453 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
4457 /*============================================================================*/
4460 * \brief QAM32 specific setup
4461 * \param demod instance of demod.
4462 * \return DRXStatus_t.
4464 static int SetQAM32(struct drxk_state *state)
4470 /* QAM Equalizer Setup */
4472 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD0__A, 6707);
4475 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD1__A, 6707);
4478 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD2__A, 6707);
4481 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD3__A, 6707);
4484 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD4__A, 6707);
4487 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD5__A, 6707);
4491 /* Decision Feedback Equalizer */
4492 status = write16(state, QAM_DQ_QUAL_FUN0__A, 3);
4495 status = write16(state, QAM_DQ_QUAL_FUN1__A, 3);
4498 status = write16(state, QAM_DQ_QUAL_FUN2__A, 3);
4501 status = write16(state, QAM_DQ_QUAL_FUN3__A, 3);
4504 status = write16(state, QAM_DQ_QUAL_FUN4__A, 3);
4507 status = write16(state, QAM_DQ_QUAL_FUN5__A, 0);
4511 status = write16(state, QAM_SY_SYNC_HWM__A, 6);
4514 status = write16(state, QAM_SY_SYNC_AWM__A, 5);
4517 status = write16(state, QAM_SY_SYNC_LWM__A, 3);
4521 /* QAM Slicer Settings */
4523 status = write16(state, SCU_RAM_QAM_SL_SIG_POWER__A, DRXK_QAM_SL_SIG_POWER_QAM32);
4528 /* QAM Loop Controller Coeficients */
4530 status = write16(state, SCU_RAM_QAM_LC_CA_FINE__A, 15);
4533 status = write16(state, SCU_RAM_QAM_LC_CA_COARSE__A, 40);
4536 status = write16(state, SCU_RAM_QAM_LC_EP_FINE__A, 12);
4539 status = write16(state, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24);
4542 status = write16(state, SCU_RAM_QAM_LC_EP_COARSE__A, 24);
4545 status = write16(state, SCU_RAM_QAM_LC_EI_FINE__A, 12);
4548 status = write16(state, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16);
4551 status = write16(state, SCU_RAM_QAM_LC_EI_COARSE__A, 16);
4555 status = write16(state, SCU_RAM_QAM_LC_CP_FINE__A, 5);
4558 status = write16(state, SCU_RAM_QAM_LC_CP_MEDIUM__A, 20);
4561 status = write16(state, SCU_RAM_QAM_LC_CP_COARSE__A, 80);
4564 status = write16(state, SCU_RAM_QAM_LC_CI_FINE__A, 5);
4567 status = write16(state, SCU_RAM_QAM_LC_CI_MEDIUM__A, 20);
4570 status = write16(state, SCU_RAM_QAM_LC_CI_COARSE__A, 50);
4573 status = write16(state, SCU_RAM_QAM_LC_CF_FINE__A, 16);
4576 status = write16(state, SCU_RAM_QAM_LC_CF_MEDIUM__A, 16);
4579 status = write16(state, SCU_RAM_QAM_LC_CF_COARSE__A, 16);
4582 status = write16(state, SCU_RAM_QAM_LC_CF1_FINE__A, 5);
4585 status = write16(state, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 10);
4588 status = write16(state, SCU_RAM_QAM_LC_CF1_COARSE__A, 0);
4593 /* QAM State Machine (FSM) Thresholds */
4595 status = write16(state, SCU_RAM_QAM_FSM_RTH__A, 90);
4598 status = write16(state, SCU_RAM_QAM_FSM_FTH__A, 50);
4601 status = write16(state, SCU_RAM_QAM_FSM_CTH__A, 80);
4604 status = write16(state, SCU_RAM_QAM_FSM_PTH__A, 100);
4607 status = write16(state, SCU_RAM_QAM_FSM_QTH__A, 170);
4610 status = write16(state, SCU_RAM_QAM_FSM_MTH__A, 100);
4614 status = write16(state, SCU_RAM_QAM_FSM_RATE_LIM__A, 40);
4617 status = write16(state, SCU_RAM_QAM_FSM_COUNT_LIM__A, 4);
4620 status = write16(state, SCU_RAM_QAM_FSM_FREQ_LIM__A, 10);
4625 /* QAM FSM Tracking Parameters */
4627 status = write16(state, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, (u16) 12);
4630 status = write16(state, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, (u16) 140);
4633 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, (u16) -8);
4636 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, (u16) -16);
4639 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16) -26);
4642 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16) -56);
4645 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16) -86);
4648 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
4652 /*============================================================================*/
4655 * \brief QAM64 specific setup
4656 * \param demod instance of demod.
4657 * \return DRXStatus_t.
4659 static int SetQAM64(struct drxk_state *state)
4664 /* QAM Equalizer Setup */
4666 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD0__A, 13336);
4669 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD1__A, 12618);
4672 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD2__A, 11988);
4675 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD3__A, 13809);
4678 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD4__A, 13809);
4681 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD5__A, 15609);
4685 /* Decision Feedback Equalizer */
4686 status = write16(state, QAM_DQ_QUAL_FUN0__A, 4);
4689 status = write16(state, QAM_DQ_QUAL_FUN1__A, 4);
4692 status = write16(state, QAM_DQ_QUAL_FUN2__A, 4);
4695 status = write16(state, QAM_DQ_QUAL_FUN3__A, 4);
4698 status = write16(state, QAM_DQ_QUAL_FUN4__A, 3);
4701 status = write16(state, QAM_DQ_QUAL_FUN5__A, 0);
4705 status = write16(state, QAM_SY_SYNC_HWM__A, 5);
4708 status = write16(state, QAM_SY_SYNC_AWM__A, 4);
4711 status = write16(state, QAM_SY_SYNC_LWM__A, 3);
4715 /* QAM Slicer Settings */
4716 status = write16(state, SCU_RAM_QAM_SL_SIG_POWER__A, DRXK_QAM_SL_SIG_POWER_QAM64);
4721 /* QAM Loop Controller Coeficients */
4723 status = write16(state, SCU_RAM_QAM_LC_CA_FINE__A, 15);
4726 status = write16(state, SCU_RAM_QAM_LC_CA_COARSE__A, 40);
4729 status = write16(state, SCU_RAM_QAM_LC_EP_FINE__A, 12);
4732 status = write16(state, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24);
4735 status = write16(state, SCU_RAM_QAM_LC_EP_COARSE__A, 24);
4738 status = write16(state, SCU_RAM_QAM_LC_EI_FINE__A, 12);
4741 status = write16(state, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16);
4744 status = write16(state, SCU_RAM_QAM_LC_EI_COARSE__A, 16);
4748 status = write16(state, SCU_RAM_QAM_LC_CP_FINE__A, 5);
4751 status = write16(state, SCU_RAM_QAM_LC_CP_MEDIUM__A, 30);
4754 status = write16(state, SCU_RAM_QAM_LC_CP_COARSE__A, 100);
4757 status = write16(state, SCU_RAM_QAM_LC_CI_FINE__A, 5);
4760 status = write16(state, SCU_RAM_QAM_LC_CI_MEDIUM__A, 30);
4763 status = write16(state, SCU_RAM_QAM_LC_CI_COARSE__A, 50);
4766 status = write16(state, SCU_RAM_QAM_LC_CF_FINE__A, 16);
4769 status = write16(state, SCU_RAM_QAM_LC_CF_MEDIUM__A, 25);
4772 status = write16(state, SCU_RAM_QAM_LC_CF_COARSE__A, 48);
4775 status = write16(state, SCU_RAM_QAM_LC_CF1_FINE__A, 5);
4778 status = write16(state, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 10);
4781 status = write16(state, SCU_RAM_QAM_LC_CF1_COARSE__A, 10);
4786 /* QAM State Machine (FSM) Thresholds */
4788 status = write16(state, SCU_RAM_QAM_FSM_RTH__A, 100);
4791 status = write16(state, SCU_RAM_QAM_FSM_FTH__A, 60);
4794 status = write16(state, SCU_RAM_QAM_FSM_CTH__A, 80);
4797 status = write16(state, SCU_RAM_QAM_FSM_PTH__A, 110);
4800 status = write16(state, SCU_RAM_QAM_FSM_QTH__A, 200);
4803 status = write16(state, SCU_RAM_QAM_FSM_MTH__A, 95);
4807 status = write16(state, SCU_RAM_QAM_FSM_RATE_LIM__A, 40);
4810 status = write16(state, SCU_RAM_QAM_FSM_COUNT_LIM__A, 4);
4813 status = write16(state, SCU_RAM_QAM_FSM_FREQ_LIM__A, 15);
4818 /* QAM FSM Tracking Parameters */
4820 status = write16(state, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, (u16) 12);
4823 status = write16(state, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, (u16) 141);
4826 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, (u16) 7);
4829 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, (u16) 0);
4832 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16) -15);
4835 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16) -45);
4838 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16) -80);
4841 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
4846 /*============================================================================*/
4849 * \brief QAM128 specific setup
4850 * \param demod: instance of demod.
4851 * \return DRXStatus_t.
4853 static int SetQAM128(struct drxk_state *state)
4858 /* QAM Equalizer Setup */
4860 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD0__A, 6564);
4863 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD1__A, 6598);
4866 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD2__A, 6394);
4869 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD3__A, 6409);
4872 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD4__A, 6656);
4875 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD5__A, 7238);
4879 /* Decision Feedback Equalizer */
4880 status = write16(state, QAM_DQ_QUAL_FUN0__A, 6);
4883 status = write16(state, QAM_DQ_QUAL_FUN1__A, 6);
4886 status = write16(state, QAM_DQ_QUAL_FUN2__A, 6);
4889 status = write16(state, QAM_DQ_QUAL_FUN3__A, 6);
4892 status = write16(state, QAM_DQ_QUAL_FUN4__A, 5);
4895 status = write16(state, QAM_DQ_QUAL_FUN5__A, 0);
4899 status = write16(state, QAM_SY_SYNC_HWM__A, 6);
4902 status = write16(state, QAM_SY_SYNC_AWM__A, 5);
4905 status = write16(state, QAM_SY_SYNC_LWM__A, 3);
4910 /* QAM Slicer Settings */
4912 status = write16(state, SCU_RAM_QAM_SL_SIG_POWER__A, DRXK_QAM_SL_SIG_POWER_QAM128);
4917 /* QAM Loop Controller Coeficients */
4919 status = write16(state, SCU_RAM_QAM_LC_CA_FINE__A, 15);
4922 status = write16(state, SCU_RAM_QAM_LC_CA_COARSE__A, 40);
4925 status = write16(state, SCU_RAM_QAM_LC_EP_FINE__A, 12);
4928 status = write16(state, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24);
4931 status = write16(state, SCU_RAM_QAM_LC_EP_COARSE__A, 24);
4934 status = write16(state, SCU_RAM_QAM_LC_EI_FINE__A, 12);
4937 status = write16(state, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16);
4940 status = write16(state, SCU_RAM_QAM_LC_EI_COARSE__A, 16);
4944 status = write16(state, SCU_RAM_QAM_LC_CP_FINE__A, 5);
4947 status = write16(state, SCU_RAM_QAM_LC_CP_MEDIUM__A, 40);
4950 status = write16(state, SCU_RAM_QAM_LC_CP_COARSE__A, 120);
4953 status = write16(state, SCU_RAM_QAM_LC_CI_FINE__A, 5);
4956 status = write16(state, SCU_RAM_QAM_LC_CI_MEDIUM__A, 40);
4959 status = write16(state, SCU_RAM_QAM_LC_CI_COARSE__A, 60);
4962 status = write16(state, SCU_RAM_QAM_LC_CF_FINE__A, 16);
4965 status = write16(state, SCU_RAM_QAM_LC_CF_MEDIUM__A, 25);
4968 status = write16(state, SCU_RAM_QAM_LC_CF_COARSE__A, 64);
4971 status = write16(state, SCU_RAM_QAM_LC_CF1_FINE__A, 5);
4974 status = write16(state, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 10);
4977 status = write16(state, SCU_RAM_QAM_LC_CF1_COARSE__A, 0);
4982 /* QAM State Machine (FSM) Thresholds */
4984 status = write16(state, SCU_RAM_QAM_FSM_RTH__A, 50);
4987 status = write16(state, SCU_RAM_QAM_FSM_FTH__A, 60);
4990 status = write16(state, SCU_RAM_QAM_FSM_CTH__A, 80);
4993 status = write16(state, SCU_RAM_QAM_FSM_PTH__A, 100);
4996 status = write16(state, SCU_RAM_QAM_FSM_QTH__A, 140);
4999 status = write16(state, SCU_RAM_QAM_FSM_MTH__A, 100);
5003 status = write16(state, SCU_RAM_QAM_FSM_RATE_LIM__A, 40);
5006 status = write16(state, SCU_RAM_QAM_FSM_COUNT_LIM__A, 5);
5010 status = write16(state, SCU_RAM_QAM_FSM_FREQ_LIM__A, 12);
5014 /* QAM FSM Tracking Parameters */
5016 status = write16(state, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, (u16) 8);
5019 status = write16(state, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, (u16) 65);
5022 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, (u16) 5);
5025 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, (u16) 3);
5028 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16) -1);
5031 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16) -12);
5034 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16) -23);
5037 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
5042 /*============================================================================*/
5045 * \brief QAM256 specific setup
5046 * \param demod: instance of demod.
5047 * \return DRXStatus_t.
5049 static int SetQAM256(struct drxk_state *state)
5054 /* QAM Equalizer Setup */
5056 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD0__A, 11502);
5059 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD1__A, 12084);
5062 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD2__A, 12543);
5065 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD3__A, 12931);
5068 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD4__A, 13629);
5071 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD5__A, 15385);
5075 /* Decision Feedback Equalizer */
5076 status = write16(state, QAM_DQ_QUAL_FUN0__A, 8);
5079 status = write16(state, QAM_DQ_QUAL_FUN1__A, 8);
5082 status = write16(state, QAM_DQ_QUAL_FUN2__A, 8);
5085 status = write16(state, QAM_DQ_QUAL_FUN3__A, 8);
5088 status = write16(state, QAM_DQ_QUAL_FUN4__A, 6);
5091 status = write16(state, QAM_DQ_QUAL_FUN5__A, 0);
5095 status = write16(state, QAM_SY_SYNC_HWM__A, 5);
5098 status = write16(state, QAM_SY_SYNC_AWM__A, 4);
5101 status = write16(state, QAM_SY_SYNC_LWM__A, 3);
5105 /* QAM Slicer Settings */
5107 status = write16(state, SCU_RAM_QAM_SL_SIG_POWER__A, DRXK_QAM_SL_SIG_POWER_QAM256);
5112 /* QAM Loop Controller Coeficients */
5114 status = write16(state, SCU_RAM_QAM_LC_CA_FINE__A, 15);
5117 status = write16(state, SCU_RAM_QAM_LC_CA_COARSE__A, 40);
5120 status = write16(state, SCU_RAM_QAM_LC_EP_FINE__A, 12);
5123 status = write16(state, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24);
5126 status = write16(state, SCU_RAM_QAM_LC_EP_COARSE__A, 24);
5129 status = write16(state, SCU_RAM_QAM_LC_EI_FINE__A, 12);
5132 status = write16(state, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16);
5135 status = write16(state, SCU_RAM_QAM_LC_EI_COARSE__A, 16);
5139 status = write16(state, SCU_RAM_QAM_LC_CP_FINE__A, 5);
5142 status = write16(state, SCU_RAM_QAM_LC_CP_MEDIUM__A, 50);
5145 status = write16(state, SCU_RAM_QAM_LC_CP_COARSE__A, 250);
5148 status = write16(state, SCU_RAM_QAM_LC_CI_FINE__A, 5);
5151 status = write16(state, SCU_RAM_QAM_LC_CI_MEDIUM__A, 50);
5154 status = write16(state, SCU_RAM_QAM_LC_CI_COARSE__A, 125);
5157 status = write16(state, SCU_RAM_QAM_LC_CF_FINE__A, 16);
5160 status = write16(state, SCU_RAM_QAM_LC_CF_MEDIUM__A, 25);
5163 status = write16(state, SCU_RAM_QAM_LC_CF_COARSE__A, 48);
5166 status = write16(state, SCU_RAM_QAM_LC_CF1_FINE__A, 5);
5169 status = write16(state, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 10);
5172 status = write16(state, SCU_RAM_QAM_LC_CF1_COARSE__A, 10);
5177 /* QAM State Machine (FSM) Thresholds */
5179 status = write16(state, SCU_RAM_QAM_FSM_RTH__A, 50);
5182 status = write16(state, SCU_RAM_QAM_FSM_FTH__A, 60);
5185 status = write16(state, SCU_RAM_QAM_FSM_CTH__A, 80);
5188 status = write16(state, SCU_RAM_QAM_FSM_PTH__A, 100);
5191 status = write16(state, SCU_RAM_QAM_FSM_QTH__A, 150);
5194 status = write16(state, SCU_RAM_QAM_FSM_MTH__A, 110);
5198 status = write16(state, SCU_RAM_QAM_FSM_RATE_LIM__A, 40);
5201 status = write16(state, SCU_RAM_QAM_FSM_COUNT_LIM__A, 4);
5204 status = write16(state, SCU_RAM_QAM_FSM_FREQ_LIM__A, 12);
5209 /* QAM FSM Tracking Parameters */
5211 status = write16(state, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, (u16) 8);
5214 status = write16(state, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, (u16) 74);
5217 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, (u16) 18);
5220 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, (u16) 13);
5223 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16) 7);
5226 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16) 0);
5229 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16) -8);
5232 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
5237 /*============================================================================*/
5239 * \brief Reset QAM block.
5240 * \param demod: instance of demod.
5241 * \param channel: pointer to channel data.
5242 * \return DRXStatus_t.
5244 static int QAMResetQAM(struct drxk_state *state)
5250 /* Stop QAM comstate->m_exec */
5251 status = write16(state, QAM_COMM_EXEC__A, QAM_COMM_EXEC_STOP);
5255 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_QAM | SCU_RAM_COMMAND_CMD_DEMOD_RESET, 0, NULL, 1, &cmdResult);
5258 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
5262 /*============================================================================*/
5265 * \brief Set QAM symbolrate.
5266 * \param demod: instance of demod.
5267 * \param channel: pointer to channel data.
5268 * \return DRXStatus_t.
5270 static int QAMSetSymbolrate(struct drxk_state *state)
5272 u32 adcFrequency = 0;
5280 /* Select & calculate correct IQM rate */
5281 adcFrequency = (state->m_sysClockFreq * 1000) / 3;
5283 /* printk(KERN_DEBUG "drxk: SR %d\n", state->param.u.qam.symbol_rate); */
5284 if (state->param.u.qam.symbol_rate <= 1188750)
5286 else if (state->param.u.qam.symbol_rate <= 2377500)
5288 else if (state->param.u.qam.symbol_rate <= 4755000)
5290 status = write16(state, IQM_FD_RATESEL__A, ratesel);
5295 IqmRcRate = ((Fadc / (symbolrate * (4<<ratesel))) - 1) * (1<<23)
5297 symbFreq = state->param.u.qam.symbol_rate * (1 << ratesel);
5298 if (symbFreq == 0) {
5299 /* Divide by zero */
5303 iqmRcRate = (adcFrequency / symbFreq) * (1 << 21) +
5304 (Frac28a((adcFrequency % symbFreq), symbFreq) >> 7) -
5306 status = write32(state, IQM_RC_RATE_OFS_LO__A, iqmRcRate);
5309 state->m_iqmRcRate = iqmRcRate;
5311 LcSymbFreq = round (.125 * symbolrate / adcFreq * (1<<15))
5313 symbFreq = state->param.u.qam.symbol_rate;
5314 if (adcFrequency == 0) {
5315 /* Divide by zero */
5319 lcSymbRate = (symbFreq / adcFrequency) * (1 << 12) +
5320 (Frac28a((symbFreq % adcFrequency), adcFrequency) >>
5322 if (lcSymbRate > 511)
5324 status = write16(state, QAM_LC_SYMBOL_FREQ__A, (u16) lcSymbRate);
5328 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
5332 /*============================================================================*/
5335 * \brief Get QAM lock status.
5336 * \param demod: instance of demod.
5337 * \param channel: pointer to channel data.
5338 * \return DRXStatus_t.
5341 static int GetQAMLockStatus(struct drxk_state *state, u32 *pLockStatus)
5344 u16 Result[2] = { 0, 0 };
5347 *pLockStatus = NOT_LOCKED;
5348 status = scu_command(state,
5349 SCU_RAM_COMMAND_STANDARD_QAM |
5350 SCU_RAM_COMMAND_CMD_DEMOD_GET_LOCK, 0, NULL, 2,
5353 printk(KERN_ERR "drxk: %s status = %08x\n", __func__, status);
5355 if (Result[1] < SCU_RAM_QAM_LOCKED_LOCKED_DEMOD_LOCKED) {
5356 /* 0x0000 NOT LOCKED */
5357 } else if (Result[1] < SCU_RAM_QAM_LOCKED_LOCKED_LOCKED) {
5358 /* 0x4000 DEMOD LOCKED */
5359 *pLockStatus = DEMOD_LOCK;
5360 } else if (Result[1] < SCU_RAM_QAM_LOCKED_LOCKED_NEVER_LOCK) {
5361 /* 0x8000 DEMOD + FEC LOCKED (system lock) */
5362 *pLockStatus = MPEG_LOCK;
5364 /* 0xC000 NEVER LOCKED */
5365 /* (system will never be able to lock to the signal) */
5366 /* TODO: check this, intermediate & standard specific lock states are not
5367 taken into account here */
5368 *pLockStatus = NEVER_LOCK;
5373 #define QAM_MIRROR__M 0x03
5374 #define QAM_MIRROR_NORMAL 0x00
5375 #define QAM_MIRRORED 0x01
5376 #define QAM_MIRROR_AUTO_ON 0x02
5377 #define QAM_LOCKRANGE__M 0x10
5378 #define QAM_LOCKRANGE_NORMAL 0x10
5380 static int SetQAM(struct drxk_state *state, u16 IntermediateFreqkHz,
5381 s32 tunerFreqOffset)
5385 u16 setEnvParameters[5];
5386 u16 setParamParameters[4] = { 0, 0, 0, 0 };
5391 STEP 1: reset demodulator
5392 resets FEC DI and FEC RS
5394 resets SCU variables
5396 status = write16(state, FEC_DI_COMM_EXEC__A, FEC_DI_COMM_EXEC_STOP);
5399 status = write16(state, FEC_RS_COMM_EXEC__A, FEC_RS_COMM_EXEC_STOP);
5402 status = QAMResetQAM(state);
5407 STEP 2: configure demodulator
5409 -set params; resets IQM,QAM,FEC HW; initializes some SCU variables
5411 status = QAMSetSymbolrate(state);
5415 /* Env parameters */
5416 setEnvParameters[2] = QAM_TOP_ANNEX_A; /* Annex */
5417 if (state->m_OperationMode == OM_QAM_ITU_C)
5418 setEnvParameters[2] = QAM_TOP_ANNEX_C; /* Annex */
5419 setParamParameters[3] |= (QAM_MIRROR_AUTO_ON);
5420 /* check for LOCKRANGE Extented */
5421 /* setParamParameters[3] |= QAM_LOCKRANGE_NORMAL; */
5425 switch (state->param.u.qam.modulation) {
5427 state->m_Constellation = DRX_CONSTELLATION_QAM256;
5431 state->m_Constellation = DRX_CONSTELLATION_QAM64;
5434 state->m_Constellation = DRX_CONSTELLATION_QAM16;
5437 state->m_Constellation = DRX_CONSTELLATION_QAM32;
5440 state->m_Constellation = DRX_CONSTELLATION_QAM128;
5448 setParamParameters[0] = state->m_Constellation; /* constellation */
5449 setParamParameters[1] = DRXK_QAM_I12_J17; /* interleave mode */
5451 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_QAM | SCU_RAM_COMMAND_CMD_DEMOD_SET_PARAM, 4, setParamParameters, 1, &cmdResult);
5456 /* STEP 3: enable the system in a mode where the ADC provides valid signal
5457 setup constellation independent registers */
5459 status = SetFrequency(channel, tunerFreqOffset));
5463 status = SetFrequencyShifter(state, IntermediateFreqkHz, tunerFreqOffset, true);
5467 /* Setup BER measurement */
5468 status = SetQAMMeasurement(state, state->m_Constellation, state->param.u. qam.symbol_rate);
5472 /* Reset default values */
5473 status = write16(state, IQM_CF_SCALE_SH__A, IQM_CF_SCALE_SH__PRE);
5476 status = write16(state, QAM_SY_TIMEOUT__A, QAM_SY_TIMEOUT__PRE);
5480 /* Reset default LC values */
5481 status = write16(state, QAM_LC_RATE_LIMIT__A, 3);
5484 status = write16(state, QAM_LC_LPF_FACTORP__A, 4);
5487 status = write16(state, QAM_LC_LPF_FACTORI__A, 4);
5490 status = write16(state, QAM_LC_MODE__A, 7);
5494 status = write16(state, QAM_LC_QUAL_TAB0__A, 1);
5497 status = write16(state, QAM_LC_QUAL_TAB1__A, 1);
5500 status = write16(state, QAM_LC_QUAL_TAB2__A, 1);
5503 status = write16(state, QAM_LC_QUAL_TAB3__A, 1);
5506 status = write16(state, QAM_LC_QUAL_TAB4__A, 2);
5509 status = write16(state, QAM_LC_QUAL_TAB5__A, 2);
5512 status = write16(state, QAM_LC_QUAL_TAB6__A, 2);
5515 status = write16(state, QAM_LC_QUAL_TAB8__A, 2);
5518 status = write16(state, QAM_LC_QUAL_TAB9__A, 2);
5521 status = write16(state, QAM_LC_QUAL_TAB10__A, 2);
5524 status = write16(state, QAM_LC_QUAL_TAB12__A, 2);
5527 status = write16(state, QAM_LC_QUAL_TAB15__A, 3);
5530 status = write16(state, QAM_LC_QUAL_TAB16__A, 3);
5533 status = write16(state, QAM_LC_QUAL_TAB20__A, 4);
5536 status = write16(state, QAM_LC_QUAL_TAB25__A, 4);
5540 /* Mirroring, QAM-block starting point not inverted */
5541 status = write16(state, QAM_SY_SP_INV__A, QAM_SY_SP_INV_SPECTRUM_INV_DIS);
5545 /* Halt SCU to enable safe non-atomic accesses */
5546 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_HOLD);
5550 /* STEP 4: constellation specific setup */
5551 switch (state->param.u.qam.modulation) {
5553 status = SetQAM16(state);
5556 status = SetQAM32(state);
5560 status = SetQAM64(state);
5563 status = SetQAM128(state);
5566 status = SetQAM256(state);
5575 /* Activate SCU to enable SCU commands */
5576 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE);
5580 /* Re-configure MPEG output, requires knowledge of channel bitrate */
5581 /* extAttr->currentChannel.constellation = channel->constellation; */
5582 /* extAttr->currentChannel.symbolrate = channel->symbolrate; */
5583 status = MPEGTSDtoSetup(state, state->m_OperationMode);
5587 /* Start processes */
5588 status = MPEGTSStart(state);
5591 status = write16(state, FEC_COMM_EXEC__A, FEC_COMM_EXEC_ACTIVE);
5594 status = write16(state, QAM_COMM_EXEC__A, QAM_COMM_EXEC_ACTIVE);
5597 status = write16(state, IQM_COMM_EXEC__A, IQM_COMM_EXEC_B_ACTIVE);
5601 /* STEP 5: start QAM demodulator (starts FEC, QAM and IQM HW) */
5602 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_QAM | SCU_RAM_COMMAND_CMD_DEMOD_START, 0, NULL, 1, &cmdResult);
5606 /* update global DRXK data container */
5607 /*? extAttr->qamInterleaveMode = DRXK_QAM_I12_J17; */
5611 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
5615 static int SetQAMStandard(struct drxk_state *state,
5616 enum OperationMode oMode)
5619 #ifdef DRXK_QAM_TAPS
5620 #define DRXK_QAMA_TAPS_SELECT
5621 #include "drxk_filters.h"
5622 #undef DRXK_QAMA_TAPS_SELECT
5627 /* added antenna switch */
5628 SwitchAntennaToQAM(state);
5630 /* Ensure correct power-up mode */
5631 status = PowerUpQAM(state);
5634 /* Reset QAM block */
5635 status = QAMResetQAM(state);
5641 status = write16(state, IQM_COMM_EXEC__A, IQM_COMM_EXEC_B_STOP);
5644 status = write16(state, IQM_AF_AMUX__A, IQM_AF_AMUX_SIGNAL2ADC);
5648 /* Upload IQM Channel Filter settings by
5649 boot loader from ROM table */
5652 status = BLChainCmd(state, DRXK_BL_ROM_OFFSET_TAPS_ITU_A, DRXK_BLCC_NR_ELEMENTS_TAPS, DRXK_BLC_TIMEOUT);
5655 status = BLDirectCmd(state, IQM_CF_TAP_RE0__A, DRXK_BL_ROM_OFFSET_TAPS_ITU_C, DRXK_BLDC_NR_ELEMENTS_TAPS, DRXK_BLC_TIMEOUT);
5658 status = BLDirectCmd(state, IQM_CF_TAP_IM0__A, DRXK_BL_ROM_OFFSET_TAPS_ITU_C, DRXK_BLDC_NR_ELEMENTS_TAPS, DRXK_BLC_TIMEOUT);
5666 status = write16(state, IQM_CF_OUT_ENA__A, (1 << IQM_CF_OUT_ENA_QAM__B));
5669 status = write16(state, IQM_CF_SYMMETRIC__A, 0);
5672 status = write16(state, IQM_CF_MIDTAP__A, ((1 << IQM_CF_MIDTAP_RE__B) | (1 << IQM_CF_MIDTAP_IM__B)));
5676 status = write16(state, IQM_RC_STRETCH__A, 21);
5679 status = write16(state, IQM_AF_CLP_LEN__A, 0);
5682 status = write16(state, IQM_AF_CLP_TH__A, 448);
5685 status = write16(state, IQM_AF_SNS_LEN__A, 0);
5688 status = write16(state, IQM_CF_POW_MEAS_LEN__A, 0);
5692 status = write16(state, IQM_FS_ADJ_SEL__A, 1);
5695 status = write16(state, IQM_RC_ADJ_SEL__A, 1);
5698 status = write16(state, IQM_CF_ADJ_SEL__A, 1);
5701 status = write16(state, IQM_AF_UPD_SEL__A, 0);
5705 /* IQM Impulse Noise Processing Unit */
5706 status = write16(state, IQM_CF_CLP_VAL__A, 500);
5709 status = write16(state, IQM_CF_DATATH__A, 1000);
5712 status = write16(state, IQM_CF_BYPASSDET__A, 1);
5715 status = write16(state, IQM_CF_DET_LCT__A, 0);
5718 status = write16(state, IQM_CF_WND_LEN__A, 1);
5721 status = write16(state, IQM_CF_PKDTH__A, 1);
5724 status = write16(state, IQM_AF_INC_BYPASS__A, 1);
5728 /* turn on IQMAF. Must be done before setAgc**() */
5729 status = SetIqmAf(state, true);
5732 status = write16(state, IQM_AF_START_LOCK__A, 0x01);
5736 /* IQM will not be reset from here, sync ADC and update/init AGC */
5737 status = ADCSynchronization(state);
5741 /* Set the FSM step period */
5742 status = write16(state, SCU_RAM_QAM_FSM_STEP_PERIOD__A, 2000);
5746 /* Halt SCU to enable safe non-atomic accesses */
5747 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_HOLD);
5751 /* No more resets of the IQM, current standard correctly set =>
5752 now AGCs can be configured. */
5754 status = InitAGC(state, true);
5757 status = SetPreSaw(state, &(state->m_qamPreSawCfg));
5761 /* Configure AGC's */
5762 status = SetAgcRf(state, &(state->m_qamRfAgcCfg), true);
5765 status = SetAgcIf(state, &(state->m_qamIfAgcCfg), true);
5769 /* Activate SCU to enable SCU commands */
5770 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE);
5773 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
5777 static int WriteGPIO(struct drxk_state *state)
5783 /* stop lock indicator process */
5784 status = write16(state, SCU_RAM_GPIO__A, SCU_RAM_GPIO_HW_LOCK_IND_DISABLE);
5788 /* Write magic word to enable pdr reg write */
5789 status = write16(state, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY_KEY);
5793 if (state->m_hasSAWSW) {
5794 if (state->UIO_mask & 0x0001) { /* UIO-1 */
5795 /* write to io pad configuration register - output mode */
5796 status = write16(state, SIO_PDR_SMA_TX_CFG__A, state->m_GPIOCfg);
5800 /* use corresponding bit in io data output registar */
5801 status = read16(state, SIO_PDR_UIO_OUT_LO__A, &value);
5804 if ((state->m_GPIO & 0x0001) == 0)
5805 value &= 0x7FFF; /* write zero to 15th bit - 1st UIO */
5807 value |= 0x8000; /* write one to 15th bit - 1st UIO */
5808 /* write back to io data output register */
5809 status = write16(state, SIO_PDR_UIO_OUT_LO__A, value);
5813 if (state->UIO_mask & 0x0002) { /* UIO-2 */
5814 /* write to io pad configuration register - output mode */
5815 status = write16(state, SIO_PDR_SMA_TX_CFG__A, state->m_GPIOCfg);
5819 /* use corresponding bit in io data output registar */
5820 status = read16(state, SIO_PDR_UIO_OUT_LO__A, &value);
5823 if ((state->m_GPIO & 0x0002) == 0)
5824 value &= 0xBFFF; /* write zero to 14th bit - 2st UIO */
5826 value |= 0x4000; /* write one to 14th bit - 2st UIO */
5827 /* write back to io data output register */
5828 status = write16(state, SIO_PDR_UIO_OUT_LO__A, value);
5832 if (state->UIO_mask & 0x0004) { /* UIO-3 */
5833 /* write to io pad configuration register - output mode */
5834 status = write16(state, SIO_PDR_SMA_TX_CFG__A, state->m_GPIOCfg);
5838 /* use corresponding bit in io data output registar */
5839 status = read16(state, SIO_PDR_UIO_OUT_LO__A, &value);
5842 if ((state->m_GPIO & 0x0004) == 0)
5843 value &= 0xFFFB; /* write zero to 2nd bit - 3rd UIO */
5845 value |= 0x0004; /* write one to 2nd bit - 3rd UIO */
5846 /* write back to io data output register */
5847 status = write16(state, SIO_PDR_UIO_OUT_LO__A, value);
5852 /* Write magic word to disable pdr reg write */
5853 status = write16(state, SIO_TOP_COMM_KEY__A, 0x0000);
5856 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
5860 static int SwitchAntennaToQAM(struct drxk_state *state)
5867 if (!state->antenna_gpio)
5870 gpio_state = state->m_GPIO & state->antenna_gpio;
5872 if (state->antenna_dvbt ^ gpio_state) {
5873 /* Antenna is on DVB-T mode. Switch */
5874 if (state->antenna_dvbt)
5875 state->m_GPIO &= ~state->antenna_gpio;
5877 state->m_GPIO |= state->antenna_gpio;
5878 status = WriteGPIO(state);
5881 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
5885 static int SwitchAntennaToDVBT(struct drxk_state *state)
5892 if (!state->antenna_gpio)
5895 gpio_state = state->m_GPIO & state->antenna_gpio;
5897 if (!(state->antenna_dvbt ^ gpio_state)) {
5898 /* Antenna is on DVB-C mode. Switch */
5899 if (state->antenna_dvbt)
5900 state->m_GPIO |= state->antenna_gpio;
5902 state->m_GPIO &= ~state->antenna_gpio;
5903 status = WriteGPIO(state);
5906 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
5911 static int PowerDownDevice(struct drxk_state *state)
5913 /* Power down to requested mode */
5914 /* Backup some register settings */
5915 /* Set pins with possible pull-ups connected to them in input mode */
5916 /* Analog power down */
5917 /* ADC power down */
5918 /* Power down device */
5922 if (state->m_bPDownOpenBridge) {
5923 /* Open I2C bridge before power down of DRXK */
5924 status = ConfigureI2CBridge(state, true);
5929 status = DVBTEnableOFDMTokenRing(state, false);
5933 status = write16(state, SIO_CC_PWD_MODE__A, SIO_CC_PWD_MODE_LEVEL_CLOCK);
5936 status = write16(state, SIO_CC_UPDATE__A, SIO_CC_UPDATE_KEY);
5939 state->m_HICfgCtrl |= SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ;
5940 status = HI_CfgCommand(state);
5943 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
5948 static int load_microcode(struct drxk_state *state, const char *mc_name)
5950 const struct firmware *fw = NULL;
5955 err = request_firmware(&fw, mc_name, state->i2c->dev.parent);
5958 "drxk: Could not load firmware file %s.\n", mc_name);
5960 "drxk: Copy %s to your hotplug directory!\n", mc_name);
5963 err = DownloadMicrocode(state, fw->data, fw->size);
5964 release_firmware(fw);
5968 static int init_drxk(struct drxk_state *state)
5971 enum DRXPowerMode powerMode = DRXK_POWER_DOWN_OFDM;
5975 if ((state->m_DrxkState == DRXK_UNINITIALIZED)) {
5976 status = PowerUpDevice(state);
5979 status = DRXX_Open(state);
5982 /* Soft reset of OFDM-, sys- and osc-clockdomain */
5983 status = write16(state, SIO_CC_SOFT_RST__A, SIO_CC_SOFT_RST_OFDM__M | SIO_CC_SOFT_RST_SYS__M | SIO_CC_SOFT_RST_OSC__M);
5986 status = write16(state, SIO_CC_UPDATE__A, SIO_CC_UPDATE_KEY);
5989 /* TODO is this needed, if yes how much delay in worst case scenario */
5991 state->m_DRXK_A3_PATCH_CODE = true;
5992 status = GetDeviceCapabilities(state);
5996 /* Bridge delay, uses oscilator clock */
5997 /* Delay = (delay (nano seconds) * oscclk (kHz))/ 1000 */
5998 /* SDA brdige delay */
5999 state->m_HICfgBridgeDelay =
6000 (u16) ((state->m_oscClockFreq / 1000) *
6001 HI_I2C_BRIDGE_DELAY) / 1000;
6003 if (state->m_HICfgBridgeDelay >
6004 SIO_HI_RA_RAM_PAR_3_CFG_DBL_SDA__M) {
6005 state->m_HICfgBridgeDelay =
6006 SIO_HI_RA_RAM_PAR_3_CFG_DBL_SDA__M;
6008 /* SCL bridge delay, same as SDA for now */
6009 state->m_HICfgBridgeDelay +=
6010 state->m_HICfgBridgeDelay <<
6011 SIO_HI_RA_RAM_PAR_3_CFG_DBL_SCL__B;
6013 status = InitHI(state);
6016 /* disable various processes */
6018 if (!(state->m_DRXK_A1_ROM_CODE)
6019 && !(state->m_DRXK_A2_ROM_CODE))
6022 status = write16(state, SCU_RAM_GPIO__A, SCU_RAM_GPIO_HW_LOCK_IND_DISABLE);
6027 /* disable MPEG port */
6028 status = MPEGTSDisable(state);
6032 /* Stop AUD and SCU */
6033 status = write16(state, AUD_COMM_EXEC__A, AUD_COMM_EXEC_STOP);
6036 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_STOP);
6040 /* enable token-ring bus through OFDM block for possible ucode upload */
6041 status = write16(state, SIO_OFDM_SH_OFDM_RING_ENABLE__A, SIO_OFDM_SH_OFDM_RING_ENABLE_ON);
6045 /* include boot loader section */
6046 status = write16(state, SIO_BL_COMM_EXEC__A, SIO_BL_COMM_EXEC_ACTIVE);
6049 status = BLChainCmd(state, 0, 6, 100);
6053 if (!state->microcode_name)
6054 load_microcode(state, "drxk_a3.mc");
6056 load_microcode(state, state->microcode_name);
6058 /* disable token-ring bus through OFDM block for possible ucode upload */
6059 status = write16(state, SIO_OFDM_SH_OFDM_RING_ENABLE__A, SIO_OFDM_SH_OFDM_RING_ENABLE_OFF);
6063 /* Run SCU for a little while to initialize microcode version numbers */
6064 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE);
6067 status = DRXX_Open(state);
6070 /* added for test */
6073 powerMode = DRXK_POWER_DOWN_OFDM;
6074 status = CtrlPowerMode(state, &powerMode);
6078 /* Stamp driver version number in SCU data RAM in BCD code
6079 Done to enable field application engineers to retreive drxdriver version
6080 via I2C from SCU RAM.
6081 Not using SCU command interface for SCU register access since no
6082 microcode may be present.
6085 (((DRXK_VERSION_MAJOR / 100) % 10) << 12) +
6086 (((DRXK_VERSION_MAJOR / 10) % 10) << 8) +
6087 ((DRXK_VERSION_MAJOR % 10) << 4) +
6088 (DRXK_VERSION_MINOR % 10);
6089 status = write16(state, SCU_RAM_DRIVER_VER_HI__A, driverVersion);
6093 (((DRXK_VERSION_PATCH / 1000) % 10) << 12) +
6094 (((DRXK_VERSION_PATCH / 100) % 10) << 8) +
6095 (((DRXK_VERSION_PATCH / 10) % 10) << 4) +
6096 (DRXK_VERSION_PATCH % 10);
6097 status = write16(state, SCU_RAM_DRIVER_VER_LO__A, driverVersion);
6101 printk(KERN_INFO "DRXK driver version %d.%d.%d\n",
6102 DRXK_VERSION_MAJOR, DRXK_VERSION_MINOR,
6103 DRXK_VERSION_PATCH);
6105 /* Dirty fix of default values for ROM/PATCH microcode
6106 Dirty because this fix makes it impossible to setup suitable values
6107 before calling DRX_Open. This solution requires changes to RF AGC speed
6108 to be done via the CTRL function after calling DRX_Open */
6110 /* m_dvbtRfAgcCfg.speed = 3; */
6112 /* Reset driver debug flags to 0 */
6113 status = write16(state, SCU_RAM_DRIVER_DEBUG__A, 0);
6118 NOTE: No more full FEC resets allowed afterwards!! */
6119 status = write16(state, FEC_COMM_EXEC__A, FEC_COMM_EXEC_STOP);
6122 /* MPEGTS functions are still the same */
6123 status = MPEGTSDtoInit(state);
6126 status = MPEGTSStop(state);
6129 status = MPEGTSConfigurePolarity(state);
6132 status = MPEGTSConfigurePins(state, state->m_enableMPEGOutput);
6135 /* added: configure GPIO */
6136 status = WriteGPIO(state);
6140 state->m_DrxkState = DRXK_STOPPED;
6142 if (state->m_bPowerDown) {
6143 status = PowerDownDevice(state);
6146 state->m_DrxkState = DRXK_POWERED_DOWN;
6148 state->m_DrxkState = DRXK_STOPPED;
6152 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
6157 static void drxk_c_release(struct dvb_frontend *fe)
6159 struct drxk_state *state = fe->demodulator_priv;
6165 static int drxk_c_init(struct dvb_frontend *fe)
6167 struct drxk_state *state = fe->demodulator_priv;
6170 if (mutex_trylock(&state->ctlock) == 0)
6172 SetOperationMode(state, OM_QAM_ITU_A);
6176 static int drxk_c_sleep(struct dvb_frontend *fe)
6178 struct drxk_state *state = fe->demodulator_priv;
6182 mutex_unlock(&state->ctlock);
6186 static int drxk_gate_ctrl(struct dvb_frontend *fe, int enable)
6188 struct drxk_state *state = fe->demodulator_priv;
6190 dprintk(1, "%s\n", enable ? "enable" : "disable");
6191 return ConfigureI2CBridge(state, enable ? true : false);
6194 static int drxk_set_parameters(struct dvb_frontend *fe,
6195 struct dvb_frontend_parameters *p)
6197 struct drxk_state *state = fe->demodulator_priv;
6201 if (fe->ops.i2c_gate_ctrl)
6202 fe->ops.i2c_gate_ctrl(fe, 1);
6203 if (fe->ops.tuner_ops.set_params)
6204 fe->ops.tuner_ops.set_params(fe, p);
6205 if (fe->ops.i2c_gate_ctrl)
6206 fe->ops.i2c_gate_ctrl(fe, 0);
6208 fe->ops.tuner_ops.get_frequency(fe, &IF);
6209 Start(state, 0, IF);
6211 /* printk(KERN_DEBUG "drxk: %s IF=%d done\n", __func__, IF); */
6216 static int drxk_c_get_frontend(struct dvb_frontend *fe,
6217 struct dvb_frontend_parameters *p)
6223 static int drxk_read_status(struct dvb_frontend *fe, fe_status_t *status)
6225 struct drxk_state *state = fe->demodulator_priv;
6230 GetLockStatus(state, &stat, 0);
6231 if (stat == MPEG_LOCK)
6233 if (stat == FEC_LOCK)
6235 if (stat == DEMOD_LOCK)
6240 static int drxk_read_ber(struct dvb_frontend *fe, u32 *ber)
6248 static int drxk_read_signal_strength(struct dvb_frontend *fe,
6251 struct drxk_state *state = fe->demodulator_priv;
6255 ReadIFAgc(state, &val);
6256 *strength = val & 0xffff;
6260 static int drxk_read_snr(struct dvb_frontend *fe, u16 *snr)
6262 struct drxk_state *state = fe->demodulator_priv;
6266 GetSignalToNoise(state, &snr2);
6267 *snr = snr2 & 0xffff;
6271 static int drxk_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
6273 struct drxk_state *state = fe->demodulator_priv;
6277 DVBTQAMGetAccPktErr(state, &err);
6278 *ucblocks = (u32) err;
6282 static int drxk_c_get_tune_settings(struct dvb_frontend *fe, struct dvb_frontend_tune_settings
6286 sets->min_delay_ms = 3000;
6287 sets->max_drift = 0;
6288 sets->step_size = 0;
6292 static void drxk_t_release(struct dvb_frontend *fe)
6295 struct drxk_state *state = fe->demodulator_priv;
6302 static int drxk_t_init(struct dvb_frontend *fe)
6304 struct drxk_state *state = fe->demodulator_priv;
6307 if (mutex_trylock(&state->ctlock) == 0)
6309 SetOperationMode(state, OM_DVBT);
6313 static int drxk_t_sleep(struct dvb_frontend *fe)
6315 struct drxk_state *state = fe->demodulator_priv;
6318 mutex_unlock(&state->ctlock);
6322 static int drxk_t_get_frontend(struct dvb_frontend *fe,
6323 struct dvb_frontend_parameters *p)
6330 static struct dvb_frontend_ops drxk_c_ops = {
6332 .name = "DRXK DVB-C",
6334 .frequency_stepsize = 62500,
6335 .frequency_min = 47000000,
6336 .frequency_max = 862000000,
6337 .symbol_rate_min = 870000,
6338 .symbol_rate_max = 11700000,
6339 .caps = FE_CAN_QAM_16 | FE_CAN_QAM_32 | FE_CAN_QAM_64 |
6340 FE_CAN_QAM_128 | FE_CAN_QAM_256 | FE_CAN_FEC_AUTO},
6341 .release = drxk_c_release,
6342 .init = drxk_c_init,
6343 .sleep = drxk_c_sleep,
6344 .i2c_gate_ctrl = drxk_gate_ctrl,
6346 .set_frontend = drxk_set_parameters,
6347 .get_frontend = drxk_c_get_frontend,
6348 .get_tune_settings = drxk_c_get_tune_settings,
6350 .read_status = drxk_read_status,
6351 .read_ber = drxk_read_ber,
6352 .read_signal_strength = drxk_read_signal_strength,
6353 .read_snr = drxk_read_snr,
6354 .read_ucblocks = drxk_read_ucblocks,
6357 static struct dvb_frontend_ops drxk_t_ops = {
6359 .name = "DRXK DVB-T",
6361 .frequency_min = 47125000,
6362 .frequency_max = 865000000,
6363 .frequency_stepsize = 166667,
6364 .frequency_tolerance = 0,
6365 .caps = FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 |
6366 FE_CAN_FEC_3_4 | FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 |
6368 FE_CAN_QAM_16 | FE_CAN_QAM_64 |
6370 FE_CAN_TRANSMISSION_MODE_AUTO |
6371 FE_CAN_GUARD_INTERVAL_AUTO |
6372 FE_CAN_HIERARCHY_AUTO | FE_CAN_RECOVER | FE_CAN_MUTE_TS},
6373 .release = drxk_t_release,
6374 .init = drxk_t_init,
6375 .sleep = drxk_t_sleep,
6376 .i2c_gate_ctrl = drxk_gate_ctrl,
6378 .set_frontend = drxk_set_parameters,
6379 .get_frontend = drxk_t_get_frontend,
6381 .read_status = drxk_read_status,
6382 .read_ber = drxk_read_ber,
6383 .read_signal_strength = drxk_read_signal_strength,
6384 .read_snr = drxk_read_snr,
6385 .read_ucblocks = drxk_read_ucblocks,
6388 struct dvb_frontend *drxk_attach(const struct drxk_config *config,
6389 struct i2c_adapter *i2c,
6390 struct dvb_frontend **fe_t)
6392 struct drxk_state *state = NULL;
6393 u8 adr = config->adr;
6396 state = kzalloc(sizeof(struct drxk_state), GFP_KERNEL);
6401 state->demod_address = adr;
6402 state->single_master = config->single_master;
6403 state->microcode_name = config->microcode_name;
6404 state->no_i2c_bridge = config->no_i2c_bridge;
6405 state->antenna_gpio = config->antenna_gpio;
6406 state->antenna_dvbt = config->antenna_dvbt;
6408 /* NOTE: as more UIO bits will be used, add them to the mask */
6409 state->UIO_mask = config->antenna_gpio;
6411 /* Default gpio to DVB-C */
6412 if (!state->antenna_dvbt && state->antenna_gpio)
6413 state->m_GPIO |= state->antenna_gpio;
6415 state->m_GPIO &= ~state->antenna_gpio;
6417 mutex_init(&state->mutex);
6418 mutex_init(&state->ctlock);
6420 memcpy(&state->c_frontend.ops, &drxk_c_ops,
6421 sizeof(struct dvb_frontend_ops));
6422 memcpy(&state->t_frontend.ops, &drxk_t_ops,
6423 sizeof(struct dvb_frontend_ops));
6424 state->c_frontend.demodulator_priv = state;
6425 state->t_frontend.demodulator_priv = state;
6428 if (init_drxk(state) < 0)
6430 *fe_t = &state->t_frontend;
6432 #ifdef CONFIG_MEDIA_ATTACH
6434 * HACK: As this function initializes both DVB-T and DVB-C fe symbols,
6435 * and calling it twice would create the state twice, leading into
6436 * memory leaks, the right way is to call it only once. However, dvb
6437 * release functions will call symbol_put twice. So, the solution is to
6438 * artificially increment the usage count, in order to allow the
6439 * driver to be released.
6441 symbol_get(drxk_attach);
6443 return &state->c_frontend;
6446 printk(KERN_ERR "drxk: not found\n");
6450 EXPORT_SYMBOL(drxk_attach);
6452 MODULE_DESCRIPTION("DRX-K driver");
6453 MODULE_AUTHOR("Ralph Metzler");
6454 MODULE_LICENSE("GPL");