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