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