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 #define DEFAULT_DRXK_MPEG_LOCK_TIMEOUT 700
95 #define DEFAULT_DRXK_DEMOD_LOCK_TIMEOUT 500
97 #ifndef DRXK_KI_RAGC_ATV
98 #define DRXK_KI_RAGC_ATV 4
100 #ifndef DRXK_KI_IAGC_ATV
101 #define DRXK_KI_IAGC_ATV 6
103 #ifndef DRXK_KI_DAGC_ATV
104 #define DRXK_KI_DAGC_ATV 7
107 #ifndef DRXK_KI_RAGC_QAM
108 #define DRXK_KI_RAGC_QAM 3
110 #ifndef DRXK_KI_IAGC_QAM
111 #define DRXK_KI_IAGC_QAM 4
113 #ifndef DRXK_KI_DAGC_QAM
114 #define DRXK_KI_DAGC_QAM 7
116 #ifndef DRXK_KI_RAGC_DVBT
117 #define DRXK_KI_RAGC_DVBT (IsA1WithPatchCode(state) ? 3 : 2)
119 #ifndef DRXK_KI_IAGC_DVBT
120 #define DRXK_KI_IAGC_DVBT (IsA1WithPatchCode(state) ? 4 : 2)
122 #ifndef DRXK_KI_DAGC_DVBT
123 #define DRXK_KI_DAGC_DVBT (IsA1WithPatchCode(state) ? 10 : 7)
126 #ifndef DRXK_AGC_DAC_OFFSET
127 #define DRXK_AGC_DAC_OFFSET (0x800)
130 #ifndef DRXK_BANDWIDTH_8MHZ_IN_HZ
131 #define DRXK_BANDWIDTH_8MHZ_IN_HZ (0x8B8249L)
134 #ifndef DRXK_BANDWIDTH_7MHZ_IN_HZ
135 #define DRXK_BANDWIDTH_7MHZ_IN_HZ (0x7A1200L)
138 #ifndef DRXK_BANDWIDTH_6MHZ_IN_HZ
139 #define DRXK_BANDWIDTH_6MHZ_IN_HZ (0x68A1B6L)
142 #ifndef DRXK_QAM_SYMBOLRATE_MAX
143 #define DRXK_QAM_SYMBOLRATE_MAX (7233000)
146 #define DRXK_BL_ROM_OFFSET_TAPS_DVBT 56
147 #define DRXK_BL_ROM_OFFSET_TAPS_ITU_A 64
148 #define DRXK_BL_ROM_OFFSET_TAPS_ITU_C 0x5FE0
149 #define DRXK_BL_ROM_OFFSET_TAPS_BG 24
150 #define DRXK_BL_ROM_OFFSET_TAPS_DKILLP 32
151 #define DRXK_BL_ROM_OFFSET_TAPS_NTSC 40
152 #define DRXK_BL_ROM_OFFSET_TAPS_FM 48
153 #define DRXK_BL_ROM_OFFSET_UCODE 0
155 #define DRXK_BLC_TIMEOUT 100
157 #define DRXK_BLCC_NR_ELEMENTS_TAPS 2
158 #define DRXK_BLCC_NR_ELEMENTS_UCODE 6
160 #define DRXK_BLDC_NR_ELEMENTS_TAPS 28
162 #ifndef DRXK_OFDM_NE_NOTCH_WIDTH
163 #define DRXK_OFDM_NE_NOTCH_WIDTH (4)
166 #define DRXK_QAM_SL_SIG_POWER_QAM16 (40960)
167 #define DRXK_QAM_SL_SIG_POWER_QAM32 (20480)
168 #define DRXK_QAM_SL_SIG_POWER_QAM64 (43008)
169 #define DRXK_QAM_SL_SIG_POWER_QAM128 (20992)
170 #define DRXK_QAM_SL_SIG_POWER_QAM256 (43520)
172 static unsigned int debug;
173 module_param(debug, int, 0644);
174 MODULE_PARM_DESC(debug, "enable debug messages");
176 #define dprintk(level, fmt, arg...) do { \
177 if (debug >= level) \
178 printk(KERN_DEBUG "drxk: %s" fmt, __func__, ## arg); \
182 static inline u32 MulDiv32(u32 a, u32 b, u32 c)
186 tmp64 = (u64) a * (u64) b;
192 inline u32 Frac28a(u32 a, u32 c)
198 R0 = (a % c) << 4; /* 32-28 == 4 shifts possible at max */
199 Q1 = a / c; /* integer part, only the 4 least significant bits
200 will be visible in the result */
202 /* division using radix 16, 7 nibbles in the result */
203 for (i = 0; i < 7; i++) {
204 Q1 = (Q1 << 4) | (R0 / c);
214 static u32 Log10Times100(u32 x)
216 static const u8 scale = 15;
217 static const u8 indexWidth = 5;
224 log2lut[n] = (1<<scale) * 200 * log2(1.0 + ((1.0/(1<<INDEXWIDTH)) * n))
225 0 <= n < ((1<<INDEXWIDTH)+1)
228 static const u32 log2lut[] = {
230 290941, /* 290941.300628 */
231 573196, /* 573196.476418 */
232 847269, /* 847269.179851 */
233 1113620, /* 1113620.489452 */
234 1372674, /* 1372673.576986 */
235 1624818, /* 1624817.752104 */
236 1870412, /* 1870411.981536 */
237 2109788, /* 2109787.962654 */
238 2343253, /* 2343252.817465 */
239 2571091, /* 2571091.461923 */
240 2793569, /* 2793568.696416 */
241 3010931, /* 3010931.055901 */
242 3223408, /* 3223408.452106 */
243 3431216, /* 3431215.635215 */
244 3634553, /* 3634553.498355 */
245 3833610, /* 3833610.244726 */
246 4028562, /* 4028562.434393 */
247 4219576, /* 4219575.925308 */
248 4406807, /* 4406806.721144 */
249 4590402, /* 4590401.736809 */
250 4770499, /* 4770499.491025 */
251 4947231, /* 4947230.734179 */
252 5120719, /* 5120719.018555 */
253 5291081, /* 5291081.217197 */
254 5458428, /* 5458427.996830 */
255 5622864, /* 5622864.249668 */
256 5784489, /* 5784489.488298 */
257 5943398, /* 5943398.207380 */
258 6099680, /* 6099680.215452 */
259 6253421, /* 6253420.939751 */
260 6404702, /* 6404701.706649 */
261 6553600, /* 6553600.000000 */
268 /* Scale x (normalize) */
269 /* computing y in log(x/y) = log(x) - log(y) */
270 if ((x & ((0xffffffff) << (scale + 1))) == 0) {
271 for (k = scale; k > 0; k--) {
272 if (x & (((u32) 1) << scale))
277 for (k = scale; k < 31; k++) {
278 if ((x & (((u32) (-1)) << (scale + 1))) == 0)
284 Now x has binary point between bit[scale] and bit[scale-1]
285 and 1.0 <= x < 2.0 */
287 /* correction for divison: log(x) = log(x/y)+log(y) */
288 y = k * ((((u32) 1) << scale) * 200);
290 /* remove integer part */
291 x &= ((((u32) 1) << scale) - 1);
293 i = (u8) (x >> (scale - indexWidth));
294 /* compute delta (x - a) */
295 d = x & ((((u32) 1) << (scale - indexWidth)) - 1);
296 /* compute log, multiplication (d* (..)) must be within range ! */
298 ((d * (log2lut[i + 1] - log2lut[i])) >> (scale - indexWidth));
299 /* Conver to log10() */
300 y /= 108853; /* (log2(10) << scale) */
308 /****************************************************************************/
309 /* I2C **********************************************************************/
310 /****************************************************************************/
312 static int i2c_read1(struct i2c_adapter *adapter, u8 adr, u8 *val)
314 struct i2c_msg msgs[1] = { {.addr = adr, .flags = I2C_M_RD,
315 .buf = val, .len = 1}
318 return i2c_transfer(adapter, msgs, 1);
321 static int i2c_write(struct i2c_adapter *adap, u8 adr, u8 *data, int len)
324 struct i2c_msg msg = {
325 .addr = adr, .flags = 0, .buf = data, .len = len };
330 for (i = 0; i < len; i++)
331 printk(KERN_CONT " %02x", data[i]);
332 printk(KERN_CONT "\n");
334 status = i2c_transfer(adap, &msg, 1);
335 if (status >= 0 && status != 1)
339 printk(KERN_ERR "drxk: i2c write error at addr 0x%02x\n", adr);
344 static int i2c_read(struct i2c_adapter *adap,
345 u8 adr, u8 *msg, int len, u8 *answ, int alen)
348 struct i2c_msg msgs[2] = {
349 {.addr = adr, .flags = 0,
350 .buf = msg, .len = len},
351 {.addr = adr, .flags = I2C_M_RD,
352 .buf = answ, .len = alen}
355 status = i2c_transfer(adap, msgs, 2);
358 printk(KERN_CONT ": ERROR!\n");
362 printk(KERN_ERR "drxk: i2c read error at addr 0x%02x\n", adr);
367 dprintk(2, ": read from");
368 for (i = 0; i < len; i++)
369 printk(KERN_CONT " %02x", msg[i]);
370 printk(KERN_CONT ", value = ");
371 for (i = 0; i < alen; i++)
372 printk(KERN_CONT " %02x", answ[i]);
373 printk(KERN_CONT "\n");
378 static int read16_flags(struct drxk_state *state, u32 reg, u16 *data, u8 flags)
381 u8 adr = state->demod_address, mm1[4], mm2[2], len;
383 if (state->single_master)
386 if (DRXDAP_FASI_LONG_FORMAT(reg) || (flags != 0)) {
387 mm1[0] = (((reg << 1) & 0xFF) | 0x01);
388 mm1[1] = ((reg >> 16) & 0xFF);
389 mm1[2] = ((reg >> 24) & 0xFF) | flags;
390 mm1[3] = ((reg >> 7) & 0xFF);
393 mm1[0] = ((reg << 1) & 0xFF);
394 mm1[1] = (((reg >> 16) & 0x0F) | ((reg >> 18) & 0xF0));
397 dprintk(2, "(0x%08x, 0x%02x)\n", reg, flags);
398 status = i2c_read(state->i2c, adr, mm1, len, mm2, 2);
402 *data = mm2[0] | (mm2[1] << 8);
407 static int read16(struct drxk_state *state, u32 reg, u16 *data)
409 return read16_flags(state, reg, data, 0);
412 static int read32_flags(struct drxk_state *state, u32 reg, u32 *data, u8 flags)
415 u8 adr = state->demod_address, mm1[4], mm2[4], len;
417 if (state->single_master)
420 if (DRXDAP_FASI_LONG_FORMAT(reg) || (flags != 0)) {
421 mm1[0] = (((reg << 1) & 0xFF) | 0x01);
422 mm1[1] = ((reg >> 16) & 0xFF);
423 mm1[2] = ((reg >> 24) & 0xFF) | flags;
424 mm1[3] = ((reg >> 7) & 0xFF);
427 mm1[0] = ((reg << 1) & 0xFF);
428 mm1[1] = (((reg >> 16) & 0x0F) | ((reg >> 18) & 0xF0));
431 dprintk(2, "(0x%08x, 0x%02x)\n", reg, flags);
432 status = i2c_read(state->i2c, adr, mm1, len, mm2, 4);
436 *data = mm2[0] | (mm2[1] << 8) |
437 (mm2[2] << 16) | (mm2[3] << 24);
442 static int read32(struct drxk_state *state, u32 reg, u32 *data)
444 return read32_flags(state, reg, data, 0);
447 static int write16_flags(struct drxk_state *state, u32 reg, u16 data, u8 flags)
449 u8 adr = state->demod_address, mm[6], len;
451 if (state->single_master)
453 if (DRXDAP_FASI_LONG_FORMAT(reg) || (flags != 0)) {
454 mm[0] = (((reg << 1) & 0xFF) | 0x01);
455 mm[1] = ((reg >> 16) & 0xFF);
456 mm[2] = ((reg >> 24) & 0xFF) | flags;
457 mm[3] = ((reg >> 7) & 0xFF);
460 mm[0] = ((reg << 1) & 0xFF);
461 mm[1] = (((reg >> 16) & 0x0F) | ((reg >> 18) & 0xF0));
464 mm[len] = data & 0xff;
465 mm[len + 1] = (data >> 8) & 0xff;
467 dprintk(2, "(0x%08x, 0x%04x, 0x%02x)\n", reg, data, flags);
468 return i2c_write(state->i2c, adr, mm, len + 2);
471 static int write16(struct drxk_state *state, u32 reg, u16 data)
473 return write16_flags(state, reg, data, 0);
476 static int write32_flags(struct drxk_state *state, u32 reg, u32 data, u8 flags)
478 u8 adr = state->demod_address, mm[8], len;
480 if (state->single_master)
482 if (DRXDAP_FASI_LONG_FORMAT(reg) || (flags != 0)) {
483 mm[0] = (((reg << 1) & 0xFF) | 0x01);
484 mm[1] = ((reg >> 16) & 0xFF);
485 mm[2] = ((reg >> 24) & 0xFF) | flags;
486 mm[3] = ((reg >> 7) & 0xFF);
489 mm[0] = ((reg << 1) & 0xFF);
490 mm[1] = (((reg >> 16) & 0x0F) | ((reg >> 18) & 0xF0));
493 mm[len] = data & 0xff;
494 mm[len + 1] = (data >> 8) & 0xff;
495 mm[len + 2] = (data >> 16) & 0xff;
496 mm[len + 3] = (data >> 24) & 0xff;
497 dprintk(2, "(0x%08x, 0x%08x, 0x%02x)\n", reg, data, flags);
499 return i2c_write(state->i2c, adr, mm, len + 4);
502 static int write32(struct drxk_state *state, u32 reg, u32 data)
504 return write32_flags(state, reg, data, 0);
507 static int write_block(struct drxk_state *state, u32 Address,
508 const int BlockSize, const u8 pBlock[])
510 int status = 0, BlkSize = BlockSize;
513 if (state->single_master)
516 while (BlkSize > 0) {
517 int Chunk = BlkSize > state->m_ChunkSize ?
518 state->m_ChunkSize : BlkSize;
519 u8 *AdrBuf = &state->Chunk[0];
522 if (DRXDAP_FASI_LONG_FORMAT(Address) || (Flags != 0)) {
523 AdrBuf[0] = (((Address << 1) & 0xFF) | 0x01);
524 AdrBuf[1] = ((Address >> 16) & 0xFF);
525 AdrBuf[2] = ((Address >> 24) & 0xFF);
526 AdrBuf[3] = ((Address >> 7) & 0xFF);
529 if (Chunk == state->m_ChunkSize)
532 AdrBuf[0] = ((Address << 1) & 0xFF);
533 AdrBuf[1] = (((Address >> 16) & 0x0F) |
534 ((Address >> 18) & 0xF0));
537 memcpy(&state->Chunk[AdrLength], pBlock, Chunk);
538 dprintk(2, "(0x%08x, 0x%02x)\n", Address, Flags);
542 for (i = 0; i < Chunk; i++)
543 printk(KERN_CONT " %02x", pBlock[i]);
544 printk(KERN_CONT "\n");
546 status = i2c_write(state->i2c, state->demod_address,
547 &state->Chunk[0], Chunk + AdrLength);
549 printk(KERN_ERR "drxk: %s: i2c write error at addr 0x%02x\n",
554 Address += (Chunk >> 1);
560 #ifndef DRXK_MAX_RETRIES_POWERUP
561 #define DRXK_MAX_RETRIES_POWERUP 20
564 int PowerUpDevice(struct drxk_state *state)
572 status = i2c_read1(state->i2c, state->demod_address, &data);
576 status = i2c_write(state->i2c, state->demod_address,
582 status = i2c_read1(state->i2c, state->demod_address,
584 } while (status < 0 &&
585 (retryCount < DRXK_MAX_RETRIES_POWERUP));
586 if (status < 0 && retryCount >= DRXK_MAX_RETRIES_POWERUP)
590 /* Make sure all clk domains are active */
591 status = write16(state, SIO_CC_PWD_MODE__A, SIO_CC_PWD_MODE_LEVEL_NONE);
594 status = write16(state, SIO_CC_UPDATE__A, SIO_CC_UPDATE_KEY);
597 /* Enable pll lock tests */
598 status = write16(state, SIO_CC_PLL_LOCK__A, 1);
602 state->m_currentPowerMode = DRX_POWER_UP;
606 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
612 static int init_state(struct drxk_state *state)
615 * FIXME: most (all?) of the values bellow should be moved into
616 * struct drxk_config, as they are probably board-specific
618 u32 ulVSBIfAgcMode = DRXK_AGC_CTRL_AUTO;
619 u32 ulVSBIfAgcOutputLevel = 0;
620 u32 ulVSBIfAgcMinLevel = 0;
621 u32 ulVSBIfAgcMaxLevel = 0x7FFF;
622 u32 ulVSBIfAgcSpeed = 3;
624 u32 ulVSBRfAgcMode = DRXK_AGC_CTRL_AUTO;
625 u32 ulVSBRfAgcOutputLevel = 0;
626 u32 ulVSBRfAgcMinLevel = 0;
627 u32 ulVSBRfAgcMaxLevel = 0x7FFF;
628 u32 ulVSBRfAgcSpeed = 3;
629 u32 ulVSBRfAgcTop = 9500;
630 u32 ulVSBRfAgcCutOffCurrent = 4000;
632 u32 ulATVIfAgcMode = DRXK_AGC_CTRL_AUTO;
633 u32 ulATVIfAgcOutputLevel = 0;
634 u32 ulATVIfAgcMinLevel = 0;
635 u32 ulATVIfAgcMaxLevel = 0;
636 u32 ulATVIfAgcSpeed = 3;
638 u32 ulATVRfAgcMode = DRXK_AGC_CTRL_OFF;
639 u32 ulATVRfAgcOutputLevel = 0;
640 u32 ulATVRfAgcMinLevel = 0;
641 u32 ulATVRfAgcMaxLevel = 0;
642 u32 ulATVRfAgcTop = 9500;
643 u32 ulATVRfAgcCutOffCurrent = 4000;
644 u32 ulATVRfAgcSpeed = 3;
646 u32 ulQual83 = DEFAULT_MER_83;
647 u32 ulQual93 = DEFAULT_MER_93;
649 u32 ulMpegLockTimeOut = DEFAULT_DRXK_MPEG_LOCK_TIMEOUT;
650 u32 ulDemodLockTimeOut = DEFAULT_DRXK_DEMOD_LOCK_TIMEOUT;
652 /* io_pad_cfg register (8 bit reg.) MSB bit is 1 (default value) */
653 /* io_pad_cfg_mode output mode is drive always */
654 /* io_pad_cfg_drive is set to power 2 (23 mA) */
655 u32 ulGPIOCfg = 0x0113;
656 u32 ulInvertTSClock = 0;
657 u32 ulTSDataStrength = DRXK_MPEG_SERIAL_OUTPUT_PIN_DRIVE_STRENGTH;
658 u32 ulDVBTBitrate = 50000000;
659 u32 ulDVBCBitrate = DRXK_QAM_SYMBOLRATE_MAX * 8;
661 u32 ulInsertRSByte = 0;
668 state->m_hasLNA = false;
669 state->m_hasDVBT = false;
670 state->m_hasDVBC = false;
671 state->m_hasATV = false;
672 state->m_hasOOB = false;
673 state->m_hasAudio = false;
675 if (!state->m_ChunkSize)
676 state->m_ChunkSize = 124;
678 state->m_oscClockFreq = 0;
679 state->m_smartAntInverted = false;
680 state->m_bPDownOpenBridge = false;
682 /* real system clock frequency in kHz */
683 state->m_sysClockFreq = 151875;
684 /* Timing div, 250ns/Psys */
685 /* Timing div, = (delay (nano seconds) * sysclk (kHz))/ 1000 */
686 state->m_HICfgTimingDiv = ((state->m_sysClockFreq / 1000) *
687 HI_I2C_DELAY) / 1000;
689 if (state->m_HICfgTimingDiv > SIO_HI_RA_RAM_PAR_2_CFG_DIV__M)
690 state->m_HICfgTimingDiv = SIO_HI_RA_RAM_PAR_2_CFG_DIV__M;
691 state->m_HICfgWakeUpKey = (state->demod_address << 1);
692 /* port/bridge/power down ctrl */
693 state->m_HICfgCtrl = SIO_HI_RA_RAM_PAR_5_CFG_SLV0_SLAVE;
695 state->m_bPowerDown = (ulPowerDown != 0);
697 state->m_DRXK_A1_PATCH_CODE = false;
698 state->m_DRXK_A1_ROM_CODE = false;
699 state->m_DRXK_A2_ROM_CODE = false;
700 state->m_DRXK_A3_ROM_CODE = false;
701 state->m_DRXK_A2_PATCH_CODE = false;
702 state->m_DRXK_A3_PATCH_CODE = false;
704 /* Init AGC and PGA parameters */
706 state->m_vsbIfAgcCfg.ctrlMode = (ulVSBIfAgcMode);
707 state->m_vsbIfAgcCfg.outputLevel = (ulVSBIfAgcOutputLevel);
708 state->m_vsbIfAgcCfg.minOutputLevel = (ulVSBIfAgcMinLevel);
709 state->m_vsbIfAgcCfg.maxOutputLevel = (ulVSBIfAgcMaxLevel);
710 state->m_vsbIfAgcCfg.speed = (ulVSBIfAgcSpeed);
711 state->m_vsbPgaCfg = 140;
714 state->m_vsbRfAgcCfg.ctrlMode = (ulVSBRfAgcMode);
715 state->m_vsbRfAgcCfg.outputLevel = (ulVSBRfAgcOutputLevel);
716 state->m_vsbRfAgcCfg.minOutputLevel = (ulVSBRfAgcMinLevel);
717 state->m_vsbRfAgcCfg.maxOutputLevel = (ulVSBRfAgcMaxLevel);
718 state->m_vsbRfAgcCfg.speed = (ulVSBRfAgcSpeed);
719 state->m_vsbRfAgcCfg.top = (ulVSBRfAgcTop);
720 state->m_vsbRfAgcCfg.cutOffCurrent = (ulVSBRfAgcCutOffCurrent);
721 state->m_vsbPreSawCfg.reference = 0x07;
722 state->m_vsbPreSawCfg.usePreSaw = true;
724 state->m_Quality83percent = DEFAULT_MER_83;
725 state->m_Quality93percent = DEFAULT_MER_93;
726 if (ulQual93 <= 500 && ulQual83 < ulQual93) {
727 state->m_Quality83percent = ulQual83;
728 state->m_Quality93percent = ulQual93;
732 state->m_atvIfAgcCfg.ctrlMode = (ulATVIfAgcMode);
733 state->m_atvIfAgcCfg.outputLevel = (ulATVIfAgcOutputLevel);
734 state->m_atvIfAgcCfg.minOutputLevel = (ulATVIfAgcMinLevel);
735 state->m_atvIfAgcCfg.maxOutputLevel = (ulATVIfAgcMaxLevel);
736 state->m_atvIfAgcCfg.speed = (ulATVIfAgcSpeed);
739 state->m_atvRfAgcCfg.ctrlMode = (ulATVRfAgcMode);
740 state->m_atvRfAgcCfg.outputLevel = (ulATVRfAgcOutputLevel);
741 state->m_atvRfAgcCfg.minOutputLevel = (ulATVRfAgcMinLevel);
742 state->m_atvRfAgcCfg.maxOutputLevel = (ulATVRfAgcMaxLevel);
743 state->m_atvRfAgcCfg.speed = (ulATVRfAgcSpeed);
744 state->m_atvRfAgcCfg.top = (ulATVRfAgcTop);
745 state->m_atvRfAgcCfg.cutOffCurrent = (ulATVRfAgcCutOffCurrent);
746 state->m_atvPreSawCfg.reference = 0x04;
747 state->m_atvPreSawCfg.usePreSaw = true;
751 state->m_dvbtRfAgcCfg.ctrlMode = DRXK_AGC_CTRL_OFF;
752 state->m_dvbtRfAgcCfg.outputLevel = 0;
753 state->m_dvbtRfAgcCfg.minOutputLevel = 0;
754 state->m_dvbtRfAgcCfg.maxOutputLevel = 0xFFFF;
755 state->m_dvbtRfAgcCfg.top = 0x2100;
756 state->m_dvbtRfAgcCfg.cutOffCurrent = 4000;
757 state->m_dvbtRfAgcCfg.speed = 1;
761 state->m_dvbtIfAgcCfg.ctrlMode = DRXK_AGC_CTRL_AUTO;
762 state->m_dvbtIfAgcCfg.outputLevel = 0;
763 state->m_dvbtIfAgcCfg.minOutputLevel = 0;
764 state->m_dvbtIfAgcCfg.maxOutputLevel = 9000;
765 state->m_dvbtIfAgcCfg.top = 13424;
766 state->m_dvbtIfAgcCfg.cutOffCurrent = 0;
767 state->m_dvbtIfAgcCfg.speed = 3;
768 state->m_dvbtIfAgcCfg.FastClipCtrlDelay = 30;
769 state->m_dvbtIfAgcCfg.IngainTgtMax = 30000;
770 /* state->m_dvbtPgaCfg = 140; */
772 state->m_dvbtPreSawCfg.reference = 4;
773 state->m_dvbtPreSawCfg.usePreSaw = false;
776 state->m_qamRfAgcCfg.ctrlMode = DRXK_AGC_CTRL_OFF;
777 state->m_qamRfAgcCfg.outputLevel = 0;
778 state->m_qamRfAgcCfg.minOutputLevel = 6023;
779 state->m_qamRfAgcCfg.maxOutputLevel = 27000;
780 state->m_qamRfAgcCfg.top = 0x2380;
781 state->m_qamRfAgcCfg.cutOffCurrent = 4000;
782 state->m_qamRfAgcCfg.speed = 3;
785 state->m_qamIfAgcCfg.ctrlMode = DRXK_AGC_CTRL_AUTO;
786 state->m_qamIfAgcCfg.outputLevel = 0;
787 state->m_qamIfAgcCfg.minOutputLevel = 0;
788 state->m_qamIfAgcCfg.maxOutputLevel = 9000;
789 state->m_qamIfAgcCfg.top = 0x0511;
790 state->m_qamIfAgcCfg.cutOffCurrent = 0;
791 state->m_qamIfAgcCfg.speed = 3;
792 state->m_qamIfAgcCfg.IngainTgtMax = 5119;
793 state->m_qamIfAgcCfg.FastClipCtrlDelay = 50;
795 state->m_qamPgaCfg = 140;
796 state->m_qamPreSawCfg.reference = 4;
797 state->m_qamPreSawCfg.usePreSaw = false;
799 state->m_OperationMode = OM_NONE;
800 state->m_DrxkState = DRXK_UNINITIALIZED;
802 /* MPEG output configuration */
803 state->m_enableMPEGOutput = true; /* If TRUE; enable MPEG ouput */
804 state->m_insertRSByte = false; /* If TRUE; insert RS byte */
805 state->m_invertDATA = false; /* If TRUE; invert DATA signals */
806 state->m_invertERR = false; /* If TRUE; invert ERR signal */
807 state->m_invertSTR = false; /* If TRUE; invert STR signals */
808 state->m_invertVAL = false; /* If TRUE; invert VAL signals */
809 state->m_invertCLK = (ulInvertTSClock != 0); /* If TRUE; invert CLK signals */
811 /* If TRUE; static MPEG clockrate will be used;
812 otherwise clockrate will adapt to the bitrate of the TS */
814 state->m_DVBTBitrate = ulDVBTBitrate;
815 state->m_DVBCBitrate = ulDVBCBitrate;
817 state->m_TSDataStrength = (ulTSDataStrength & 0x07);
819 /* Maximum bitrate in b/s in case static clockrate is selected */
820 state->m_mpegTsStaticBitrate = 19392658;
821 state->m_disableTEIhandling = false;
824 state->m_insertRSByte = true;
826 state->m_MpegLockTimeOut = DEFAULT_DRXK_MPEG_LOCK_TIMEOUT;
827 if (ulMpegLockTimeOut < 10000)
828 state->m_MpegLockTimeOut = ulMpegLockTimeOut;
829 state->m_DemodLockTimeOut = DEFAULT_DRXK_DEMOD_LOCK_TIMEOUT;
830 if (ulDemodLockTimeOut < 10000)
831 state->m_DemodLockTimeOut = ulDemodLockTimeOut;
834 state->m_Constellation = DRX_CONSTELLATION_AUTO;
835 state->m_qamInterleaveMode = DRXK_QAM_I12_J17;
836 state->m_fecRsPlen = 204 * 8; /* fecRsPlen annex A */
837 state->m_fecRsPrescale = 1;
839 state->m_sqiSpeed = DRXK_DVBT_SQI_SPEED_MEDIUM;
840 state->m_agcFastClipCtrlDelay = 0;
842 state->m_GPIOCfg = (ulGPIOCfg);
844 state->m_bPowerDown = false;
845 state->m_currentPowerMode = DRX_POWER_DOWN;
847 state->m_rfmirror = (ulRfMirror == 0);
848 state->m_IfAgcPol = false;
852 static int DRXX_Open(struct drxk_state *state)
860 /* stop lock indicator process */
861 status = write16(state, SCU_RAM_GPIO__A, SCU_RAM_GPIO_HW_LOCK_IND_DISABLE);
864 /* Check device id */
865 status = read16(state, SIO_TOP_COMM_KEY__A, &key);
868 status = write16(state, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY_KEY);
871 status = read32(state, SIO_TOP_JTAGID_LO__A, &jtag);
874 status = read16(state, SIO_PDR_UIO_IN_HI__A, &bid);
877 status = write16(state, SIO_TOP_COMM_KEY__A, key);
880 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
884 static int GetDeviceCapabilities(struct drxk_state *state)
886 u16 sioPdrOhwCfg = 0;
887 u32 sioTopJtagidLo = 0;
889 const char *spin = "";
894 /* stop lock indicator process */
895 status = write16(state, SCU_RAM_GPIO__A, SCU_RAM_GPIO_HW_LOCK_IND_DISABLE);
898 status = write16(state, SIO_TOP_COMM_KEY__A, 0xFABA);
901 status = read16(state, SIO_PDR_OHW_CFG__A, &sioPdrOhwCfg);
904 status = write16(state, SIO_TOP_COMM_KEY__A, 0x0000);
908 switch ((sioPdrOhwCfg & SIO_PDR_OHW_CFG_FREF_SEL__M)) {
910 /* ignore (bypass ?) */
914 state->m_oscClockFreq = 27000;
918 state->m_oscClockFreq = 20250;
922 state->m_oscClockFreq = 20250;
925 printk(KERN_ERR "drxk: Clock Frequency is unkonwn\n");
929 Determine device capabilities
932 status = read32(state, SIO_TOP_JTAGID_LO__A, &sioTopJtagidLo);
936 printk(KERN_ERR "drxk: status = 0x%08x\n", sioTopJtagidLo);
939 switch ((sioTopJtagidLo >> 29) & 0xF) {
941 state->m_deviceSpin = DRXK_SPIN_A1;
945 state->m_deviceSpin = DRXK_SPIN_A2;
949 state->m_deviceSpin = DRXK_SPIN_A3;
953 state->m_deviceSpin = DRXK_SPIN_UNKNOWN;
955 printk(KERN_ERR "drxk: Spin %d unknown\n",
956 (sioTopJtagidLo >> 29) & 0xF);
959 switch ((sioTopJtagidLo >> 12) & 0xFF) {
961 /* typeId = DRX3913K_TYPE_ID */
962 state->m_hasLNA = false;
963 state->m_hasOOB = false;
964 state->m_hasATV = false;
965 state->m_hasAudio = false;
966 state->m_hasDVBT = true;
967 state->m_hasDVBC = true;
968 state->m_hasSAWSW = true;
969 state->m_hasGPIO2 = false;
970 state->m_hasGPIO1 = false;
971 state->m_hasIRQN = false;
974 /* typeId = DRX3915K_TYPE_ID */
975 state->m_hasLNA = false;
976 state->m_hasOOB = false;
977 state->m_hasATV = true;
978 state->m_hasAudio = false;
979 state->m_hasDVBT = true;
980 state->m_hasDVBC = false;
981 state->m_hasSAWSW = true;
982 state->m_hasGPIO2 = true;
983 state->m_hasGPIO1 = true;
984 state->m_hasIRQN = false;
987 /* typeId = DRX3916K_TYPE_ID */
988 state->m_hasLNA = false;
989 state->m_hasOOB = false;
990 state->m_hasATV = true;
991 state->m_hasAudio = false;
992 state->m_hasDVBT = true;
993 state->m_hasDVBC = false;
994 state->m_hasSAWSW = true;
995 state->m_hasGPIO2 = true;
996 state->m_hasGPIO1 = true;
997 state->m_hasIRQN = false;
1000 /* typeId = DRX3918K_TYPE_ID */
1001 state->m_hasLNA = false;
1002 state->m_hasOOB = false;
1003 state->m_hasATV = true;
1004 state->m_hasAudio = true;
1005 state->m_hasDVBT = true;
1006 state->m_hasDVBC = false;
1007 state->m_hasSAWSW = true;
1008 state->m_hasGPIO2 = true;
1009 state->m_hasGPIO1 = true;
1010 state->m_hasIRQN = false;
1013 /* typeId = DRX3921K_TYPE_ID */
1014 state->m_hasLNA = false;
1015 state->m_hasOOB = false;
1016 state->m_hasATV = true;
1017 state->m_hasAudio = true;
1018 state->m_hasDVBT = true;
1019 state->m_hasDVBC = true;
1020 state->m_hasSAWSW = true;
1021 state->m_hasGPIO2 = true;
1022 state->m_hasGPIO1 = true;
1023 state->m_hasIRQN = false;
1026 /* typeId = DRX3923K_TYPE_ID */
1027 state->m_hasLNA = false;
1028 state->m_hasOOB = false;
1029 state->m_hasATV = true;
1030 state->m_hasAudio = true;
1031 state->m_hasDVBT = true;
1032 state->m_hasDVBC = true;
1033 state->m_hasSAWSW = true;
1034 state->m_hasGPIO2 = true;
1035 state->m_hasGPIO1 = true;
1036 state->m_hasIRQN = false;
1039 /* typeId = DRX3925K_TYPE_ID */
1040 state->m_hasLNA = false;
1041 state->m_hasOOB = false;
1042 state->m_hasATV = true;
1043 state->m_hasAudio = true;
1044 state->m_hasDVBT = true;
1045 state->m_hasDVBC = true;
1046 state->m_hasSAWSW = true;
1047 state->m_hasGPIO2 = true;
1048 state->m_hasGPIO1 = true;
1049 state->m_hasIRQN = false;
1052 /* typeId = DRX3926K_TYPE_ID */
1053 state->m_hasLNA = false;
1054 state->m_hasOOB = false;
1055 state->m_hasATV = true;
1056 state->m_hasAudio = false;
1057 state->m_hasDVBT = true;
1058 state->m_hasDVBC = true;
1059 state->m_hasSAWSW = true;
1060 state->m_hasGPIO2 = true;
1061 state->m_hasGPIO1 = true;
1062 state->m_hasIRQN = false;
1065 printk(KERN_ERR "drxk: DeviceID 0x%02x not supported\n",
1066 ((sioTopJtagidLo >> 12) & 0xFF));
1072 "drxk: detected a drx-39%02xk, spin %s, xtal %d.%03d MHz\n",
1073 ((sioTopJtagidLo >> 12) & 0xFF), spin,
1074 state->m_oscClockFreq / 1000,
1075 state->m_oscClockFreq % 1000);
1079 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
1085 static int HI_Command(struct drxk_state *state, u16 cmd, u16 *pResult)
1093 status = write16(state, SIO_HI_RA_RAM_CMD__A, cmd);
1096 if (cmd == SIO_HI_RA_RAM_CMD_RESET)
1100 (bool) ((cmd == SIO_HI_RA_RAM_CMD_CONFIG) &&
1101 ((state->m_HICfgCtrl) &
1102 SIO_HI_RA_RAM_PAR_5_CFG_SLEEP__M) ==
1103 SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ);
1104 if (powerdown_cmd == false) {
1105 /* Wait until command rdy */
1112 status = read16(state, SIO_HI_RA_RAM_CMD__A,
1114 } while ((status < 0) && (retryCount < DRXK_MAX_RETRIES)
1118 status = read16(state, SIO_HI_RA_RAM_RES__A, pResult);
1122 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
1127 static int HI_CfgCommand(struct drxk_state *state)
1133 mutex_lock(&state->mutex);
1135 status = write16(state, SIO_HI_RA_RAM_PAR_6__A, state->m_HICfgTimeout);
1138 status = write16(state, SIO_HI_RA_RAM_PAR_5__A, state->m_HICfgCtrl);
1141 status = write16(state, SIO_HI_RA_RAM_PAR_4__A, state->m_HICfgWakeUpKey);
1144 status = write16(state, SIO_HI_RA_RAM_PAR_3__A, state->m_HICfgBridgeDelay);
1147 status = write16(state, SIO_HI_RA_RAM_PAR_2__A, state->m_HICfgTimingDiv);
1150 status = write16(state, SIO_HI_RA_RAM_PAR_1__A, SIO_HI_RA_RAM_PAR_1_PAR1_SEC_KEY);
1153 status = HI_Command(state, SIO_HI_RA_RAM_CMD_CONFIG, 0);
1157 state->m_HICfgCtrl &= ~SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ;
1159 mutex_unlock(&state->mutex);
1161 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
1165 static int InitHI(struct drxk_state *state)
1169 state->m_HICfgWakeUpKey = (state->demod_address << 1);
1170 state->m_HICfgTimeout = 0x96FF;
1171 /* port/bridge/power down ctrl */
1172 state->m_HICfgCtrl = SIO_HI_RA_RAM_PAR_5_CFG_SLV0_SLAVE;
1174 return HI_CfgCommand(state);
1177 static int MPEGTSConfigurePins(struct drxk_state *state, bool mpegEnable)
1180 u16 sioPdrMclkCfg = 0;
1181 u16 sioPdrMdxCfg = 0;
1184 dprintk(1, ": mpeg %s, %s mode\n",
1185 mpegEnable ? "enable" : "disable",
1186 state->m_enableParallel ? "parallel" : "serial");
1188 /* stop lock indicator process */
1189 status = write16(state, SCU_RAM_GPIO__A, SCU_RAM_GPIO_HW_LOCK_IND_DISABLE);
1193 /* MPEG TS pad configuration */
1194 status = write16(state, SIO_TOP_COMM_KEY__A, 0xFABA);
1198 if (mpegEnable == false) {
1199 /* Set MPEG TS pads to inputmode */
1200 status = write16(state, SIO_PDR_MSTRT_CFG__A, 0x0000);
1203 status = write16(state, SIO_PDR_MERR_CFG__A, 0x0000);
1206 status = write16(state, SIO_PDR_MCLK_CFG__A, 0x0000);
1209 status = write16(state, SIO_PDR_MVAL_CFG__A, 0x0000);
1212 status = write16(state, SIO_PDR_MD0_CFG__A, 0x0000);
1215 status = write16(state, SIO_PDR_MD1_CFG__A, 0x0000);
1218 status = write16(state, SIO_PDR_MD2_CFG__A, 0x0000);
1221 status = write16(state, SIO_PDR_MD3_CFG__A, 0x0000);
1224 status = write16(state, SIO_PDR_MD4_CFG__A, 0x0000);
1227 status = write16(state, SIO_PDR_MD5_CFG__A, 0x0000);
1230 status = write16(state, SIO_PDR_MD6_CFG__A, 0x0000);
1233 status = write16(state, SIO_PDR_MD7_CFG__A, 0x0000);
1237 /* Enable MPEG output */
1239 ((state->m_TSDataStrength <<
1240 SIO_PDR_MD0_CFG_DRIVE__B) | 0x0003);
1241 sioPdrMclkCfg = ((state->m_TSClockkStrength <<
1242 SIO_PDR_MCLK_CFG_DRIVE__B) |
1245 status = write16(state, SIO_PDR_MSTRT_CFG__A, sioPdrMdxCfg);
1249 if (state->enable_merr_cfg)
1250 err_cfg = sioPdrMdxCfg;
1252 status = write16(state, SIO_PDR_MERR_CFG__A, err_cfg);
1255 status = write16(state, SIO_PDR_MVAL_CFG__A, err_cfg);
1259 if (state->m_enableParallel == true) {
1260 /* paralel -> enable MD1 to MD7 */
1261 status = write16(state, SIO_PDR_MD1_CFG__A, sioPdrMdxCfg);
1264 status = write16(state, SIO_PDR_MD2_CFG__A, sioPdrMdxCfg);
1267 status = write16(state, SIO_PDR_MD3_CFG__A, sioPdrMdxCfg);
1270 status = write16(state, SIO_PDR_MD4_CFG__A, sioPdrMdxCfg);
1273 status = write16(state, SIO_PDR_MD5_CFG__A, sioPdrMdxCfg);
1276 status = write16(state, SIO_PDR_MD6_CFG__A, sioPdrMdxCfg);
1279 status = write16(state, SIO_PDR_MD7_CFG__A, sioPdrMdxCfg);
1283 sioPdrMdxCfg = ((state->m_TSDataStrength <<
1284 SIO_PDR_MD0_CFG_DRIVE__B)
1286 /* serial -> disable MD1 to MD7 */
1287 status = write16(state, SIO_PDR_MD1_CFG__A, 0x0000);
1290 status = write16(state, SIO_PDR_MD2_CFG__A, 0x0000);
1293 status = write16(state, SIO_PDR_MD3_CFG__A, 0x0000);
1296 status = write16(state, SIO_PDR_MD4_CFG__A, 0x0000);
1299 status = write16(state, SIO_PDR_MD5_CFG__A, 0x0000);
1302 status = write16(state, SIO_PDR_MD6_CFG__A, 0x0000);
1305 status = write16(state, SIO_PDR_MD7_CFG__A, 0x0000);
1309 status = write16(state, SIO_PDR_MCLK_CFG__A, sioPdrMclkCfg);
1312 status = write16(state, SIO_PDR_MD0_CFG__A, sioPdrMdxCfg);
1316 /* Enable MB output over MPEG pads and ctl input */
1317 status = write16(state, SIO_PDR_MON_CFG__A, 0x0000);
1320 /* Write nomagic word to enable pdr reg write */
1321 status = write16(state, SIO_TOP_COMM_KEY__A, 0x0000);
1324 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
1328 static int MPEGTSDisable(struct drxk_state *state)
1332 return MPEGTSConfigurePins(state, false);
1335 static int BLChainCmd(struct drxk_state *state,
1336 u16 romOffset, u16 nrOfElements, u32 timeOut)
1343 mutex_lock(&state->mutex);
1344 status = write16(state, SIO_BL_MODE__A, SIO_BL_MODE_CHAIN);
1347 status = write16(state, SIO_BL_CHAIN_ADDR__A, romOffset);
1350 status = write16(state, SIO_BL_CHAIN_LEN__A, nrOfElements);
1353 status = write16(state, SIO_BL_ENABLE__A, SIO_BL_ENABLE_ON);
1357 end = jiffies + msecs_to_jiffies(timeOut);
1360 status = read16(state, SIO_BL_STATUS__A, &blStatus);
1363 } while ((blStatus == 0x1) &&
1364 ((time_is_after_jiffies(end))));
1366 if (blStatus == 0x1) {
1367 printk(KERN_ERR "drxk: SIO not ready\n");
1373 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
1375 mutex_unlock(&state->mutex);
1380 static int DownloadMicrocode(struct drxk_state *state,
1381 const u8 pMCImage[], u32 Length)
1383 const u8 *pSrc = pMCImage;
1396 /* down the drain (we don care about MAGIC_WORD) */
1397 Drain = (pSrc[0] << 8) | pSrc[1];
1398 pSrc += sizeof(u16);
1399 offset += sizeof(u16);
1400 nBlocks = (pSrc[0] << 8) | pSrc[1];
1401 pSrc += sizeof(u16);
1402 offset += sizeof(u16);
1404 for (i = 0; i < nBlocks; i += 1) {
1405 Address = (pSrc[0] << 24) | (pSrc[1] << 16) |
1406 (pSrc[2] << 8) | pSrc[3];
1407 pSrc += sizeof(u32);
1408 offset += sizeof(u32);
1410 BlockSize = ((pSrc[0] << 8) | pSrc[1]) * sizeof(u16);
1411 pSrc += sizeof(u16);
1412 offset += sizeof(u16);
1414 Flags = (pSrc[0] << 8) | pSrc[1];
1415 pSrc += sizeof(u16);
1416 offset += sizeof(u16);
1418 BlockCRC = (pSrc[0] << 8) | pSrc[1];
1419 pSrc += sizeof(u16);
1420 offset += sizeof(u16);
1422 if (offset + BlockSize > Length) {
1423 printk(KERN_ERR "drxk: Firmware is corrupted.\n");
1427 status = write_block(state, Address, BlockSize, pSrc);
1429 printk(KERN_ERR "drxk: Error %d while loading firmware\n", status);
1433 offset += BlockSize;
1438 static int DVBTEnableOFDMTokenRing(struct drxk_state *state, bool enable)
1442 u16 desiredCtrl = SIO_OFDM_SH_OFDM_RING_ENABLE_ON;
1443 u16 desiredStatus = SIO_OFDM_SH_OFDM_RING_STATUS_ENABLED;
1448 if (enable == false) {
1449 desiredCtrl = SIO_OFDM_SH_OFDM_RING_ENABLE_OFF;
1450 desiredStatus = SIO_OFDM_SH_OFDM_RING_STATUS_DOWN;
1453 status = read16(state, SIO_OFDM_SH_OFDM_RING_STATUS__A, &data);
1454 if (status >= 0 && data == desiredStatus) {
1455 /* tokenring already has correct status */
1458 /* Disable/enable dvbt tokenring bridge */
1459 status = write16(state, SIO_OFDM_SH_OFDM_RING_ENABLE__A, desiredCtrl);
1461 end = jiffies + msecs_to_jiffies(DRXK_OFDM_TR_SHUTDOWN_TIMEOUT);
1463 status = read16(state, SIO_OFDM_SH_OFDM_RING_STATUS__A, &data);
1464 if ((status >= 0 && data == desiredStatus) || time_is_after_jiffies(end))
1468 if (data != desiredStatus) {
1469 printk(KERN_ERR "drxk: SIO not ready\n");
1475 static int MPEGTSStop(struct drxk_state *state)
1478 u16 fecOcSncMode = 0;
1479 u16 fecOcIprMode = 0;
1483 /* Gracefull shutdown (byte boundaries) */
1484 status = read16(state, FEC_OC_SNC_MODE__A, &fecOcSncMode);
1487 fecOcSncMode |= FEC_OC_SNC_MODE_SHUTDOWN__M;
1488 status = write16(state, FEC_OC_SNC_MODE__A, fecOcSncMode);
1492 /* Suppress MCLK during absence of data */
1493 status = read16(state, FEC_OC_IPR_MODE__A, &fecOcIprMode);
1496 fecOcIprMode |= FEC_OC_IPR_MODE_MCLK_DIS_DAT_ABS__M;
1497 status = write16(state, FEC_OC_IPR_MODE__A, fecOcIprMode);
1501 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
1506 static int scu_command(struct drxk_state *state,
1507 u16 cmd, u8 parameterLen,
1508 u16 *parameter, u8 resultLen, u16 *result)
1510 #if (SCU_RAM_PARAM_0__A - SCU_RAM_PARAM_15__A) != 15
1511 #error DRXK register mapping no longer compatible with this routine!
1514 int status = -EINVAL;
1523 if ((cmd == 0) || ((parameterLen > 0) && (parameter == NULL)) ||
1524 ((resultLen > 0) && (result == NULL)))
1527 mutex_lock(&state->mutex);
1529 /* assume that the command register is ready
1530 since it is checked afterwards */
1531 for (ii = parameterLen - 1; ii >= 0; ii -= 1) {
1532 buffer[cnt++] = (parameter[ii] & 0xFF);
1533 buffer[cnt++] = ((parameter[ii] >> 8) & 0xFF);
1535 buffer[cnt++] = (cmd & 0xFF);
1536 buffer[cnt++] = ((cmd >> 8) & 0xFF);
1538 write_block(state, SCU_RAM_PARAM_0__A -
1539 (parameterLen - 1), cnt, buffer);
1540 /* Wait until SCU has processed command */
1541 end = jiffies + msecs_to_jiffies(DRXK_MAX_WAITTIME);
1544 status = read16(state, SCU_RAM_COMMAND__A, &curCmd);
1547 } while (!(curCmd == DRX_SCU_READY) && (time_is_after_jiffies(end)));
1548 if (curCmd != DRX_SCU_READY) {
1549 printk(KERN_ERR "drxk: SCU not ready\n");
1554 if ((resultLen > 0) && (result != NULL)) {
1558 for (ii = resultLen - 1; ii >= 0; ii -= 1) {
1559 status = read16(state, SCU_RAM_PARAM_0__A - ii, &result[ii]);
1564 /* Check if an error was reported by SCU */
1565 err = (s16)result[0];
1569 /* check for the known error codes */
1571 case SCU_RESULT_UNKCMD:
1572 p = "SCU_RESULT_UNKCMD";
1574 case SCU_RESULT_UNKSTD:
1575 p = "SCU_RESULT_UNKSTD";
1577 case SCU_RESULT_SIZE:
1578 p = "SCU_RESULT_SIZE";
1580 case SCU_RESULT_INVPAR:
1581 p = "SCU_RESULT_INVPAR";
1583 default: /* Other negative values are errors */
1584 sprintf(errname, "ERROR: %d\n", err);
1587 printk(KERN_ERR "drxk: %s while sending cmd 0x%04x with params:", p, cmd);
1588 print_hex_dump_bytes("drxk: ", DUMP_PREFIX_NONE, buffer, cnt);
1595 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
1597 mutex_unlock(&state->mutex);
1601 static int SetIqmAf(struct drxk_state *state, bool active)
1609 status = read16(state, IQM_AF_STDBY__A, &data);
1614 data |= (IQM_AF_STDBY_STDBY_ADC_STANDBY
1615 | IQM_AF_STDBY_STDBY_AMP_STANDBY
1616 | IQM_AF_STDBY_STDBY_PD_STANDBY
1617 | IQM_AF_STDBY_STDBY_TAGC_IF_STANDBY
1618 | IQM_AF_STDBY_STDBY_TAGC_RF_STANDBY);
1620 data &= ((~IQM_AF_STDBY_STDBY_ADC_STANDBY)
1621 & (~IQM_AF_STDBY_STDBY_AMP_STANDBY)
1622 & (~IQM_AF_STDBY_STDBY_PD_STANDBY)
1623 & (~IQM_AF_STDBY_STDBY_TAGC_IF_STANDBY)
1624 & (~IQM_AF_STDBY_STDBY_TAGC_RF_STANDBY)
1627 status = write16(state, IQM_AF_STDBY__A, data);
1631 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
1635 static int CtrlPowerMode(struct drxk_state *state, enum DRXPowerMode *mode)
1638 u16 sioCcPwdMode = 0;
1642 /* Check arguments */
1648 sioCcPwdMode = SIO_CC_PWD_MODE_LEVEL_NONE;
1650 case DRXK_POWER_DOWN_OFDM:
1651 sioCcPwdMode = SIO_CC_PWD_MODE_LEVEL_OFDM;
1653 case DRXK_POWER_DOWN_CORE:
1654 sioCcPwdMode = SIO_CC_PWD_MODE_LEVEL_CLOCK;
1656 case DRXK_POWER_DOWN_PLL:
1657 sioCcPwdMode = SIO_CC_PWD_MODE_LEVEL_PLL;
1659 case DRX_POWER_DOWN:
1660 sioCcPwdMode = SIO_CC_PWD_MODE_LEVEL_OSC;
1663 /* 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 dprintk(1, ": DVB-T\n");
1848 state->m_OperationMode = oMode;
1849 status = SetDVBTStandard(state, oMode);
1853 case OM_QAM_ITU_A: /* fallthrough */
1855 dprintk(1, ": DVB-C Annex %c\n",
1856 (state->m_OperationMode == OM_QAM_ITU_A) ? 'A' : 'C');
1857 state->m_OperationMode = oMode;
1858 status = SetQAMStandard(state, oMode);
1868 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
1872 static int Start(struct drxk_state *state, s32 offsetFreq,
1873 s32 IntermediateFrequency)
1875 int status = -EINVAL;
1878 s32 OffsetkHz = offsetFreq / 1000;
1881 if (state->m_DrxkState != DRXK_STOPPED &&
1882 state->m_DrxkState != DRXK_DTV_STARTED)
1885 state->m_bMirrorFreqSpect = (state->props.inversion == INVERSION_ON);
1887 if (IntermediateFrequency < 0) {
1888 state->m_bMirrorFreqSpect = !state->m_bMirrorFreqSpect;
1889 IntermediateFrequency = -IntermediateFrequency;
1892 switch (state->m_OperationMode) {
1895 IFreqkHz = (IntermediateFrequency / 1000);
1896 status = SetQAM(state, IFreqkHz, OffsetkHz);
1899 state->m_DrxkState = DRXK_DTV_STARTED;
1902 IFreqkHz = (IntermediateFrequency / 1000);
1903 status = MPEGTSStop(state);
1906 status = SetDVBT(state, IFreqkHz, OffsetkHz);
1909 status = DVBTStart(state);
1912 state->m_DrxkState = DRXK_DTV_STARTED;
1919 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
1923 static int ShutDown(struct drxk_state *state)
1931 static int GetLockStatus(struct drxk_state *state, u32 *pLockStatus,
1934 int status = -EINVAL;
1938 if (pLockStatus == NULL)
1941 *pLockStatus = NOT_LOCKED;
1943 /* define the SCU command code */
1944 switch (state->m_OperationMode) {
1948 status = GetQAMLockStatus(state, pLockStatus);
1951 status = GetDVBTLockStatus(state, pLockStatus);
1958 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
1962 static int MPEGTSStart(struct drxk_state *state)
1966 u16 fecOcSncMode = 0;
1968 /* Allow OC to sync again */
1969 status = read16(state, FEC_OC_SNC_MODE__A, &fecOcSncMode);
1972 fecOcSncMode &= ~FEC_OC_SNC_MODE_SHUTDOWN__M;
1973 status = write16(state, FEC_OC_SNC_MODE__A, fecOcSncMode);
1976 status = write16(state, FEC_OC_SNC_UNLOCK__A, 1);
1979 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
1983 static int MPEGTSDtoInit(struct drxk_state *state)
1989 /* Rate integration settings */
1990 status = write16(state, FEC_OC_RCN_CTL_STEP_LO__A, 0x0000);
1993 status = write16(state, FEC_OC_RCN_CTL_STEP_HI__A, 0x000C);
1996 status = write16(state, FEC_OC_RCN_GAIN__A, 0x000A);
1999 status = write16(state, FEC_OC_AVR_PARM_A__A, 0x0008);
2002 status = write16(state, FEC_OC_AVR_PARM_B__A, 0x0006);
2005 status = write16(state, FEC_OC_TMD_HI_MARGIN__A, 0x0680);
2008 status = write16(state, FEC_OC_TMD_LO_MARGIN__A, 0x0080);
2011 status = write16(state, FEC_OC_TMD_COUNT__A, 0x03F4);
2015 /* Additional configuration */
2016 status = write16(state, FEC_OC_OCR_INVERT__A, 0);
2019 status = write16(state, FEC_OC_SNC_LWM__A, 2);
2022 status = write16(state, FEC_OC_SNC_HWM__A, 12);
2025 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
2030 static int MPEGTSDtoSetup(struct drxk_state *state,
2031 enum OperationMode oMode)
2035 u16 fecOcRegMode = 0; /* FEC_OC_MODE register value */
2036 u16 fecOcRegIprMode = 0; /* FEC_OC_IPR_MODE register value */
2037 u16 fecOcDtoMode = 0; /* FEC_OC_IPR_INVERT register value */
2038 u16 fecOcFctMode = 0; /* FEC_OC_IPR_INVERT register value */
2039 u16 fecOcDtoPeriod = 2; /* FEC_OC_IPR_INVERT register value */
2040 u16 fecOcDtoBurstLen = 188; /* FEC_OC_IPR_INVERT register value */
2041 u32 fecOcRcnCtlRate = 0; /* FEC_OC_IPR_INVERT register value */
2042 u16 fecOcTmdMode = 0;
2043 u16 fecOcTmdIntUpdRate = 0;
2045 bool staticCLK = false;
2049 /* Check insertion of the Reed-Solomon parity bytes */
2050 status = read16(state, FEC_OC_MODE__A, &fecOcRegMode);
2053 status = read16(state, FEC_OC_IPR_MODE__A, &fecOcRegIprMode);
2056 fecOcRegMode &= (~FEC_OC_MODE_PARITY__M);
2057 fecOcRegIprMode &= (~FEC_OC_IPR_MODE_MVAL_DIS_PAR__M);
2058 if (state->m_insertRSByte == true) {
2059 /* enable parity symbol forward */
2060 fecOcRegMode |= FEC_OC_MODE_PARITY__M;
2061 /* MVAL disable during parity bytes */
2062 fecOcRegIprMode |= FEC_OC_IPR_MODE_MVAL_DIS_PAR__M;
2063 /* TS burst length to 204 */
2064 fecOcDtoBurstLen = 204;
2067 /* Check serial or parrallel output */
2068 fecOcRegIprMode &= (~(FEC_OC_IPR_MODE_SERIAL__M));
2069 if (state->m_enableParallel == false) {
2070 /* MPEG data output is serial -> set ipr_mode[0] */
2071 fecOcRegIprMode |= FEC_OC_IPR_MODE_SERIAL__M;
2076 maxBitRate = state->m_DVBTBitrate;
2078 fecOcRcnCtlRate = 0xC00000;
2079 staticCLK = state->m_DVBTStaticCLK;
2081 case OM_QAM_ITU_A: /* fallthrough */
2083 fecOcTmdMode = 0x0004;
2084 fecOcRcnCtlRate = 0xD2B4EE; /* good for >63 Mb/s */
2085 maxBitRate = state->m_DVBCBitrate;
2086 staticCLK = state->m_DVBCStaticCLK;
2090 } /* switch (standard) */
2094 /* Configure DTO's */
2098 /* Rational DTO for MCLK source (static MCLK rate),
2099 Dynamic DTO for optimal grouping
2100 (avoid intra-packet gaps),
2101 DTO offset enable to sync TS burst with MSTRT */
2102 fecOcDtoMode = (FEC_OC_DTO_MODE_DYNAMIC__M |
2103 FEC_OC_DTO_MODE_OFFSET_ENABLE__M);
2104 fecOcFctMode = (FEC_OC_FCT_MODE_RAT_ENA__M |
2105 FEC_OC_FCT_MODE_VIRT_ENA__M);
2107 /* Check user defined bitrate */
2108 bitRate = maxBitRate;
2109 if (bitRate > 75900000UL) { /* max is 75.9 Mb/s */
2110 bitRate = 75900000UL;
2112 /* Rational DTO period:
2113 dto_period = (Fsys / bitrate) - 2
2115 Result should be floored,
2116 to make sure >= requested bitrate
2118 fecOcDtoPeriod = (u16) (((state->m_sysClockFreq)
2120 if (fecOcDtoPeriod <= 2)
2123 fecOcDtoPeriod -= 2;
2124 fecOcTmdIntUpdRate = 8;
2126 /* (commonAttr->staticCLK == false) => dynamic mode */
2127 fecOcDtoMode = FEC_OC_DTO_MODE_DYNAMIC__M;
2128 fecOcFctMode = FEC_OC_FCT_MODE__PRE;
2129 fecOcTmdIntUpdRate = 5;
2132 /* Write appropriate registers with requested configuration */
2133 status = write16(state, FEC_OC_DTO_BURST_LEN__A, fecOcDtoBurstLen);
2136 status = write16(state, FEC_OC_DTO_PERIOD__A, fecOcDtoPeriod);
2139 status = write16(state, FEC_OC_DTO_MODE__A, fecOcDtoMode);
2142 status = write16(state, FEC_OC_FCT_MODE__A, fecOcFctMode);
2145 status = write16(state, FEC_OC_MODE__A, fecOcRegMode);
2148 status = write16(state, FEC_OC_IPR_MODE__A, fecOcRegIprMode);
2152 /* Rate integration settings */
2153 status = write32(state, FEC_OC_RCN_CTL_RATE_LO__A, fecOcRcnCtlRate);
2156 status = write16(state, FEC_OC_TMD_INT_UPD_RATE__A, fecOcTmdIntUpdRate);
2159 status = write16(state, FEC_OC_TMD_MODE__A, fecOcTmdMode);
2162 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
2166 static int MPEGTSConfigurePolarity(struct drxk_state *state)
2168 u16 fecOcRegIprInvert = 0;
2170 /* Data mask for the output data byte */
2171 u16 InvertDataMask =
2172 FEC_OC_IPR_INVERT_MD7__M | FEC_OC_IPR_INVERT_MD6__M |
2173 FEC_OC_IPR_INVERT_MD5__M | FEC_OC_IPR_INVERT_MD4__M |
2174 FEC_OC_IPR_INVERT_MD3__M | FEC_OC_IPR_INVERT_MD2__M |
2175 FEC_OC_IPR_INVERT_MD1__M | FEC_OC_IPR_INVERT_MD0__M;
2179 /* Control selective inversion of output bits */
2180 fecOcRegIprInvert &= (~(InvertDataMask));
2181 if (state->m_invertDATA == true)
2182 fecOcRegIprInvert |= InvertDataMask;
2183 fecOcRegIprInvert &= (~(FEC_OC_IPR_INVERT_MERR__M));
2184 if (state->m_invertERR == true)
2185 fecOcRegIprInvert |= FEC_OC_IPR_INVERT_MERR__M;
2186 fecOcRegIprInvert &= (~(FEC_OC_IPR_INVERT_MSTRT__M));
2187 if (state->m_invertSTR == true)
2188 fecOcRegIprInvert |= FEC_OC_IPR_INVERT_MSTRT__M;
2189 fecOcRegIprInvert &= (~(FEC_OC_IPR_INVERT_MVAL__M));
2190 if (state->m_invertVAL == true)
2191 fecOcRegIprInvert |= FEC_OC_IPR_INVERT_MVAL__M;
2192 fecOcRegIprInvert &= (~(FEC_OC_IPR_INVERT_MCLK__M));
2193 if (state->m_invertCLK == true)
2194 fecOcRegIprInvert |= FEC_OC_IPR_INVERT_MCLK__M;
2196 return write16(state, FEC_OC_IPR_INVERT__A, fecOcRegIprInvert);
2199 #define SCU_RAM_AGC_KI_INV_RF_POL__M 0x4000
2201 static int SetAgcRf(struct drxk_state *state,
2202 struct SCfgAgc *pAgcCfg, bool isDTV)
2204 int status = -EINVAL;
2206 struct SCfgAgc *pIfAgcSettings;
2210 if (pAgcCfg == NULL)
2213 switch (pAgcCfg->ctrlMode) {
2214 case DRXK_AGC_CTRL_AUTO:
2215 /* Enable RF AGC DAC */
2216 status = read16(state, IQM_AF_STDBY__A, &data);
2219 data &= ~IQM_AF_STDBY_STDBY_TAGC_RF_STANDBY;
2220 status = write16(state, IQM_AF_STDBY__A, data);
2223 status = read16(state, SCU_RAM_AGC_CONFIG__A, &data);
2227 /* Enable SCU RF AGC loop */
2228 data &= ~SCU_RAM_AGC_CONFIG_DISABLE_RF_AGC__M;
2231 if (state->m_RfAgcPol)
2232 data |= SCU_RAM_AGC_CONFIG_INV_RF_POL__M;
2234 data &= ~SCU_RAM_AGC_CONFIG_INV_RF_POL__M;
2235 status = write16(state, SCU_RAM_AGC_CONFIG__A, data);
2239 /* Set speed (using complementary reduction value) */
2240 status = read16(state, SCU_RAM_AGC_KI_RED__A, &data);
2244 data &= ~SCU_RAM_AGC_KI_RED_RAGC_RED__M;
2245 data |= (~(pAgcCfg->speed <<
2246 SCU_RAM_AGC_KI_RED_RAGC_RED__B)
2247 & SCU_RAM_AGC_KI_RED_RAGC_RED__M);
2249 status = write16(state, SCU_RAM_AGC_KI_RED__A, data);
2254 pIfAgcSettings = &state->m_dvbtIfAgcCfg;
2255 else if (IsQAM(state))
2256 pIfAgcSettings = &state->m_qamIfAgcCfg;
2258 pIfAgcSettings = &state->m_atvIfAgcCfg;
2259 if (pIfAgcSettings == NULL) {
2264 /* Set TOP, only if IF-AGC is in AUTO mode */
2265 if (pIfAgcSettings->ctrlMode == DRXK_AGC_CTRL_AUTO)
2266 status = write16(state, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A, pAgcCfg->top);
2270 /* Cut-Off current */
2271 status = write16(state, SCU_RAM_AGC_RF_IACCU_HI_CO__A, pAgcCfg->cutOffCurrent);
2275 /* Max. output level */
2276 status = write16(state, SCU_RAM_AGC_RF_MAX__A, pAgcCfg->maxOutputLevel);
2282 case DRXK_AGC_CTRL_USER:
2283 /* Enable RF AGC DAC */
2284 status = read16(state, IQM_AF_STDBY__A, &data);
2287 data &= ~IQM_AF_STDBY_STDBY_TAGC_RF_STANDBY;
2288 status = write16(state, IQM_AF_STDBY__A, data);
2292 /* Disable SCU RF AGC loop */
2293 status = read16(state, SCU_RAM_AGC_CONFIG__A, &data);
2296 data |= SCU_RAM_AGC_CONFIG_DISABLE_RF_AGC__M;
2297 if (state->m_RfAgcPol)
2298 data |= SCU_RAM_AGC_CONFIG_INV_RF_POL__M;
2300 data &= ~SCU_RAM_AGC_CONFIG_INV_RF_POL__M;
2301 status = write16(state, SCU_RAM_AGC_CONFIG__A, data);
2305 /* SCU c.o.c. to 0, enabling full control range */
2306 status = write16(state, SCU_RAM_AGC_RF_IACCU_HI_CO__A, 0);
2310 /* Write value to output pin */
2311 status = write16(state, SCU_RAM_AGC_RF_IACCU_HI__A, pAgcCfg->outputLevel);
2316 case DRXK_AGC_CTRL_OFF:
2317 /* Disable RF AGC DAC */
2318 status = read16(state, IQM_AF_STDBY__A, &data);
2321 data |= IQM_AF_STDBY_STDBY_TAGC_RF_STANDBY;
2322 status = write16(state, IQM_AF_STDBY__A, data);
2326 /* Disable SCU RF AGC loop */
2327 status = read16(state, SCU_RAM_AGC_CONFIG__A, &data);
2330 data |= SCU_RAM_AGC_CONFIG_DISABLE_RF_AGC__M;
2331 status = write16(state, SCU_RAM_AGC_CONFIG__A, data);
2342 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
2346 #define SCU_RAM_AGC_KI_INV_IF_POL__M 0x2000
2348 static int SetAgcIf(struct drxk_state *state,
2349 struct SCfgAgc *pAgcCfg, bool isDTV)
2353 struct SCfgAgc *pRfAgcSettings;
2357 switch (pAgcCfg->ctrlMode) {
2358 case DRXK_AGC_CTRL_AUTO:
2360 /* Enable IF AGC DAC */
2361 status = read16(state, IQM_AF_STDBY__A, &data);
2364 data &= ~IQM_AF_STDBY_STDBY_TAGC_IF_STANDBY;
2365 status = write16(state, IQM_AF_STDBY__A, data);
2369 status = read16(state, SCU_RAM_AGC_CONFIG__A, &data);
2373 /* Enable SCU IF AGC loop */
2374 data &= ~SCU_RAM_AGC_CONFIG_DISABLE_IF_AGC__M;
2377 if (state->m_IfAgcPol)
2378 data |= SCU_RAM_AGC_CONFIG_INV_IF_POL__M;
2380 data &= ~SCU_RAM_AGC_CONFIG_INV_IF_POL__M;
2381 status = write16(state, SCU_RAM_AGC_CONFIG__A, data);
2385 /* Set speed (using complementary reduction value) */
2386 status = read16(state, SCU_RAM_AGC_KI_RED__A, &data);
2389 data &= ~SCU_RAM_AGC_KI_RED_IAGC_RED__M;
2390 data |= (~(pAgcCfg->speed <<
2391 SCU_RAM_AGC_KI_RED_IAGC_RED__B)
2392 & SCU_RAM_AGC_KI_RED_IAGC_RED__M);
2394 status = write16(state, SCU_RAM_AGC_KI_RED__A, data);
2399 pRfAgcSettings = &state->m_qamRfAgcCfg;
2401 pRfAgcSettings = &state->m_atvRfAgcCfg;
2402 if (pRfAgcSettings == NULL)
2405 status = write16(state, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A, pRfAgcSettings->top);
2410 case DRXK_AGC_CTRL_USER:
2412 /* Enable IF AGC DAC */
2413 status = read16(state, IQM_AF_STDBY__A, &data);
2416 data &= ~IQM_AF_STDBY_STDBY_TAGC_IF_STANDBY;
2417 status = write16(state, IQM_AF_STDBY__A, data);
2421 status = read16(state, SCU_RAM_AGC_CONFIG__A, &data);
2425 /* Disable SCU IF AGC loop */
2426 data |= SCU_RAM_AGC_CONFIG_DISABLE_IF_AGC__M;
2429 if (state->m_IfAgcPol)
2430 data |= SCU_RAM_AGC_CONFIG_INV_IF_POL__M;
2432 data &= ~SCU_RAM_AGC_CONFIG_INV_IF_POL__M;
2433 status = write16(state, SCU_RAM_AGC_CONFIG__A, data);
2437 /* Write value to output pin */
2438 status = write16(state, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A, pAgcCfg->outputLevel);
2443 case DRXK_AGC_CTRL_OFF:
2445 /* Disable If AGC DAC */
2446 status = read16(state, IQM_AF_STDBY__A, &data);
2449 data |= IQM_AF_STDBY_STDBY_TAGC_IF_STANDBY;
2450 status = write16(state, IQM_AF_STDBY__A, data);
2454 /* Disable SCU IF AGC loop */
2455 status = read16(state, SCU_RAM_AGC_CONFIG__A, &data);
2458 data |= SCU_RAM_AGC_CONFIG_DISABLE_IF_AGC__M;
2459 status = write16(state, SCU_RAM_AGC_CONFIG__A, data);
2463 } /* switch (agcSettingsIf->ctrlMode) */
2465 /* always set the top to support
2466 configurations without if-loop */
2467 status = write16(state, SCU_RAM_AGC_INGAIN_TGT_MIN__A, pAgcCfg->top);
2470 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
2474 static int ReadIFAgc(struct drxk_state *state, u32 *pValue)
2482 status = read16(state, IQM_AF_AGC_IF__A, &agcDacLvl);
2484 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
2490 if (agcDacLvl > DRXK_AGC_DAC_OFFSET)
2491 Level = agcDacLvl - DRXK_AGC_DAC_OFFSET;
2493 *pValue = (14000 - Level) / 4;
2500 static int GetQAMSignalToNoise(struct drxk_state *state,
2501 s32 *pSignalToNoise)
2504 u16 qamSlErrPower = 0; /* accum. error between
2505 raw and sliced symbols */
2506 u32 qamSlSigPower = 0; /* used for MER, depends of
2508 u32 qamSlMer = 0; /* QAM MER */
2512 /* MER calculation */
2514 /* get the register value needed for MER */
2515 status = read16(state, QAM_SL_ERR_POWER__A, &qamSlErrPower);
2517 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
2521 switch (state->props.modulation) {
2523 qamSlSigPower = DRXK_QAM_SL_SIG_POWER_QAM16 << 2;
2526 qamSlSigPower = DRXK_QAM_SL_SIG_POWER_QAM32 << 2;
2529 qamSlSigPower = DRXK_QAM_SL_SIG_POWER_QAM64 << 2;
2532 qamSlSigPower = DRXK_QAM_SL_SIG_POWER_QAM128 << 2;
2536 qamSlSigPower = DRXK_QAM_SL_SIG_POWER_QAM256 << 2;
2540 if (qamSlErrPower > 0) {
2541 qamSlMer = Log10Times100(qamSlSigPower) -
2542 Log10Times100((u32) qamSlErrPower);
2544 *pSignalToNoise = qamSlMer;
2549 static int GetDVBTSignalToNoise(struct drxk_state *state,
2550 s32 *pSignalToNoise)
2554 u32 EqRegTdSqrErrI = 0;
2555 u32 EqRegTdSqrErrQ = 0;
2556 u16 EqRegTdSqrErrExp = 0;
2557 u16 EqRegTdTpsPwrOfs = 0;
2558 u16 EqRegTdReqSmbCnt = 0;
2565 u16 transmissionParams = 0;
2569 status = read16(state, OFDM_EQ_TOP_TD_TPS_PWR_OFS__A, &EqRegTdTpsPwrOfs);
2572 status = read16(state, OFDM_EQ_TOP_TD_REQ_SMB_CNT__A, &EqRegTdReqSmbCnt);
2575 status = read16(state, OFDM_EQ_TOP_TD_SQR_ERR_EXP__A, &EqRegTdSqrErrExp);
2578 status = read16(state, OFDM_EQ_TOP_TD_SQR_ERR_I__A, ®Data);
2581 /* Extend SQR_ERR_I operational range */
2582 EqRegTdSqrErrI = (u32) regData;
2583 if ((EqRegTdSqrErrExp > 11) &&
2584 (EqRegTdSqrErrI < 0x00000FFFUL)) {
2585 EqRegTdSqrErrI += 0x00010000UL;
2587 status = read16(state, OFDM_EQ_TOP_TD_SQR_ERR_Q__A, ®Data);
2590 /* Extend SQR_ERR_Q operational range */
2591 EqRegTdSqrErrQ = (u32) regData;
2592 if ((EqRegTdSqrErrExp > 11) &&
2593 (EqRegTdSqrErrQ < 0x00000FFFUL))
2594 EqRegTdSqrErrQ += 0x00010000UL;
2596 status = read16(state, OFDM_SC_RA_RAM_OP_PARAM__A, &transmissionParams);
2600 /* Check input data for MER */
2602 /* MER calculation (in 0.1 dB) without math.h */
2603 if ((EqRegTdTpsPwrOfs == 0) || (EqRegTdReqSmbCnt == 0))
2605 else if ((EqRegTdSqrErrI + EqRegTdSqrErrQ) == 0) {
2606 /* No error at all, this must be the HW reset value
2607 * Apparently no first measurement yet
2611 SqrErrIQ = (EqRegTdSqrErrI + EqRegTdSqrErrQ) <<
2613 if ((transmissionParams &
2614 OFDM_SC_RA_RAM_OP_PARAM_MODE__M)
2615 == OFDM_SC_RA_RAM_OP_PARAM_MODE_2K)
2620 /* IMER = 100 * log10 (x)
2621 where x = (EqRegTdTpsPwrOfs^2 *
2622 EqRegTdReqSmbCnt * tpsCnt)/SqrErrIQ
2625 where a = 100 * log10 (EqRegTdTpsPwrOfs^2)
2626 b = 100 * log10 (EqRegTdReqSmbCnt * tpsCnt)
2627 c = 100 * log10 (SqrErrIQ)
2630 /* log(x) x = 9bits * 9bits->18 bits */
2631 a = Log10Times100(EqRegTdTpsPwrOfs *
2633 /* log(x) x = 16bits * 7bits->23 bits */
2634 b = Log10Times100(EqRegTdReqSmbCnt * tpsCnt);
2635 /* log(x) x = (16bits + 16bits) << 15 ->32 bits */
2636 c = Log10Times100(SqrErrIQ);
2639 /* No negative MER, clip to zero */
2645 *pSignalToNoise = iMER;
2649 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
2653 static int GetSignalToNoise(struct drxk_state *state, s32 *pSignalToNoise)
2657 *pSignalToNoise = 0;
2658 switch (state->m_OperationMode) {
2660 return GetDVBTSignalToNoise(state, pSignalToNoise);
2663 return GetQAMSignalToNoise(state, pSignalToNoise);
2671 static int GetDVBTQuality(struct drxk_state *state, s32 *pQuality)
2673 /* SNR Values for quasi errorfree reception rom Nordig 2.2 */
2678 static s32 QE_SN[] = {
2684 108, /* 16-QAM 1/2 */
2685 131, /* 16-QAM 2/3 */
2686 146, /* 16-QAM 3/4 */
2687 156, /* 16-QAM 5/6 */
2688 160, /* 16-QAM 7/8 */
2689 165, /* 64-QAM 1/2 */
2690 187, /* 64-QAM 2/3 */
2691 202, /* 64-QAM 3/4 */
2692 216, /* 64-QAM 5/6 */
2693 225, /* 64-QAM 7/8 */
2699 s32 SignalToNoise = 0;
2700 u16 Constellation = 0;
2702 u32 SignalToNoiseRel;
2705 status = GetDVBTSignalToNoise(state, &SignalToNoise);
2708 status = read16(state, OFDM_EQ_TOP_TD_TPS_CONST__A, &Constellation);
2711 Constellation &= OFDM_EQ_TOP_TD_TPS_CONST__M;
2713 status = read16(state, OFDM_EQ_TOP_TD_TPS_CODE_HP__A, &CodeRate);
2716 CodeRate &= OFDM_EQ_TOP_TD_TPS_CODE_HP__M;
2718 if (Constellation > OFDM_EQ_TOP_TD_TPS_CONST_64QAM ||
2719 CodeRate > OFDM_EQ_TOP_TD_TPS_CODE_LP_7_8)
2721 SignalToNoiseRel = SignalToNoise -
2722 QE_SN[Constellation * 5 + CodeRate];
2725 if (SignalToNoiseRel < -70)
2727 else if (SignalToNoiseRel < 30)
2728 *pQuality = ((SignalToNoiseRel + 70) *
2731 *pQuality = BERQuality;
2736 static int GetDVBCQuality(struct drxk_state *state, s32 *pQuality)
2744 u32 SignalToNoise = 0;
2745 u32 BERQuality = 100;
2746 u32 SignalToNoiseRel = 0;
2748 status = GetQAMSignalToNoise(state, &SignalToNoise);
2752 switch (state->props.modulation) {
2754 SignalToNoiseRel = SignalToNoise - 200;
2757 SignalToNoiseRel = SignalToNoise - 230;
2758 break; /* Not in NorDig */
2760 SignalToNoiseRel = SignalToNoise - 260;
2763 SignalToNoiseRel = SignalToNoise - 290;
2767 SignalToNoiseRel = SignalToNoise - 320;
2771 if (SignalToNoiseRel < -70)
2773 else if (SignalToNoiseRel < 30)
2774 *pQuality = ((SignalToNoiseRel + 70) *
2777 *pQuality = BERQuality;
2783 static int GetQuality(struct drxk_state *state, s32 *pQuality)
2787 switch (state->m_OperationMode) {
2789 return GetDVBTQuality(state, pQuality);
2791 return GetDVBCQuality(state, pQuality);
2800 /* Free data ram in SIO HI */
2801 #define SIO_HI_RA_RAM_USR_BEGIN__A 0x420040
2802 #define SIO_HI_RA_RAM_USR_END__A 0x420060
2804 #define DRXK_HI_ATOMIC_BUF_START (SIO_HI_RA_RAM_USR_BEGIN__A)
2805 #define DRXK_HI_ATOMIC_BUF_END (SIO_HI_RA_RAM_USR_BEGIN__A + 7)
2806 #define DRXK_HI_ATOMIC_READ SIO_HI_RA_RAM_PAR_3_ACP_RW_READ
2807 #define DRXK_HI_ATOMIC_WRITE SIO_HI_RA_RAM_PAR_3_ACP_RW_WRITE
2809 #define DRXDAP_FASI_ADDR2BLOCK(addr) (((addr) >> 22) & 0x3F)
2810 #define DRXDAP_FASI_ADDR2BANK(addr) (((addr) >> 16) & 0x3F)
2811 #define DRXDAP_FASI_ADDR2OFFSET(addr) ((addr) & 0x7FFF)
2813 static int ConfigureI2CBridge(struct drxk_state *state, bool bEnableBridge)
2815 int status = -EINVAL;
2819 if (state->m_DrxkState == DRXK_UNINITIALIZED)
2821 if (state->m_DrxkState == DRXK_POWERED_DOWN)
2824 if (state->no_i2c_bridge)
2827 status = write16(state, SIO_HI_RA_RAM_PAR_1__A, SIO_HI_RA_RAM_PAR_1_PAR1_SEC_KEY);
2830 if (bEnableBridge) {
2831 status = write16(state, SIO_HI_RA_RAM_PAR_2__A, SIO_HI_RA_RAM_PAR_2_BRD_CFG_CLOSED);
2835 status = write16(state, SIO_HI_RA_RAM_PAR_2__A, SIO_HI_RA_RAM_PAR_2_BRD_CFG_OPEN);
2840 status = HI_Command(state, SIO_HI_RA_RAM_CMD_BRDCTRL, 0);
2844 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
2848 static int SetPreSaw(struct drxk_state *state,
2849 struct SCfgPreSaw *pPreSawCfg)
2851 int status = -EINVAL;
2855 if ((pPreSawCfg == NULL)
2856 || (pPreSawCfg->reference > IQM_AF_PDREF__M))
2859 status = write16(state, IQM_AF_PDREF__A, pPreSawCfg->reference);
2862 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
2866 static int BLDirectCmd(struct drxk_state *state, u32 targetAddr,
2867 u16 romOffset, u16 nrOfElements, u32 timeOut)
2870 u16 offset = (u16) ((targetAddr >> 0) & 0x00FFFF);
2871 u16 blockbank = (u16) ((targetAddr >> 16) & 0x000FFF);
2877 mutex_lock(&state->mutex);
2878 status = write16(state, SIO_BL_MODE__A, SIO_BL_MODE_DIRECT);
2881 status = write16(state, SIO_BL_TGT_HDR__A, blockbank);
2884 status = write16(state, SIO_BL_TGT_ADDR__A, offset);
2887 status = write16(state, SIO_BL_SRC_ADDR__A, romOffset);
2890 status = write16(state, SIO_BL_SRC_LEN__A, nrOfElements);
2893 status = write16(state, SIO_BL_ENABLE__A, SIO_BL_ENABLE_ON);
2897 end = jiffies + msecs_to_jiffies(timeOut);
2899 status = read16(state, SIO_BL_STATUS__A, &blStatus);
2902 } while ((blStatus == 0x1) && time_is_after_jiffies(end));
2903 if (blStatus == 0x1) {
2904 printk(KERN_ERR "drxk: SIO not ready\n");
2910 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
2912 mutex_unlock(&state->mutex);
2917 static int ADCSyncMeasurement(struct drxk_state *state, u16 *count)
2924 /* Start measurement */
2925 status = write16(state, IQM_AF_COMM_EXEC__A, IQM_AF_COMM_EXEC_ACTIVE);
2928 status = write16(state, IQM_AF_START_LOCK__A, 1);
2933 status = read16(state, IQM_AF_PHASE0__A, &data);
2937 *count = *count + 1;
2938 status = read16(state, IQM_AF_PHASE1__A, &data);
2942 *count = *count + 1;
2943 status = read16(state, IQM_AF_PHASE2__A, &data);
2947 *count = *count + 1;
2951 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
2955 static int ADCSynchronization(struct drxk_state *state)
2962 status = ADCSyncMeasurement(state, &count);
2967 /* Try sampling on a diffrent edge */
2970 status = read16(state, IQM_AF_CLKNEG__A, &clkNeg);
2973 if ((clkNeg | IQM_AF_CLKNEG_CLKNEGDATA__M) ==
2974 IQM_AF_CLKNEG_CLKNEGDATA_CLK_ADC_DATA_POS) {
2975 clkNeg &= (~(IQM_AF_CLKNEG_CLKNEGDATA__M));
2977 IQM_AF_CLKNEG_CLKNEGDATA_CLK_ADC_DATA_NEG;
2979 clkNeg &= (~(IQM_AF_CLKNEG_CLKNEGDATA__M));
2981 IQM_AF_CLKNEG_CLKNEGDATA_CLK_ADC_DATA_POS;
2983 status = write16(state, IQM_AF_CLKNEG__A, clkNeg);
2986 status = ADCSyncMeasurement(state, &count);
2995 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
2999 static int SetFrequencyShifter(struct drxk_state *state,
3000 u16 intermediateFreqkHz,
3001 s32 tunerFreqOffset, bool isDTV)
3003 bool selectPosImage = false;
3004 u32 rfFreqResidual = tunerFreqOffset;
3005 u32 fmFrequencyShift = 0;
3006 bool tunerMirror = !state->m_bMirrorFreqSpect;
3011 u32 samplingFrequency = (u32) (state->m_sysClockFreq / 3);
3018 Program frequency shifter
3019 No need to account for mirroring on RF
3022 if ((state->m_OperationMode == OM_QAM_ITU_A) ||
3023 (state->m_OperationMode == OM_QAM_ITU_C) ||
3024 (state->m_OperationMode == OM_DVBT))
3025 selectPosImage = true;
3027 selectPosImage = false;
3030 /* tuner doesn't mirror */
3031 ifFreqActual = intermediateFreqkHz +
3032 rfFreqResidual + fmFrequencyShift;
3035 ifFreqActual = intermediateFreqkHz -
3036 rfFreqResidual - fmFrequencyShift;
3037 if (ifFreqActual > samplingFrequency / 2) {
3039 adcFreq = samplingFrequency - ifFreqActual;
3042 /* adc doesn't mirror */
3043 adcFreq = ifFreqActual;
3047 frequencyShift = adcFreq;
3048 imageToSelect = state->m_rfmirror ^ tunerMirror ^
3049 adcFlip ^ selectPosImage;
3050 state->m_IqmFsRateOfs =
3051 Frac28a((frequencyShift), samplingFrequency);
3054 state->m_IqmFsRateOfs = ~state->m_IqmFsRateOfs + 1;
3056 /* Program frequency shifter with tuner offset compensation */
3057 /* frequencyShift += tunerFreqOffset; TODO */
3058 status = write32(state, IQM_FS_RATE_OFS_LO__A,
3059 state->m_IqmFsRateOfs);
3061 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
3065 static int InitAGC(struct drxk_state *state, bool isDTV)
3068 u16 ingainTgtMin = 0;
3069 u16 ingainTgtMax = 0;
3077 u16 kiInnergainMin = 0;
3078 u16 ifIaccuHiTgt = 0;
3079 u16 ifIaccuHiTgtMin = 0;
3080 u16 ifIaccuHiTgtMax = 0;
3082 u16 fastClpCtrlDelay = 0;
3083 u16 clpCtrlMode = 0;
3088 /* Common settings */
3090 ifIaccuHiTgtMin = 2047;
3094 /* AGCInit() not available for DVBT; init done in microcode */
3095 if (!IsQAM(state)) {
3096 printk(KERN_ERR "drxk: %s: mode %d is not DVB-C\n", __func__, state->m_OperationMode);
3100 /* FIXME: Analog TV AGC require different settings */
3102 /* Standard specific settings */
3104 clpDirTo = (u16) -9;
3107 snsDirTo = (u16) -9;
3108 kiInnergainMin = (u16) -1030;
3109 ifIaccuHiTgtMax = 0x2380;
3110 ifIaccuHiTgt = 0x2380;
3111 ingainTgtMin = 0x0511;
3113 ingainTgtMax = 5119;
3114 fastClpCtrlDelay = state->m_qamIfAgcCfg.FastClipCtrlDelay;
3116 status = write16(state, SCU_RAM_AGC_FAST_CLP_CTRL_DELAY__A, fastClpCtrlDelay);
3120 status = write16(state, SCU_RAM_AGC_CLP_CTRL_MODE__A, clpCtrlMode);
3123 status = write16(state, SCU_RAM_AGC_INGAIN_TGT__A, ingainTgt);
3126 status = write16(state, SCU_RAM_AGC_INGAIN_TGT_MIN__A, ingainTgtMin);
3129 status = write16(state, SCU_RAM_AGC_INGAIN_TGT_MAX__A, ingainTgtMax);
3132 status = write16(state, SCU_RAM_AGC_IF_IACCU_HI_TGT_MIN__A, ifIaccuHiTgtMin);
3135 status = write16(state, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A, ifIaccuHiTgtMax);
3138 status = write16(state, SCU_RAM_AGC_IF_IACCU_HI__A, 0);
3141 status = write16(state, SCU_RAM_AGC_IF_IACCU_LO__A, 0);
3144 status = write16(state, SCU_RAM_AGC_RF_IACCU_HI__A, 0);
3147 status = write16(state, SCU_RAM_AGC_RF_IACCU_LO__A, 0);
3150 status = write16(state, SCU_RAM_AGC_CLP_SUM_MAX__A, clpSumMax);
3153 status = write16(state, SCU_RAM_AGC_SNS_SUM_MAX__A, snsSumMax);
3157 status = write16(state, SCU_RAM_AGC_KI_INNERGAIN_MIN__A, kiInnergainMin);
3160 status = write16(state, SCU_RAM_AGC_IF_IACCU_HI_TGT__A, ifIaccuHiTgt);
3163 status = write16(state, SCU_RAM_AGC_CLP_CYCLEN__A, clpCyclen);
3167 status = write16(state, SCU_RAM_AGC_RF_SNS_DEV_MAX__A, 1023);
3170 status = write16(state, SCU_RAM_AGC_RF_SNS_DEV_MIN__A, (u16) -1023);
3173 status = write16(state, SCU_RAM_AGC_FAST_SNS_CTRL_DELAY__A, 50);
3177 status = write16(state, SCU_RAM_AGC_KI_MAXMINGAIN_TH__A, 20);
3180 status = write16(state, SCU_RAM_AGC_CLP_SUM_MIN__A, clpSumMin);
3183 status = write16(state, SCU_RAM_AGC_SNS_SUM_MIN__A, snsSumMin);
3186 status = write16(state, SCU_RAM_AGC_CLP_DIR_TO__A, clpDirTo);
3189 status = write16(state, SCU_RAM_AGC_SNS_DIR_TO__A, snsDirTo);
3192 status = write16(state, SCU_RAM_AGC_KI_MINGAIN__A, 0x7fff);
3195 status = write16(state, SCU_RAM_AGC_KI_MAXGAIN__A, 0x0);
3198 status = write16(state, SCU_RAM_AGC_KI_MIN__A, 0x0117);
3201 status = write16(state, SCU_RAM_AGC_KI_MAX__A, 0x0657);
3204 status = write16(state, SCU_RAM_AGC_CLP_SUM__A, 0);
3207 status = write16(state, SCU_RAM_AGC_CLP_CYCCNT__A, 0);
3210 status = write16(state, SCU_RAM_AGC_CLP_DIR_WD__A, 0);
3213 status = write16(state, SCU_RAM_AGC_CLP_DIR_STP__A, 1);
3216 status = write16(state, SCU_RAM_AGC_SNS_SUM__A, 0);
3219 status = write16(state, SCU_RAM_AGC_SNS_CYCCNT__A, 0);
3222 status = write16(state, SCU_RAM_AGC_SNS_DIR_WD__A, 0);
3225 status = write16(state, SCU_RAM_AGC_SNS_DIR_STP__A, 1);
3228 status = write16(state, SCU_RAM_AGC_SNS_CYCLEN__A, 500);
3231 status = write16(state, SCU_RAM_AGC_KI_CYCLEN__A, 500);
3235 /* Initialize inner-loop KI gain factors */
3236 status = read16(state, SCU_RAM_AGC_KI__A, &data);
3241 data &= ~SCU_RAM_AGC_KI_RF__M;
3242 data |= (DRXK_KI_RAGC_QAM << SCU_RAM_AGC_KI_RF__B);
3243 data &= ~SCU_RAM_AGC_KI_IF__M;
3244 data |= (DRXK_KI_IAGC_QAM << SCU_RAM_AGC_KI_IF__B);
3246 status = write16(state, SCU_RAM_AGC_KI__A, data);
3249 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
3253 static int DVBTQAMGetAccPktErr(struct drxk_state *state, u16 *packetErr)
3258 if (packetErr == NULL)
3259 status = write16(state, SCU_RAM_FEC_ACCUM_PKT_FAILURES__A, 0);
3261 status = read16(state, SCU_RAM_FEC_ACCUM_PKT_FAILURES__A, packetErr);
3263 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
3267 static int DVBTScCommand(struct drxk_state *state,
3268 u16 cmd, u16 subcmd,
3269 u16 param0, u16 param1, u16 param2,
3270 u16 param3, u16 param4)
3279 status = read16(state, OFDM_SC_COMM_EXEC__A, &scExec);
3281 /* SC is not running */
3287 /* Wait until sc is ready to receive command */
3291 status = read16(state, OFDM_SC_RA_RAM_CMD__A, &curCmd);
3293 } while ((curCmd != 0) && (retryCnt < DRXK_MAX_RETRIES));
3294 if (retryCnt >= DRXK_MAX_RETRIES && (status < 0))
3297 /* Write sub-command */
3299 /* All commands using sub-cmd */
3300 case OFDM_SC_RA_RAM_CMD_PROC_START:
3301 case OFDM_SC_RA_RAM_CMD_SET_PREF_PARAM:
3302 case OFDM_SC_RA_RAM_CMD_PROGRAM_PARAM:
3303 status = write16(state, OFDM_SC_RA_RAM_CMD_ADDR__A, subcmd);
3312 /* Write needed parameters and the command */
3314 /* All commands using 5 parameters */
3315 /* All commands using 4 parameters */
3316 /* All commands using 3 parameters */
3317 /* All commands using 2 parameters */
3318 case OFDM_SC_RA_RAM_CMD_PROC_START:
3319 case OFDM_SC_RA_RAM_CMD_SET_PREF_PARAM:
3320 case OFDM_SC_RA_RAM_CMD_PROGRAM_PARAM:
3321 status = write16(state, OFDM_SC_RA_RAM_PARAM1__A, param1);
3322 /* All commands using 1 parameters */
3323 case OFDM_SC_RA_RAM_CMD_SET_ECHO_TIMING:
3324 case OFDM_SC_RA_RAM_CMD_USER_IO:
3325 status = write16(state, OFDM_SC_RA_RAM_PARAM0__A, param0);
3326 /* All commands using 0 parameters */
3327 case OFDM_SC_RA_RAM_CMD_GET_OP_PARAM:
3328 case OFDM_SC_RA_RAM_CMD_NULL:
3330 status = write16(state, OFDM_SC_RA_RAM_CMD__A, cmd);
3333 /* Unknown command */
3339 /* Wait until sc is ready processing command */
3343 status = read16(state, OFDM_SC_RA_RAM_CMD__A, &curCmd);
3345 } while ((curCmd != 0) && (retryCnt < DRXK_MAX_RETRIES));
3346 if (retryCnt >= DRXK_MAX_RETRIES && (status < 0))
3349 /* Check for illegal cmd */
3350 status = read16(state, OFDM_SC_RA_RAM_CMD_ADDR__A, &errCode);
3351 if (errCode == 0xFFFF) {
3352 /* illegal command */
3358 /* Retreive results parameters from SC */
3360 /* All commands yielding 5 results */
3361 /* All commands yielding 4 results */
3362 /* All commands yielding 3 results */
3363 /* All commands yielding 2 results */
3364 /* All commands yielding 1 result */
3365 case OFDM_SC_RA_RAM_CMD_USER_IO:
3366 case OFDM_SC_RA_RAM_CMD_GET_OP_PARAM:
3367 status = read16(state, OFDM_SC_RA_RAM_PARAM0__A, &(param0));
3368 /* All commands yielding 0 results */
3369 case OFDM_SC_RA_RAM_CMD_SET_ECHO_TIMING:
3370 case OFDM_SC_RA_RAM_CMD_SET_TIMER:
3371 case OFDM_SC_RA_RAM_CMD_PROC_START:
3372 case OFDM_SC_RA_RAM_CMD_SET_PREF_PARAM:
3373 case OFDM_SC_RA_RAM_CMD_PROGRAM_PARAM:
3374 case OFDM_SC_RA_RAM_CMD_NULL:
3377 /* Unknown command */
3380 } /* switch (cmd->cmd) */
3383 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
3387 static int PowerUpDVBT(struct drxk_state *state)
3389 enum DRXPowerMode powerMode = DRX_POWER_UP;
3393 status = CtrlPowerMode(state, &powerMode);
3395 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
3399 static int DVBTCtrlSetIncEnable(struct drxk_state *state, bool *enabled)
3404 if (*enabled == true)
3405 status = write16(state, IQM_CF_BYPASSDET__A, 0);
3407 status = write16(state, IQM_CF_BYPASSDET__A, 1);
3409 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
3413 #define DEFAULT_FR_THRES_8K 4000
3414 static int DVBTCtrlSetFrEnable(struct drxk_state *state, bool *enabled)
3420 if (*enabled == true) {
3421 /* write mask to 1 */
3422 status = write16(state, OFDM_SC_RA_RAM_FR_THRES_8K__A,
3423 DEFAULT_FR_THRES_8K);
3425 /* write mask to 0 */
3426 status = write16(state, OFDM_SC_RA_RAM_FR_THRES_8K__A, 0);
3429 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
3434 static int DVBTCtrlSetEchoThreshold(struct drxk_state *state,
3435 struct DRXKCfgDvbtEchoThres_t *echoThres)
3441 status = read16(state, OFDM_SC_RA_RAM_ECHO_THRES__A, &data);
3445 switch (echoThres->fftMode) {
3446 case DRX_FFTMODE_2K:
3447 data &= ~OFDM_SC_RA_RAM_ECHO_THRES_2K__M;
3448 data |= ((echoThres->threshold <<
3449 OFDM_SC_RA_RAM_ECHO_THRES_2K__B)
3450 & (OFDM_SC_RA_RAM_ECHO_THRES_2K__M));
3452 case DRX_FFTMODE_8K:
3453 data &= ~OFDM_SC_RA_RAM_ECHO_THRES_8K__M;
3454 data |= ((echoThres->threshold <<
3455 OFDM_SC_RA_RAM_ECHO_THRES_8K__B)
3456 & (OFDM_SC_RA_RAM_ECHO_THRES_8K__M));
3462 status = write16(state, OFDM_SC_RA_RAM_ECHO_THRES__A, data);
3465 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
3469 static int DVBTCtrlSetSqiSpeed(struct drxk_state *state,
3470 enum DRXKCfgDvbtSqiSpeed *speed)
3472 int status = -EINVAL;
3477 case DRXK_DVBT_SQI_SPEED_FAST:
3478 case DRXK_DVBT_SQI_SPEED_MEDIUM:
3479 case DRXK_DVBT_SQI_SPEED_SLOW:
3484 status = write16(state, SCU_RAM_FEC_PRE_RS_BER_FILTER_SH__A,
3488 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
3492 /*============================================================================*/
3495 * \brief Activate DVBT specific presets
3496 * \param demod instance of demodulator.
3497 * \return DRXStatus_t.
3499 * Called in DVBTSetStandard
3502 static int DVBTActivatePresets(struct drxk_state *state)
3505 bool setincenable = false;
3506 bool setfrenable = true;
3508 struct DRXKCfgDvbtEchoThres_t echoThres2k = { 0, DRX_FFTMODE_2K };
3509 struct DRXKCfgDvbtEchoThres_t echoThres8k = { 0, DRX_FFTMODE_8K };
3512 status = DVBTCtrlSetIncEnable(state, &setincenable);
3515 status = DVBTCtrlSetFrEnable(state, &setfrenable);
3518 status = DVBTCtrlSetEchoThreshold(state, &echoThres2k);
3521 status = DVBTCtrlSetEchoThreshold(state, &echoThres8k);
3524 status = write16(state, SCU_RAM_AGC_INGAIN_TGT_MAX__A, state->m_dvbtIfAgcCfg.IngainTgtMax);
3527 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
3531 /*============================================================================*/
3534 * \brief Initialize channelswitch-independent settings for DVBT.
3535 * \param demod instance of demodulator.
3536 * \return DRXStatus_t.
3538 * For ROM code channel filter taps are loaded from the bootloader. For microcode
3539 * the DVB-T taps from the drxk_filters.h are used.
3541 static int SetDVBTStandard(struct drxk_state *state,
3542 enum OperationMode oMode)
3551 /* added antenna switch */
3552 SwitchAntennaToDVBT(state);
3553 /* send OFDM reset command */
3554 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_OFDM | SCU_RAM_COMMAND_CMD_DEMOD_RESET, 0, NULL, 1, &cmdResult);
3558 /* send OFDM setenv command */
3559 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_OFDM | SCU_RAM_COMMAND_CMD_DEMOD_SET_ENV, 0, NULL, 1, &cmdResult);
3563 /* reset datapath for OFDM, processors first */
3564 status = write16(state, OFDM_SC_COMM_EXEC__A, OFDM_SC_COMM_EXEC_STOP);
3567 status = write16(state, OFDM_LC_COMM_EXEC__A, OFDM_LC_COMM_EXEC_STOP);
3570 status = write16(state, IQM_COMM_EXEC__A, IQM_COMM_EXEC_B_STOP);
3575 /* synchronize on ofdstate->m_festart */
3576 status = write16(state, IQM_AF_UPD_SEL__A, 1);
3579 /* window size for clipping ADC detection */
3580 status = write16(state, IQM_AF_CLP_LEN__A, 0);
3583 /* window size for for sense pre-SAW detection */
3584 status = write16(state, IQM_AF_SNS_LEN__A, 0);
3587 /* sense threshold for sense pre-SAW detection */
3588 status = write16(state, IQM_AF_AMUX__A, IQM_AF_AMUX_SIGNAL2ADC);
3591 status = SetIqmAf(state, true);
3595 status = write16(state, IQM_AF_AGC_RF__A, 0);
3599 /* Impulse noise cruncher setup */
3600 status = write16(state, IQM_AF_INC_LCT__A, 0); /* crunch in IQM_CF */
3603 status = write16(state, IQM_CF_DET_LCT__A, 0); /* detect in IQM_CF */
3606 status = write16(state, IQM_CF_WND_LEN__A, 3); /* peak detector window length */
3610 status = write16(state, IQM_RC_STRETCH__A, 16);
3613 status = write16(state, IQM_CF_OUT_ENA__A, 0x4); /* enable output 2 */
3616 status = write16(state, IQM_CF_DS_ENA__A, 0x4); /* decimate output 2 */
3619 status = write16(state, IQM_CF_SCALE__A, 1600);
3622 status = write16(state, IQM_CF_SCALE_SH__A, 0);
3626 /* virtual clipping threshold for clipping ADC detection */
3627 status = write16(state, IQM_AF_CLP_TH__A, 448);
3630 status = write16(state, IQM_CF_DATATH__A, 495); /* crunching threshold */
3634 status = BLChainCmd(state, DRXK_BL_ROM_OFFSET_TAPS_DVBT, DRXK_BLCC_NR_ELEMENTS_TAPS, DRXK_BLC_TIMEOUT);
3638 status = write16(state, IQM_CF_PKDTH__A, 2); /* peak detector threshold */
3641 status = write16(state, IQM_CF_POW_MEAS_LEN__A, 2);
3644 /* enable power measurement interrupt */
3645 status = write16(state, IQM_CF_COMM_INT_MSK__A, 1);
3648 status = write16(state, IQM_COMM_EXEC__A, IQM_COMM_EXEC_B_ACTIVE);
3652 /* IQM will not be reset from here, sync ADC and update/init AGC */
3653 status = ADCSynchronization(state);
3656 status = SetPreSaw(state, &state->m_dvbtPreSawCfg);
3660 /* Halt SCU to enable safe non-atomic accesses */
3661 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_HOLD);
3665 status = SetAgcRf(state, &state->m_dvbtRfAgcCfg, true);
3668 status = SetAgcIf(state, &state->m_dvbtIfAgcCfg, true);
3672 /* Set Noise Estimation notch width and enable DC fix */
3673 status = read16(state, OFDM_SC_RA_RAM_CONFIG__A, &data);
3676 data |= OFDM_SC_RA_RAM_CONFIG_NE_FIX_ENABLE__M;
3677 status = write16(state, OFDM_SC_RA_RAM_CONFIG__A, data);
3681 /* Activate SCU to enable SCU commands */
3682 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE);
3686 if (!state->m_DRXK_A3_ROM_CODE) {
3687 /* AGCInit() is not done for DVBT, so set agcFastClipCtrlDelay */
3688 status = write16(state, SCU_RAM_AGC_FAST_CLP_CTRL_DELAY__A, state->m_dvbtIfAgcCfg.FastClipCtrlDelay);
3694 #ifdef COMPILE_FOR_NONRT
3695 status = write16(state, OFDM_SC_RA_RAM_BE_OPT_DELAY__A, 1);
3698 status = write16(state, OFDM_SC_RA_RAM_BE_OPT_INIT_DELAY__A, 2);
3704 status = write16(state, FEC_DI_INPUT_CTL__A, 1); /* OFDM input */
3709 #ifdef COMPILE_FOR_NONRT
3710 status = write16(state, FEC_RS_MEASUREMENT_PERIOD__A, 0x400);
3714 status = write16(state, FEC_RS_MEASUREMENT_PERIOD__A, 0x1000);
3718 status = write16(state, FEC_RS_MEASUREMENT_PRESCALE__A, 0x0001);
3722 /* Setup MPEG bus */
3723 status = MPEGTSDtoSetup(state, OM_DVBT);
3726 /* Set DVBT Presets */
3727 status = DVBTActivatePresets(state);
3733 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
3737 /*============================================================================*/
3739 * \brief Start dvbt demodulating for channel.
3740 * \param demod instance of demodulator.
3741 * \return DRXStatus_t.
3743 static int DVBTStart(struct drxk_state *state)
3747 /* DRXKOfdmScCmd_t scCmd; */
3750 /* Start correct processes to get in lock */
3751 /* DRXK: OFDM_SC_RA_RAM_PROC_LOCKTRACK is no longer in mapfile! */
3752 param1 = OFDM_SC_RA_RAM_LOCKTRACK_MIN;
3753 status = DVBTScCommand(state, OFDM_SC_RA_RAM_CMD_PROC_START, 0, OFDM_SC_RA_RAM_SW_EVENT_RUN_NMASK__M, param1, 0, 0, 0);
3757 status = MPEGTSStart(state);
3760 status = write16(state, FEC_COMM_EXEC__A, FEC_COMM_EXEC_ACTIVE);
3765 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
3770 /*============================================================================*/
3773 * \brief Set up dvbt demodulator for channel.
3774 * \param demod instance of demodulator.
3775 * \return DRXStatus_t.
3776 * // original DVBTSetChannel()
3778 static int SetDVBT(struct drxk_state *state, u16 IntermediateFreqkHz,
3779 s32 tunerFreqOffset)
3782 u16 transmissionParams = 0;
3783 u16 operationMode = 0;
3784 u32 iqmRcRateOfs = 0;
3789 dprintk(1, "IF =%d, TFO = %d\n", IntermediateFreqkHz, tunerFreqOffset);
3791 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_OFDM | SCU_RAM_COMMAND_CMD_DEMOD_STOP, 0, NULL, 1, &cmdResult);
3795 /* Halt SCU to enable safe non-atomic accesses */
3796 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_HOLD);
3800 /* Stop processors */
3801 status = write16(state, OFDM_SC_COMM_EXEC__A, OFDM_SC_COMM_EXEC_STOP);
3804 status = write16(state, OFDM_LC_COMM_EXEC__A, OFDM_LC_COMM_EXEC_STOP);
3808 /* Mandatory fix, always stop CP, required to set spl offset back to
3809 hardware default (is set to 0 by ucode during pilot detection */
3810 status = write16(state, OFDM_CP_COMM_EXEC__A, OFDM_CP_COMM_EXEC_STOP);
3814 /*== Write channel settings to device =====================================*/
3817 switch (state->props.transmission_mode) {
3818 case TRANSMISSION_MODE_AUTO:
3820 operationMode |= OFDM_SC_RA_RAM_OP_AUTO_MODE__M;
3821 /* fall through , try first guess DRX_FFTMODE_8K */
3822 case TRANSMISSION_MODE_8K:
3823 transmissionParams |= OFDM_SC_RA_RAM_OP_PARAM_MODE_8K;
3825 case TRANSMISSION_MODE_2K:
3826 transmissionParams |= OFDM_SC_RA_RAM_OP_PARAM_MODE_2K;
3831 switch (state->props.guard_interval) {
3833 case GUARD_INTERVAL_AUTO:
3834 operationMode |= OFDM_SC_RA_RAM_OP_AUTO_GUARD__M;
3835 /* fall through , try first guess DRX_GUARD_1DIV4 */
3836 case GUARD_INTERVAL_1_4:
3837 transmissionParams |= OFDM_SC_RA_RAM_OP_PARAM_GUARD_4;
3839 case GUARD_INTERVAL_1_32:
3840 transmissionParams |= OFDM_SC_RA_RAM_OP_PARAM_GUARD_32;
3842 case GUARD_INTERVAL_1_16:
3843 transmissionParams |= OFDM_SC_RA_RAM_OP_PARAM_GUARD_16;
3845 case GUARD_INTERVAL_1_8:
3846 transmissionParams |= OFDM_SC_RA_RAM_OP_PARAM_GUARD_8;
3851 switch (state->props.hierarchy) {
3852 case HIERARCHY_AUTO:
3853 case HIERARCHY_NONE:
3855 operationMode |= OFDM_SC_RA_RAM_OP_AUTO_HIER__M;
3856 /* fall through , try first guess SC_RA_RAM_OP_PARAM_HIER_NO */
3857 /* transmissionParams |= OFDM_SC_RA_RAM_OP_PARAM_HIER_NO; */
3860 transmissionParams |= OFDM_SC_RA_RAM_OP_PARAM_HIER_A1;
3863 transmissionParams |= OFDM_SC_RA_RAM_OP_PARAM_HIER_A2;
3866 transmissionParams |= OFDM_SC_RA_RAM_OP_PARAM_HIER_A4;
3872 switch (state->props.modulation) {
3875 operationMode |= OFDM_SC_RA_RAM_OP_AUTO_CONST__M;
3876 /* fall through , try first guess DRX_CONSTELLATION_QAM64 */
3878 transmissionParams |= OFDM_SC_RA_RAM_OP_PARAM_CONST_QAM64;
3881 transmissionParams |= OFDM_SC_RA_RAM_OP_PARAM_CONST_QPSK;
3884 transmissionParams |= OFDM_SC_RA_RAM_OP_PARAM_CONST_QAM16;
3888 /* No hierachical channels support in BDA */
3889 /* Priority (only for hierarchical channels) */
3890 switch (channel->priority) {
3891 case DRX_PRIORITY_LOW:
3892 transmissionParams |= OFDM_SC_RA_RAM_OP_PARAM_PRIO_LO;
3893 WR16(devAddr, OFDM_EC_SB_PRIOR__A,
3894 OFDM_EC_SB_PRIOR_LO);
3896 case DRX_PRIORITY_HIGH:
3897 transmissionParams |= OFDM_SC_RA_RAM_OP_PARAM_PRIO_HI;
3898 WR16(devAddr, OFDM_EC_SB_PRIOR__A,
3899 OFDM_EC_SB_PRIOR_HI));
3901 case DRX_PRIORITY_UNKNOWN: /* fall through */
3907 /* Set Priorty high */
3908 transmissionParams |= OFDM_SC_RA_RAM_OP_PARAM_PRIO_HI;
3909 status = write16(state, OFDM_EC_SB_PRIOR__A, OFDM_EC_SB_PRIOR_HI);
3915 switch (state->props.code_rate_HP) {
3918 operationMode |= OFDM_SC_RA_RAM_OP_AUTO_RATE__M;
3919 /* fall through , try first guess DRX_CODERATE_2DIV3 */
3921 transmissionParams |= OFDM_SC_RA_RAM_OP_PARAM_RATE_2_3;
3924 transmissionParams |= OFDM_SC_RA_RAM_OP_PARAM_RATE_1_2;
3927 transmissionParams |= OFDM_SC_RA_RAM_OP_PARAM_RATE_3_4;
3930 transmissionParams |= OFDM_SC_RA_RAM_OP_PARAM_RATE_5_6;
3933 transmissionParams |= OFDM_SC_RA_RAM_OP_PARAM_RATE_7_8;
3937 /* SAW filter selection: normaly not necesarry, but if wanted
3938 the application can select a SAW filter via the driver by using UIOs */
3939 /* First determine real bandwidth (Hz) */
3940 /* Also set delay for impulse noise cruncher */
3941 /* Also set parameters for EC_OC fix, note EC_OC_REG_TMD_HIL_MAR is changed
3942 by SC for fix for some 8K,1/8 guard but is restored by InitEC and ResetEC
3944 switch (state->props.bandwidth_hz) {
3946 state->props.bandwidth_hz = 8000000;
3949 bandwidth = DRXK_BANDWIDTH_8MHZ_IN_HZ;
3950 status = write16(state, OFDM_SC_RA_RAM_SRMM_FIX_FACT_8K__A, 3052);
3953 /* cochannel protection for PAL 8 MHz */
3954 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_8K_PER_LEFT__A, 7);
3957 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_8K_PER_RIGHT__A, 7);
3960 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_2K_PER_LEFT__A, 7);
3963 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_2K_PER_RIGHT__A, 1);
3968 bandwidth = DRXK_BANDWIDTH_7MHZ_IN_HZ;
3969 status = write16(state, OFDM_SC_RA_RAM_SRMM_FIX_FACT_8K__A, 3491);
3972 /* cochannel protection for PAL 7 MHz */
3973 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_8K_PER_LEFT__A, 8);
3976 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_8K_PER_RIGHT__A, 8);
3979 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_2K_PER_LEFT__A, 4);
3982 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_2K_PER_RIGHT__A, 1);
3987 bandwidth = DRXK_BANDWIDTH_6MHZ_IN_HZ;
3988 status = write16(state, OFDM_SC_RA_RAM_SRMM_FIX_FACT_8K__A, 4073);
3991 /* cochannel protection for NTSC 6 MHz */
3992 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_8K_PER_LEFT__A, 19);
3995 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_8K_PER_RIGHT__A, 19);
3998 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_2K_PER_LEFT__A, 14);
4001 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_2K_PER_RIGHT__A, 1);
4010 if (iqmRcRateOfs == 0) {
4011 /* Now compute IQM_RC_RATE_OFS
4012 (((SysFreq/BandWidth)/2)/2) -1) * 2^23)
4014 ((SysFreq / BandWidth) * (2^21)) - (2^23)
4016 /* (SysFreq / BandWidth) * (2^28) */
4017 /* assert (MAX(sysClk)/MIN(bandwidth) < 16)
4018 => assert(MAX(sysClk) < 16*MIN(bandwidth))
4019 => assert(109714272 > 48000000) = true so Frac 28 can be used */
4020 iqmRcRateOfs = Frac28a((u32)
4021 ((state->m_sysClockFreq *
4022 1000) / 3), bandwidth);
4023 /* (SysFreq / BandWidth) * (2^21), rounding before truncating */
4024 if ((iqmRcRateOfs & 0x7fL) >= 0x40)
4025 iqmRcRateOfs += 0x80L;
4026 iqmRcRateOfs = iqmRcRateOfs >> 7;
4027 /* ((SysFreq / BandWidth) * (2^21)) - (2^23) */
4028 iqmRcRateOfs = iqmRcRateOfs - (1 << 23);
4032 ((((u32) IQM_RC_RATE_OFS_HI__M) <<
4033 IQM_RC_RATE_OFS_LO__W) | IQM_RC_RATE_OFS_LO__M);
4034 status = write32(state, IQM_RC_RATE_OFS_LO__A, iqmRcRateOfs);
4038 /* Bandwidth setting done */
4041 status = DVBTSetFrequencyShift(demod, channel, tunerOffset);
4045 status = SetFrequencyShifter(state, IntermediateFreqkHz, tunerFreqOffset, true);
4049 /*== Start SC, write channel settings to SC ===============================*/
4051 /* Activate SCU to enable SCU commands */
4052 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE);
4056 /* Enable SC after setting all other parameters */
4057 status = write16(state, OFDM_SC_COMM_STATE__A, 0);
4060 status = write16(state, OFDM_SC_COMM_EXEC__A, 1);
4065 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_OFDM | SCU_RAM_COMMAND_CMD_DEMOD_START, 0, NULL, 1, &cmdResult);
4069 /* Write SC parameter registers, set all AUTO flags in operation mode */
4070 param1 = (OFDM_SC_RA_RAM_OP_AUTO_MODE__M |
4071 OFDM_SC_RA_RAM_OP_AUTO_GUARD__M |
4072 OFDM_SC_RA_RAM_OP_AUTO_CONST__M |
4073 OFDM_SC_RA_RAM_OP_AUTO_HIER__M |
4074 OFDM_SC_RA_RAM_OP_AUTO_RATE__M);
4075 status = DVBTScCommand(state, OFDM_SC_RA_RAM_CMD_SET_PREF_PARAM,
4076 0, transmissionParams, param1, 0, 0, 0);
4080 if (!state->m_DRXK_A3_ROM_CODE)
4081 status = DVBTCtrlSetSqiSpeed(state, &state->m_sqiSpeed);
4084 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
4090 /*============================================================================*/
4093 * \brief Retreive lock status .
4094 * \param demod Pointer to demodulator instance.
4095 * \param lockStat Pointer to lock status structure.
4096 * \return DRXStatus_t.
4099 static int GetDVBTLockStatus(struct drxk_state *state, u32 *pLockStatus)
4102 const u16 mpeg_lock_mask = (OFDM_SC_RA_RAM_LOCK_MPEG__M |
4103 OFDM_SC_RA_RAM_LOCK_FEC__M);
4104 const u16 fec_lock_mask = (OFDM_SC_RA_RAM_LOCK_FEC__M);
4105 const u16 demod_lock_mask = OFDM_SC_RA_RAM_LOCK_DEMOD__M;
4107 u16 ScRaRamLock = 0;
4112 *pLockStatus = NOT_LOCKED;
4114 /* Check if SC is running */
4115 status = read16(state, OFDM_SC_COMM_EXEC__A, &ScCommExec);
4118 if (ScCommExec == OFDM_SC_COMM_EXEC_STOP)
4121 status = read16(state, OFDM_SC_RA_RAM_LOCK__A, &ScRaRamLock);
4125 if ((ScRaRamLock & mpeg_lock_mask) == mpeg_lock_mask)
4126 *pLockStatus = MPEG_LOCK;
4127 else if ((ScRaRamLock & fec_lock_mask) == fec_lock_mask)
4128 *pLockStatus = FEC_LOCK;
4129 else if ((ScRaRamLock & demod_lock_mask) == demod_lock_mask)
4130 *pLockStatus = DEMOD_LOCK;
4131 else if (ScRaRamLock & OFDM_SC_RA_RAM_LOCK_NODVBT__M)
4132 *pLockStatus = NEVER_LOCK;
4135 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
4140 static int PowerUpQAM(struct drxk_state *state)
4142 enum DRXPowerMode powerMode = DRXK_POWER_DOWN_OFDM;
4146 status = CtrlPowerMode(state, &powerMode);
4148 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
4154 /** Power Down QAM */
4155 static int PowerDownQAM(struct drxk_state *state)
4162 status = read16(state, SCU_COMM_EXEC__A, &data);
4165 if (data == SCU_COMM_EXEC_ACTIVE) {
4170 /* stop all comstate->m_exec */
4171 status = write16(state, QAM_COMM_EXEC__A, QAM_COMM_EXEC_STOP);
4174 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_QAM | SCU_RAM_COMMAND_CMD_DEMOD_STOP, 0, NULL, 1, &cmdResult);
4179 status = SetIqmAf(state, false);
4183 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
4188 /*============================================================================*/
4191 * \brief Setup of the QAM Measurement intervals for signal quality
4192 * \param demod instance of demod.
4193 * \param modulation current modulation.
4194 * \return DRXStatus_t.
4197 * Take into account that for certain settings the errorcounters can overflow.
4198 * The implementation does not check this.
4201 static int SetQAMMeasurement(struct drxk_state *state,
4202 enum EDrxkConstellation modulation,
4205 u32 fecBitsDesired = 0; /* BER accounting period */
4206 u32 fecRsPeriodTotal = 0; /* Total period */
4207 u16 fecRsPrescale = 0; /* ReedSolomon Measurement Prescale */
4208 u16 fecRsPeriod = 0; /* Value for corresponding I2C register */
4214 /* fecBitsDesired = symbolRate [kHz] *
4220 switch (modulation) {
4221 case DRX_CONSTELLATION_QAM16:
4222 fecBitsDesired = 4 * symbolRate;
4224 case DRX_CONSTELLATION_QAM32:
4225 fecBitsDesired = 5 * symbolRate;
4227 case DRX_CONSTELLATION_QAM64:
4228 fecBitsDesired = 6 * symbolRate;
4230 case DRX_CONSTELLATION_QAM128:
4231 fecBitsDesired = 7 * symbolRate;
4233 case DRX_CONSTELLATION_QAM256:
4234 fecBitsDesired = 8 * symbolRate;
4242 fecBitsDesired /= 1000; /* symbolRate [Hz] -> symbolRate [kHz] */
4243 fecBitsDesired *= 500; /* meas. period [ms] */
4245 /* Annex A/C: bits/RsPeriod = 204 * 8 = 1632 */
4246 /* fecRsPeriodTotal = fecBitsDesired / 1632 */
4247 fecRsPeriodTotal = (fecBitsDesired / 1632UL) + 1; /* roughly ceil */
4249 /* fecRsPeriodTotal = fecRsPrescale * fecRsPeriod */
4250 fecRsPrescale = 1 + (u16) (fecRsPeriodTotal >> 16);
4251 if (fecRsPrescale == 0) {
4252 /* Divide by zero (though impossible) */
4258 ((u16) fecRsPeriodTotal +
4259 (fecRsPrescale >> 1)) / fecRsPrescale;
4261 /* write corresponding registers */
4262 status = write16(state, FEC_RS_MEASUREMENT_PERIOD__A, fecRsPeriod);
4265 status = write16(state, FEC_RS_MEASUREMENT_PRESCALE__A, fecRsPrescale);
4268 status = write16(state, FEC_OC_SNC_FAIL_PERIOD__A, fecRsPeriod);
4271 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
4275 static int SetQAM16(struct drxk_state *state)
4280 /* QAM Equalizer Setup */
4282 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD0__A, 13517);
4285 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD1__A, 13517);
4288 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD2__A, 13517);
4291 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD3__A, 13517);
4294 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD4__A, 13517);
4297 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD5__A, 13517);
4300 /* Decision Feedback Equalizer */
4301 status = write16(state, QAM_DQ_QUAL_FUN0__A, 2);
4304 status = write16(state, QAM_DQ_QUAL_FUN1__A, 2);
4307 status = write16(state, QAM_DQ_QUAL_FUN2__A, 2);
4310 status = write16(state, QAM_DQ_QUAL_FUN3__A, 2);
4313 status = write16(state, QAM_DQ_QUAL_FUN4__A, 2);
4316 status = write16(state, QAM_DQ_QUAL_FUN5__A, 0);
4320 status = write16(state, QAM_SY_SYNC_HWM__A, 5);
4323 status = write16(state, QAM_SY_SYNC_AWM__A, 4);
4326 status = write16(state, QAM_SY_SYNC_LWM__A, 3);
4330 /* QAM Slicer Settings */
4331 status = write16(state, SCU_RAM_QAM_SL_SIG_POWER__A, DRXK_QAM_SL_SIG_POWER_QAM16);
4335 /* QAM Loop Controller Coeficients */
4336 status = write16(state, SCU_RAM_QAM_LC_CA_FINE__A, 15);
4339 status = write16(state, SCU_RAM_QAM_LC_CA_COARSE__A, 40);
4342 status = write16(state, SCU_RAM_QAM_LC_EP_FINE__A, 12);
4345 status = write16(state, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24);
4348 status = write16(state, SCU_RAM_QAM_LC_EP_COARSE__A, 24);
4351 status = write16(state, SCU_RAM_QAM_LC_EI_FINE__A, 12);
4354 status = write16(state, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16);
4357 status = write16(state, SCU_RAM_QAM_LC_EI_COARSE__A, 16);
4361 status = write16(state, SCU_RAM_QAM_LC_CP_FINE__A, 5);
4364 status = write16(state, SCU_RAM_QAM_LC_CP_MEDIUM__A, 20);
4367 status = write16(state, SCU_RAM_QAM_LC_CP_COARSE__A, 80);
4370 status = write16(state, SCU_RAM_QAM_LC_CI_FINE__A, 5);
4373 status = write16(state, SCU_RAM_QAM_LC_CI_MEDIUM__A, 20);
4376 status = write16(state, SCU_RAM_QAM_LC_CI_COARSE__A, 50);
4379 status = write16(state, SCU_RAM_QAM_LC_CF_FINE__A, 16);
4382 status = write16(state, SCU_RAM_QAM_LC_CF_MEDIUM__A, 16);
4385 status = write16(state, SCU_RAM_QAM_LC_CF_COARSE__A, 32);
4388 status = write16(state, SCU_RAM_QAM_LC_CF1_FINE__A, 5);
4391 status = write16(state, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 10);
4394 status = write16(state, SCU_RAM_QAM_LC_CF1_COARSE__A, 10);
4399 /* QAM State Machine (FSM) Thresholds */
4401 status = write16(state, SCU_RAM_QAM_FSM_RTH__A, 140);
4404 status = write16(state, SCU_RAM_QAM_FSM_FTH__A, 50);
4407 status = write16(state, SCU_RAM_QAM_FSM_CTH__A, 95);
4410 status = write16(state, SCU_RAM_QAM_FSM_PTH__A, 120);
4413 status = write16(state, SCU_RAM_QAM_FSM_QTH__A, 230);
4416 status = write16(state, SCU_RAM_QAM_FSM_MTH__A, 105);
4420 status = write16(state, SCU_RAM_QAM_FSM_RATE_LIM__A, 40);
4423 status = write16(state, SCU_RAM_QAM_FSM_COUNT_LIM__A, 4);
4426 status = write16(state, SCU_RAM_QAM_FSM_FREQ_LIM__A, 24);
4431 /* QAM FSM Tracking Parameters */
4433 status = write16(state, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, (u16) 16);
4436 status = write16(state, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, (u16) 220);
4439 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, (u16) 25);
4442 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, (u16) 6);
4445 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16) -24);
4448 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16) -65);
4451 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16) -127);
4457 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
4461 /*============================================================================*/
4464 * \brief QAM32 specific setup
4465 * \param demod instance of demod.
4466 * \return DRXStatus_t.
4468 static int SetQAM32(struct drxk_state *state)
4474 /* QAM Equalizer Setup */
4476 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD0__A, 6707);
4479 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD1__A, 6707);
4482 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD2__A, 6707);
4485 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD3__A, 6707);
4488 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD4__A, 6707);
4491 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD5__A, 6707);
4495 /* Decision Feedback Equalizer */
4496 status = write16(state, QAM_DQ_QUAL_FUN0__A, 3);
4499 status = write16(state, QAM_DQ_QUAL_FUN1__A, 3);
4502 status = write16(state, QAM_DQ_QUAL_FUN2__A, 3);
4505 status = write16(state, QAM_DQ_QUAL_FUN3__A, 3);
4508 status = write16(state, QAM_DQ_QUAL_FUN4__A, 3);
4511 status = write16(state, QAM_DQ_QUAL_FUN5__A, 0);
4515 status = write16(state, QAM_SY_SYNC_HWM__A, 6);
4518 status = write16(state, QAM_SY_SYNC_AWM__A, 5);
4521 status = write16(state, QAM_SY_SYNC_LWM__A, 3);
4525 /* QAM Slicer Settings */
4527 status = write16(state, SCU_RAM_QAM_SL_SIG_POWER__A, DRXK_QAM_SL_SIG_POWER_QAM32);
4532 /* QAM Loop Controller Coeficients */
4534 status = write16(state, SCU_RAM_QAM_LC_CA_FINE__A, 15);
4537 status = write16(state, SCU_RAM_QAM_LC_CA_COARSE__A, 40);
4540 status = write16(state, SCU_RAM_QAM_LC_EP_FINE__A, 12);
4543 status = write16(state, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24);
4546 status = write16(state, SCU_RAM_QAM_LC_EP_COARSE__A, 24);
4549 status = write16(state, SCU_RAM_QAM_LC_EI_FINE__A, 12);
4552 status = write16(state, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16);
4555 status = write16(state, SCU_RAM_QAM_LC_EI_COARSE__A, 16);
4559 status = write16(state, SCU_RAM_QAM_LC_CP_FINE__A, 5);
4562 status = write16(state, SCU_RAM_QAM_LC_CP_MEDIUM__A, 20);
4565 status = write16(state, SCU_RAM_QAM_LC_CP_COARSE__A, 80);
4568 status = write16(state, SCU_RAM_QAM_LC_CI_FINE__A, 5);
4571 status = write16(state, SCU_RAM_QAM_LC_CI_MEDIUM__A, 20);
4574 status = write16(state, SCU_RAM_QAM_LC_CI_COARSE__A, 50);
4577 status = write16(state, SCU_RAM_QAM_LC_CF_FINE__A, 16);
4580 status = write16(state, SCU_RAM_QAM_LC_CF_MEDIUM__A, 16);
4583 status = write16(state, SCU_RAM_QAM_LC_CF_COARSE__A, 16);
4586 status = write16(state, SCU_RAM_QAM_LC_CF1_FINE__A, 5);
4589 status = write16(state, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 10);
4592 status = write16(state, SCU_RAM_QAM_LC_CF1_COARSE__A, 0);
4597 /* QAM State Machine (FSM) Thresholds */
4599 status = write16(state, SCU_RAM_QAM_FSM_RTH__A, 90);
4602 status = write16(state, SCU_RAM_QAM_FSM_FTH__A, 50);
4605 status = write16(state, SCU_RAM_QAM_FSM_CTH__A, 80);
4608 status = write16(state, SCU_RAM_QAM_FSM_PTH__A, 100);
4611 status = write16(state, SCU_RAM_QAM_FSM_QTH__A, 170);
4614 status = write16(state, SCU_RAM_QAM_FSM_MTH__A, 100);
4618 status = write16(state, SCU_RAM_QAM_FSM_RATE_LIM__A, 40);
4621 status = write16(state, SCU_RAM_QAM_FSM_COUNT_LIM__A, 4);
4624 status = write16(state, SCU_RAM_QAM_FSM_FREQ_LIM__A, 10);
4629 /* QAM FSM Tracking Parameters */
4631 status = write16(state, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, (u16) 12);
4634 status = write16(state, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, (u16) 140);
4637 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, (u16) -8);
4640 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, (u16) -16);
4643 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16) -26);
4646 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16) -56);
4649 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16) -86);
4652 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
4656 /*============================================================================*/
4659 * \brief QAM64 specific setup
4660 * \param demod instance of demod.
4661 * \return DRXStatus_t.
4663 static int SetQAM64(struct drxk_state *state)
4668 /* QAM Equalizer Setup */
4670 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD0__A, 13336);
4673 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD1__A, 12618);
4676 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD2__A, 11988);
4679 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD3__A, 13809);
4682 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD4__A, 13809);
4685 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD5__A, 15609);
4689 /* Decision Feedback Equalizer */
4690 status = write16(state, QAM_DQ_QUAL_FUN0__A, 4);
4693 status = write16(state, QAM_DQ_QUAL_FUN1__A, 4);
4696 status = write16(state, QAM_DQ_QUAL_FUN2__A, 4);
4699 status = write16(state, QAM_DQ_QUAL_FUN3__A, 4);
4702 status = write16(state, QAM_DQ_QUAL_FUN4__A, 3);
4705 status = write16(state, QAM_DQ_QUAL_FUN5__A, 0);
4709 status = write16(state, QAM_SY_SYNC_HWM__A, 5);
4712 status = write16(state, QAM_SY_SYNC_AWM__A, 4);
4715 status = write16(state, QAM_SY_SYNC_LWM__A, 3);
4719 /* QAM Slicer Settings */
4720 status = write16(state, SCU_RAM_QAM_SL_SIG_POWER__A, DRXK_QAM_SL_SIG_POWER_QAM64);
4725 /* QAM Loop Controller Coeficients */
4727 status = write16(state, SCU_RAM_QAM_LC_CA_FINE__A, 15);
4730 status = write16(state, SCU_RAM_QAM_LC_CA_COARSE__A, 40);
4733 status = write16(state, SCU_RAM_QAM_LC_EP_FINE__A, 12);
4736 status = write16(state, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24);
4739 status = write16(state, SCU_RAM_QAM_LC_EP_COARSE__A, 24);
4742 status = write16(state, SCU_RAM_QAM_LC_EI_FINE__A, 12);
4745 status = write16(state, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16);
4748 status = write16(state, SCU_RAM_QAM_LC_EI_COARSE__A, 16);
4752 status = write16(state, SCU_RAM_QAM_LC_CP_FINE__A, 5);
4755 status = write16(state, SCU_RAM_QAM_LC_CP_MEDIUM__A, 30);
4758 status = write16(state, SCU_RAM_QAM_LC_CP_COARSE__A, 100);
4761 status = write16(state, SCU_RAM_QAM_LC_CI_FINE__A, 5);
4764 status = write16(state, SCU_RAM_QAM_LC_CI_MEDIUM__A, 30);
4767 status = write16(state, SCU_RAM_QAM_LC_CI_COARSE__A, 50);
4770 status = write16(state, SCU_RAM_QAM_LC_CF_FINE__A, 16);
4773 status = write16(state, SCU_RAM_QAM_LC_CF_MEDIUM__A, 25);
4776 status = write16(state, SCU_RAM_QAM_LC_CF_COARSE__A, 48);
4779 status = write16(state, SCU_RAM_QAM_LC_CF1_FINE__A, 5);
4782 status = write16(state, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 10);
4785 status = write16(state, SCU_RAM_QAM_LC_CF1_COARSE__A, 10);
4790 /* QAM State Machine (FSM) Thresholds */
4792 status = write16(state, SCU_RAM_QAM_FSM_RTH__A, 100);
4795 status = write16(state, SCU_RAM_QAM_FSM_FTH__A, 60);
4798 status = write16(state, SCU_RAM_QAM_FSM_CTH__A, 80);
4801 status = write16(state, SCU_RAM_QAM_FSM_PTH__A, 110);
4804 status = write16(state, SCU_RAM_QAM_FSM_QTH__A, 200);
4807 status = write16(state, SCU_RAM_QAM_FSM_MTH__A, 95);
4811 status = write16(state, SCU_RAM_QAM_FSM_RATE_LIM__A, 40);
4814 status = write16(state, SCU_RAM_QAM_FSM_COUNT_LIM__A, 4);
4817 status = write16(state, SCU_RAM_QAM_FSM_FREQ_LIM__A, 15);
4822 /* QAM FSM Tracking Parameters */
4824 status = write16(state, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, (u16) 12);
4827 status = write16(state, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, (u16) 141);
4830 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, (u16) 7);
4833 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, (u16) 0);
4836 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16) -15);
4839 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16) -45);
4842 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16) -80);
4845 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
4850 /*============================================================================*/
4853 * \brief QAM128 specific setup
4854 * \param demod: instance of demod.
4855 * \return DRXStatus_t.
4857 static int SetQAM128(struct drxk_state *state)
4862 /* QAM Equalizer Setup */
4864 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD0__A, 6564);
4867 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD1__A, 6598);
4870 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD2__A, 6394);
4873 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD3__A, 6409);
4876 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD4__A, 6656);
4879 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD5__A, 7238);
4883 /* Decision Feedback Equalizer */
4884 status = write16(state, QAM_DQ_QUAL_FUN0__A, 6);
4887 status = write16(state, QAM_DQ_QUAL_FUN1__A, 6);
4890 status = write16(state, QAM_DQ_QUAL_FUN2__A, 6);
4893 status = write16(state, QAM_DQ_QUAL_FUN3__A, 6);
4896 status = write16(state, QAM_DQ_QUAL_FUN4__A, 5);
4899 status = write16(state, QAM_DQ_QUAL_FUN5__A, 0);
4903 status = write16(state, QAM_SY_SYNC_HWM__A, 6);
4906 status = write16(state, QAM_SY_SYNC_AWM__A, 5);
4909 status = write16(state, QAM_SY_SYNC_LWM__A, 3);
4914 /* QAM Slicer Settings */
4916 status = write16(state, SCU_RAM_QAM_SL_SIG_POWER__A, DRXK_QAM_SL_SIG_POWER_QAM128);
4921 /* QAM Loop Controller Coeficients */
4923 status = write16(state, SCU_RAM_QAM_LC_CA_FINE__A, 15);
4926 status = write16(state, SCU_RAM_QAM_LC_CA_COARSE__A, 40);
4929 status = write16(state, SCU_RAM_QAM_LC_EP_FINE__A, 12);
4932 status = write16(state, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24);
4935 status = write16(state, SCU_RAM_QAM_LC_EP_COARSE__A, 24);
4938 status = write16(state, SCU_RAM_QAM_LC_EI_FINE__A, 12);
4941 status = write16(state, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16);
4944 status = write16(state, SCU_RAM_QAM_LC_EI_COARSE__A, 16);
4948 status = write16(state, SCU_RAM_QAM_LC_CP_FINE__A, 5);
4951 status = write16(state, SCU_RAM_QAM_LC_CP_MEDIUM__A, 40);
4954 status = write16(state, SCU_RAM_QAM_LC_CP_COARSE__A, 120);
4957 status = write16(state, SCU_RAM_QAM_LC_CI_FINE__A, 5);
4960 status = write16(state, SCU_RAM_QAM_LC_CI_MEDIUM__A, 40);
4963 status = write16(state, SCU_RAM_QAM_LC_CI_COARSE__A, 60);
4966 status = write16(state, SCU_RAM_QAM_LC_CF_FINE__A, 16);
4969 status = write16(state, SCU_RAM_QAM_LC_CF_MEDIUM__A, 25);
4972 status = write16(state, SCU_RAM_QAM_LC_CF_COARSE__A, 64);
4975 status = write16(state, SCU_RAM_QAM_LC_CF1_FINE__A, 5);
4978 status = write16(state, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 10);
4981 status = write16(state, SCU_RAM_QAM_LC_CF1_COARSE__A, 0);
4986 /* QAM State Machine (FSM) Thresholds */
4988 status = write16(state, SCU_RAM_QAM_FSM_RTH__A, 50);
4991 status = write16(state, SCU_RAM_QAM_FSM_FTH__A, 60);
4994 status = write16(state, SCU_RAM_QAM_FSM_CTH__A, 80);
4997 status = write16(state, SCU_RAM_QAM_FSM_PTH__A, 100);
5000 status = write16(state, SCU_RAM_QAM_FSM_QTH__A, 140);
5003 status = write16(state, SCU_RAM_QAM_FSM_MTH__A, 100);
5007 status = write16(state, SCU_RAM_QAM_FSM_RATE_LIM__A, 40);
5010 status = write16(state, SCU_RAM_QAM_FSM_COUNT_LIM__A, 5);
5014 status = write16(state, SCU_RAM_QAM_FSM_FREQ_LIM__A, 12);
5018 /* QAM FSM Tracking Parameters */
5020 status = write16(state, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, (u16) 8);
5023 status = write16(state, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, (u16) 65);
5026 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, (u16) 5);
5029 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, (u16) 3);
5032 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16) -1);
5035 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16) -12);
5038 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16) -23);
5041 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
5046 /*============================================================================*/
5049 * \brief QAM256 specific setup
5050 * \param demod: instance of demod.
5051 * \return DRXStatus_t.
5053 static int SetQAM256(struct drxk_state *state)
5058 /* QAM Equalizer Setup */
5060 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD0__A, 11502);
5063 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD1__A, 12084);
5066 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD2__A, 12543);
5069 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD3__A, 12931);
5072 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD4__A, 13629);
5075 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD5__A, 15385);
5079 /* Decision Feedback Equalizer */
5080 status = write16(state, QAM_DQ_QUAL_FUN0__A, 8);
5083 status = write16(state, QAM_DQ_QUAL_FUN1__A, 8);
5086 status = write16(state, QAM_DQ_QUAL_FUN2__A, 8);
5089 status = write16(state, QAM_DQ_QUAL_FUN3__A, 8);
5092 status = write16(state, QAM_DQ_QUAL_FUN4__A, 6);
5095 status = write16(state, QAM_DQ_QUAL_FUN5__A, 0);
5099 status = write16(state, QAM_SY_SYNC_HWM__A, 5);
5102 status = write16(state, QAM_SY_SYNC_AWM__A, 4);
5105 status = write16(state, QAM_SY_SYNC_LWM__A, 3);
5109 /* QAM Slicer Settings */
5111 status = write16(state, SCU_RAM_QAM_SL_SIG_POWER__A, DRXK_QAM_SL_SIG_POWER_QAM256);
5116 /* QAM Loop Controller Coeficients */
5118 status = write16(state, SCU_RAM_QAM_LC_CA_FINE__A, 15);
5121 status = write16(state, SCU_RAM_QAM_LC_CA_COARSE__A, 40);
5124 status = write16(state, SCU_RAM_QAM_LC_EP_FINE__A, 12);
5127 status = write16(state, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24);
5130 status = write16(state, SCU_RAM_QAM_LC_EP_COARSE__A, 24);
5133 status = write16(state, SCU_RAM_QAM_LC_EI_FINE__A, 12);
5136 status = write16(state, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16);
5139 status = write16(state, SCU_RAM_QAM_LC_EI_COARSE__A, 16);
5143 status = write16(state, SCU_RAM_QAM_LC_CP_FINE__A, 5);
5146 status = write16(state, SCU_RAM_QAM_LC_CP_MEDIUM__A, 50);
5149 status = write16(state, SCU_RAM_QAM_LC_CP_COARSE__A, 250);
5152 status = write16(state, SCU_RAM_QAM_LC_CI_FINE__A, 5);
5155 status = write16(state, SCU_RAM_QAM_LC_CI_MEDIUM__A, 50);
5158 status = write16(state, SCU_RAM_QAM_LC_CI_COARSE__A, 125);
5161 status = write16(state, SCU_RAM_QAM_LC_CF_FINE__A, 16);
5164 status = write16(state, SCU_RAM_QAM_LC_CF_MEDIUM__A, 25);
5167 status = write16(state, SCU_RAM_QAM_LC_CF_COARSE__A, 48);
5170 status = write16(state, SCU_RAM_QAM_LC_CF1_FINE__A, 5);
5173 status = write16(state, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 10);
5176 status = write16(state, SCU_RAM_QAM_LC_CF1_COARSE__A, 10);
5181 /* QAM State Machine (FSM) Thresholds */
5183 status = write16(state, SCU_RAM_QAM_FSM_RTH__A, 50);
5186 status = write16(state, SCU_RAM_QAM_FSM_FTH__A, 60);
5189 status = write16(state, SCU_RAM_QAM_FSM_CTH__A, 80);
5192 status = write16(state, SCU_RAM_QAM_FSM_PTH__A, 100);
5195 status = write16(state, SCU_RAM_QAM_FSM_QTH__A, 150);
5198 status = write16(state, SCU_RAM_QAM_FSM_MTH__A, 110);
5202 status = write16(state, SCU_RAM_QAM_FSM_RATE_LIM__A, 40);
5205 status = write16(state, SCU_RAM_QAM_FSM_COUNT_LIM__A, 4);
5208 status = write16(state, SCU_RAM_QAM_FSM_FREQ_LIM__A, 12);
5213 /* QAM FSM Tracking Parameters */
5215 status = write16(state, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, (u16) 8);
5218 status = write16(state, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, (u16) 74);
5221 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, (u16) 18);
5224 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, (u16) 13);
5227 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16) 7);
5230 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16) 0);
5233 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16) -8);
5236 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
5241 /*============================================================================*/
5243 * \brief Reset QAM block.
5244 * \param demod: instance of demod.
5245 * \param channel: pointer to channel data.
5246 * \return DRXStatus_t.
5248 static int QAMResetQAM(struct drxk_state *state)
5254 /* Stop QAM comstate->m_exec */
5255 status = write16(state, QAM_COMM_EXEC__A, QAM_COMM_EXEC_STOP);
5259 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_QAM | SCU_RAM_COMMAND_CMD_DEMOD_RESET, 0, NULL, 1, &cmdResult);
5262 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
5266 /*============================================================================*/
5269 * \brief Set QAM symbolrate.
5270 * \param demod: instance of demod.
5271 * \param channel: pointer to channel data.
5272 * \return DRXStatus_t.
5274 static int QAMSetSymbolrate(struct drxk_state *state)
5276 u32 adcFrequency = 0;
5284 /* Select & calculate correct IQM rate */
5285 adcFrequency = (state->m_sysClockFreq * 1000) / 3;
5287 /* printk(KERN_DEBUG "drxk: SR %d\n", state->props.symbol_rate); */
5288 if (state->props.symbol_rate <= 1188750)
5290 else if (state->props.symbol_rate <= 2377500)
5292 else if (state->props.symbol_rate <= 4755000)
5294 status = write16(state, IQM_FD_RATESEL__A, ratesel);
5299 IqmRcRate = ((Fadc / (symbolrate * (4<<ratesel))) - 1) * (1<<23)
5301 symbFreq = state->props.symbol_rate * (1 << ratesel);
5302 if (symbFreq == 0) {
5303 /* Divide by zero */
5307 iqmRcRate = (adcFrequency / symbFreq) * (1 << 21) +
5308 (Frac28a((adcFrequency % symbFreq), symbFreq) >> 7) -
5310 status = write32(state, IQM_RC_RATE_OFS_LO__A, iqmRcRate);
5313 state->m_iqmRcRate = iqmRcRate;
5315 LcSymbFreq = round (.125 * symbolrate / adcFreq * (1<<15))
5317 symbFreq = state->props.symbol_rate;
5318 if (adcFrequency == 0) {
5319 /* Divide by zero */
5323 lcSymbRate = (symbFreq / adcFrequency) * (1 << 12) +
5324 (Frac28a((symbFreq % adcFrequency), adcFrequency) >>
5326 if (lcSymbRate > 511)
5328 status = write16(state, QAM_LC_SYMBOL_FREQ__A, (u16) lcSymbRate);
5332 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
5336 /*============================================================================*/
5339 * \brief Get QAM lock status.
5340 * \param demod: instance of demod.
5341 * \param channel: pointer to channel data.
5342 * \return DRXStatus_t.
5345 static int GetQAMLockStatus(struct drxk_state *state, u32 *pLockStatus)
5348 u16 Result[2] = { 0, 0 };
5351 *pLockStatus = NOT_LOCKED;
5352 status = scu_command(state,
5353 SCU_RAM_COMMAND_STANDARD_QAM |
5354 SCU_RAM_COMMAND_CMD_DEMOD_GET_LOCK, 0, NULL, 2,
5357 printk(KERN_ERR "drxk: %s status = %08x\n", __func__, status);
5359 if (Result[1] < SCU_RAM_QAM_LOCKED_LOCKED_DEMOD_LOCKED) {
5360 /* 0x0000 NOT LOCKED */
5361 } else if (Result[1] < SCU_RAM_QAM_LOCKED_LOCKED_LOCKED) {
5362 /* 0x4000 DEMOD LOCKED */
5363 *pLockStatus = DEMOD_LOCK;
5364 } else if (Result[1] < SCU_RAM_QAM_LOCKED_LOCKED_NEVER_LOCK) {
5365 /* 0x8000 DEMOD + FEC LOCKED (system lock) */
5366 *pLockStatus = MPEG_LOCK;
5368 /* 0xC000 NEVER LOCKED */
5369 /* (system will never be able to lock to the signal) */
5370 /* TODO: check this, intermediate & standard specific lock states are not
5371 taken into account here */
5372 *pLockStatus = NEVER_LOCK;
5377 #define QAM_MIRROR__M 0x03
5378 #define QAM_MIRROR_NORMAL 0x00
5379 #define QAM_MIRRORED 0x01
5380 #define QAM_MIRROR_AUTO_ON 0x02
5381 #define QAM_LOCKRANGE__M 0x10
5382 #define QAM_LOCKRANGE_NORMAL 0x10
5384 static int SetQAM(struct drxk_state *state, u16 IntermediateFreqkHz,
5385 s32 tunerFreqOffset)
5388 u16 setParamParameters[4] = { 0, 0, 0, 0 };
5393 * STEP 1: reset demodulator
5394 * resets FEC DI and FEC RS
5396 * resets SCU variables
5398 status = write16(state, FEC_DI_COMM_EXEC__A, FEC_DI_COMM_EXEC_STOP);
5401 status = write16(state, FEC_RS_COMM_EXEC__A, FEC_RS_COMM_EXEC_STOP);
5404 status = QAMResetQAM(state);
5409 * STEP 2: configure demodulator
5410 * -set params; resets IQM,QAM,FEC HW; initializes some
5413 status = QAMSetSymbolrate(state);
5418 switch (state->props.modulation) {
5420 state->m_Constellation = DRX_CONSTELLATION_QAM256;
5424 state->m_Constellation = DRX_CONSTELLATION_QAM64;
5427 state->m_Constellation = DRX_CONSTELLATION_QAM16;
5430 state->m_Constellation = DRX_CONSTELLATION_QAM32;
5433 state->m_Constellation = DRX_CONSTELLATION_QAM128;
5441 setParamParameters[0] = state->m_Constellation; /* modulation */
5442 setParamParameters[1] = DRXK_QAM_I12_J17; /* interleave mode */
5443 if (state->m_OperationMode == OM_QAM_ITU_C)
5444 setParamParameters[2] = QAM_TOP_ANNEX_C;
5446 setParamParameters[2] = QAM_TOP_ANNEX_A;
5447 setParamParameters[3] |= (QAM_MIRROR_AUTO_ON);
5448 /* Env parameters */
5449 /* check for LOCKRANGE Extented */
5450 /* setParamParameters[3] |= QAM_LOCKRANGE_NORMAL; */
5452 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_QAM | SCU_RAM_COMMAND_CMD_DEMOD_SET_PARAM, 4, setParamParameters, 1, &cmdResult);
5454 /* Fall-back to the simpler call */
5455 if (state->m_OperationMode == OM_QAM_ITU_C)
5456 setParamParameters[0] = QAM_TOP_ANNEX_C;
5458 setParamParameters[0] = QAM_TOP_ANNEX_A;
5459 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_QAM | SCU_RAM_COMMAND_CMD_DEMOD_SET_ENV, 1, setParamParameters, 1, &cmdResult);
5463 setParamParameters[0] = state->m_Constellation; /* modulation */
5464 setParamParameters[1] = DRXK_QAM_I12_J17; /* interleave mode */
5465 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_QAM | SCU_RAM_COMMAND_CMD_DEMOD_SET_PARAM, 2, setParamParameters, 1, &cmdResult);
5471 * STEP 3: enable the system in a mode where the ADC provides valid
5472 * signal setup modulation independent registers
5475 status = SetFrequency(channel, tunerFreqOffset));
5479 status = SetFrequencyShifter(state, IntermediateFreqkHz, tunerFreqOffset, true);
5483 /* Setup BER measurement */
5484 status = SetQAMMeasurement(state, state->m_Constellation, state->props.symbol_rate);
5488 /* Reset default values */
5489 status = write16(state, IQM_CF_SCALE_SH__A, IQM_CF_SCALE_SH__PRE);
5492 status = write16(state, QAM_SY_TIMEOUT__A, QAM_SY_TIMEOUT__PRE);
5496 /* Reset default LC values */
5497 status = write16(state, QAM_LC_RATE_LIMIT__A, 3);
5500 status = write16(state, QAM_LC_LPF_FACTORP__A, 4);
5503 status = write16(state, QAM_LC_LPF_FACTORI__A, 4);
5506 status = write16(state, QAM_LC_MODE__A, 7);
5510 status = write16(state, QAM_LC_QUAL_TAB0__A, 1);
5513 status = write16(state, QAM_LC_QUAL_TAB1__A, 1);
5516 status = write16(state, QAM_LC_QUAL_TAB2__A, 1);
5519 status = write16(state, QAM_LC_QUAL_TAB3__A, 1);
5522 status = write16(state, QAM_LC_QUAL_TAB4__A, 2);
5525 status = write16(state, QAM_LC_QUAL_TAB5__A, 2);
5528 status = write16(state, QAM_LC_QUAL_TAB6__A, 2);
5531 status = write16(state, QAM_LC_QUAL_TAB8__A, 2);
5534 status = write16(state, QAM_LC_QUAL_TAB9__A, 2);
5537 status = write16(state, QAM_LC_QUAL_TAB10__A, 2);
5540 status = write16(state, QAM_LC_QUAL_TAB12__A, 2);
5543 status = write16(state, QAM_LC_QUAL_TAB15__A, 3);
5546 status = write16(state, QAM_LC_QUAL_TAB16__A, 3);
5549 status = write16(state, QAM_LC_QUAL_TAB20__A, 4);
5552 status = write16(state, QAM_LC_QUAL_TAB25__A, 4);
5556 /* Mirroring, QAM-block starting point not inverted */
5557 status = write16(state, QAM_SY_SP_INV__A, QAM_SY_SP_INV_SPECTRUM_INV_DIS);
5561 /* Halt SCU to enable safe non-atomic accesses */
5562 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_HOLD);
5566 /* STEP 4: modulation specific setup */
5567 switch (state->props.modulation) {
5569 status = SetQAM16(state);
5572 status = SetQAM32(state);
5576 status = SetQAM64(state);
5579 status = SetQAM128(state);
5582 status = SetQAM256(state);
5591 /* Activate SCU to enable SCU commands */
5592 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE);
5596 /* Re-configure MPEG output, requires knowledge of channel bitrate */
5597 /* extAttr->currentChannel.modulation = channel->modulation; */
5598 /* extAttr->currentChannel.symbolrate = channel->symbolrate; */
5599 status = MPEGTSDtoSetup(state, state->m_OperationMode);
5603 /* Start processes */
5604 status = MPEGTSStart(state);
5607 status = write16(state, FEC_COMM_EXEC__A, FEC_COMM_EXEC_ACTIVE);
5610 status = write16(state, QAM_COMM_EXEC__A, QAM_COMM_EXEC_ACTIVE);
5613 status = write16(state, IQM_COMM_EXEC__A, IQM_COMM_EXEC_B_ACTIVE);
5617 /* STEP 5: start QAM demodulator (starts FEC, QAM and IQM HW) */
5618 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_QAM | SCU_RAM_COMMAND_CMD_DEMOD_START, 0, NULL, 1, &cmdResult);
5622 /* update global DRXK data container */
5623 /*? extAttr->qamInterleaveMode = DRXK_QAM_I12_J17; */
5627 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
5631 static int SetQAMStandard(struct drxk_state *state,
5632 enum OperationMode oMode)
5635 #ifdef DRXK_QAM_TAPS
5636 #define DRXK_QAMA_TAPS_SELECT
5637 #include "drxk_filters.h"
5638 #undef DRXK_QAMA_TAPS_SELECT
5643 /* added antenna switch */
5644 SwitchAntennaToQAM(state);
5646 /* Ensure correct power-up mode */
5647 status = PowerUpQAM(state);
5650 /* Reset QAM block */
5651 status = QAMResetQAM(state);
5657 status = write16(state, IQM_COMM_EXEC__A, IQM_COMM_EXEC_B_STOP);
5660 status = write16(state, IQM_AF_AMUX__A, IQM_AF_AMUX_SIGNAL2ADC);
5664 /* Upload IQM Channel Filter settings by
5665 boot loader from ROM table */
5668 status = BLChainCmd(state, DRXK_BL_ROM_OFFSET_TAPS_ITU_A, DRXK_BLCC_NR_ELEMENTS_TAPS, DRXK_BLC_TIMEOUT);
5671 status = BLDirectCmd(state, IQM_CF_TAP_RE0__A, DRXK_BL_ROM_OFFSET_TAPS_ITU_C, DRXK_BLDC_NR_ELEMENTS_TAPS, DRXK_BLC_TIMEOUT);
5674 status = BLDirectCmd(state, IQM_CF_TAP_IM0__A, DRXK_BL_ROM_OFFSET_TAPS_ITU_C, DRXK_BLDC_NR_ELEMENTS_TAPS, DRXK_BLC_TIMEOUT);
5682 status = write16(state, IQM_CF_OUT_ENA__A, (1 << IQM_CF_OUT_ENA_QAM__B));
5685 status = write16(state, IQM_CF_SYMMETRIC__A, 0);
5688 status = write16(state, IQM_CF_MIDTAP__A, ((1 << IQM_CF_MIDTAP_RE__B) | (1 << IQM_CF_MIDTAP_IM__B)));
5692 status = write16(state, IQM_RC_STRETCH__A, 21);
5695 status = write16(state, IQM_AF_CLP_LEN__A, 0);
5698 status = write16(state, IQM_AF_CLP_TH__A, 448);
5701 status = write16(state, IQM_AF_SNS_LEN__A, 0);
5704 status = write16(state, IQM_CF_POW_MEAS_LEN__A, 0);
5708 status = write16(state, IQM_FS_ADJ_SEL__A, 1);
5711 status = write16(state, IQM_RC_ADJ_SEL__A, 1);
5714 status = write16(state, IQM_CF_ADJ_SEL__A, 1);
5717 status = write16(state, IQM_AF_UPD_SEL__A, 0);
5721 /* IQM Impulse Noise Processing Unit */
5722 status = write16(state, IQM_CF_CLP_VAL__A, 500);
5725 status = write16(state, IQM_CF_DATATH__A, 1000);
5728 status = write16(state, IQM_CF_BYPASSDET__A, 1);
5731 status = write16(state, IQM_CF_DET_LCT__A, 0);
5734 status = write16(state, IQM_CF_WND_LEN__A, 1);
5737 status = write16(state, IQM_CF_PKDTH__A, 1);
5740 status = write16(state, IQM_AF_INC_BYPASS__A, 1);
5744 /* turn on IQMAF. Must be done before setAgc**() */
5745 status = SetIqmAf(state, true);
5748 status = write16(state, IQM_AF_START_LOCK__A, 0x01);
5752 /* IQM will not be reset from here, sync ADC and update/init AGC */
5753 status = ADCSynchronization(state);
5757 /* Set the FSM step period */
5758 status = write16(state, SCU_RAM_QAM_FSM_STEP_PERIOD__A, 2000);
5762 /* Halt SCU to enable safe non-atomic accesses */
5763 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_HOLD);
5767 /* No more resets of the IQM, current standard correctly set =>
5768 now AGCs can be configured. */
5770 status = InitAGC(state, true);
5773 status = SetPreSaw(state, &(state->m_qamPreSawCfg));
5777 /* Configure AGC's */
5778 status = SetAgcRf(state, &(state->m_qamRfAgcCfg), true);
5781 status = SetAgcIf(state, &(state->m_qamIfAgcCfg), true);
5785 /* Activate SCU to enable SCU commands */
5786 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE);
5789 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
5793 static int WriteGPIO(struct drxk_state *state)
5799 /* stop lock indicator process */
5800 status = write16(state, SCU_RAM_GPIO__A, SCU_RAM_GPIO_HW_LOCK_IND_DISABLE);
5804 /* Write magic word to enable pdr reg write */
5805 status = write16(state, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY_KEY);
5809 if (state->m_hasSAWSW) {
5810 if (state->UIO_mask & 0x0001) { /* UIO-1 */
5811 /* write to io pad configuration register - output mode */
5812 status = write16(state, SIO_PDR_SMA_TX_CFG__A, state->m_GPIOCfg);
5816 /* use corresponding bit in io data output registar */
5817 status = read16(state, SIO_PDR_UIO_OUT_LO__A, &value);
5820 if ((state->m_GPIO & 0x0001) == 0)
5821 value &= 0x7FFF; /* write zero to 15th bit - 1st UIO */
5823 value |= 0x8000; /* write one to 15th bit - 1st UIO */
5824 /* write back to io data output register */
5825 status = write16(state, SIO_PDR_UIO_OUT_LO__A, value);
5829 if (state->UIO_mask & 0x0002) { /* UIO-2 */
5830 /* write to io pad configuration register - output mode */
5831 status = write16(state, SIO_PDR_SMA_TX_CFG__A, state->m_GPIOCfg);
5835 /* use corresponding bit in io data output registar */
5836 status = read16(state, SIO_PDR_UIO_OUT_LO__A, &value);
5839 if ((state->m_GPIO & 0x0002) == 0)
5840 value &= 0xBFFF; /* write zero to 14th bit - 2st UIO */
5842 value |= 0x4000; /* write one to 14th bit - 2st UIO */
5843 /* write back to io data output register */
5844 status = write16(state, SIO_PDR_UIO_OUT_LO__A, value);
5848 if (state->UIO_mask & 0x0004) { /* UIO-3 */
5849 /* write to io pad configuration register - output mode */
5850 status = write16(state, SIO_PDR_SMA_TX_CFG__A, state->m_GPIOCfg);
5854 /* use corresponding bit in io data output registar */
5855 status = read16(state, SIO_PDR_UIO_OUT_LO__A, &value);
5858 if ((state->m_GPIO & 0x0004) == 0)
5859 value &= 0xFFFB; /* write zero to 2nd bit - 3rd UIO */
5861 value |= 0x0004; /* write one to 2nd bit - 3rd UIO */
5862 /* write back to io data output register */
5863 status = write16(state, SIO_PDR_UIO_OUT_LO__A, value);
5868 /* Write magic word to disable pdr reg write */
5869 status = write16(state, SIO_TOP_COMM_KEY__A, 0x0000);
5872 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
5876 static int SwitchAntennaToQAM(struct drxk_state *state)
5883 if (!state->antenna_gpio)
5886 gpio_state = state->m_GPIO & state->antenna_gpio;
5888 if (state->antenna_dvbt ^ gpio_state) {
5889 /* Antenna is on DVB-T mode. Switch */
5890 if (state->antenna_dvbt)
5891 state->m_GPIO &= ~state->antenna_gpio;
5893 state->m_GPIO |= state->antenna_gpio;
5894 status = WriteGPIO(state);
5897 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
5901 static int SwitchAntennaToDVBT(struct drxk_state *state)
5908 if (!state->antenna_gpio)
5911 gpio_state = state->m_GPIO & state->antenna_gpio;
5913 if (!(state->antenna_dvbt ^ gpio_state)) {
5914 /* Antenna is on DVB-C mode. Switch */
5915 if (state->antenna_dvbt)
5916 state->m_GPIO |= state->antenna_gpio;
5918 state->m_GPIO &= ~state->antenna_gpio;
5919 status = WriteGPIO(state);
5922 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
5927 static int PowerDownDevice(struct drxk_state *state)
5929 /* Power down to requested mode */
5930 /* Backup some register settings */
5931 /* Set pins with possible pull-ups connected to them in input mode */
5932 /* Analog power down */
5933 /* ADC power down */
5934 /* Power down device */
5938 if (state->m_bPDownOpenBridge) {
5939 /* Open I2C bridge before power down of DRXK */
5940 status = ConfigureI2CBridge(state, true);
5945 status = DVBTEnableOFDMTokenRing(state, false);
5949 status = write16(state, SIO_CC_PWD_MODE__A, SIO_CC_PWD_MODE_LEVEL_CLOCK);
5952 status = write16(state, SIO_CC_UPDATE__A, SIO_CC_UPDATE_KEY);
5955 state->m_HICfgCtrl |= SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ;
5956 status = HI_CfgCommand(state);
5959 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
5964 static int load_microcode(struct drxk_state *state, const char *mc_name)
5966 const struct firmware *fw = NULL;
5971 err = request_firmware(&fw, mc_name, state->i2c->dev.parent);
5974 "drxk: Could not load firmware file %s.\n", mc_name);
5976 "drxk: Copy %s to your hotplug directory!\n", mc_name);
5979 err = DownloadMicrocode(state, fw->data, fw->size);
5980 release_firmware(fw);
5984 static int init_drxk(struct drxk_state *state)
5987 enum DRXPowerMode powerMode = DRXK_POWER_DOWN_OFDM;
5991 if ((state->m_DrxkState == DRXK_UNINITIALIZED)) {
5992 status = PowerUpDevice(state);
5995 status = DRXX_Open(state);
5998 /* Soft reset of OFDM-, sys- and osc-clockdomain */
5999 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);
6002 status = write16(state, SIO_CC_UPDATE__A, SIO_CC_UPDATE_KEY);
6005 /* TODO is this needed, if yes how much delay in worst case scenario */
6007 state->m_DRXK_A3_PATCH_CODE = true;
6008 status = GetDeviceCapabilities(state);
6012 /* Bridge delay, uses oscilator clock */
6013 /* Delay = (delay (nano seconds) * oscclk (kHz))/ 1000 */
6014 /* SDA brdige delay */
6015 state->m_HICfgBridgeDelay =
6016 (u16) ((state->m_oscClockFreq / 1000) *
6017 HI_I2C_BRIDGE_DELAY) / 1000;
6019 if (state->m_HICfgBridgeDelay >
6020 SIO_HI_RA_RAM_PAR_3_CFG_DBL_SDA__M) {
6021 state->m_HICfgBridgeDelay =
6022 SIO_HI_RA_RAM_PAR_3_CFG_DBL_SDA__M;
6024 /* SCL bridge delay, same as SDA for now */
6025 state->m_HICfgBridgeDelay +=
6026 state->m_HICfgBridgeDelay <<
6027 SIO_HI_RA_RAM_PAR_3_CFG_DBL_SCL__B;
6029 status = InitHI(state);
6032 /* disable various processes */
6034 if (!(state->m_DRXK_A1_ROM_CODE)
6035 && !(state->m_DRXK_A2_ROM_CODE))
6038 status = write16(state, SCU_RAM_GPIO__A, SCU_RAM_GPIO_HW_LOCK_IND_DISABLE);
6043 /* disable MPEG port */
6044 status = MPEGTSDisable(state);
6048 /* Stop AUD and SCU */
6049 status = write16(state, AUD_COMM_EXEC__A, AUD_COMM_EXEC_STOP);
6052 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_STOP);
6056 /* enable token-ring bus through OFDM block for possible ucode upload */
6057 status = write16(state, SIO_OFDM_SH_OFDM_RING_ENABLE__A, SIO_OFDM_SH_OFDM_RING_ENABLE_ON);
6061 /* include boot loader section */
6062 status = write16(state, SIO_BL_COMM_EXEC__A, SIO_BL_COMM_EXEC_ACTIVE);
6065 status = BLChainCmd(state, 0, 6, 100);
6069 if (state->microcode_name)
6070 load_microcode(state, state->microcode_name);
6072 /* disable token-ring bus through OFDM block for possible ucode upload */
6073 status = write16(state, SIO_OFDM_SH_OFDM_RING_ENABLE__A, SIO_OFDM_SH_OFDM_RING_ENABLE_OFF);
6077 /* Run SCU for a little while to initialize microcode version numbers */
6078 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE);
6081 status = DRXX_Open(state);
6084 /* added for test */
6087 powerMode = DRXK_POWER_DOWN_OFDM;
6088 status = CtrlPowerMode(state, &powerMode);
6092 /* Stamp driver version number in SCU data RAM in BCD code
6093 Done to enable field application engineers to retreive drxdriver version
6094 via I2C from SCU RAM.
6095 Not using SCU command interface for SCU register access since no
6096 microcode may be present.
6099 (((DRXK_VERSION_MAJOR / 100) % 10) << 12) +
6100 (((DRXK_VERSION_MAJOR / 10) % 10) << 8) +
6101 ((DRXK_VERSION_MAJOR % 10) << 4) +
6102 (DRXK_VERSION_MINOR % 10);
6103 status = write16(state, SCU_RAM_DRIVER_VER_HI__A, driverVersion);
6107 (((DRXK_VERSION_PATCH / 1000) % 10) << 12) +
6108 (((DRXK_VERSION_PATCH / 100) % 10) << 8) +
6109 (((DRXK_VERSION_PATCH / 10) % 10) << 4) +
6110 (DRXK_VERSION_PATCH % 10);
6111 status = write16(state, SCU_RAM_DRIVER_VER_LO__A, driverVersion);
6115 printk(KERN_INFO "DRXK driver version %d.%d.%d\n",
6116 DRXK_VERSION_MAJOR, DRXK_VERSION_MINOR,
6117 DRXK_VERSION_PATCH);
6119 /* Dirty fix of default values for ROM/PATCH microcode
6120 Dirty because this fix makes it impossible to setup suitable values
6121 before calling DRX_Open. This solution requires changes to RF AGC speed
6122 to be done via the CTRL function after calling DRX_Open */
6124 /* m_dvbtRfAgcCfg.speed = 3; */
6126 /* Reset driver debug flags to 0 */
6127 status = write16(state, SCU_RAM_DRIVER_DEBUG__A, 0);
6132 NOTE: No more full FEC resets allowed afterwards!! */
6133 status = write16(state, FEC_COMM_EXEC__A, FEC_COMM_EXEC_STOP);
6136 /* MPEGTS functions are still the same */
6137 status = MPEGTSDtoInit(state);
6140 status = MPEGTSStop(state);
6143 status = MPEGTSConfigurePolarity(state);
6146 status = MPEGTSConfigurePins(state, state->m_enableMPEGOutput);
6149 /* added: configure GPIO */
6150 status = WriteGPIO(state);
6154 state->m_DrxkState = DRXK_STOPPED;
6156 if (state->m_bPowerDown) {
6157 status = PowerDownDevice(state);
6160 state->m_DrxkState = DRXK_POWERED_DOWN;
6162 state->m_DrxkState = DRXK_STOPPED;
6166 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
6171 static void drxk_release(struct dvb_frontend *fe)
6173 struct drxk_state *state = fe->demodulator_priv;
6179 static int drxk_sleep(struct dvb_frontend *fe)
6181 struct drxk_state *state = fe->demodulator_priv;
6188 static int drxk_gate_ctrl(struct dvb_frontend *fe, int enable)
6190 struct drxk_state *state = fe->demodulator_priv;
6192 dprintk(1, "%s\n", enable ? "enable" : "disable");
6193 return ConfigureI2CBridge(state, enable ? true : false);
6196 static int drxk_set_parameters(struct dvb_frontend *fe)
6198 struct dtv_frontend_properties *p = &fe->dtv_property_cache;
6199 u32 delsys = p->delivery_system, old_delsys;
6200 struct drxk_state *state = fe->demodulator_priv;
6205 if (!fe->ops.tuner_ops.get_if_frequency) {
6207 "drxk: Error: get_if_frequency() not defined at tuner. Can't work without it!\n");
6211 if (fe->ops.i2c_gate_ctrl)
6212 fe->ops.i2c_gate_ctrl(fe, 1);
6213 if (fe->ops.tuner_ops.set_params)
6214 fe->ops.tuner_ops.set_params(fe);
6215 if (fe->ops.i2c_gate_ctrl)
6216 fe->ops.i2c_gate_ctrl(fe, 0);
6218 old_delsys = state->props.delivery_system;
6221 if (old_delsys != delsys) {
6224 case SYS_DVBC_ANNEX_A:
6225 case SYS_DVBC_ANNEX_C:
6226 if (!state->m_hasDVBC)
6228 state->m_itut_annex_c = (delsys == SYS_DVBC_ANNEX_C) ? true : false;
6229 if (state->m_itut_annex_c)
6230 SetOperationMode(state, OM_QAM_ITU_C);
6232 SetOperationMode(state, OM_QAM_ITU_A);
6235 if (!state->m_hasDVBT)
6237 SetOperationMode(state, OM_DVBT);
6244 fe->ops.tuner_ops.get_if_frequency(fe, &IF);
6245 Start(state, 0, IF);
6247 /* printk(KERN_DEBUG "drxk: %s IF=%d done\n", __func__, IF); */
6252 static int drxk_read_status(struct dvb_frontend *fe, fe_status_t *status)
6254 struct drxk_state *state = fe->demodulator_priv;
6259 GetLockStatus(state, &stat, 0);
6260 if (stat == MPEG_LOCK)
6262 if (stat == FEC_LOCK)
6264 if (stat == DEMOD_LOCK)
6269 static int drxk_read_ber(struct dvb_frontend *fe, u32 *ber)
6277 static int drxk_read_signal_strength(struct dvb_frontend *fe,
6280 struct drxk_state *state = fe->demodulator_priv;
6284 ReadIFAgc(state, &val);
6285 *strength = val & 0xffff;
6289 static int drxk_read_snr(struct dvb_frontend *fe, u16 *snr)
6291 struct drxk_state *state = fe->demodulator_priv;
6295 GetSignalToNoise(state, &snr2);
6296 *snr = snr2 & 0xffff;
6300 static int drxk_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
6302 struct drxk_state *state = fe->demodulator_priv;
6306 DVBTQAMGetAccPktErr(state, &err);
6307 *ucblocks = (u32) err;
6311 static int drxk_get_tune_settings(struct dvb_frontend *fe, struct dvb_frontend_tune_settings
6314 struct dtv_frontend_properties *p = &fe->dtv_property_cache;
6317 switch (p->delivery_system) {
6318 case SYS_DVBC_ANNEX_A:
6319 case SYS_DVBC_ANNEX_C:
6320 sets->min_delay_ms = 3000;
6321 sets->max_drift = 0;
6322 sets->step_size = 0;
6326 * For DVB-T, let it use the default DVB core way, that is:
6327 * fepriv->step_size = fe->ops.info.frequency_stepsize * 2
6333 static struct dvb_frontend_ops drxk_ops = {
6334 /* .delsys will be filled dynamically */
6337 .frequency_min = 47000000,
6338 .frequency_max = 865000000,
6340 .symbol_rate_min = 870000,
6341 .symbol_rate_max = 11700000,
6343 .frequency_stepsize = 166667,
6345 .caps = FE_CAN_QAM_16 | FE_CAN_QAM_32 | FE_CAN_QAM_64 |
6346 FE_CAN_QAM_128 | FE_CAN_QAM_256 | FE_CAN_FEC_AUTO |
6347 FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
6348 FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_MUTE_TS |
6349 FE_CAN_TRANSMISSION_MODE_AUTO | FE_CAN_RECOVER |
6350 FE_CAN_GUARD_INTERVAL_AUTO | FE_CAN_HIERARCHY_AUTO
6353 .release = drxk_release,
6354 .sleep = drxk_sleep,
6355 .i2c_gate_ctrl = drxk_gate_ctrl,
6357 .set_frontend = drxk_set_parameters,
6358 .get_tune_settings = drxk_get_tune_settings,
6360 .read_status = drxk_read_status,
6361 .read_ber = drxk_read_ber,
6362 .read_signal_strength = drxk_read_signal_strength,
6363 .read_snr = drxk_read_snr,
6364 .read_ucblocks = drxk_read_ucblocks,
6367 struct dvb_frontend *drxk_attach(const struct drxk_config *config,
6368 struct i2c_adapter *i2c)
6372 struct drxk_state *state = NULL;
6373 u8 adr = config->adr;
6376 state = kzalloc(sizeof(struct drxk_state), GFP_KERNEL);
6381 state->demod_address = adr;
6382 state->single_master = config->single_master;
6383 state->microcode_name = config->microcode_name;
6384 state->no_i2c_bridge = config->no_i2c_bridge;
6385 state->antenna_gpio = config->antenna_gpio;
6386 state->antenna_dvbt = config->antenna_dvbt;
6387 state->m_ChunkSize = config->chunk_size;
6388 state->enable_merr_cfg = config->enable_merr_cfg;
6390 if (config->dynamic_clk) {
6391 state->m_DVBTStaticCLK = 0;
6392 state->m_DVBCStaticCLK = 0;
6394 state->m_DVBTStaticCLK = 1;
6395 state->m_DVBCStaticCLK = 1;
6399 if (config->mpeg_out_clk_strength)
6400 state->m_TSClockkStrength = config->mpeg_out_clk_strength & 0x07;
6402 state->m_TSClockkStrength = 0x06;
6404 if (config->parallel_ts)
6405 state->m_enableParallel = true;
6407 state->m_enableParallel = false;
6409 /* NOTE: as more UIO bits will be used, add them to the mask */
6410 state->UIO_mask = config->antenna_gpio;
6412 /* Default gpio to DVB-C */
6413 if (!state->antenna_dvbt && state->antenna_gpio)
6414 state->m_GPIO |= state->antenna_gpio;
6416 state->m_GPIO &= ~state->antenna_gpio;
6418 mutex_init(&state->mutex);
6420 memcpy(&state->frontend.ops, &drxk_ops, sizeof(drxk_ops));
6421 state->frontend.demodulator_priv = state;
6424 if (init_drxk(state) < 0)
6427 /* Initialize the supported delivery systems */
6429 if (state->m_hasDVBC) {
6430 state->frontend.ops.delsys[n++] = SYS_DVBC_ANNEX_A;
6431 state->frontend.ops.delsys[n++] = SYS_DVBC_ANNEX_C;
6432 strlcat(state->frontend.ops.info.name, " DVB-C",
6433 sizeof(state->frontend.ops.info.name));
6435 if (state->m_hasDVBT) {
6436 state->frontend.ops.delsys[n++] = SYS_DVBT;
6437 strlcat(state->frontend.ops.info.name, " DVB-T",
6438 sizeof(state->frontend.ops.info.name));
6441 printk(KERN_INFO "drxk: frontend initialized.\n");
6442 return &state->frontend;
6445 printk(KERN_ERR "drxk: not found\n");
6449 EXPORT_SYMBOL(drxk_attach);
6451 MODULE_DESCRIPTION("DRX-K driver");
6452 MODULE_AUTHOR("Ralph Metzler");
6453 MODULE_LICENSE("GPL");