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