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 <asm/div64.h>
33 #include "dvb_frontend.h"
35 #include "drxk_hard.h"
37 static int PowerDownDVBT(struct drxk_state *state, bool setPowerMode);
38 static int PowerDownQAM(struct drxk_state *state);
39 static int SetDVBTStandard(struct drxk_state *state,
40 enum OperationMode oMode);
41 static int SetQAMStandard(struct drxk_state *state,
42 enum OperationMode oMode);
43 static int SetQAM(struct drxk_state *state, u16 IntermediateFreqkHz,
45 static int SetDVBTStandard(struct drxk_state *state,
46 enum OperationMode oMode);
47 static int DVBTStart(struct drxk_state *state);
48 static int SetDVBT(struct drxk_state *state, u16 IntermediateFreqkHz,
50 static int GetQAMLockStatus(struct drxk_state *state, u32 *pLockStatus);
51 static int GetDVBTLockStatus(struct drxk_state *state, u32 *pLockStatus);
52 static int SwitchAntennaToQAM(struct drxk_state *state);
53 static int SwitchAntennaToDVBT(struct drxk_state *state);
55 static bool IsDVBT(struct drxk_state *state)
57 return state->m_OperationMode == OM_DVBT;
60 static bool IsQAM(struct drxk_state *state)
62 return state->m_OperationMode == OM_QAM_ITU_A ||
63 state->m_OperationMode == OM_QAM_ITU_B ||
64 state->m_OperationMode == OM_QAM_ITU_C;
67 bool IsA1WithPatchCode(struct drxk_state *state)
69 return state->m_DRXK_A1_PATCH_CODE;
72 bool IsA1WithRomCode(struct drxk_state *state)
74 return state->m_DRXK_A1_ROM_CODE;
79 #define DRXDAP_FASI_SHORT_FORMAT(addr) (((addr) & 0xFC30FF80) == 0)
80 #define DRXDAP_FASI_LONG_FORMAT(addr) (((addr) & 0xFC30FF80) != 0)
82 #define DEFAULT_MER_83 165
83 #define DEFAULT_MER_93 250
85 #ifndef DRXK_MPEG_SERIAL_OUTPUT_PIN_DRIVE_STRENGTH
86 #define DRXK_MPEG_SERIAL_OUTPUT_PIN_DRIVE_STRENGTH (0x02)
89 #ifndef DRXK_MPEG_PARALLEL_OUTPUT_PIN_DRIVE_STRENGTH
90 #define DRXK_MPEG_PARALLEL_OUTPUT_PIN_DRIVE_STRENGTH (0x03)
93 #define DEFAULT_DRXK_MPEG_LOCK_TIMEOUT 700
94 #define DEFAULT_DRXK_DEMOD_LOCK_TIMEOUT 500
96 #ifndef DRXK_KI_RAGC_ATV
97 #define DRXK_KI_RAGC_ATV 4
99 #ifndef DRXK_KI_IAGC_ATV
100 #define DRXK_KI_IAGC_ATV 6
102 #ifndef DRXK_KI_DAGC_ATV
103 #define DRXK_KI_DAGC_ATV 7
106 #ifndef DRXK_KI_RAGC_QAM
107 #define DRXK_KI_RAGC_QAM 3
109 #ifndef DRXK_KI_IAGC_QAM
110 #define DRXK_KI_IAGC_QAM 4
112 #ifndef DRXK_KI_DAGC_QAM
113 #define DRXK_KI_DAGC_QAM 7
115 #ifndef DRXK_KI_RAGC_DVBT
116 #define DRXK_KI_RAGC_DVBT (IsA1WithPatchCode(state) ? 3 : 2)
118 #ifndef DRXK_KI_IAGC_DVBT
119 #define DRXK_KI_IAGC_DVBT (IsA1WithPatchCode(state) ? 4 : 2)
121 #ifndef DRXK_KI_DAGC_DVBT
122 #define DRXK_KI_DAGC_DVBT (IsA1WithPatchCode(state) ? 10 : 7)
125 #ifndef DRXK_AGC_DAC_OFFSET
126 #define DRXK_AGC_DAC_OFFSET (0x800)
129 #ifndef DRXK_BANDWIDTH_8MHZ_IN_HZ
130 #define DRXK_BANDWIDTH_8MHZ_IN_HZ (0x8B8249L)
133 #ifndef DRXK_BANDWIDTH_7MHZ_IN_HZ
134 #define DRXK_BANDWIDTH_7MHZ_IN_HZ (0x7A1200L)
137 #ifndef DRXK_BANDWIDTH_6MHZ_IN_HZ
138 #define DRXK_BANDWIDTH_6MHZ_IN_HZ (0x68A1B6L)
141 #ifndef DRXK_QAM_SYMBOLRATE_MAX
142 #define DRXK_QAM_SYMBOLRATE_MAX (7233000)
145 #define DRXK_BL_ROM_OFFSET_TAPS_DVBT 56
146 #define DRXK_BL_ROM_OFFSET_TAPS_ITU_A 64
147 #define DRXK_BL_ROM_OFFSET_TAPS_ITU_C 0x5FE0
148 #define DRXK_BL_ROM_OFFSET_TAPS_BG 24
149 #define DRXK_BL_ROM_OFFSET_TAPS_DKILLP 32
150 #define DRXK_BL_ROM_OFFSET_TAPS_NTSC 40
151 #define DRXK_BL_ROM_OFFSET_TAPS_FM 48
152 #define DRXK_BL_ROM_OFFSET_UCODE 0
154 #define DRXK_BLC_TIMEOUT 100
156 #define DRXK_BLCC_NR_ELEMENTS_TAPS 2
157 #define DRXK_BLCC_NR_ELEMENTS_UCODE 6
159 #define DRXK_BLDC_NR_ELEMENTS_TAPS 28
161 #ifndef DRXK_OFDM_NE_NOTCH_WIDTH
162 #define DRXK_OFDM_NE_NOTCH_WIDTH (4)
165 #define DRXK_QAM_SL_SIG_POWER_QAM16 (40960)
166 #define DRXK_QAM_SL_SIG_POWER_QAM32 (20480)
167 #define DRXK_QAM_SL_SIG_POWER_QAM64 (43008)
168 #define DRXK_QAM_SL_SIG_POWER_QAM128 (20992)
169 #define DRXK_QAM_SL_SIG_POWER_QAM256 (43520)
171 static unsigned int debug;
172 module_param(debug, int, 0644);
173 MODULE_PARM_DESC(debug, "enable debug messages");
175 #define dprintk(level, fmt, arg...) do { \
176 if (debug >= level) \
177 printk(KERN_DEBUG "drxk: %s" fmt, __func__, ## arg); \
181 static inline u32 MulDiv32(u32 a, u32 b, u32 c)
185 tmp64 = (u64) a * (u64) b;
191 inline u32 Frac28a(u32 a, u32 c)
197 R0 = (a % c) << 4; /* 32-28 == 4 shifts possible at max */
198 Q1 = a / c; /* integer part, only the 4 least significant bits
199 will be visible in the result */
201 /* division using radix 16, 7 nibbles in the result */
202 for (i = 0; i < 7; i++) {
203 Q1 = (Q1 << 4) | (R0 / c);
213 static u32 Log10Times100(u32 x)
215 static const u8 scale = 15;
216 static const u8 indexWidth = 5;
223 log2lut[n] = (1<<scale) * 200 * log2(1.0 + ((1.0/(1<<INDEXWIDTH)) * n))
224 0 <= n < ((1<<INDEXWIDTH)+1)
227 static const u32 log2lut[] = {
229 290941, /* 290941.300628 */
230 573196, /* 573196.476418 */
231 847269, /* 847269.179851 */
232 1113620, /* 1113620.489452 */
233 1372674, /* 1372673.576986 */
234 1624818, /* 1624817.752104 */
235 1870412, /* 1870411.981536 */
236 2109788, /* 2109787.962654 */
237 2343253, /* 2343252.817465 */
238 2571091, /* 2571091.461923 */
239 2793569, /* 2793568.696416 */
240 3010931, /* 3010931.055901 */
241 3223408, /* 3223408.452106 */
242 3431216, /* 3431215.635215 */
243 3634553, /* 3634553.498355 */
244 3833610, /* 3833610.244726 */
245 4028562, /* 4028562.434393 */
246 4219576, /* 4219575.925308 */
247 4406807, /* 4406806.721144 */
248 4590402, /* 4590401.736809 */
249 4770499, /* 4770499.491025 */
250 4947231, /* 4947230.734179 */
251 5120719, /* 5120719.018555 */
252 5291081, /* 5291081.217197 */
253 5458428, /* 5458427.996830 */
254 5622864, /* 5622864.249668 */
255 5784489, /* 5784489.488298 */
256 5943398, /* 5943398.207380 */
257 6099680, /* 6099680.215452 */
258 6253421, /* 6253420.939751 */
259 6404702, /* 6404701.706649 */
260 6553600, /* 6553600.000000 */
267 /* Scale x (normalize) */
268 /* computing y in log(x/y) = log(x) - log(y) */
269 if ((x & ((0xffffffff) << (scale + 1))) == 0) {
270 for (k = scale; k > 0; k--) {
271 if (x & (((u32) 1) << scale))
276 for (k = scale; k < 31; k++) {
277 if ((x & (((u32) (-1)) << (scale + 1))) == 0)
283 Now x has binary point between bit[scale] and bit[scale-1]
284 and 1.0 <= x < 2.0 */
286 /* correction for divison: log(x) = log(x/y)+log(y) */
287 y = k * ((((u32) 1) << scale) * 200);
289 /* remove integer part */
290 x &= ((((u32) 1) << scale) - 1);
292 i = (u8) (x >> (scale - indexWidth));
293 /* compute delta (x - a) */
294 d = x & ((((u32) 1) << (scale - indexWidth)) - 1);
295 /* compute log, multiplication (d* (..)) must be within range ! */
297 ((d * (log2lut[i + 1] - log2lut[i])) >> (scale - indexWidth));
298 /* Conver to log10() */
299 y /= 108853; /* (log2(10) << scale) */
307 /****************************************************************************/
308 /* I2C **********************************************************************/
309 /****************************************************************************/
311 static int i2c_read1(struct i2c_adapter *adapter, u8 adr, u8 *val)
313 struct i2c_msg msgs[1] = { {.addr = adr, .flags = I2C_M_RD,
314 .buf = val, .len = 1}
317 return i2c_transfer(adapter, msgs, 1);
320 static int i2c_write(struct i2c_adapter *adap, u8 adr, u8 *data, int len)
323 struct i2c_msg msg = {
324 .addr = adr, .flags = 0, .buf = data, .len = len };
329 for (i = 0; i < len; i++)
330 printk(KERN_CONT " %02x", data[i]);
331 printk(KERN_CONT "\n");
333 status = i2c_transfer(adap, &msg, 1);
334 if (status >= 0 && status != 1)
338 printk(KERN_ERR "drxk: i2c write error at addr 0x%02x\n", adr);
343 static int i2c_read(struct i2c_adapter *adap,
344 u8 adr, u8 *msg, int len, u8 *answ, int alen)
347 struct i2c_msg msgs[2] = {
348 {.addr = adr, .flags = 0,
349 .buf = msg, .len = len},
350 {.addr = adr, .flags = I2C_M_RD,
351 .buf = answ, .len = alen}
354 status = i2c_transfer(adap, msgs, 2);
357 printk(KERN_CONT ": ERROR!\n");
361 printk(KERN_ERR "drxk: i2c read error at addr 0x%02x\n", adr);
366 dprintk(2, ": read from");
367 for (i = 0; i < len; i++)
368 printk(KERN_CONT " %02x", msg[i]);
369 printk(KERN_CONT ", value = ");
370 for (i = 0; i < alen; i++)
371 printk(KERN_CONT " %02x", answ[i]);
372 printk(KERN_CONT "\n");
377 static int read16_flags(struct drxk_state *state, u32 reg, u16 *data, u8 flags)
380 u8 adr = state->demod_address, mm1[4], mm2[2], len;
382 if (state->single_master)
385 if (DRXDAP_FASI_LONG_FORMAT(reg) || (flags != 0)) {
386 mm1[0] = (((reg << 1) & 0xFF) | 0x01);
387 mm1[1] = ((reg >> 16) & 0xFF);
388 mm1[2] = ((reg >> 24) & 0xFF) | flags;
389 mm1[3] = ((reg >> 7) & 0xFF);
392 mm1[0] = ((reg << 1) & 0xFF);
393 mm1[1] = (((reg >> 16) & 0x0F) | ((reg >> 18) & 0xF0));
396 dprintk(2, "(0x%08x, 0x%02x)\n", reg, flags);
397 status = i2c_read(state->i2c, adr, mm1, len, mm2, 2);
401 *data = mm2[0] | (mm2[1] << 8);
406 static int read16(struct drxk_state *state, u32 reg, u16 *data)
408 return read16_flags(state, reg, data, 0);
411 static int read32_flags(struct drxk_state *state, u32 reg, u32 *data, u8 flags)
414 u8 adr = state->demod_address, mm1[4], mm2[4], len;
416 if (state->single_master)
419 if (DRXDAP_FASI_LONG_FORMAT(reg) || (flags != 0)) {
420 mm1[0] = (((reg << 1) & 0xFF) | 0x01);
421 mm1[1] = ((reg >> 16) & 0xFF);
422 mm1[2] = ((reg >> 24) & 0xFF) | flags;
423 mm1[3] = ((reg >> 7) & 0xFF);
426 mm1[0] = ((reg << 1) & 0xFF);
427 mm1[1] = (((reg >> 16) & 0x0F) | ((reg >> 18) & 0xF0));
430 dprintk(2, "(0x%08x, 0x%02x)\n", reg, flags);
431 status = i2c_read(state->i2c, adr, mm1, len, mm2, 4);
435 *data = mm2[0] | (mm2[1] << 8) |
436 (mm2[2] << 16) | (mm2[3] << 24);
441 static int read32(struct drxk_state *state, u32 reg, u32 *data)
443 return read32_flags(state, reg, data, 0);
446 static int write16_flags(struct drxk_state *state, u32 reg, u16 data, u8 flags)
448 u8 adr = state->demod_address, mm[6], len;
450 if (state->single_master)
452 if (DRXDAP_FASI_LONG_FORMAT(reg) || (flags != 0)) {
453 mm[0] = (((reg << 1) & 0xFF) | 0x01);
454 mm[1] = ((reg >> 16) & 0xFF);
455 mm[2] = ((reg >> 24) & 0xFF) | flags;
456 mm[3] = ((reg >> 7) & 0xFF);
459 mm[0] = ((reg << 1) & 0xFF);
460 mm[1] = (((reg >> 16) & 0x0F) | ((reg >> 18) & 0xF0));
463 mm[len] = data & 0xff;
464 mm[len + 1] = (data >> 8) & 0xff;
466 dprintk(2, "(0x%08x, 0x%04x, 0x%02x)\n", reg, data, flags);
467 return i2c_write(state->i2c, adr, mm, len + 2);
470 static int write16(struct drxk_state *state, u32 reg, u16 data)
472 return write16_flags(state, reg, data, 0);
475 static int write32_flags(struct drxk_state *state, u32 reg, u32 data, u8 flags)
477 u8 adr = state->demod_address, mm[8], len;
479 if (state->single_master)
481 if (DRXDAP_FASI_LONG_FORMAT(reg) || (flags != 0)) {
482 mm[0] = (((reg << 1) & 0xFF) | 0x01);
483 mm[1] = ((reg >> 16) & 0xFF);
484 mm[2] = ((reg >> 24) & 0xFF) | flags;
485 mm[3] = ((reg >> 7) & 0xFF);
488 mm[0] = ((reg << 1) & 0xFF);
489 mm[1] = (((reg >> 16) & 0x0F) | ((reg >> 18) & 0xF0));
492 mm[len] = data & 0xff;
493 mm[len + 1] = (data >> 8) & 0xff;
494 mm[len + 2] = (data >> 16) & 0xff;
495 mm[len + 3] = (data >> 24) & 0xff;
496 dprintk(2, "(0x%08x, 0x%08x, 0x%02x)\n", reg, data, flags);
498 return i2c_write(state->i2c, adr, mm, len + 4);
501 static int write32(struct drxk_state *state, u32 reg, u32 data)
503 return write32_flags(state, reg, data, 0);
506 static int write_block(struct drxk_state *state, u32 Address,
507 const int BlockSize, const u8 pBlock[])
509 int status = 0, BlkSize = BlockSize;
512 if (state->single_master)
515 while (BlkSize > 0) {
516 int Chunk = BlkSize > state->m_ChunkSize ?
517 state->m_ChunkSize : BlkSize;
518 u8 *AdrBuf = &state->Chunk[0];
521 if (DRXDAP_FASI_LONG_FORMAT(Address) || (Flags != 0)) {
522 AdrBuf[0] = (((Address << 1) & 0xFF) | 0x01);
523 AdrBuf[1] = ((Address >> 16) & 0xFF);
524 AdrBuf[2] = ((Address >> 24) & 0xFF);
525 AdrBuf[3] = ((Address >> 7) & 0xFF);
528 if (Chunk == state->m_ChunkSize)
531 AdrBuf[0] = ((Address << 1) & 0xFF);
532 AdrBuf[1] = (((Address >> 16) & 0x0F) |
533 ((Address >> 18) & 0xF0));
536 memcpy(&state->Chunk[AdrLength], pBlock, Chunk);
537 dprintk(2, "(0x%08x, 0x%02x)\n", Address, Flags);
541 for (i = 0; i < Chunk; i++)
542 printk(KERN_CONT " %02x", pBlock[i]);
543 printk(KERN_CONT "\n");
545 status = i2c_write(state->i2c, state->demod_address,
546 &state->Chunk[0], Chunk + AdrLength);
548 printk(KERN_ERR "drxk: %s: i2c write error at addr 0x%02x\n",
553 Address += (Chunk >> 1);
559 #ifndef DRXK_MAX_RETRIES_POWERUP
560 #define DRXK_MAX_RETRIES_POWERUP 20
563 int PowerUpDevice(struct drxk_state *state)
571 status = i2c_read1(state->i2c, state->demod_address, &data);
575 status = i2c_write(state->i2c, state->demod_address,
581 status = i2c_read1(state->i2c, state->demod_address,
583 } while (status < 0 &&
584 (retryCount < DRXK_MAX_RETRIES_POWERUP));
585 if (status < 0 && retryCount >= DRXK_MAX_RETRIES_POWERUP)
589 /* Make sure all clk domains are active */
590 status = write16(state, SIO_CC_PWD_MODE__A, SIO_CC_PWD_MODE_LEVEL_NONE);
593 status = write16(state, SIO_CC_UPDATE__A, SIO_CC_UPDATE_KEY);
596 /* Enable pll lock tests */
597 status = write16(state, SIO_CC_PLL_LOCK__A, 1);
601 state->m_currentPowerMode = DRX_POWER_UP;
605 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
611 static int init_state(struct drxk_state *state)
614 * FIXME: most (all?) of the values bellow should be moved into
615 * struct drxk_config, as they are probably board-specific
617 u32 ulVSBIfAgcMode = DRXK_AGC_CTRL_AUTO;
618 u32 ulVSBIfAgcOutputLevel = 0;
619 u32 ulVSBIfAgcMinLevel = 0;
620 u32 ulVSBIfAgcMaxLevel = 0x7FFF;
621 u32 ulVSBIfAgcSpeed = 3;
623 u32 ulVSBRfAgcMode = DRXK_AGC_CTRL_AUTO;
624 u32 ulVSBRfAgcOutputLevel = 0;
625 u32 ulVSBRfAgcMinLevel = 0;
626 u32 ulVSBRfAgcMaxLevel = 0x7FFF;
627 u32 ulVSBRfAgcSpeed = 3;
628 u32 ulVSBRfAgcTop = 9500;
629 u32 ulVSBRfAgcCutOffCurrent = 4000;
631 u32 ulATVIfAgcMode = DRXK_AGC_CTRL_AUTO;
632 u32 ulATVIfAgcOutputLevel = 0;
633 u32 ulATVIfAgcMinLevel = 0;
634 u32 ulATVIfAgcMaxLevel = 0;
635 u32 ulATVIfAgcSpeed = 3;
637 u32 ulATVRfAgcMode = DRXK_AGC_CTRL_OFF;
638 u32 ulATVRfAgcOutputLevel = 0;
639 u32 ulATVRfAgcMinLevel = 0;
640 u32 ulATVRfAgcMaxLevel = 0;
641 u32 ulATVRfAgcTop = 9500;
642 u32 ulATVRfAgcCutOffCurrent = 4000;
643 u32 ulATVRfAgcSpeed = 3;
645 u32 ulQual83 = DEFAULT_MER_83;
646 u32 ulQual93 = DEFAULT_MER_93;
648 u32 ulMpegLockTimeOut = DEFAULT_DRXK_MPEG_LOCK_TIMEOUT;
649 u32 ulDemodLockTimeOut = DEFAULT_DRXK_DEMOD_LOCK_TIMEOUT;
651 /* io_pad_cfg register (8 bit reg.) MSB bit is 1 (default value) */
652 /* io_pad_cfg_mode output mode is drive always */
653 /* io_pad_cfg_drive is set to power 2 (23 mA) */
654 u32 ulGPIOCfg = 0x0113;
655 u32 ulInvertTSClock = 0;
656 u32 ulTSDataStrength = DRXK_MPEG_SERIAL_OUTPUT_PIN_DRIVE_STRENGTH;
657 u32 ulDVBTBitrate = 50000000;
658 u32 ulDVBCBitrate = DRXK_QAM_SYMBOLRATE_MAX * 8;
660 u32 ulInsertRSByte = 0;
667 state->m_hasLNA = false;
668 state->m_hasDVBT = false;
669 state->m_hasDVBC = false;
670 state->m_hasATV = false;
671 state->m_hasOOB = false;
672 state->m_hasAudio = false;
674 if (!state->m_ChunkSize)
675 state->m_ChunkSize = 124;
677 state->m_oscClockFreq = 0;
678 state->m_smartAntInverted = false;
679 state->m_bPDownOpenBridge = false;
681 /* real system clock frequency in kHz */
682 state->m_sysClockFreq = 151875;
683 /* Timing div, 250ns/Psys */
684 /* Timing div, = (delay (nano seconds) * sysclk (kHz))/ 1000 */
685 state->m_HICfgTimingDiv = ((state->m_sysClockFreq / 1000) *
686 HI_I2C_DELAY) / 1000;
688 if (state->m_HICfgTimingDiv > SIO_HI_RA_RAM_PAR_2_CFG_DIV__M)
689 state->m_HICfgTimingDiv = SIO_HI_RA_RAM_PAR_2_CFG_DIV__M;
690 state->m_HICfgWakeUpKey = (state->demod_address << 1);
691 /* port/bridge/power down ctrl */
692 state->m_HICfgCtrl = SIO_HI_RA_RAM_PAR_5_CFG_SLV0_SLAVE;
694 state->m_bPowerDown = (ulPowerDown != 0);
696 state->m_DRXK_A1_PATCH_CODE = false;
697 state->m_DRXK_A1_ROM_CODE = false;
698 state->m_DRXK_A2_ROM_CODE = false;
699 state->m_DRXK_A3_ROM_CODE = false;
700 state->m_DRXK_A2_PATCH_CODE = false;
701 state->m_DRXK_A3_PATCH_CODE = false;
703 /* Init AGC and PGA parameters */
705 state->m_vsbIfAgcCfg.ctrlMode = (ulVSBIfAgcMode);
706 state->m_vsbIfAgcCfg.outputLevel = (ulVSBIfAgcOutputLevel);
707 state->m_vsbIfAgcCfg.minOutputLevel = (ulVSBIfAgcMinLevel);
708 state->m_vsbIfAgcCfg.maxOutputLevel = (ulVSBIfAgcMaxLevel);
709 state->m_vsbIfAgcCfg.speed = (ulVSBIfAgcSpeed);
710 state->m_vsbPgaCfg = 140;
713 state->m_vsbRfAgcCfg.ctrlMode = (ulVSBRfAgcMode);
714 state->m_vsbRfAgcCfg.outputLevel = (ulVSBRfAgcOutputLevel);
715 state->m_vsbRfAgcCfg.minOutputLevel = (ulVSBRfAgcMinLevel);
716 state->m_vsbRfAgcCfg.maxOutputLevel = (ulVSBRfAgcMaxLevel);
717 state->m_vsbRfAgcCfg.speed = (ulVSBRfAgcSpeed);
718 state->m_vsbRfAgcCfg.top = (ulVSBRfAgcTop);
719 state->m_vsbRfAgcCfg.cutOffCurrent = (ulVSBRfAgcCutOffCurrent);
720 state->m_vsbPreSawCfg.reference = 0x07;
721 state->m_vsbPreSawCfg.usePreSaw = true;
723 state->m_Quality83percent = DEFAULT_MER_83;
724 state->m_Quality93percent = DEFAULT_MER_93;
725 if (ulQual93 <= 500 && ulQual83 < ulQual93) {
726 state->m_Quality83percent = ulQual83;
727 state->m_Quality93percent = ulQual93;
731 state->m_atvIfAgcCfg.ctrlMode = (ulATVIfAgcMode);
732 state->m_atvIfAgcCfg.outputLevel = (ulATVIfAgcOutputLevel);
733 state->m_atvIfAgcCfg.minOutputLevel = (ulATVIfAgcMinLevel);
734 state->m_atvIfAgcCfg.maxOutputLevel = (ulATVIfAgcMaxLevel);
735 state->m_atvIfAgcCfg.speed = (ulATVIfAgcSpeed);
738 state->m_atvRfAgcCfg.ctrlMode = (ulATVRfAgcMode);
739 state->m_atvRfAgcCfg.outputLevel = (ulATVRfAgcOutputLevel);
740 state->m_atvRfAgcCfg.minOutputLevel = (ulATVRfAgcMinLevel);
741 state->m_atvRfAgcCfg.maxOutputLevel = (ulATVRfAgcMaxLevel);
742 state->m_atvRfAgcCfg.speed = (ulATVRfAgcSpeed);
743 state->m_atvRfAgcCfg.top = (ulATVRfAgcTop);
744 state->m_atvRfAgcCfg.cutOffCurrent = (ulATVRfAgcCutOffCurrent);
745 state->m_atvPreSawCfg.reference = 0x04;
746 state->m_atvPreSawCfg.usePreSaw = true;
750 state->m_dvbtRfAgcCfg.ctrlMode = DRXK_AGC_CTRL_OFF;
751 state->m_dvbtRfAgcCfg.outputLevel = 0;
752 state->m_dvbtRfAgcCfg.minOutputLevel = 0;
753 state->m_dvbtRfAgcCfg.maxOutputLevel = 0xFFFF;
754 state->m_dvbtRfAgcCfg.top = 0x2100;
755 state->m_dvbtRfAgcCfg.cutOffCurrent = 4000;
756 state->m_dvbtRfAgcCfg.speed = 1;
760 state->m_dvbtIfAgcCfg.ctrlMode = DRXK_AGC_CTRL_AUTO;
761 state->m_dvbtIfAgcCfg.outputLevel = 0;
762 state->m_dvbtIfAgcCfg.minOutputLevel = 0;
763 state->m_dvbtIfAgcCfg.maxOutputLevel = 9000;
764 state->m_dvbtIfAgcCfg.top = 13424;
765 state->m_dvbtIfAgcCfg.cutOffCurrent = 0;
766 state->m_dvbtIfAgcCfg.speed = 3;
767 state->m_dvbtIfAgcCfg.FastClipCtrlDelay = 30;
768 state->m_dvbtIfAgcCfg.IngainTgtMax = 30000;
769 /* state->m_dvbtPgaCfg = 140; */
771 state->m_dvbtPreSawCfg.reference = 4;
772 state->m_dvbtPreSawCfg.usePreSaw = false;
775 state->m_qamRfAgcCfg.ctrlMode = DRXK_AGC_CTRL_OFF;
776 state->m_qamRfAgcCfg.outputLevel = 0;
777 state->m_qamRfAgcCfg.minOutputLevel = 6023;
778 state->m_qamRfAgcCfg.maxOutputLevel = 27000;
779 state->m_qamRfAgcCfg.top = 0x2380;
780 state->m_qamRfAgcCfg.cutOffCurrent = 4000;
781 state->m_qamRfAgcCfg.speed = 3;
784 state->m_qamIfAgcCfg.ctrlMode = DRXK_AGC_CTRL_AUTO;
785 state->m_qamIfAgcCfg.outputLevel = 0;
786 state->m_qamIfAgcCfg.minOutputLevel = 0;
787 state->m_qamIfAgcCfg.maxOutputLevel = 9000;
788 state->m_qamIfAgcCfg.top = 0x0511;
789 state->m_qamIfAgcCfg.cutOffCurrent = 0;
790 state->m_qamIfAgcCfg.speed = 3;
791 state->m_qamIfAgcCfg.IngainTgtMax = 5119;
792 state->m_qamIfAgcCfg.FastClipCtrlDelay = 50;
794 state->m_qamPgaCfg = 140;
795 state->m_qamPreSawCfg.reference = 4;
796 state->m_qamPreSawCfg.usePreSaw = false;
798 state->m_OperationMode = OM_NONE;
799 state->m_DrxkState = DRXK_UNINITIALIZED;
801 /* MPEG output configuration */
802 state->m_enableMPEGOutput = true; /* If TRUE; enable MPEG ouput */
803 state->m_insertRSByte = false; /* If TRUE; insert RS byte */
804 state->m_invertDATA = false; /* If TRUE; invert DATA signals */
805 state->m_invertERR = false; /* If TRUE; invert ERR signal */
806 state->m_invertSTR = false; /* If TRUE; invert STR signals */
807 state->m_invertVAL = false; /* If TRUE; invert VAL signals */
808 state->m_invertCLK = (ulInvertTSClock != 0); /* If TRUE; invert CLK signals */
810 /* If TRUE; static MPEG clockrate will be used;
811 otherwise clockrate will adapt to the bitrate of the TS */
813 state->m_DVBTBitrate = ulDVBTBitrate;
814 state->m_DVBCBitrate = ulDVBCBitrate;
816 state->m_TSDataStrength = (ulTSDataStrength & 0x07);
818 /* Maximum bitrate in b/s in case static clockrate is selected */
819 state->m_mpegTsStaticBitrate = 19392658;
820 state->m_disableTEIhandling = false;
823 state->m_insertRSByte = true;
825 state->m_MpegLockTimeOut = DEFAULT_DRXK_MPEG_LOCK_TIMEOUT;
826 if (ulMpegLockTimeOut < 10000)
827 state->m_MpegLockTimeOut = ulMpegLockTimeOut;
828 state->m_DemodLockTimeOut = DEFAULT_DRXK_DEMOD_LOCK_TIMEOUT;
829 if (ulDemodLockTimeOut < 10000)
830 state->m_DemodLockTimeOut = ulDemodLockTimeOut;
833 state->m_Constellation = DRX_CONSTELLATION_AUTO;
834 state->m_qamInterleaveMode = DRXK_QAM_I12_J17;
835 state->m_fecRsPlen = 204 * 8; /* fecRsPlen annex A */
836 state->m_fecRsPrescale = 1;
838 state->m_sqiSpeed = DRXK_DVBT_SQI_SPEED_MEDIUM;
839 state->m_agcFastClipCtrlDelay = 0;
841 state->m_GPIOCfg = (ulGPIOCfg);
843 state->m_bPowerDown = false;
844 state->m_currentPowerMode = DRX_POWER_DOWN;
846 state->m_rfmirror = (ulRfMirror == 0);
847 state->m_IfAgcPol = false;
851 static int DRXX_Open(struct drxk_state *state)
859 /* stop lock indicator process */
860 status = write16(state, SCU_RAM_GPIO__A, SCU_RAM_GPIO_HW_LOCK_IND_DISABLE);
863 /* Check device id */
864 status = read16(state, SIO_TOP_COMM_KEY__A, &key);
867 status = write16(state, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY_KEY);
870 status = read32(state, SIO_TOP_JTAGID_LO__A, &jtag);
873 status = read16(state, SIO_PDR_UIO_IN_HI__A, &bid);
876 status = write16(state, SIO_TOP_COMM_KEY__A, key);
879 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
883 static int GetDeviceCapabilities(struct drxk_state *state)
885 u16 sioPdrOhwCfg = 0;
886 u32 sioTopJtagidLo = 0;
888 const char *spin = "";
893 /* stop lock indicator process */
894 status = write16(state, SCU_RAM_GPIO__A, SCU_RAM_GPIO_HW_LOCK_IND_DISABLE);
897 status = write16(state, SIO_TOP_COMM_KEY__A, 0xFABA);
900 status = read16(state, SIO_PDR_OHW_CFG__A, &sioPdrOhwCfg);
903 status = write16(state, SIO_TOP_COMM_KEY__A, 0x0000);
907 switch ((sioPdrOhwCfg & SIO_PDR_OHW_CFG_FREF_SEL__M)) {
909 /* ignore (bypass ?) */
913 state->m_oscClockFreq = 27000;
917 state->m_oscClockFreq = 20250;
921 state->m_oscClockFreq = 20250;
924 printk(KERN_ERR "drxk: Clock Frequency is unkonwn\n");
928 Determine device capabilities
931 status = read32(state, SIO_TOP_JTAGID_LO__A, &sioTopJtagidLo);
935 printk(KERN_ERR "drxk: status = 0x%08x\n", sioTopJtagidLo);
938 switch ((sioTopJtagidLo >> 29) & 0xF) {
940 state->m_deviceSpin = DRXK_SPIN_A1;
944 state->m_deviceSpin = DRXK_SPIN_A2;
948 state->m_deviceSpin = DRXK_SPIN_A3;
952 state->m_deviceSpin = DRXK_SPIN_UNKNOWN;
954 printk(KERN_ERR "drxk: Spin %d unknown\n",
955 (sioTopJtagidLo >> 29) & 0xF);
958 switch ((sioTopJtagidLo >> 12) & 0xFF) {
960 /* typeId = DRX3913K_TYPE_ID */
961 state->m_hasLNA = false;
962 state->m_hasOOB = false;
963 state->m_hasATV = false;
964 state->m_hasAudio = false;
965 state->m_hasDVBT = true;
966 state->m_hasDVBC = true;
967 state->m_hasSAWSW = true;
968 state->m_hasGPIO2 = false;
969 state->m_hasGPIO1 = false;
970 state->m_hasIRQN = false;
973 /* typeId = DRX3915K_TYPE_ID */
974 state->m_hasLNA = false;
975 state->m_hasOOB = false;
976 state->m_hasATV = true;
977 state->m_hasAudio = false;
978 state->m_hasDVBT = true;
979 state->m_hasDVBC = false;
980 state->m_hasSAWSW = true;
981 state->m_hasGPIO2 = true;
982 state->m_hasGPIO1 = true;
983 state->m_hasIRQN = false;
986 /* typeId = DRX3916K_TYPE_ID */
987 state->m_hasLNA = false;
988 state->m_hasOOB = false;
989 state->m_hasATV = true;
990 state->m_hasAudio = false;
991 state->m_hasDVBT = true;
992 state->m_hasDVBC = false;
993 state->m_hasSAWSW = true;
994 state->m_hasGPIO2 = true;
995 state->m_hasGPIO1 = true;
996 state->m_hasIRQN = false;
999 /* typeId = DRX3918K_TYPE_ID */
1000 state->m_hasLNA = false;
1001 state->m_hasOOB = false;
1002 state->m_hasATV = true;
1003 state->m_hasAudio = true;
1004 state->m_hasDVBT = true;
1005 state->m_hasDVBC = false;
1006 state->m_hasSAWSW = true;
1007 state->m_hasGPIO2 = true;
1008 state->m_hasGPIO1 = true;
1009 state->m_hasIRQN = false;
1012 /* typeId = DRX3921K_TYPE_ID */
1013 state->m_hasLNA = false;
1014 state->m_hasOOB = false;
1015 state->m_hasATV = true;
1016 state->m_hasAudio = true;
1017 state->m_hasDVBT = true;
1018 state->m_hasDVBC = true;
1019 state->m_hasSAWSW = true;
1020 state->m_hasGPIO2 = true;
1021 state->m_hasGPIO1 = true;
1022 state->m_hasIRQN = false;
1025 /* typeId = DRX3923K_TYPE_ID */
1026 state->m_hasLNA = false;
1027 state->m_hasOOB = false;
1028 state->m_hasATV = true;
1029 state->m_hasAudio = true;
1030 state->m_hasDVBT = true;
1031 state->m_hasDVBC = true;
1032 state->m_hasSAWSW = true;
1033 state->m_hasGPIO2 = true;
1034 state->m_hasGPIO1 = true;
1035 state->m_hasIRQN = false;
1038 /* typeId = DRX3925K_TYPE_ID */
1039 state->m_hasLNA = false;
1040 state->m_hasOOB = false;
1041 state->m_hasATV = true;
1042 state->m_hasAudio = true;
1043 state->m_hasDVBT = true;
1044 state->m_hasDVBC = true;
1045 state->m_hasSAWSW = true;
1046 state->m_hasGPIO2 = true;
1047 state->m_hasGPIO1 = true;
1048 state->m_hasIRQN = false;
1051 /* typeId = DRX3926K_TYPE_ID */
1052 state->m_hasLNA = false;
1053 state->m_hasOOB = false;
1054 state->m_hasATV = true;
1055 state->m_hasAudio = false;
1056 state->m_hasDVBT = true;
1057 state->m_hasDVBC = true;
1058 state->m_hasSAWSW = true;
1059 state->m_hasGPIO2 = true;
1060 state->m_hasGPIO1 = true;
1061 state->m_hasIRQN = false;
1064 printk(KERN_ERR "drxk: DeviceID 0x%02x not supported\n",
1065 ((sioTopJtagidLo >> 12) & 0xFF));
1071 "drxk: detected a drx-39%02xk, spin %s, xtal %d.%03d MHz\n",
1072 ((sioTopJtagidLo >> 12) & 0xFF), spin,
1073 state->m_oscClockFreq / 1000,
1074 state->m_oscClockFreq % 1000);
1078 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
1084 static int HI_Command(struct drxk_state *state, u16 cmd, u16 *pResult)
1092 status = write16(state, SIO_HI_RA_RAM_CMD__A, cmd);
1095 if (cmd == SIO_HI_RA_RAM_CMD_RESET)
1099 (bool) ((cmd == SIO_HI_RA_RAM_CMD_CONFIG) &&
1100 ((state->m_HICfgCtrl) &
1101 SIO_HI_RA_RAM_PAR_5_CFG_SLEEP__M) ==
1102 SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ);
1103 if (powerdown_cmd == false) {
1104 /* Wait until command rdy */
1111 status = read16(state, SIO_HI_RA_RAM_CMD__A,
1113 } while ((status < 0) && (retryCount < DRXK_MAX_RETRIES)
1117 status = read16(state, SIO_HI_RA_RAM_RES__A, pResult);
1121 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
1126 static int HI_CfgCommand(struct drxk_state *state)
1132 mutex_lock(&state->mutex);
1134 status = write16(state, SIO_HI_RA_RAM_PAR_6__A, state->m_HICfgTimeout);
1137 status = write16(state, SIO_HI_RA_RAM_PAR_5__A, state->m_HICfgCtrl);
1140 status = write16(state, SIO_HI_RA_RAM_PAR_4__A, state->m_HICfgWakeUpKey);
1143 status = write16(state, SIO_HI_RA_RAM_PAR_3__A, state->m_HICfgBridgeDelay);
1146 status = write16(state, SIO_HI_RA_RAM_PAR_2__A, state->m_HICfgTimingDiv);
1149 status = write16(state, SIO_HI_RA_RAM_PAR_1__A, SIO_HI_RA_RAM_PAR_1_PAR1_SEC_KEY);
1152 status = HI_Command(state, SIO_HI_RA_RAM_CMD_CONFIG, 0);
1156 state->m_HICfgCtrl &= ~SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ;
1158 mutex_unlock(&state->mutex);
1160 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
1164 static int InitHI(struct drxk_state *state)
1168 state->m_HICfgWakeUpKey = (state->demod_address << 1);
1169 state->m_HICfgTimeout = 0x96FF;
1170 /* port/bridge/power down ctrl */
1171 state->m_HICfgCtrl = SIO_HI_RA_RAM_PAR_5_CFG_SLV0_SLAVE;
1173 return HI_CfgCommand(state);
1176 static int MPEGTSConfigurePins(struct drxk_state *state, bool mpegEnable)
1179 u16 sioPdrMclkCfg = 0;
1180 u16 sioPdrMdxCfg = 0;
1183 dprintk(1, ": mpeg %s, %s mode\n",
1184 mpegEnable ? "enable" : "disable",
1185 state->m_enableParallel ? "parallel" : "serial");
1187 /* stop lock indicator process */
1188 status = write16(state, SCU_RAM_GPIO__A, SCU_RAM_GPIO_HW_LOCK_IND_DISABLE);
1192 /* MPEG TS pad configuration */
1193 status = write16(state, SIO_TOP_COMM_KEY__A, 0xFABA);
1197 if (mpegEnable == false) {
1198 /* Set MPEG TS pads to inputmode */
1199 status = write16(state, SIO_PDR_MSTRT_CFG__A, 0x0000);
1202 status = write16(state, SIO_PDR_MERR_CFG__A, 0x0000);
1205 status = write16(state, SIO_PDR_MCLK_CFG__A, 0x0000);
1208 status = write16(state, SIO_PDR_MVAL_CFG__A, 0x0000);
1211 status = write16(state, SIO_PDR_MD0_CFG__A, 0x0000);
1214 status = write16(state, SIO_PDR_MD1_CFG__A, 0x0000);
1217 status = write16(state, SIO_PDR_MD2_CFG__A, 0x0000);
1220 status = write16(state, SIO_PDR_MD3_CFG__A, 0x0000);
1223 status = write16(state, SIO_PDR_MD4_CFG__A, 0x0000);
1226 status = write16(state, SIO_PDR_MD5_CFG__A, 0x0000);
1229 status = write16(state, SIO_PDR_MD6_CFG__A, 0x0000);
1232 status = write16(state, SIO_PDR_MD7_CFG__A, 0x0000);
1236 /* Enable MPEG output */
1238 ((state->m_TSDataStrength <<
1239 SIO_PDR_MD0_CFG_DRIVE__B) | 0x0003);
1240 sioPdrMclkCfg = ((state->m_TSClockkStrength <<
1241 SIO_PDR_MCLK_CFG_DRIVE__B) |
1244 status = write16(state, SIO_PDR_MSTRT_CFG__A, sioPdrMdxCfg);
1248 if (state->enable_merr_cfg)
1249 err_cfg = sioPdrMdxCfg;
1251 status = write16(state, SIO_PDR_MERR_CFG__A, err_cfg);
1254 status = write16(state, SIO_PDR_MVAL_CFG__A, err_cfg);
1258 if (state->m_enableParallel == true) {
1259 /* paralel -> enable MD1 to MD7 */
1260 status = write16(state, SIO_PDR_MD1_CFG__A, sioPdrMdxCfg);
1263 status = write16(state, SIO_PDR_MD2_CFG__A, sioPdrMdxCfg);
1266 status = write16(state, SIO_PDR_MD3_CFG__A, sioPdrMdxCfg);
1269 status = write16(state, SIO_PDR_MD4_CFG__A, sioPdrMdxCfg);
1272 status = write16(state, SIO_PDR_MD5_CFG__A, sioPdrMdxCfg);
1275 status = write16(state, SIO_PDR_MD6_CFG__A, sioPdrMdxCfg);
1278 status = write16(state, SIO_PDR_MD7_CFG__A, sioPdrMdxCfg);
1282 sioPdrMdxCfg = ((state->m_TSDataStrength <<
1283 SIO_PDR_MD0_CFG_DRIVE__B)
1285 /* serial -> disable MD1 to MD7 */
1286 status = write16(state, SIO_PDR_MD1_CFG__A, 0x0000);
1289 status = write16(state, SIO_PDR_MD2_CFG__A, 0x0000);
1292 status = write16(state, SIO_PDR_MD3_CFG__A, 0x0000);
1295 status = write16(state, SIO_PDR_MD4_CFG__A, 0x0000);
1298 status = write16(state, SIO_PDR_MD5_CFG__A, 0x0000);
1301 status = write16(state, SIO_PDR_MD6_CFG__A, 0x0000);
1304 status = write16(state, SIO_PDR_MD7_CFG__A, 0x0000);
1308 status = write16(state, SIO_PDR_MCLK_CFG__A, sioPdrMclkCfg);
1311 status = write16(state, SIO_PDR_MD0_CFG__A, sioPdrMdxCfg);
1315 /* Enable MB output over MPEG pads and ctl input */
1316 status = write16(state, SIO_PDR_MON_CFG__A, 0x0000);
1319 /* Write nomagic word to enable pdr reg write */
1320 status = write16(state, SIO_TOP_COMM_KEY__A, 0x0000);
1323 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
1327 static int MPEGTSDisable(struct drxk_state *state)
1331 return MPEGTSConfigurePins(state, false);
1334 static int BLChainCmd(struct drxk_state *state,
1335 u16 romOffset, u16 nrOfElements, u32 timeOut)
1342 mutex_lock(&state->mutex);
1343 status = write16(state, SIO_BL_MODE__A, SIO_BL_MODE_CHAIN);
1346 status = write16(state, SIO_BL_CHAIN_ADDR__A, romOffset);
1349 status = write16(state, SIO_BL_CHAIN_LEN__A, nrOfElements);
1352 status = write16(state, SIO_BL_ENABLE__A, SIO_BL_ENABLE_ON);
1356 end = jiffies + msecs_to_jiffies(timeOut);
1359 status = read16(state, SIO_BL_STATUS__A, &blStatus);
1362 } while ((blStatus == 0x1) &&
1363 ((time_is_after_jiffies(end))));
1365 if (blStatus == 0x1) {
1366 printk(KERN_ERR "drxk: SIO not ready\n");
1372 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
1374 mutex_unlock(&state->mutex);
1379 static int DownloadMicrocode(struct drxk_state *state,
1380 const u8 pMCImage[], u32 Length)
1382 const u8 *pSrc = pMCImage;
1395 /* down the drain (we don care about MAGIC_WORD) */
1396 Drain = (pSrc[0] << 8) | pSrc[1];
1397 pSrc += sizeof(u16);
1398 offset += sizeof(u16);
1399 nBlocks = (pSrc[0] << 8) | pSrc[1];
1400 pSrc += sizeof(u16);
1401 offset += sizeof(u16);
1403 for (i = 0; i < nBlocks; i += 1) {
1404 Address = (pSrc[0] << 24) | (pSrc[1] << 16) |
1405 (pSrc[2] << 8) | pSrc[3];
1406 pSrc += sizeof(u32);
1407 offset += sizeof(u32);
1409 BlockSize = ((pSrc[0] << 8) | pSrc[1]) * sizeof(u16);
1410 pSrc += sizeof(u16);
1411 offset += sizeof(u16);
1413 Flags = (pSrc[0] << 8) | pSrc[1];
1414 pSrc += sizeof(u16);
1415 offset += sizeof(u16);
1417 BlockCRC = (pSrc[0] << 8) | pSrc[1];
1418 pSrc += sizeof(u16);
1419 offset += sizeof(u16);
1421 if (offset + BlockSize > Length) {
1422 printk(KERN_ERR "drxk: Firmware is corrupted.\n");
1426 status = write_block(state, Address, BlockSize, pSrc);
1428 printk(KERN_ERR "drxk: Error %d while loading firmware\n", status);
1432 offset += BlockSize;
1437 static int DVBTEnableOFDMTokenRing(struct drxk_state *state, bool enable)
1441 u16 desiredCtrl = SIO_OFDM_SH_OFDM_RING_ENABLE_ON;
1442 u16 desiredStatus = SIO_OFDM_SH_OFDM_RING_STATUS_ENABLED;
1447 if (enable == false) {
1448 desiredCtrl = SIO_OFDM_SH_OFDM_RING_ENABLE_OFF;
1449 desiredStatus = SIO_OFDM_SH_OFDM_RING_STATUS_DOWN;
1452 status = read16(state, SIO_OFDM_SH_OFDM_RING_STATUS__A, &data);
1453 if (status >= 0 && data == desiredStatus) {
1454 /* tokenring already has correct status */
1457 /* Disable/enable dvbt tokenring bridge */
1458 status = write16(state, SIO_OFDM_SH_OFDM_RING_ENABLE__A, desiredCtrl);
1460 end = jiffies + msecs_to_jiffies(DRXK_OFDM_TR_SHUTDOWN_TIMEOUT);
1462 status = read16(state, SIO_OFDM_SH_OFDM_RING_STATUS__A, &data);
1463 if ((status >= 0 && data == desiredStatus) || time_is_after_jiffies(end))
1467 if (data != desiredStatus) {
1468 printk(KERN_ERR "drxk: SIO not ready\n");
1474 static int MPEGTSStop(struct drxk_state *state)
1477 u16 fecOcSncMode = 0;
1478 u16 fecOcIprMode = 0;
1482 /* Gracefull shutdown (byte boundaries) */
1483 status = read16(state, FEC_OC_SNC_MODE__A, &fecOcSncMode);
1486 fecOcSncMode |= FEC_OC_SNC_MODE_SHUTDOWN__M;
1487 status = write16(state, FEC_OC_SNC_MODE__A, fecOcSncMode);
1491 /* Suppress MCLK during absence of data */
1492 status = read16(state, FEC_OC_IPR_MODE__A, &fecOcIprMode);
1495 fecOcIprMode |= FEC_OC_IPR_MODE_MCLK_DIS_DAT_ABS__M;
1496 status = write16(state, FEC_OC_IPR_MODE__A, fecOcIprMode);
1500 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
1505 static int scu_command(struct drxk_state *state,
1506 u16 cmd, u8 parameterLen,
1507 u16 *parameter, u8 resultLen, u16 *result)
1509 #if (SCU_RAM_PARAM_0__A - SCU_RAM_PARAM_15__A) != 15
1510 #error DRXK register mapping no longer compatible with this routine!
1513 int status = -EINVAL;
1522 if ((cmd == 0) || ((parameterLen > 0) && (parameter == NULL)) ||
1523 ((resultLen > 0) && (result == NULL)))
1526 mutex_lock(&state->mutex);
1528 /* assume that the command register is ready
1529 since it is checked afterwards */
1530 for (ii = parameterLen - 1; ii >= 0; ii -= 1) {
1531 buffer[cnt++] = (parameter[ii] & 0xFF);
1532 buffer[cnt++] = ((parameter[ii] >> 8) & 0xFF);
1534 buffer[cnt++] = (cmd & 0xFF);
1535 buffer[cnt++] = ((cmd >> 8) & 0xFF);
1537 write_block(state, SCU_RAM_PARAM_0__A -
1538 (parameterLen - 1), cnt, buffer);
1539 /* Wait until SCU has processed command */
1540 end = jiffies + msecs_to_jiffies(DRXK_MAX_WAITTIME);
1543 status = read16(state, SCU_RAM_COMMAND__A, &curCmd);
1546 } while (!(curCmd == DRX_SCU_READY) && (time_is_after_jiffies(end)));
1547 if (curCmd != DRX_SCU_READY) {
1548 printk(KERN_ERR "drxk: SCU not ready\n");
1553 if ((resultLen > 0) && (result != NULL)) {
1557 for (ii = resultLen - 1; ii >= 0; ii -= 1) {
1558 status = read16(state, SCU_RAM_PARAM_0__A - ii, &result[ii]);
1563 /* Check if an error was reported by SCU */
1564 err = (s16)result[0];
1568 /* check for the known error codes */
1570 case SCU_RESULT_UNKCMD:
1571 p = "SCU_RESULT_UNKCMD";
1573 case SCU_RESULT_UNKSTD:
1574 p = "SCU_RESULT_UNKSTD";
1576 case SCU_RESULT_SIZE:
1577 p = "SCU_RESULT_SIZE";
1579 case SCU_RESULT_INVPAR:
1580 p = "SCU_RESULT_INVPAR";
1582 default: /* Other negative values are errors */
1583 sprintf(errname, "ERROR: %d\n", err);
1586 printk(KERN_ERR "drxk: %s while sending cmd 0x%04x with params:", p, cmd);
1587 print_hex_dump_bytes("drxk: ", DUMP_PREFIX_NONE, buffer, cnt);
1594 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
1596 mutex_unlock(&state->mutex);
1600 static int SetIqmAf(struct drxk_state *state, bool active)
1608 status = read16(state, IQM_AF_STDBY__A, &data);
1613 data |= (IQM_AF_STDBY_STDBY_ADC_STANDBY
1614 | IQM_AF_STDBY_STDBY_AMP_STANDBY
1615 | IQM_AF_STDBY_STDBY_PD_STANDBY
1616 | IQM_AF_STDBY_STDBY_TAGC_IF_STANDBY
1617 | IQM_AF_STDBY_STDBY_TAGC_RF_STANDBY);
1619 data &= ((~IQM_AF_STDBY_STDBY_ADC_STANDBY)
1620 & (~IQM_AF_STDBY_STDBY_AMP_STANDBY)
1621 & (~IQM_AF_STDBY_STDBY_PD_STANDBY)
1622 & (~IQM_AF_STDBY_STDBY_TAGC_IF_STANDBY)
1623 & (~IQM_AF_STDBY_STDBY_TAGC_RF_STANDBY)
1626 status = write16(state, IQM_AF_STDBY__A, data);
1630 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
1634 static int CtrlPowerMode(struct drxk_state *state, enum DRXPowerMode *mode)
1637 u16 sioCcPwdMode = 0;
1641 /* Check arguments */
1647 sioCcPwdMode = SIO_CC_PWD_MODE_LEVEL_NONE;
1649 case DRXK_POWER_DOWN_OFDM:
1650 sioCcPwdMode = SIO_CC_PWD_MODE_LEVEL_OFDM;
1652 case DRXK_POWER_DOWN_CORE:
1653 sioCcPwdMode = SIO_CC_PWD_MODE_LEVEL_CLOCK;
1655 case DRXK_POWER_DOWN_PLL:
1656 sioCcPwdMode = SIO_CC_PWD_MODE_LEVEL_PLL;
1658 case DRX_POWER_DOWN:
1659 sioCcPwdMode = SIO_CC_PWD_MODE_LEVEL_OSC;
1662 /* Unknow sleep mode */
1666 /* If already in requested power mode, do nothing */
1667 if (state->m_currentPowerMode == *mode)
1670 /* For next steps make sure to start from DRX_POWER_UP mode */
1671 if (state->m_currentPowerMode != DRX_POWER_UP) {
1672 status = PowerUpDevice(state);
1675 status = DVBTEnableOFDMTokenRing(state, true);
1680 if (*mode == DRX_POWER_UP) {
1681 /* Restore analog & pin configuartion */
1683 /* Power down to requested mode */
1684 /* Backup some register settings */
1685 /* Set pins with possible pull-ups connected
1686 to them in input mode */
1687 /* Analog power down */
1688 /* ADC power down */
1689 /* Power down device */
1690 /* stop all comm_exec */
1691 /* Stop and power down previous standard */
1692 switch (state->m_OperationMode) {
1694 status = MPEGTSStop(state);
1697 status = PowerDownDVBT(state, false);
1703 status = MPEGTSStop(state);
1706 status = PowerDownQAM(state);
1713 status = DVBTEnableOFDMTokenRing(state, false);
1716 status = write16(state, SIO_CC_PWD_MODE__A, sioCcPwdMode);
1719 status = write16(state, SIO_CC_UPDATE__A, SIO_CC_UPDATE_KEY);
1723 if (*mode != DRXK_POWER_DOWN_OFDM) {
1724 state->m_HICfgCtrl |=
1725 SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ;
1726 status = HI_CfgCommand(state);
1731 state->m_currentPowerMode = *mode;
1735 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
1740 static int PowerDownDVBT(struct drxk_state *state, bool setPowerMode)
1742 enum DRXPowerMode powerMode = DRXK_POWER_DOWN_OFDM;
1749 status = read16(state, SCU_COMM_EXEC__A, &data);
1752 if (data == SCU_COMM_EXEC_ACTIVE) {
1753 /* Send OFDM stop command */
1754 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_OFDM | SCU_RAM_COMMAND_CMD_DEMOD_STOP, 0, NULL, 1, &cmdResult);
1757 /* Send OFDM reset command */
1758 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_OFDM | SCU_RAM_COMMAND_CMD_DEMOD_RESET, 0, NULL, 1, &cmdResult);
1763 /* Reset datapath for OFDM, processors first */
1764 status = write16(state, OFDM_SC_COMM_EXEC__A, OFDM_SC_COMM_EXEC_STOP);
1767 status = write16(state, OFDM_LC_COMM_EXEC__A, OFDM_LC_COMM_EXEC_STOP);
1770 status = write16(state, IQM_COMM_EXEC__A, IQM_COMM_EXEC_B_STOP);
1775 status = SetIqmAf(state, false);
1779 /* powerdown to OFDM mode */
1781 status = CtrlPowerMode(state, &powerMode);
1787 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
1791 static int SetOperationMode(struct drxk_state *state,
1792 enum OperationMode oMode)
1798 Stop and power down previous standard
1799 TODO investigate total power down instead of partial
1800 power down depending on "previous" standard.
1803 /* disable HW lock indicator */
1804 status = write16(state, SCU_RAM_GPIO__A, SCU_RAM_GPIO_HW_LOCK_IND_DISABLE);
1808 /* Device is already at the required mode */
1809 if (state->m_OperationMode == oMode)
1812 switch (state->m_OperationMode) {
1813 /* OM_NONE was added for start up */
1817 status = MPEGTSStop(state);
1820 status = PowerDownDVBT(state, true);
1823 state->m_OperationMode = OM_NONE;
1825 case OM_QAM_ITU_A: /* fallthrough */
1827 status = MPEGTSStop(state);
1830 status = PowerDownQAM(state);
1833 state->m_OperationMode = OM_NONE;
1842 Power up new standard
1846 dprintk(1, ": DVB-T\n");
1847 state->m_OperationMode = oMode;
1848 status = SetDVBTStandard(state, oMode);
1852 case OM_QAM_ITU_A: /* fallthrough */
1854 dprintk(1, ": DVB-C Annex %c\n",
1855 (state->m_OperationMode == OM_QAM_ITU_A) ? 'A' : 'C');
1856 state->m_OperationMode = oMode;
1857 status = SetQAMStandard(state, oMode);
1867 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
1871 static int Start(struct drxk_state *state, s32 offsetFreq,
1872 s32 IntermediateFrequency)
1874 int status = -EINVAL;
1877 s32 OffsetkHz = offsetFreq / 1000;
1880 if (state->m_DrxkState != DRXK_STOPPED &&
1881 state->m_DrxkState != DRXK_DTV_STARTED)
1884 state->m_bMirrorFreqSpect = (state->props.inversion == INVERSION_ON);
1886 if (IntermediateFrequency < 0) {
1887 state->m_bMirrorFreqSpect = !state->m_bMirrorFreqSpect;
1888 IntermediateFrequency = -IntermediateFrequency;
1891 switch (state->m_OperationMode) {
1894 IFreqkHz = (IntermediateFrequency / 1000);
1895 status = SetQAM(state, IFreqkHz, OffsetkHz);
1898 state->m_DrxkState = DRXK_DTV_STARTED;
1901 IFreqkHz = (IntermediateFrequency / 1000);
1902 status = MPEGTSStop(state);
1905 status = SetDVBT(state, IFreqkHz, OffsetkHz);
1908 status = DVBTStart(state);
1911 state->m_DrxkState = DRXK_DTV_STARTED;
1918 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
1922 static int ShutDown(struct drxk_state *state)
1930 static int GetLockStatus(struct drxk_state *state, u32 *pLockStatus,
1933 int status = -EINVAL;
1937 if (pLockStatus == NULL)
1940 *pLockStatus = NOT_LOCKED;
1942 /* define the SCU command code */
1943 switch (state->m_OperationMode) {
1947 status = GetQAMLockStatus(state, pLockStatus);
1950 status = GetDVBTLockStatus(state, pLockStatus);
1957 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
1961 static int MPEGTSStart(struct drxk_state *state)
1965 u16 fecOcSncMode = 0;
1967 /* Allow OC to sync again */
1968 status = read16(state, FEC_OC_SNC_MODE__A, &fecOcSncMode);
1971 fecOcSncMode &= ~FEC_OC_SNC_MODE_SHUTDOWN__M;
1972 status = write16(state, FEC_OC_SNC_MODE__A, fecOcSncMode);
1975 status = write16(state, FEC_OC_SNC_UNLOCK__A, 1);
1978 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
1982 static int MPEGTSDtoInit(struct drxk_state *state)
1988 /* Rate integration settings */
1989 status = write16(state, FEC_OC_RCN_CTL_STEP_LO__A, 0x0000);
1992 status = write16(state, FEC_OC_RCN_CTL_STEP_HI__A, 0x000C);
1995 status = write16(state, FEC_OC_RCN_GAIN__A, 0x000A);
1998 status = write16(state, FEC_OC_AVR_PARM_A__A, 0x0008);
2001 status = write16(state, FEC_OC_AVR_PARM_B__A, 0x0006);
2004 status = write16(state, FEC_OC_TMD_HI_MARGIN__A, 0x0680);
2007 status = write16(state, FEC_OC_TMD_LO_MARGIN__A, 0x0080);
2010 status = write16(state, FEC_OC_TMD_COUNT__A, 0x03F4);
2014 /* Additional configuration */
2015 status = write16(state, FEC_OC_OCR_INVERT__A, 0);
2018 status = write16(state, FEC_OC_SNC_LWM__A, 2);
2021 status = write16(state, FEC_OC_SNC_HWM__A, 12);
2024 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
2029 static int MPEGTSDtoSetup(struct drxk_state *state,
2030 enum OperationMode oMode)
2034 u16 fecOcRegMode = 0; /* FEC_OC_MODE register value */
2035 u16 fecOcRegIprMode = 0; /* FEC_OC_IPR_MODE register value */
2036 u16 fecOcDtoMode = 0; /* FEC_OC_IPR_INVERT register value */
2037 u16 fecOcFctMode = 0; /* FEC_OC_IPR_INVERT register value */
2038 u16 fecOcDtoPeriod = 2; /* FEC_OC_IPR_INVERT register value */
2039 u16 fecOcDtoBurstLen = 188; /* FEC_OC_IPR_INVERT register value */
2040 u32 fecOcRcnCtlRate = 0; /* FEC_OC_IPR_INVERT register value */
2041 u16 fecOcTmdMode = 0;
2042 u16 fecOcTmdIntUpdRate = 0;
2044 bool staticCLK = false;
2048 /* Check insertion of the Reed-Solomon parity bytes */
2049 status = read16(state, FEC_OC_MODE__A, &fecOcRegMode);
2052 status = read16(state, FEC_OC_IPR_MODE__A, &fecOcRegIprMode);
2055 fecOcRegMode &= (~FEC_OC_MODE_PARITY__M);
2056 fecOcRegIprMode &= (~FEC_OC_IPR_MODE_MVAL_DIS_PAR__M);
2057 if (state->m_insertRSByte == true) {
2058 /* enable parity symbol forward */
2059 fecOcRegMode |= FEC_OC_MODE_PARITY__M;
2060 /* MVAL disable during parity bytes */
2061 fecOcRegIprMode |= FEC_OC_IPR_MODE_MVAL_DIS_PAR__M;
2062 /* TS burst length to 204 */
2063 fecOcDtoBurstLen = 204;
2066 /* Check serial or parrallel output */
2067 fecOcRegIprMode &= (~(FEC_OC_IPR_MODE_SERIAL__M));
2068 if (state->m_enableParallel == false) {
2069 /* MPEG data output is serial -> set ipr_mode[0] */
2070 fecOcRegIprMode |= FEC_OC_IPR_MODE_SERIAL__M;
2075 maxBitRate = state->m_DVBTBitrate;
2077 fecOcRcnCtlRate = 0xC00000;
2078 staticCLK = state->m_DVBTStaticCLK;
2080 case OM_QAM_ITU_A: /* fallthrough */
2082 fecOcTmdMode = 0x0004;
2083 fecOcRcnCtlRate = 0xD2B4EE; /* good for >63 Mb/s */
2084 maxBitRate = state->m_DVBCBitrate;
2085 staticCLK = state->m_DVBCStaticCLK;
2089 } /* switch (standard) */
2093 /* Configure DTO's */
2097 /* Rational DTO for MCLK source (static MCLK rate),
2098 Dynamic DTO for optimal grouping
2099 (avoid intra-packet gaps),
2100 DTO offset enable to sync TS burst with MSTRT */
2101 fecOcDtoMode = (FEC_OC_DTO_MODE_DYNAMIC__M |
2102 FEC_OC_DTO_MODE_OFFSET_ENABLE__M);
2103 fecOcFctMode = (FEC_OC_FCT_MODE_RAT_ENA__M |
2104 FEC_OC_FCT_MODE_VIRT_ENA__M);
2106 /* Check user defined bitrate */
2107 bitRate = maxBitRate;
2108 if (bitRate > 75900000UL) { /* max is 75.9 Mb/s */
2109 bitRate = 75900000UL;
2111 /* Rational DTO period:
2112 dto_period = (Fsys / bitrate) - 2
2114 Result should be floored,
2115 to make sure >= requested bitrate
2117 fecOcDtoPeriod = (u16) (((state->m_sysClockFreq)
2119 if (fecOcDtoPeriod <= 2)
2122 fecOcDtoPeriod -= 2;
2123 fecOcTmdIntUpdRate = 8;
2125 /* (commonAttr->staticCLK == false) => dynamic mode */
2126 fecOcDtoMode = FEC_OC_DTO_MODE_DYNAMIC__M;
2127 fecOcFctMode = FEC_OC_FCT_MODE__PRE;
2128 fecOcTmdIntUpdRate = 5;
2131 /* Write appropriate registers with requested configuration */
2132 status = write16(state, FEC_OC_DTO_BURST_LEN__A, fecOcDtoBurstLen);
2135 status = write16(state, FEC_OC_DTO_PERIOD__A, fecOcDtoPeriod);
2138 status = write16(state, FEC_OC_DTO_MODE__A, fecOcDtoMode);
2141 status = write16(state, FEC_OC_FCT_MODE__A, fecOcFctMode);
2144 status = write16(state, FEC_OC_MODE__A, fecOcRegMode);
2147 status = write16(state, FEC_OC_IPR_MODE__A, fecOcRegIprMode);
2151 /* Rate integration settings */
2152 status = write32(state, FEC_OC_RCN_CTL_RATE_LO__A, fecOcRcnCtlRate);
2155 status = write16(state, FEC_OC_TMD_INT_UPD_RATE__A, fecOcTmdIntUpdRate);
2158 status = write16(state, FEC_OC_TMD_MODE__A, fecOcTmdMode);
2161 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
2165 static int MPEGTSConfigurePolarity(struct drxk_state *state)
2167 u16 fecOcRegIprInvert = 0;
2169 /* Data mask for the output data byte */
2170 u16 InvertDataMask =
2171 FEC_OC_IPR_INVERT_MD7__M | FEC_OC_IPR_INVERT_MD6__M |
2172 FEC_OC_IPR_INVERT_MD5__M | FEC_OC_IPR_INVERT_MD4__M |
2173 FEC_OC_IPR_INVERT_MD3__M | FEC_OC_IPR_INVERT_MD2__M |
2174 FEC_OC_IPR_INVERT_MD1__M | FEC_OC_IPR_INVERT_MD0__M;
2178 /* Control selective inversion of output bits */
2179 fecOcRegIprInvert &= (~(InvertDataMask));
2180 if (state->m_invertDATA == true)
2181 fecOcRegIprInvert |= InvertDataMask;
2182 fecOcRegIprInvert &= (~(FEC_OC_IPR_INVERT_MERR__M));
2183 if (state->m_invertERR == true)
2184 fecOcRegIprInvert |= FEC_OC_IPR_INVERT_MERR__M;
2185 fecOcRegIprInvert &= (~(FEC_OC_IPR_INVERT_MSTRT__M));
2186 if (state->m_invertSTR == true)
2187 fecOcRegIprInvert |= FEC_OC_IPR_INVERT_MSTRT__M;
2188 fecOcRegIprInvert &= (~(FEC_OC_IPR_INVERT_MVAL__M));
2189 if (state->m_invertVAL == true)
2190 fecOcRegIprInvert |= FEC_OC_IPR_INVERT_MVAL__M;
2191 fecOcRegIprInvert &= (~(FEC_OC_IPR_INVERT_MCLK__M));
2192 if (state->m_invertCLK == true)
2193 fecOcRegIprInvert |= FEC_OC_IPR_INVERT_MCLK__M;
2195 return write16(state, FEC_OC_IPR_INVERT__A, fecOcRegIprInvert);
2198 #define SCU_RAM_AGC_KI_INV_RF_POL__M 0x4000
2200 static int SetAgcRf(struct drxk_state *state,
2201 struct SCfgAgc *pAgcCfg, bool isDTV)
2203 int status = -EINVAL;
2205 struct SCfgAgc *pIfAgcSettings;
2209 if (pAgcCfg == NULL)
2212 switch (pAgcCfg->ctrlMode) {
2213 case DRXK_AGC_CTRL_AUTO:
2214 /* Enable RF AGC DAC */
2215 status = read16(state, IQM_AF_STDBY__A, &data);
2218 data &= ~IQM_AF_STDBY_STDBY_TAGC_RF_STANDBY;
2219 status = write16(state, IQM_AF_STDBY__A, data);
2222 status = read16(state, SCU_RAM_AGC_CONFIG__A, &data);
2226 /* Enable SCU RF AGC loop */
2227 data &= ~SCU_RAM_AGC_CONFIG_DISABLE_RF_AGC__M;
2230 if (state->m_RfAgcPol)
2231 data |= SCU_RAM_AGC_CONFIG_INV_RF_POL__M;
2233 data &= ~SCU_RAM_AGC_CONFIG_INV_RF_POL__M;
2234 status = write16(state, SCU_RAM_AGC_CONFIG__A, data);
2238 /* Set speed (using complementary reduction value) */
2239 status = read16(state, SCU_RAM_AGC_KI_RED__A, &data);
2243 data &= ~SCU_RAM_AGC_KI_RED_RAGC_RED__M;
2244 data |= (~(pAgcCfg->speed <<
2245 SCU_RAM_AGC_KI_RED_RAGC_RED__B)
2246 & SCU_RAM_AGC_KI_RED_RAGC_RED__M);
2248 status = write16(state, SCU_RAM_AGC_KI_RED__A, data);
2253 pIfAgcSettings = &state->m_dvbtIfAgcCfg;
2254 else if (IsQAM(state))
2255 pIfAgcSettings = &state->m_qamIfAgcCfg;
2257 pIfAgcSettings = &state->m_atvIfAgcCfg;
2258 if (pIfAgcSettings == NULL) {
2263 /* Set TOP, only if IF-AGC is in AUTO mode */
2264 if (pIfAgcSettings->ctrlMode == DRXK_AGC_CTRL_AUTO)
2265 status = write16(state, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A, pAgcCfg->top);
2269 /* Cut-Off current */
2270 status = write16(state, SCU_RAM_AGC_RF_IACCU_HI_CO__A, pAgcCfg->cutOffCurrent);
2274 /* Max. output level */
2275 status = write16(state, SCU_RAM_AGC_RF_MAX__A, pAgcCfg->maxOutputLevel);
2281 case DRXK_AGC_CTRL_USER:
2282 /* Enable RF AGC DAC */
2283 status = read16(state, IQM_AF_STDBY__A, &data);
2286 data &= ~IQM_AF_STDBY_STDBY_TAGC_RF_STANDBY;
2287 status = write16(state, IQM_AF_STDBY__A, data);
2291 /* Disable SCU RF AGC loop */
2292 status = read16(state, SCU_RAM_AGC_CONFIG__A, &data);
2295 data |= SCU_RAM_AGC_CONFIG_DISABLE_RF_AGC__M;
2296 if (state->m_RfAgcPol)
2297 data |= SCU_RAM_AGC_CONFIG_INV_RF_POL__M;
2299 data &= ~SCU_RAM_AGC_CONFIG_INV_RF_POL__M;
2300 status = write16(state, SCU_RAM_AGC_CONFIG__A, data);
2304 /* SCU c.o.c. to 0, enabling full control range */
2305 status = write16(state, SCU_RAM_AGC_RF_IACCU_HI_CO__A, 0);
2309 /* Write value to output pin */
2310 status = write16(state, SCU_RAM_AGC_RF_IACCU_HI__A, pAgcCfg->outputLevel);
2315 case DRXK_AGC_CTRL_OFF:
2316 /* Disable RF AGC DAC */
2317 status = read16(state, IQM_AF_STDBY__A, &data);
2320 data |= IQM_AF_STDBY_STDBY_TAGC_RF_STANDBY;
2321 status = write16(state, IQM_AF_STDBY__A, data);
2325 /* Disable SCU RF AGC loop */
2326 status = read16(state, SCU_RAM_AGC_CONFIG__A, &data);
2329 data |= SCU_RAM_AGC_CONFIG_DISABLE_RF_AGC__M;
2330 status = write16(state, SCU_RAM_AGC_CONFIG__A, data);
2341 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
2345 #define SCU_RAM_AGC_KI_INV_IF_POL__M 0x2000
2347 static int SetAgcIf(struct drxk_state *state,
2348 struct SCfgAgc *pAgcCfg, bool isDTV)
2352 struct SCfgAgc *pRfAgcSettings;
2356 switch (pAgcCfg->ctrlMode) {
2357 case DRXK_AGC_CTRL_AUTO:
2359 /* Enable IF AGC DAC */
2360 status = read16(state, IQM_AF_STDBY__A, &data);
2363 data &= ~IQM_AF_STDBY_STDBY_TAGC_IF_STANDBY;
2364 status = write16(state, IQM_AF_STDBY__A, data);
2368 status = read16(state, SCU_RAM_AGC_CONFIG__A, &data);
2372 /* Enable SCU IF AGC loop */
2373 data &= ~SCU_RAM_AGC_CONFIG_DISABLE_IF_AGC__M;
2376 if (state->m_IfAgcPol)
2377 data |= SCU_RAM_AGC_CONFIG_INV_IF_POL__M;
2379 data &= ~SCU_RAM_AGC_CONFIG_INV_IF_POL__M;
2380 status = write16(state, SCU_RAM_AGC_CONFIG__A, data);
2384 /* Set speed (using complementary reduction value) */
2385 status = read16(state, SCU_RAM_AGC_KI_RED__A, &data);
2388 data &= ~SCU_RAM_AGC_KI_RED_IAGC_RED__M;
2389 data |= (~(pAgcCfg->speed <<
2390 SCU_RAM_AGC_KI_RED_IAGC_RED__B)
2391 & SCU_RAM_AGC_KI_RED_IAGC_RED__M);
2393 status = write16(state, SCU_RAM_AGC_KI_RED__A, data);
2398 pRfAgcSettings = &state->m_qamRfAgcCfg;
2400 pRfAgcSettings = &state->m_atvRfAgcCfg;
2401 if (pRfAgcSettings == NULL)
2404 status = write16(state, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A, pRfAgcSettings->top);
2409 case DRXK_AGC_CTRL_USER:
2411 /* Enable IF AGC DAC */
2412 status = read16(state, IQM_AF_STDBY__A, &data);
2415 data &= ~IQM_AF_STDBY_STDBY_TAGC_IF_STANDBY;
2416 status = write16(state, IQM_AF_STDBY__A, data);
2420 status = read16(state, SCU_RAM_AGC_CONFIG__A, &data);
2424 /* Disable SCU IF AGC loop */
2425 data |= SCU_RAM_AGC_CONFIG_DISABLE_IF_AGC__M;
2428 if (state->m_IfAgcPol)
2429 data |= SCU_RAM_AGC_CONFIG_INV_IF_POL__M;
2431 data &= ~SCU_RAM_AGC_CONFIG_INV_IF_POL__M;
2432 status = write16(state, SCU_RAM_AGC_CONFIG__A, data);
2436 /* Write value to output pin */
2437 status = write16(state, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A, pAgcCfg->outputLevel);
2442 case DRXK_AGC_CTRL_OFF:
2444 /* Disable If AGC DAC */
2445 status = read16(state, IQM_AF_STDBY__A, &data);
2448 data |= IQM_AF_STDBY_STDBY_TAGC_IF_STANDBY;
2449 status = write16(state, IQM_AF_STDBY__A, data);
2453 /* Disable SCU IF AGC loop */
2454 status = read16(state, SCU_RAM_AGC_CONFIG__A, &data);
2457 data |= SCU_RAM_AGC_CONFIG_DISABLE_IF_AGC__M;
2458 status = write16(state, SCU_RAM_AGC_CONFIG__A, data);
2462 } /* switch (agcSettingsIf->ctrlMode) */
2464 /* always set the top to support
2465 configurations without if-loop */
2466 status = write16(state, SCU_RAM_AGC_INGAIN_TGT_MIN__A, pAgcCfg->top);
2469 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
2473 static int ReadIFAgc(struct drxk_state *state, u32 *pValue)
2481 status = read16(state, IQM_AF_AGC_IF__A, &agcDacLvl);
2483 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
2489 if (agcDacLvl > DRXK_AGC_DAC_OFFSET)
2490 Level = agcDacLvl - DRXK_AGC_DAC_OFFSET;
2492 *pValue = (14000 - Level) / 4;
2499 static int GetQAMSignalToNoise(struct drxk_state *state,
2500 s32 *pSignalToNoise)
2503 u16 qamSlErrPower = 0; /* accum. error between
2504 raw and sliced symbols */
2505 u32 qamSlSigPower = 0; /* used for MER, depends of
2507 u32 qamSlMer = 0; /* QAM MER */
2511 /* MER calculation */
2513 /* get the register value needed for MER */
2514 status = read16(state, QAM_SL_ERR_POWER__A, &qamSlErrPower);
2516 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
2520 switch (state->props.modulation) {
2522 qamSlSigPower = DRXK_QAM_SL_SIG_POWER_QAM16 << 2;
2525 qamSlSigPower = DRXK_QAM_SL_SIG_POWER_QAM32 << 2;
2528 qamSlSigPower = DRXK_QAM_SL_SIG_POWER_QAM64 << 2;
2531 qamSlSigPower = DRXK_QAM_SL_SIG_POWER_QAM128 << 2;
2535 qamSlSigPower = DRXK_QAM_SL_SIG_POWER_QAM256 << 2;
2539 if (qamSlErrPower > 0) {
2540 qamSlMer = Log10Times100(qamSlSigPower) -
2541 Log10Times100((u32) qamSlErrPower);
2543 *pSignalToNoise = qamSlMer;
2548 static int GetDVBTSignalToNoise(struct drxk_state *state,
2549 s32 *pSignalToNoise)
2553 u32 EqRegTdSqrErrI = 0;
2554 u32 EqRegTdSqrErrQ = 0;
2555 u16 EqRegTdSqrErrExp = 0;
2556 u16 EqRegTdTpsPwrOfs = 0;
2557 u16 EqRegTdReqSmbCnt = 0;
2564 u16 transmissionParams = 0;
2568 status = read16(state, OFDM_EQ_TOP_TD_TPS_PWR_OFS__A, &EqRegTdTpsPwrOfs);
2571 status = read16(state, OFDM_EQ_TOP_TD_REQ_SMB_CNT__A, &EqRegTdReqSmbCnt);
2574 status = read16(state, OFDM_EQ_TOP_TD_SQR_ERR_EXP__A, &EqRegTdSqrErrExp);
2577 status = read16(state, OFDM_EQ_TOP_TD_SQR_ERR_I__A, ®Data);
2580 /* Extend SQR_ERR_I operational range */
2581 EqRegTdSqrErrI = (u32) regData;
2582 if ((EqRegTdSqrErrExp > 11) &&
2583 (EqRegTdSqrErrI < 0x00000FFFUL)) {
2584 EqRegTdSqrErrI += 0x00010000UL;
2586 status = read16(state, OFDM_EQ_TOP_TD_SQR_ERR_Q__A, ®Data);
2589 /* Extend SQR_ERR_Q operational range */
2590 EqRegTdSqrErrQ = (u32) regData;
2591 if ((EqRegTdSqrErrExp > 11) &&
2592 (EqRegTdSqrErrQ < 0x00000FFFUL))
2593 EqRegTdSqrErrQ += 0x00010000UL;
2595 status = read16(state, OFDM_SC_RA_RAM_OP_PARAM__A, &transmissionParams);
2599 /* Check input data for MER */
2601 /* MER calculation (in 0.1 dB) without math.h */
2602 if ((EqRegTdTpsPwrOfs == 0) || (EqRegTdReqSmbCnt == 0))
2604 else if ((EqRegTdSqrErrI + EqRegTdSqrErrQ) == 0) {
2605 /* No error at all, this must be the HW reset value
2606 * Apparently no first measurement yet
2610 SqrErrIQ = (EqRegTdSqrErrI + EqRegTdSqrErrQ) <<
2612 if ((transmissionParams &
2613 OFDM_SC_RA_RAM_OP_PARAM_MODE__M)
2614 == OFDM_SC_RA_RAM_OP_PARAM_MODE_2K)
2619 /* IMER = 100 * log10 (x)
2620 where x = (EqRegTdTpsPwrOfs^2 *
2621 EqRegTdReqSmbCnt * tpsCnt)/SqrErrIQ
2624 where a = 100 * log10 (EqRegTdTpsPwrOfs^2)
2625 b = 100 * log10 (EqRegTdReqSmbCnt * tpsCnt)
2626 c = 100 * log10 (SqrErrIQ)
2629 /* log(x) x = 9bits * 9bits->18 bits */
2630 a = Log10Times100(EqRegTdTpsPwrOfs *
2632 /* log(x) x = 16bits * 7bits->23 bits */
2633 b = Log10Times100(EqRegTdReqSmbCnt * tpsCnt);
2634 /* log(x) x = (16bits + 16bits) << 15 ->32 bits */
2635 c = Log10Times100(SqrErrIQ);
2638 /* No negative MER, clip to zero */
2644 *pSignalToNoise = iMER;
2648 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
2652 static int GetSignalToNoise(struct drxk_state *state, s32 *pSignalToNoise)
2656 *pSignalToNoise = 0;
2657 switch (state->m_OperationMode) {
2659 return GetDVBTSignalToNoise(state, pSignalToNoise);
2662 return GetQAMSignalToNoise(state, pSignalToNoise);
2670 static int GetDVBTQuality(struct drxk_state *state, s32 *pQuality)
2672 /* SNR Values for quasi errorfree reception rom Nordig 2.2 */
2677 static s32 QE_SN[] = {
2683 108, /* 16-QAM 1/2 */
2684 131, /* 16-QAM 2/3 */
2685 146, /* 16-QAM 3/4 */
2686 156, /* 16-QAM 5/6 */
2687 160, /* 16-QAM 7/8 */
2688 165, /* 64-QAM 1/2 */
2689 187, /* 64-QAM 2/3 */
2690 202, /* 64-QAM 3/4 */
2691 216, /* 64-QAM 5/6 */
2692 225, /* 64-QAM 7/8 */
2698 s32 SignalToNoise = 0;
2699 u16 Constellation = 0;
2701 u32 SignalToNoiseRel;
2704 status = GetDVBTSignalToNoise(state, &SignalToNoise);
2707 status = read16(state, OFDM_EQ_TOP_TD_TPS_CONST__A, &Constellation);
2710 Constellation &= OFDM_EQ_TOP_TD_TPS_CONST__M;
2712 status = read16(state, OFDM_EQ_TOP_TD_TPS_CODE_HP__A, &CodeRate);
2715 CodeRate &= OFDM_EQ_TOP_TD_TPS_CODE_HP__M;
2717 if (Constellation > OFDM_EQ_TOP_TD_TPS_CONST_64QAM ||
2718 CodeRate > OFDM_EQ_TOP_TD_TPS_CODE_LP_7_8)
2720 SignalToNoiseRel = SignalToNoise -
2721 QE_SN[Constellation * 5 + CodeRate];
2724 if (SignalToNoiseRel < -70)
2726 else if (SignalToNoiseRel < 30)
2727 *pQuality = ((SignalToNoiseRel + 70) *
2730 *pQuality = BERQuality;
2735 static int GetDVBCQuality(struct drxk_state *state, s32 *pQuality)
2743 u32 SignalToNoise = 0;
2744 u32 BERQuality = 100;
2745 u32 SignalToNoiseRel = 0;
2747 status = GetQAMSignalToNoise(state, &SignalToNoise);
2751 switch (state->props.modulation) {
2753 SignalToNoiseRel = SignalToNoise - 200;
2756 SignalToNoiseRel = SignalToNoise - 230;
2757 break; /* Not in NorDig */
2759 SignalToNoiseRel = SignalToNoise - 260;
2762 SignalToNoiseRel = SignalToNoise - 290;
2766 SignalToNoiseRel = SignalToNoise - 320;
2770 if (SignalToNoiseRel < -70)
2772 else if (SignalToNoiseRel < 30)
2773 *pQuality = ((SignalToNoiseRel + 70) *
2776 *pQuality = BERQuality;
2782 static int GetQuality(struct drxk_state *state, s32 *pQuality)
2786 switch (state->m_OperationMode) {
2788 return GetDVBTQuality(state, pQuality);
2790 return GetDVBCQuality(state, pQuality);
2799 /* Free data ram in SIO HI */
2800 #define SIO_HI_RA_RAM_USR_BEGIN__A 0x420040
2801 #define SIO_HI_RA_RAM_USR_END__A 0x420060
2803 #define DRXK_HI_ATOMIC_BUF_START (SIO_HI_RA_RAM_USR_BEGIN__A)
2804 #define DRXK_HI_ATOMIC_BUF_END (SIO_HI_RA_RAM_USR_BEGIN__A + 7)
2805 #define DRXK_HI_ATOMIC_READ SIO_HI_RA_RAM_PAR_3_ACP_RW_READ
2806 #define DRXK_HI_ATOMIC_WRITE SIO_HI_RA_RAM_PAR_3_ACP_RW_WRITE
2808 #define DRXDAP_FASI_ADDR2BLOCK(addr) (((addr) >> 22) & 0x3F)
2809 #define DRXDAP_FASI_ADDR2BANK(addr) (((addr) >> 16) & 0x3F)
2810 #define DRXDAP_FASI_ADDR2OFFSET(addr) ((addr) & 0x7FFF)
2812 static int ConfigureI2CBridge(struct drxk_state *state, bool bEnableBridge)
2814 int status = -EINVAL;
2818 if (state->m_DrxkState == DRXK_UNINITIALIZED)
2820 if (state->m_DrxkState == DRXK_POWERED_DOWN)
2823 if (state->no_i2c_bridge)
2826 status = write16(state, SIO_HI_RA_RAM_PAR_1__A, SIO_HI_RA_RAM_PAR_1_PAR1_SEC_KEY);
2829 if (bEnableBridge) {
2830 status = write16(state, SIO_HI_RA_RAM_PAR_2__A, SIO_HI_RA_RAM_PAR_2_BRD_CFG_CLOSED);
2834 status = write16(state, SIO_HI_RA_RAM_PAR_2__A, SIO_HI_RA_RAM_PAR_2_BRD_CFG_OPEN);
2839 status = HI_Command(state, SIO_HI_RA_RAM_CMD_BRDCTRL, 0);
2843 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
2847 static int SetPreSaw(struct drxk_state *state,
2848 struct SCfgPreSaw *pPreSawCfg)
2850 int status = -EINVAL;
2854 if ((pPreSawCfg == NULL)
2855 || (pPreSawCfg->reference > IQM_AF_PDREF__M))
2858 status = write16(state, IQM_AF_PDREF__A, pPreSawCfg->reference);
2861 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
2865 static int BLDirectCmd(struct drxk_state *state, u32 targetAddr,
2866 u16 romOffset, u16 nrOfElements, u32 timeOut)
2869 u16 offset = (u16) ((targetAddr >> 0) & 0x00FFFF);
2870 u16 blockbank = (u16) ((targetAddr >> 16) & 0x000FFF);
2876 mutex_lock(&state->mutex);
2877 status = write16(state, SIO_BL_MODE__A, SIO_BL_MODE_DIRECT);
2880 status = write16(state, SIO_BL_TGT_HDR__A, blockbank);
2883 status = write16(state, SIO_BL_TGT_ADDR__A, offset);
2886 status = write16(state, SIO_BL_SRC_ADDR__A, romOffset);
2889 status = write16(state, SIO_BL_SRC_LEN__A, nrOfElements);
2892 status = write16(state, SIO_BL_ENABLE__A, SIO_BL_ENABLE_ON);
2896 end = jiffies + msecs_to_jiffies(timeOut);
2898 status = read16(state, SIO_BL_STATUS__A, &blStatus);
2901 } while ((blStatus == 0x1) && time_is_after_jiffies(end));
2902 if (blStatus == 0x1) {
2903 printk(KERN_ERR "drxk: SIO not ready\n");
2909 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
2911 mutex_unlock(&state->mutex);
2916 static int ADCSyncMeasurement(struct drxk_state *state, u16 *count)
2923 /* Start measurement */
2924 status = write16(state, IQM_AF_COMM_EXEC__A, IQM_AF_COMM_EXEC_ACTIVE);
2927 status = write16(state, IQM_AF_START_LOCK__A, 1);
2932 status = read16(state, IQM_AF_PHASE0__A, &data);
2936 *count = *count + 1;
2937 status = read16(state, IQM_AF_PHASE1__A, &data);
2941 *count = *count + 1;
2942 status = read16(state, IQM_AF_PHASE2__A, &data);
2946 *count = *count + 1;
2950 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
2954 static int ADCSynchronization(struct drxk_state *state)
2961 status = ADCSyncMeasurement(state, &count);
2966 /* Try sampling on a diffrent edge */
2969 status = read16(state, IQM_AF_CLKNEG__A, &clkNeg);
2972 if ((clkNeg | IQM_AF_CLKNEG_CLKNEGDATA__M) ==
2973 IQM_AF_CLKNEG_CLKNEGDATA_CLK_ADC_DATA_POS) {
2974 clkNeg &= (~(IQM_AF_CLKNEG_CLKNEGDATA__M));
2976 IQM_AF_CLKNEG_CLKNEGDATA_CLK_ADC_DATA_NEG;
2978 clkNeg &= (~(IQM_AF_CLKNEG_CLKNEGDATA__M));
2980 IQM_AF_CLKNEG_CLKNEGDATA_CLK_ADC_DATA_POS;
2982 status = write16(state, IQM_AF_CLKNEG__A, clkNeg);
2985 status = ADCSyncMeasurement(state, &count);
2994 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
2998 static int SetFrequencyShifter(struct drxk_state *state,
2999 u16 intermediateFreqkHz,
3000 s32 tunerFreqOffset, bool isDTV)
3002 bool selectPosImage = false;
3003 u32 rfFreqResidual = tunerFreqOffset;
3004 u32 fmFrequencyShift = 0;
3005 bool tunerMirror = !state->m_bMirrorFreqSpect;
3010 u32 samplingFrequency = (u32) (state->m_sysClockFreq / 3);
3017 Program frequency shifter
3018 No need to account for mirroring on RF
3021 if ((state->m_OperationMode == OM_QAM_ITU_A) ||
3022 (state->m_OperationMode == OM_QAM_ITU_C) ||
3023 (state->m_OperationMode == OM_DVBT))
3024 selectPosImage = true;
3026 selectPosImage = false;
3029 /* tuner doesn't mirror */
3030 ifFreqActual = intermediateFreqkHz +
3031 rfFreqResidual + fmFrequencyShift;
3034 ifFreqActual = intermediateFreqkHz -
3035 rfFreqResidual - fmFrequencyShift;
3036 if (ifFreqActual > samplingFrequency / 2) {
3038 adcFreq = samplingFrequency - ifFreqActual;
3041 /* adc doesn't mirror */
3042 adcFreq = ifFreqActual;
3046 frequencyShift = adcFreq;
3047 imageToSelect = state->m_rfmirror ^ tunerMirror ^
3048 adcFlip ^ selectPosImage;
3049 state->m_IqmFsRateOfs =
3050 Frac28a((frequencyShift), samplingFrequency);
3053 state->m_IqmFsRateOfs = ~state->m_IqmFsRateOfs + 1;
3055 /* Program frequency shifter with tuner offset compensation */
3056 /* frequencyShift += tunerFreqOffset; TODO */
3057 status = write32(state, IQM_FS_RATE_OFS_LO__A,
3058 state->m_IqmFsRateOfs);
3060 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
3064 static int InitAGC(struct drxk_state *state, bool isDTV)
3067 u16 ingainTgtMin = 0;
3068 u16 ingainTgtMax = 0;
3076 u16 kiInnergainMin = 0;
3077 u16 ifIaccuHiTgt = 0;
3078 u16 ifIaccuHiTgtMin = 0;
3079 u16 ifIaccuHiTgtMax = 0;
3081 u16 fastClpCtrlDelay = 0;
3082 u16 clpCtrlMode = 0;
3087 /* Common settings */
3089 ifIaccuHiTgtMin = 2047;
3093 /* AGCInit() not available for DVBT; init done in microcode */
3094 if (!IsQAM(state)) {
3095 printk(KERN_ERR "drxk: %s: mode %d is not DVB-C\n", __func__, state->m_OperationMode);
3099 /* FIXME: Analog TV AGC require different settings */
3101 /* Standard specific settings */
3103 clpDirTo = (u16) -9;
3106 snsDirTo = (u16) -9;
3107 kiInnergainMin = (u16) -1030;
3108 ifIaccuHiTgtMax = 0x2380;
3109 ifIaccuHiTgt = 0x2380;
3110 ingainTgtMin = 0x0511;
3112 ingainTgtMax = 5119;
3113 fastClpCtrlDelay = state->m_qamIfAgcCfg.FastClipCtrlDelay;
3115 status = write16(state, SCU_RAM_AGC_FAST_CLP_CTRL_DELAY__A, fastClpCtrlDelay);
3119 status = write16(state, SCU_RAM_AGC_CLP_CTRL_MODE__A, clpCtrlMode);
3122 status = write16(state, SCU_RAM_AGC_INGAIN_TGT__A, ingainTgt);
3125 status = write16(state, SCU_RAM_AGC_INGAIN_TGT_MIN__A, ingainTgtMin);
3128 status = write16(state, SCU_RAM_AGC_INGAIN_TGT_MAX__A, ingainTgtMax);
3131 status = write16(state, SCU_RAM_AGC_IF_IACCU_HI_TGT_MIN__A, ifIaccuHiTgtMin);
3134 status = write16(state, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A, ifIaccuHiTgtMax);
3137 status = write16(state, SCU_RAM_AGC_IF_IACCU_HI__A, 0);
3140 status = write16(state, SCU_RAM_AGC_IF_IACCU_LO__A, 0);
3143 status = write16(state, SCU_RAM_AGC_RF_IACCU_HI__A, 0);
3146 status = write16(state, SCU_RAM_AGC_RF_IACCU_LO__A, 0);
3149 status = write16(state, SCU_RAM_AGC_CLP_SUM_MAX__A, clpSumMax);
3152 status = write16(state, SCU_RAM_AGC_SNS_SUM_MAX__A, snsSumMax);
3156 status = write16(state, SCU_RAM_AGC_KI_INNERGAIN_MIN__A, kiInnergainMin);
3159 status = write16(state, SCU_RAM_AGC_IF_IACCU_HI_TGT__A, ifIaccuHiTgt);
3162 status = write16(state, SCU_RAM_AGC_CLP_CYCLEN__A, clpCyclen);
3166 status = write16(state, SCU_RAM_AGC_RF_SNS_DEV_MAX__A, 1023);
3169 status = write16(state, SCU_RAM_AGC_RF_SNS_DEV_MIN__A, (u16) -1023);
3172 status = write16(state, SCU_RAM_AGC_FAST_SNS_CTRL_DELAY__A, 50);
3176 status = write16(state, SCU_RAM_AGC_KI_MAXMINGAIN_TH__A, 20);
3179 status = write16(state, SCU_RAM_AGC_CLP_SUM_MIN__A, clpSumMin);
3182 status = write16(state, SCU_RAM_AGC_SNS_SUM_MIN__A, snsSumMin);
3185 status = write16(state, SCU_RAM_AGC_CLP_DIR_TO__A, clpDirTo);
3188 status = write16(state, SCU_RAM_AGC_SNS_DIR_TO__A, snsDirTo);
3191 status = write16(state, SCU_RAM_AGC_KI_MINGAIN__A, 0x7fff);
3194 status = write16(state, SCU_RAM_AGC_KI_MAXGAIN__A, 0x0);
3197 status = write16(state, SCU_RAM_AGC_KI_MIN__A, 0x0117);
3200 status = write16(state, SCU_RAM_AGC_KI_MAX__A, 0x0657);
3203 status = write16(state, SCU_RAM_AGC_CLP_SUM__A, 0);
3206 status = write16(state, SCU_RAM_AGC_CLP_CYCCNT__A, 0);
3209 status = write16(state, SCU_RAM_AGC_CLP_DIR_WD__A, 0);
3212 status = write16(state, SCU_RAM_AGC_CLP_DIR_STP__A, 1);
3215 status = write16(state, SCU_RAM_AGC_SNS_SUM__A, 0);
3218 status = write16(state, SCU_RAM_AGC_SNS_CYCCNT__A, 0);
3221 status = write16(state, SCU_RAM_AGC_SNS_DIR_WD__A, 0);
3224 status = write16(state, SCU_RAM_AGC_SNS_DIR_STP__A, 1);
3227 status = write16(state, SCU_RAM_AGC_SNS_CYCLEN__A, 500);
3230 status = write16(state, SCU_RAM_AGC_KI_CYCLEN__A, 500);
3234 /* Initialize inner-loop KI gain factors */
3235 status = read16(state, SCU_RAM_AGC_KI__A, &data);
3240 data &= ~SCU_RAM_AGC_KI_RF__M;
3241 data |= (DRXK_KI_RAGC_QAM << SCU_RAM_AGC_KI_RF__B);
3242 data &= ~SCU_RAM_AGC_KI_IF__M;
3243 data |= (DRXK_KI_IAGC_QAM << SCU_RAM_AGC_KI_IF__B);
3245 status = write16(state, SCU_RAM_AGC_KI__A, data);
3248 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
3252 static int DVBTQAMGetAccPktErr(struct drxk_state *state, u16 *packetErr)
3257 if (packetErr == NULL)
3258 status = write16(state, SCU_RAM_FEC_ACCUM_PKT_FAILURES__A, 0);
3260 status = read16(state, SCU_RAM_FEC_ACCUM_PKT_FAILURES__A, packetErr);
3262 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
3266 static int DVBTScCommand(struct drxk_state *state,
3267 u16 cmd, u16 subcmd,
3268 u16 param0, u16 param1, u16 param2,
3269 u16 param3, u16 param4)
3278 status = read16(state, OFDM_SC_COMM_EXEC__A, &scExec);
3280 /* SC is not running */
3286 /* Wait until sc is ready to receive command */
3290 status = read16(state, OFDM_SC_RA_RAM_CMD__A, &curCmd);
3292 } while ((curCmd != 0) && (retryCnt < DRXK_MAX_RETRIES));
3293 if (retryCnt >= DRXK_MAX_RETRIES && (status < 0))
3296 /* Write sub-command */
3298 /* All commands using sub-cmd */
3299 case OFDM_SC_RA_RAM_CMD_PROC_START:
3300 case OFDM_SC_RA_RAM_CMD_SET_PREF_PARAM:
3301 case OFDM_SC_RA_RAM_CMD_PROGRAM_PARAM:
3302 status = write16(state, OFDM_SC_RA_RAM_CMD_ADDR__A, subcmd);
3311 /* Write needed parameters and the command */
3313 /* All commands using 5 parameters */
3314 /* All commands using 4 parameters */
3315 /* All commands using 3 parameters */
3316 /* All commands using 2 parameters */
3317 case OFDM_SC_RA_RAM_CMD_PROC_START:
3318 case OFDM_SC_RA_RAM_CMD_SET_PREF_PARAM:
3319 case OFDM_SC_RA_RAM_CMD_PROGRAM_PARAM:
3320 status = write16(state, OFDM_SC_RA_RAM_PARAM1__A, param1);
3321 /* All commands using 1 parameters */
3322 case OFDM_SC_RA_RAM_CMD_SET_ECHO_TIMING:
3323 case OFDM_SC_RA_RAM_CMD_USER_IO:
3324 status = write16(state, OFDM_SC_RA_RAM_PARAM0__A, param0);
3325 /* All commands using 0 parameters */
3326 case OFDM_SC_RA_RAM_CMD_GET_OP_PARAM:
3327 case OFDM_SC_RA_RAM_CMD_NULL:
3329 status = write16(state, OFDM_SC_RA_RAM_CMD__A, cmd);
3332 /* Unknown command */
3338 /* Wait until sc is ready processing command */
3342 status = read16(state, OFDM_SC_RA_RAM_CMD__A, &curCmd);
3344 } while ((curCmd != 0) && (retryCnt < DRXK_MAX_RETRIES));
3345 if (retryCnt >= DRXK_MAX_RETRIES && (status < 0))
3348 /* Check for illegal cmd */
3349 status = read16(state, OFDM_SC_RA_RAM_CMD_ADDR__A, &errCode);
3350 if (errCode == 0xFFFF) {
3351 /* illegal command */
3357 /* Retreive results parameters from SC */
3359 /* All commands yielding 5 results */
3360 /* All commands yielding 4 results */
3361 /* All commands yielding 3 results */
3362 /* All commands yielding 2 results */
3363 /* All commands yielding 1 result */
3364 case OFDM_SC_RA_RAM_CMD_USER_IO:
3365 case OFDM_SC_RA_RAM_CMD_GET_OP_PARAM:
3366 status = read16(state, OFDM_SC_RA_RAM_PARAM0__A, &(param0));
3367 /* All commands yielding 0 results */
3368 case OFDM_SC_RA_RAM_CMD_SET_ECHO_TIMING:
3369 case OFDM_SC_RA_RAM_CMD_SET_TIMER:
3370 case OFDM_SC_RA_RAM_CMD_PROC_START:
3371 case OFDM_SC_RA_RAM_CMD_SET_PREF_PARAM:
3372 case OFDM_SC_RA_RAM_CMD_PROGRAM_PARAM:
3373 case OFDM_SC_RA_RAM_CMD_NULL:
3376 /* Unknown command */
3379 } /* switch (cmd->cmd) */
3382 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
3386 static int PowerUpDVBT(struct drxk_state *state)
3388 enum DRXPowerMode powerMode = DRX_POWER_UP;
3392 status = CtrlPowerMode(state, &powerMode);
3394 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
3398 static int DVBTCtrlSetIncEnable(struct drxk_state *state, bool *enabled)
3403 if (*enabled == true)
3404 status = write16(state, IQM_CF_BYPASSDET__A, 0);
3406 status = write16(state, IQM_CF_BYPASSDET__A, 1);
3408 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
3412 #define DEFAULT_FR_THRES_8K 4000
3413 static int DVBTCtrlSetFrEnable(struct drxk_state *state, bool *enabled)
3419 if (*enabled == true) {
3420 /* write mask to 1 */
3421 status = write16(state, OFDM_SC_RA_RAM_FR_THRES_8K__A,
3422 DEFAULT_FR_THRES_8K);
3424 /* write mask to 0 */
3425 status = write16(state, OFDM_SC_RA_RAM_FR_THRES_8K__A, 0);
3428 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
3433 static int DVBTCtrlSetEchoThreshold(struct drxk_state *state,
3434 struct DRXKCfgDvbtEchoThres_t *echoThres)
3440 status = read16(state, OFDM_SC_RA_RAM_ECHO_THRES__A, &data);
3444 switch (echoThres->fftMode) {
3445 case DRX_FFTMODE_2K:
3446 data &= ~OFDM_SC_RA_RAM_ECHO_THRES_2K__M;
3447 data |= ((echoThres->threshold <<
3448 OFDM_SC_RA_RAM_ECHO_THRES_2K__B)
3449 & (OFDM_SC_RA_RAM_ECHO_THRES_2K__M));
3451 case DRX_FFTMODE_8K:
3452 data &= ~OFDM_SC_RA_RAM_ECHO_THRES_8K__M;
3453 data |= ((echoThres->threshold <<
3454 OFDM_SC_RA_RAM_ECHO_THRES_8K__B)
3455 & (OFDM_SC_RA_RAM_ECHO_THRES_8K__M));
3461 status = write16(state, OFDM_SC_RA_RAM_ECHO_THRES__A, data);
3464 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
3468 static int DVBTCtrlSetSqiSpeed(struct drxk_state *state,
3469 enum DRXKCfgDvbtSqiSpeed *speed)
3471 int status = -EINVAL;
3476 case DRXK_DVBT_SQI_SPEED_FAST:
3477 case DRXK_DVBT_SQI_SPEED_MEDIUM:
3478 case DRXK_DVBT_SQI_SPEED_SLOW:
3483 status = write16(state, SCU_RAM_FEC_PRE_RS_BER_FILTER_SH__A,
3487 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
3491 /*============================================================================*/
3494 * \brief Activate DVBT specific presets
3495 * \param demod instance of demodulator.
3496 * \return DRXStatus_t.
3498 * Called in DVBTSetStandard
3501 static int DVBTActivatePresets(struct drxk_state *state)
3504 bool setincenable = false;
3505 bool setfrenable = true;
3507 struct DRXKCfgDvbtEchoThres_t echoThres2k = { 0, DRX_FFTMODE_2K };
3508 struct DRXKCfgDvbtEchoThres_t echoThres8k = { 0, DRX_FFTMODE_8K };
3511 status = DVBTCtrlSetIncEnable(state, &setincenable);
3514 status = DVBTCtrlSetFrEnable(state, &setfrenable);
3517 status = DVBTCtrlSetEchoThreshold(state, &echoThres2k);
3520 status = DVBTCtrlSetEchoThreshold(state, &echoThres8k);
3523 status = write16(state, SCU_RAM_AGC_INGAIN_TGT_MAX__A, state->m_dvbtIfAgcCfg.IngainTgtMax);
3526 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
3530 /*============================================================================*/
3533 * \brief Initialize channelswitch-independent settings for DVBT.
3534 * \param demod instance of demodulator.
3535 * \return DRXStatus_t.
3537 * For ROM code channel filter taps are loaded from the bootloader. For microcode
3538 * the DVB-T taps from the drxk_filters.h are used.
3540 static int SetDVBTStandard(struct drxk_state *state,
3541 enum OperationMode oMode)
3550 /* added antenna switch */
3551 SwitchAntennaToDVBT(state);
3552 /* send OFDM reset command */
3553 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_OFDM | SCU_RAM_COMMAND_CMD_DEMOD_RESET, 0, NULL, 1, &cmdResult);
3557 /* send OFDM setenv command */
3558 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_OFDM | SCU_RAM_COMMAND_CMD_DEMOD_SET_ENV, 0, NULL, 1, &cmdResult);
3562 /* reset datapath for OFDM, processors first */
3563 status = write16(state, OFDM_SC_COMM_EXEC__A, OFDM_SC_COMM_EXEC_STOP);
3566 status = write16(state, OFDM_LC_COMM_EXEC__A, OFDM_LC_COMM_EXEC_STOP);
3569 status = write16(state, IQM_COMM_EXEC__A, IQM_COMM_EXEC_B_STOP);
3574 /* synchronize on ofdstate->m_festart */
3575 status = write16(state, IQM_AF_UPD_SEL__A, 1);
3578 /* window size for clipping ADC detection */
3579 status = write16(state, IQM_AF_CLP_LEN__A, 0);
3582 /* window size for for sense pre-SAW detection */
3583 status = write16(state, IQM_AF_SNS_LEN__A, 0);
3586 /* sense threshold for sense pre-SAW detection */
3587 status = write16(state, IQM_AF_AMUX__A, IQM_AF_AMUX_SIGNAL2ADC);
3590 status = SetIqmAf(state, true);
3594 status = write16(state, IQM_AF_AGC_RF__A, 0);
3598 /* Impulse noise cruncher setup */
3599 status = write16(state, IQM_AF_INC_LCT__A, 0); /* crunch in IQM_CF */
3602 status = write16(state, IQM_CF_DET_LCT__A, 0); /* detect in IQM_CF */
3605 status = write16(state, IQM_CF_WND_LEN__A, 3); /* peak detector window length */
3609 status = write16(state, IQM_RC_STRETCH__A, 16);
3612 status = write16(state, IQM_CF_OUT_ENA__A, 0x4); /* enable output 2 */
3615 status = write16(state, IQM_CF_DS_ENA__A, 0x4); /* decimate output 2 */
3618 status = write16(state, IQM_CF_SCALE__A, 1600);
3621 status = write16(state, IQM_CF_SCALE_SH__A, 0);
3625 /* virtual clipping threshold for clipping ADC detection */
3626 status = write16(state, IQM_AF_CLP_TH__A, 448);
3629 status = write16(state, IQM_CF_DATATH__A, 495); /* crunching threshold */
3633 status = BLChainCmd(state, DRXK_BL_ROM_OFFSET_TAPS_DVBT, DRXK_BLCC_NR_ELEMENTS_TAPS, DRXK_BLC_TIMEOUT);
3637 status = write16(state, IQM_CF_PKDTH__A, 2); /* peak detector threshold */
3640 status = write16(state, IQM_CF_POW_MEAS_LEN__A, 2);
3643 /* enable power measurement interrupt */
3644 status = write16(state, IQM_CF_COMM_INT_MSK__A, 1);
3647 status = write16(state, IQM_COMM_EXEC__A, IQM_COMM_EXEC_B_ACTIVE);
3651 /* IQM will not be reset from here, sync ADC and update/init AGC */
3652 status = ADCSynchronization(state);
3655 status = SetPreSaw(state, &state->m_dvbtPreSawCfg);
3659 /* Halt SCU to enable safe non-atomic accesses */
3660 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_HOLD);
3664 status = SetAgcRf(state, &state->m_dvbtRfAgcCfg, true);
3667 status = SetAgcIf(state, &state->m_dvbtIfAgcCfg, true);
3671 /* Set Noise Estimation notch width and enable DC fix */
3672 status = read16(state, OFDM_SC_RA_RAM_CONFIG__A, &data);
3675 data |= OFDM_SC_RA_RAM_CONFIG_NE_FIX_ENABLE__M;
3676 status = write16(state, OFDM_SC_RA_RAM_CONFIG__A, data);
3680 /* Activate SCU to enable SCU commands */
3681 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE);
3685 if (!state->m_DRXK_A3_ROM_CODE) {
3686 /* AGCInit() is not done for DVBT, so set agcFastClipCtrlDelay */
3687 status = write16(state, SCU_RAM_AGC_FAST_CLP_CTRL_DELAY__A, state->m_dvbtIfAgcCfg.FastClipCtrlDelay);
3693 #ifdef COMPILE_FOR_NONRT
3694 status = write16(state, OFDM_SC_RA_RAM_BE_OPT_DELAY__A, 1);
3697 status = write16(state, OFDM_SC_RA_RAM_BE_OPT_INIT_DELAY__A, 2);
3703 status = write16(state, FEC_DI_INPUT_CTL__A, 1); /* OFDM input */
3708 #ifdef COMPILE_FOR_NONRT
3709 status = write16(state, FEC_RS_MEASUREMENT_PERIOD__A, 0x400);
3713 status = write16(state, FEC_RS_MEASUREMENT_PERIOD__A, 0x1000);
3717 status = write16(state, FEC_RS_MEASUREMENT_PRESCALE__A, 0x0001);
3721 /* Setup MPEG bus */
3722 status = MPEGTSDtoSetup(state, OM_DVBT);
3725 /* Set DVBT Presets */
3726 status = DVBTActivatePresets(state);
3732 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
3736 /*============================================================================*/
3738 * \brief Start dvbt demodulating for channel.
3739 * \param demod instance of demodulator.
3740 * \return DRXStatus_t.
3742 static int DVBTStart(struct drxk_state *state)
3746 /* DRXKOfdmScCmd_t scCmd; */
3749 /* Start correct processes to get in lock */
3750 /* DRXK: OFDM_SC_RA_RAM_PROC_LOCKTRACK is no longer in mapfile! */
3751 param1 = OFDM_SC_RA_RAM_LOCKTRACK_MIN;
3752 status = DVBTScCommand(state, OFDM_SC_RA_RAM_CMD_PROC_START, 0, OFDM_SC_RA_RAM_SW_EVENT_RUN_NMASK__M, param1, 0, 0, 0);
3756 status = MPEGTSStart(state);
3759 status = write16(state, FEC_COMM_EXEC__A, FEC_COMM_EXEC_ACTIVE);
3764 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
3769 /*============================================================================*/
3772 * \brief Set up dvbt demodulator for channel.
3773 * \param demod instance of demodulator.
3774 * \return DRXStatus_t.
3775 * // original DVBTSetChannel()
3777 static int SetDVBT(struct drxk_state *state, u16 IntermediateFreqkHz,
3778 s32 tunerFreqOffset)
3781 u16 transmissionParams = 0;
3782 u16 operationMode = 0;
3783 u32 iqmRcRateOfs = 0;
3788 dprintk(1, "IF =%d, TFO = %d\n", IntermediateFreqkHz, tunerFreqOffset);
3790 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_OFDM | SCU_RAM_COMMAND_CMD_DEMOD_STOP, 0, NULL, 1, &cmdResult);
3794 /* Halt SCU to enable safe non-atomic accesses */
3795 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_HOLD);
3799 /* Stop processors */
3800 status = write16(state, OFDM_SC_COMM_EXEC__A, OFDM_SC_COMM_EXEC_STOP);
3803 status = write16(state, OFDM_LC_COMM_EXEC__A, OFDM_LC_COMM_EXEC_STOP);
3807 /* Mandatory fix, always stop CP, required to set spl offset back to
3808 hardware default (is set to 0 by ucode during pilot detection */
3809 status = write16(state, OFDM_CP_COMM_EXEC__A, OFDM_CP_COMM_EXEC_STOP);
3813 /*== Write channel settings to device =====================================*/
3816 switch (state->props.transmission_mode) {
3817 case TRANSMISSION_MODE_AUTO:
3819 operationMode |= OFDM_SC_RA_RAM_OP_AUTO_MODE__M;
3820 /* fall through , try first guess DRX_FFTMODE_8K */
3821 case TRANSMISSION_MODE_8K:
3822 transmissionParams |= OFDM_SC_RA_RAM_OP_PARAM_MODE_8K;
3824 case TRANSMISSION_MODE_2K:
3825 transmissionParams |= OFDM_SC_RA_RAM_OP_PARAM_MODE_2K;
3830 switch (state->props.guard_interval) {
3832 case GUARD_INTERVAL_AUTO:
3833 operationMode |= OFDM_SC_RA_RAM_OP_AUTO_GUARD__M;
3834 /* fall through , try first guess DRX_GUARD_1DIV4 */
3835 case GUARD_INTERVAL_1_4:
3836 transmissionParams |= OFDM_SC_RA_RAM_OP_PARAM_GUARD_4;
3838 case GUARD_INTERVAL_1_32:
3839 transmissionParams |= OFDM_SC_RA_RAM_OP_PARAM_GUARD_32;
3841 case GUARD_INTERVAL_1_16:
3842 transmissionParams |= OFDM_SC_RA_RAM_OP_PARAM_GUARD_16;
3844 case GUARD_INTERVAL_1_8:
3845 transmissionParams |= OFDM_SC_RA_RAM_OP_PARAM_GUARD_8;
3850 switch (state->props.hierarchy) {
3851 case HIERARCHY_AUTO:
3852 case HIERARCHY_NONE:
3854 operationMode |= OFDM_SC_RA_RAM_OP_AUTO_HIER__M;
3855 /* fall through , try first guess SC_RA_RAM_OP_PARAM_HIER_NO */
3856 /* transmissionParams |= OFDM_SC_RA_RAM_OP_PARAM_HIER_NO; */
3859 transmissionParams |= OFDM_SC_RA_RAM_OP_PARAM_HIER_A1;
3862 transmissionParams |= OFDM_SC_RA_RAM_OP_PARAM_HIER_A2;
3865 transmissionParams |= OFDM_SC_RA_RAM_OP_PARAM_HIER_A4;
3871 switch (state->props.modulation) {
3874 operationMode |= OFDM_SC_RA_RAM_OP_AUTO_CONST__M;
3875 /* fall through , try first guess DRX_CONSTELLATION_QAM64 */
3877 transmissionParams |= OFDM_SC_RA_RAM_OP_PARAM_CONST_QAM64;
3880 transmissionParams |= OFDM_SC_RA_RAM_OP_PARAM_CONST_QPSK;
3883 transmissionParams |= OFDM_SC_RA_RAM_OP_PARAM_CONST_QAM16;
3887 /* No hierachical channels support in BDA */
3888 /* Priority (only for hierarchical channels) */
3889 switch (channel->priority) {
3890 case DRX_PRIORITY_LOW:
3891 transmissionParams |= OFDM_SC_RA_RAM_OP_PARAM_PRIO_LO;
3892 WR16(devAddr, OFDM_EC_SB_PRIOR__A,
3893 OFDM_EC_SB_PRIOR_LO);
3895 case DRX_PRIORITY_HIGH:
3896 transmissionParams |= OFDM_SC_RA_RAM_OP_PARAM_PRIO_HI;
3897 WR16(devAddr, OFDM_EC_SB_PRIOR__A,
3898 OFDM_EC_SB_PRIOR_HI));
3900 case DRX_PRIORITY_UNKNOWN: /* fall through */
3906 /* Set Priorty high */
3907 transmissionParams |= OFDM_SC_RA_RAM_OP_PARAM_PRIO_HI;
3908 status = write16(state, OFDM_EC_SB_PRIOR__A, OFDM_EC_SB_PRIOR_HI);
3914 switch (state->props.code_rate_HP) {
3917 operationMode |= OFDM_SC_RA_RAM_OP_AUTO_RATE__M;
3918 /* fall through , try first guess DRX_CODERATE_2DIV3 */
3920 transmissionParams |= OFDM_SC_RA_RAM_OP_PARAM_RATE_2_3;
3923 transmissionParams |= OFDM_SC_RA_RAM_OP_PARAM_RATE_1_2;
3926 transmissionParams |= OFDM_SC_RA_RAM_OP_PARAM_RATE_3_4;
3929 transmissionParams |= OFDM_SC_RA_RAM_OP_PARAM_RATE_5_6;
3932 transmissionParams |= OFDM_SC_RA_RAM_OP_PARAM_RATE_7_8;
3936 /* SAW filter selection: normaly not necesarry, but if wanted
3937 the application can select a SAW filter via the driver by using UIOs */
3938 /* First determine real bandwidth (Hz) */
3939 /* Also set delay for impulse noise cruncher */
3940 /* Also set parameters for EC_OC fix, note EC_OC_REG_TMD_HIL_MAR is changed
3941 by SC for fix for some 8K,1/8 guard but is restored by InitEC and ResetEC
3943 switch (state->props.bandwidth_hz) {
3945 state->props.bandwidth_hz = 8000000;
3948 bandwidth = DRXK_BANDWIDTH_8MHZ_IN_HZ;
3949 status = write16(state, OFDM_SC_RA_RAM_SRMM_FIX_FACT_8K__A, 3052);
3952 /* cochannel protection for PAL 8 MHz */
3953 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_8K_PER_LEFT__A, 7);
3956 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_8K_PER_RIGHT__A, 7);
3959 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_2K_PER_LEFT__A, 7);
3962 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_2K_PER_RIGHT__A, 1);
3967 bandwidth = DRXK_BANDWIDTH_7MHZ_IN_HZ;
3968 status = write16(state, OFDM_SC_RA_RAM_SRMM_FIX_FACT_8K__A, 3491);
3971 /* cochannel protection for PAL 7 MHz */
3972 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_8K_PER_LEFT__A, 8);
3975 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_8K_PER_RIGHT__A, 8);
3978 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_2K_PER_LEFT__A, 4);
3981 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_2K_PER_RIGHT__A, 1);
3986 bandwidth = DRXK_BANDWIDTH_6MHZ_IN_HZ;
3987 status = write16(state, OFDM_SC_RA_RAM_SRMM_FIX_FACT_8K__A, 4073);
3990 /* cochannel protection for NTSC 6 MHz */
3991 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_8K_PER_LEFT__A, 19);
3994 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_8K_PER_RIGHT__A, 19);
3997 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_2K_PER_LEFT__A, 14);
4000 status = write16(state, OFDM_SC_RA_RAM_NI_INIT_2K_PER_RIGHT__A, 1);
4009 if (iqmRcRateOfs == 0) {
4010 /* Now compute IQM_RC_RATE_OFS
4011 (((SysFreq/BandWidth)/2)/2) -1) * 2^23)
4013 ((SysFreq / BandWidth) * (2^21)) - (2^23)
4015 /* (SysFreq / BandWidth) * (2^28) */
4016 /* assert (MAX(sysClk)/MIN(bandwidth) < 16)
4017 => assert(MAX(sysClk) < 16*MIN(bandwidth))
4018 => assert(109714272 > 48000000) = true so Frac 28 can be used */
4019 iqmRcRateOfs = Frac28a((u32)
4020 ((state->m_sysClockFreq *
4021 1000) / 3), bandwidth);
4022 /* (SysFreq / BandWidth) * (2^21), rounding before truncating */
4023 if ((iqmRcRateOfs & 0x7fL) >= 0x40)
4024 iqmRcRateOfs += 0x80L;
4025 iqmRcRateOfs = iqmRcRateOfs >> 7;
4026 /* ((SysFreq / BandWidth) * (2^21)) - (2^23) */
4027 iqmRcRateOfs = iqmRcRateOfs - (1 << 23);
4031 ((((u32) IQM_RC_RATE_OFS_HI__M) <<
4032 IQM_RC_RATE_OFS_LO__W) | IQM_RC_RATE_OFS_LO__M);
4033 status = write32(state, IQM_RC_RATE_OFS_LO__A, iqmRcRateOfs);
4037 /* Bandwidth setting done */
4040 status = DVBTSetFrequencyShift(demod, channel, tunerOffset);
4044 status = SetFrequencyShifter(state, IntermediateFreqkHz, tunerFreqOffset, true);
4048 /*== Start SC, write channel settings to SC ===============================*/
4050 /* Activate SCU to enable SCU commands */
4051 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE);
4055 /* Enable SC after setting all other parameters */
4056 status = write16(state, OFDM_SC_COMM_STATE__A, 0);
4059 status = write16(state, OFDM_SC_COMM_EXEC__A, 1);
4064 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_OFDM | SCU_RAM_COMMAND_CMD_DEMOD_START, 0, NULL, 1, &cmdResult);
4068 /* Write SC parameter registers, set all AUTO flags in operation mode */
4069 param1 = (OFDM_SC_RA_RAM_OP_AUTO_MODE__M |
4070 OFDM_SC_RA_RAM_OP_AUTO_GUARD__M |
4071 OFDM_SC_RA_RAM_OP_AUTO_CONST__M |
4072 OFDM_SC_RA_RAM_OP_AUTO_HIER__M |
4073 OFDM_SC_RA_RAM_OP_AUTO_RATE__M);
4074 status = DVBTScCommand(state, OFDM_SC_RA_RAM_CMD_SET_PREF_PARAM,
4075 0, transmissionParams, param1, 0, 0, 0);
4079 if (!state->m_DRXK_A3_ROM_CODE)
4080 status = DVBTCtrlSetSqiSpeed(state, &state->m_sqiSpeed);
4083 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
4089 /*============================================================================*/
4092 * \brief Retreive lock status .
4093 * \param demod Pointer to demodulator instance.
4094 * \param lockStat Pointer to lock status structure.
4095 * \return DRXStatus_t.
4098 static int GetDVBTLockStatus(struct drxk_state *state, u32 *pLockStatus)
4101 const u16 mpeg_lock_mask = (OFDM_SC_RA_RAM_LOCK_MPEG__M |
4102 OFDM_SC_RA_RAM_LOCK_FEC__M);
4103 const u16 fec_lock_mask = (OFDM_SC_RA_RAM_LOCK_FEC__M);
4104 const u16 demod_lock_mask = OFDM_SC_RA_RAM_LOCK_DEMOD__M;
4106 u16 ScRaRamLock = 0;
4111 *pLockStatus = NOT_LOCKED;
4113 /* Check if SC is running */
4114 status = read16(state, OFDM_SC_COMM_EXEC__A, &ScCommExec);
4117 if (ScCommExec == OFDM_SC_COMM_EXEC_STOP)
4120 status = read16(state, OFDM_SC_RA_RAM_LOCK__A, &ScRaRamLock);
4124 if ((ScRaRamLock & mpeg_lock_mask) == mpeg_lock_mask)
4125 *pLockStatus = MPEG_LOCK;
4126 else if ((ScRaRamLock & fec_lock_mask) == fec_lock_mask)
4127 *pLockStatus = FEC_LOCK;
4128 else if ((ScRaRamLock & demod_lock_mask) == demod_lock_mask)
4129 *pLockStatus = DEMOD_LOCK;
4130 else if (ScRaRamLock & OFDM_SC_RA_RAM_LOCK_NODVBT__M)
4131 *pLockStatus = NEVER_LOCK;
4134 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
4139 static int PowerUpQAM(struct drxk_state *state)
4141 enum DRXPowerMode powerMode = DRXK_POWER_DOWN_OFDM;
4145 status = CtrlPowerMode(state, &powerMode);
4147 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
4153 /** Power Down QAM */
4154 static int PowerDownQAM(struct drxk_state *state)
4161 status = read16(state, SCU_COMM_EXEC__A, &data);
4164 if (data == SCU_COMM_EXEC_ACTIVE) {
4169 /* stop all comstate->m_exec */
4170 status = write16(state, QAM_COMM_EXEC__A, QAM_COMM_EXEC_STOP);
4173 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_QAM | SCU_RAM_COMMAND_CMD_DEMOD_STOP, 0, NULL, 1, &cmdResult);
4178 status = SetIqmAf(state, false);
4182 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
4187 /*============================================================================*/
4190 * \brief Setup of the QAM Measurement intervals for signal quality
4191 * \param demod instance of demod.
4192 * \param modulation current modulation.
4193 * \return DRXStatus_t.
4196 * Take into account that for certain settings the errorcounters can overflow.
4197 * The implementation does not check this.
4200 static int SetQAMMeasurement(struct drxk_state *state,
4201 enum EDrxkConstellation modulation,
4204 u32 fecBitsDesired = 0; /* BER accounting period */
4205 u32 fecRsPeriodTotal = 0; /* Total period */
4206 u16 fecRsPrescale = 0; /* ReedSolomon Measurement Prescale */
4207 u16 fecRsPeriod = 0; /* Value for corresponding I2C register */
4213 /* fecBitsDesired = symbolRate [kHz] *
4219 switch (modulation) {
4220 case DRX_CONSTELLATION_QAM16:
4221 fecBitsDesired = 4 * symbolRate;
4223 case DRX_CONSTELLATION_QAM32:
4224 fecBitsDesired = 5 * symbolRate;
4226 case DRX_CONSTELLATION_QAM64:
4227 fecBitsDesired = 6 * symbolRate;
4229 case DRX_CONSTELLATION_QAM128:
4230 fecBitsDesired = 7 * symbolRate;
4232 case DRX_CONSTELLATION_QAM256:
4233 fecBitsDesired = 8 * symbolRate;
4241 fecBitsDesired /= 1000; /* symbolRate [Hz] -> symbolRate [kHz] */
4242 fecBitsDesired *= 500; /* meas. period [ms] */
4244 /* Annex A/C: bits/RsPeriod = 204 * 8 = 1632 */
4245 /* fecRsPeriodTotal = fecBitsDesired / 1632 */
4246 fecRsPeriodTotal = (fecBitsDesired / 1632UL) + 1; /* roughly ceil */
4248 /* fecRsPeriodTotal = fecRsPrescale * fecRsPeriod */
4249 fecRsPrescale = 1 + (u16) (fecRsPeriodTotal >> 16);
4250 if (fecRsPrescale == 0) {
4251 /* Divide by zero (though impossible) */
4257 ((u16) fecRsPeriodTotal +
4258 (fecRsPrescale >> 1)) / fecRsPrescale;
4260 /* write corresponding registers */
4261 status = write16(state, FEC_RS_MEASUREMENT_PERIOD__A, fecRsPeriod);
4264 status = write16(state, FEC_RS_MEASUREMENT_PRESCALE__A, fecRsPrescale);
4267 status = write16(state, FEC_OC_SNC_FAIL_PERIOD__A, fecRsPeriod);
4270 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
4274 static int SetQAM16(struct drxk_state *state)
4279 /* QAM Equalizer Setup */
4281 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD0__A, 13517);
4284 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD1__A, 13517);
4287 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD2__A, 13517);
4290 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD3__A, 13517);
4293 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD4__A, 13517);
4296 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD5__A, 13517);
4299 /* Decision Feedback Equalizer */
4300 status = write16(state, QAM_DQ_QUAL_FUN0__A, 2);
4303 status = write16(state, QAM_DQ_QUAL_FUN1__A, 2);
4306 status = write16(state, QAM_DQ_QUAL_FUN2__A, 2);
4309 status = write16(state, QAM_DQ_QUAL_FUN3__A, 2);
4312 status = write16(state, QAM_DQ_QUAL_FUN4__A, 2);
4315 status = write16(state, QAM_DQ_QUAL_FUN5__A, 0);
4319 status = write16(state, QAM_SY_SYNC_HWM__A, 5);
4322 status = write16(state, QAM_SY_SYNC_AWM__A, 4);
4325 status = write16(state, QAM_SY_SYNC_LWM__A, 3);
4329 /* QAM Slicer Settings */
4330 status = write16(state, SCU_RAM_QAM_SL_SIG_POWER__A, DRXK_QAM_SL_SIG_POWER_QAM16);
4334 /* QAM Loop Controller Coeficients */
4335 status = write16(state, SCU_RAM_QAM_LC_CA_FINE__A, 15);
4338 status = write16(state, SCU_RAM_QAM_LC_CA_COARSE__A, 40);
4341 status = write16(state, SCU_RAM_QAM_LC_EP_FINE__A, 12);
4344 status = write16(state, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24);
4347 status = write16(state, SCU_RAM_QAM_LC_EP_COARSE__A, 24);
4350 status = write16(state, SCU_RAM_QAM_LC_EI_FINE__A, 12);
4353 status = write16(state, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16);
4356 status = write16(state, SCU_RAM_QAM_LC_EI_COARSE__A, 16);
4360 status = write16(state, SCU_RAM_QAM_LC_CP_FINE__A, 5);
4363 status = write16(state, SCU_RAM_QAM_LC_CP_MEDIUM__A, 20);
4366 status = write16(state, SCU_RAM_QAM_LC_CP_COARSE__A, 80);
4369 status = write16(state, SCU_RAM_QAM_LC_CI_FINE__A, 5);
4372 status = write16(state, SCU_RAM_QAM_LC_CI_MEDIUM__A, 20);
4375 status = write16(state, SCU_RAM_QAM_LC_CI_COARSE__A, 50);
4378 status = write16(state, SCU_RAM_QAM_LC_CF_FINE__A, 16);
4381 status = write16(state, SCU_RAM_QAM_LC_CF_MEDIUM__A, 16);
4384 status = write16(state, SCU_RAM_QAM_LC_CF_COARSE__A, 32);
4387 status = write16(state, SCU_RAM_QAM_LC_CF1_FINE__A, 5);
4390 status = write16(state, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 10);
4393 status = write16(state, SCU_RAM_QAM_LC_CF1_COARSE__A, 10);
4398 /* QAM State Machine (FSM) Thresholds */
4400 status = write16(state, SCU_RAM_QAM_FSM_RTH__A, 140);
4403 status = write16(state, SCU_RAM_QAM_FSM_FTH__A, 50);
4406 status = write16(state, SCU_RAM_QAM_FSM_CTH__A, 95);
4409 status = write16(state, SCU_RAM_QAM_FSM_PTH__A, 120);
4412 status = write16(state, SCU_RAM_QAM_FSM_QTH__A, 230);
4415 status = write16(state, SCU_RAM_QAM_FSM_MTH__A, 105);
4419 status = write16(state, SCU_RAM_QAM_FSM_RATE_LIM__A, 40);
4422 status = write16(state, SCU_RAM_QAM_FSM_COUNT_LIM__A, 4);
4425 status = write16(state, SCU_RAM_QAM_FSM_FREQ_LIM__A, 24);
4430 /* QAM FSM Tracking Parameters */
4432 status = write16(state, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, (u16) 16);
4435 status = write16(state, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, (u16) 220);
4438 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, (u16) 25);
4441 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, (u16) 6);
4444 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16) -24);
4447 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16) -65);
4450 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16) -127);
4456 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
4460 /*============================================================================*/
4463 * \brief QAM32 specific setup
4464 * \param demod instance of demod.
4465 * \return DRXStatus_t.
4467 static int SetQAM32(struct drxk_state *state)
4473 /* QAM Equalizer Setup */
4475 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD0__A, 6707);
4478 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD1__A, 6707);
4481 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD2__A, 6707);
4484 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD3__A, 6707);
4487 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD4__A, 6707);
4490 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD5__A, 6707);
4494 /* Decision Feedback Equalizer */
4495 status = write16(state, QAM_DQ_QUAL_FUN0__A, 3);
4498 status = write16(state, QAM_DQ_QUAL_FUN1__A, 3);
4501 status = write16(state, QAM_DQ_QUAL_FUN2__A, 3);
4504 status = write16(state, QAM_DQ_QUAL_FUN3__A, 3);
4507 status = write16(state, QAM_DQ_QUAL_FUN4__A, 3);
4510 status = write16(state, QAM_DQ_QUAL_FUN5__A, 0);
4514 status = write16(state, QAM_SY_SYNC_HWM__A, 6);
4517 status = write16(state, QAM_SY_SYNC_AWM__A, 5);
4520 status = write16(state, QAM_SY_SYNC_LWM__A, 3);
4524 /* QAM Slicer Settings */
4526 status = write16(state, SCU_RAM_QAM_SL_SIG_POWER__A, DRXK_QAM_SL_SIG_POWER_QAM32);
4531 /* QAM Loop Controller Coeficients */
4533 status = write16(state, SCU_RAM_QAM_LC_CA_FINE__A, 15);
4536 status = write16(state, SCU_RAM_QAM_LC_CA_COARSE__A, 40);
4539 status = write16(state, SCU_RAM_QAM_LC_EP_FINE__A, 12);
4542 status = write16(state, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24);
4545 status = write16(state, SCU_RAM_QAM_LC_EP_COARSE__A, 24);
4548 status = write16(state, SCU_RAM_QAM_LC_EI_FINE__A, 12);
4551 status = write16(state, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16);
4554 status = write16(state, SCU_RAM_QAM_LC_EI_COARSE__A, 16);
4558 status = write16(state, SCU_RAM_QAM_LC_CP_FINE__A, 5);
4561 status = write16(state, SCU_RAM_QAM_LC_CP_MEDIUM__A, 20);
4564 status = write16(state, SCU_RAM_QAM_LC_CP_COARSE__A, 80);
4567 status = write16(state, SCU_RAM_QAM_LC_CI_FINE__A, 5);
4570 status = write16(state, SCU_RAM_QAM_LC_CI_MEDIUM__A, 20);
4573 status = write16(state, SCU_RAM_QAM_LC_CI_COARSE__A, 50);
4576 status = write16(state, SCU_RAM_QAM_LC_CF_FINE__A, 16);
4579 status = write16(state, SCU_RAM_QAM_LC_CF_MEDIUM__A, 16);
4582 status = write16(state, SCU_RAM_QAM_LC_CF_COARSE__A, 16);
4585 status = write16(state, SCU_RAM_QAM_LC_CF1_FINE__A, 5);
4588 status = write16(state, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 10);
4591 status = write16(state, SCU_RAM_QAM_LC_CF1_COARSE__A, 0);
4596 /* QAM State Machine (FSM) Thresholds */
4598 status = write16(state, SCU_RAM_QAM_FSM_RTH__A, 90);
4601 status = write16(state, SCU_RAM_QAM_FSM_FTH__A, 50);
4604 status = write16(state, SCU_RAM_QAM_FSM_CTH__A, 80);
4607 status = write16(state, SCU_RAM_QAM_FSM_PTH__A, 100);
4610 status = write16(state, SCU_RAM_QAM_FSM_QTH__A, 170);
4613 status = write16(state, SCU_RAM_QAM_FSM_MTH__A, 100);
4617 status = write16(state, SCU_RAM_QAM_FSM_RATE_LIM__A, 40);
4620 status = write16(state, SCU_RAM_QAM_FSM_COUNT_LIM__A, 4);
4623 status = write16(state, SCU_RAM_QAM_FSM_FREQ_LIM__A, 10);
4628 /* QAM FSM Tracking Parameters */
4630 status = write16(state, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, (u16) 12);
4633 status = write16(state, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, (u16) 140);
4636 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, (u16) -8);
4639 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, (u16) -16);
4642 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16) -26);
4645 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16) -56);
4648 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16) -86);
4651 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
4655 /*============================================================================*/
4658 * \brief QAM64 specific setup
4659 * \param demod instance of demod.
4660 * \return DRXStatus_t.
4662 static int SetQAM64(struct drxk_state *state)
4667 /* QAM Equalizer Setup */
4669 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD0__A, 13336);
4672 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD1__A, 12618);
4675 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD2__A, 11988);
4678 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD3__A, 13809);
4681 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD4__A, 13809);
4684 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD5__A, 15609);
4688 /* Decision Feedback Equalizer */
4689 status = write16(state, QAM_DQ_QUAL_FUN0__A, 4);
4692 status = write16(state, QAM_DQ_QUAL_FUN1__A, 4);
4695 status = write16(state, QAM_DQ_QUAL_FUN2__A, 4);
4698 status = write16(state, QAM_DQ_QUAL_FUN3__A, 4);
4701 status = write16(state, QAM_DQ_QUAL_FUN4__A, 3);
4704 status = write16(state, QAM_DQ_QUAL_FUN5__A, 0);
4708 status = write16(state, QAM_SY_SYNC_HWM__A, 5);
4711 status = write16(state, QAM_SY_SYNC_AWM__A, 4);
4714 status = write16(state, QAM_SY_SYNC_LWM__A, 3);
4718 /* QAM Slicer Settings */
4719 status = write16(state, SCU_RAM_QAM_SL_SIG_POWER__A, DRXK_QAM_SL_SIG_POWER_QAM64);
4724 /* QAM Loop Controller Coeficients */
4726 status = write16(state, SCU_RAM_QAM_LC_CA_FINE__A, 15);
4729 status = write16(state, SCU_RAM_QAM_LC_CA_COARSE__A, 40);
4732 status = write16(state, SCU_RAM_QAM_LC_EP_FINE__A, 12);
4735 status = write16(state, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24);
4738 status = write16(state, SCU_RAM_QAM_LC_EP_COARSE__A, 24);
4741 status = write16(state, SCU_RAM_QAM_LC_EI_FINE__A, 12);
4744 status = write16(state, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16);
4747 status = write16(state, SCU_RAM_QAM_LC_EI_COARSE__A, 16);
4751 status = write16(state, SCU_RAM_QAM_LC_CP_FINE__A, 5);
4754 status = write16(state, SCU_RAM_QAM_LC_CP_MEDIUM__A, 30);
4757 status = write16(state, SCU_RAM_QAM_LC_CP_COARSE__A, 100);
4760 status = write16(state, SCU_RAM_QAM_LC_CI_FINE__A, 5);
4763 status = write16(state, SCU_RAM_QAM_LC_CI_MEDIUM__A, 30);
4766 status = write16(state, SCU_RAM_QAM_LC_CI_COARSE__A, 50);
4769 status = write16(state, SCU_RAM_QAM_LC_CF_FINE__A, 16);
4772 status = write16(state, SCU_RAM_QAM_LC_CF_MEDIUM__A, 25);
4775 status = write16(state, SCU_RAM_QAM_LC_CF_COARSE__A, 48);
4778 status = write16(state, SCU_RAM_QAM_LC_CF1_FINE__A, 5);
4781 status = write16(state, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 10);
4784 status = write16(state, SCU_RAM_QAM_LC_CF1_COARSE__A, 10);
4789 /* QAM State Machine (FSM) Thresholds */
4791 status = write16(state, SCU_RAM_QAM_FSM_RTH__A, 100);
4794 status = write16(state, SCU_RAM_QAM_FSM_FTH__A, 60);
4797 status = write16(state, SCU_RAM_QAM_FSM_CTH__A, 80);
4800 status = write16(state, SCU_RAM_QAM_FSM_PTH__A, 110);
4803 status = write16(state, SCU_RAM_QAM_FSM_QTH__A, 200);
4806 status = write16(state, SCU_RAM_QAM_FSM_MTH__A, 95);
4810 status = write16(state, SCU_RAM_QAM_FSM_RATE_LIM__A, 40);
4813 status = write16(state, SCU_RAM_QAM_FSM_COUNT_LIM__A, 4);
4816 status = write16(state, SCU_RAM_QAM_FSM_FREQ_LIM__A, 15);
4821 /* QAM FSM Tracking Parameters */
4823 status = write16(state, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, (u16) 12);
4826 status = write16(state, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, (u16) 141);
4829 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, (u16) 7);
4832 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, (u16) 0);
4835 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16) -15);
4838 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16) -45);
4841 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16) -80);
4844 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
4849 /*============================================================================*/
4852 * \brief QAM128 specific setup
4853 * \param demod: instance of demod.
4854 * \return DRXStatus_t.
4856 static int SetQAM128(struct drxk_state *state)
4861 /* QAM Equalizer Setup */
4863 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD0__A, 6564);
4866 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD1__A, 6598);
4869 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD2__A, 6394);
4872 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD3__A, 6409);
4875 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD4__A, 6656);
4878 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD5__A, 7238);
4882 /* Decision Feedback Equalizer */
4883 status = write16(state, QAM_DQ_QUAL_FUN0__A, 6);
4886 status = write16(state, QAM_DQ_QUAL_FUN1__A, 6);
4889 status = write16(state, QAM_DQ_QUAL_FUN2__A, 6);
4892 status = write16(state, QAM_DQ_QUAL_FUN3__A, 6);
4895 status = write16(state, QAM_DQ_QUAL_FUN4__A, 5);
4898 status = write16(state, QAM_DQ_QUAL_FUN5__A, 0);
4902 status = write16(state, QAM_SY_SYNC_HWM__A, 6);
4905 status = write16(state, QAM_SY_SYNC_AWM__A, 5);
4908 status = write16(state, QAM_SY_SYNC_LWM__A, 3);
4913 /* QAM Slicer Settings */
4915 status = write16(state, SCU_RAM_QAM_SL_SIG_POWER__A, DRXK_QAM_SL_SIG_POWER_QAM128);
4920 /* QAM Loop Controller Coeficients */
4922 status = write16(state, SCU_RAM_QAM_LC_CA_FINE__A, 15);
4925 status = write16(state, SCU_RAM_QAM_LC_CA_COARSE__A, 40);
4928 status = write16(state, SCU_RAM_QAM_LC_EP_FINE__A, 12);
4931 status = write16(state, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24);
4934 status = write16(state, SCU_RAM_QAM_LC_EP_COARSE__A, 24);
4937 status = write16(state, SCU_RAM_QAM_LC_EI_FINE__A, 12);
4940 status = write16(state, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16);
4943 status = write16(state, SCU_RAM_QAM_LC_EI_COARSE__A, 16);
4947 status = write16(state, SCU_RAM_QAM_LC_CP_FINE__A, 5);
4950 status = write16(state, SCU_RAM_QAM_LC_CP_MEDIUM__A, 40);
4953 status = write16(state, SCU_RAM_QAM_LC_CP_COARSE__A, 120);
4956 status = write16(state, SCU_RAM_QAM_LC_CI_FINE__A, 5);
4959 status = write16(state, SCU_RAM_QAM_LC_CI_MEDIUM__A, 40);
4962 status = write16(state, SCU_RAM_QAM_LC_CI_COARSE__A, 60);
4965 status = write16(state, SCU_RAM_QAM_LC_CF_FINE__A, 16);
4968 status = write16(state, SCU_RAM_QAM_LC_CF_MEDIUM__A, 25);
4971 status = write16(state, SCU_RAM_QAM_LC_CF_COARSE__A, 64);
4974 status = write16(state, SCU_RAM_QAM_LC_CF1_FINE__A, 5);
4977 status = write16(state, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 10);
4980 status = write16(state, SCU_RAM_QAM_LC_CF1_COARSE__A, 0);
4985 /* QAM State Machine (FSM) Thresholds */
4987 status = write16(state, SCU_RAM_QAM_FSM_RTH__A, 50);
4990 status = write16(state, SCU_RAM_QAM_FSM_FTH__A, 60);
4993 status = write16(state, SCU_RAM_QAM_FSM_CTH__A, 80);
4996 status = write16(state, SCU_RAM_QAM_FSM_PTH__A, 100);
4999 status = write16(state, SCU_RAM_QAM_FSM_QTH__A, 140);
5002 status = write16(state, SCU_RAM_QAM_FSM_MTH__A, 100);
5006 status = write16(state, SCU_RAM_QAM_FSM_RATE_LIM__A, 40);
5009 status = write16(state, SCU_RAM_QAM_FSM_COUNT_LIM__A, 5);
5013 status = write16(state, SCU_RAM_QAM_FSM_FREQ_LIM__A, 12);
5017 /* QAM FSM Tracking Parameters */
5019 status = write16(state, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, (u16) 8);
5022 status = write16(state, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, (u16) 65);
5025 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, (u16) 5);
5028 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, (u16) 3);
5031 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16) -1);
5034 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16) -12);
5037 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16) -23);
5040 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
5045 /*============================================================================*/
5048 * \brief QAM256 specific setup
5049 * \param demod: instance of demod.
5050 * \return DRXStatus_t.
5052 static int SetQAM256(struct drxk_state *state)
5057 /* QAM Equalizer Setup */
5059 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD0__A, 11502);
5062 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD1__A, 12084);
5065 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD2__A, 12543);
5068 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD3__A, 12931);
5071 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD4__A, 13629);
5074 status = write16(state, SCU_RAM_QAM_EQ_CMA_RAD5__A, 15385);
5078 /* Decision Feedback Equalizer */
5079 status = write16(state, QAM_DQ_QUAL_FUN0__A, 8);
5082 status = write16(state, QAM_DQ_QUAL_FUN1__A, 8);
5085 status = write16(state, QAM_DQ_QUAL_FUN2__A, 8);
5088 status = write16(state, QAM_DQ_QUAL_FUN3__A, 8);
5091 status = write16(state, QAM_DQ_QUAL_FUN4__A, 6);
5094 status = write16(state, QAM_DQ_QUAL_FUN5__A, 0);
5098 status = write16(state, QAM_SY_SYNC_HWM__A, 5);
5101 status = write16(state, QAM_SY_SYNC_AWM__A, 4);
5104 status = write16(state, QAM_SY_SYNC_LWM__A, 3);
5108 /* QAM Slicer Settings */
5110 status = write16(state, SCU_RAM_QAM_SL_SIG_POWER__A, DRXK_QAM_SL_SIG_POWER_QAM256);
5115 /* QAM Loop Controller Coeficients */
5117 status = write16(state, SCU_RAM_QAM_LC_CA_FINE__A, 15);
5120 status = write16(state, SCU_RAM_QAM_LC_CA_COARSE__A, 40);
5123 status = write16(state, SCU_RAM_QAM_LC_EP_FINE__A, 12);
5126 status = write16(state, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24);
5129 status = write16(state, SCU_RAM_QAM_LC_EP_COARSE__A, 24);
5132 status = write16(state, SCU_RAM_QAM_LC_EI_FINE__A, 12);
5135 status = write16(state, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16);
5138 status = write16(state, SCU_RAM_QAM_LC_EI_COARSE__A, 16);
5142 status = write16(state, SCU_RAM_QAM_LC_CP_FINE__A, 5);
5145 status = write16(state, SCU_RAM_QAM_LC_CP_MEDIUM__A, 50);
5148 status = write16(state, SCU_RAM_QAM_LC_CP_COARSE__A, 250);
5151 status = write16(state, SCU_RAM_QAM_LC_CI_FINE__A, 5);
5154 status = write16(state, SCU_RAM_QAM_LC_CI_MEDIUM__A, 50);
5157 status = write16(state, SCU_RAM_QAM_LC_CI_COARSE__A, 125);
5160 status = write16(state, SCU_RAM_QAM_LC_CF_FINE__A, 16);
5163 status = write16(state, SCU_RAM_QAM_LC_CF_MEDIUM__A, 25);
5166 status = write16(state, SCU_RAM_QAM_LC_CF_COARSE__A, 48);
5169 status = write16(state, SCU_RAM_QAM_LC_CF1_FINE__A, 5);
5172 status = write16(state, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 10);
5175 status = write16(state, SCU_RAM_QAM_LC_CF1_COARSE__A, 10);
5180 /* QAM State Machine (FSM) Thresholds */
5182 status = write16(state, SCU_RAM_QAM_FSM_RTH__A, 50);
5185 status = write16(state, SCU_RAM_QAM_FSM_FTH__A, 60);
5188 status = write16(state, SCU_RAM_QAM_FSM_CTH__A, 80);
5191 status = write16(state, SCU_RAM_QAM_FSM_PTH__A, 100);
5194 status = write16(state, SCU_RAM_QAM_FSM_QTH__A, 150);
5197 status = write16(state, SCU_RAM_QAM_FSM_MTH__A, 110);
5201 status = write16(state, SCU_RAM_QAM_FSM_RATE_LIM__A, 40);
5204 status = write16(state, SCU_RAM_QAM_FSM_COUNT_LIM__A, 4);
5207 status = write16(state, SCU_RAM_QAM_FSM_FREQ_LIM__A, 12);
5212 /* QAM FSM Tracking Parameters */
5214 status = write16(state, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, (u16) 8);
5217 status = write16(state, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, (u16) 74);
5220 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, (u16) 18);
5223 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, (u16) 13);
5226 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16) 7);
5229 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16) 0);
5232 status = write16(state, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16) -8);
5235 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
5240 /*============================================================================*/
5242 * \brief Reset QAM block.
5243 * \param demod: instance of demod.
5244 * \param channel: pointer to channel data.
5245 * \return DRXStatus_t.
5247 static int QAMResetQAM(struct drxk_state *state)
5253 /* Stop QAM comstate->m_exec */
5254 status = write16(state, QAM_COMM_EXEC__A, QAM_COMM_EXEC_STOP);
5258 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_QAM | SCU_RAM_COMMAND_CMD_DEMOD_RESET, 0, NULL, 1, &cmdResult);
5261 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
5265 /*============================================================================*/
5268 * \brief Set QAM symbolrate.
5269 * \param demod: instance of demod.
5270 * \param channel: pointer to channel data.
5271 * \return DRXStatus_t.
5273 static int QAMSetSymbolrate(struct drxk_state *state)
5275 u32 adcFrequency = 0;
5283 /* Select & calculate correct IQM rate */
5284 adcFrequency = (state->m_sysClockFreq * 1000) / 3;
5286 /* printk(KERN_DEBUG "drxk: SR %d\n", state->props.symbol_rate); */
5287 if (state->props.symbol_rate <= 1188750)
5289 else if (state->props.symbol_rate <= 2377500)
5291 else if (state->props.symbol_rate <= 4755000)
5293 status = write16(state, IQM_FD_RATESEL__A, ratesel);
5298 IqmRcRate = ((Fadc / (symbolrate * (4<<ratesel))) - 1) * (1<<23)
5300 symbFreq = state->props.symbol_rate * (1 << ratesel);
5301 if (symbFreq == 0) {
5302 /* Divide by zero */
5306 iqmRcRate = (adcFrequency / symbFreq) * (1 << 21) +
5307 (Frac28a((adcFrequency % symbFreq), symbFreq) >> 7) -
5309 status = write32(state, IQM_RC_RATE_OFS_LO__A, iqmRcRate);
5312 state->m_iqmRcRate = iqmRcRate;
5314 LcSymbFreq = round (.125 * symbolrate / adcFreq * (1<<15))
5316 symbFreq = state->props.symbol_rate;
5317 if (adcFrequency == 0) {
5318 /* Divide by zero */
5322 lcSymbRate = (symbFreq / adcFrequency) * (1 << 12) +
5323 (Frac28a((symbFreq % adcFrequency), adcFrequency) >>
5325 if (lcSymbRate > 511)
5327 status = write16(state, QAM_LC_SYMBOL_FREQ__A, (u16) lcSymbRate);
5331 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
5335 /*============================================================================*/
5338 * \brief Get QAM lock status.
5339 * \param demod: instance of demod.
5340 * \param channel: pointer to channel data.
5341 * \return DRXStatus_t.
5344 static int GetQAMLockStatus(struct drxk_state *state, u32 *pLockStatus)
5347 u16 Result[2] = { 0, 0 };
5350 *pLockStatus = NOT_LOCKED;
5351 status = scu_command(state,
5352 SCU_RAM_COMMAND_STANDARD_QAM |
5353 SCU_RAM_COMMAND_CMD_DEMOD_GET_LOCK, 0, NULL, 2,
5356 printk(KERN_ERR "drxk: %s status = %08x\n", __func__, status);
5358 if (Result[1] < SCU_RAM_QAM_LOCKED_LOCKED_DEMOD_LOCKED) {
5359 /* 0x0000 NOT LOCKED */
5360 } else if (Result[1] < SCU_RAM_QAM_LOCKED_LOCKED_LOCKED) {
5361 /* 0x4000 DEMOD LOCKED */
5362 *pLockStatus = DEMOD_LOCK;
5363 } else if (Result[1] < SCU_RAM_QAM_LOCKED_LOCKED_NEVER_LOCK) {
5364 /* 0x8000 DEMOD + FEC LOCKED (system lock) */
5365 *pLockStatus = MPEG_LOCK;
5367 /* 0xC000 NEVER LOCKED */
5368 /* (system will never be able to lock to the signal) */
5369 /* TODO: check this, intermediate & standard specific lock states are not
5370 taken into account here */
5371 *pLockStatus = NEVER_LOCK;
5376 #define QAM_MIRROR__M 0x03
5377 #define QAM_MIRROR_NORMAL 0x00
5378 #define QAM_MIRRORED 0x01
5379 #define QAM_MIRROR_AUTO_ON 0x02
5380 #define QAM_LOCKRANGE__M 0x10
5381 #define QAM_LOCKRANGE_NORMAL 0x10
5383 static int SetQAM(struct drxk_state *state, u16 IntermediateFreqkHz,
5384 s32 tunerFreqOffset)
5387 u16 setParamParameters[4] = { 0, 0, 0, 0 };
5392 * STEP 1: reset demodulator
5393 * resets FEC DI and FEC RS
5395 * resets SCU variables
5397 status = write16(state, FEC_DI_COMM_EXEC__A, FEC_DI_COMM_EXEC_STOP);
5400 status = write16(state, FEC_RS_COMM_EXEC__A, FEC_RS_COMM_EXEC_STOP);
5403 status = QAMResetQAM(state);
5408 * STEP 2: configure demodulator
5409 * -set params; resets IQM,QAM,FEC HW; initializes some
5412 status = QAMSetSymbolrate(state);
5417 switch (state->props.modulation) {
5419 state->m_Constellation = DRX_CONSTELLATION_QAM256;
5423 state->m_Constellation = DRX_CONSTELLATION_QAM64;
5426 state->m_Constellation = DRX_CONSTELLATION_QAM16;
5429 state->m_Constellation = DRX_CONSTELLATION_QAM32;
5432 state->m_Constellation = DRX_CONSTELLATION_QAM128;
5440 setParamParameters[0] = state->m_Constellation; /* modulation */
5441 setParamParameters[1] = DRXK_QAM_I12_J17; /* interleave mode */
5442 if (state->m_OperationMode == OM_QAM_ITU_C)
5443 setParamParameters[2] = QAM_TOP_ANNEX_C;
5445 setParamParameters[2] = QAM_TOP_ANNEX_A;
5446 setParamParameters[3] |= (QAM_MIRROR_AUTO_ON);
5447 /* Env parameters */
5448 /* check for LOCKRANGE Extented */
5449 /* setParamParameters[3] |= QAM_LOCKRANGE_NORMAL; */
5451 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_QAM | SCU_RAM_COMMAND_CMD_DEMOD_SET_PARAM, 4, setParamParameters, 1, &cmdResult);
5453 /* Fall-back to the simpler call */
5454 if (state->m_OperationMode == OM_QAM_ITU_C)
5455 setParamParameters[0] = QAM_TOP_ANNEX_C;
5457 setParamParameters[0] = QAM_TOP_ANNEX_A;
5458 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_QAM | SCU_RAM_COMMAND_CMD_DEMOD_SET_ENV, 1, setParamParameters, 1, &cmdResult);
5462 setParamParameters[0] = state->m_Constellation; /* modulation */
5463 setParamParameters[1] = DRXK_QAM_I12_J17; /* interleave mode */
5464 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_QAM | SCU_RAM_COMMAND_CMD_DEMOD_SET_PARAM, 2, setParamParameters, 1, &cmdResult);
5470 * STEP 3: enable the system in a mode where the ADC provides valid
5471 * signal setup modulation independent registers
5474 status = SetFrequency(channel, tunerFreqOffset));
5478 status = SetFrequencyShifter(state, IntermediateFreqkHz, tunerFreqOffset, true);
5482 /* Setup BER measurement */
5483 status = SetQAMMeasurement(state, state->m_Constellation, state->props.symbol_rate);
5487 /* Reset default values */
5488 status = write16(state, IQM_CF_SCALE_SH__A, IQM_CF_SCALE_SH__PRE);
5491 status = write16(state, QAM_SY_TIMEOUT__A, QAM_SY_TIMEOUT__PRE);
5495 /* Reset default LC values */
5496 status = write16(state, QAM_LC_RATE_LIMIT__A, 3);
5499 status = write16(state, QAM_LC_LPF_FACTORP__A, 4);
5502 status = write16(state, QAM_LC_LPF_FACTORI__A, 4);
5505 status = write16(state, QAM_LC_MODE__A, 7);
5509 status = write16(state, QAM_LC_QUAL_TAB0__A, 1);
5512 status = write16(state, QAM_LC_QUAL_TAB1__A, 1);
5515 status = write16(state, QAM_LC_QUAL_TAB2__A, 1);
5518 status = write16(state, QAM_LC_QUAL_TAB3__A, 1);
5521 status = write16(state, QAM_LC_QUAL_TAB4__A, 2);
5524 status = write16(state, QAM_LC_QUAL_TAB5__A, 2);
5527 status = write16(state, QAM_LC_QUAL_TAB6__A, 2);
5530 status = write16(state, QAM_LC_QUAL_TAB8__A, 2);
5533 status = write16(state, QAM_LC_QUAL_TAB9__A, 2);
5536 status = write16(state, QAM_LC_QUAL_TAB10__A, 2);
5539 status = write16(state, QAM_LC_QUAL_TAB12__A, 2);
5542 status = write16(state, QAM_LC_QUAL_TAB15__A, 3);
5545 status = write16(state, QAM_LC_QUAL_TAB16__A, 3);
5548 status = write16(state, QAM_LC_QUAL_TAB20__A, 4);
5551 status = write16(state, QAM_LC_QUAL_TAB25__A, 4);
5555 /* Mirroring, QAM-block starting point not inverted */
5556 status = write16(state, QAM_SY_SP_INV__A, QAM_SY_SP_INV_SPECTRUM_INV_DIS);
5560 /* Halt SCU to enable safe non-atomic accesses */
5561 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_HOLD);
5565 /* STEP 4: modulation specific setup */
5566 switch (state->props.modulation) {
5568 status = SetQAM16(state);
5571 status = SetQAM32(state);
5575 status = SetQAM64(state);
5578 status = SetQAM128(state);
5581 status = SetQAM256(state);
5590 /* Activate SCU to enable SCU commands */
5591 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE);
5595 /* Re-configure MPEG output, requires knowledge of channel bitrate */
5596 /* extAttr->currentChannel.modulation = channel->modulation; */
5597 /* extAttr->currentChannel.symbolrate = channel->symbolrate; */
5598 status = MPEGTSDtoSetup(state, state->m_OperationMode);
5602 /* Start processes */
5603 status = MPEGTSStart(state);
5606 status = write16(state, FEC_COMM_EXEC__A, FEC_COMM_EXEC_ACTIVE);
5609 status = write16(state, QAM_COMM_EXEC__A, QAM_COMM_EXEC_ACTIVE);
5612 status = write16(state, IQM_COMM_EXEC__A, IQM_COMM_EXEC_B_ACTIVE);
5616 /* STEP 5: start QAM demodulator (starts FEC, QAM and IQM HW) */
5617 status = scu_command(state, SCU_RAM_COMMAND_STANDARD_QAM | SCU_RAM_COMMAND_CMD_DEMOD_START, 0, NULL, 1, &cmdResult);
5621 /* update global DRXK data container */
5622 /*? extAttr->qamInterleaveMode = DRXK_QAM_I12_J17; */
5626 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
5630 static int SetQAMStandard(struct drxk_state *state,
5631 enum OperationMode oMode)
5634 #ifdef DRXK_QAM_TAPS
5635 #define DRXK_QAMA_TAPS_SELECT
5636 #include "drxk_filters.h"
5637 #undef DRXK_QAMA_TAPS_SELECT
5642 /* added antenna switch */
5643 SwitchAntennaToQAM(state);
5645 /* Ensure correct power-up mode */
5646 status = PowerUpQAM(state);
5649 /* Reset QAM block */
5650 status = QAMResetQAM(state);
5656 status = write16(state, IQM_COMM_EXEC__A, IQM_COMM_EXEC_B_STOP);
5659 status = write16(state, IQM_AF_AMUX__A, IQM_AF_AMUX_SIGNAL2ADC);
5663 /* Upload IQM Channel Filter settings by
5664 boot loader from ROM table */
5667 status = BLChainCmd(state, DRXK_BL_ROM_OFFSET_TAPS_ITU_A, DRXK_BLCC_NR_ELEMENTS_TAPS, DRXK_BLC_TIMEOUT);
5670 status = BLDirectCmd(state, IQM_CF_TAP_RE0__A, DRXK_BL_ROM_OFFSET_TAPS_ITU_C, DRXK_BLDC_NR_ELEMENTS_TAPS, DRXK_BLC_TIMEOUT);
5673 status = BLDirectCmd(state, IQM_CF_TAP_IM0__A, DRXK_BL_ROM_OFFSET_TAPS_ITU_C, DRXK_BLDC_NR_ELEMENTS_TAPS, DRXK_BLC_TIMEOUT);
5681 status = write16(state, IQM_CF_OUT_ENA__A, (1 << IQM_CF_OUT_ENA_QAM__B));
5684 status = write16(state, IQM_CF_SYMMETRIC__A, 0);
5687 status = write16(state, IQM_CF_MIDTAP__A, ((1 << IQM_CF_MIDTAP_RE__B) | (1 << IQM_CF_MIDTAP_IM__B)));
5691 status = write16(state, IQM_RC_STRETCH__A, 21);
5694 status = write16(state, IQM_AF_CLP_LEN__A, 0);
5697 status = write16(state, IQM_AF_CLP_TH__A, 448);
5700 status = write16(state, IQM_AF_SNS_LEN__A, 0);
5703 status = write16(state, IQM_CF_POW_MEAS_LEN__A, 0);
5707 status = write16(state, IQM_FS_ADJ_SEL__A, 1);
5710 status = write16(state, IQM_RC_ADJ_SEL__A, 1);
5713 status = write16(state, IQM_CF_ADJ_SEL__A, 1);
5716 status = write16(state, IQM_AF_UPD_SEL__A, 0);
5720 /* IQM Impulse Noise Processing Unit */
5721 status = write16(state, IQM_CF_CLP_VAL__A, 500);
5724 status = write16(state, IQM_CF_DATATH__A, 1000);
5727 status = write16(state, IQM_CF_BYPASSDET__A, 1);
5730 status = write16(state, IQM_CF_DET_LCT__A, 0);
5733 status = write16(state, IQM_CF_WND_LEN__A, 1);
5736 status = write16(state, IQM_CF_PKDTH__A, 1);
5739 status = write16(state, IQM_AF_INC_BYPASS__A, 1);
5743 /* turn on IQMAF. Must be done before setAgc**() */
5744 status = SetIqmAf(state, true);
5747 status = write16(state, IQM_AF_START_LOCK__A, 0x01);
5751 /* IQM will not be reset from here, sync ADC and update/init AGC */
5752 status = ADCSynchronization(state);
5756 /* Set the FSM step period */
5757 status = write16(state, SCU_RAM_QAM_FSM_STEP_PERIOD__A, 2000);
5761 /* Halt SCU to enable safe non-atomic accesses */
5762 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_HOLD);
5766 /* No more resets of the IQM, current standard correctly set =>
5767 now AGCs can be configured. */
5769 status = InitAGC(state, true);
5772 status = SetPreSaw(state, &(state->m_qamPreSawCfg));
5776 /* Configure AGC's */
5777 status = SetAgcRf(state, &(state->m_qamRfAgcCfg), true);
5780 status = SetAgcIf(state, &(state->m_qamIfAgcCfg), true);
5784 /* Activate SCU to enable SCU commands */
5785 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE);
5788 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
5792 static int WriteGPIO(struct drxk_state *state)
5798 /* stop lock indicator process */
5799 status = write16(state, SCU_RAM_GPIO__A, SCU_RAM_GPIO_HW_LOCK_IND_DISABLE);
5803 /* Write magic word to enable pdr reg write */
5804 status = write16(state, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY_KEY);
5808 if (state->m_hasSAWSW) {
5809 if (state->UIO_mask & 0x0001) { /* UIO-1 */
5810 /* write to io pad configuration register - output mode */
5811 status = write16(state, SIO_PDR_SMA_TX_CFG__A, state->m_GPIOCfg);
5815 /* use corresponding bit in io data output registar */
5816 status = read16(state, SIO_PDR_UIO_OUT_LO__A, &value);
5819 if ((state->m_GPIO & 0x0001) == 0)
5820 value &= 0x7FFF; /* write zero to 15th bit - 1st UIO */
5822 value |= 0x8000; /* write one to 15th bit - 1st UIO */
5823 /* write back to io data output register */
5824 status = write16(state, SIO_PDR_UIO_OUT_LO__A, value);
5828 if (state->UIO_mask & 0x0002) { /* UIO-2 */
5829 /* write to io pad configuration register - output mode */
5830 status = write16(state, SIO_PDR_SMA_TX_CFG__A, state->m_GPIOCfg);
5834 /* use corresponding bit in io data output registar */
5835 status = read16(state, SIO_PDR_UIO_OUT_LO__A, &value);
5838 if ((state->m_GPIO & 0x0002) == 0)
5839 value &= 0xBFFF; /* write zero to 14th bit - 2st UIO */
5841 value |= 0x4000; /* write one to 14th bit - 2st UIO */
5842 /* write back to io data output register */
5843 status = write16(state, SIO_PDR_UIO_OUT_LO__A, value);
5847 if (state->UIO_mask & 0x0004) { /* UIO-3 */
5848 /* write to io pad configuration register - output mode */
5849 status = write16(state, SIO_PDR_SMA_TX_CFG__A, state->m_GPIOCfg);
5853 /* use corresponding bit in io data output registar */
5854 status = read16(state, SIO_PDR_UIO_OUT_LO__A, &value);
5857 if ((state->m_GPIO & 0x0004) == 0)
5858 value &= 0xFFFB; /* write zero to 2nd bit - 3rd UIO */
5860 value |= 0x0004; /* write one to 2nd bit - 3rd UIO */
5861 /* write back to io data output register */
5862 status = write16(state, SIO_PDR_UIO_OUT_LO__A, value);
5867 /* Write magic word to disable pdr reg write */
5868 status = write16(state, SIO_TOP_COMM_KEY__A, 0x0000);
5871 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
5875 static int SwitchAntennaToQAM(struct drxk_state *state)
5882 if (!state->antenna_gpio)
5885 gpio_state = state->m_GPIO & state->antenna_gpio;
5887 if (state->antenna_dvbt ^ gpio_state) {
5888 /* Antenna is on DVB-T mode. Switch */
5889 if (state->antenna_dvbt)
5890 state->m_GPIO &= ~state->antenna_gpio;
5892 state->m_GPIO |= state->antenna_gpio;
5893 status = WriteGPIO(state);
5896 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
5900 static int SwitchAntennaToDVBT(struct drxk_state *state)
5907 if (!state->antenna_gpio)
5910 gpio_state = state->m_GPIO & state->antenna_gpio;
5912 if (!(state->antenna_dvbt ^ gpio_state)) {
5913 /* Antenna is on DVB-C mode. Switch */
5914 if (state->antenna_dvbt)
5915 state->m_GPIO |= state->antenna_gpio;
5917 state->m_GPIO &= ~state->antenna_gpio;
5918 status = WriteGPIO(state);
5921 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
5926 static int PowerDownDevice(struct drxk_state *state)
5928 /* Power down to requested mode */
5929 /* Backup some register settings */
5930 /* Set pins with possible pull-ups connected to them in input mode */
5931 /* Analog power down */
5932 /* ADC power down */
5933 /* Power down device */
5937 if (state->m_bPDownOpenBridge) {
5938 /* Open I2C bridge before power down of DRXK */
5939 status = ConfigureI2CBridge(state, true);
5944 status = DVBTEnableOFDMTokenRing(state, false);
5948 status = write16(state, SIO_CC_PWD_MODE__A, SIO_CC_PWD_MODE_LEVEL_CLOCK);
5951 status = write16(state, SIO_CC_UPDATE__A, SIO_CC_UPDATE_KEY);
5954 state->m_HICfgCtrl |= SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ;
5955 status = HI_CfgCommand(state);
5958 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
5963 static int load_microcode(struct drxk_state *state, const char *mc_name)
5965 const struct firmware *fw = NULL;
5970 err = request_firmware(&fw, mc_name, state->i2c->dev.parent);
5973 "drxk: Could not load firmware file %s.\n", mc_name);
5975 "drxk: Copy %s to your hotplug directory!\n", mc_name);
5978 err = DownloadMicrocode(state, fw->data, fw->size);
5979 release_firmware(fw);
5983 static int init_drxk(struct drxk_state *state)
5986 enum DRXPowerMode powerMode = DRXK_POWER_DOWN_OFDM;
5990 if ((state->m_DrxkState == DRXK_UNINITIALIZED)) {
5991 status = PowerUpDevice(state);
5994 status = DRXX_Open(state);
5997 /* Soft reset of OFDM-, sys- and osc-clockdomain */
5998 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);
6001 status = write16(state, SIO_CC_UPDATE__A, SIO_CC_UPDATE_KEY);
6004 /* TODO is this needed, if yes how much delay in worst case scenario */
6006 state->m_DRXK_A3_PATCH_CODE = true;
6007 status = GetDeviceCapabilities(state);
6011 /* Bridge delay, uses oscilator clock */
6012 /* Delay = (delay (nano seconds) * oscclk (kHz))/ 1000 */
6013 /* SDA brdige delay */
6014 state->m_HICfgBridgeDelay =
6015 (u16) ((state->m_oscClockFreq / 1000) *
6016 HI_I2C_BRIDGE_DELAY) / 1000;
6018 if (state->m_HICfgBridgeDelay >
6019 SIO_HI_RA_RAM_PAR_3_CFG_DBL_SDA__M) {
6020 state->m_HICfgBridgeDelay =
6021 SIO_HI_RA_RAM_PAR_3_CFG_DBL_SDA__M;
6023 /* SCL bridge delay, same as SDA for now */
6024 state->m_HICfgBridgeDelay +=
6025 state->m_HICfgBridgeDelay <<
6026 SIO_HI_RA_RAM_PAR_3_CFG_DBL_SCL__B;
6028 status = InitHI(state);
6031 /* disable various processes */
6033 if (!(state->m_DRXK_A1_ROM_CODE)
6034 && !(state->m_DRXK_A2_ROM_CODE))
6037 status = write16(state, SCU_RAM_GPIO__A, SCU_RAM_GPIO_HW_LOCK_IND_DISABLE);
6042 /* disable MPEG port */
6043 status = MPEGTSDisable(state);
6047 /* Stop AUD and SCU */
6048 status = write16(state, AUD_COMM_EXEC__A, AUD_COMM_EXEC_STOP);
6051 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_STOP);
6055 /* enable token-ring bus through OFDM block for possible ucode upload */
6056 status = write16(state, SIO_OFDM_SH_OFDM_RING_ENABLE__A, SIO_OFDM_SH_OFDM_RING_ENABLE_ON);
6060 /* include boot loader section */
6061 status = write16(state, SIO_BL_COMM_EXEC__A, SIO_BL_COMM_EXEC_ACTIVE);
6064 status = BLChainCmd(state, 0, 6, 100);
6068 if (state->microcode_name)
6069 load_microcode(state, state->microcode_name);
6071 /* disable token-ring bus through OFDM block for possible ucode upload */
6072 status = write16(state, SIO_OFDM_SH_OFDM_RING_ENABLE__A, SIO_OFDM_SH_OFDM_RING_ENABLE_OFF);
6076 /* Run SCU for a little while to initialize microcode version numbers */
6077 status = write16(state, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE);
6080 status = DRXX_Open(state);
6083 /* added for test */
6086 powerMode = DRXK_POWER_DOWN_OFDM;
6087 status = CtrlPowerMode(state, &powerMode);
6091 /* Stamp driver version number in SCU data RAM in BCD code
6092 Done to enable field application engineers to retreive drxdriver version
6093 via I2C from SCU RAM.
6094 Not using SCU command interface for SCU register access since no
6095 microcode may be present.
6098 (((DRXK_VERSION_MAJOR / 100) % 10) << 12) +
6099 (((DRXK_VERSION_MAJOR / 10) % 10) << 8) +
6100 ((DRXK_VERSION_MAJOR % 10) << 4) +
6101 (DRXK_VERSION_MINOR % 10);
6102 status = write16(state, SCU_RAM_DRIVER_VER_HI__A, driverVersion);
6106 (((DRXK_VERSION_PATCH / 1000) % 10) << 12) +
6107 (((DRXK_VERSION_PATCH / 100) % 10) << 8) +
6108 (((DRXK_VERSION_PATCH / 10) % 10) << 4) +
6109 (DRXK_VERSION_PATCH % 10);
6110 status = write16(state, SCU_RAM_DRIVER_VER_LO__A, driverVersion);
6114 printk(KERN_INFO "DRXK driver version %d.%d.%d\n",
6115 DRXK_VERSION_MAJOR, DRXK_VERSION_MINOR,
6116 DRXK_VERSION_PATCH);
6118 /* Dirty fix of default values for ROM/PATCH microcode
6119 Dirty because this fix makes it impossible to setup suitable values
6120 before calling DRX_Open. This solution requires changes to RF AGC speed
6121 to be done via the CTRL function after calling DRX_Open */
6123 /* m_dvbtRfAgcCfg.speed = 3; */
6125 /* Reset driver debug flags to 0 */
6126 status = write16(state, SCU_RAM_DRIVER_DEBUG__A, 0);
6131 NOTE: No more full FEC resets allowed afterwards!! */
6132 status = write16(state, FEC_COMM_EXEC__A, FEC_COMM_EXEC_STOP);
6135 /* MPEGTS functions are still the same */
6136 status = MPEGTSDtoInit(state);
6139 status = MPEGTSStop(state);
6142 status = MPEGTSConfigurePolarity(state);
6145 status = MPEGTSConfigurePins(state, state->m_enableMPEGOutput);
6148 /* added: configure GPIO */
6149 status = WriteGPIO(state);
6153 state->m_DrxkState = DRXK_STOPPED;
6155 if (state->m_bPowerDown) {
6156 status = PowerDownDevice(state);
6159 state->m_DrxkState = DRXK_POWERED_DOWN;
6161 state->m_DrxkState = DRXK_STOPPED;
6165 printk(KERN_ERR "drxk: Error %d on %s\n", status, __func__);
6170 static void drxk_release(struct dvb_frontend *fe)
6172 struct drxk_state *state = fe->demodulator_priv;
6178 static int drxk_sleep(struct dvb_frontend *fe)
6180 struct drxk_state *state = fe->demodulator_priv;
6187 static int drxk_gate_ctrl(struct dvb_frontend *fe, int enable)
6189 struct drxk_state *state = fe->demodulator_priv;
6191 dprintk(1, "%s\n", enable ? "enable" : "disable");
6192 return ConfigureI2CBridge(state, enable ? true : false);
6195 static int drxk_set_parameters(struct dvb_frontend *fe)
6197 struct dtv_frontend_properties *p = &fe->dtv_property_cache;
6198 u32 delsys = p->delivery_system, old_delsys;
6199 struct drxk_state *state = fe->demodulator_priv;
6204 if (!fe->ops.tuner_ops.get_if_frequency) {
6206 "drxk: Error: get_if_frequency() not defined at tuner. Can't work without it!\n");
6210 if (fe->ops.i2c_gate_ctrl)
6211 fe->ops.i2c_gate_ctrl(fe, 1);
6212 if (fe->ops.tuner_ops.set_params)
6213 fe->ops.tuner_ops.set_params(fe);
6214 if (fe->ops.i2c_gate_ctrl)
6215 fe->ops.i2c_gate_ctrl(fe, 0);
6217 old_delsys = state->props.delivery_system;
6220 if (old_delsys != delsys) {
6223 case SYS_DVBC_ANNEX_A:
6224 case SYS_DVBC_ANNEX_C:
6225 if (!state->m_hasDVBC)
6227 state->m_itut_annex_c = (delsys == SYS_DVBC_ANNEX_C) ? true : false;
6228 if (state->m_itut_annex_c)
6229 SetOperationMode(state, OM_QAM_ITU_C);
6231 SetOperationMode(state, OM_QAM_ITU_A);
6234 if (!state->m_hasDVBT)
6236 SetOperationMode(state, OM_DVBT);
6243 fe->ops.tuner_ops.get_if_frequency(fe, &IF);
6244 Start(state, 0, IF);
6246 /* printk(KERN_DEBUG "drxk: %s IF=%d done\n", __func__, IF); */
6251 static int drxk_read_status(struct dvb_frontend *fe, fe_status_t *status)
6253 struct drxk_state *state = fe->demodulator_priv;
6258 GetLockStatus(state, &stat, 0);
6259 if (stat == MPEG_LOCK)
6261 if (stat == FEC_LOCK)
6263 if (stat == DEMOD_LOCK)
6268 static int drxk_read_ber(struct dvb_frontend *fe, u32 *ber)
6276 static int drxk_read_signal_strength(struct dvb_frontend *fe,
6279 struct drxk_state *state = fe->demodulator_priv;
6283 ReadIFAgc(state, &val);
6284 *strength = val & 0xffff;
6288 static int drxk_read_snr(struct dvb_frontend *fe, u16 *snr)
6290 struct drxk_state *state = fe->demodulator_priv;
6294 GetSignalToNoise(state, &snr2);
6295 *snr = snr2 & 0xffff;
6299 static int drxk_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
6301 struct drxk_state *state = fe->demodulator_priv;
6305 DVBTQAMGetAccPktErr(state, &err);
6306 *ucblocks = (u32) err;
6310 static int drxk_get_tune_settings(struct dvb_frontend *fe, struct dvb_frontend_tune_settings
6313 struct dtv_frontend_properties *p = &fe->dtv_property_cache;
6316 switch (p->delivery_system) {
6317 case SYS_DVBC_ANNEX_A:
6318 case SYS_DVBC_ANNEX_C:
6320 sets->min_delay_ms = 3000;
6321 sets->max_drift = 0;
6322 sets->step_size = 0;
6329 static struct dvb_frontend_ops drxk_ops = {
6330 /* .delsys will be filled dynamically */
6333 .frequency_min = 47000000,
6334 .frequency_max = 865000000,
6336 .symbol_rate_min = 870000,
6337 .symbol_rate_max = 11700000,
6339 .frequency_stepsize = 166667,
6341 .caps = FE_CAN_QAM_16 | FE_CAN_QAM_32 | FE_CAN_QAM_64 |
6342 FE_CAN_QAM_128 | FE_CAN_QAM_256 | FE_CAN_FEC_AUTO |
6343 FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
6344 FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_MUTE_TS |
6345 FE_CAN_TRANSMISSION_MODE_AUTO | FE_CAN_RECOVER |
6346 FE_CAN_GUARD_INTERVAL_AUTO | FE_CAN_HIERARCHY_AUTO
6349 .release = drxk_release,
6350 .sleep = drxk_sleep,
6351 .i2c_gate_ctrl = drxk_gate_ctrl,
6353 .set_frontend = drxk_set_parameters,
6354 .get_tune_settings = drxk_get_tune_settings,
6356 .read_status = drxk_read_status,
6357 .read_ber = drxk_read_ber,
6358 .read_signal_strength = drxk_read_signal_strength,
6359 .read_snr = drxk_read_snr,
6360 .read_ucblocks = drxk_read_ucblocks,
6363 struct dvb_frontend *drxk_attach(const struct drxk_config *config,
6364 struct i2c_adapter *i2c)
6368 struct drxk_state *state = NULL;
6369 u8 adr = config->adr;
6372 state = kzalloc(sizeof(struct drxk_state), GFP_KERNEL);
6377 state->demod_address = adr;
6378 state->single_master = config->single_master;
6379 state->microcode_name = config->microcode_name;
6380 state->no_i2c_bridge = config->no_i2c_bridge;
6381 state->antenna_gpio = config->antenna_gpio;
6382 state->antenna_dvbt = config->antenna_dvbt;
6383 state->m_ChunkSize = config->chunk_size;
6384 state->enable_merr_cfg = config->enable_merr_cfg;
6386 if (config->dynamic_clk) {
6387 state->m_DVBTStaticCLK = 0;
6388 state->m_DVBCStaticCLK = 0;
6390 state->m_DVBTStaticCLK = 1;
6391 state->m_DVBCStaticCLK = 1;
6395 if (config->mpeg_out_clk_strength)
6396 state->m_TSClockkStrength = config->mpeg_out_clk_strength & 0x07;
6398 state->m_TSClockkStrength = 0x06;
6400 if (config->parallel_ts)
6401 state->m_enableParallel = true;
6403 state->m_enableParallel = false;
6405 /* NOTE: as more UIO bits will be used, add them to the mask */
6406 state->UIO_mask = config->antenna_gpio;
6408 /* Default gpio to DVB-C */
6409 if (!state->antenna_dvbt && state->antenna_gpio)
6410 state->m_GPIO |= state->antenna_gpio;
6412 state->m_GPIO &= ~state->antenna_gpio;
6414 mutex_init(&state->mutex);
6416 memcpy(&state->frontend.ops, &drxk_ops, sizeof(drxk_ops));
6417 state->frontend.demodulator_priv = state;
6420 if (init_drxk(state) < 0)
6423 /* Initialize the supported delivery systems */
6425 if (state->m_hasDVBC) {
6426 state->frontend.ops.delsys[n++] = SYS_DVBC_ANNEX_A;
6427 state->frontend.ops.delsys[n++] = SYS_DVBC_ANNEX_C;
6428 strlcat(state->frontend.ops.info.name, " DVB-C",
6429 sizeof(state->frontend.ops.info.name));
6431 if (state->m_hasDVBT) {
6432 state->frontend.ops.delsys[n++] = SYS_DVBT;
6433 strlcat(state->frontend.ops.info.name, " DVB-T",
6434 sizeof(state->frontend.ops.info.name));
6437 printk(KERN_INFO "drxk: frontend initialized.\n");
6438 return &state->frontend;
6441 printk(KERN_ERR "drxk: not found\n");
6445 EXPORT_SYMBOL(drxk_attach);
6447 MODULE_DESCRIPTION("DRX-K driver");
6448 MODULE_AUTHOR("Ralph Metzler");
6449 MODULE_LICENSE("GPL");