1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56#define pr_fmt(fmt) KBUILD_MODNAME ":%s: " fmt, __func__
57
58#include <linux/module.h>
59#include <linux/init.h>
60#include <linux/string.h>
61#include <linux/slab.h>
62#include <asm/div64.h>
63
64#include "dvb_frontend.h"
65#include "drx39xxj.h"
66
67#include "drxj.h"
68#include "drxj_map.h"
69
70
71
72
73
74#define DRX39XX_MAIN_FIRMWARE "dvb-fe-drxj-mc-1.0.8.fw"
75
76
77
78
79#ifndef MAX_U32
80#define MAX_U32 ((u32) (0xFFFFFFFFL))
81#endif
82
83
84#ifndef MPEG_SERIAL_OUTPUT_PIN_DRIVE_STRENGTH
85#define MPEG_SERIAL_OUTPUT_PIN_DRIVE_STRENGTH 0x02
86#endif
87
88#ifndef MPEG_PARALLEL_OUTPUT_PIN_DRIVE_STRENGTH
89#define MPEG_PARALLEL_OUTPUT_PIN_DRIVE_STRENGTH 0x02
90#endif
91
92#ifndef MPEG_OUTPUT_CLK_DRIVE_STRENGTH
93#define MPEG_OUTPUT_CLK_DRIVE_STRENGTH 0x06
94#endif
95
96#ifndef OOB_CRX_DRIVE_STRENGTH
97#define OOB_CRX_DRIVE_STRENGTH 0x02
98#endif
99
100#ifndef OOB_DRX_DRIVE_STRENGTH
101#define OOB_DRX_DRIVE_STRENGTH 0x02
102#endif
103
104
105#define ATV_TOP_CR_AMP_TH_FM 0x0
106#define ATV_TOP_CR_AMP_TH_L 0xA
107#define ATV_TOP_CR_AMP_TH_LP 0xA
108#define ATV_TOP_CR_AMP_TH_BG 0x8
109#define ATV_TOP_CR_AMP_TH_DK 0x8
110#define ATV_TOP_CR_AMP_TH_I 0x8
111#define ATV_TOP_CR_CONT_CR_D_MN 0x18
112#define ATV_TOP_CR_CONT_CR_D_FM 0x0
113#define ATV_TOP_CR_CONT_CR_D_L 0x20
114#define ATV_TOP_CR_CONT_CR_D_LP 0x20
115#define ATV_TOP_CR_CONT_CR_D_BG 0x18
116#define ATV_TOP_CR_CONT_CR_D_DK 0x18
117#define ATV_TOP_CR_CONT_CR_D_I 0x18
118#define ATV_TOP_CR_CONT_CR_I_MN 0x80
119#define ATV_TOP_CR_CONT_CR_I_FM 0x0
120#define ATV_TOP_CR_CONT_CR_I_L 0x80
121#define ATV_TOP_CR_CONT_CR_I_LP 0x80
122#define ATV_TOP_CR_CONT_CR_I_BG 0x80
123#define ATV_TOP_CR_CONT_CR_I_DK 0x80
124#define ATV_TOP_CR_CONT_CR_I_I 0x80
125#define ATV_TOP_CR_CONT_CR_P_MN 0x4
126#define ATV_TOP_CR_CONT_CR_P_FM 0x0
127#define ATV_TOP_CR_CONT_CR_P_L 0x4
128#define ATV_TOP_CR_CONT_CR_P_LP 0x4
129#define ATV_TOP_CR_CONT_CR_P_BG 0x4
130#define ATV_TOP_CR_CONT_CR_P_DK 0x4
131#define ATV_TOP_CR_CONT_CR_P_I 0x4
132#define ATV_TOP_CR_OVM_TH_MN 0xA0
133#define ATV_TOP_CR_OVM_TH_FM 0x0
134#define ATV_TOP_CR_OVM_TH_L 0xA0
135#define ATV_TOP_CR_OVM_TH_LP 0xA0
136#define ATV_TOP_CR_OVM_TH_BG 0xA0
137#define ATV_TOP_CR_OVM_TH_DK 0xA0
138#define ATV_TOP_CR_OVM_TH_I 0xA0
139#define ATV_TOP_EQU0_EQU_C0_FM 0x0
140#define ATV_TOP_EQU0_EQU_C0_L 0x3
141#define ATV_TOP_EQU0_EQU_C0_LP 0x3
142#define ATV_TOP_EQU0_EQU_C0_BG 0x7
143#define ATV_TOP_EQU0_EQU_C0_DK 0x0
144#define ATV_TOP_EQU0_EQU_C0_I 0x3
145#define ATV_TOP_EQU1_EQU_C1_FM 0x0
146#define ATV_TOP_EQU1_EQU_C1_L 0x1F6
147#define ATV_TOP_EQU1_EQU_C1_LP 0x1F6
148#define ATV_TOP_EQU1_EQU_C1_BG 0x197
149#define ATV_TOP_EQU1_EQU_C1_DK 0x198
150#define ATV_TOP_EQU1_EQU_C1_I 0x1F6
151#define ATV_TOP_EQU2_EQU_C2_FM 0x0
152#define ATV_TOP_EQU2_EQU_C2_L 0x28
153#define ATV_TOP_EQU2_EQU_C2_LP 0x28
154#define ATV_TOP_EQU2_EQU_C2_BG 0xC5
155#define ATV_TOP_EQU2_EQU_C2_DK 0xB0
156#define ATV_TOP_EQU2_EQU_C2_I 0x28
157#define ATV_TOP_EQU3_EQU_C3_FM 0x0
158#define ATV_TOP_EQU3_EQU_C3_L 0x192
159#define ATV_TOP_EQU3_EQU_C3_LP 0x192
160#define ATV_TOP_EQU3_EQU_C3_BG 0x12E
161#define ATV_TOP_EQU3_EQU_C3_DK 0x18E
162#define ATV_TOP_EQU3_EQU_C3_I 0x192
163#define ATV_TOP_STD_MODE_MN 0x0
164#define ATV_TOP_STD_MODE_FM 0x1
165#define ATV_TOP_STD_MODE_L 0x0
166#define ATV_TOP_STD_MODE_LP 0x0
167#define ATV_TOP_STD_MODE_BG 0x0
168#define ATV_TOP_STD_MODE_DK 0x0
169#define ATV_TOP_STD_MODE_I 0x0
170#define ATV_TOP_STD_VID_POL_MN 0x0
171#define ATV_TOP_STD_VID_POL_FM 0x0
172#define ATV_TOP_STD_VID_POL_L 0x2
173#define ATV_TOP_STD_VID_POL_LP 0x2
174#define ATV_TOP_STD_VID_POL_BG 0x0
175#define ATV_TOP_STD_VID_POL_DK 0x0
176#define ATV_TOP_STD_VID_POL_I 0x0
177#define ATV_TOP_VID_AMP_MN 0x380
178#define ATV_TOP_VID_AMP_FM 0x0
179#define ATV_TOP_VID_AMP_L 0xF50
180#define ATV_TOP_VID_AMP_LP 0xF50
181#define ATV_TOP_VID_AMP_BG 0x380
182#define ATV_TOP_VID_AMP_DK 0x394
183#define ATV_TOP_VID_AMP_I 0x3D8
184#define IQM_CF_OUT_ENA_OFDM__M 0x4
185#define IQM_FS_ADJ_SEL_B_QAM 0x1
186#define IQM_FS_ADJ_SEL_B_OFF 0x0
187#define IQM_FS_ADJ_SEL_B_VSB 0x2
188#define IQM_RC_ADJ_SEL_B_OFF 0x0
189#define IQM_RC_ADJ_SEL_B_QAM 0x1
190#define IQM_RC_ADJ_SEL_B_VSB 0x2
191
192
193#include "drx_driver_version.h"
194
195
196#ifdef DRX_DEBUG
197#include <stdio.h>
198#endif
199
200
201
202
203
204
205
206
207#ifndef DRXJ_WAKE_UP_KEY
208#define DRXJ_WAKE_UP_KEY (demod->my_i2c_dev_addr->i2c_addr)
209#endif
210
211
212
213
214
215#define DRXJ_DEF_I2C_ADDR (0x52)
216
217
218
219
220
221#define DRXJ_DEF_DEMOD_DEV_ID (1)
222
223
224
225
226
227#define DRXJ_SCAN_TIMEOUT 1000
228
229
230
231
232
233
234
235#define HI_I2C_DELAY 42
236
237
238
239
240
241
242
243#define HI_I2C_BRIDGE_DELAY 750
244
245
246
247
248#define VSB_TOP_MEASUREMENT_PERIOD 64
249#define SYMBOLS_PER_SEGMENT 832
250
251
252
253
254
255#define DRXJ_QAM_SL_SIG_POWER_QAM_UNKNOWN 0
256#define DRXJ_QAM_SL_SIG_POWER_QPSK 32768
257#define DRXJ_QAM_SL_SIG_POWER_QAM8 24576
258#define DRXJ_QAM_SL_SIG_POWER_QAM16 40960
259#define DRXJ_QAM_SL_SIG_POWER_QAM32 20480
260#define DRXJ_QAM_SL_SIG_POWER_QAM64 43008
261#define DRXJ_QAM_SL_SIG_POWER_QAM128 20992
262#define DRXJ_QAM_SL_SIG_POWER_QAM256 43520
263
264
265
266#ifndef DRXJ_QAM_SYMBOLRATE_MIN
267#define DRXJ_QAM_SYMBOLRATE_MIN (520000)
268#endif
269
270
271
272
273#ifndef DRXJ_QAM_SYMBOLRATE_MAX
274#define DRXJ_QAM_SYMBOLRATE_MAX (7233000)
275#endif
276
277
278
279
280
281#ifndef DRXJ_QAM_MAX_WAITTIME
282#define DRXJ_QAM_MAX_WAITTIME 900
283#endif
284
285#ifndef DRXJ_QAM_FEC_LOCK_WAITTIME
286#define DRXJ_QAM_FEC_LOCK_WAITTIME 150
287#endif
288
289#ifndef DRXJ_QAM_DEMOD_LOCK_EXT_WAITTIME
290#define DRXJ_QAM_DEMOD_LOCK_EXT_WAITTIME 200
291#endif
292
293
294
295
296
297#define DRX_SCU_READY 0
298#define DRXJ_MAX_WAITTIME 100
299#define FEC_RS_MEASUREMENT_PERIOD 12894
300#define FEC_RS_MEASUREMENT_PRESCALE 1
301
302
303
304
305
306#ifndef DRXJ_AUD_MAX_FM_DEVIATION
307#define DRXJ_AUD_MAX_FM_DEVIATION 100
308#endif
309
310
311
312
313#ifndef DRXJ_AUD_MAX_NICAM_PRESCALE
314#define DRXJ_AUD_MAX_NICAM_PRESCALE (9)
315#endif
316
317
318
319
320#ifndef DRXJ_AUD_MAX_WAITTIME
321#define DRXJ_AUD_MAX_WAITTIME 250
322#endif
323
324
325#define DRXJ_ATV_CHANGED_COEF (0x00000001UL)
326#define DRXJ_ATV_CHANGED_PEAK_FLT (0x00000008UL)
327#define DRXJ_ATV_CHANGED_NOISE_FLT (0x00000010UL)
328#define DRXJ_ATV_CHANGED_OUTPUT (0x00000020UL)
329#define DRXJ_ATV_CHANGED_SIF_ATT (0x00000040UL)
330
331
332#define DRX_UIO_MODE_FIRMWARE_SMA DRX_UIO_MODE_FIRMWARE0
333#define DRX_UIO_MODE_FIRMWARE_SAW DRX_UIO_MODE_FIRMWARE1
334
335
336
337
338
339
340#define DRX_UCODE_MAGIC_WORD ((((u16)'H')<<8)+((u16)'L'))
341
342
343#define DRX_UCODE_CRC_FLAG (0x0001)
344
345
346
347
348
349#define DRX_UCODE_MAX_BUF_SIZE (DRXDAP_MAX_RCHUNKSIZE)
350
351#if DRX_UCODE_MAX_BUF_SIZE & 1
352#error DRX_UCODE_MAX_BUF_SIZE must be an even number
353#endif
354
355
356
357
358
359#define DRX_ISPOWERDOWNMODE(mode) ((mode == DRX_POWER_MODE_9) || \
360 (mode == DRX_POWER_MODE_10) || \
361 (mode == DRX_POWER_MODE_11) || \
362 (mode == DRX_POWER_MODE_12) || \
363 (mode == DRX_POWER_MODE_13) || \
364 (mode == DRX_POWER_MODE_14) || \
365 (mode == DRX_POWER_MODE_15) || \
366 (mode == DRX_POWER_MODE_16) || \
367 (mode == DRX_POWER_DOWN))
368
369
370#define DRXJ_PIN_SAFE_MODE 0x0000
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391#define AUD_DEM_RAM_MODUS_HI__A 0x10204A3
392#define AUD_DEM_RAM_MODUS_HI__M 0xF000
393
394#define AUD_DEM_RAM_MODUS_LO__A 0x10204A4
395#define AUD_DEM_RAM_MODUS_LO__M 0x0FFF
396
397
398
399
400#define AUD_DEM_RAM_I2S_CONFIG1__A 0x10204B1
401#define AUD_DEM_RAM_I2S_CONFIG2__A 0x10204B2
402
403
404
405
406#define AUD_DEM_RAM_DCO_B_HI__A 0x1020461
407#define AUD_DEM_RAM_DCO_B_LO__A 0x1020462
408#define AUD_DEM_RAM_DCO_A_HI__A 0x1020463
409#define AUD_DEM_RAM_DCO_A_LO__A 0x1020464
410
411
412
413
414#define AUD_DEM_RAM_NICAM_THRSHLD__A 0x102045A
415#define AUD_DEM_RAM_A2_THRSHLD__A 0x10204BB
416#define AUD_DEM_RAM_BTSC_THRSHLD__A 0x10204A6
417
418
419
420
421#define AUD_DEM_RAM_CM_A_THRSHLD__A 0x10204AF
422#define AUD_DEM_RAM_CM_B_THRSHLD__A 0x10204B0
423
424
425
426
427#ifdef AUD_DEM_WR_FM_MATRIX__A
428#undef AUD_DEM_WR_FM_MATRIX__A
429#endif
430#define AUD_DEM_WR_FM_MATRIX__A 0x105006F
431
432
433
434
435
436#define AUD_VOLUME_ZERO_DB 115
437#define AUD_VOLUME_DB_MIN -60
438#define AUD_VOLUME_DB_MAX 12
439#define AUD_CARRIER_STRENGTH_QP_0DB 0x4000
440#define AUD_CARRIER_STRENGTH_QP_0DB_LOG10T100 421
441#define AUD_MAX_AVC_REF_LEVEL 15
442#define AUD_I2S_FREQUENCY_MAX 48000UL
443#define AUD_I2S_FREQUENCY_MIN 12000UL
444#define AUD_RDS_ARRAY_SIZE 18
445
446
447
448
449#ifndef DRX_AUD_MAX_FM_DEVIATION
450#define DRX_AUD_MAX_FM_DEVIATION (100)
451#endif
452
453
454
455
456#ifndef DRX_AUD_MAX_NICAM_PRESCALE
457#define DRX_AUD_MAX_NICAM_PRESCALE (9)
458#endif
459
460
461
462#define SIO_PDR_I2S_CL_CFG_MODE__MASTER 0x0004
463#define SIO_PDR_I2S_CL_CFG_DRIVE__MASTER 0x0008
464#define SIO_PDR_I2S_CL_CFG_MODE__SLAVE 0x0004
465#define SIO_PDR_I2S_CL_CFG_DRIVE__SLAVE 0x0000
466
467#define SIO_PDR_I2S_DA_CFG_MODE__MASTER 0x0003
468#define SIO_PDR_I2S_DA_CFG_DRIVE__MASTER 0x0008
469#define SIO_PDR_I2S_DA_CFG_MODE__SLAVE 0x0003
470#define SIO_PDR_I2S_DA_CFG_DRIVE__SLAVE 0x0008
471
472#define SIO_PDR_I2S_WS_CFG_MODE__MASTER 0x0004
473#define SIO_PDR_I2S_WS_CFG_DRIVE__MASTER 0x0008
474#define SIO_PDR_I2S_WS_CFG_MODE__SLAVE 0x0004
475#define SIO_PDR_I2S_WS_CFG_DRIVE__SLAVE 0x0000
476
477
478
479
480
481
482
483
484
485
486
487#define DRXJ_16TO8(x) ((u8) (((u16)x) & 0xFF)), \
488 ((u8)((((u16)x)>>8)&0xFF))
489
490
491
492
493
494#define DRXJ_8TO16(x) ((u16) (x[0] | (x[1] << 8)))
495
496
497
498
499
500
501
502
503
504
505
506
507#define DRXJ_MAX_RETRIES (100)
508
509
510
511
512
513#define DRXJ_ISATVSTD(std) ((std == DRX_STANDARD_PAL_SECAM_BG) || \
514 (std == DRX_STANDARD_PAL_SECAM_DK) || \
515 (std == DRX_STANDARD_PAL_SECAM_I) || \
516 (std == DRX_STANDARD_PAL_SECAM_L) || \
517 (std == DRX_STANDARD_PAL_SECAM_LP) || \
518 (std == DRX_STANDARD_NTSC) || \
519 (std == DRX_STANDARD_FM))
520
521#define DRXJ_ISQAMSTD(std) ((std == DRX_STANDARD_ITU_A) || \
522 (std == DRX_STANDARD_ITU_B) || \
523 (std == DRX_STANDARD_ITU_C) || \
524 (std == DRX_STANDARD_ITU_D))
525
526
527
528
529
530
531
532
533static int drxdap_fasi_read_block(struct i2c_device_addr *dev_addr,
534 u32 addr,
535 u16 datasize,
536 u8 *data, u32 flags);
537
538
539static int drxj_dap_read_modify_write_reg16(struct i2c_device_addr *dev_addr,
540 u32 waddr,
541 u32 raddr,
542 u16 wdata, u16 *rdata);
543
544static int drxj_dap_read_reg16(struct i2c_device_addr *dev_addr,
545 u32 addr,
546 u16 *data, u32 flags);
547
548static int drxdap_fasi_read_reg32(struct i2c_device_addr *dev_addr,
549 u32 addr,
550 u32 *data, u32 flags);
551
552static int drxdap_fasi_write_block(struct i2c_device_addr *dev_addr,
553 u32 addr,
554 u16 datasize,
555 u8 *data, u32 flags);
556
557static int drxj_dap_write_reg16(struct i2c_device_addr *dev_addr,
558 u32 addr,
559 u16 data, u32 flags);
560
561static int drxdap_fasi_write_reg32(struct i2c_device_addr *dev_addr,
562 u32 addr,
563 u32 data, u32 flags);
564
565static struct drxj_data drxj_data_g = {
566 false,
567 false,
568 false,
569 false,
570 false,
571 false,
572 false,
573 false,
574 0,
575
576
577 false,
578
579 DRX_STANDARD_UNKNOWN,
580 DRX_CONSTELLATION_AUTO,
581 0,
582 DRX_BANDWIDTH_UNKNOWN,
583 DRX_MIRROR_NO,
584
585
586
587
588 4000000,
589 5,
590 4,
591 0xFFFF,
592 204 * 8,
593 1,
594 FEC_RS_MEASUREMENT_PERIOD,
595 true,
596 0,
597
598
599 0,
600 0,
601 0,
602 0,
603 0,
604
605 DRX_UIO_MODE_DISABLE,
606 DRX_UIO_MODE_DISABLE,
607 DRX_UIO_MODE_DISABLE,
608 DRX_UIO_MODE_DISABLE,
609
610 0UL,
611 false,
612
613 0UL,
614
615
616
617
618
619
620
621
622
623 0UL,
624
625 {-5,
626 ATV_TOP_EQU0_EQU_C0_FM,
627 ATV_TOP_EQU0_EQU_C0_L,
628 ATV_TOP_EQU0_EQU_C0_LP,
629 ATV_TOP_EQU0_EQU_C0_BG,
630 ATV_TOP_EQU0_EQU_C0_DK,
631 ATV_TOP_EQU0_EQU_C0_I},
632
633 {-50,
634 ATV_TOP_EQU1_EQU_C1_FM,
635 ATV_TOP_EQU1_EQU_C1_L,
636 ATV_TOP_EQU1_EQU_C1_LP,
637 ATV_TOP_EQU1_EQU_C1_BG,
638 ATV_TOP_EQU1_EQU_C1_DK,
639 ATV_TOP_EQU1_EQU_C1_I},
640
641 {210,
642 ATV_TOP_EQU2_EQU_C2_FM,
643 ATV_TOP_EQU2_EQU_C2_L,
644 ATV_TOP_EQU2_EQU_C2_LP,
645 ATV_TOP_EQU2_EQU_C2_BG,
646 ATV_TOP_EQU2_EQU_C2_DK,
647 ATV_TOP_EQU2_EQU_C2_I},
648
649 {-160,
650 ATV_TOP_EQU3_EQU_C3_FM,
651 ATV_TOP_EQU3_EQU_C3_L,
652 ATV_TOP_EQU3_EQU_C3_LP,
653 ATV_TOP_EQU3_EQU_C3_BG,
654 ATV_TOP_EQU3_EQU_C3_DK,
655 ATV_TOP_EQU3_EQU_C3_I},
656 false,
657 ATV_TOP_VID_PEAK__PRE,
658 ATV_TOP_NOISE_TH__PRE,
659 true,
660 false,
661 DRXJ_SIF_ATTENUATION_0DB,
662 {
663 DRX_STANDARD_ITU_B,
664 DRX_AGC_CTRL_AUTO,
665 0,
666 0,
667 0xFFFF,
668 0x0000,
669 0x0000,
670 0x0000
671 },
672 {
673 DRX_STANDARD_ITU_B,
674 DRX_AGC_CTRL_AUTO,
675 0,
676 0,
677 0xFFFF,
678 0x0000,
679 0x0000,
680 0x0000
681 },
682 {
683 DRX_STANDARD_8VSB,
684 DRX_AGC_CTRL_AUTO,
685 0,
686 0,
687 0xFFFF,
688 0x0000,
689 0x0000,
690 0x0000
691 },
692 {
693 DRX_STANDARD_8VSB,
694 DRX_AGC_CTRL_AUTO,
695 0,
696 0,
697 0xFFFF,
698 0x0000,
699 0x0000,
700 0x0000
701 },
702 0,
703 0,
704 {
705 DRX_STANDARD_ITU_B,
706 0,
707 false
708 },
709 {
710 DRX_STANDARD_8VSB,
711 0,
712 false
713 },
714
715
716#ifndef _CH_
717 {
718 "01234567890",
719 "01234567890"
720 },
721 {
722 {
723 DRX_MODULE_UNKNOWN,
724 (char *)(NULL),
725 0,
726 0,
727 0,
728 (char *)(NULL)
729 },
730 {
731 DRX_MODULE_UNKNOWN,
732 (char *)(NULL),
733 0,
734 0,
735 0,
736 (char *)(NULL)
737 }
738 },
739 {
740 {
741 (struct drx_version *) (NULL),
742 (struct drx_version_list *) (NULL)
743 },
744 {
745 (struct drx_version *) (NULL),
746 (struct drx_version_list *) (NULL)
747 }
748 },
749#endif
750 false,
751
752 {
753 12000,
754 9300,
755 6600,
756 5280,
757 3700,
758 3000,
759 2000,
760 0},
761 false,
762 0,
763 false,
764 false,
765 DRXJ_MPEGOUTPUT_CLOCK_RATE_AUTO,
766 DRXJ_MPEG_START_WIDTH_1CLKCYC,
767
768
769 {
770 DRX_STANDARD_NTSC,
771 7,
772 true
773 },
774 {
775 DRX_STANDARD_NTSC,
776 DRX_AGC_CTRL_AUTO,
777 0,
778 0,
779 0,
780 3,
781 9500,
782 4000
783 },
784 {
785 DRX_STANDARD_NTSC,
786 DRX_AGC_CTRL_AUTO,
787 0,
788 0,
789 0,
790 3,
791 2400,
792 0
793 },
794 140,
795 0,
796
797 false,
798 SIO_PDR_GPIO_CFG__PRE,
799 SIO_PDR_VSYNC_CFG__PRE,
800 SIO_PDR_SMA_RX_CFG__PRE,
801 SIO_PDR_SMA_TX_CFG__PRE,
802
803 4,
804 DRXJ_OOB_LO_POW_MINUS10DB,
805 {
806 false
807 },
808};
809
810
811
812
813
814static struct i2c_device_addr drxj_default_addr_g = {
815 DRXJ_DEF_I2C_ADDR,
816 DRXJ_DEF_DEMOD_DEV_ID
817};
818
819
820
821
822
823static struct drx_common_attr drxj_default_comm_attr_g = {
824 NULL,
825 true,
826 {0},
827
828 44000,
829 (151875 - 0),
830 0,
831 0,
832 false,
833 {
834
835 true,
836 false,
837 false,
838 false,
839 false,
840 false,
841 false,
842 false,
843 true,
844
845
846 19392658UL,
847
848 DRX_MPEG_STR_WIDTH_1
849 },
850
851
852
853 false,
854
855
856 NULL,
857 0,
858 0,
859 false,
860 0,
861 0,
862 NULL,
863 NULL,
864 0,
865 DRXJ_DEMOD_LOCK,
866 false,
867
868
869 DRX_POWER_UP,
870
871
872 1,
873 0L,
874 0L,
875 false,
876 false,
877 false,
878
879 {
880 0UL
881 },
882 DRX_STANDARD_UNKNOWN,
883 DRX_STANDARD_UNKNOWN,
884 DRX_STANDARD_UNKNOWN,
885 false,
886 0UL,
887 0
888};
889
890
891
892
893
894static struct drx_demod_instance drxj_default_demod_g = {
895 &drxj_default_addr_g,
896 &drxj_default_comm_attr_g,
897 &drxj_data_g
898};
899
900
901
902
903
904
905
906static struct drx_aud_data drxj_default_aud_data_g = {
907 false,
908 DRX_AUD_STANDARD_AUTO,
909
910
911 {
912 false,
913 48000,
914 DRX_I2S_MODE_MASTER,
915 DRX_I2S_WORDLENGTH_32,
916 DRX_I2S_POLARITY_RIGHT,
917 DRX_I2S_FORMAT_WS_WITH_DATA
918 },
919
920 {
921 true,
922 0,
923 DRX_AUD_AVC_OFF,
924 0,
925 DRX_AUD_AVC_MAX_GAIN_12DB,
926 DRX_AUD_AVC_MAX_ATTEN_24DB,
927 0,
928 0
929 },
930 DRX_AUD_AUTO_SOUND_SELECT_ON_CHANGE_ON,
931
932 {
933 440,
934 12,
935 700,
936 },
937
938 {
939
940 {
941 42,
942 DRX_NO_CARRIER_NOISE,
943 0,
944 0
945 },
946
947 {
948 42,
949 DRX_NO_CARRIER_MUTE,
950 0,
951 0
952 },
953
954 },
955
956 {
957 DRX_AUD_SRC_STEREO_OR_A,
958 DRX_AUD_I2S_MATRIX_STEREO,
959 DRX_AUD_FM_MATRIX_SOUND_A
960 },
961 DRX_AUD_DEVIATION_NORMAL,
962 DRX_AUD_AVSYNC_OFF,
963
964
965 {
966 DRX_AUD_MAX_FM_DEVIATION,
967 DRX_AUD_MAX_NICAM_PRESCALE
968 },
969 DRX_AUD_FM_DEEMPH_75US,
970 DRX_BTSC_STEREO,
971 0,
972 false
973};
974
975
976
977
978struct drxjeq_stat {
979 u16 eq_mse;
980 u8 eq_mode;
981 u8 eq_ctrl;
982 u8 eq_stat;
983};
984
985
986struct drxj_hi_cmd {
987 u16 cmd;
988 u16 param1;
989 u16 param2;
990 u16 param3;
991 u16 param4;
992 u16 param5;
993 u16 param6;
994};
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009struct drxu_code_block_hdr {
1010 u32 addr;
1011 u16 size;
1012 u16 flags;
1013 u16 CRC;
1014};
1015
1016
1017
1018
1019
1020static int
1021hi_command(struct i2c_device_addr *dev_addr,
1022 const struct drxj_hi_cmd *cmd, u16 *result);
1023
1024static int
1025ctrl_lock_status(struct drx_demod_instance *demod, enum drx_lock_status *lock_stat);
1026
1027static int
1028ctrl_power_mode(struct drx_demod_instance *demod, enum drx_power_mode *mode);
1029
1030static int power_down_aud(struct drx_demod_instance *demod);
1031
1032static int
1033ctrl_set_cfg_pre_saw(struct drx_demod_instance *demod, struct drxj_cfg_pre_saw *pre_saw);
1034
1035static int
1036ctrl_set_cfg_afe_gain(struct drx_demod_instance *demod, struct drxj_cfg_afe_gain *afe_gain);
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067static u32 frac28(u32 N, u32 D)
1068{
1069 int i = 0;
1070 u32 Q1 = 0;
1071 u32 R0 = 0;
1072
1073 R0 = (N % D) << 4;
1074 Q1 = N / D;
1075
1076
1077
1078 for (i = 0; i < 7; i++) {
1079 Q1 = (Q1 << 4) | R0 / D;
1080 R0 = (R0 % D) << 4;
1081 }
1082
1083 if ((R0 >> 3) >= D)
1084 Q1++;
1085
1086 return Q1;
1087}
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105static u32 log1_times100(u32 x)
1106{
1107 static const u8 scale = 15;
1108 static const u8 index_width = 5;
1109
1110
1111
1112
1113
1114 static const u32 log2lut[] = {
1115 0,
1116 290941,
1117 573196,
1118 847269,
1119 1113620,
1120 1372674,
1121 1624818,
1122 1870412,
1123 2109788,
1124 2343253,
1125 2571091,
1126 2793569,
1127 3010931,
1128 3223408,
1129 3431216,
1130 3634553,
1131 3833610,
1132 4028562,
1133 4219576,
1134 4406807,
1135 4590402,
1136 4770499,
1137 4947231,
1138 5120719,
1139 5291081,
1140 5458428,
1141 5622864,
1142 5784489,
1143 5943398,
1144 6099680,
1145 6253421,
1146 6404702,
1147 6553600,
1148 };
1149
1150 u8 i = 0;
1151 u32 y = 0;
1152 u32 d = 0;
1153 u32 k = 0;
1154 u32 r = 0;
1155
1156 if (x == 0)
1157 return 0;
1158
1159
1160
1161 if ((x & (((u32) (-1)) << (scale + 1))) == 0) {
1162 for (k = scale; k > 0; k--) {
1163 if (x & (((u32) 1) << scale))
1164 break;
1165 x <<= 1;
1166 }
1167 } else {
1168 for (k = scale; k < 31; k++) {
1169 if ((x & (((u32) (-1)) << (scale + 1))) == 0)
1170 break;
1171 x >>= 1;
1172 }
1173 }
1174
1175
1176
1177
1178
1179 y = k * ((((u32) 1) << scale) * 200);
1180
1181
1182 x &= ((((u32) 1) << scale) - 1);
1183
1184 i = (u8) (x >> (scale - index_width));
1185
1186 d = x & ((((u32) 1) << (scale - index_width)) - 1);
1187
1188 y += log2lut[i] +
1189 ((d * (log2lut[i + 1] - log2lut[i])) >> (scale - index_width));
1190
1191 y /= 108853;
1192 r = (y >> 1);
1193
1194 if (y & ((u32)1))
1195 r++;
1196
1197 return r;
1198
1199}
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211static u32 frac_times1e6(u32 N, u32 D)
1212{
1213 u32 remainder = 0;
1214 u32 frac = 0;
1215
1216
1217
1218
1219
1220
1221
1222
1223 frac = (((u32) N) * (1000000 >> 4)) / D;
1224 frac <<= 4;
1225 remainder = (((u32) N) * (1000000 >> 4)) % D;
1226 remainder <<= 4;
1227 frac += remainder / D;
1228 remainder = remainder % D;
1229 if ((remainder * 2) > D)
1230 frac++;
1231
1232 return frac;
1233}
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243static const u16 nicam_presc_table_val[43] = {
1244 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4,
1245 5, 5, 6, 6, 7, 8, 9, 10, 11, 13, 14, 16,
1246 18, 20, 23, 25, 28, 32, 36, 40, 45,
1247 51, 57, 64, 71, 80, 90, 101, 113, 127
1248};
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276#define DRXJ_ISAUDWRITE(addr) (((((addr)>>16)&1) == 1) ? true : false)
1277#define DRXJ_DAP_AUDTRIF_TIMEOUT 80
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289static
1290bool is_handled_by_aud_tr_if(u32 addr)
1291{
1292 bool retval = false;
1293
1294 if ((DRXDAP_FASI_ADDR2BLOCK(addr) == 4) &&
1295 (DRXDAP_FASI_ADDR2BANK(addr) > 1) &&
1296 (DRXDAP_FASI_ADDR2BANK(addr) < 6)) {
1297 retval = true;
1298 }
1299
1300 return retval;
1301}
1302
1303
1304
1305int drxbsp_i2c_write_read(struct i2c_device_addr *w_dev_addr,
1306 u16 w_count,
1307 u8 *wData,
1308 struct i2c_device_addr *r_dev_addr,
1309 u16 r_count, u8 *r_data)
1310{
1311 struct drx39xxj_state *state;
1312 struct i2c_msg msg[2];
1313 unsigned int num_msgs;
1314
1315 if (w_dev_addr == NULL) {
1316
1317 state = r_dev_addr->user_data;
1318 msg[0].addr = r_dev_addr->i2c_addr >> 1;
1319 msg[0].flags = I2C_M_RD;
1320 msg[0].buf = r_data;
1321 msg[0].len = r_count;
1322 num_msgs = 1;
1323 } else if (r_dev_addr == NULL) {
1324
1325 state = w_dev_addr->user_data;
1326 msg[0].addr = w_dev_addr->i2c_addr >> 1;
1327 msg[0].flags = 0;
1328 msg[0].buf = wData;
1329 msg[0].len = w_count;
1330 num_msgs = 1;
1331 } else {
1332
1333 state = w_dev_addr->user_data;
1334 msg[0].addr = w_dev_addr->i2c_addr >> 1;
1335 msg[0].flags = 0;
1336 msg[0].buf = wData;
1337 msg[0].len = w_count;
1338 msg[1].addr = r_dev_addr->i2c_addr >> 1;
1339 msg[1].flags = I2C_M_RD;
1340 msg[1].buf = r_data;
1341 msg[1].len = r_count;
1342 num_msgs = 2;
1343 }
1344
1345 if (state->i2c == NULL) {
1346 pr_err("i2c was zero, aborting\n");
1347 return 0;
1348 }
1349 if (i2c_transfer(state->i2c, msg, num_msgs) != num_msgs) {
1350 pr_warn("drx3933: I2C write/read failed\n");
1351 return -EREMOTEIO;
1352 }
1353
1354#ifdef DJH_DEBUG
1355 if (w_dev_addr == NULL || r_dev_addr == NULL)
1356 return 0;
1357
1358 state = w_dev_addr->user_data;
1359
1360 if (state->i2c == NULL)
1361 return 0;
1362
1363 msg[0].addr = w_dev_addr->i2c_addr;
1364 msg[0].flags = 0;
1365 msg[0].buf = wData;
1366 msg[0].len = w_count;
1367 msg[1].addr = r_dev_addr->i2c_addr;
1368 msg[1].flags = I2C_M_RD;
1369 msg[1].buf = r_data;
1370 msg[1].len = r_count;
1371 num_msgs = 2;
1372
1373 pr_debug("drx3933 i2c operation addr=%x i2c=%p, wc=%x rc=%x\n",
1374 w_dev_addr->i2c_addr, state->i2c, w_count, r_count);
1375
1376 if (i2c_transfer(state->i2c, msg, 2) != 2) {
1377 pr_warn("drx3933: I2C write/read failed\n");
1378 return -EREMOTEIO;
1379 }
1380#endif
1381 return 0;
1382}
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411static int drxdap_fasi_read_block(struct i2c_device_addr *dev_addr,
1412 u32 addr,
1413 u16 datasize,
1414 u8 *data, u32 flags)
1415{
1416 u8 buf[4];
1417 u16 bufx;
1418 int rc;
1419 u16 overhead_size = 0;
1420
1421
1422 if (dev_addr == NULL)
1423 return -EINVAL;
1424
1425 overhead_size = (IS_I2C_10BIT(dev_addr->i2c_addr) ? 2 : 1) +
1426 (DRXDAP_FASI_LONG_FORMAT(addr) ? 4 : 2);
1427
1428 if ((DRXDAP_FASI_OFFSET_TOO_LARGE(addr)) ||
1429 ((!(DRXDAPFASI_LONG_ADDR_ALLOWED)) &&
1430 DRXDAP_FASI_LONG_FORMAT(addr)) ||
1431 (overhead_size > (DRXDAP_MAX_WCHUNKSIZE)) ||
1432 ((datasize != 0) && (data == NULL)) || ((datasize & 1) == 1)) {
1433 return -EINVAL;
1434 }
1435
1436
1437 flags &= (~DRXDAP_FASI_RMW & ~DRXDAP_FASI_MODEFLAGS);
1438#if DRXDAP_SINGLE_MASTER
1439 flags |= DRXDAP_FASI_SINGLE_MASTER;
1440#endif
1441
1442
1443 do {
1444 u16 todo = (datasize < DRXDAP_MAX_RCHUNKSIZE ?
1445 datasize : DRXDAP_MAX_RCHUNKSIZE);
1446
1447 bufx = 0;
1448
1449 addr &= ~DRXDAP_FASI_FLAGS;
1450 addr |= flags;
1451
1452#if ((DRXDAPFASI_LONG_ADDR_ALLOWED == 1) && (DRXDAPFASI_SHORT_ADDR_ALLOWED == 1))
1453
1454 if (DRXDAP_FASI_LONG_FORMAT(addr)) {
1455#endif
1456#if (DRXDAPFASI_LONG_ADDR_ALLOWED == 1)
1457 buf[bufx++] = (u8) (((addr << 1) & 0xFF) | 0x01);
1458 buf[bufx++] = (u8) ((addr >> 16) & 0xFF);
1459 buf[bufx++] = (u8) ((addr >> 24) & 0xFF);
1460 buf[bufx++] = (u8) ((addr >> 7) & 0xFF);
1461#endif
1462#if ((DRXDAPFASI_LONG_ADDR_ALLOWED == 1) && (DRXDAPFASI_SHORT_ADDR_ALLOWED == 1))
1463 } else {
1464#endif
1465#if (DRXDAPFASI_SHORT_ADDR_ALLOWED == 1)
1466 buf[bufx++] = (u8) ((addr << 1) & 0xFF);
1467 buf[bufx++] =
1468 (u8) (((addr >> 16) & 0x0F) |
1469 ((addr >> 18) & 0xF0));
1470#endif
1471#if ((DRXDAPFASI_LONG_ADDR_ALLOWED == 1) && (DRXDAPFASI_SHORT_ADDR_ALLOWED == 1))
1472 }
1473#endif
1474
1475#if DRXDAP_SINGLE_MASTER
1476
1477
1478
1479
1480 rc = drxbsp_i2c_write_read(dev_addr, bufx, buf,
1481 NULL, 0, NULL);
1482 if (rc == 0)
1483 rc = drxbsp_i2c_write_read(NULL, 0, NULL, dev_addr, todo, data);
1484#else
1485
1486 rc = drxbsp_i2c_write_read(dev_addr, bufx, buf, dev_addr, todo,
1487 data);
1488#endif
1489 data += todo;
1490 addr += (todo >> 1);
1491 datasize -= todo;
1492 } while (datasize && rc == 0);
1493
1494 return rc;
1495}
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516static int drxdap_fasi_read_reg16(struct i2c_device_addr *dev_addr,
1517 u32 addr,
1518 u16 *data, u32 flags)
1519{
1520 u8 buf[sizeof(*data)];
1521 int rc;
1522
1523 if (!data)
1524 return -EINVAL;
1525
1526 rc = drxdap_fasi_read_block(dev_addr, addr, sizeof(*data), buf, flags);
1527 *data = buf[0] + (((u16) buf[1]) << 8);
1528 return rc;
1529}
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549static int drxdap_fasi_read_reg32(struct i2c_device_addr *dev_addr,
1550 u32 addr,
1551 u32 *data, u32 flags)
1552{
1553 u8 buf[sizeof(*data)];
1554 int rc;
1555
1556 if (!data)
1557 return -EINVAL;
1558
1559 rc = drxdap_fasi_read_block(dev_addr, addr, sizeof(*data), buf, flags);
1560 *data = (((u32) buf[0]) << 0) +
1561 (((u32) buf[1]) << 8) +
1562 (((u32) buf[2]) << 16) + (((u32) buf[3]) << 24);
1563 return rc;
1564}
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588static int drxdap_fasi_write_block(struct i2c_device_addr *dev_addr,
1589 u32 addr,
1590 u16 datasize,
1591 u8 *data, u32 flags)
1592{
1593 u8 buf[DRXDAP_MAX_WCHUNKSIZE];
1594 int st = -EIO;
1595 int first_err = 0;
1596 u16 overhead_size = 0;
1597 u16 block_size = 0;
1598
1599
1600 if (dev_addr == NULL)
1601 return -EINVAL;
1602
1603 overhead_size = (IS_I2C_10BIT(dev_addr->i2c_addr) ? 2 : 1) +
1604 (DRXDAP_FASI_LONG_FORMAT(addr) ? 4 : 2);
1605
1606 if ((DRXDAP_FASI_OFFSET_TOO_LARGE(addr)) ||
1607 ((!(DRXDAPFASI_LONG_ADDR_ALLOWED)) &&
1608 DRXDAP_FASI_LONG_FORMAT(addr)) ||
1609 (overhead_size > (DRXDAP_MAX_WCHUNKSIZE)) ||
1610 ((datasize != 0) && (data == NULL)) || ((datasize & 1) == 1))
1611 return -EINVAL;
1612
1613 flags &= DRXDAP_FASI_FLAGS;
1614 flags &= ~DRXDAP_FASI_MODEFLAGS;
1615#if DRXDAP_SINGLE_MASTER
1616 flags |= DRXDAP_FASI_SINGLE_MASTER;
1617#endif
1618
1619
1620 block_size = ((DRXDAP_MAX_WCHUNKSIZE) - overhead_size) & ~1;
1621 do {
1622 u16 todo = 0;
1623 u16 bufx = 0;
1624
1625
1626 addr &= ~DRXDAP_FASI_FLAGS;
1627 addr |= flags;
1628#if (((DRXDAPFASI_LONG_ADDR_ALLOWED) == 1) && ((DRXDAPFASI_SHORT_ADDR_ALLOWED) == 1))
1629
1630 if (DRXDAP_FASI_LONG_FORMAT(addr)) {
1631#endif
1632#if ((DRXDAPFASI_LONG_ADDR_ALLOWED) == 1)
1633 buf[bufx++] = (u8) (((addr << 1) & 0xFF) | 0x01);
1634 buf[bufx++] = (u8) ((addr >> 16) & 0xFF);
1635 buf[bufx++] = (u8) ((addr >> 24) & 0xFF);
1636 buf[bufx++] = (u8) ((addr >> 7) & 0xFF);
1637#endif
1638#if (((DRXDAPFASI_LONG_ADDR_ALLOWED) == 1) && ((DRXDAPFASI_SHORT_ADDR_ALLOWED) == 1))
1639 } else {
1640#endif
1641#if ((DRXDAPFASI_SHORT_ADDR_ALLOWED) == 1)
1642 buf[bufx++] = (u8) ((addr << 1) & 0xFF);
1643 buf[bufx++] =
1644 (u8) (((addr >> 16) & 0x0F) |
1645 ((addr >> 18) & 0xF0));
1646#endif
1647#if (((DRXDAPFASI_LONG_ADDR_ALLOWED) == 1) && ((DRXDAPFASI_SHORT_ADDR_ALLOWED) == 1))
1648 }
1649#endif
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659 todo = (block_size < datasize ? block_size : datasize);
1660 if (todo == 0) {
1661 u16 overhead_size_i2c_addr = 0;
1662 u16 data_block_size = 0;
1663
1664 overhead_size_i2c_addr =
1665 (IS_I2C_10BIT(dev_addr->i2c_addr) ? 2 : 1);
1666 data_block_size =
1667 (DRXDAP_MAX_WCHUNKSIZE - overhead_size_i2c_addr) & ~1;
1668
1669
1670 st = drxbsp_i2c_write_read(dev_addr,
1671 (u16) (bufx),
1672 buf,
1673 (struct i2c_device_addr *)(NULL),
1674 0, (u8 *)(NULL));
1675
1676 if ((st != 0) && (first_err == 0)) {
1677
1678 first_err = st;
1679 }
1680 bufx = 0;
1681 todo =
1682 (data_block_size <
1683 datasize ? data_block_size : datasize);
1684 }
1685 memcpy(&buf[bufx], data, todo);
1686
1687 st = drxbsp_i2c_write_read(dev_addr,
1688 (u16) (bufx + todo),
1689 buf,
1690 (struct i2c_device_addr *)(NULL),
1691 0, (u8 *)(NULL));
1692
1693 if ((st != 0) && (first_err == 0)) {
1694
1695 first_err = st;
1696 }
1697 datasize -= todo;
1698 data += todo;
1699 addr += (todo >> 1);
1700 } while (datasize);
1701
1702 return first_err;
1703}
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722static int drxdap_fasi_write_reg16(struct i2c_device_addr *dev_addr,
1723 u32 addr,
1724 u16 data, u32 flags)
1725{
1726 u8 buf[sizeof(data)];
1727
1728 buf[0] = (u8) ((data >> 0) & 0xFF);
1729 buf[1] = (u8) ((data >> 8) & 0xFF);
1730
1731 return drxdap_fasi_write_block(dev_addr, addr, sizeof(data), buf, flags);
1732}
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759static int drxdap_fasi_read_modify_write_reg16(struct i2c_device_addr *dev_addr,
1760 u32 waddr,
1761 u32 raddr,
1762 u16 wdata, u16 *rdata)
1763{
1764 int rc = -EIO;
1765
1766#if (DRXDAPFASI_LONG_ADDR_ALLOWED == 1)
1767 if (rdata == NULL)
1768 return -EINVAL;
1769
1770 rc = drxdap_fasi_write_reg16(dev_addr, waddr, wdata, DRXDAP_FASI_RMW);
1771 if (rc == 0)
1772 rc = drxdap_fasi_read_reg16(dev_addr, raddr, rdata, 0);
1773#endif
1774
1775 return rc;
1776}
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795static int drxdap_fasi_write_reg32(struct i2c_device_addr *dev_addr,
1796 u32 addr,
1797 u32 data, u32 flags)
1798{
1799 u8 buf[sizeof(data)];
1800
1801 buf[0] = (u8) ((data >> 0) & 0xFF);
1802 buf[1] = (u8) ((data >> 8) & 0xFF);
1803 buf[2] = (u8) ((data >> 16) & 0xFF);
1804 buf[3] = (u8) ((data >> 24) & 0xFF);
1805
1806 return drxdap_fasi_write_block(dev_addr, addr, sizeof(data), buf, flags);
1807}
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831#if (DRXDAPFASI_LONG_ADDR_ALLOWED == 0)
1832static int drxj_dap_rm_write_reg16short(struct i2c_device_addr *dev_addr,
1833 u32 waddr,
1834 u32 raddr,
1835 u16 wdata, u16 *rdata)
1836{
1837 int rc;
1838
1839 if (rdata == NULL)
1840 return -EINVAL;
1841
1842
1843 rc = drxdap_fasi_write_reg16(dev_addr,
1844 SIO_HI_RA_RAM_S0_FLG_ACC__A,
1845 SIO_HI_RA_RAM_S0_FLG_ACC_S0_RWM__M,
1846 0x0000);
1847 if (rc == 0) {
1848
1849 rc = drxdap_fasi_write_reg16(dev_addr, waddr, wdata,
1850 0x0000);
1851 }
1852 if (rc == 0) {
1853
1854 rc = drxdap_fasi_read_reg16(dev_addr, raddr, rdata,
1855 0x0000);
1856 }
1857 if (rc == 0) {
1858
1859 rc = drxdap_fasi_write_reg16(dev_addr,
1860 SIO_HI_RA_RAM_S0_FLG_ACC__A,
1861 0, 0x0000);
1862 }
1863
1864 return rc;
1865}
1866#endif
1867
1868
1869
1870static int drxj_dap_read_modify_write_reg16(struct i2c_device_addr *dev_addr,
1871 u32 waddr,
1872 u32 raddr,
1873 u16 wdata, u16 *rdata)
1874{
1875
1876
1877
1878#if (DRXDAPFASI_LONG_ADDR_ALLOWED == 1)
1879 return drxdap_fasi_read_modify_write_reg16(dev_addr,
1880 waddr,
1881 raddr, wdata, rdata);
1882#else
1883 return drxj_dap_rm_write_reg16short(dev_addr, waddr, raddr, wdata, rdata);
1884#endif
1885}
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903static int drxj_dap_read_aud_reg16(struct i2c_device_addr *dev_addr,
1904 u32 addr, u16 *data)
1905{
1906 u32 start_timer = 0;
1907 u32 current_timer = 0;
1908 u32 delta_timer = 0;
1909 u16 tr_status = 0;
1910 int stat = -EIO;
1911
1912
1913 if (DRXDAP_FASI_ADDR2BANK(addr) == 3) {
1914 stat = -EINVAL;
1915 } else {
1916 const u32 write_bit = ((dr_xaddr_t) 1) << 16;
1917
1918
1919 addr &= (~write_bit);
1920
1921
1922 start_timer = jiffies_to_msecs(jiffies);
1923 do {
1924
1925 stat = drxj_dap_read_modify_write_reg16(dev_addr,
1926 addr,
1927 SIO_HI_RA_RAM_S0_RMWBUF__A,
1928 0x0000, &tr_status);
1929
1930 if (stat != 0)
1931 break;
1932
1933 current_timer = jiffies_to_msecs(jiffies);
1934 delta_timer = current_timer - start_timer;
1935 if (delta_timer > DRXJ_DAP_AUDTRIF_TIMEOUT) {
1936 stat = -EIO;
1937 break;
1938 }
1939
1940 } while (((tr_status & AUD_TOP_TR_CTR_FIFO_LOCK__M) ==
1941 AUD_TOP_TR_CTR_FIFO_LOCK_LOCKED) ||
1942 ((tr_status & AUD_TOP_TR_CTR_FIFO_FULL__M) ==
1943 AUD_TOP_TR_CTR_FIFO_FULL_FULL));
1944 }
1945
1946
1947 if (stat == 0) {
1948 start_timer = jiffies_to_msecs(jiffies);
1949
1950 while ((tr_status & AUD_TOP_TR_CTR_FIFO_RD_RDY__M) !=
1951 AUD_TOP_TR_CTR_FIFO_RD_RDY_READY) {
1952 stat = drxj_dap_read_reg16(dev_addr,
1953 AUD_TOP_TR_CTR__A,
1954 &tr_status, 0x0000);
1955 if (stat != 0)
1956 break;
1957
1958 current_timer = jiffies_to_msecs(jiffies);
1959 delta_timer = current_timer - start_timer;
1960 if (delta_timer > DRXJ_DAP_AUDTRIF_TIMEOUT) {
1961 stat = -EIO;
1962 break;
1963 }
1964 }
1965 }
1966
1967
1968 if (stat == 0)
1969 stat = drxj_dap_read_modify_write_reg16(dev_addr,
1970 AUD_TOP_TR_RD_REG__A,
1971 SIO_HI_RA_RAM_S0_RMWBUF__A,
1972 0x0000, data);
1973 return stat;
1974}
1975
1976
1977
1978static int drxj_dap_read_reg16(struct i2c_device_addr *dev_addr,
1979 u32 addr,
1980 u16 *data, u32 flags)
1981{
1982 int stat = -EIO;
1983
1984
1985 if ((dev_addr == NULL) || (data == NULL))
1986 return -EINVAL;
1987
1988 if (is_handled_by_aud_tr_if(addr))
1989 stat = drxj_dap_read_aud_reg16(dev_addr, addr, data);
1990 else
1991 stat = drxdap_fasi_read_reg16(dev_addr, addr, data, flags);
1992
1993 return stat;
1994}
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010static int drxj_dap_write_aud_reg16(struct i2c_device_addr *dev_addr,
2011 u32 addr, u16 data)
2012{
2013 int stat = -EIO;
2014
2015
2016 if (DRXDAP_FASI_ADDR2BANK(addr) == 2) {
2017 stat = -EINVAL;
2018 } else {
2019 u32 start_timer = 0;
2020 u32 current_timer = 0;
2021 u32 delta_timer = 0;
2022 u16 tr_status = 0;
2023 const u32 write_bit = ((dr_xaddr_t) 1) << 16;
2024
2025
2026 addr |= write_bit;
2027 start_timer = jiffies_to_msecs(jiffies);
2028 do {
2029
2030 stat = drxj_dap_read_modify_write_reg16(dev_addr,
2031 addr,
2032 SIO_HI_RA_RAM_S0_RMWBUF__A,
2033 data, &tr_status);
2034 if (stat != 0)
2035 break;
2036
2037 current_timer = jiffies_to_msecs(jiffies);
2038 delta_timer = current_timer - start_timer;
2039 if (delta_timer > DRXJ_DAP_AUDTRIF_TIMEOUT) {
2040 stat = -EIO;
2041 break;
2042 }
2043
2044 } while (((tr_status & AUD_TOP_TR_CTR_FIFO_LOCK__M) ==
2045 AUD_TOP_TR_CTR_FIFO_LOCK_LOCKED) ||
2046 ((tr_status & AUD_TOP_TR_CTR_FIFO_FULL__M) ==
2047 AUD_TOP_TR_CTR_FIFO_FULL_FULL));
2048
2049 }
2050
2051 return stat;
2052}
2053
2054
2055
2056static int drxj_dap_write_reg16(struct i2c_device_addr *dev_addr,
2057 u32 addr,
2058 u16 data, u32 flags)
2059{
2060 int stat = -EIO;
2061
2062
2063 if (dev_addr == NULL)
2064 return -EINVAL;
2065
2066 if (is_handled_by_aud_tr_if(addr))
2067 stat = drxj_dap_write_aud_reg16(dev_addr, addr, data);
2068 else
2069 stat = drxdap_fasi_write_reg16(dev_addr,
2070 addr, data, flags);
2071
2072 return stat;
2073}
2074
2075
2076
2077
2078#define SIO_HI_RA_RAM_USR_BEGIN__A 0x420040
2079#define SIO_HI_RA_RAM_USR_END__A 0x420060
2080
2081#define DRXJ_HI_ATOMIC_BUF_START (SIO_HI_RA_RAM_USR_BEGIN__A)
2082#define DRXJ_HI_ATOMIC_BUF_END (SIO_HI_RA_RAM_USR_BEGIN__A + 7)
2083#define DRXJ_HI_ATOMIC_READ SIO_HI_RA_RAM_PAR_3_ACP_RW_READ
2084#define DRXJ_HI_ATOMIC_WRITE SIO_HI_RA_RAM_PAR_3_ACP_RW_WRITE
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098static
2099int drxj_dap_atomic_read_write_block(struct i2c_device_addr *dev_addr,
2100 u32 addr,
2101 u16 datasize,
2102 u8 *data, bool read_flag)
2103{
2104 struct drxj_hi_cmd hi_cmd;
2105 int rc;
2106 u16 word;
2107 u16 dummy = 0;
2108 u16 i = 0;
2109
2110
2111 if (!data || !dev_addr || ((datasize % 2)) || ((datasize / 2) > 8))
2112 return -EINVAL;
2113
2114
2115 hi_cmd.cmd = SIO_HI_RA_RAM_CMD_ATOMIC_COPY;
2116 hi_cmd.param1 =
2117 (u16) ((DRXDAP_FASI_ADDR2BLOCK(DRXJ_HI_ATOMIC_BUF_START) << 6) +
2118 DRXDAP_FASI_ADDR2BANK(DRXJ_HI_ATOMIC_BUF_START));
2119 hi_cmd.param2 =
2120 (u16) DRXDAP_FASI_ADDR2OFFSET(DRXJ_HI_ATOMIC_BUF_START);
2121 hi_cmd.param3 = (u16) ((datasize / 2) - 1);
2122 if (!read_flag)
2123 hi_cmd.param3 |= DRXJ_HI_ATOMIC_WRITE;
2124 else
2125 hi_cmd.param3 |= DRXJ_HI_ATOMIC_READ;
2126 hi_cmd.param4 = (u16) ((DRXDAP_FASI_ADDR2BLOCK(addr) << 6) +
2127 DRXDAP_FASI_ADDR2BANK(addr));
2128 hi_cmd.param5 = (u16) DRXDAP_FASI_ADDR2OFFSET(addr);
2129
2130 if (!read_flag) {
2131
2132 for (i = 0; i < (datasize / 2); i++) {
2133
2134 word = ((u16) data[2 * i]);
2135 word += (((u16) data[(2 * i) + 1]) << 8);
2136 drxj_dap_write_reg16(dev_addr,
2137 (DRXJ_HI_ATOMIC_BUF_START + i),
2138 word, 0);
2139 }
2140 }
2141
2142 rc = hi_command(dev_addr, &hi_cmd, &dummy);
2143 if (rc != 0) {
2144 pr_err("error %d\n", rc);
2145 goto rw_error;
2146 }
2147
2148 if (read_flag) {
2149
2150 for (i = 0; i < (datasize / 2); i++) {
2151 drxj_dap_read_reg16(dev_addr,
2152 (DRXJ_HI_ATOMIC_BUF_START + i),
2153 &word, 0);
2154 data[2 * i] = (u8) (word & 0xFF);
2155 data[(2 * i) + 1] = (u8) (word >> 8);
2156 }
2157 }
2158
2159 return 0;
2160
2161rw_error:
2162 return rc;
2163
2164}
2165
2166
2167
2168
2169
2170
2171
2172static
2173int drxj_dap_atomic_read_reg32(struct i2c_device_addr *dev_addr,
2174 u32 addr,
2175 u32 *data, u32 flags)
2176{
2177 u8 buf[sizeof(*data)] = { 0 };
2178 int rc = -EIO;
2179 u32 word = 0;
2180
2181 if (!data)
2182 return -EINVAL;
2183
2184 rc = drxj_dap_atomic_read_write_block(dev_addr, addr,
2185 sizeof(*data), buf, true);
2186
2187 if (rc < 0)
2188 return 0;
2189
2190 word = (u32) buf[3];
2191 word <<= 8;
2192 word |= (u32) buf[2];
2193 word <<= 8;
2194 word |= (u32) buf[1];
2195 word <<= 8;
2196 word |= (u32) buf[0];
2197
2198 *data = word;
2199
2200 return rc;
2201}
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226static int hi_cfg_command(const struct drx_demod_instance *demod)
2227{
2228 struct drxj_data *ext_attr = (struct drxj_data *) (NULL);
2229 struct drxj_hi_cmd hi_cmd;
2230 u16 result = 0;
2231 int rc;
2232
2233 ext_attr = (struct drxj_data *) demod->my_ext_attr;
2234
2235 hi_cmd.cmd = SIO_HI_RA_RAM_CMD_CONFIG;
2236 hi_cmd.param1 = SIO_HI_RA_RAM_PAR_1_PAR1_SEC_KEY;
2237 hi_cmd.param2 = ext_attr->hi_cfg_timing_div;
2238 hi_cmd.param3 = ext_attr->hi_cfg_bridge_delay;
2239 hi_cmd.param4 = ext_attr->hi_cfg_wake_up_key;
2240 hi_cmd.param5 = ext_attr->hi_cfg_ctrl;
2241 hi_cmd.param6 = ext_attr->hi_cfg_transmit;
2242
2243 rc = hi_command(demod->my_i2c_dev_addr, &hi_cmd, &result);
2244 if (rc != 0) {
2245 pr_err("error %d\n", rc);
2246 goto rw_error;
2247 }
2248
2249
2250 ext_attr->hi_cfg_ctrl &= (~(SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ));
2251
2252 return 0;
2253
2254rw_error:
2255 return rc;
2256}
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269static int
2270hi_command(struct i2c_device_addr *dev_addr, const struct drxj_hi_cmd *cmd, u16 *result)
2271{
2272 u16 wait_cmd = 0;
2273 u16 nr_retries = 0;
2274 bool powerdown_cmd = false;
2275 int rc;
2276
2277
2278 switch (cmd->cmd) {
2279
2280 case SIO_HI_RA_RAM_CMD_CONFIG:
2281 case SIO_HI_RA_RAM_CMD_ATOMIC_COPY:
2282 rc = drxj_dap_write_reg16(dev_addr, SIO_HI_RA_RAM_PAR_6__A, cmd->param6, 0);
2283 if (rc != 0) {
2284 pr_err("error %d\n", rc);
2285 goto rw_error;
2286 }
2287 rc = drxj_dap_write_reg16(dev_addr, SIO_HI_RA_RAM_PAR_5__A, cmd->param5, 0);
2288 if (rc != 0) {
2289 pr_err("error %d\n", rc);
2290 goto rw_error;
2291 }
2292 rc = drxj_dap_write_reg16(dev_addr, SIO_HI_RA_RAM_PAR_4__A, cmd->param4, 0);
2293 if (rc != 0) {
2294 pr_err("error %d\n", rc);
2295 goto rw_error;
2296 }
2297 rc = drxj_dap_write_reg16(dev_addr, SIO_HI_RA_RAM_PAR_3__A, cmd->param3, 0);
2298 if (rc != 0) {
2299 pr_err("error %d\n", rc);
2300 goto rw_error;
2301 }
2302
2303 case SIO_HI_RA_RAM_CMD_BRDCTRL:
2304 rc = drxj_dap_write_reg16(dev_addr, SIO_HI_RA_RAM_PAR_2__A, cmd->param2, 0);
2305 if (rc != 0) {
2306 pr_err("error %d\n", rc);
2307 goto rw_error;
2308 }
2309 rc = drxj_dap_write_reg16(dev_addr, SIO_HI_RA_RAM_PAR_1__A, cmd->param1, 0);
2310 if (rc != 0) {
2311 pr_err("error %d\n", rc);
2312 goto rw_error;
2313 }
2314
2315 case SIO_HI_RA_RAM_CMD_NULL:
2316
2317 break;
2318
2319 default:
2320 return -EINVAL;
2321 break;
2322 }
2323
2324
2325 rc = drxj_dap_write_reg16(dev_addr, SIO_HI_RA_RAM_CMD__A, cmd->cmd, 0);
2326 if (rc != 0) {
2327 pr_err("error %d\n", rc);
2328 goto rw_error;
2329 }
2330
2331 if ((cmd->cmd) == SIO_HI_RA_RAM_CMD_RESET)
2332 msleep(1);
2333
2334
2335 powerdown_cmd = (bool) ((cmd->cmd == SIO_HI_RA_RAM_CMD_CONFIG) &&
2336 (((cmd->
2337 param5) & SIO_HI_RA_RAM_PAR_5_CFG_SLEEP__M)
2338 == SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ));
2339 if (!powerdown_cmd) {
2340
2341 do {
2342 nr_retries++;
2343 if (nr_retries > DRXJ_MAX_RETRIES) {
2344 pr_err("timeout\n");
2345 goto rw_error;
2346 }
2347
2348 rc = drxj_dap_read_reg16(dev_addr, SIO_HI_RA_RAM_CMD__A, &wait_cmd, 0);
2349 if (rc != 0) {
2350 pr_err("error %d\n", rc);
2351 goto rw_error;
2352 }
2353 } while (wait_cmd != 0);
2354
2355
2356 rc = drxj_dap_read_reg16(dev_addr, SIO_HI_RA_RAM_RES__A, result, 0);
2357 if (rc != 0) {
2358 pr_err("error %d\n", rc);
2359 goto rw_error;
2360 }
2361
2362 }
2363
2364 return 0;
2365rw_error:
2366 return rc;
2367}
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382static int init_hi(const struct drx_demod_instance *demod)
2383{
2384 struct drxj_data *ext_attr = (struct drxj_data *) (NULL);
2385 struct drx_common_attr *common_attr = (struct drx_common_attr *) (NULL);
2386 struct i2c_device_addr *dev_addr = (struct i2c_device_addr *)(NULL);
2387 int rc;
2388
2389 ext_attr = (struct drxj_data *) demod->my_ext_attr;
2390 common_attr = (struct drx_common_attr *) demod->my_common_attr;
2391 dev_addr = demod->my_i2c_dev_addr;
2392
2393
2394 rc = drxj_dap_write_reg16(dev_addr, 0x4301D7, 0x801, 0);
2395 if (rc != 0) {
2396 pr_err("error %d\n", rc);
2397 goto rw_error;
2398 }
2399
2400
2401
2402 ext_attr->hi_cfg_timing_div =
2403 (u16) ((common_attr->sys_clock_freq / 1000) * HI_I2C_DELAY) / 1000;
2404
2405 if ((ext_attr->hi_cfg_timing_div) > SIO_HI_RA_RAM_PAR_2_CFG_DIV__M)
2406 ext_attr->hi_cfg_timing_div = SIO_HI_RA_RAM_PAR_2_CFG_DIV__M;
2407
2408
2409
2410 ext_attr->hi_cfg_bridge_delay =
2411 (u16) ((common_attr->osc_clock_freq / 1000) * HI_I2C_BRIDGE_DELAY) /
2412 1000;
2413
2414 if ((ext_attr->hi_cfg_bridge_delay) > SIO_HI_RA_RAM_PAR_3_CFG_DBL_SDA__M)
2415 ext_attr->hi_cfg_bridge_delay = SIO_HI_RA_RAM_PAR_3_CFG_DBL_SDA__M;
2416
2417 ext_attr->hi_cfg_bridge_delay += ((ext_attr->hi_cfg_bridge_delay) <<
2418 SIO_HI_RA_RAM_PAR_3_CFG_DBL_SCL__B);
2419
2420
2421
2422 ext_attr->hi_cfg_wake_up_key = DRXJ_WAKE_UP_KEY;
2423
2424 ext_attr->hi_cfg_ctrl = (SIO_HI_RA_RAM_PAR_5_CFG_SLV0_SLAVE);
2425
2426 ext_attr->hi_cfg_transmit = SIO_HI_RA_RAM_PAR_6__PRE;
2427
2428 rc = hi_cfg_command(demod);
2429 if (rc != 0) {
2430 pr_err("error %d\n", rc);
2431 goto rw_error;
2432 }
2433
2434 return 0;
2435
2436rw_error:
2437 return rc;
2438}
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466static int get_device_capabilities(struct drx_demod_instance *demod)
2467{
2468 struct drx_common_attr *common_attr = (struct drx_common_attr *) (NULL);
2469 struct drxj_data *ext_attr = (struct drxj_data *) NULL;
2470 struct i2c_device_addr *dev_addr = (struct i2c_device_addr *)(NULL);
2471 u16 sio_pdr_ohw_cfg = 0;
2472 u32 sio_top_jtagid_lo = 0;
2473 u16 bid = 0;
2474 int rc;
2475
2476 common_attr = (struct drx_common_attr *) demod->my_common_attr;
2477 ext_attr = (struct drxj_data *) demod->my_ext_attr;
2478 dev_addr = demod->my_i2c_dev_addr;
2479
2480 rc = drxj_dap_write_reg16(dev_addr, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY_KEY, 0);
2481 if (rc != 0) {
2482 pr_err("error %d\n", rc);
2483 goto rw_error;
2484 }
2485 rc = drxj_dap_read_reg16(dev_addr, SIO_PDR_OHW_CFG__A, &sio_pdr_ohw_cfg, 0);
2486 if (rc != 0) {
2487 pr_err("error %d\n", rc);
2488 goto rw_error;
2489 }
2490 rc = drxj_dap_write_reg16(dev_addr, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY__PRE, 0);
2491 if (rc != 0) {
2492 pr_err("error %d\n", rc);
2493 goto rw_error;
2494 }
2495
2496 switch ((sio_pdr_ohw_cfg & SIO_PDR_OHW_CFG_FREF_SEL__M)) {
2497 case 0:
2498
2499 break;
2500 case 1:
2501
2502 common_attr->osc_clock_freq = 27000;
2503 break;
2504 case 2:
2505
2506 common_attr->osc_clock_freq = 20250;
2507 break;
2508 case 3:
2509
2510 common_attr->osc_clock_freq = 4000;
2511 break;
2512 default:
2513 return -EIO;
2514 }
2515
2516
2517
2518
2519
2520 rc = drxdap_fasi_read_reg32(dev_addr, SIO_TOP_JTAGID_LO__A, &sio_top_jtagid_lo, 0);
2521 if (rc != 0) {
2522 pr_err("error %d\n", rc);
2523 goto rw_error;
2524 }
2525 ext_attr->mfx = (u8) ((sio_top_jtagid_lo >> 29) & 0xF);
2526
2527 switch ((sio_top_jtagid_lo >> 12) & 0xFF) {
2528 case 0x31:
2529 rc = drxj_dap_write_reg16(dev_addr, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY_KEY, 0);
2530 if (rc != 0) {
2531 pr_err("error %d\n", rc);
2532 goto rw_error;
2533 }
2534 rc = drxj_dap_read_reg16(dev_addr, SIO_PDR_UIO_IN_HI__A, &bid, 0);
2535 if (rc != 0) {
2536 pr_err("error %d\n", rc);
2537 goto rw_error;
2538 }
2539 bid = (bid >> 10) & 0xf;
2540 rc = drxj_dap_write_reg16(dev_addr, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY__PRE, 0);
2541 if (rc != 0) {
2542 pr_err("error %d\n", rc);
2543 goto rw_error;
2544 }
2545
2546 ext_attr->has_lna = true;
2547 ext_attr->has_ntsc = false;
2548 ext_attr->has_btsc = false;
2549 ext_attr->has_oob = false;
2550 ext_attr->has_smatx = true;
2551 ext_attr->has_smarx = false;
2552 ext_attr->has_gpio = false;
2553 ext_attr->has_irqn = false;
2554 break;
2555 case 0x33:
2556 ext_attr->has_lna = false;
2557 ext_attr->has_ntsc = false;
2558 ext_attr->has_btsc = false;
2559 ext_attr->has_oob = false;
2560 ext_attr->has_smatx = true;
2561 ext_attr->has_smarx = false;
2562 ext_attr->has_gpio = false;
2563 ext_attr->has_irqn = false;
2564 break;
2565 case 0x45:
2566 ext_attr->has_lna = true;
2567 ext_attr->has_ntsc = true;
2568 ext_attr->has_btsc = false;
2569 ext_attr->has_oob = false;
2570 ext_attr->has_smatx = true;
2571 ext_attr->has_smarx = true;
2572 ext_attr->has_gpio = true;
2573 ext_attr->has_irqn = false;
2574 break;
2575 case 0x46:
2576 ext_attr->has_lna = false;
2577 ext_attr->has_ntsc = true;
2578 ext_attr->has_btsc = false;
2579 ext_attr->has_oob = false;
2580 ext_attr->has_smatx = true;
2581 ext_attr->has_smarx = true;
2582 ext_attr->has_gpio = true;
2583 ext_attr->has_irqn = false;
2584 break;
2585 case 0x41:
2586 ext_attr->has_lna = true;
2587 ext_attr->has_ntsc = true;
2588 ext_attr->has_btsc = true;
2589 ext_attr->has_oob = false;
2590 ext_attr->has_smatx = true;
2591 ext_attr->has_smarx = true;
2592 ext_attr->has_gpio = true;
2593 ext_attr->has_irqn = false;
2594 break;
2595 case 0x43:
2596 ext_attr->has_lna = false;
2597 ext_attr->has_ntsc = true;
2598 ext_attr->has_btsc = true;
2599 ext_attr->has_oob = false;
2600 ext_attr->has_smatx = true;
2601 ext_attr->has_smarx = true;
2602 ext_attr->has_gpio = true;
2603 ext_attr->has_irqn = false;
2604 break;
2605 case 0x32:
2606 ext_attr->has_lna = true;
2607 ext_attr->has_ntsc = false;
2608 ext_attr->has_btsc = false;
2609 ext_attr->has_oob = true;
2610 ext_attr->has_smatx = true;
2611 ext_attr->has_smarx = true;
2612 ext_attr->has_gpio = true;
2613 ext_attr->has_irqn = true;
2614 break;
2615 case 0x34:
2616 ext_attr->has_lna = false;
2617 ext_attr->has_ntsc = true;
2618 ext_attr->has_btsc = true;
2619 ext_attr->has_oob = true;
2620 ext_attr->has_smatx = true;
2621 ext_attr->has_smarx = true;
2622 ext_attr->has_gpio = true;
2623 ext_attr->has_irqn = true;
2624 break;
2625 case 0x42:
2626 ext_attr->has_lna = true;
2627 ext_attr->has_ntsc = true;
2628 ext_attr->has_btsc = true;
2629 ext_attr->has_oob = true;
2630 ext_attr->has_smatx = true;
2631 ext_attr->has_smarx = true;
2632 ext_attr->has_gpio = true;
2633 ext_attr->has_irqn = true;
2634 break;
2635 case 0x44:
2636 ext_attr->has_lna = false;
2637 ext_attr->has_ntsc = true;
2638 ext_attr->has_btsc = true;
2639 ext_attr->has_oob = true;
2640 ext_attr->has_smatx = true;
2641 ext_attr->has_smarx = true;
2642 ext_attr->has_gpio = true;
2643 ext_attr->has_irqn = true;
2644 break;
2645 default:
2646
2647 return -EIO;
2648 break;
2649 }
2650
2651 return 0;
2652rw_error:
2653 return rc;
2654}
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666#ifndef DRXJ_MAX_RETRIES_POWERUP
2667#define DRXJ_MAX_RETRIES_POWERUP 10
2668#endif
2669
2670static int power_up_device(struct drx_demod_instance *demod)
2671{
2672 struct i2c_device_addr *dev_addr = (struct i2c_device_addr *)(NULL);
2673 u8 data = 0;
2674 u16 retry_count = 0;
2675 struct i2c_device_addr wake_up_addr;
2676
2677 dev_addr = demod->my_i2c_dev_addr;
2678 wake_up_addr.i2c_addr = DRXJ_WAKE_UP_KEY;
2679 wake_up_addr.i2c_dev_id = dev_addr->i2c_dev_id;
2680 wake_up_addr.user_data = dev_addr->user_data;
2681
2682
2683
2684
2685
2686 do {
2687 data = 0;
2688 drxbsp_i2c_write_read(&wake_up_addr, 1, &data,
2689 (struct i2c_device_addr *)(NULL), 0,
2690 (u8 *)(NULL));
2691 msleep(10);
2692 retry_count++;
2693 } while ((drxbsp_i2c_write_read
2694 ((struct i2c_device_addr *) (NULL), 0, (u8 *)(NULL), dev_addr, 1,
2695 &data)
2696 != 0) && (retry_count < DRXJ_MAX_RETRIES_POWERUP));
2697
2698
2699 msleep(10);
2700
2701 if (retry_count == DRXJ_MAX_RETRIES_POWERUP)
2702 return -EIO;
2703
2704 return 0;
2705}
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720static int
2721ctrl_set_cfg_mpeg_output(struct drx_demod_instance *demod, struct drx_cfg_mpeg_output *cfg_data)
2722{
2723 struct i2c_device_addr *dev_addr = (struct i2c_device_addr *)(NULL);
2724 struct drxj_data *ext_attr = (struct drxj_data *) (NULL);
2725 struct drx_common_attr *common_attr = (struct drx_common_attr *) (NULL);
2726 int rc;
2727 u16 fec_oc_reg_mode = 0;
2728 u16 fec_oc_reg_ipr_mode = 0;
2729 u16 fec_oc_reg_ipr_invert = 0;
2730 u32 max_bit_rate = 0;
2731 u32 rcn_rate = 0;
2732 u32 nr_bits = 0;
2733 u16 sio_pdr_md_cfg = 0;
2734
2735 u16 invert_data_mask =
2736 FEC_OC_IPR_INVERT_MD7__M | FEC_OC_IPR_INVERT_MD6__M |
2737 FEC_OC_IPR_INVERT_MD5__M | FEC_OC_IPR_INVERT_MD4__M |
2738 FEC_OC_IPR_INVERT_MD3__M | FEC_OC_IPR_INVERT_MD2__M |
2739 FEC_OC_IPR_INVERT_MD1__M | FEC_OC_IPR_INVERT_MD0__M;
2740
2741
2742 if ((demod == NULL) || (cfg_data == NULL))
2743 return -EINVAL;
2744
2745 dev_addr = demod->my_i2c_dev_addr;
2746 ext_attr = (struct drxj_data *) demod->my_ext_attr;
2747 common_attr = (struct drx_common_attr *) demod->my_common_attr;
2748
2749 if (cfg_data->enable_mpeg_output == true) {
2750
2751
2752 switch (ext_attr->standard) {
2753 case DRX_STANDARD_8VSB:
2754 case DRX_STANDARD_ITU_A:
2755 case DRX_STANDARD_ITU_B:
2756 case DRX_STANDARD_ITU_C:
2757 break;
2758 default:
2759 return 0;
2760 }
2761
2762 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_OCR_INVERT__A, 0, 0);
2763 if (rc != 0) {
2764 pr_err("error %d\n", rc);
2765 goto rw_error;
2766 }
2767 switch (ext_attr->standard) {
2768 case DRX_STANDARD_8VSB:
2769 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_FCT_USAGE__A, 7, 0);
2770 if (rc != 0) {
2771 pr_err("error %d\n", rc);
2772 goto rw_error;
2773 }
2774 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_TMD_CTL_UPD_RATE__A, 10, 0);
2775 if (rc != 0) {
2776 pr_err("error %d\n", rc);
2777 goto rw_error;
2778 }
2779 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_TMD_INT_UPD_RATE__A, 10, 0);
2780 if (rc != 0) {
2781 pr_err("error %d\n", rc);
2782 goto rw_error;
2783 }
2784 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_AVR_PARM_A__A, 5, 0);
2785 if (rc != 0) {
2786 pr_err("error %d\n", rc);
2787 goto rw_error;
2788 }
2789 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_AVR_PARM_B__A, 7, 0);
2790 if (rc != 0) {
2791 pr_err("error %d\n", rc);
2792 goto rw_error;
2793 }
2794 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_RCN_GAIN__A, 10, 0);
2795 if (rc != 0) {
2796 pr_err("error %d\n", rc);
2797 goto rw_error;
2798 }
2799
2800 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_SNC_LWM__A, 3, 0);
2801 if (rc != 0) {
2802 pr_err("error %d\n", rc);
2803 goto rw_error;
2804 }
2805
2806 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_SNC_HWM__A, 5, 0);
2807 if (rc != 0) {
2808 pr_err("error %d\n", rc);
2809 goto rw_error;
2810 }
2811 break;
2812 case DRX_STANDARD_ITU_A:
2813 case DRX_STANDARD_ITU_C:
2814 switch (ext_attr->constellation) {
2815 case DRX_CONSTELLATION_QAM256:
2816 nr_bits = 8;
2817 break;
2818 case DRX_CONSTELLATION_QAM128:
2819 nr_bits = 7;
2820 break;
2821 case DRX_CONSTELLATION_QAM64:
2822 nr_bits = 6;
2823 break;
2824 case DRX_CONSTELLATION_QAM32:
2825 nr_bits = 5;
2826 break;
2827 case DRX_CONSTELLATION_QAM16:
2828 nr_bits = 4;
2829 break;
2830 default:
2831 return -EIO;
2832 }
2833
2834
2835 max_bit_rate =
2836 (ext_attr->curr_symbol_rate / 8) * nr_bits * 188;
2837
2838 case DRX_STANDARD_ITU_B:
2839 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_FCT_USAGE__A, FEC_OC_FCT_USAGE__PRE, 0);
2840 if (rc != 0) {
2841 pr_err("error %d\n", rc);
2842 goto rw_error;
2843 }
2844 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_TMD_CTL_UPD_RATE__A, FEC_OC_TMD_CTL_UPD_RATE__PRE, 0);
2845 if (rc != 0) {
2846 pr_err("error %d\n", rc);
2847 goto rw_error;
2848 }
2849 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_TMD_INT_UPD_RATE__A, 5, 0);
2850 if (rc != 0) {
2851 pr_err("error %d\n", rc);
2852 goto rw_error;
2853 }
2854 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_AVR_PARM_A__A, FEC_OC_AVR_PARM_A__PRE, 0);
2855 if (rc != 0) {
2856 pr_err("error %d\n", rc);
2857 goto rw_error;
2858 }
2859 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_AVR_PARM_B__A, FEC_OC_AVR_PARM_B__PRE, 0);
2860 if (rc != 0) {
2861 pr_err("error %d\n", rc);
2862 goto rw_error;
2863 }
2864 if (cfg_data->static_clk == true) {
2865 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_RCN_GAIN__A, 0xD, 0);
2866 if (rc != 0) {
2867 pr_err("error %d\n", rc);
2868 goto rw_error;
2869 }
2870 } else {
2871 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_RCN_GAIN__A, FEC_OC_RCN_GAIN__PRE, 0);
2872 if (rc != 0) {
2873 pr_err("error %d\n", rc);
2874 goto rw_error;
2875 }
2876 }
2877 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_SNC_LWM__A, 2, 0);
2878 if (rc != 0) {
2879 pr_err("error %d\n", rc);
2880 goto rw_error;
2881 }
2882 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_SNC_HWM__A, 12, 0);
2883 if (rc != 0) {
2884 pr_err("error %d\n", rc);
2885 goto rw_error;
2886 }
2887 break;
2888 default:
2889 break;
2890 }
2891
2892
2893 rc = drxj_dap_read_reg16(dev_addr, FEC_OC_MODE__A, &fec_oc_reg_mode, 0);
2894 if (rc != 0) {
2895 pr_err("error %d\n", rc);
2896 goto rw_error;
2897 }
2898 rc = drxj_dap_read_reg16(dev_addr, FEC_OC_IPR_MODE__A, &fec_oc_reg_ipr_mode, 0);
2899 if (rc != 0) {
2900 pr_err("error %d\n", rc);
2901 goto rw_error;
2902 }
2903 if (cfg_data->insert_rs_byte == true) {
2904
2905 fec_oc_reg_mode |= FEC_OC_MODE_PARITY__M;
2906
2907 fec_oc_reg_ipr_mode |= FEC_OC_IPR_MODE_MVAL_DIS_PAR__M;
2908 switch (ext_attr->standard) {
2909 case DRX_STANDARD_8VSB:
2910 rcn_rate = 0x004854D3;
2911 break;
2912 case DRX_STANDARD_ITU_B:
2913 fec_oc_reg_mode |= FEC_OC_MODE_TRANSPARENT__M;
2914 switch (ext_attr->constellation) {
2915 case DRX_CONSTELLATION_QAM256:
2916 rcn_rate = 0x008945E7;
2917 break;
2918 case DRX_CONSTELLATION_QAM64:
2919 rcn_rate = 0x005F64D4;
2920 break;
2921 default:
2922 return -EIO;
2923 }
2924 break;
2925 case DRX_STANDARD_ITU_A:
2926 case DRX_STANDARD_ITU_C:
2927
2928 rcn_rate =
2929 (frac28
2930 (max_bit_rate,
2931 (u32) (common_attr->sys_clock_freq / 8))) /
2932 188;
2933 break;
2934 default:
2935 return -EIO;
2936 }
2937 } else {
2938
2939
2940 fec_oc_reg_mode &= (~FEC_OC_MODE_PARITY__M);
2941
2942 fec_oc_reg_ipr_mode &= (~FEC_OC_IPR_MODE_MVAL_DIS_PAR__M);
2943 switch (ext_attr->standard) {
2944 case DRX_STANDARD_8VSB:
2945 rcn_rate = 0x0041605C;
2946 break;
2947 case DRX_STANDARD_ITU_B:
2948 fec_oc_reg_mode &= (~FEC_OC_MODE_TRANSPARENT__M);
2949 switch (ext_attr->constellation) {
2950 case DRX_CONSTELLATION_QAM256:
2951 rcn_rate = 0x0082D6A0;
2952 break;
2953 case DRX_CONSTELLATION_QAM64:
2954 rcn_rate = 0x005AEC1A;
2955 break;
2956 default:
2957 return -EIO;
2958 }
2959 break;
2960 case DRX_STANDARD_ITU_A:
2961 case DRX_STANDARD_ITU_C:
2962
2963 rcn_rate =
2964 (frac28
2965 (max_bit_rate,
2966 (u32) (common_attr->sys_clock_freq / 8))) /
2967 204;
2968 break;
2969 default:
2970 return -EIO;
2971 }
2972 }
2973
2974 if (cfg_data->enable_parallel == true) {
2975 fec_oc_reg_ipr_mode &= (~(FEC_OC_IPR_MODE_SERIAL__M));
2976 } else {
2977 fec_oc_reg_ipr_mode |= FEC_OC_IPR_MODE_SERIAL__M;
2978 }
2979
2980
2981 if (cfg_data->invert_data == true)
2982 fec_oc_reg_ipr_invert |= invert_data_mask;
2983 else
2984 fec_oc_reg_ipr_invert &= (~(invert_data_mask));
2985
2986 if (cfg_data->invert_err == true)
2987 fec_oc_reg_ipr_invert |= FEC_OC_IPR_INVERT_MERR__M;
2988 else
2989 fec_oc_reg_ipr_invert &= (~(FEC_OC_IPR_INVERT_MERR__M));
2990
2991 if (cfg_data->invert_str == true)
2992 fec_oc_reg_ipr_invert |= FEC_OC_IPR_INVERT_MSTRT__M;
2993 else
2994 fec_oc_reg_ipr_invert &= (~(FEC_OC_IPR_INVERT_MSTRT__M));
2995
2996 if (cfg_data->invert_val == true)
2997 fec_oc_reg_ipr_invert |= FEC_OC_IPR_INVERT_MVAL__M;
2998 else
2999 fec_oc_reg_ipr_invert &= (~(FEC_OC_IPR_INVERT_MVAL__M));
3000
3001 if (cfg_data->invert_clk == true)
3002 fec_oc_reg_ipr_invert |= FEC_OC_IPR_INVERT_MCLK__M;
3003 else
3004 fec_oc_reg_ipr_invert &= (~(FEC_OC_IPR_INVERT_MCLK__M));
3005
3006
3007 if (cfg_data->static_clk == true) {
3008 u32 dto_rate = 0;
3009 u32 bit_rate = 0;
3010 u16 fec_oc_dto_burst_len = 0;
3011 u16 fec_oc_dto_period = 0;
3012
3013 fec_oc_dto_burst_len = FEC_OC_DTO_BURST_LEN__PRE;
3014
3015 switch (ext_attr->standard) {
3016 case DRX_STANDARD_8VSB:
3017 fec_oc_dto_period = 4;
3018 if (cfg_data->insert_rs_byte == true)
3019 fec_oc_dto_burst_len = 208;
3020 break;
3021 case DRX_STANDARD_ITU_A:
3022 {
3023 u32 symbol_rate_th = 6400000;
3024 if (cfg_data->insert_rs_byte == true) {
3025 fec_oc_dto_burst_len = 204;
3026 symbol_rate_th = 5900000;
3027 }
3028 if (ext_attr->curr_symbol_rate >=
3029 symbol_rate_th) {
3030 fec_oc_dto_period = 0;
3031 } else {
3032 fec_oc_dto_period = 1;
3033 }
3034 }
3035 break;
3036 case DRX_STANDARD_ITU_B:
3037 fec_oc_dto_period = 1;
3038 if (cfg_data->insert_rs_byte == true)
3039 fec_oc_dto_burst_len = 128;
3040 break;
3041 case DRX_STANDARD_ITU_C:
3042 fec_oc_dto_period = 1;
3043 if (cfg_data->insert_rs_byte == true)
3044 fec_oc_dto_burst_len = 204;
3045 break;
3046 default:
3047 return -EIO;
3048 }
3049 bit_rate =
3050 common_attr->sys_clock_freq * 1000 / (fec_oc_dto_period +
3051 2);
3052 dto_rate =
3053 frac28(bit_rate, common_attr->sys_clock_freq * 1000);
3054 dto_rate >>= 3;
3055 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_DTO_RATE_HI__A, (u16)((dto_rate >> 16) & FEC_OC_DTO_RATE_HI__M), 0);
3056 if (rc != 0) {
3057 pr_err("error %d\n", rc);
3058 goto rw_error;
3059 }
3060 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_DTO_RATE_LO__A, (u16)(dto_rate & FEC_OC_DTO_RATE_LO_RATE_LO__M), 0);
3061 if (rc != 0) {
3062 pr_err("error %d\n", rc);
3063 goto rw_error;
3064 }
3065 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_DTO_MODE__A, FEC_OC_DTO_MODE_DYNAMIC__M | FEC_OC_DTO_MODE_OFFSET_ENABLE__M, 0);
3066 if (rc != 0) {
3067 pr_err("error %d\n", rc);
3068 goto rw_error;
3069 }
3070 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_FCT_MODE__A, FEC_OC_FCT_MODE_RAT_ENA__M | FEC_OC_FCT_MODE_VIRT_ENA__M, 0);
3071 if (rc != 0) {
3072 pr_err("error %d\n", rc);
3073 goto rw_error;
3074 }
3075 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_DTO_BURST_LEN__A, fec_oc_dto_burst_len, 0);
3076 if (rc != 0) {
3077 pr_err("error %d\n", rc);
3078 goto rw_error;
3079 }
3080 if (ext_attr->mpeg_output_clock_rate != DRXJ_MPEGOUTPUT_CLOCK_RATE_AUTO)
3081 fec_oc_dto_period = ext_attr->mpeg_output_clock_rate - 1;
3082 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_DTO_PERIOD__A, fec_oc_dto_period, 0);
3083 if (rc != 0) {
3084 pr_err("error %d\n", rc);
3085 goto rw_error;
3086 }
3087 } else {
3088
3089 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_DTO_MODE__A, FEC_OC_DTO_MODE_DYNAMIC__M, 0);
3090 if (rc != 0) {
3091 pr_err("error %d\n", rc);
3092 goto rw_error;
3093 }
3094 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_FCT_MODE__A, 0, 0);
3095 if (rc != 0) {
3096 pr_err("error %d\n", rc);
3097 goto rw_error;
3098 }
3099 }
3100
3101 rc = drxdap_fasi_write_reg32(dev_addr, FEC_OC_RCN_CTL_RATE_LO__A, rcn_rate, 0);
3102 if (rc != 0) {
3103 pr_err("error %d\n", rc);
3104 goto rw_error;
3105 }
3106
3107
3108 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_MODE__A, fec_oc_reg_mode, 0);
3109 if (rc != 0) {
3110 pr_err("error %d\n", rc);
3111 goto rw_error;
3112 }
3113 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_IPR_MODE__A, fec_oc_reg_ipr_mode, 0);
3114 if (rc != 0) {
3115 pr_err("error %d\n", rc);
3116 goto rw_error;
3117 }
3118 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_IPR_INVERT__A, fec_oc_reg_ipr_invert, 0);
3119 if (rc != 0) {
3120 pr_err("error %d\n", rc);
3121 goto rw_error;
3122 }
3123
3124
3125
3126 rc = drxj_dap_write_reg16(dev_addr, SIO_TOP_COMM_KEY__A, 0xFABA, 0);
3127 if (rc != 0) {
3128 pr_err("error %d\n", rc);
3129 goto rw_error;
3130 }
3131
3132 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MSTRT_CFG__A, 0x0013, 0);
3133 if (rc != 0) {
3134 pr_err("error %d\n", rc);
3135 goto rw_error;
3136 }
3137 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MERR_CFG__A, 0x0013, 0);
3138 if (rc != 0) {
3139 pr_err("error %d\n", rc);
3140 goto rw_error;
3141 }
3142 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MCLK_CFG__A, MPEG_OUTPUT_CLK_DRIVE_STRENGTH << SIO_PDR_MCLK_CFG_DRIVE__B | 0x03 << SIO_PDR_MCLK_CFG_MODE__B, 0);
3143 if (rc != 0) {
3144 pr_err("error %d\n", rc);
3145 goto rw_error;
3146 }
3147 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MVAL_CFG__A, 0x0013, 0);
3148 if (rc != 0) {
3149 pr_err("error %d\n", rc);
3150 goto rw_error;
3151 }
3152 sio_pdr_md_cfg =
3153 MPEG_SERIAL_OUTPUT_PIN_DRIVE_STRENGTH <<
3154 SIO_PDR_MD0_CFG_DRIVE__B | 0x03 << SIO_PDR_MD0_CFG_MODE__B;
3155 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD0_CFG__A, sio_pdr_md_cfg, 0);
3156 if (rc != 0) {
3157 pr_err("error %d\n", rc);
3158 goto rw_error;
3159 }
3160 if (cfg_data->enable_parallel == true) {
3161 sio_pdr_md_cfg =
3162 MPEG_PARALLEL_OUTPUT_PIN_DRIVE_STRENGTH <<
3163 SIO_PDR_MD0_CFG_DRIVE__B | 0x03 <<
3164 SIO_PDR_MD0_CFG_MODE__B;
3165 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD0_CFG__A, sio_pdr_md_cfg, 0);
3166 if (rc != 0) {
3167 pr_err("error %d\n", rc);
3168 goto rw_error;
3169 }
3170 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD1_CFG__A, sio_pdr_md_cfg, 0);
3171 if (rc != 0) {
3172 pr_err("error %d\n", rc);
3173 goto rw_error;
3174 }
3175 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD2_CFG__A, sio_pdr_md_cfg, 0);
3176 if (rc != 0) {
3177 pr_err("error %d\n", rc);
3178 goto rw_error;
3179 }
3180 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD3_CFG__A, sio_pdr_md_cfg, 0);
3181 if (rc != 0) {
3182 pr_err("error %d\n", rc);
3183 goto rw_error;
3184 }
3185 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD4_CFG__A, sio_pdr_md_cfg, 0);
3186 if (rc != 0) {
3187 pr_err("error %d\n", rc);
3188 goto rw_error;
3189 }
3190 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD5_CFG__A, sio_pdr_md_cfg, 0);
3191 if (rc != 0) {
3192 pr_err("error %d\n", rc);
3193 goto rw_error;
3194 }
3195 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD6_CFG__A, sio_pdr_md_cfg, 0);
3196 if (rc != 0) {
3197 pr_err("error %d\n", rc);
3198 goto rw_error;
3199 }
3200 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD7_CFG__A, sio_pdr_md_cfg, 0);
3201 if (rc != 0) {
3202 pr_err("error %d\n", rc);
3203 goto rw_error;
3204 }
3205 } else {
3206 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD1_CFG__A, 0x0000, 0);
3207 if (rc != 0) {
3208 pr_err("error %d\n", rc);
3209 goto rw_error;
3210 }
3211 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD2_CFG__A, 0x0000, 0);
3212 if (rc != 0) {
3213 pr_err("error %d\n", rc);
3214 goto rw_error;
3215 }
3216 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD3_CFG__A, 0x0000, 0);
3217 if (rc != 0) {
3218 pr_err("error %d\n", rc);
3219 goto rw_error;
3220 }
3221 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD4_CFG__A, 0x0000, 0);
3222 if (rc != 0) {
3223 pr_err("error %d\n", rc);
3224 goto rw_error;
3225 }
3226 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD5_CFG__A, 0x0000, 0);
3227 if (rc != 0) {
3228 pr_err("error %d\n", rc);
3229 goto rw_error;
3230 }
3231 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD6_CFG__A, 0x0000, 0);
3232 if (rc != 0) {
3233 pr_err("error %d\n", rc);
3234 goto rw_error;
3235 }
3236 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD7_CFG__A, 0x0000, 0);
3237 if (rc != 0) {
3238 pr_err("error %d\n", rc);
3239 goto rw_error;
3240 }
3241 }
3242
3243 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MON_CFG__A, 0x0000, 0);
3244 if (rc != 0) {
3245 pr_err("error %d\n", rc);
3246 goto rw_error;
3247 }
3248
3249 rc = drxj_dap_write_reg16(dev_addr, SIO_TOP_COMM_KEY__A, 0x0000, 0);
3250 if (rc != 0) {
3251 pr_err("error %d\n", rc);
3252 goto rw_error;
3253 }
3254 } else {
3255
3256 rc = drxj_dap_write_reg16(dev_addr, SIO_TOP_COMM_KEY__A, 0xFABA, 0);
3257 if (rc != 0) {
3258 pr_err("error %d\n", rc);
3259 goto rw_error;
3260 }
3261
3262 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MSTRT_CFG__A, 0x0000, 0);
3263 if (rc != 0) {
3264 pr_err("error %d\n", rc);
3265 goto rw_error;
3266 }
3267 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MERR_CFG__A, 0x0000, 0);
3268 if (rc != 0) {
3269 pr_err("error %d\n", rc);
3270 goto rw_error;
3271 }
3272 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MCLK_CFG__A, 0x0000, 0);
3273 if (rc != 0) {
3274 pr_err("error %d\n", rc);
3275 goto rw_error;
3276 }
3277 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MVAL_CFG__A, 0x0000, 0);
3278 if (rc != 0) {
3279 pr_err("error %d\n", rc);
3280 goto rw_error;
3281 }
3282 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD0_CFG__A, 0x0000, 0);
3283 if (rc != 0) {
3284 pr_err("error %d\n", rc);
3285 goto rw_error;
3286 }
3287 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD1_CFG__A, 0x0000, 0);
3288 if (rc != 0) {
3289 pr_err("error %d\n", rc);
3290 goto rw_error;
3291 }
3292 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD2_CFG__A, 0x0000, 0);
3293 if (rc != 0) {
3294 pr_err("error %d\n", rc);
3295 goto rw_error;
3296 }
3297 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD3_CFG__A, 0x0000, 0);
3298 if (rc != 0) {
3299 pr_err("error %d\n", rc);
3300 goto rw_error;
3301 }
3302 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD4_CFG__A, 0x0000, 0);
3303 if (rc != 0) {
3304 pr_err("error %d\n", rc);
3305 goto rw_error;
3306 }
3307 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD5_CFG__A, 0x0000, 0);
3308 if (rc != 0) {
3309 pr_err("error %d\n", rc);
3310 goto rw_error;
3311 }
3312 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD6_CFG__A, 0x0000, 0);
3313 if (rc != 0) {
3314 pr_err("error %d\n", rc);
3315 goto rw_error;
3316 }
3317 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MD7_CFG__A, 0x0000, 0);
3318 if (rc != 0) {
3319 pr_err("error %d\n", rc);
3320 goto rw_error;
3321 }
3322
3323 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_MON_CFG__A, 0x0000, 0);
3324 if (rc != 0) {
3325 pr_err("error %d\n", rc);
3326 goto rw_error;
3327 }
3328
3329 rc = drxj_dap_write_reg16(dev_addr, SIO_TOP_COMM_KEY__A, 0x0000, 0);
3330 if (rc != 0) {
3331 pr_err("error %d\n", rc);
3332 goto rw_error;
3333 }
3334 }
3335
3336
3337 common_attr->mpeg_cfg.enable_mpeg_output = cfg_data->enable_mpeg_output;
3338
3339 return 0;
3340rw_error:
3341 return rc;
3342}
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361
3362
3363
3364static int set_mpegtei_handling(struct drx_demod_instance *demod)
3365{
3366 struct drxj_data *ext_attr = (struct drxj_data *) (NULL);
3367 struct i2c_device_addr *dev_addr = (struct i2c_device_addr *)(NULL);
3368 int rc;
3369 u16 fec_oc_dpr_mode = 0;
3370 u16 fec_oc_snc_mode = 0;
3371 u16 fec_oc_ems_mode = 0;
3372
3373 dev_addr = demod->my_i2c_dev_addr;
3374 ext_attr = (struct drxj_data *) demod->my_ext_attr;
3375
3376 rc = drxj_dap_read_reg16(dev_addr, FEC_OC_DPR_MODE__A, &fec_oc_dpr_mode, 0);
3377 if (rc != 0) {
3378 pr_err("error %d\n", rc);
3379 goto rw_error;
3380 }
3381 rc = drxj_dap_read_reg16(dev_addr, FEC_OC_SNC_MODE__A, &fec_oc_snc_mode, 0);
3382 if (rc != 0) {
3383 pr_err("error %d\n", rc);
3384 goto rw_error;
3385 }
3386 rc = drxj_dap_read_reg16(dev_addr, FEC_OC_EMS_MODE__A, &fec_oc_ems_mode, 0);
3387 if (rc != 0) {
3388 pr_err("error %d\n", rc);
3389 goto rw_error;
3390 }
3391
3392
3393 fec_oc_dpr_mode &= (~FEC_OC_DPR_MODE_ERR_DISABLE__M);
3394 fec_oc_snc_mode &= (~(FEC_OC_SNC_MODE_ERROR_CTL__M |
3395 FEC_OC_SNC_MODE_CORR_DISABLE__M));
3396 fec_oc_ems_mode &= (~FEC_OC_EMS_MODE_MODE__M);
3397
3398 if (ext_attr->disable_te_ihandling) {
3399
3400 fec_oc_dpr_mode |= FEC_OC_DPR_MODE_ERR_DISABLE__M;
3401 fec_oc_snc_mode |= FEC_OC_SNC_MODE_CORR_DISABLE__M |
3402 ((0x2) << (FEC_OC_SNC_MODE_ERROR_CTL__B));
3403 fec_oc_ems_mode |= ((0x01) << (FEC_OC_EMS_MODE_MODE__B));
3404 }
3405
3406 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_DPR_MODE__A, fec_oc_dpr_mode, 0);
3407 if (rc != 0) {
3408 pr_err("error %d\n", rc);
3409 goto rw_error;
3410 }
3411 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_SNC_MODE__A, fec_oc_snc_mode, 0);
3412 if (rc != 0) {
3413 pr_err("error %d\n", rc);
3414 goto rw_error;
3415 }
3416 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_EMS_MODE__A, fec_oc_ems_mode, 0);
3417 if (rc != 0) {
3418 pr_err("error %d\n", rc);
3419 goto rw_error;
3420 }
3421
3422 return 0;
3423rw_error:
3424 return rc;
3425}
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437static int bit_reverse_mpeg_output(struct drx_demod_instance *demod)
3438{
3439 struct drxj_data *ext_attr = (struct drxj_data *) (NULL);
3440 struct i2c_device_addr *dev_addr = (struct i2c_device_addr *)(NULL);
3441 int rc;
3442 u16 fec_oc_ipr_mode = 0;
3443
3444 dev_addr = demod->my_i2c_dev_addr;
3445 ext_attr = (struct drxj_data *) demod->my_ext_attr;
3446
3447 rc = drxj_dap_read_reg16(dev_addr, FEC_OC_IPR_MODE__A, &fec_oc_ipr_mode, 0);
3448 if (rc != 0) {
3449 pr_err("error %d\n", rc);
3450 goto rw_error;
3451 }
3452
3453
3454 fec_oc_ipr_mode &= (~FEC_OC_IPR_MODE_REVERSE_ORDER__M);
3455
3456 if (ext_attr->bit_reverse_mpeg_outout)
3457 fec_oc_ipr_mode |= FEC_OC_IPR_MODE_REVERSE_ORDER__M;
3458
3459 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_IPR_MODE__A, fec_oc_ipr_mode, 0);
3460 if (rc != 0) {
3461 pr_err("error %d\n", rc);
3462 goto rw_error;
3463 }
3464
3465 return 0;
3466rw_error:
3467 return rc;
3468}
3469
3470
3471
3472
3473
3474
3475
3476
3477
3478
3479
3480static int set_mpeg_start_width(struct drx_demod_instance *demod)
3481{
3482 struct drxj_data *ext_attr = (struct drxj_data *) (NULL);
3483 struct i2c_device_addr *dev_addr = (struct i2c_device_addr *)(NULL);
3484 struct drx_common_attr *common_attr = (struct drx_common_attr *) NULL;
3485 int rc;
3486 u16 fec_oc_comm_mb = 0;
3487
3488 dev_addr = demod->my_i2c_dev_addr;
3489 ext_attr = (struct drxj_data *) demod->my_ext_attr;
3490 common_attr = demod->my_common_attr;
3491
3492 if ((common_attr->mpeg_cfg.static_clk == true)
3493 && (common_attr->mpeg_cfg.enable_parallel == false)) {
3494 rc = drxj_dap_read_reg16(dev_addr, FEC_OC_COMM_MB__A, &fec_oc_comm_mb, 0);
3495 if (rc != 0) {
3496 pr_err("error %d\n", rc);
3497 goto rw_error;
3498 }
3499 fec_oc_comm_mb &= ~FEC_OC_COMM_MB_CTL_ON;
3500 if (ext_attr->mpeg_start_width == DRXJ_MPEG_START_WIDTH_8CLKCYC)
3501 fec_oc_comm_mb |= FEC_OC_COMM_MB_CTL_ON;
3502 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_COMM_MB__A, fec_oc_comm_mb, 0);
3503 if (rc != 0) {
3504 pr_err("error %d\n", rc);
3505 goto rw_error;
3506 }
3507 }
3508
3509 return 0;
3510rw_error:
3511 return rc;
3512}
3513
3514
3515
3516
3517
3518
3519
3520
3521
3522
3523
3524
3525
3526
3527
3528static int ctrl_set_uio_cfg(struct drx_demod_instance *demod, struct drxuio_cfg *uio_cfg)
3529{
3530 struct drxj_data *ext_attr = (struct drxj_data *) (NULL);
3531 int rc;
3532
3533 if ((uio_cfg == NULL) || (demod == NULL))
3534 return -EINVAL;
3535
3536 ext_attr = (struct drxj_data *) demod->my_ext_attr;
3537
3538
3539 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY_KEY, 0);
3540 if (rc != 0) {
3541 pr_err("error %d\n", rc);
3542 goto rw_error;
3543 }
3544 switch (uio_cfg->uio) {
3545
3546 case DRX_UIO1:
3547
3548 if (!ext_attr->has_smatx)
3549 return -EIO;
3550 switch (uio_cfg->mode) {
3551 case DRX_UIO_MODE_FIRMWARE_SMA:
3552 case DRX_UIO_MODE_FIRMWARE_SAW:
3553 case DRX_UIO_MODE_READWRITE:
3554 ext_attr->uio_sma_tx_mode = uio_cfg->mode;
3555 break;
3556 case DRX_UIO_MODE_DISABLE:
3557 ext_attr->uio_sma_tx_mode = uio_cfg->mode;
3558
3559 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_SMA_TX_CFG__A, 0, 0);
3560 if (rc != 0) {
3561 pr_err("error %d\n", rc);
3562 goto rw_error;
3563 }
3564 break;
3565 default:
3566 return -EINVAL;
3567 }
3568 break;
3569
3570 case DRX_UIO2:
3571
3572 if (!ext_attr->has_smarx)
3573 return -EIO;
3574 switch (uio_cfg->mode) {
3575 case DRX_UIO_MODE_FIRMWARE0:
3576 case DRX_UIO_MODE_READWRITE:
3577 ext_attr->uio_sma_rx_mode = uio_cfg->mode;
3578 break;
3579 case DRX_UIO_MODE_DISABLE:
3580 ext_attr->uio_sma_rx_mode = uio_cfg->mode;
3581
3582 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_SMA_RX_CFG__A, 0, 0);
3583 if (rc != 0) {
3584 pr_err("error %d\n", rc);
3585 goto rw_error;
3586 }
3587 break;
3588 default:
3589 return -EINVAL;
3590 break;
3591 }
3592 break;
3593
3594 case DRX_UIO3:
3595
3596 if (!ext_attr->has_gpio)
3597 return -EIO;
3598 switch (uio_cfg->mode) {
3599 case DRX_UIO_MODE_FIRMWARE0:
3600 case DRX_UIO_MODE_READWRITE:
3601 ext_attr->uio_gpio_mode = uio_cfg->mode;
3602 break;
3603 case DRX_UIO_MODE_DISABLE:
3604 ext_attr->uio_gpio_mode = uio_cfg->mode;
3605
3606 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_GPIO_CFG__A, 0, 0);
3607 if (rc != 0) {
3608 pr_err("error %d\n", rc);
3609 goto rw_error;
3610 }
3611 break;
3612 default:
3613 return -EINVAL;
3614 break;
3615 }
3616 break;
3617
3618 case DRX_UIO4:
3619
3620 if (!ext_attr->has_irqn)
3621 return -EIO;
3622 switch (uio_cfg->mode) {
3623 case DRX_UIO_MODE_READWRITE:
3624 ext_attr->uio_irqn_mode = uio_cfg->mode;
3625 break;
3626 case DRX_UIO_MODE_DISABLE:
3627
3628 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_IRQN_CFG__A, 0, 0);
3629 if (rc != 0) {
3630 pr_err("error %d\n", rc);
3631 goto rw_error;
3632 }
3633 ext_attr->uio_irqn_mode = uio_cfg->mode;
3634 break;
3635 case DRX_UIO_MODE_FIRMWARE0:
3636 default:
3637 return -EINVAL;
3638 break;
3639 }
3640 break;
3641
3642 default:
3643 return -EINVAL;
3644 }
3645
3646
3647 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_TOP_COMM_KEY__A, 0x0000, 0);
3648 if (rc != 0) {
3649 pr_err("error %d\n", rc);
3650 goto rw_error;
3651 }
3652
3653 return 0;
3654rw_error:
3655 return rc;
3656}
3657
3658
3659
3660
3661
3662
3663
3664
3665static int
3666ctrl_uio_write(struct drx_demod_instance *demod, struct drxuio_data *uio_data)
3667{
3668 struct drxj_data *ext_attr = (struct drxj_data *) (NULL);
3669 int rc;
3670 u16 pin_cfg_value = 0;
3671 u16 value = 0;
3672
3673 if ((uio_data == NULL) || (demod == NULL))
3674 return -EINVAL;
3675
3676 ext_attr = (struct drxj_data *) demod->my_ext_attr;
3677
3678
3679 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY_KEY, 0);
3680 if (rc != 0) {
3681 pr_err("error %d\n", rc);
3682 goto rw_error;
3683 }
3684 switch (uio_data->uio) {
3685
3686 case DRX_UIO1:
3687
3688 if (!ext_attr->has_smatx)
3689 return -EIO;
3690 if ((ext_attr->uio_sma_tx_mode != DRX_UIO_MODE_READWRITE)
3691 && (ext_attr->uio_sma_tx_mode != DRX_UIO_MODE_FIRMWARE_SAW)) {
3692 return -EIO;
3693 }
3694 pin_cfg_value = 0;
3695
3696 pin_cfg_value |= 0x0113;
3697
3698
3699
3700
3701 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_SMA_TX_CFG__A, pin_cfg_value, 0);
3702 if (rc != 0) {
3703 pr_err("error %d\n", rc);
3704 goto rw_error;
3705 }
3706
3707
3708 rc = drxj_dap_read_reg16(demod->my_i2c_dev_addr, SIO_PDR_UIO_OUT_LO__A, &value, 0);
3709 if (rc != 0) {
3710 pr_err("error %d\n", rc);
3711 goto rw_error;
3712 }
3713 if (!uio_data->value)
3714 value &= 0x7FFF;
3715 else
3716 value |= 0x8000;
3717
3718
3719 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_UIO_OUT_LO__A, value, 0);
3720 if (rc != 0) {
3721 pr_err("error %d\n", rc);
3722 goto rw_error;
3723 }
3724 break;
3725
3726 case DRX_UIO2:
3727
3728 if (!ext_attr->has_smarx)
3729 return -EIO;
3730 if (ext_attr->uio_sma_rx_mode != DRX_UIO_MODE_READWRITE)
3731 return -EIO;
3732
3733 pin_cfg_value = 0;
3734
3735 pin_cfg_value |= 0x0113;
3736
3737
3738
3739
3740 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_SMA_RX_CFG__A, pin_cfg_value, 0);
3741 if (rc != 0) {
3742 pr_err("error %d\n", rc);
3743 goto rw_error;
3744 }
3745
3746
3747 rc = drxj_dap_read_reg16(demod->my_i2c_dev_addr, SIO_PDR_UIO_OUT_LO__A, &value, 0);
3748 if (rc != 0) {
3749 pr_err("error %d\n", rc);
3750 goto rw_error;
3751 }
3752 if (!uio_data->value)
3753 value &= 0xBFFF;
3754 else
3755 value |= 0x4000;
3756
3757
3758 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_UIO_OUT_LO__A, value, 0);
3759 if (rc != 0) {
3760 pr_err("error %d\n", rc);
3761 goto rw_error;
3762 }
3763 break;
3764
3765 case DRX_UIO3:
3766
3767 if (!ext_attr->has_gpio)
3768 return -EIO;
3769 if (ext_attr->uio_gpio_mode != DRX_UIO_MODE_READWRITE)
3770 return -EIO;
3771
3772 pin_cfg_value = 0;
3773
3774 pin_cfg_value |= 0x0113;
3775
3776
3777
3778
3779 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_GPIO_CFG__A, pin_cfg_value, 0);
3780 if (rc != 0) {
3781 pr_err("error %d\n", rc);
3782 goto rw_error;
3783 }
3784
3785
3786 rc = drxj_dap_read_reg16(demod->my_i2c_dev_addr, SIO_PDR_UIO_OUT_HI__A, &value, 0);
3787 if (rc != 0) {
3788 pr_err("error %d\n", rc);
3789 goto rw_error;
3790 }
3791 if (!uio_data->value)
3792 value &= 0xFFFB;
3793 else
3794 value |= 0x0004;
3795
3796
3797 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_UIO_OUT_HI__A, value, 0);
3798 if (rc != 0) {
3799 pr_err("error %d\n", rc);
3800 goto rw_error;
3801 }
3802 break;
3803
3804 case DRX_UIO4:
3805
3806 if (!ext_attr->has_irqn)
3807 return -EIO;
3808
3809 if (ext_attr->uio_irqn_mode != DRX_UIO_MODE_READWRITE)
3810 return -EIO;
3811
3812 pin_cfg_value = 0;
3813
3814 pin_cfg_value |= 0x0113;
3815
3816
3817
3818
3819 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_IRQN_CFG__A, pin_cfg_value, 0);
3820 if (rc != 0) {
3821 pr_err("error %d\n", rc);
3822 goto rw_error;
3823 }
3824
3825
3826 rc = drxj_dap_read_reg16(demod->my_i2c_dev_addr, SIO_PDR_UIO_OUT_LO__A, &value, 0);
3827 if (rc != 0) {
3828 pr_err("error %d\n", rc);
3829 goto rw_error;
3830 }
3831 if (uio_data->value == false)
3832 value &= 0xEFFF;
3833 else
3834 value |= 0x1000;
3835
3836
3837 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_UIO_OUT_LO__A, value, 0);
3838 if (rc != 0) {
3839 pr_err("error %d\n", rc);
3840 goto rw_error;
3841 }
3842 break;
3843
3844 default:
3845 return -EINVAL;
3846 }
3847
3848
3849 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_TOP_COMM_KEY__A, 0x0000, 0);
3850 if (rc != 0) {
3851 pr_err("error %d\n", rc);
3852 goto rw_error;
3853 }
3854
3855 return 0;
3856rw_error:
3857 return rc;
3858}
3859
3860
3861
3862
3863
3864
3865
3866
3867
3868
3869
3870
3871
3872
3873
3874
3875static int
3876ctrl_i2c_bridge(struct drx_demod_instance *demod, bool *bridge_closed)
3877{
3878 struct drxj_hi_cmd hi_cmd;
3879 u16 result = 0;
3880
3881
3882 if (bridge_closed == NULL)
3883 return -EINVAL;
3884
3885 hi_cmd.cmd = SIO_HI_RA_RAM_CMD_BRDCTRL;
3886 hi_cmd.param1 = SIO_HI_RA_RAM_PAR_1_PAR1_SEC_KEY;
3887 if (*bridge_closed)
3888 hi_cmd.param2 = SIO_HI_RA_RAM_PAR_2_BRD_CFG_CLOSED;
3889 else
3890 hi_cmd.param2 = SIO_HI_RA_RAM_PAR_2_BRD_CFG_OPEN;
3891
3892 return hi_command(demod->my_i2c_dev_addr, &hi_cmd, &result);
3893}
3894
3895
3896
3897
3898
3899
3900
3901
3902
3903
3904
3905
3906
3907
3908
3909static int smart_ant_init(struct drx_demod_instance *demod)
3910{
3911 struct drxj_data *ext_attr = NULL;
3912 struct i2c_device_addr *dev_addr = NULL;
3913 struct drxuio_cfg uio_cfg = { DRX_UIO1, DRX_UIO_MODE_FIRMWARE_SMA };
3914 int rc;
3915 u16 data = 0;
3916
3917 dev_addr = demod->my_i2c_dev_addr;
3918 ext_attr = (struct drxj_data *) demod->my_ext_attr;
3919
3920
3921 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_TOP_COMM_KEY__A, SIO_TOP_COMM_KEY_KEY, 0);
3922 if (rc != 0) {
3923 pr_err("error %d\n", rc);
3924 goto rw_error;
3925 }
3926
3927 rc = drxj_dap_read_reg16(dev_addr, SIO_SA_TX_COMMAND__A, &data, 0);
3928 if (rc != 0) {
3929 pr_err("error %d\n", rc);
3930 goto rw_error;
3931 }
3932 if (ext_attr->smart_ant_inverted) {
3933 rc = drxj_dap_write_reg16(dev_addr, SIO_SA_TX_COMMAND__A, (data | SIO_SA_TX_COMMAND_TX_INVERT__M) | SIO_SA_TX_COMMAND_TX_ENABLE__M, 0);
3934 if (rc != 0) {
3935 pr_err("error %d\n", rc);
3936 goto rw_error;
3937 }
3938 } else {
3939 rc = drxj_dap_write_reg16(dev_addr, SIO_SA_TX_COMMAND__A, (data & (~SIO_SA_TX_COMMAND_TX_INVERT__M)) | SIO_SA_TX_COMMAND_TX_ENABLE__M, 0);
3940 if (rc != 0) {
3941 pr_err("error %d\n", rc);
3942 goto rw_error;
3943 }
3944 }
3945
3946
3947 rc = ctrl_set_uio_cfg(demod, &uio_cfg);
3948 if (rc != 0) {
3949 pr_err("error %d\n", rc);
3950 goto rw_error;
3951 }
3952 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_SMA_TX_CFG__A, 0x13, 0);
3953 if (rc != 0) {
3954 pr_err("error %d\n", rc);
3955 goto rw_error;
3956 }
3957 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_PDR_SMA_TX_GPIO_FNC__A, 0x03, 0);
3958 if (rc != 0) {
3959 pr_err("error %d\n", rc);
3960 goto rw_error;
3961 }
3962
3963
3964 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, SIO_TOP_COMM_KEY__A, 0x0000, 0);
3965 if (rc != 0) {
3966 pr_err("error %d\n", rc);
3967 goto rw_error;
3968 }
3969
3970 return 0;
3971rw_error:
3972 return rc;
3973}
3974
3975static int scu_command(struct i2c_device_addr *dev_addr, struct drxjscu_cmd *cmd)
3976{
3977 int rc;
3978 u16 cur_cmd = 0;
3979 unsigned long timeout;
3980
3981
3982 if (cmd == NULL)
3983 return -EINVAL;
3984
3985
3986 rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_COMMAND__A, &cur_cmd, 0);
3987 if (rc != 0) {
3988 pr_err("error %d\n", rc);
3989 goto rw_error;
3990 }
3991 if (cur_cmd != DRX_SCU_READY)
3992 return -EIO;
3993
3994 switch (cmd->parameter_len) {
3995 case 5:
3996 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_PARAM_4__A, *(cmd->parameter + 4), 0);
3997 if (rc != 0) {
3998 pr_err("error %d\n", rc);
3999 goto rw_error;
4000 }
4001 case 4:
4002 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_PARAM_3__A, *(cmd->parameter + 3), 0);
4003 if (rc != 0) {
4004 pr_err("error %d\n", rc);
4005 goto rw_error;
4006 }
4007 case 3:
4008 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_PARAM_2__A, *(cmd->parameter + 2), 0);
4009 if (rc != 0) {
4010 pr_err("error %d\n", rc);
4011 goto rw_error;
4012 }
4013 case 2:
4014 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_PARAM_1__A, *(cmd->parameter + 1), 0);
4015 if (rc != 0) {
4016 pr_err("error %d\n", rc);
4017 goto rw_error;
4018 }
4019 case 1:
4020 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_PARAM_0__A, *(cmd->parameter + 0), 0);
4021 if (rc != 0) {
4022 pr_err("error %d\n", rc);
4023 goto rw_error;
4024 }
4025 case 0:
4026
4027 break;
4028 default:
4029
4030 return -EIO;
4031 }
4032 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_COMMAND__A, cmd->command, 0);
4033 if (rc != 0) {
4034 pr_err("error %d\n", rc);
4035 goto rw_error;
4036 }
4037
4038
4039 timeout = jiffies + msecs_to_jiffies(DRXJ_MAX_WAITTIME);
4040 while (time_is_after_jiffies(timeout)) {
4041 rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_COMMAND__A, &cur_cmd, 0);
4042 if (rc != 0) {
4043 pr_err("error %d\n", rc);
4044 goto rw_error;
4045 }
4046 if (cur_cmd == DRX_SCU_READY)
4047 break;
4048 usleep_range(1000, 2000);
4049 }
4050
4051 if (cur_cmd != DRX_SCU_READY)
4052 return -EIO;
4053
4054
4055 if ((cmd->result_len > 0) && (cmd->result != NULL)) {
4056 s16 err;
4057
4058 switch (cmd->result_len) {
4059 case 4:
4060 rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_PARAM_3__A, cmd->result + 3, 0);
4061 if (rc != 0) {
4062 pr_err("error %d\n", rc);
4063 goto rw_error;
4064 }
4065 case 3:
4066 rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_PARAM_2__A, cmd->result + 2, 0);
4067 if (rc != 0) {
4068 pr_err("error %d\n", rc);
4069 goto rw_error;
4070 }
4071 case 2:
4072 rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_PARAM_1__A, cmd->result + 1, 0);
4073 if (rc != 0) {
4074 pr_err("error %d\n", rc);
4075 goto rw_error;
4076 }
4077 case 1:
4078 rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_PARAM_0__A, cmd->result + 0, 0);
4079 if (rc != 0) {
4080 pr_err("error %d\n", rc);
4081 goto rw_error;
4082 }
4083 case 0:
4084
4085 break;
4086 default:
4087
4088 return -EIO;
4089 }
4090
4091
4092 err = cmd->result[0];
4093
4094
4095 if ((err == (s16) SCU_RAM_PARAM_0_RESULT_UNKSTD)
4096 || (err == (s16) SCU_RAM_PARAM_0_RESULT_UNKCMD)
4097 || (err == (s16) SCU_RAM_PARAM_0_RESULT_INVPAR)
4098 || (err == (s16) SCU_RAM_PARAM_0_RESULT_SIZE)
4099 ) {
4100 return -EINVAL;
4101 }
4102
4103 else if (err < 0)
4104 return -EIO;
4105 else
4106 return 0;
4107 }
4108
4109 return 0;
4110
4111rw_error:
4112 return rc;
4113}
4114
4115
4116
4117
4118
4119
4120
4121
4122
4123
4124
4125
4126
4127#define ADDR_AT_SCU_SPACE(x) ((x - 0x82E000) * 2)
4128static
4129int drxj_dap_scu_atomic_read_write_block(struct i2c_device_addr *dev_addr, u32 addr, u16 datasize,
4130 u8 *data, bool read_flag)
4131{
4132 struct drxjscu_cmd scu_cmd;
4133 int rc;
4134 u16 set_param_parameters[15];
4135 u16 cmd_result[15];
4136
4137
4138 if (!data || !dev_addr || (datasize % 2) || ((datasize / 2) > 16))
4139 return -EINVAL;
4140
4141 set_param_parameters[1] = (u16) ADDR_AT_SCU_SPACE(addr);
4142 if (read_flag) {
4143 set_param_parameters[0] = ((~(0x0080)) & datasize);
4144 scu_cmd.parameter_len = 2;
4145 scu_cmd.result_len = datasize / 2 + 2;
4146 } else {
4147 int i = 0;
4148
4149 set_param_parameters[0] = 0x0080 | datasize;
4150 for (i = 0; i < (datasize / 2); i++) {
4151 set_param_parameters[i + 2] =
4152 (data[2 * i] | (data[(2 * i) + 1] << 8));
4153 }
4154 scu_cmd.parameter_len = datasize / 2 + 2;
4155 scu_cmd.result_len = 1;
4156 }
4157
4158 scu_cmd.command =
4159 SCU_RAM_COMMAND_STANDARD_TOP |
4160 SCU_RAM_COMMAND_CMD_AUX_SCU_ATOMIC_ACCESS;
4161 scu_cmd.result = cmd_result;
4162 scu_cmd.parameter = set_param_parameters;
4163 rc = scu_command(dev_addr, &scu_cmd);
4164 if (rc != 0) {
4165 pr_err("error %d\n", rc);
4166 goto rw_error;
4167 }
4168
4169 if (read_flag) {
4170 int i = 0;
4171
4172 for (i = 0; i < (datasize / 2); i++) {
4173 data[2 * i] = (u8) (scu_cmd.result[i + 2] & 0xFF);
4174 data[(2 * i) + 1] = (u8) (scu_cmd.result[i + 2] >> 8);
4175 }
4176 }
4177
4178 return 0;
4179
4180rw_error:
4181 return rc;
4182
4183}
4184
4185
4186
4187
4188
4189
4190
4191static
4192int drxj_dap_scu_atomic_read_reg16(struct i2c_device_addr *dev_addr,
4193 u32 addr,
4194 u16 *data, u32 flags)
4195{
4196 u8 buf[2] = { 0 };
4197 int rc = -EIO;
4198 u16 word = 0;
4199
4200 if (!data)
4201 return -EINVAL;
4202
4203 rc = drxj_dap_scu_atomic_read_write_block(dev_addr, addr, 2, buf, true);
4204 if (rc < 0)
4205 return rc;
4206
4207 word = (u16) (buf[0] + (buf[1] << 8));
4208
4209 *data = word;
4210
4211 return rc;
4212}
4213
4214
4215
4216
4217
4218
4219static
4220int drxj_dap_scu_atomic_write_reg16(struct i2c_device_addr *dev_addr,
4221 u32 addr,
4222 u16 data, u32 flags)
4223{
4224 u8 buf[2];
4225 int rc = -EIO;
4226
4227 buf[0] = (u8) (data & 0xff);
4228 buf[1] = (u8) ((data >> 8) & 0xff);
4229
4230 rc = drxj_dap_scu_atomic_read_write_block(dev_addr, addr, 2, buf, false);
4231
4232 return rc;
4233}
4234
4235
4236
4237
4238
4239
4240
4241
4242
4243
4244
4245static int adc_sync_measurement(struct drx_demod_instance *demod, u16 *count)
4246{
4247 struct i2c_device_addr *dev_addr = NULL;
4248 int rc;
4249 u16 data = 0;
4250
4251 dev_addr = demod->my_i2c_dev_addr;
4252
4253
4254 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_COMM_EXEC__A, IQM_AF_COMM_EXEC_ACTIVE, 0);
4255 if (rc != 0) {
4256 pr_err("error %d\n", rc);
4257 goto rw_error;
4258 }
4259 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_START_LOCK__A, 1, 0);
4260 if (rc != 0) {
4261 pr_err("error %d\n", rc);
4262 goto rw_error;
4263 }
4264
4265
4266 msleep(1);
4267
4268 *count = 0;
4269 rc = drxj_dap_read_reg16(dev_addr, IQM_AF_PHASE0__A, &data, 0);
4270 if (rc != 0) {
4271 pr_err("error %d\n", rc);
4272 goto rw_error;
4273 }
4274 if (data == 127)
4275 *count = *count + 1;
4276 rc = drxj_dap_read_reg16(dev_addr, IQM_AF_PHASE1__A, &data, 0);
4277 if (rc != 0) {
4278 pr_err("error %d\n", rc);
4279 goto rw_error;
4280 }
4281 if (data == 127)
4282 *count = *count + 1;
4283 rc = drxj_dap_read_reg16(dev_addr, IQM_AF_PHASE2__A, &data, 0);
4284 if (rc != 0) {
4285 pr_err("error %d\n", rc);
4286 goto rw_error;
4287 }
4288 if (data == 127)
4289 *count = *count + 1;
4290
4291 return 0;
4292rw_error:
4293 return rc;
4294}
4295
4296
4297
4298
4299
4300
4301
4302
4303
4304
4305
4306
4307
4308static int adc_synchronization(struct drx_demod_instance *demod)
4309{
4310 struct i2c_device_addr *dev_addr = NULL;
4311 int rc;
4312 u16 count = 0;
4313
4314 dev_addr = demod->my_i2c_dev_addr;
4315
4316 rc = adc_sync_measurement(demod, &count);
4317 if (rc != 0) {
4318 pr_err("error %d\n", rc);
4319 goto rw_error;
4320 }
4321
4322 if (count == 1) {
4323
4324 u16 clk_neg = 0;
4325
4326 rc = drxj_dap_read_reg16(dev_addr, IQM_AF_CLKNEG__A, &clk_neg, 0);
4327 if (rc != 0) {
4328 pr_err("error %d\n", rc);
4329 goto rw_error;
4330 }
4331
4332 clk_neg ^= IQM_AF_CLKNEG_CLKNEGDATA__M;
4333 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_CLKNEG__A, clk_neg, 0);
4334 if (rc != 0) {
4335 pr_err("error %d\n", rc);
4336 goto rw_error;
4337 }
4338
4339 rc = adc_sync_measurement(demod, &count);
4340 if (rc != 0) {
4341 pr_err("error %d\n", rc);
4342 goto rw_error;
4343 }
4344 }
4345
4346
4347 if (count < 2)
4348 return -EIO;
4349
4350 return 0;
4351rw_error:
4352 return rc;
4353}
4354
4355
4356
4357
4358
4359
4360
4361
4362
4363
4364
4365
4366
4367
4368
4369
4370
4371static int init_agc(struct drx_demod_instance *demod)
4372{
4373 struct i2c_device_addr *dev_addr = NULL;
4374 struct drx_common_attr *common_attr = NULL;
4375 struct drxj_data *ext_attr = NULL;
4376 struct drxj_cfg_agc *p_agc_rf_settings = NULL;
4377 struct drxj_cfg_agc *p_agc_if_settings = NULL;
4378 int rc;
4379 u16 ingain_tgt_max = 0;
4380 u16 clp_dir_to = 0;
4381 u16 sns_sum_max = 0;
4382 u16 clp_sum_max = 0;
4383 u16 sns_dir_to = 0;
4384 u16 ki_innergain_min = 0;
4385 u16 agc_ki = 0;
4386 u16 ki_max = 0;
4387 u16 if_iaccu_hi_tgt_min = 0;
4388 u16 data = 0;
4389 u16 agc_ki_dgain = 0;
4390 u16 ki_min = 0;
4391 u16 clp_ctrl_mode = 0;
4392 u16 agc_rf = 0;
4393 u16 agc_if = 0;
4394
4395 dev_addr = demod->my_i2c_dev_addr;
4396 common_attr = (struct drx_common_attr *) demod->my_common_attr;
4397 ext_attr = (struct drxj_data *) demod->my_ext_attr;
4398
4399 switch (ext_attr->standard) {
4400 case DRX_STANDARD_8VSB:
4401 clp_sum_max = 1023;
4402 clp_dir_to = (u16) (-9);
4403 sns_sum_max = 1023;
4404 sns_dir_to = (u16) (-9);
4405 ki_innergain_min = (u16) (-32768);
4406 ki_max = 0x032C;
4407 agc_ki_dgain = 0xC;
4408 if_iaccu_hi_tgt_min = 2047;
4409 ki_min = 0x0117;
4410 ingain_tgt_max = 16383;
4411 clp_ctrl_mode = 0;
4412 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI_MINGAIN__A, 0x7fff, 0);
4413 if (rc != 0) {
4414 pr_err("error %d\n", rc);
4415 goto rw_error;
4416 }
4417 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI_MAXGAIN__A, 0x0, 0);
4418 if (rc != 0) {
4419 pr_err("error %d\n", rc);
4420 goto rw_error;
4421 }
4422 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_SUM__A, 0, 0);
4423 if (rc != 0) {
4424 pr_err("error %d\n", rc);
4425 goto rw_error;
4426 }
4427 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_CYCCNT__A, 0, 0);
4428 if (rc != 0) {
4429 pr_err("error %d\n", rc);
4430 goto rw_error;
4431 }
4432 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_DIR_WD__A, 0, 0);
4433 if (rc != 0) {
4434 pr_err("error %d\n", rc);
4435 goto rw_error;
4436 }
4437 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_DIR_STP__A, 1, 0);
4438 if (rc != 0) {
4439 pr_err("error %d\n", rc);
4440 goto rw_error;
4441 }
4442 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_SUM__A, 0, 0);
4443 if (rc != 0) {
4444 pr_err("error %d\n", rc);
4445 goto rw_error;
4446 }
4447 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_CYCCNT__A, 0, 0);
4448 if (rc != 0) {
4449 pr_err("error %d\n", rc);
4450 goto rw_error;
4451 }
4452 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_DIR_WD__A, 0, 0);
4453 if (rc != 0) {
4454 pr_err("error %d\n", rc);
4455 goto rw_error;
4456 }
4457 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_DIR_STP__A, 1, 0);
4458 if (rc != 0) {
4459 pr_err("error %d\n", rc);
4460 goto rw_error;
4461 }
4462 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_INGAIN__A, 1024, 0);
4463 if (rc != 0) {
4464 pr_err("error %d\n", rc);
4465 goto rw_error;
4466 }
4467 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_VSB_AGC_POW_TGT__A, 22600, 0);
4468 if (rc != 0) {
4469 pr_err("error %d\n", rc);
4470 goto rw_error;
4471 }
4472 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_INGAIN_TGT__A, 13200, 0);
4473 if (rc != 0) {
4474 pr_err("error %d\n", rc);
4475 goto rw_error;
4476 }
4477 p_agc_if_settings = &(ext_attr->vsb_if_agc_cfg);
4478 p_agc_rf_settings = &(ext_attr->vsb_rf_agc_cfg);
4479 break;
4480#ifndef DRXJ_VSB_ONLY
4481 case DRX_STANDARD_ITU_A:
4482 case DRX_STANDARD_ITU_C:
4483 case DRX_STANDARD_ITU_B:
4484 ingain_tgt_max = 5119;
4485 clp_sum_max = 1023;
4486 clp_dir_to = (u16) (-5);
4487 sns_sum_max = 127;
4488 sns_dir_to = (u16) (-3);
4489 ki_innergain_min = 0;
4490 ki_max = 0x0657;
4491 if_iaccu_hi_tgt_min = 2047;
4492 agc_ki_dgain = 0x7;
4493 ki_min = 0x0117;
4494 clp_ctrl_mode = 0;
4495 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI_MINGAIN__A, 0x7fff, 0);
4496 if (rc != 0) {
4497 pr_err("error %d\n", rc);
4498 goto rw_error;
4499 }
4500 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI_MAXGAIN__A, 0x0, 0);
4501 if (rc != 0) {
4502 pr_err("error %d\n", rc);
4503 goto rw_error;
4504 }
4505 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_SUM__A, 0, 0);
4506 if (rc != 0) {
4507 pr_err("error %d\n", rc);
4508 goto rw_error;
4509 }
4510 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_CYCCNT__A, 0, 0);
4511 if (rc != 0) {
4512 pr_err("error %d\n", rc);
4513 goto rw_error;
4514 }
4515 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_DIR_WD__A, 0, 0);
4516 if (rc != 0) {
4517 pr_err("error %d\n", rc);
4518 goto rw_error;
4519 }
4520 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_DIR_STP__A, 1, 0);
4521 if (rc != 0) {
4522 pr_err("error %d\n", rc);
4523 goto rw_error;
4524 }
4525 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_SUM__A, 0, 0);
4526 if (rc != 0) {
4527 pr_err("error %d\n", rc);
4528 goto rw_error;
4529 }
4530 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_CYCCNT__A, 0, 0);
4531 if (rc != 0) {
4532 pr_err("error %d\n", rc);
4533 goto rw_error;
4534 }
4535 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_DIR_WD__A, 0, 0);
4536 if (rc != 0) {
4537 pr_err("error %d\n", rc);
4538 goto rw_error;
4539 }
4540 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_DIR_STP__A, 1, 0);
4541 if (rc != 0) {
4542 pr_err("error %d\n", rc);
4543 goto rw_error;
4544 }
4545 p_agc_if_settings = &(ext_attr->qam_if_agc_cfg);
4546 p_agc_rf_settings = &(ext_attr->qam_rf_agc_cfg);
4547 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_INGAIN_TGT__A, p_agc_if_settings->top, 0);
4548 if (rc != 0) {
4549 pr_err("error %d\n", rc);
4550 goto rw_error;
4551 }
4552
4553 rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_AGC_KI__A, &agc_ki, 0);
4554 if (rc != 0) {
4555 pr_err("error %d\n", rc);
4556 goto rw_error;
4557 }
4558 agc_ki &= 0xf000;
4559 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI__A, agc_ki, 0);
4560 if (rc != 0) {
4561 pr_err("error %d\n", rc);
4562 goto rw_error;
4563 }
4564 break;
4565#endif
4566 default:
4567 return -EINVAL;
4568 }
4569
4570
4571 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_INGAIN_TGT_MIN__A, p_agc_if_settings->top, 0);
4572 if (rc != 0) {
4573 pr_err("error %d\n", rc);
4574 goto rw_error;
4575 }
4576 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_INGAIN__A, p_agc_if_settings->top, 0);
4577 if (rc != 0) {
4578 pr_err("error %d\n", rc);
4579 goto rw_error;
4580 }
4581 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_INGAIN_TGT_MAX__A, ingain_tgt_max, 0);
4582 if (rc != 0) {
4583 pr_err("error %d\n", rc);
4584 goto rw_error;
4585 }
4586 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_IF_IACCU_HI_TGT_MIN__A, if_iaccu_hi_tgt_min, 0);
4587 if (rc != 0) {
4588 pr_err("error %d\n", rc);
4589 goto rw_error;
4590 }
4591 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_IF_IACCU_HI__A, 0, 0);
4592 if (rc != 0) {
4593 pr_err("error %d\n", rc);
4594 goto rw_error;
4595 }
4596 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_IF_IACCU_LO__A, 0, 0);
4597 if (rc != 0) {
4598 pr_err("error %d\n", rc);
4599 goto rw_error;
4600 }
4601 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_RF_IACCU_HI__A, 0, 0);
4602 if (rc != 0) {
4603 pr_err("error %d\n", rc);
4604 goto rw_error;
4605 }
4606 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_RF_IACCU_LO__A, 0, 0);
4607 if (rc != 0) {
4608 pr_err("error %d\n", rc);
4609 goto rw_error;
4610 }
4611 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_RF_MAX__A, 32767, 0);
4612 if (rc != 0) {
4613 pr_err("error %d\n", rc);
4614 goto rw_error;
4615 }
4616 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_SUM_MAX__A, clp_sum_max, 0);
4617 if (rc != 0) {
4618 pr_err("error %d\n", rc);
4619 goto rw_error;
4620 }
4621 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_SUM_MAX__A, sns_sum_max, 0);
4622 if (rc != 0) {
4623 pr_err("error %d\n", rc);
4624 goto rw_error;
4625 }
4626 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI_INNERGAIN_MIN__A, ki_innergain_min, 0);
4627 if (rc != 0) {
4628 pr_err("error %d\n", rc);
4629 goto rw_error;
4630 }
4631 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_FAST_SNS_CTRL_DELAY__A, 50, 0);
4632 if (rc != 0) {
4633 pr_err("error %d\n", rc);
4634 goto rw_error;
4635 }
4636 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI_CYCLEN__A, 500, 0);
4637 if (rc != 0) {
4638 pr_err("error %d\n", rc);
4639 goto rw_error;
4640 }
4641 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_CYCLEN__A, 500, 0);
4642 if (rc != 0) {
4643 pr_err("error %d\n", rc);
4644 goto rw_error;
4645 }
4646 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI_MAXMINGAIN_TH__A, 20, 0);
4647 if (rc != 0) {
4648 pr_err("error %d\n", rc);
4649 goto rw_error;
4650 }
4651 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI_MIN__A, ki_min, 0);
4652 if (rc != 0) {
4653 pr_err("error %d\n", rc);
4654 goto rw_error;
4655 }
4656 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI_MAX__A, ki_max, 0);
4657 if (rc != 0) {
4658 pr_err("error %d\n", rc);
4659 goto rw_error;
4660 }
4661 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI_RED__A, 0, 0);
4662 if (rc != 0) {
4663 pr_err("error %d\n", rc);
4664 goto rw_error;
4665 }
4666 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_SUM_MIN__A, 8, 0);
4667 if (rc != 0) {
4668 pr_err("error %d\n", rc);
4669 goto rw_error;
4670 }
4671 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_CYCLEN__A, 500, 0);
4672 if (rc != 0) {
4673 pr_err("error %d\n", rc);
4674 goto rw_error;
4675 }
4676 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_DIR_TO__A, clp_dir_to, 0);
4677 if (rc != 0) {
4678 pr_err("error %d\n", rc);
4679 goto rw_error;
4680 }
4681 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_SUM_MIN__A, 8, 0);
4682 if (rc != 0) {
4683 pr_err("error %d\n", rc);
4684 goto rw_error;
4685 }
4686 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_SNS_DIR_TO__A, sns_dir_to, 0);
4687 if (rc != 0) {
4688 pr_err("error %d\n", rc);
4689 goto rw_error;
4690 }
4691 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_FAST_CLP_CTRL_DELAY__A, 50, 0);
4692 if (rc != 0) {
4693 pr_err("error %d\n", rc);
4694 goto rw_error;
4695 }
4696 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_CLP_CTRL_MODE__A, clp_ctrl_mode, 0);
4697 if (rc != 0) {
4698 pr_err("error %d\n", rc);
4699 goto rw_error;
4700 }
4701
4702 agc_rf = 0x800 + p_agc_rf_settings->cut_off_current;
4703 if (common_attr->tuner_rf_agc_pol == true)
4704 agc_rf = 0x87ff - agc_rf;
4705
4706 agc_if = 0x800;
4707 if (common_attr->tuner_if_agc_pol == true)
4708 agc_rf = 0x87ff - agc_rf;
4709
4710 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_AGC_RF__A, agc_rf, 0);
4711 if (rc != 0) {
4712 pr_err("error %d\n", rc);
4713 goto rw_error;
4714 }
4715 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_AGC_IF__A, agc_if, 0);
4716 if (rc != 0) {
4717 pr_err("error %d\n", rc);
4718 goto rw_error;
4719 }
4720
4721
4722 rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_AGC_KI__A, &data, 0);
4723 if (rc != 0) {
4724 pr_err("error %d\n", rc);
4725 goto rw_error;
4726 }
4727 data &= ~SCU_RAM_AGC_KI_DGAIN__M;
4728 data |= (agc_ki_dgain << SCU_RAM_AGC_KI_DGAIN__B);
4729 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_AGC_KI__A, data, 0);
4730 if (rc != 0) {
4731 pr_err("error %d\n", rc);
4732 goto rw_error;
4733 }
4734
4735 return 0;
4736rw_error:
4737 return rc;
4738}
4739
4740
4741
4742
4743
4744
4745
4746
4747
4748static int
4749set_frequency(struct drx_demod_instance *demod,
4750 struct drx_channel *channel, s32 tuner_freq_offset)
4751{
4752 struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
4753 struct drxj_data *ext_attr = demod->my_ext_attr;
4754 int rc;
4755 s32 sampling_frequency = 0;
4756 s32 frequency_shift = 0;
4757 s32 if_freq_actual = 0;
4758 s32 rf_freq_residual = -1 * tuner_freq_offset;
4759 s32 adc_freq = 0;
4760 s32 intermediate_freq = 0;
4761 u32 iqm_fs_rate_ofs = 0;
4762 bool adc_flip = true;
4763 bool select_pos_image = false;
4764 bool rf_mirror;
4765 bool tuner_mirror;
4766 bool image_to_select = true;
4767 s32 fm_frequency_shift = 0;
4768
4769 rf_mirror = (ext_attr->mirror == DRX_MIRROR_YES) ? true : false;
4770 tuner_mirror = demod->my_common_attr->mirror_freq_spect ? false : true;
4771
4772
4773
4774
4775 switch (ext_attr->standard) {
4776 case DRX_STANDARD_ITU_A:
4777 case DRX_STANDARD_ITU_C:
4778 case DRX_STANDARD_PAL_SECAM_LP:
4779 case DRX_STANDARD_8VSB:
4780 select_pos_image = true;
4781 break;
4782 case DRX_STANDARD_FM:
4783
4784
4785
4786 fm_frequency_shift = 1000;
4787 case DRX_STANDARD_ITU_B:
4788 case DRX_STANDARD_NTSC:
4789 case DRX_STANDARD_PAL_SECAM_BG:
4790 case DRX_STANDARD_PAL_SECAM_DK:
4791 case DRX_STANDARD_PAL_SECAM_I:
4792 case DRX_STANDARD_PAL_SECAM_L:
4793 select_pos_image = false;
4794 break;
4795 default:
4796 return -EINVAL;
4797 }
4798 intermediate_freq = demod->my_common_attr->intermediate_freq;
4799 sampling_frequency = demod->my_common_attr->sys_clock_freq / 3;
4800 if (tuner_mirror)
4801 if_freq_actual = intermediate_freq + rf_freq_residual + fm_frequency_shift;
4802 else
4803 if_freq_actual = intermediate_freq - rf_freq_residual - fm_frequency_shift;
4804 if (if_freq_actual > sampling_frequency / 2) {
4805
4806 adc_freq = sampling_frequency - if_freq_actual;
4807 adc_flip = true;
4808 } else {
4809
4810 adc_freq = if_freq_actual;
4811 adc_flip = false;
4812 }
4813
4814 frequency_shift = adc_freq;
4815 image_to_select =
4816 (bool) (rf_mirror ^ tuner_mirror ^ adc_flip ^ select_pos_image);
4817 iqm_fs_rate_ofs = frac28(frequency_shift, sampling_frequency);
4818
4819 if (image_to_select)
4820 iqm_fs_rate_ofs = ~iqm_fs_rate_ofs + 1;
4821
4822
4823
4824 rc = drxdap_fasi_write_reg32(dev_addr, IQM_FS_RATE_OFS_LO__A, iqm_fs_rate_ofs, 0);
4825 if (rc != 0) {
4826 pr_err("error %d\n", rc);
4827 goto rw_error;
4828 }
4829 ext_attr->iqm_fs_rate_ofs = iqm_fs_rate_ofs;
4830 ext_attr->pos_image = (bool) (rf_mirror ^ tuner_mirror ^ select_pos_image);
4831
4832 return 0;
4833rw_error:
4834 return rc;
4835}
4836
4837
4838
4839
4840
4841
4842
4843
4844
4845
4846
4847#ifdef DRXJ_SIGNAL_ACCUM_ERR
4848static int get_acc_pkt_err(struct drx_demod_instance *demod, u16 *packet_err)
4849{
4850 int rc;
4851 static u16 pkt_err;
4852 static u16 last_pkt_err;
4853 u16 data = 0;
4854 struct drxj_data *ext_attr = NULL;
4855 struct i2c_device_addr *dev_addr = NULL;
4856
4857 ext_attr = (struct drxj_data *) demod->my_ext_attr;
4858 dev_addr = demod->my_i2c_dev_addr;
4859
4860 rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_FEC_ACCUM_PKT_FAILURES__A, &data, 0);
4861 if (rc != 0) {
4862 pr_err("error %d\n", rc);
4863 goto rw_error;
4864 }
4865 if (ext_attr->reset_pkt_err_acc) {
4866 last_pkt_err = data;
4867 pkt_err = 0;
4868 ext_attr->reset_pkt_err_acc = false;
4869 }
4870
4871 if (data < last_pkt_err) {
4872 pkt_err += 0xffff - last_pkt_err;
4873 pkt_err += data;
4874 } else {
4875 pkt_err += (data - last_pkt_err);
4876 }
4877 *packet_err = pkt_err;
4878 last_pkt_err = data;
4879
4880 return 0;
4881rw_error:
4882 return rc;
4883}
4884#endif
4885
4886
4887
4888
4889
4890
4891
4892
4893
4894
4895
4896static int
4897set_agc_rf(struct drx_demod_instance *demod, struct drxj_cfg_agc *agc_settings, bool atomic)
4898{
4899 struct i2c_device_addr *dev_addr = NULL;
4900 struct drxj_data *ext_attr = NULL;
4901 struct drxj_cfg_agc *p_agc_settings = NULL;
4902 struct drx_common_attr *common_attr = NULL;
4903 int rc;
4904 drx_write_reg16func_t scu_wr16 = NULL;
4905 drx_read_reg16func_t scu_rr16 = NULL;
4906
4907 common_attr = (struct drx_common_attr *) demod->my_common_attr;
4908 dev_addr = demod->my_i2c_dev_addr;
4909 ext_attr = (struct drxj_data *) demod->my_ext_attr;
4910
4911 if (atomic) {
4912 scu_rr16 = drxj_dap_scu_atomic_read_reg16;
4913 scu_wr16 = drxj_dap_scu_atomic_write_reg16;
4914 } else {
4915 scu_rr16 = drxj_dap_read_reg16;
4916 scu_wr16 = drxj_dap_write_reg16;
4917 }
4918
4919
4920 if ((ext_attr->standard == agc_settings->standard) ||
4921 (DRXJ_ISQAMSTD(ext_attr->standard) &&
4922 DRXJ_ISQAMSTD(agc_settings->standard)) ||
4923 (DRXJ_ISATVSTD(ext_attr->standard) &&
4924 DRXJ_ISATVSTD(agc_settings->standard))) {
4925 u16 data = 0;
4926
4927 switch (agc_settings->ctrl_mode) {
4928 case DRX_AGC_CTRL_AUTO:
4929
4930
4931 rc = drxj_dap_read_reg16(dev_addr, IQM_AF_STDBY__A, &data, 0);
4932 if (rc != 0) {
4933 pr_err("error %d\n", rc);
4934 goto rw_error;
4935 }
4936 data |= IQM_AF_STDBY_STDBY_TAGC_RF_A2_ACTIVE;
4937 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_STDBY__A, data, 0);
4938 if (rc != 0) {
4939 pr_err("error %d\n", rc);
4940 goto rw_error;
4941 }
4942
4943
4944 rc = (*scu_rr16)(dev_addr, SCU_RAM_AGC_KI__A, &data, 0);
4945 if (rc != 0) {
4946 pr_err("error %d\n", rc);
4947 goto rw_error;
4948 }
4949 data &= ~SCU_RAM_AGC_KI_RF__M;
4950 if (ext_attr->standard == DRX_STANDARD_8VSB)
4951 data |= (2 << SCU_RAM_AGC_KI_RF__B);
4952 else if (DRXJ_ISQAMSTD(ext_attr->standard))
4953 data |= (5 << SCU_RAM_AGC_KI_RF__B);
4954 else
4955 data |= (4 << SCU_RAM_AGC_KI_RF__B);
4956
4957 if (common_attr->tuner_rf_agc_pol)
4958 data |= SCU_RAM_AGC_KI_INV_RF_POL__M;
4959 else
4960 data &= ~SCU_RAM_AGC_KI_INV_RF_POL__M;
4961 rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_KI__A, data, 0);
4962 if (rc != 0) {
4963 pr_err("error %d\n", rc);
4964 goto rw_error;
4965 }
4966
4967
4968 rc = (*scu_rr16)(dev_addr, SCU_RAM_AGC_KI_RED__A, &data, 0);
4969 if (rc != 0) {
4970 pr_err("error %d\n", rc);
4971 goto rw_error;
4972 }
4973 data &= ~SCU_RAM_AGC_KI_RED_RAGC_RED__M;
4974 rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_KI_RED__A, (~(agc_settings->speed << SCU_RAM_AGC_KI_RED_RAGC_RED__B) & SCU_RAM_AGC_KI_RED_RAGC_RED__M) | data, 0);
4975 if (rc != 0) {
4976 pr_err("error %d\n", rc);
4977 goto rw_error;
4978 }
4979
4980 if (agc_settings->standard == DRX_STANDARD_8VSB)
4981 p_agc_settings = &(ext_attr->vsb_if_agc_cfg);
4982 else if (DRXJ_ISQAMSTD(agc_settings->standard))
4983 p_agc_settings = &(ext_attr->qam_if_agc_cfg);
4984 else if (DRXJ_ISATVSTD(agc_settings->standard))
4985 p_agc_settings = &(ext_attr->atv_if_agc_cfg);
4986 else
4987 return -EINVAL;
4988
4989
4990 if (p_agc_settings->ctrl_mode == DRX_AGC_CTRL_AUTO) {
4991 rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A, agc_settings->top, 0);
4992 if (rc != 0) {
4993 pr_err("error %d\n", rc);
4994 goto rw_error;
4995 }
4996 rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_IF_IACCU_HI_TGT__A, agc_settings->top, 0);
4997 if (rc != 0) {
4998 pr_err("error %d\n", rc);
4999 goto rw_error;
5000 }
5001 }
5002
5003
5004 rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_RF_IACCU_HI_CO__A, agc_settings->cut_off_current, 0);
5005 if (rc != 0) {
5006 pr_err("error %d\n", rc);
5007 goto rw_error;
5008 }
5009 break;
5010 case DRX_AGC_CTRL_USER:
5011
5012
5013 rc = drxj_dap_read_reg16(dev_addr, IQM_AF_STDBY__A, &data, 0);
5014 if (rc != 0) {
5015 pr_err("error %d\n", rc);
5016 goto rw_error;
5017 }
5018 data |= IQM_AF_STDBY_STDBY_TAGC_RF_A2_ACTIVE;
5019 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_STDBY__A, data, 0);
5020 if (rc != 0) {
5021 pr_err("error %d\n", rc);
5022 goto rw_error;
5023 }
5024
5025
5026 rc = (*scu_rr16)(dev_addr, SCU_RAM_AGC_KI__A, &data, 0);
5027 if (rc != 0) {
5028 pr_err("error %d\n", rc);
5029 goto rw_error;
5030 }
5031 data &= ~SCU_RAM_AGC_KI_RF__M;
5032 if (common_attr->tuner_rf_agc_pol)
5033 data |= SCU_RAM_AGC_KI_INV_RF_POL__M;
5034 else
5035 data &= ~SCU_RAM_AGC_KI_INV_RF_POL__M;
5036 rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_KI__A, data, 0);
5037 if (rc != 0) {
5038 pr_err("error %d\n", rc);
5039 goto rw_error;
5040 }
5041
5042
5043 rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_RF_IACCU_HI__A, agc_settings->output_level, 0);
5044 if (rc != 0) {
5045 pr_err("error %d\n", rc);
5046 goto rw_error;
5047 }
5048 break;
5049 case DRX_AGC_CTRL_OFF:
5050
5051
5052 rc = drxj_dap_read_reg16(dev_addr, IQM_AF_STDBY__A, &data, 0);
5053 if (rc != 0) {
5054 pr_err("error %d\n", rc);
5055 goto rw_error;
5056 }
5057 data &= (~IQM_AF_STDBY_STDBY_TAGC_RF_A2_ACTIVE);
5058 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_STDBY__A, data, 0);
5059 if (rc != 0) {
5060 pr_err("error %d\n", rc);
5061 goto rw_error;
5062 }
5063
5064
5065 rc = (*scu_rr16)(dev_addr, SCU_RAM_AGC_KI__A, &data, 0);
5066 if (rc != 0) {
5067 pr_err("error %d\n", rc);
5068 goto rw_error;
5069 }
5070 data &= ~SCU_RAM_AGC_KI_RF__M;
5071 rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_KI__A, data, 0);
5072 if (rc != 0) {
5073 pr_err("error %d\n", rc);
5074 goto rw_error;
5075 }
5076 break;
5077 default:
5078 return -EINVAL;
5079 }
5080 }
5081
5082
5083 switch (agc_settings->standard) {
5084 case DRX_STANDARD_8VSB:
5085 ext_attr->vsb_rf_agc_cfg = *agc_settings;
5086 break;
5087#ifndef DRXJ_VSB_ONLY
5088 case DRX_STANDARD_ITU_A:
5089 case DRX_STANDARD_ITU_B:
5090 case DRX_STANDARD_ITU_C:
5091 ext_attr->qam_rf_agc_cfg = *agc_settings;
5092 break;
5093#endif
5094 default:
5095 return -EIO;
5096 }
5097
5098 return 0;
5099rw_error:
5100 return rc;
5101}
5102
5103
5104
5105
5106
5107
5108
5109
5110static int
5111set_agc_if(struct drx_demod_instance *demod, struct drxj_cfg_agc *agc_settings, bool atomic)
5112{
5113 struct i2c_device_addr *dev_addr = NULL;
5114 struct drxj_data *ext_attr = NULL;
5115 struct drxj_cfg_agc *p_agc_settings = NULL;
5116 struct drx_common_attr *common_attr = NULL;
5117 drx_write_reg16func_t scu_wr16 = NULL;
5118 drx_read_reg16func_t scu_rr16 = NULL;
5119 int rc;
5120
5121 common_attr = (struct drx_common_attr *) demod->my_common_attr;
5122 dev_addr = demod->my_i2c_dev_addr;
5123 ext_attr = (struct drxj_data *) demod->my_ext_attr;
5124
5125 if (atomic) {
5126 scu_rr16 = drxj_dap_scu_atomic_read_reg16;
5127 scu_wr16 = drxj_dap_scu_atomic_write_reg16;
5128 } else {
5129 scu_rr16 = drxj_dap_read_reg16;
5130 scu_wr16 = drxj_dap_write_reg16;
5131 }
5132
5133
5134 if ((ext_attr->standard == agc_settings->standard) ||
5135 (DRXJ_ISQAMSTD(ext_attr->standard) &&
5136 DRXJ_ISQAMSTD(agc_settings->standard)) ||
5137 (DRXJ_ISATVSTD(ext_attr->standard) &&
5138 DRXJ_ISATVSTD(agc_settings->standard))) {
5139 u16 data = 0;
5140
5141 switch (agc_settings->ctrl_mode) {
5142 case DRX_AGC_CTRL_AUTO:
5143
5144 rc = drxj_dap_read_reg16(dev_addr, IQM_AF_STDBY__A, &data, 0);
5145 if (rc != 0) {
5146 pr_err("error %d\n", rc);
5147 goto rw_error;
5148 }
5149 data |= IQM_AF_STDBY_STDBY_TAGC_IF_A2_ACTIVE;
5150 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_STDBY__A, data, 0);
5151 if (rc != 0) {
5152 pr_err("error %d\n", rc);
5153 goto rw_error;
5154 }
5155
5156
5157 rc = (*scu_rr16)(dev_addr, SCU_RAM_AGC_KI__A, &data, 0);
5158 if (rc != 0) {
5159 pr_err("error %d\n", rc);
5160 goto rw_error;
5161 }
5162 data &= ~SCU_RAM_AGC_KI_IF_AGC_DISABLE__M;
5163 data &= ~SCU_RAM_AGC_KI_IF__M;
5164 if (ext_attr->standard == DRX_STANDARD_8VSB)
5165 data |= (3 << SCU_RAM_AGC_KI_IF__B);
5166 else if (DRXJ_ISQAMSTD(ext_attr->standard))
5167 data |= (6 << SCU_RAM_AGC_KI_IF__B);
5168 else
5169 data |= (5 << SCU_RAM_AGC_KI_IF__B);
5170
5171 if (common_attr->tuner_if_agc_pol)
5172 data |= SCU_RAM_AGC_KI_INV_IF_POL__M;
5173 else
5174 data &= ~SCU_RAM_AGC_KI_INV_IF_POL__M;
5175 rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_KI__A, data, 0);
5176 if (rc != 0) {
5177 pr_err("error %d\n", rc);
5178 goto rw_error;
5179 }
5180
5181
5182 rc = (*scu_rr16)(dev_addr, SCU_RAM_AGC_KI_RED__A, &data, 0);
5183 if (rc != 0) {
5184 pr_err("error %d\n", rc);
5185 goto rw_error;
5186 }
5187 data &= ~SCU_RAM_AGC_KI_RED_IAGC_RED__M;
5188 rc = (*scu_wr16) (dev_addr, SCU_RAM_AGC_KI_RED__A, (~(agc_settings->speed << SCU_RAM_AGC_KI_RED_IAGC_RED__B) & SCU_RAM_AGC_KI_RED_IAGC_RED__M) | data, 0);
5189 if (rc != 0) {
5190 pr_err("error %d\n", rc);
5191 goto rw_error;
5192 }
5193
5194 if (agc_settings->standard == DRX_STANDARD_8VSB)
5195 p_agc_settings = &(ext_attr->vsb_rf_agc_cfg);
5196 else if (DRXJ_ISQAMSTD(agc_settings->standard))
5197 p_agc_settings = &(ext_attr->qam_rf_agc_cfg);
5198 else if (DRXJ_ISATVSTD(agc_settings->standard))
5199 p_agc_settings = &(ext_attr->atv_rf_agc_cfg);
5200 else
5201 return -EINVAL;
5202
5203
5204 if (p_agc_settings->ctrl_mode == DRX_AGC_CTRL_AUTO) {
5205 rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A, p_agc_settings->top, 0);
5206 if (rc != 0) {
5207 pr_err("error %d\n", rc);
5208 goto rw_error;
5209 }
5210 rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_IF_IACCU_HI_TGT__A, p_agc_settings->top, 0);
5211 if (rc != 0) {
5212 pr_err("error %d\n", rc);
5213 goto rw_error;
5214 }
5215 } else {
5216 rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A, 0, 0);
5217 if (rc != 0) {
5218 pr_err("error %d\n", rc);
5219 goto rw_error;
5220 }
5221 rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_IF_IACCU_HI_TGT__A, 0, 0);
5222 if (rc != 0) {
5223 pr_err("error %d\n", rc);
5224 goto rw_error;
5225 }
5226 }
5227 break;
5228
5229 case DRX_AGC_CTRL_USER:
5230
5231
5232 rc = drxj_dap_read_reg16(dev_addr, IQM_AF_STDBY__A, &data, 0);
5233 if (rc != 0) {
5234 pr_err("error %d\n", rc);
5235 goto rw_error;
5236 }
5237 data |= IQM_AF_STDBY_STDBY_TAGC_IF_A2_ACTIVE;
5238 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_STDBY__A, data, 0);
5239 if (rc != 0) {
5240 pr_err("error %d\n", rc);
5241 goto rw_error;
5242 }
5243
5244
5245 rc = (*scu_rr16)(dev_addr, SCU_RAM_AGC_KI__A, &data, 0);
5246 if (rc != 0) {
5247 pr_err("error %d\n", rc);
5248 goto rw_error;
5249 }
5250 data &= ~SCU_RAM_AGC_KI_IF_AGC_DISABLE__M;
5251 data |= SCU_RAM_AGC_KI_IF_AGC_DISABLE__M;
5252 if (common_attr->tuner_if_agc_pol)
5253 data |= SCU_RAM_AGC_KI_INV_IF_POL__M;
5254 else
5255 data &= ~SCU_RAM_AGC_KI_INV_IF_POL__M;
5256 rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_KI__A, data, 0);
5257 if (rc != 0) {
5258 pr_err("error %d\n", rc);
5259 goto rw_error;
5260 }
5261
5262
5263 rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_IF_IACCU_HI_TGT_MAX__A, agc_settings->output_level, 0);
5264 if (rc != 0) {
5265 pr_err("error %d\n", rc);
5266 goto rw_error;
5267 }
5268 break;
5269
5270 case DRX_AGC_CTRL_OFF:
5271
5272
5273 rc = drxj_dap_read_reg16(dev_addr, IQM_AF_STDBY__A, &data, 0);
5274 if (rc != 0) {
5275 pr_err("error %d\n", rc);
5276 goto rw_error;
5277 }
5278 data &= (~IQM_AF_STDBY_STDBY_TAGC_IF_A2_ACTIVE);
5279 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_STDBY__A, data, 0);
5280 if (rc != 0) {
5281 pr_err("error %d\n", rc);
5282 goto rw_error;
5283 }
5284
5285
5286 rc = (*scu_rr16)(dev_addr, SCU_RAM_AGC_KI__A, &data, 0);
5287 if (rc != 0) {
5288 pr_err("error %d\n", rc);
5289 goto rw_error;
5290 }
5291 data &= ~SCU_RAM_AGC_KI_IF_AGC_DISABLE__M;
5292 data |= SCU_RAM_AGC_KI_IF_AGC_DISABLE__M;
5293 rc = (*scu_wr16)(dev_addr, SCU_RAM_AGC_KI__A, data, 0);
5294 if (rc != 0) {
5295 pr_err("error %d\n", rc);
5296 goto rw_error;
5297 }
5298 break;
5299 default:
5300 return -EINVAL;
5301 }
5302
5303
5304 rc = (*scu_wr16) (dev_addr, SCU_RAM_AGC_INGAIN_TGT_MIN__A, agc_settings->top, 0);
5305 if (rc != 0) {
5306 pr_err("error %d\n", rc);
5307 goto rw_error;
5308 }
5309 }
5310
5311
5312 switch (agc_settings->standard) {
5313 case DRX_STANDARD_8VSB:
5314 ext_attr->vsb_if_agc_cfg = *agc_settings;
5315 break;
5316#ifndef DRXJ_VSB_ONLY
5317 case DRX_STANDARD_ITU_A:
5318 case DRX_STANDARD_ITU_B:
5319 case DRX_STANDARD_ITU_C:
5320 ext_attr->qam_if_agc_cfg = *agc_settings;
5321 break;
5322#endif
5323 default:
5324 return -EIO;
5325 }
5326
5327 return 0;
5328rw_error:
5329 return rc;
5330}
5331
5332
5333
5334
5335
5336
5337
5338
5339static int set_iqm_af(struct drx_demod_instance *demod, bool active)
5340{
5341 u16 data = 0;
5342 struct i2c_device_addr *dev_addr = NULL;
5343 int rc;
5344
5345 dev_addr = demod->my_i2c_dev_addr;
5346
5347
5348 rc = drxj_dap_read_reg16(dev_addr, IQM_AF_STDBY__A, &data, 0);
5349 if (rc != 0) {
5350 pr_err("error %d\n", rc);
5351 goto rw_error;
5352 }
5353 if (!active)
5354 data &= ((~IQM_AF_STDBY_STDBY_ADC_A2_ACTIVE) & (~IQM_AF_STDBY_STDBY_AMP_A2_ACTIVE) & (~IQM_AF_STDBY_STDBY_PD_A2_ACTIVE) & (~IQM_AF_STDBY_STDBY_TAGC_IF_A2_ACTIVE) & (~IQM_AF_STDBY_STDBY_TAGC_RF_A2_ACTIVE));
5355 else
5356 data |= (IQM_AF_STDBY_STDBY_ADC_A2_ACTIVE | IQM_AF_STDBY_STDBY_AMP_A2_ACTIVE | IQM_AF_STDBY_STDBY_PD_A2_ACTIVE | IQM_AF_STDBY_STDBY_TAGC_IF_A2_ACTIVE | IQM_AF_STDBY_STDBY_TAGC_RF_A2_ACTIVE);
5357 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_STDBY__A, data, 0);
5358 if (rc != 0) {
5359 pr_err("error %d\n", rc);
5360 goto rw_error;
5361 }
5362
5363 return 0;
5364rw_error:
5365 return rc;
5366}
5367
5368
5369
5370
5371
5372
5373
5374
5375
5376
5377
5378
5379
5380
5381
5382
5383
5384
5385static int power_down_vsb(struct drx_demod_instance *demod, bool primary)
5386{
5387 struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
5388 struct drxjscu_cmd cmd_scu = { 0,
5389 0,
5390 0,
5391 NULL,
5392 NULL
5393 };
5394 struct drx_cfg_mpeg_output cfg_mpeg_output;
5395 int rc;
5396 u16 cmd_result = 0;
5397
5398
5399
5400
5401
5402 cmd_scu.command = SCU_RAM_COMMAND_STANDARD_VSB |
5403 SCU_RAM_COMMAND_CMD_DEMOD_STOP;
5404 cmd_scu.parameter_len = 0;
5405 cmd_scu.result_len = 1;
5406 cmd_scu.parameter = NULL;
5407 cmd_scu.result = &cmd_result;
5408 rc = scu_command(dev_addr, &cmd_scu);
5409 if (rc != 0) {
5410 pr_err("error %d\n", rc);
5411 goto rw_error;
5412 }
5413
5414
5415 rc = drxj_dap_write_reg16(dev_addr, FEC_COMM_EXEC__A, FEC_COMM_EXEC_STOP, 0);
5416 if (rc != 0) {
5417 pr_err("error %d\n", rc);
5418 goto rw_error;
5419 }
5420 rc = drxj_dap_write_reg16(dev_addr, VSB_COMM_EXEC__A, VSB_COMM_EXEC_STOP, 0);
5421 if (rc != 0) {
5422 pr_err("error %d\n", rc);
5423 goto rw_error;
5424 }
5425 if (primary) {
5426 rc = drxj_dap_write_reg16(dev_addr, IQM_COMM_EXEC__A, IQM_COMM_EXEC_STOP, 0);
5427 if (rc != 0) {
5428 pr_err("error %d\n", rc);
5429 goto rw_error;
5430 }
5431 rc = set_iqm_af(demod, false);
5432 if (rc != 0) {
5433 pr_err("error %d\n", rc);
5434 goto rw_error;
5435 }
5436 } else {
5437 rc = drxj_dap_write_reg16(dev_addr, IQM_FS_COMM_EXEC__A, IQM_FS_COMM_EXEC_STOP, 0);
5438 if (rc != 0) {
5439 pr_err("error %d\n", rc);
5440 goto rw_error;
5441 }
5442 rc = drxj_dap_write_reg16(dev_addr, IQM_FD_COMM_EXEC__A, IQM_FD_COMM_EXEC_STOP, 0);
5443 if (rc != 0) {
5444 pr_err("error %d\n", rc);
5445 goto rw_error;
5446 }
5447 rc = drxj_dap_write_reg16(dev_addr, IQM_RC_COMM_EXEC__A, IQM_RC_COMM_EXEC_STOP, 0);
5448 if (rc != 0) {
5449 pr_err("error %d\n", rc);
5450 goto rw_error;
5451 }
5452 rc = drxj_dap_write_reg16(dev_addr, IQM_RT_COMM_EXEC__A, IQM_RT_COMM_EXEC_STOP, 0);
5453 if (rc != 0) {
5454 pr_err("error %d\n", rc);
5455 goto rw_error;
5456 }
5457 rc = drxj_dap_write_reg16(dev_addr, IQM_CF_COMM_EXEC__A, IQM_CF_COMM_EXEC_STOP, 0);
5458 if (rc != 0) {
5459 pr_err("error %d\n", rc);
5460 goto rw_error;
5461 }
5462 }
5463
5464 cfg_mpeg_output.enable_mpeg_output = false;
5465 rc = ctrl_set_cfg_mpeg_output(demod, &cfg_mpeg_output);
5466 if (rc != 0) {
5467 pr_err("error %d\n", rc);
5468 goto rw_error;
5469 }
5470
5471 return 0;
5472rw_error:
5473 return rc;
5474}
5475
5476
5477
5478
5479
5480
5481
5482static int set_vsb_leak_n_gain(struct drx_demod_instance *demod)
5483{
5484 struct i2c_device_addr *dev_addr = NULL;
5485 int rc;
5486
5487 const u8 vsb_ffe_leak_gain_ram0[] = {
5488 DRXJ_16TO8(0x8),
5489 DRXJ_16TO8(0x8),
5490 DRXJ_16TO8(0x8),
5491 DRXJ_16TO8(0xf),
5492 DRXJ_16TO8(0xf),
5493 DRXJ_16TO8(0xf),
5494 DRXJ_16TO8(0xf),
5495 DRXJ_16TO8(0xf),
5496 DRXJ_16TO8(0xf),
5497 DRXJ_16TO8(0x8),
5498 DRXJ_16TO8(0x8),
5499 DRXJ_16TO8(0x8),
5500 DRXJ_16TO8(0x10),
5501 DRXJ_16TO8(0x10),
5502 DRXJ_16TO8(0x10),
5503 DRXJ_16TO8(0x20),
5504 DRXJ_16TO8(0x20),
5505 DRXJ_16TO8(0x20),
5506 DRXJ_16TO8(0x20),
5507 DRXJ_16TO8(0x20),
5508 DRXJ_16TO8(0x20),
5509 DRXJ_16TO8(0x10),
5510 DRXJ_16TO8(0x10),
5511 DRXJ_16TO8(0x10),
5512 DRXJ_16TO8(0x10),
5513 DRXJ_16TO8(0x10),
5514 DRXJ_16TO8(0x10),
5515 DRXJ_16TO8(0x20),
5516 DRXJ_16TO8(0x20),
5517 DRXJ_16TO8(0x20),
5518 DRXJ_16TO8(0x20),
5519 DRXJ_16TO8(0x20),
5520 DRXJ_16TO8(0x20),
5521 DRXJ_16TO8(0x10),
5522 DRXJ_16TO8(0x10),
5523 DRXJ_16TO8(0x10),
5524 DRXJ_16TO8(0x10),
5525 DRXJ_16TO8(0x10),
5526 DRXJ_16TO8(0x10),
5527 DRXJ_16TO8(0x20),
5528 DRXJ_16TO8(0x20),
5529 DRXJ_16TO8(0x20),
5530 DRXJ_16TO8(0x20),
5531 DRXJ_16TO8(0x20),
5532 DRXJ_16TO8(0x20),
5533 DRXJ_16TO8(0x10),
5534 DRXJ_16TO8(0x10),
5535 DRXJ_16TO8(0x10),
5536 DRXJ_16TO8(0x10),
5537 DRXJ_16TO8(0x10),
5538 DRXJ_16TO8(0x10),
5539 DRXJ_16TO8(0x20),
5540 DRXJ_16TO8(0x20),
5541 DRXJ_16TO8(0x20),
5542 DRXJ_16TO8(0x20),
5543 DRXJ_16TO8(0x20),
5544 DRXJ_16TO8(0x20),
5545 DRXJ_16TO8(0x10),
5546 DRXJ_16TO8(0x10),
5547 DRXJ_16TO8(0x10),
5548 DRXJ_16TO8(0x07),
5549 DRXJ_16TO8(0x07),
5550 DRXJ_16TO8(0x07),
5551 DRXJ_16TO8(0x0e),
5552 DRXJ_16TO8(0x0e),
5553 DRXJ_16TO8(0x0e),
5554 DRXJ_16TO8(0x0e),
5555 DRXJ_16TO8(0x0e),
5556 DRXJ_16TO8(0x0e),
5557 DRXJ_16TO8(0x07),
5558 DRXJ_16TO8(0x07),
5559 DRXJ_16TO8(0x07),
5560 DRXJ_16TO8(0x07),
5561 DRXJ_16TO8(0x07),
5562 DRXJ_16TO8(0x07),
5563 DRXJ_16TO8(0x0e),
5564 DRXJ_16TO8(0x0e),
5565 DRXJ_16TO8(0x0e),
5566 DRXJ_16TO8(0x0e),
5567 DRXJ_16TO8(0x0e),
5568 DRXJ_16TO8(0x0e),
5569 DRXJ_16TO8(0x07),
5570 DRXJ_16TO8(0x07),
5571 DRXJ_16TO8(0x07),
5572 DRXJ_16TO8(0x06),
5573 DRXJ_16TO8(0x06),
5574 DRXJ_16TO8(0x06),
5575 DRXJ_16TO8(0x0c),
5576 DRXJ_16TO8(0x0c),
5577 DRXJ_16TO8(0x0c),
5578 DRXJ_16TO8(0x0c),
5579 DRXJ_16TO8(0x0c),
5580 DRXJ_16TO8(0x0c),
5581 DRXJ_16TO8(0x06),
5582 DRXJ_16TO8(0x06),
5583 DRXJ_16TO8(0x06),
5584 DRXJ_16TO8(0x06),
5585 DRXJ_16TO8(0x06),
5586 DRXJ_16TO8(0x06),
5587 DRXJ_16TO8(0x0c),
5588 DRXJ_16TO8(0x0c),
5589 DRXJ_16TO8(0x0c),
5590 DRXJ_16TO8(0x0c),
5591 DRXJ_16TO8(0x0c),
5592 DRXJ_16TO8(0x0c),
5593 DRXJ_16TO8(0x06),
5594 DRXJ_16TO8(0x06),
5595 DRXJ_16TO8(0x06),
5596 DRXJ_16TO8(0x2020),
5597 DRXJ_16TO8(0x2020),
5598 DRXJ_16TO8(0x2020),
5599 DRXJ_16TO8(0x4040),
5600 DRXJ_16TO8(0x4040),
5601 DRXJ_16TO8(0x4040),
5602 DRXJ_16TO8(0x4040),
5603 DRXJ_16TO8(0x4040),
5604 DRXJ_16TO8(0x4040),
5605 DRXJ_16TO8(0x2020),
5606 DRXJ_16TO8(0x2020),
5607 DRXJ_16TO8(0x2020),
5608 DRXJ_16TO8(0x0808),
5609 DRXJ_16TO8(0x0808),
5610 DRXJ_16TO8(0x0808),
5611 DRXJ_16TO8(0x1010),
5612 DRXJ_16TO8(0x1010),
5613 DRXJ_16TO8(0x1010),
5614 DRXJ_16TO8(0x1010),
5615 DRXJ_16TO8(0x1010)
5616 };
5617
5618 const u8 vsb_ffe_leak_gain_ram1[] = {
5619 DRXJ_16TO8(0x1010),
5620 DRXJ_16TO8(0x0808),
5621 DRXJ_16TO8(0x0808),
5622 DRXJ_16TO8(0x0808),
5623 DRXJ_16TO8(0x0808),
5624 DRXJ_16TO8(0x0808),
5625 DRXJ_16TO8(0x0808),
5626 DRXJ_16TO8(0x1010),
5627 DRXJ_16TO8(0x1010),
5628 DRXJ_16TO8(0x1010),
5629 DRXJ_16TO8(0x1010),
5630 DRXJ_16TO8(0x1010),
5631 DRXJ_16TO8(0x1010),
5632 DRXJ_16TO8(0x0808),
5633 DRXJ_16TO8(0x0808),
5634 DRXJ_16TO8(0x0808),
5635 DRXJ_16TO8(0x0303),
5636 DRXJ_16TO8(0x0303),
5637 DRXJ_16TO8(0x0303),
5638 DRXJ_16TO8(0x0606),
5639 DRXJ_16TO8(0x0606),
5640 DRXJ_16TO8(0x0606),
5641 DRXJ_16TO8(0x0606),
5642 DRXJ_16TO8(0x0606),
5643 DRXJ_16TO8(0x0606),
5644 DRXJ_16TO8(0x0303),
5645 DRXJ_16TO8(0x0303),
5646 DRXJ_16TO8(0x0303),
5647 DRXJ_16TO8(0x0303),
5648 DRXJ_16TO8(0x0303),
5649 DRXJ_16TO8(0x0303),
5650 DRXJ_16TO8(0x0505),
5651 DRXJ_16TO8(0x0505),
5652 DRXJ_16TO8(0x0505),
5653 DRXJ_16TO8(0x0505),
5654 DRXJ_16TO8(0x0505),
5655 DRXJ_16TO8(0x0505),
5656 DRXJ_16TO8(0x0303),
5657 DRXJ_16TO8(0x0303),
5658 DRXJ_16TO8(0x0303),
5659 DRXJ_16TO8(0x001f),
5660 DRXJ_16TO8(0x01ff),
5661 DRXJ_16TO8(0x01ff),
5662 DRXJ_16TO8(0x004f),
5663 DRXJ_16TO8(0x004f),
5664 DRXJ_16TO8(0x01ff),
5665 DRXJ_16TO8(0x01ff),
5666 DRXJ_16TO8(0x0352),
5667 DRXJ_16TO8(0x0352),
5668 DRXJ_16TO8(0x0000),
5669 DRXJ_16TO8(0x2020),
5670 DRXJ_16TO8(0x1010),
5671 DRXJ_16TO8(0x1818),
5672 DRXJ_16TO8(0x1212)
5673 };
5674
5675 dev_addr = demod->my_i2c_dev_addr;
5676 rc = drxdap_fasi_write_block(dev_addr, VSB_SYSCTRL_RAM0_FFETRAINLKRATIO1__A, sizeof(vsb_ffe_leak_gain_ram0), ((u8 *)vsb_ffe_leak_gain_ram0), 0);
5677 if (rc != 0) {
5678 pr_err("error %d\n", rc);
5679 goto rw_error;
5680 }
5681 rc = drxdap_fasi_write_block(dev_addr, VSB_SYSCTRL_RAM1_FIRRCA1GAIN9__A, sizeof(vsb_ffe_leak_gain_ram1), ((u8 *)vsb_ffe_leak_gain_ram1), 0);
5682 if (rc != 0) {
5683 pr_err("error %d\n", rc);
5684 goto rw_error;
5685 }
5686
5687 return 0;
5688rw_error:
5689 return rc;
5690}
5691
5692
5693
5694
5695
5696
5697
5698
5699static int set_vsb(struct drx_demod_instance *demod)
5700{
5701 struct i2c_device_addr *dev_addr = NULL;
5702 int rc;
5703 struct drx_common_attr *common_attr = NULL;
5704 struct drxjscu_cmd cmd_scu;
5705 struct drxj_data *ext_attr = NULL;
5706 u16 cmd_result = 0;
5707 u16 cmd_param = 0;
5708 const u8 vsb_taps_re[] = {
5709 DRXJ_16TO8(-2),
5710 DRXJ_16TO8(4),
5711 DRXJ_16TO8(1),
5712 DRXJ_16TO8(-4),
5713 DRXJ_16TO8(1),
5714 DRXJ_16TO8(4),
5715 DRXJ_16TO8(-3),
5716 DRXJ_16TO8(-3),
5717 DRXJ_16TO8(6),
5718 DRXJ_16TO8(1),
5719 DRXJ_16TO8(-9),
5720 DRXJ_16TO8(3),
5721 DRXJ_16TO8(12),
5722 DRXJ_16TO8(-9),
5723 DRXJ_16TO8(-15),
5724 DRXJ_16TO8(17),
5725 DRXJ_16TO8(19),
5726 DRXJ_16TO8(-29),
5727 DRXJ_16TO8(-22),
5728 DRXJ_16TO8(45),
5729 DRXJ_16TO8(25),
5730 DRXJ_16TO8(-70),
5731 DRXJ_16TO8(-28),
5732 DRXJ_16TO8(111),
5733 DRXJ_16TO8(30),
5734 DRXJ_16TO8(-201),
5735 DRXJ_16TO8(-31),
5736 DRXJ_16TO8(629)
5737 };
5738
5739 dev_addr = demod->my_i2c_dev_addr;
5740 common_attr = (struct drx_common_attr *) demod->my_common_attr;
5741 ext_attr = (struct drxj_data *) demod->my_ext_attr;
5742
5743
5744 rc = drxj_dap_write_reg16(dev_addr, FEC_COMM_EXEC__A, FEC_COMM_EXEC_STOP, 0);
5745 if (rc != 0) {
5746 pr_err("error %d\n", rc);
5747 goto rw_error;
5748 }
5749 rc = drxj_dap_write_reg16(dev_addr, VSB_COMM_EXEC__A, VSB_COMM_EXEC_STOP, 0);
5750 if (rc != 0) {
5751 pr_err("error %d\n", rc);
5752 goto rw_error;
5753 }
5754 rc = drxj_dap_write_reg16(dev_addr, IQM_FS_COMM_EXEC__A, IQM_FS_COMM_EXEC_STOP, 0);
5755 if (rc != 0) {
5756 pr_err("error %d\n", rc);
5757 goto rw_error;
5758 }
5759 rc = drxj_dap_write_reg16(dev_addr, IQM_FD_COMM_EXEC__A, IQM_FD_COMM_EXEC_STOP, 0);
5760 if (rc != 0) {
5761 pr_err("error %d\n", rc);
5762 goto rw_error;
5763 }
5764 rc = drxj_dap_write_reg16(dev_addr, IQM_RC_COMM_EXEC__A, IQM_RC_COMM_EXEC_STOP, 0);
5765 if (rc != 0) {
5766 pr_err("error %d\n", rc);
5767 goto rw_error;
5768 }
5769 rc = drxj_dap_write_reg16(dev_addr, IQM_RT_COMM_EXEC__A, IQM_RT_COMM_EXEC_STOP, 0);
5770 if (rc != 0) {
5771 pr_err("error %d\n", rc);
5772 goto rw_error;
5773 }
5774 rc = drxj_dap_write_reg16(dev_addr, IQM_CF_COMM_EXEC__A, IQM_CF_COMM_EXEC_STOP, 0);
5775 if (rc != 0) {
5776 pr_err("error %d\n", rc);
5777 goto rw_error;
5778 }
5779
5780
5781 cmd_scu.command = SCU_RAM_COMMAND_STANDARD_VSB
5782 | SCU_RAM_COMMAND_CMD_DEMOD_RESET;
5783 cmd_scu.parameter_len = 0;
5784 cmd_scu.result_len = 1;
5785 cmd_scu.parameter = NULL;
5786 cmd_scu.result = &cmd_result;
5787 rc = scu_command(dev_addr, &cmd_scu);
5788 if (rc != 0) {
5789 pr_err("error %d\n", rc);
5790 goto rw_error;
5791 }
5792
5793 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_DCF_BYPASS__A, 1, 0);
5794 if (rc != 0) {
5795 pr_err("error %d\n", rc);
5796 goto rw_error;
5797 }
5798 rc = drxj_dap_write_reg16(dev_addr, IQM_FS_ADJ_SEL__A, IQM_FS_ADJ_SEL_B_VSB, 0);
5799 if (rc != 0) {
5800 pr_err("error %d\n", rc);
5801 goto rw_error;
5802 }
5803 rc = drxj_dap_write_reg16(dev_addr, IQM_RC_ADJ_SEL__A, IQM_RC_ADJ_SEL_B_VSB, 0);
5804 if (rc != 0) {
5805 pr_err("error %d\n", rc);
5806 goto rw_error;
5807 }
5808 ext_attr->iqm_rc_rate_ofs = 0x00AD0D79;
5809 rc = drxdap_fasi_write_reg32(dev_addr, IQM_RC_RATE_OFS_LO__A, ext_attr->iqm_rc_rate_ofs, 0);
5810 if (rc != 0) {
5811 pr_err("error %d\n", rc);
5812 goto rw_error;
5813 }
5814 rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_CFAGC_GAINSHIFT__A, 4, 0);
5815 if (rc != 0) {
5816 pr_err("error %d\n", rc);
5817 goto rw_error;
5818 }
5819 rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_CYGN1TRK__A, 1, 0);
5820 if (rc != 0) {
5821 pr_err("error %d\n", rc);
5822 goto rw_error;
5823 }
5824
5825 rc = drxj_dap_write_reg16(dev_addr, IQM_RC_CROUT_ENA__A, 1, 0);
5826 if (rc != 0) {
5827 pr_err("error %d\n", rc);
5828 goto rw_error;
5829 }
5830 rc = drxj_dap_write_reg16(dev_addr, IQM_RC_STRETCH__A, 28, 0);
5831 if (rc != 0) {
5832 pr_err("error %d\n", rc);
5833 goto rw_error;
5834 }
5835 rc = drxj_dap_write_reg16(dev_addr, IQM_RT_ACTIVE__A, 0, 0);
5836 if (rc != 0) {
5837 pr_err("error %d\n", rc);
5838 goto rw_error;
5839 }
5840 rc = drxj_dap_write_reg16(dev_addr, IQM_CF_SYMMETRIC__A, 0, 0);
5841 if (rc != 0) {
5842 pr_err("error %d\n", rc);
5843 goto rw_error;
5844 }
5845 rc = drxj_dap_write_reg16(dev_addr, IQM_CF_MIDTAP__A, 3, 0);
5846 if (rc != 0) {
5847 pr_err("error %d\n", rc);
5848 goto rw_error;
5849 }
5850 rc = drxj_dap_write_reg16(dev_addr, IQM_CF_OUT_ENA__A, IQM_CF_OUT_ENA_VSB__M, 0);
5851 if (rc != 0) {
5852 pr_err("error %d\n", rc);
5853 goto rw_error;
5854 }
5855 rc = drxj_dap_write_reg16(dev_addr, IQM_CF_SCALE__A, 1393, 0);
5856 if (rc != 0) {
5857 pr_err("error %d\n", rc);
5858 goto rw_error;
5859 }
5860 rc = drxj_dap_write_reg16(dev_addr, IQM_CF_SCALE_SH__A, 0, 0);
5861 if (rc != 0) {
5862 pr_err("error %d\n", rc);
5863 goto rw_error;
5864 }
5865 rc = drxj_dap_write_reg16(dev_addr, IQM_CF_POW_MEAS_LEN__A, 1, 0);
5866 if (rc != 0) {
5867 pr_err("error %d\n", rc);
5868 goto rw_error;
5869 }
5870
5871 rc = drxdap_fasi_write_block(dev_addr, IQM_CF_TAP_RE0__A, sizeof(vsb_taps_re), ((u8 *)vsb_taps_re), 0);
5872 if (rc != 0) {
5873 pr_err("error %d\n", rc);
5874 goto rw_error;
5875 }
5876 rc = drxdap_fasi_write_block(dev_addr, IQM_CF_TAP_IM0__A, sizeof(vsb_taps_re), ((u8 *)vsb_taps_re), 0);
5877 if (rc != 0) {
5878 pr_err("error %d\n", rc);
5879 goto rw_error;
5880 }
5881
5882 rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_BNTHRESH__A, 330, 0);
5883 if (rc != 0) {
5884 pr_err("error %d\n", rc);
5885 goto rw_error;
5886 }
5887 rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_CLPLASTNUM__A, 90, 0);
5888 if (rc != 0) {
5889 pr_err("error %d\n", rc);
5890 goto rw_error;
5891 }
5892 rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_SNRTH_RCA1__A, 0x0042, 0);
5893 if (rc != 0) {
5894 pr_err("error %d\n", rc);
5895 goto rw_error;
5896 }
5897 rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_SNRTH_RCA2__A, 0x0053, 0);
5898 if (rc != 0) {
5899 pr_err("error %d\n", rc);
5900 goto rw_error;
5901 }
5902 rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_EQCTRL__A, 0x1, 0);
5903 if (rc != 0) {
5904 pr_err("error %d\n", rc);
5905 goto rw_error;
5906 }
5907 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_GPIO__A, 0, 0);
5908 if (rc != 0) {
5909 pr_err("error %d\n", rc);
5910 goto rw_error;
5911 }
5912
5913
5914 rc = drxj_dap_write_reg16(dev_addr, FEC_TOP_ANNEX__A, FEC_TOP_ANNEX_D, 0);
5915 if (rc != 0) {
5916 pr_err("error %d\n", rc);
5917 goto rw_error;
5918 }
5919 {
5920 u16 fec_oc_snc_mode = 0;
5921 rc = drxj_dap_read_reg16(dev_addr, FEC_OC_SNC_MODE__A, &fec_oc_snc_mode, 0);
5922 if (rc != 0) {
5923 pr_err("error %d\n", rc);
5924 goto rw_error;
5925 }
5926
5927 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_SNC_MODE__A, fec_oc_snc_mode | FEC_OC_SNC_MODE_UNLOCK_ENABLE__M, 0);
5928 if (rc != 0) {
5929 pr_err("error %d\n", rc);
5930 goto rw_error;
5931 }
5932 }
5933
5934
5935 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_CLP_LEN__A, 0, 0);
5936 if (rc != 0) {
5937 pr_err("error %d\n", rc);
5938 goto rw_error;
5939 }
5940 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_CLP_TH__A, 470, 0);
5941 if (rc != 0) {
5942 pr_err("error %d\n", rc);
5943 goto rw_error;
5944 }
5945 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_SNS_LEN__A, 0, 0);
5946 if (rc != 0) {
5947 pr_err("error %d\n", rc);
5948 goto rw_error;
5949 }
5950 rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_SNRTH_PT__A, 0xD4, 0);
5951 if (rc != 0) {
5952 pr_err("error %d\n", rc);
5953 goto rw_error;
5954 }
5955
5956 {
5957 u16 fec_oc_reg_mode = 0;
5958 rc = drxj_dap_read_reg16(dev_addr, FEC_OC_MODE__A, &fec_oc_reg_mode, 0);
5959 if (rc != 0) {
5960 pr_err("error %d\n", rc);
5961 goto rw_error;
5962 }
5963 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_MODE__A, fec_oc_reg_mode & (~(FEC_OC_MODE_TRANSPARENT__M | FEC_OC_MODE_CLEAR__M | FEC_OC_MODE_RETAIN_FRAMING__M)), 0);
5964 if (rc != 0) {
5965 pr_err("error %d\n", rc);
5966 goto rw_error;
5967 }
5968 }
5969
5970 rc = drxj_dap_write_reg16(dev_addr, FEC_DI_TIMEOUT_LO__A, 0, 0);
5971 if (rc != 0) {
5972 pr_err("error %d\n", rc);
5973 goto rw_error;
5974 }
5975 rc = drxj_dap_write_reg16(dev_addr, FEC_DI_TIMEOUT_HI__A, 3, 0);
5976 if (rc != 0) {
5977 pr_err("error %d\n", rc);
5978 goto rw_error;
5979 }
5980 rc = drxj_dap_write_reg16(dev_addr, FEC_RS_MODE__A, 0, 0);
5981 if (rc != 0) {
5982 pr_err("error %d\n", rc);
5983 goto rw_error;
5984 }
5985
5986 rc = drxj_dap_write_reg16(dev_addr, FEC_RS_MEASUREMENT_PERIOD__A, FEC_RS_MEASUREMENT_PERIOD, 0);
5987 if (rc != 0) {
5988 pr_err("error %d\n", rc);
5989 goto rw_error;
5990 }
5991 rc = drxj_dap_write_reg16(dev_addr, FEC_RS_MEASUREMENT_PRESCALE__A, FEC_RS_MEASUREMENT_PRESCALE, 0);
5992 if (rc != 0) {
5993 pr_err("error %d\n", rc);
5994 goto rw_error;
5995 }
5996
5997
5998 rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_MEASUREMENT_PERIOD__A, VSB_TOP_MEASUREMENT_PERIOD, 0);
5999 if (rc != 0) {
6000 pr_err("error %d\n", rc);
6001 goto rw_error;
6002 }
6003 rc = drxdap_fasi_write_reg32(dev_addr, SCU_RAM_FEC_ACCUM_CW_CORRECTED_LO__A, 0, 0);
6004 if (rc != 0) {
6005 pr_err("error %d\n", rc);
6006 goto rw_error;
6007 }
6008 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_FEC_MEAS_COUNT__A, 0, 0);
6009 if (rc != 0) {
6010 pr_err("error %d\n", rc);
6011 goto rw_error;
6012 }
6013 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_FEC_ACCUM_PKT_FAILURES__A, 0, 0);
6014 if (rc != 0) {
6015 pr_err("error %d\n", rc);
6016 goto rw_error;
6017 }
6018
6019 rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_CKGN1TRK__A, 128, 0);
6020 if (rc != 0) {
6021 pr_err("error %d\n", rc);
6022 goto rw_error;
6023 }
6024
6025 if (!ext_attr->has_lna) {
6026 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_AMUX__A, 0x02, 0);
6027 if (rc != 0) {
6028 pr_err("error %d\n", rc);
6029 goto rw_error;
6030 }
6031 }
6032
6033
6034 rc = set_iqm_af(demod, true);
6035 if (rc != 0) {
6036 pr_err("error %d\n", rc);
6037 goto rw_error;
6038 }
6039 rc = adc_synchronization(demod);
6040 if (rc != 0) {
6041 pr_err("error %d\n", rc);
6042 goto rw_error;
6043 }
6044
6045 rc = init_agc(demod);
6046 if (rc != 0) {
6047 pr_err("error %d\n", rc);
6048 goto rw_error;
6049 }
6050 rc = set_agc_if(demod, &(ext_attr->vsb_if_agc_cfg), false);
6051 if (rc != 0) {
6052 pr_err("error %d\n", rc);
6053 goto rw_error;
6054 }
6055 rc = set_agc_rf(demod, &(ext_attr->vsb_rf_agc_cfg), false);
6056 if (rc != 0) {
6057 pr_err("error %d\n", rc);
6058 goto rw_error;
6059 }
6060 {
6061
6062
6063 struct drxj_cfg_afe_gain vsb_pga_cfg = { DRX_STANDARD_8VSB, 0 };
6064
6065 vsb_pga_cfg.gain = ext_attr->vsb_pga_cfg;
6066 rc = ctrl_set_cfg_afe_gain(demod, &vsb_pga_cfg);
6067 if (rc != 0) {
6068 pr_err("error %d\n", rc);
6069 goto rw_error;
6070 }
6071 }
6072 rc = ctrl_set_cfg_pre_saw(demod, &(ext_attr->vsb_pre_saw_cfg));
6073 if (rc != 0) {
6074 pr_err("error %d\n", rc);
6075 goto rw_error;
6076 }
6077
6078
6079 rc = set_mpegtei_handling(demod);
6080 if (rc != 0) {
6081 pr_err("error %d\n", rc);
6082 goto rw_error;
6083 }
6084 rc = bit_reverse_mpeg_output(demod);
6085 if (rc != 0) {
6086 pr_err("error %d\n", rc);
6087 goto rw_error;
6088 }
6089 rc = set_mpeg_start_width(demod);
6090 if (rc != 0) {
6091 pr_err("error %d\n", rc);
6092 goto rw_error;
6093 }
6094 {
6095
6096
6097 struct drx_cfg_mpeg_output cfg_mpeg_output;
6098
6099 memcpy(&cfg_mpeg_output, &common_attr->mpeg_cfg, sizeof(cfg_mpeg_output));
6100 cfg_mpeg_output.enable_mpeg_output = true;
6101
6102 rc = ctrl_set_cfg_mpeg_output(demod, &cfg_mpeg_output);
6103 if (rc != 0) {
6104 pr_err("error %d\n", rc);
6105 goto rw_error;
6106 }
6107 }
6108
6109
6110 cmd_param = 0x00;
6111 cmd_scu.command = SCU_RAM_COMMAND_STANDARD_VSB
6112 | SCU_RAM_COMMAND_CMD_DEMOD_SET_PARAM;
6113 cmd_scu.parameter_len = 1;
6114 cmd_scu.result_len = 1;
6115 cmd_scu.parameter = &cmd_param;
6116 cmd_scu.result = &cmd_result;
6117 rc = scu_command(dev_addr, &cmd_scu);
6118 if (rc != 0) {
6119 pr_err("error %d\n", rc);
6120 goto rw_error;
6121 }
6122
6123 rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_BEAGC_GAINSHIFT__A, 0x0004, 0);
6124 if (rc != 0) {
6125 pr_err("error %d\n", rc);
6126 goto rw_error;
6127 }
6128 rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_SNRTH_PT__A, 0x00D2, 0);
6129 if (rc != 0) {
6130 pr_err("error %d\n", rc);
6131 goto rw_error;
6132 }
6133 rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_SYSSMTRNCTRL__A, VSB_TOP_SYSSMTRNCTRL__PRE | VSB_TOP_SYSSMTRNCTRL_NCOTIMEOUTCNTEN__M, 0);
6134 if (rc != 0) {
6135 pr_err("error %d\n", rc);
6136 goto rw_error;
6137 }
6138 rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_BEDETCTRL__A, 0x142, 0);
6139 if (rc != 0) {
6140 pr_err("error %d\n", rc);
6141 goto rw_error;
6142 }
6143 rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_LBAGCREFLVL__A, 640, 0);
6144 if (rc != 0) {
6145 pr_err("error %d\n", rc);
6146 goto rw_error;
6147 }
6148 rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_CYGN1ACQ__A, 4, 0);
6149 if (rc != 0) {
6150 pr_err("error %d\n", rc);
6151 goto rw_error;
6152 }
6153 rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_CYGN1TRK__A, 2, 0);
6154 if (rc != 0) {
6155 pr_err("error %d\n", rc);
6156 goto rw_error;
6157 }
6158 rc = drxj_dap_write_reg16(dev_addr, VSB_TOP_CYGN2TRK__A, 3, 0);
6159 if (rc != 0) {
6160 pr_err("error %d\n", rc);
6161 goto rw_error;
6162 }
6163
6164
6165 cmd_scu.command = SCU_RAM_COMMAND_STANDARD_VSB
6166 | SCU_RAM_COMMAND_CMD_DEMOD_START;
6167 cmd_scu.parameter_len = 0;
6168 cmd_scu.result_len = 1;
6169 cmd_scu.parameter = NULL;
6170 cmd_scu.result = &cmd_result;
6171 rc = scu_command(dev_addr, &cmd_scu);
6172 if (rc != 0) {
6173 pr_err("error %d\n", rc);
6174 goto rw_error;
6175 }
6176
6177 rc = drxj_dap_write_reg16(dev_addr, IQM_COMM_EXEC__A, IQM_COMM_EXEC_ACTIVE, 0);
6178 if (rc != 0) {
6179 pr_err("error %d\n", rc);
6180 goto rw_error;
6181 }
6182 rc = drxj_dap_write_reg16(dev_addr, VSB_COMM_EXEC__A, VSB_COMM_EXEC_ACTIVE, 0);
6183 if (rc != 0) {
6184 pr_err("error %d\n", rc);
6185 goto rw_error;
6186 }
6187 rc = drxj_dap_write_reg16(dev_addr, FEC_COMM_EXEC__A, FEC_COMM_EXEC_ACTIVE, 0);
6188 if (rc != 0) {
6189 pr_err("error %d\n", rc);
6190 goto rw_error;
6191 }
6192
6193 return 0;
6194rw_error:
6195 return rc;
6196}
6197
6198
6199
6200
6201
6202
6203static int get_vsb_post_rs_pck_err(struct i2c_device_addr *dev_addr,
6204 u32 *pck_errs, u32 *pck_count)
6205{
6206 int rc;
6207 u16 data = 0;
6208 u16 period = 0;
6209 u16 prescale = 0;
6210 u16 packet_errors_mant = 0;
6211 u16 packet_errors_exp = 0;
6212
6213 rc = drxj_dap_read_reg16(dev_addr, FEC_RS_NR_FAILURES__A, &data, 0);
6214 if (rc != 0) {
6215 pr_err("error %d\n", rc);
6216 goto rw_error;
6217 }
6218 packet_errors_mant = data & FEC_RS_NR_FAILURES_FIXED_MANT__M;
6219 packet_errors_exp = (data & FEC_RS_NR_FAILURES_EXP__M)
6220 >> FEC_RS_NR_FAILURES_EXP__B;
6221 period = FEC_RS_MEASUREMENT_PERIOD;
6222 prescale = FEC_RS_MEASUREMENT_PRESCALE;
6223
6224
6225 if (period * prescale == 0) {
6226 pr_err("error: period and/or prescale is zero!\n");
6227 return -EIO;
6228 }
6229 *pck_errs = packet_errors_mant * (1 << packet_errors_exp);
6230 *pck_count = period * prescale * 77;
6231
6232 return 0;
6233rw_error:
6234 return rc;
6235}
6236
6237
6238
6239
6240
6241
6242static int get_vs_bpost_viterbi_ber(struct i2c_device_addr *dev_addr,
6243 u32 *ber, u32 *cnt)
6244{
6245 int rc;
6246 u16 data = 0;
6247 u16 period = 0;
6248 u16 prescale = 0;
6249 u16 bit_errors_mant = 0;
6250 u16 bit_errors_exp = 0;
6251
6252 rc = drxj_dap_read_reg16(dev_addr, FEC_RS_NR_BIT_ERRORS__A, &data, 0);
6253 if (rc != 0) {
6254 pr_err("error %d\n", rc);
6255 goto rw_error;
6256 }
6257 period = FEC_RS_MEASUREMENT_PERIOD;
6258 prescale = FEC_RS_MEASUREMENT_PRESCALE;
6259
6260 bit_errors_mant = data & FEC_RS_NR_BIT_ERRORS_FIXED_MANT__M;
6261 bit_errors_exp = (data & FEC_RS_NR_BIT_ERRORS_EXP__M)
6262 >> FEC_RS_NR_BIT_ERRORS_EXP__B;
6263
6264 *cnt = period * prescale * 207 * ((bit_errors_exp > 2) ? 1 : 8);
6265
6266 if (((bit_errors_mant << bit_errors_exp) >> 3) > 68700)
6267 *ber = (*cnt) * 26570;
6268 else {
6269 if (period * prescale == 0) {
6270 pr_err("error: period and/or prescale is zero!\n");
6271 return -EIO;
6272 }
6273 *ber = bit_errors_mant << ((bit_errors_exp > 2) ?
6274 (bit_errors_exp - 3) : bit_errors_exp);
6275 }
6276
6277 return 0;
6278rw_error:
6279 return rc;
6280}
6281
6282
6283
6284
6285
6286
6287static int get_vs_bpre_viterbi_ber(struct i2c_device_addr *dev_addr,
6288 u32 *ber, u32 *cnt)
6289{
6290 u16 data = 0;
6291 int rc;
6292
6293 rc = drxj_dap_read_reg16(dev_addr, VSB_TOP_NR_SYM_ERRS__A, &data, 0);
6294 if (rc != 0) {
6295 pr_err("error %d\n", rc);
6296 return -EIO;
6297 }
6298 *ber = data;
6299 *cnt = VSB_TOP_MEASUREMENT_PERIOD * SYMBOLS_PER_SEGMENT;
6300
6301 return 0;
6302}
6303
6304
6305
6306
6307
6308
6309static int get_vsbmer(struct i2c_device_addr *dev_addr, u16 *mer)
6310{
6311 int rc;
6312 u16 data_hi = 0;
6313
6314 rc = drxj_dap_read_reg16(dev_addr, VSB_TOP_ERR_ENERGY_H__A, &data_hi, 0);
6315 if (rc != 0) {
6316 pr_err("error %d\n", rc);
6317 goto rw_error;
6318 }
6319 *mer =
6320 (u16) (log1_times100(21504) - log1_times100((data_hi << 6) / 52));
6321
6322 return 0;
6323rw_error:
6324 return rc;
6325}
6326
6327
6328
6329
6330
6331
6332
6333
6334
6335
6336
6337
6338
6339
6340
6341
6342
6343
6344
6345static int power_down_qam(struct drx_demod_instance *demod, bool primary)
6346{
6347 struct drxjscu_cmd cmd_scu = { 0,
6348 0,
6349 0,
6350 NULL,
6351 NULL
6352 };
6353 int rc;
6354 struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
6355 struct drx_cfg_mpeg_output cfg_mpeg_output;
6356 struct drx_common_attr *common_attr = demod->my_common_attr;
6357 u16 cmd_result = 0;
6358
6359
6360
6361
6362
6363
6364 rc = drxj_dap_write_reg16(dev_addr, FEC_COMM_EXEC__A, FEC_COMM_EXEC_STOP, 0);
6365 if (rc != 0) {
6366 pr_err("error %d\n", rc);
6367 goto rw_error;
6368 }
6369 rc = drxj_dap_write_reg16(dev_addr, QAM_COMM_EXEC__A, QAM_COMM_EXEC_STOP, 0);
6370 if (rc != 0) {
6371 pr_err("error %d\n", rc);
6372 goto rw_error;
6373 }
6374
6375 cmd_scu.command = SCU_RAM_COMMAND_STANDARD_QAM |
6376 SCU_RAM_COMMAND_CMD_DEMOD_STOP;
6377 cmd_scu.parameter_len = 0;
6378 cmd_scu.result_len = 1;
6379 cmd_scu.parameter = NULL;
6380 cmd_scu.result = &cmd_result;
6381 rc = scu_command(dev_addr, &cmd_scu);
6382 if (rc != 0) {
6383 pr_err("error %d\n", rc);
6384 goto rw_error;
6385 }
6386
6387 if (primary) {
6388 rc = drxj_dap_write_reg16(dev_addr, IQM_COMM_EXEC__A, IQM_COMM_EXEC_STOP, 0);
6389 if (rc != 0) {
6390 pr_err("error %d\n", rc);
6391 goto rw_error;
6392 }
6393 rc = set_iqm_af(demod, false);
6394 if (rc != 0) {
6395 pr_err("error %d\n", rc);
6396 goto rw_error;
6397 }
6398 } else {
6399 rc = drxj_dap_write_reg16(dev_addr, IQM_FS_COMM_EXEC__A, IQM_FS_COMM_EXEC_STOP, 0);
6400 if (rc != 0) {
6401 pr_err("error %d\n", rc);
6402 goto rw_error;
6403 }
6404 rc = drxj_dap_write_reg16(dev_addr, IQM_FD_COMM_EXEC__A, IQM_FD_COMM_EXEC_STOP, 0);
6405 if (rc != 0) {
6406 pr_err("error %d\n", rc);
6407 goto rw_error;
6408 }
6409 rc = drxj_dap_write_reg16(dev_addr, IQM_RC_COMM_EXEC__A, IQM_RC_COMM_EXEC_STOP, 0);
6410 if (rc != 0) {
6411 pr_err("error %d\n", rc);
6412 goto rw_error;
6413 }
6414 rc = drxj_dap_write_reg16(dev_addr, IQM_RT_COMM_EXEC__A, IQM_RT_COMM_EXEC_STOP, 0);
6415 if (rc != 0) {
6416 pr_err("error %d\n", rc);
6417 goto rw_error;
6418 }
6419 rc = drxj_dap_write_reg16(dev_addr, IQM_CF_COMM_EXEC__A, IQM_CF_COMM_EXEC_STOP, 0);
6420 if (rc != 0) {
6421 pr_err("error %d\n", rc);
6422 goto rw_error;
6423 }
6424 }
6425
6426 memcpy(&cfg_mpeg_output, &common_attr->mpeg_cfg, sizeof(cfg_mpeg_output));
6427 cfg_mpeg_output.enable_mpeg_output = false;
6428
6429 rc = ctrl_set_cfg_mpeg_output(demod, &cfg_mpeg_output);
6430 if (rc != 0) {
6431 pr_err("error %d\n", rc);
6432 goto rw_error;
6433 }
6434
6435 return 0;
6436rw_error:
6437 return rc;
6438}
6439
6440
6441
6442
6443
6444
6445
6446
6447
6448
6449
6450
6451
6452
6453
6454
6455
6456
6457
6458#ifndef DRXJ_VSB_ONLY
6459static int
6460set_qam_measurement(struct drx_demod_instance *demod,
6461 enum drx_modulation constellation, u32 symbol_rate)
6462{
6463 struct i2c_device_addr *dev_addr = NULL;
6464 struct drxj_data *ext_attr = NULL;
6465 int rc;
6466 u32 fec_bits_desired = 0;
6467 u16 fec_rs_plen = 0;
6468 u16 fec_rs_prescale = 0;
6469 u32 fec_rs_period = 0;
6470 u32 fec_rs_bit_cnt = 0;
6471 u32 fec_oc_snc_fail_period = 0;
6472 u32 qam_vd_period = 0;
6473 u32 qam_vd_bit_cnt = 0;
6474 u16 fec_vd_plen = 0;
6475 u16 qam_vd_prescale = 0;
6476
6477 dev_addr = demod->my_i2c_dev_addr;
6478 ext_attr = (struct drxj_data *) demod->my_ext_attr;
6479
6480 fec_bits_desired = ext_attr->fec_bits_desired;
6481 fec_rs_prescale = ext_attr->fec_rs_prescale;
6482
6483 switch (constellation) {
6484 case DRX_CONSTELLATION_QAM16:
6485 fec_bits_desired = 4 * symbol_rate;
6486 break;
6487 case DRX_CONSTELLATION_QAM32:
6488 fec_bits_desired = 5 * symbol_rate;
6489 break;
6490 case DRX_CONSTELLATION_QAM64:
6491 fec_bits_desired = 6 * symbol_rate;
6492 break;
6493 case DRX_CONSTELLATION_QAM128:
6494 fec_bits_desired = 7 * symbol_rate;
6495 break;
6496 case DRX_CONSTELLATION_QAM256:
6497 fec_bits_desired = 8 * symbol_rate;
6498 break;
6499 default:
6500 return -EINVAL;
6501 }
6502
6503
6504
6505
6506
6507
6508
6509
6510 switch (ext_attr->standard) {
6511 case DRX_STANDARD_ITU_A:
6512 case DRX_STANDARD_ITU_C:
6513 fec_rs_plen = 204 * 8;
6514 break;
6515 case DRX_STANDARD_ITU_B:
6516 fec_rs_plen = 128 * 7;
6517 break;
6518 default:
6519 return -EINVAL;
6520 }
6521
6522 ext_attr->fec_rs_plen = fec_rs_plen;
6523 fec_rs_bit_cnt = fec_rs_prescale * fec_rs_plen;
6524 if (fec_rs_bit_cnt == 0) {
6525 pr_err("error: fec_rs_bit_cnt is zero!\n");
6526 return -EIO;
6527 }
6528 fec_rs_period = fec_bits_desired / fec_rs_bit_cnt + 1;
6529 if (ext_attr->standard != DRX_STANDARD_ITU_B)
6530 fec_oc_snc_fail_period = fec_rs_period;
6531
6532
6533 if (fec_rs_period > 0xFFFF)
6534 fec_rs_period = 0xFFFF;
6535
6536
6537 switch (ext_attr->standard) {
6538 case DRX_STANDARD_ITU_A:
6539 case DRX_STANDARD_ITU_C:
6540 break;
6541 case DRX_STANDARD_ITU_B:
6542 switch (constellation) {
6543 case DRX_CONSTELLATION_QAM64:
6544 fec_rs_period = 31581;
6545 fec_oc_snc_fail_period = 17932;
6546 break;
6547 case DRX_CONSTELLATION_QAM256:
6548 fec_rs_period = 45446;
6549 fec_oc_snc_fail_period = 25805;
6550 break;
6551 default:
6552 return -EINVAL;
6553 }
6554 break;
6555 default:
6556 return -EINVAL;
6557 }
6558
6559 rc = drxj_dap_write_reg16(dev_addr, FEC_OC_SNC_FAIL_PERIOD__A, (u16)fec_oc_snc_fail_period, 0);
6560 if (rc != 0) {
6561 pr_err("error %d\n", rc);
6562 goto rw_error;
6563 }
6564 rc = drxj_dap_write_reg16(dev_addr, FEC_RS_MEASUREMENT_PERIOD__A, (u16)fec_rs_period, 0);
6565 if (rc != 0) {
6566 pr_err("error %d\n", rc);
6567 goto rw_error;
6568 }
6569 rc = drxj_dap_write_reg16(dev_addr, FEC_RS_MEASUREMENT_PRESCALE__A, fec_rs_prescale, 0);
6570 if (rc != 0) {
6571 pr_err("error %d\n", rc);
6572 goto rw_error;
6573 }
6574 ext_attr->fec_rs_period = (u16) fec_rs_period;
6575 ext_attr->fec_rs_prescale = fec_rs_prescale;
6576 rc = drxdap_fasi_write_reg32(dev_addr, SCU_RAM_FEC_ACCUM_CW_CORRECTED_LO__A, 0, 0);
6577 if (rc != 0) {
6578 pr_err("error %d\n", rc);
6579 goto rw_error;
6580 }
6581 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_FEC_MEAS_COUNT__A, 0, 0);
6582 if (rc != 0) {
6583 pr_err("error %d\n", rc);
6584 goto rw_error;
6585 }
6586 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_FEC_ACCUM_PKT_FAILURES__A, 0, 0);
6587 if (rc != 0) {
6588 pr_err("error %d\n", rc);
6589 goto rw_error;
6590 }
6591
6592 if (ext_attr->standard == DRX_STANDARD_ITU_B) {
6593
6594
6595
6596
6597
6598
6599
6600
6601 fec_vd_plen = ext_attr->fec_vd_plen;
6602 qam_vd_prescale = ext_attr->qam_vd_prescale;
6603 qam_vd_bit_cnt = qam_vd_prescale * fec_vd_plen;
6604
6605 switch (constellation) {
6606 case DRX_CONSTELLATION_QAM64:
6607
6608 qam_vd_period =
6609 qam_vd_bit_cnt * (QAM_TOP_CONSTELLATION_QAM64 + 1)
6610 * (QAM_TOP_CONSTELLATION_QAM64 + 1);
6611 break;
6612 case DRX_CONSTELLATION_QAM256:
6613
6614 qam_vd_period =
6615 qam_vd_bit_cnt * (QAM_TOP_CONSTELLATION_QAM256 + 1)
6616 * (QAM_TOP_CONSTELLATION_QAM256 + 1);
6617 break;
6618 default:
6619 return -EINVAL;
6620 }
6621 if (qam_vd_period == 0) {
6622 pr_err("error: qam_vd_period is zero!\n");
6623 return -EIO;
6624 }
6625 qam_vd_period = fec_bits_desired / qam_vd_period;
6626
6627 if (qam_vd_period > 0xFFFF)
6628 qam_vd_period = 0xFFFF;
6629
6630
6631 qam_vd_bit_cnt *= qam_vd_period;
6632
6633 rc = drxj_dap_write_reg16(dev_addr, QAM_VD_MEASUREMENT_PERIOD__A, (u16)qam_vd_period, 0);
6634 if (rc != 0) {
6635 pr_err("error %d\n", rc);
6636 goto rw_error;
6637 }
6638 rc = drxj_dap_write_reg16(dev_addr, QAM_VD_MEASUREMENT_PRESCALE__A, qam_vd_prescale, 0);
6639 if (rc != 0) {
6640 pr_err("error %d\n", rc);
6641 goto rw_error;
6642 }
6643 ext_attr->qam_vd_period = (u16) qam_vd_period;
6644 ext_attr->qam_vd_prescale = qam_vd_prescale;
6645 }
6646
6647 return 0;
6648rw_error:
6649 return rc;
6650}
6651
6652
6653
6654
6655
6656
6657
6658
6659
6660static int set_qam16(struct drx_demod_instance *demod)
6661{
6662 struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
6663 int rc;
6664 const u8 qam_dq_qual_fun[] = {
6665 DRXJ_16TO8(2),
6666 DRXJ_16TO8(2),
6667 DRXJ_16TO8(2),
6668 DRXJ_16TO8(2),
6669 DRXJ_16TO8(3),
6670 DRXJ_16TO8(3),
6671 };
6672 const u8 qam_eq_cma_rad[] = {
6673 DRXJ_16TO8(13517),
6674 DRXJ_16TO8(13517),
6675 DRXJ_16TO8(13517),
6676 DRXJ_16TO8(13517),
6677 DRXJ_16TO8(13517),
6678 DRXJ_16TO8(13517),
6679 };
6680
6681 rc = drxdap_fasi_write_block(dev_addr, QAM_DQ_QUAL_FUN0__A, sizeof(qam_dq_qual_fun), ((u8 *)qam_dq_qual_fun), 0);
6682 if (rc != 0) {
6683 pr_err("error %d\n", rc);
6684 goto rw_error;
6685 }
6686 rc = drxdap_fasi_write_block(dev_addr, SCU_RAM_QAM_EQ_CMA_RAD0__A, sizeof(qam_eq_cma_rad), ((u8 *)qam_eq_cma_rad), 0);
6687 if (rc != 0) {
6688 pr_err("error %d\n", rc);
6689 goto rw_error;
6690 }
6691
6692 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RTH__A, 140, 0);
6693 if (rc != 0) {
6694 pr_err("error %d\n", rc);
6695 goto rw_error;
6696 }
6697 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_FTH__A, 50, 0);
6698 if (rc != 0) {
6699 pr_err("error %d\n", rc);
6700 goto rw_error;
6701 }
6702 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_PTH__A, 120, 0);
6703 if (rc != 0) {
6704 pr_err("error %d\n", rc);
6705 goto rw_error;
6706 }
6707 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_QTH__A, 230, 0);
6708 if (rc != 0) {
6709 pr_err("error %d\n", rc);
6710 goto rw_error;
6711 }
6712 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_CTH__A, 95, 0);
6713 if (rc != 0) {
6714 pr_err("error %d\n", rc);
6715 goto rw_error;
6716 }
6717 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_MTH__A, 105, 0);
6718 if (rc != 0) {
6719 pr_err("error %d\n", rc);
6720 goto rw_error;
6721 }
6722
6723 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RATE_LIM__A, 40, 0);
6724 if (rc != 0) {
6725 pr_err("error %d\n", rc);
6726 goto rw_error;
6727 }
6728 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_FREQ_LIM__A, 56, 0);
6729 if (rc != 0) {
6730 pr_err("error %d\n", rc);
6731 goto rw_error;
6732 }
6733 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_COUNT_LIM__A, 3, 0);
6734 if (rc != 0) {
6735 pr_err("error %d\n", rc);
6736 goto rw_error;
6737 }
6738
6739 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, 16, 0);
6740 if (rc != 0) {
6741 pr_err("error %d\n", rc);
6742 goto rw_error;
6743 }
6744 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, 220, 0);
6745 if (rc != 0) {
6746 pr_err("error %d\n", rc);
6747 goto rw_error;
6748 }
6749 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, 25, 0);
6750 if (rc != 0) {
6751 pr_err("error %d\n", rc);
6752 goto rw_error;
6753 }
6754 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, 6, 0);
6755 if (rc != 0) {
6756 pr_err("error %d\n", rc);
6757 goto rw_error;
6758 }
6759 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16)(-24), 0);
6760 if (rc != 0) {
6761 pr_err("error %d\n", rc);
6762 goto rw_error;
6763 }
6764 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16)(-65), 0);
6765 if (rc != 0) {
6766 pr_err("error %d\n", rc);
6767 goto rw_error;
6768 }
6769 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16)(-127), 0);
6770 if (rc != 0) {
6771 pr_err("error %d\n", rc);
6772 goto rw_error;
6773 }
6774
6775 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CA_FINE__A, 15, 0);
6776 if (rc != 0) {
6777 pr_err("error %d\n", rc);
6778 goto rw_error;
6779 }
6780 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CA_COARSE__A, 40, 0);
6781 if (rc != 0) {
6782 pr_err("error %d\n", rc);
6783 goto rw_error;
6784 }
6785 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_FINE__A, 2, 0);
6786 if (rc != 0) {
6787 pr_err("error %d\n", rc);
6788 goto rw_error;
6789 }
6790 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_MEDIUM__A, 20, 0);
6791 if (rc != 0) {
6792 pr_err("error %d\n", rc);
6793 goto rw_error;
6794 }
6795 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_COARSE__A, 255, 0);
6796 if (rc != 0) {
6797 pr_err("error %d\n", rc);
6798 goto rw_error;
6799 }
6800 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_FINE__A, 2, 0);
6801 if (rc != 0) {
6802 pr_err("error %d\n", rc);
6803 goto rw_error;
6804 }
6805 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_MEDIUM__A, 10, 0);
6806 if (rc != 0) {
6807 pr_err("error %d\n", rc);
6808 goto rw_error;
6809 }
6810 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_COARSE__A, 50, 0);
6811 if (rc != 0) {
6812 pr_err("error %d\n", rc);
6813 goto rw_error;
6814 }
6815 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_FINE__A, 12, 0);
6816 if (rc != 0) {
6817 pr_err("error %d\n", rc);
6818 goto rw_error;
6819 }
6820 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24, 0);
6821 if (rc != 0) {
6822 pr_err("error %d\n", rc);
6823 goto rw_error;
6824 }
6825 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_COARSE__A, 24, 0);
6826 if (rc != 0) {
6827 pr_err("error %d\n", rc);
6828 goto rw_error;
6829 }
6830 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_FINE__A, 12, 0);
6831 if (rc != 0) {
6832 pr_err("error %d\n", rc);
6833 goto rw_error;
6834 }
6835 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16, 0);
6836 if (rc != 0) {
6837 pr_err("error %d\n", rc);
6838 goto rw_error;
6839 }
6840 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_COARSE__A, 16, 0);
6841 if (rc != 0) {
6842 pr_err("error %d\n", rc);
6843 goto rw_error;
6844 }
6845 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_FINE__A, 16, 0);
6846 if (rc != 0) {
6847 pr_err("error %d\n", rc);
6848 goto rw_error;
6849 }
6850 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_MEDIUM__A, 32, 0);
6851 if (rc != 0) {
6852 pr_err("error %d\n", rc);
6853 goto rw_error;
6854 }
6855 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_COARSE__A, 240, 0);
6856 if (rc != 0) {
6857 pr_err("error %d\n", rc);
6858 goto rw_error;
6859 }
6860 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_FINE__A, 5, 0);
6861 if (rc != 0) {
6862 pr_err("error %d\n", rc);
6863 goto rw_error;
6864 }
6865 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 15, 0);
6866 if (rc != 0) {
6867 pr_err("error %d\n", rc);
6868 goto rw_error;
6869 }
6870 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_COARSE__A, 32, 0);
6871 if (rc != 0) {
6872 pr_err("error %d\n", rc);
6873 goto rw_error;
6874 }
6875
6876 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_SL_SIG_POWER__A, 40960, 0);
6877 if (rc != 0) {
6878 pr_err("error %d\n", rc);
6879 goto rw_error;
6880 }
6881
6882 return 0;
6883rw_error:
6884 return rc;
6885}
6886
6887
6888
6889
6890
6891
6892
6893
6894
6895static int set_qam32(struct drx_demod_instance *demod)
6896{
6897 struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
6898 int rc;
6899 const u8 qam_dq_qual_fun[] = {
6900 DRXJ_16TO8(3),
6901 DRXJ_16TO8(3),
6902 DRXJ_16TO8(3),
6903 DRXJ_16TO8(3),
6904 DRXJ_16TO8(4),
6905 DRXJ_16TO8(4),
6906 };
6907 const u8 qam_eq_cma_rad[] = {
6908 DRXJ_16TO8(6707),
6909 DRXJ_16TO8(6707),
6910 DRXJ_16TO8(6707),
6911 DRXJ_16TO8(6707),
6912 DRXJ_16TO8(6707),
6913 DRXJ_16TO8(6707),
6914 };
6915
6916 rc = drxdap_fasi_write_block(dev_addr, QAM_DQ_QUAL_FUN0__A, sizeof(qam_dq_qual_fun), ((u8 *)qam_dq_qual_fun), 0);
6917 if (rc != 0) {
6918 pr_err("error %d\n", rc);
6919 goto rw_error;
6920 }
6921 rc = drxdap_fasi_write_block(dev_addr, SCU_RAM_QAM_EQ_CMA_RAD0__A, sizeof(qam_eq_cma_rad), ((u8 *)qam_eq_cma_rad), 0);
6922 if (rc != 0) {
6923 pr_err("error %d\n", rc);
6924 goto rw_error;
6925 }
6926
6927 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RTH__A, 90, 0);
6928 if (rc != 0) {
6929 pr_err("error %d\n", rc);
6930 goto rw_error;
6931 }
6932 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_FTH__A, 50, 0);
6933 if (rc != 0) {
6934 pr_err("error %d\n", rc);
6935 goto rw_error;
6936 }
6937 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_PTH__A, 100, 0);
6938 if (rc != 0) {
6939 pr_err("error %d\n", rc);
6940 goto rw_error;
6941 }
6942 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_QTH__A, 170, 0);
6943 if (rc != 0) {
6944 pr_err("error %d\n", rc);
6945 goto rw_error;
6946 }
6947 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_CTH__A, 80, 0);
6948 if (rc != 0) {
6949 pr_err("error %d\n", rc);
6950 goto rw_error;
6951 }
6952 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_MTH__A, 100, 0);
6953 if (rc != 0) {
6954 pr_err("error %d\n", rc);
6955 goto rw_error;
6956 }
6957
6958 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RATE_LIM__A, 40, 0);
6959 if (rc != 0) {
6960 pr_err("error %d\n", rc);
6961 goto rw_error;
6962 }
6963 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_FREQ_LIM__A, 56, 0);
6964 if (rc != 0) {
6965 pr_err("error %d\n", rc);
6966 goto rw_error;
6967 }
6968 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_COUNT_LIM__A, 3, 0);
6969 if (rc != 0) {
6970 pr_err("error %d\n", rc);
6971 goto rw_error;
6972 }
6973
6974 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, 12, 0);
6975 if (rc != 0) {
6976 pr_err("error %d\n", rc);
6977 goto rw_error;
6978 }
6979 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, 140, 0);
6980 if (rc != 0) {
6981 pr_err("error %d\n", rc);
6982 goto rw_error;
6983 }
6984 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, (u16)(-8), 0);
6985 if (rc != 0) {
6986 pr_err("error %d\n", rc);
6987 goto rw_error;
6988 }
6989 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, (u16)(-16), 0);
6990 if (rc != 0) {
6991 pr_err("error %d\n", rc);
6992 goto rw_error;
6993 }
6994 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16)(-26), 0);
6995 if (rc != 0) {
6996 pr_err("error %d\n", rc);
6997 goto rw_error;
6998 }
6999 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16)(-56), 0);
7000 if (rc != 0) {
7001 pr_err("error %d\n", rc);
7002 goto rw_error;
7003 }
7004 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16)(-86), 0);
7005 if (rc != 0) {
7006 pr_err("error %d\n", rc);
7007 goto rw_error;
7008 }
7009
7010 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CA_FINE__A, 15, 0);
7011 if (rc != 0) {
7012 pr_err("error %d\n", rc);
7013 goto rw_error;
7014 }
7015 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CA_COARSE__A, 40, 0);
7016 if (rc != 0) {
7017 pr_err("error %d\n", rc);
7018 goto rw_error;
7019 }
7020 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_FINE__A, 2, 0);
7021 if (rc != 0) {
7022 pr_err("error %d\n", rc);
7023 goto rw_error;
7024 }
7025 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_MEDIUM__A, 20, 0);
7026 if (rc != 0) {
7027 pr_err("error %d\n", rc);
7028 goto rw_error;
7029 }
7030 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_COARSE__A, 255, 0);
7031 if (rc != 0) {
7032 pr_err("error %d\n", rc);
7033 goto rw_error;
7034 }
7035 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_FINE__A, 2, 0);
7036 if (rc != 0) {
7037 pr_err("error %d\n", rc);
7038 goto rw_error;
7039 }
7040 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_MEDIUM__A, 10, 0);
7041 if (rc != 0) {
7042 pr_err("error %d\n", rc);
7043 goto rw_error;
7044 }
7045 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_COARSE__A, 50, 0);
7046 if (rc != 0) {
7047 pr_err("error %d\n", rc);
7048 goto rw_error;
7049 }
7050 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_FINE__A, 12, 0);
7051 if (rc != 0) {
7052 pr_err("error %d\n", rc);
7053 goto rw_error;
7054 }
7055 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24, 0);
7056 if (rc != 0) {
7057 pr_err("error %d\n", rc);
7058 goto rw_error;
7059 }
7060 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_COARSE__A, 24, 0);
7061 if (rc != 0) {
7062 pr_err("error %d\n", rc);
7063 goto rw_error;
7064 }
7065 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_FINE__A, 12, 0);
7066 if (rc != 0) {
7067 pr_err("error %d\n", rc);
7068 goto rw_error;
7069 }
7070 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16, 0);
7071 if (rc != 0) {
7072 pr_err("error %d\n", rc);
7073 goto rw_error;
7074 }
7075 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_COARSE__A, 16, 0);
7076 if (rc != 0) {
7077 pr_err("error %d\n", rc);
7078 goto rw_error;
7079 }
7080 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_FINE__A, 16, 0);
7081 if (rc != 0) {
7082 pr_err("error %d\n", rc);
7083 goto rw_error;
7084 }
7085 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_MEDIUM__A, 32, 0);
7086 if (rc != 0) {
7087 pr_err("error %d\n", rc);
7088 goto rw_error;
7089 }
7090 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_COARSE__A, 176, 0);
7091 if (rc != 0) {
7092 pr_err("error %d\n", rc);
7093 goto rw_error;
7094 }
7095 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_FINE__A, 5, 0);
7096 if (rc != 0) {
7097 pr_err("error %d\n", rc);
7098 goto rw_error;
7099 }
7100 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 15, 0);
7101 if (rc != 0) {
7102 pr_err("error %d\n", rc);
7103 goto rw_error;
7104 }
7105 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_COARSE__A, 8, 0);
7106 if (rc != 0) {
7107 pr_err("error %d\n", rc);
7108 goto rw_error;
7109 }
7110
7111 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_SL_SIG_POWER__A, 20480, 0);
7112 if (rc != 0) {
7113 pr_err("error %d\n", rc);
7114 goto rw_error;
7115 }
7116
7117 return 0;
7118rw_error:
7119 return rc;
7120}
7121
7122
7123
7124
7125
7126
7127
7128
7129
7130static int set_qam64(struct drx_demod_instance *demod)
7131{
7132 struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
7133 int rc;
7134 const u8 qam_dq_qual_fun[] = {
7135 DRXJ_16TO8(4),
7136 DRXJ_16TO8(4),
7137 DRXJ_16TO8(4),
7138 DRXJ_16TO8(4),
7139 DRXJ_16TO8(6),
7140 DRXJ_16TO8(6),
7141 };
7142 const u8 qam_eq_cma_rad[] = {
7143 DRXJ_16TO8(13336),
7144 DRXJ_16TO8(12618),
7145 DRXJ_16TO8(11988),
7146 DRXJ_16TO8(13809),
7147 DRXJ_16TO8(13809),
7148 DRXJ_16TO8(15609),
7149 };
7150
7151 rc = drxdap_fasi_write_block(dev_addr, QAM_DQ_QUAL_FUN0__A, sizeof(qam_dq_qual_fun), ((u8 *)qam_dq_qual_fun), 0);
7152 if (rc != 0) {
7153 pr_err("error %d\n", rc);
7154 goto rw_error;
7155 }
7156 rc = drxdap_fasi_write_block(dev_addr, SCU_RAM_QAM_EQ_CMA_RAD0__A, sizeof(qam_eq_cma_rad), ((u8 *)qam_eq_cma_rad), 0);
7157 if (rc != 0) {
7158 pr_err("error %d\n", rc);
7159 goto rw_error;
7160 }
7161
7162 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RTH__A, 105, 0);
7163 if (rc != 0) {
7164 pr_err("error %d\n", rc);
7165 goto rw_error;
7166 }
7167 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_FTH__A, 60, 0);
7168 if (rc != 0) {
7169 pr_err("error %d\n", rc);
7170 goto rw_error;
7171 }
7172 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_PTH__A, 100, 0);
7173 if (rc != 0) {
7174 pr_err("error %d\n", rc);
7175 goto rw_error;
7176 }
7177 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_QTH__A, 195, 0);
7178 if (rc != 0) {
7179 pr_err("error %d\n", rc);
7180 goto rw_error;
7181 }
7182 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_CTH__A, 80, 0);
7183 if (rc != 0) {
7184 pr_err("error %d\n", rc);
7185 goto rw_error;
7186 }
7187 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_MTH__A, 84, 0);
7188 if (rc != 0) {
7189 pr_err("error %d\n", rc);
7190 goto rw_error;
7191 }
7192
7193 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RATE_LIM__A, 40, 0);
7194 if (rc != 0) {
7195 pr_err("error %d\n", rc);
7196 goto rw_error;
7197 }
7198 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_FREQ_LIM__A, 32, 0);
7199 if (rc != 0) {
7200 pr_err("error %d\n", rc);
7201 goto rw_error;
7202 }
7203 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_COUNT_LIM__A, 3, 0);
7204 if (rc != 0) {
7205 pr_err("error %d\n", rc);
7206 goto rw_error;
7207 }
7208
7209 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, 12, 0);
7210 if (rc != 0) {
7211 pr_err("error %d\n", rc);
7212 goto rw_error;
7213 }
7214 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, 141, 0);
7215 if (rc != 0) {
7216 pr_err("error %d\n", rc);
7217 goto rw_error;
7218 }
7219 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, 7, 0);
7220 if (rc != 0) {
7221 pr_err("error %d\n", rc);
7222 goto rw_error;
7223 }
7224 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, 0, 0);
7225 if (rc != 0) {
7226 pr_err("error %d\n", rc);
7227 goto rw_error;
7228 }
7229 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16)(-15), 0);
7230 if (rc != 0) {
7231 pr_err("error %d\n", rc);
7232 goto rw_error;
7233 }
7234 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, (u16)(-45), 0);
7235 if (rc != 0) {
7236 pr_err("error %d\n", rc);
7237 goto rw_error;
7238 }
7239 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16)(-80), 0);
7240 if (rc != 0) {
7241 pr_err("error %d\n", rc);
7242 goto rw_error;
7243 }
7244
7245 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CA_FINE__A, 15, 0);
7246 if (rc != 0) {
7247 pr_err("error %d\n", rc);
7248 goto rw_error;
7249 }
7250 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CA_COARSE__A, 40, 0);
7251 if (rc != 0) {
7252 pr_err("error %d\n", rc);
7253 goto rw_error;
7254 }
7255 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_FINE__A, 2, 0);
7256 if (rc != 0) {
7257 pr_err("error %d\n", rc);
7258 goto rw_error;
7259 }
7260 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_MEDIUM__A, 30, 0);
7261 if (rc != 0) {
7262 pr_err("error %d\n", rc);
7263 goto rw_error;
7264 }
7265 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_COARSE__A, 255, 0);
7266 if (rc != 0) {
7267 pr_err("error %d\n", rc);
7268 goto rw_error;
7269 }
7270 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_FINE__A, 2, 0);
7271 if (rc != 0) {
7272 pr_err("error %d\n", rc);
7273 goto rw_error;
7274 }
7275 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_MEDIUM__A, 15, 0);
7276 if (rc != 0) {
7277 pr_err("error %d\n", rc);
7278 goto rw_error;
7279 }
7280 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_COARSE__A, 80, 0);
7281 if (rc != 0) {
7282 pr_err("error %d\n", rc);
7283 goto rw_error;
7284 }
7285 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_FINE__A, 12, 0);
7286 if (rc != 0) {
7287 pr_err("error %d\n", rc);
7288 goto rw_error;
7289 }
7290 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24, 0);
7291 if (rc != 0) {
7292 pr_err("error %d\n", rc);
7293 goto rw_error;
7294 }
7295 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_COARSE__A, 24, 0);
7296 if (rc != 0) {
7297 pr_err("error %d\n", rc);
7298 goto rw_error;
7299 }
7300 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_FINE__A, 12, 0);
7301 if (rc != 0) {
7302 pr_err("error %d\n", rc);
7303 goto rw_error;
7304 }
7305 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16, 0);
7306 if (rc != 0) {
7307 pr_err("error %d\n", rc);
7308 goto rw_error;
7309 }
7310 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_COARSE__A, 16, 0);
7311 if (rc != 0) {
7312 pr_err("error %d\n", rc);
7313 goto rw_error;
7314 }
7315 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_FINE__A, 16, 0);
7316 if (rc != 0) {
7317 pr_err("error %d\n", rc);
7318 goto rw_error;
7319 }
7320 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_MEDIUM__A, 48, 0);
7321 if (rc != 0) {
7322 pr_err("error %d\n", rc);
7323 goto rw_error;
7324 }
7325 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_COARSE__A, 160, 0);
7326 if (rc != 0) {
7327 pr_err("error %d\n", rc);
7328 goto rw_error;
7329 }
7330 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_FINE__A, 5, 0);
7331 if (rc != 0) {
7332 pr_err("error %d\n", rc);
7333 goto rw_error;
7334 }
7335 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 15, 0);
7336 if (rc != 0) {
7337 pr_err("error %d\n", rc);
7338 goto rw_error;
7339 }
7340 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_COARSE__A, 32, 0);
7341 if (rc != 0) {
7342 pr_err("error %d\n", rc);
7343 goto rw_error;
7344 }
7345
7346 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_SL_SIG_POWER__A, 43008, 0);
7347 if (rc != 0) {
7348 pr_err("error %d\n", rc);
7349 goto rw_error;
7350 }
7351
7352 return 0;
7353rw_error:
7354 return rc;
7355}
7356
7357
7358
7359
7360
7361
7362
7363
7364
7365static int set_qam128(struct drx_demod_instance *demod)
7366{
7367 struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
7368 int rc;
7369 const u8 qam_dq_qual_fun[] = {
7370 DRXJ_16TO8(6),
7371 DRXJ_16TO8(6),
7372 DRXJ_16TO8(6),
7373 DRXJ_16TO8(6),
7374 DRXJ_16TO8(9),
7375 DRXJ_16TO8(9),
7376 };
7377 const u8 qam_eq_cma_rad[] = {
7378 DRXJ_16TO8(6164),
7379 DRXJ_16TO8(6598),
7380 DRXJ_16TO8(6394),
7381 DRXJ_16TO8(6409),
7382 DRXJ_16TO8(6656),
7383 DRXJ_16TO8(7238),
7384 };
7385
7386 rc = drxdap_fasi_write_block(dev_addr, QAM_DQ_QUAL_FUN0__A, sizeof(qam_dq_qual_fun), ((u8 *)qam_dq_qual_fun), 0);
7387 if (rc != 0) {
7388 pr_err("error %d\n", rc);
7389 goto rw_error;
7390 }
7391 rc = drxdap_fasi_write_block(dev_addr, SCU_RAM_QAM_EQ_CMA_RAD0__A, sizeof(qam_eq_cma_rad), ((u8 *)qam_eq_cma_rad), 0);
7392 if (rc != 0) {
7393 pr_err("error %d\n", rc);
7394 goto rw_error;
7395 }
7396
7397 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RTH__A, 50, 0);
7398 if (rc != 0) {
7399 pr_err("error %d\n", rc);
7400 goto rw_error;
7401 }
7402 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_FTH__A, 60, 0);
7403 if (rc != 0) {
7404 pr_err("error %d\n", rc);
7405 goto rw_error;
7406 }
7407 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_PTH__A, 100, 0);
7408 if (rc != 0) {
7409 pr_err("error %d\n", rc);
7410 goto rw_error;
7411 }
7412 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_QTH__A, 140, 0);
7413 if (rc != 0) {
7414 pr_err("error %d\n", rc);
7415 goto rw_error;
7416 }
7417 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_CTH__A, 80, 0);
7418 if (rc != 0) {
7419 pr_err("error %d\n", rc);
7420 goto rw_error;
7421 }
7422 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_MTH__A, 100, 0);
7423 if (rc != 0) {
7424 pr_err("error %d\n", rc);
7425 goto rw_error;
7426 }
7427
7428 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RATE_LIM__A, 40, 0);
7429 if (rc != 0) {
7430 pr_err("error %d\n", rc);
7431 goto rw_error;
7432 }
7433 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_FREQ_LIM__A, 32, 0);
7434 if (rc != 0) {
7435 pr_err("error %d\n", rc);
7436 goto rw_error;
7437 }
7438 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_COUNT_LIM__A, 3, 0);
7439 if (rc != 0) {
7440 pr_err("error %d\n", rc);
7441 goto rw_error;
7442 }
7443
7444 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, 8, 0);
7445 if (rc != 0) {
7446 pr_err("error %d\n", rc);
7447 goto rw_error;
7448 }
7449 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, 65, 0);
7450 if (rc != 0) {
7451 pr_err("error %d\n", rc);
7452 goto rw_error;
7453 }
7454 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, 5, 0);
7455 if (rc != 0) {
7456 pr_err("error %d\n", rc);
7457 goto rw_error;
7458 }
7459 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, 3, 0);
7460 if (rc != 0) {
7461 pr_err("error %d\n", rc);
7462 goto rw_error;
7463 }
7464 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, (u16)(-1), 0);
7465 if (rc != 0) {
7466 pr_err("error %d\n", rc);
7467 goto rw_error;
7468 }
7469 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, 12, 0);
7470 if (rc != 0) {
7471 pr_err("error %d\n", rc);
7472 goto rw_error;
7473 }
7474 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16)(-23), 0);
7475 if (rc != 0) {
7476 pr_err("error %d\n", rc);
7477 goto rw_error;
7478 }
7479
7480 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CA_FINE__A, 15, 0);
7481 if (rc != 0) {
7482 pr_err("error %d\n", rc);
7483 goto rw_error;
7484 }
7485 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CA_COARSE__A, 40, 0);
7486 if (rc != 0) {
7487 pr_err("error %d\n", rc);
7488 goto rw_error;
7489 }
7490 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_FINE__A, 2, 0);
7491 if (rc != 0) {
7492 pr_err("error %d\n", rc);
7493 goto rw_error;
7494 }
7495 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_MEDIUM__A, 40, 0);
7496 if (rc != 0) {
7497 pr_err("error %d\n", rc);
7498 goto rw_error;
7499 }
7500 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_COARSE__A, 255, 0);
7501 if (rc != 0) {
7502 pr_err("error %d\n", rc);
7503 goto rw_error;
7504 }
7505 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_FINE__A, 2, 0);
7506 if (rc != 0) {
7507 pr_err("error %d\n", rc);
7508 goto rw_error;
7509 }
7510 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_MEDIUM__A, 20, 0);
7511 if (rc != 0) {
7512 pr_err("error %d\n", rc);
7513 goto rw_error;
7514 }
7515 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_COARSE__A, 80, 0);
7516 if (rc != 0) {
7517 pr_err("error %d\n", rc);
7518 goto rw_error;
7519 }
7520 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_FINE__A, 12, 0);
7521 if (rc != 0) {
7522 pr_err("error %d\n", rc);
7523 goto rw_error;
7524 }
7525 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24, 0);
7526 if (rc != 0) {
7527 pr_err("error %d\n", rc);
7528 goto rw_error;
7529 }
7530 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_COARSE__A, 24, 0);
7531 if (rc != 0) {
7532 pr_err("error %d\n", rc);
7533 goto rw_error;
7534 }
7535 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_FINE__A, 12, 0);
7536 if (rc != 0) {
7537 pr_err("error %d\n", rc);
7538 goto rw_error;
7539 }
7540 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16, 0);
7541 if (rc != 0) {
7542 pr_err("error %d\n", rc);
7543 goto rw_error;
7544 }
7545 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_COARSE__A, 16, 0);
7546 if (rc != 0) {
7547 pr_err("error %d\n", rc);
7548 goto rw_error;
7549 }
7550 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_FINE__A, 16, 0);
7551 if (rc != 0) {
7552 pr_err("error %d\n", rc);
7553 goto rw_error;
7554 }
7555 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_MEDIUM__A, 32, 0);
7556 if (rc != 0) {
7557 pr_err("error %d\n", rc);
7558 goto rw_error;
7559 }
7560 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_COARSE__A, 144, 0);
7561 if (rc != 0) {
7562 pr_err("error %d\n", rc);
7563 goto rw_error;
7564 }
7565 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_FINE__A, 5, 0);
7566 if (rc != 0) {
7567 pr_err("error %d\n", rc);
7568 goto rw_error;
7569 }
7570 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 15, 0);
7571 if (rc != 0) {
7572 pr_err("error %d\n", rc);
7573 goto rw_error;
7574 }
7575 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_COARSE__A, 16, 0);
7576 if (rc != 0) {
7577 pr_err("error %d\n", rc);
7578 goto rw_error;
7579 }
7580
7581 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_SL_SIG_POWER__A, 20992, 0);
7582 if (rc != 0) {
7583 pr_err("error %d\n", rc);
7584 goto rw_error;
7585 }
7586
7587 return 0;
7588rw_error:
7589 return rc;
7590}
7591
7592
7593
7594
7595
7596
7597
7598
7599
7600static int set_qam256(struct drx_demod_instance *demod)
7601{
7602 struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
7603 int rc;
7604 const u8 qam_dq_qual_fun[] = {
7605 DRXJ_16TO8(8),
7606 DRXJ_16TO8(8),
7607 DRXJ_16TO8(8),
7608 DRXJ_16TO8(8),
7609 DRXJ_16TO8(12),
7610 DRXJ_16TO8(12),
7611 };
7612 const u8 qam_eq_cma_rad[] = {
7613 DRXJ_16TO8(12345),
7614 DRXJ_16TO8(12345),
7615 DRXJ_16TO8(13626),
7616 DRXJ_16TO8(12931),
7617 DRXJ_16TO8(14719),
7618 DRXJ_16TO8(15356),
7619 };
7620
7621 rc = drxdap_fasi_write_block(dev_addr, QAM_DQ_QUAL_FUN0__A, sizeof(qam_dq_qual_fun), ((u8 *)qam_dq_qual_fun), 0);
7622 if (rc != 0) {
7623 pr_err("error %d\n", rc);
7624 goto rw_error;
7625 }
7626 rc = drxdap_fasi_write_block(dev_addr, SCU_RAM_QAM_EQ_CMA_RAD0__A, sizeof(qam_eq_cma_rad), ((u8 *)qam_eq_cma_rad), 0);
7627 if (rc != 0) {
7628 pr_err("error %d\n", rc);
7629 goto rw_error;
7630 }
7631
7632 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RTH__A, 50, 0);
7633 if (rc != 0) {
7634 pr_err("error %d\n", rc);
7635 goto rw_error;
7636 }
7637 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_FTH__A, 60, 0);
7638 if (rc != 0) {
7639 pr_err("error %d\n", rc);
7640 goto rw_error;
7641 }
7642 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_PTH__A, 100, 0);
7643 if (rc != 0) {
7644 pr_err("error %d\n", rc);
7645 goto rw_error;
7646 }
7647 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_QTH__A, 150, 0);
7648 if (rc != 0) {
7649 pr_err("error %d\n", rc);
7650 goto rw_error;
7651 }
7652 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_CTH__A, 80, 0);
7653 if (rc != 0) {
7654 pr_err("error %d\n", rc);
7655 goto rw_error;
7656 }
7657 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_MTH__A, 110, 0);
7658 if (rc != 0) {
7659 pr_err("error %d\n", rc);
7660 goto rw_error;
7661 }
7662
7663 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RATE_LIM__A, 40, 0);
7664 if (rc != 0) {
7665 pr_err("error %d\n", rc);
7666 goto rw_error;
7667 }
7668 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_FREQ_LIM__A, 16, 0);
7669 if (rc != 0) {
7670 pr_err("error %d\n", rc);
7671 goto rw_error;
7672 }
7673 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_COUNT_LIM__A, 3, 0);
7674 if (rc != 0) {
7675 pr_err("error %d\n", rc);
7676 goto rw_error;
7677 }
7678
7679 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_MEDIAN_AV_MULT__A, 8, 0);
7680 if (rc != 0) {
7681 pr_err("error %d\n", rc);
7682 goto rw_error;
7683 }
7684 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_RADIUS_AV_LIMIT__A, 74, 0);
7685 if (rc != 0) {
7686 pr_err("error %d\n", rc);
7687 goto rw_error;
7688 }
7689 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET1__A, 18, 0);
7690 if (rc != 0) {
7691 pr_err("error %d\n", rc);
7692 goto rw_error;
7693 }
7694 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET2__A, 13, 0);
7695 if (rc != 0) {
7696 pr_err("error %d\n", rc);
7697 goto rw_error;
7698 }
7699 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET3__A, 7, 0);
7700 if (rc != 0) {
7701 pr_err("error %d\n", rc);
7702 goto rw_error;
7703 }
7704 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET4__A, 0, 0);
7705 if (rc != 0) {
7706 pr_err("error %d\n", rc);
7707 goto rw_error;
7708 }
7709 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_LCAVG_OFFSET5__A, (u16)(-8), 0);
7710 if (rc != 0) {
7711 pr_err("error %d\n", rc);
7712 goto rw_error;
7713 }
7714
7715 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CA_FINE__A, 15, 0);
7716 if (rc != 0) {
7717 pr_err("error %d\n", rc);
7718 goto rw_error;
7719 }
7720 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CA_COARSE__A, 40, 0);
7721 if (rc != 0) {
7722 pr_err("error %d\n", rc);
7723 goto rw_error;
7724 }
7725 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_FINE__A, 2, 0);
7726 if (rc != 0) {
7727 pr_err("error %d\n", rc);
7728 goto rw_error;
7729 }
7730 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_MEDIUM__A, 50, 0);
7731 if (rc != 0) {
7732 pr_err("error %d\n", rc);
7733 goto rw_error;
7734 }
7735 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CP_COARSE__A, 255, 0);
7736 if (rc != 0) {
7737 pr_err("error %d\n", rc);
7738 goto rw_error;
7739 }
7740 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_FINE__A, 2, 0);
7741 if (rc != 0) {
7742 pr_err("error %d\n", rc);
7743 goto rw_error;
7744 }
7745 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_MEDIUM__A, 25, 0);
7746 if (rc != 0) {
7747 pr_err("error %d\n", rc);
7748 goto rw_error;
7749 }
7750 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CI_COARSE__A, 80, 0);
7751 if (rc != 0) {
7752 pr_err("error %d\n", rc);
7753 goto rw_error;
7754 }
7755 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_FINE__A, 12, 0);
7756 if (rc != 0) {
7757 pr_err("error %d\n", rc);
7758 goto rw_error;
7759 }
7760 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_MEDIUM__A, 24, 0);
7761 if (rc != 0) {
7762 pr_err("error %d\n", rc);
7763 goto rw_error;
7764 }
7765 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EP_COARSE__A, 24, 0);
7766 if (rc != 0) {
7767 pr_err("error %d\n", rc);
7768 goto rw_error;
7769 }
7770 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_FINE__A, 12, 0);
7771 if (rc != 0) {
7772 pr_err("error %d\n", rc);
7773 goto rw_error;
7774 }
7775 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_MEDIUM__A, 16, 0);
7776 if (rc != 0) {
7777 pr_err("error %d\n", rc);
7778 goto rw_error;
7779 }
7780 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_EI_COARSE__A, 16, 0);
7781 if (rc != 0) {
7782 pr_err("error %d\n", rc);
7783 goto rw_error;
7784 }
7785 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_FINE__A, 16, 0);
7786 if (rc != 0) {
7787 pr_err("error %d\n", rc);
7788 goto rw_error;
7789 }
7790 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_MEDIUM__A, 48, 0);
7791 if (rc != 0) {
7792 pr_err("error %d\n", rc);
7793 goto rw_error;
7794 }
7795 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF_COARSE__A, 80, 0);
7796 if (rc != 0) {
7797 pr_err("error %d\n", rc);
7798 goto rw_error;
7799 }
7800 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_FINE__A, 5, 0);
7801 if (rc != 0) {
7802 pr_err("error %d\n", rc);
7803 goto rw_error;
7804 }
7805 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_MEDIUM__A, 15, 0);
7806 if (rc != 0) {
7807 pr_err("error %d\n", rc);
7808 goto rw_error;
7809 }
7810 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_LC_CF1_COARSE__A, 16, 0);
7811 if (rc != 0) {
7812 pr_err("error %d\n", rc);
7813 goto rw_error;
7814 }
7815
7816 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_SL_SIG_POWER__A, 43520, 0);
7817 if (rc != 0) {
7818 pr_err("error %d\n", rc);
7819 goto rw_error;
7820 }
7821
7822 return 0;
7823rw_error:
7824 return rc;
7825}
7826
7827
7828#define QAM_SET_OP_ALL 0x1
7829#define QAM_SET_OP_CONSTELLATION 0x2
7830#define QAM_SET_OP_SPECTRUM 0X4
7831
7832
7833
7834
7835
7836
7837
7838
7839static int
7840set_qam(struct drx_demod_instance *demod,
7841 struct drx_channel *channel, s32 tuner_freq_offset, u32 op)
7842{
7843 struct i2c_device_addr *dev_addr = NULL;
7844 struct drxj_data *ext_attr = NULL;
7845 struct drx_common_attr *common_attr = NULL;
7846 int rc;
7847 u32 adc_frequency = 0;
7848 u32 iqm_rc_rate = 0;
7849 u16 cmd_result = 0;
7850 u16 lc_symbol_freq = 0;
7851 u16 iqm_rc_stretch = 0;
7852 u16 set_env_parameters = 0;
7853 u16 set_param_parameters[2] = { 0 };
7854 struct drxjscu_cmd cmd_scu = { 0,
7855 0,
7856 0,
7857 NULL,
7858 NULL
7859 };
7860 const u8 qam_a_taps[] = {
7861 DRXJ_16TO8(-1),
7862 DRXJ_16TO8(1),
7863 DRXJ_16TO8(1),
7864 DRXJ_16TO8(-1),
7865 DRXJ_16TO8(-1),
7866 DRXJ_16TO8(2),
7867 DRXJ_16TO8(1),
7868 DRXJ_16TO8(-2),
7869 DRXJ_16TO8(0),
7870 DRXJ_16TO8(3),
7871 DRXJ_16TO8(-1),
7872 DRXJ_16TO8(-3),
7873 DRXJ_16TO8(4),
7874 DRXJ_16TO8(1),
7875 DRXJ_16TO8(-8),
7876 DRXJ_16TO8(4),
7877 DRXJ_16TO8(13),
7878 DRXJ_16TO8(-13),
7879 DRXJ_16TO8(-19),
7880 DRXJ_16TO8(28),
7881 DRXJ_16TO8(25),
7882 DRXJ_16TO8(-53),
7883 DRXJ_16TO8(-31),
7884 DRXJ_16TO8(96),
7885 DRXJ_16TO8(37),
7886 DRXJ_16TO8(-190),
7887 DRXJ_16TO8(-40),
7888 DRXJ_16TO8(619)
7889 };
7890 const u8 qam_b64_taps[] = {
7891 DRXJ_16TO8(0),
7892 DRXJ_16TO8(-2),
7893 DRXJ_16TO8(1),
7894 DRXJ_16TO8(2),
7895 DRXJ_16TO8(-2),
7896 DRXJ_16TO8(0),
7897 DRXJ_16TO8(4),
7898 DRXJ_16TO8(-2),
7899 DRXJ_16TO8(-4),
7900 DRXJ_16TO8(4),
7901 DRXJ_16TO8(3),
7902 DRXJ_16TO8(-6),
7903 DRXJ_16TO8(0),
7904 DRXJ_16TO8(6),
7905 DRXJ_16TO8(-5),
7906 DRXJ_16TO8(-3),
7907 DRXJ_16TO8(11),
7908 DRXJ_16TO8(-4),
7909 DRXJ_16TO8(-19),
7910 DRXJ_16TO8(19),
7911 DRXJ_16TO8(28),
7912 DRXJ_16TO8(-45),
7913 DRXJ_16TO8(-36),
7914 DRXJ_16TO8(90),
7915 DRXJ_16TO8(42),
7916 DRXJ_16TO8(-185),
7917 DRXJ_16TO8(-46),
7918 DRXJ_16TO8(614)
7919 };
7920 const u8 qam_b256_taps[] = {
7921 DRXJ_16TO8(-2),
7922 DRXJ_16TO8(4),
7923 DRXJ_16TO8(1),
7924 DRXJ_16TO8(-4),
7925 DRXJ_16TO8(0),
7926 DRXJ_16TO8(4),
7927 DRXJ_16TO8(-2),
7928 DRXJ_16TO8(-4),
7929 DRXJ_16TO8(5),
7930 DRXJ_16TO8(2),
7931 DRXJ_16TO8(-8),
7932 DRXJ_16TO8(2),
7933 DRXJ_16TO8(11),
7934 DRXJ_16TO8(-8),
7935 DRXJ_16TO8(-15),
7936 DRXJ_16TO8(16),
7937 DRXJ_16TO8(19),
7938 DRXJ_16TO8(-27),
7939 DRXJ_16TO8(-22),
7940 DRXJ_16TO8(44),
7941 DRXJ_16TO8(26),
7942 DRXJ_16TO8(-69),
7943 DRXJ_16TO8(-28),
7944 DRXJ_16TO8(110),
7945 DRXJ_16TO8(31),
7946 DRXJ_16TO8(-201),
7947 DRXJ_16TO8(-32),
7948 DRXJ_16TO8(628)
7949 };
7950 const u8 qam_c_taps[] = {
7951 DRXJ_16TO8(-3),
7952 DRXJ_16TO8(3),
7953 DRXJ_16TO8(2),
7954 DRXJ_16TO8(-4),
7955 DRXJ_16TO8(0),
7956 DRXJ_16TO8(4),
7957 DRXJ_16TO8(-1),
7958 DRXJ_16TO8(-4),
7959 DRXJ_16TO8(3),
7960 DRXJ_16TO8(3),
7961 DRXJ_16TO8(-5),
7962 DRXJ_16TO8(0),
7963 DRXJ_16TO8(9),
7964 DRXJ_16TO8(-4),
7965 DRXJ_16TO8(-12),
7966 DRXJ_16TO8(10),
7967 DRXJ_16TO8(16),
7968 DRXJ_16TO8(-21),
7969 DRXJ_16TO8(-20),
7970 DRXJ_16TO8(37),
7971 DRXJ_16TO8(25),
7972 DRXJ_16TO8(-62),
7973 DRXJ_16TO8(-28),
7974 DRXJ_16TO8(105),
7975 DRXJ_16TO8(31),
7976 DRXJ_16TO8(-197),
7977 DRXJ_16TO8(-33),
7978 DRXJ_16TO8(626)
7979 };
7980
7981 dev_addr = demod->my_i2c_dev_addr;
7982 ext_attr = (struct drxj_data *) demod->my_ext_attr;
7983 common_attr = (struct drx_common_attr *) demod->my_common_attr;
7984
7985 if ((op & QAM_SET_OP_ALL) || (op & QAM_SET_OP_CONSTELLATION)) {
7986 if (ext_attr->standard == DRX_STANDARD_ITU_B) {
7987 switch (channel->constellation) {
7988 case DRX_CONSTELLATION_QAM256:
7989 iqm_rc_rate = 0x00AE3562;
7990 lc_symbol_freq =
7991 QAM_LC_SYMBOL_FREQ_FREQ_QAM_B_256;
7992 channel->symbolrate = 5360537;
7993 iqm_rc_stretch = IQM_RC_STRETCH_QAM_B_256;
7994 break;
7995 case DRX_CONSTELLATION_QAM64:
7996 iqm_rc_rate = 0x00C05A0E;
7997 lc_symbol_freq = 409;
7998 channel->symbolrate = 5056941;
7999 iqm_rc_stretch = IQM_RC_STRETCH_QAM_B_64;
8000 break;
8001 default:
8002 return -EINVAL;
8003 }
8004 } else {
8005 adc_frequency = (common_attr->sys_clock_freq * 1000) / 3;
8006 if (channel->symbolrate == 0) {
8007 pr_err("error: channel symbolrate is zero!\n");
8008 return -EIO;
8009 }
8010 iqm_rc_rate =
8011 (adc_frequency / channel->symbolrate) * (1 << 21) +
8012 (frac28
8013 ((adc_frequency % channel->symbolrate),
8014 channel->symbolrate) >> 7) - (1 << 23);
8015 lc_symbol_freq =
8016 (u16) (frac28
8017 (channel->symbolrate +
8018 (adc_frequency >> 13),
8019 adc_frequency) >> 16);
8020 if (lc_symbol_freq > 511)
8021 lc_symbol_freq = 511;
8022
8023 iqm_rc_stretch = 21;
8024 }
8025
8026 if (ext_attr->standard == DRX_STANDARD_ITU_A) {
8027 set_env_parameters = QAM_TOP_ANNEX_A;
8028 set_param_parameters[0] = channel->constellation;
8029 set_param_parameters[1] = DRX_INTERLEAVEMODE_I12_J17;
8030 } else if (ext_attr->standard == DRX_STANDARD_ITU_B) {
8031 set_env_parameters = QAM_TOP_ANNEX_B;
8032 set_param_parameters[0] = channel->constellation;
8033 set_param_parameters[1] = channel->interleavemode;
8034 } else if (ext_attr->standard == DRX_STANDARD_ITU_C) {
8035 set_env_parameters = QAM_TOP_ANNEX_C;
8036 set_param_parameters[0] = channel->constellation;
8037 set_param_parameters[1] = DRX_INTERLEAVEMODE_I12_J17;
8038 } else {
8039 return -EINVAL;
8040 }
8041 }
8042
8043 if (op & QAM_SET_OP_ALL) {
8044
8045
8046
8047
8048
8049
8050 rc = drxj_dap_write_reg16(dev_addr, FEC_COMM_EXEC__A, FEC_COMM_EXEC_STOP, 0);
8051 if (rc != 0) {
8052 pr_err("error %d\n", rc);
8053 goto rw_error;
8054 }
8055 rc = drxj_dap_write_reg16(dev_addr, QAM_COMM_EXEC__A, QAM_COMM_EXEC_STOP, 0);
8056 if (rc != 0) {
8057 pr_err("error %d\n", rc);
8058 goto rw_error;
8059 }
8060 rc = drxj_dap_write_reg16(dev_addr, IQM_FS_COMM_EXEC__A, IQM_FS_COMM_EXEC_STOP, 0);
8061 if (rc != 0) {
8062 pr_err("error %d\n", rc);
8063 goto rw_error;
8064 }
8065 rc = drxj_dap_write_reg16(dev_addr, IQM_FD_COMM_EXEC__A, IQM_FD_COMM_EXEC_STOP, 0);
8066 if (rc != 0) {
8067 pr_err("error %d\n", rc);
8068 goto rw_error;
8069 }
8070 rc = drxj_dap_write_reg16(dev_addr, IQM_RC_COMM_EXEC__A, IQM_RC_COMM_EXEC_STOP, 0);
8071 if (rc != 0) {
8072 pr_err("error %d\n", rc);
8073 goto rw_error;
8074 }
8075 rc = drxj_dap_write_reg16(dev_addr, IQM_RT_COMM_EXEC__A, IQM_RT_COMM_EXEC_STOP, 0);
8076 if (rc != 0) {
8077 pr_err("error %d\n", rc);
8078 goto rw_error;
8079 }
8080 rc = drxj_dap_write_reg16(dev_addr, IQM_CF_COMM_EXEC__A, IQM_CF_COMM_EXEC_STOP, 0);
8081 if (rc != 0) {
8082 pr_err("error %d\n", rc);
8083 goto rw_error;
8084 }
8085
8086 cmd_scu.command = SCU_RAM_COMMAND_STANDARD_QAM |
8087 SCU_RAM_COMMAND_CMD_DEMOD_RESET;
8088 cmd_scu.parameter_len = 0;
8089 cmd_scu.result_len = 1;
8090 cmd_scu.parameter = NULL;
8091 cmd_scu.result = &cmd_result;
8092 rc = scu_command(dev_addr, &cmd_scu);
8093 if (rc != 0) {
8094 pr_err("error %d\n", rc);
8095 goto rw_error;
8096 }
8097 }
8098
8099 if ((op & QAM_SET_OP_ALL) || (op & QAM_SET_OP_CONSTELLATION)) {
8100
8101
8102
8103
8104
8105 cmd_scu.command = SCU_RAM_COMMAND_STANDARD_QAM |
8106 SCU_RAM_COMMAND_CMD_DEMOD_SET_ENV;
8107 cmd_scu.parameter_len = 1;
8108 cmd_scu.result_len = 1;
8109 cmd_scu.parameter = &set_env_parameters;
8110 cmd_scu.result = &cmd_result;
8111 rc = scu_command(dev_addr, &cmd_scu);
8112 if (rc != 0) {
8113 pr_err("error %d\n", rc);
8114 goto rw_error;
8115 }
8116
8117 cmd_scu.command = SCU_RAM_COMMAND_STANDARD_QAM |
8118 SCU_RAM_COMMAND_CMD_DEMOD_SET_PARAM;
8119 cmd_scu.parameter_len = 2;
8120 cmd_scu.result_len = 1;
8121 cmd_scu.parameter = set_param_parameters;
8122 cmd_scu.result = &cmd_result;
8123 rc = scu_command(dev_addr, &cmd_scu);
8124 if (rc != 0) {
8125 pr_err("error %d\n", rc);
8126 goto rw_error;
8127 }
8128
8129 rc = drxdap_fasi_write_reg32(dev_addr, IQM_RC_RATE_OFS_LO__A, iqm_rc_rate, 0);
8130 if (rc != 0) {
8131 pr_err("error %d\n", rc);
8132 goto rw_error;
8133 }
8134 ext_attr->iqm_rc_rate_ofs = iqm_rc_rate;
8135 rc = set_qam_measurement(demod, channel->constellation, channel->symbolrate);
8136 if (rc != 0) {
8137 pr_err("error %d\n", rc);
8138 goto rw_error;
8139 }
8140 }
8141
8142
8143
8144
8145 if ((op & QAM_SET_OP_ALL) || (op & QAM_SET_OP_SPECTRUM)) {
8146 rc = set_frequency(demod, channel, tuner_freq_offset);
8147 if (rc != 0) {
8148 pr_err("error %d\n", rc);
8149 goto rw_error;
8150 }
8151 }
8152
8153 if ((op & QAM_SET_OP_ALL) || (op & QAM_SET_OP_CONSTELLATION)) {
8154
8155 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_SYMBOL_FREQ__A, lc_symbol_freq, 0);
8156 if (rc != 0) {
8157 pr_err("error %d\n", rc);
8158 goto rw_error;
8159 }
8160 rc = drxj_dap_write_reg16(dev_addr, IQM_RC_STRETCH__A, iqm_rc_stretch, 0);
8161 if (rc != 0) {
8162 pr_err("error %d\n", rc);
8163 goto rw_error;
8164 }
8165 }
8166
8167 if (op & QAM_SET_OP_ALL) {
8168 if (!ext_attr->has_lna) {
8169 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_AMUX__A, 0x02, 0);
8170 if (rc != 0) {
8171 pr_err("error %d\n", rc);
8172 goto rw_error;
8173 }
8174 }
8175 rc = drxj_dap_write_reg16(dev_addr, IQM_CF_SYMMETRIC__A, 0, 0);
8176 if (rc != 0) {
8177 pr_err("error %d\n", rc);
8178 goto rw_error;
8179 }
8180 rc = drxj_dap_write_reg16(dev_addr, IQM_CF_MIDTAP__A, 3, 0);
8181 if (rc != 0) {
8182 pr_err("error %d\n", rc);
8183 goto rw_error;
8184 }
8185 rc = drxj_dap_write_reg16(dev_addr, IQM_CF_OUT_ENA__A, IQM_CF_OUT_ENA_QAM__M, 0);
8186 if (rc != 0) {
8187 pr_err("error %d\n", rc);
8188 goto rw_error;
8189 }
8190
8191 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_WR_RSV_0__A, 0x5f, 0);
8192 if (rc != 0) {
8193 pr_err("error %d\n", rc);
8194 goto rw_error;
8195 }
8196
8197 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_SYNC_SEL__A, 3, 0);
8198 if (rc != 0) {
8199 pr_err("error %d\n", rc);
8200 goto rw_error;
8201 }
8202 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_CLP_LEN__A, 0, 0);
8203 if (rc != 0) {
8204 pr_err("error %d\n", rc);
8205 goto rw_error;
8206 }
8207 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_CLP_TH__A, 448, 0);
8208 if (rc != 0) {
8209 pr_err("error %d\n", rc);
8210 goto rw_error;
8211 }
8212 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_SNS_LEN__A, 0, 0);
8213 if (rc != 0) {
8214 pr_err("error %d\n", rc);
8215 goto rw_error;
8216 }
8217 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_PDREF__A, 4, 0);
8218 if (rc != 0) {
8219 pr_err("error %d\n", rc);
8220 goto rw_error;
8221 }
8222 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_STDBY__A, 0x10, 0);
8223 if (rc != 0) {
8224 pr_err("error %d\n", rc);
8225 goto rw_error;
8226 }
8227 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_PGA_GAIN__A, 11, 0);
8228 if (rc != 0) {
8229 pr_err("error %d\n", rc);
8230 goto rw_error;
8231 }
8232
8233 rc = drxj_dap_write_reg16(dev_addr, IQM_CF_POW_MEAS_LEN__A, 1, 0);
8234 if (rc != 0) {
8235 pr_err("error %d\n", rc);
8236 goto rw_error;
8237 }
8238 rc = drxj_dap_write_reg16(dev_addr, IQM_CF_SCALE_SH__A, IQM_CF_SCALE_SH__PRE, 0);
8239 if (rc != 0) {
8240 pr_err("error %d\n", rc);
8241 goto rw_error;
8242 }
8243
8244 rc = drxj_dap_write_reg16(dev_addr, QAM_SY_TIMEOUT__A, QAM_SY_TIMEOUT__PRE, 0);
8245 if (rc != 0) {
8246 pr_err("error %d\n", rc);
8247 goto rw_error;
8248 }
8249 if (ext_attr->standard == DRX_STANDARD_ITU_B) {
8250 rc = drxj_dap_write_reg16(dev_addr, QAM_SY_SYNC_LWM__A, QAM_SY_SYNC_LWM__PRE, 0);
8251 if (rc != 0) {
8252 pr_err("error %d\n", rc);
8253 goto rw_error;
8254 }
8255 rc = drxj_dap_write_reg16(dev_addr, QAM_SY_SYNC_AWM__A, QAM_SY_SYNC_AWM__PRE, 0);
8256 if (rc != 0) {
8257 pr_err("error %d\n", rc);
8258 goto rw_error;
8259 }
8260 rc = drxj_dap_write_reg16(dev_addr, QAM_SY_SYNC_HWM__A, QAM_SY_SYNC_HWM__PRE, 0);
8261 if (rc != 0) {
8262 pr_err("error %d\n", rc);
8263 goto rw_error;
8264 }
8265 } else {
8266 switch (channel->constellation) {
8267 case DRX_CONSTELLATION_QAM16:
8268 case DRX_CONSTELLATION_QAM64:
8269 case DRX_CONSTELLATION_QAM256:
8270 rc = drxj_dap_write_reg16(dev_addr, QAM_SY_SYNC_LWM__A, 0x03, 0);
8271 if (rc != 0) {
8272 pr_err("error %d\n", rc);
8273 goto rw_error;
8274 }
8275 rc = drxj_dap_write_reg16(dev_addr, QAM_SY_SYNC_AWM__A, 0x04, 0);
8276 if (rc != 0) {
8277 pr_err("error %d\n", rc);
8278 goto rw_error;
8279 }
8280 rc = drxj_dap_write_reg16(dev_addr, QAM_SY_SYNC_HWM__A, QAM_SY_SYNC_HWM__PRE, 0);
8281 if (rc != 0) {
8282 pr_err("error %d\n", rc);
8283 goto rw_error;
8284 }
8285 break;
8286 case DRX_CONSTELLATION_QAM32:
8287 case DRX_CONSTELLATION_QAM128:
8288 rc = drxj_dap_write_reg16(dev_addr, QAM_SY_SYNC_LWM__A, 0x03, 0);
8289 if (rc != 0) {
8290 pr_err("error %d\n", rc);
8291 goto rw_error;
8292 }
8293 rc = drxj_dap_write_reg16(dev_addr, QAM_SY_SYNC_AWM__A, 0x05, 0);
8294 if (rc != 0) {
8295 pr_err("error %d\n", rc);
8296 goto rw_error;
8297 }
8298 rc = drxj_dap_write_reg16(dev_addr, QAM_SY_SYNC_HWM__A, 0x06, 0);
8299 if (rc != 0) {
8300 pr_err("error %d\n", rc);
8301 goto rw_error;
8302 }
8303 break;
8304 default:
8305 return -EIO;
8306 }
8307 }
8308
8309 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_MODE__A, QAM_LC_MODE__PRE, 0);
8310 if (rc != 0) {
8311 pr_err("error %d\n", rc);
8312 goto rw_error;
8313 }
8314 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_RATE_LIMIT__A, 3, 0);
8315 if (rc != 0) {
8316 pr_err("error %d\n", rc);
8317 goto rw_error;
8318 }
8319 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_LPF_FACTORP__A, 4, 0);
8320 if (rc != 0) {
8321 pr_err("error %d\n", rc);
8322 goto rw_error;
8323 }
8324 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_LPF_FACTORI__A, 4, 0);
8325 if (rc != 0) {
8326 pr_err("error %d\n", rc);
8327 goto rw_error;
8328 }
8329 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_MODE__A, 7, 0);
8330 if (rc != 0) {
8331 pr_err("error %d\n", rc);
8332 goto rw_error;
8333 }
8334 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB0__A, 1, 0);
8335 if (rc != 0) {
8336 pr_err("error %d\n", rc);
8337 goto rw_error;
8338 }
8339 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB1__A, 1, 0);
8340 if (rc != 0) {
8341 pr_err("error %d\n", rc);
8342 goto rw_error;
8343 }
8344 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB2__A, 1, 0);
8345 if (rc != 0) {
8346 pr_err("error %d\n", rc);
8347 goto rw_error;
8348 }
8349 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB3__A, 1, 0);
8350 if (rc != 0) {
8351 pr_err("error %d\n", rc);
8352 goto rw_error;
8353 }
8354 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB4__A, 2, 0);
8355 if (rc != 0) {
8356 pr_err("error %d\n", rc);
8357 goto rw_error;
8358 }
8359 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB5__A, 2, 0);
8360 if (rc != 0) {
8361 pr_err("error %d\n", rc);
8362 goto rw_error;
8363 }
8364 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB6__A, 2, 0);
8365 if (rc != 0) {
8366 pr_err("error %d\n", rc);
8367 goto rw_error;
8368 }
8369 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB8__A, 2, 0);
8370 if (rc != 0) {
8371 pr_err("error %d\n", rc);
8372 goto rw_error;
8373 }
8374 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB9__A, 2, 0);
8375 if (rc != 0) {
8376 pr_err("error %d\n", rc);
8377 goto rw_error;
8378 }
8379 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB10__A, 2, 0);
8380 if (rc != 0) {
8381 pr_err("error %d\n", rc);
8382 goto rw_error;
8383 }
8384 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB12__A, 2, 0);
8385 if (rc != 0) {
8386 pr_err("error %d\n", rc);
8387 goto rw_error;
8388 }
8389 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB15__A, 3, 0);
8390 if (rc != 0) {
8391 pr_err("error %d\n", rc);
8392 goto rw_error;
8393 }
8394 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB16__A, 3, 0);
8395 if (rc != 0) {
8396 pr_err("error %d\n", rc);
8397 goto rw_error;
8398 }
8399 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB20__A, 4, 0);
8400 if (rc != 0) {
8401 pr_err("error %d\n", rc);
8402 goto rw_error;
8403 }
8404 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_QUAL_TAB25__A, 4, 0);
8405 if (rc != 0) {
8406 pr_err("error %d\n", rc);
8407 goto rw_error;
8408 }
8409
8410 rc = drxj_dap_write_reg16(dev_addr, IQM_FS_ADJ_SEL__A, 1, 0);
8411 if (rc != 0) {
8412 pr_err("error %d\n", rc);
8413 goto rw_error;
8414 }
8415 rc = drxj_dap_write_reg16(dev_addr, IQM_RC_ADJ_SEL__A, 1, 0);
8416 if (rc != 0) {
8417 pr_err("error %d\n", rc);
8418 goto rw_error;
8419 }
8420 rc = drxj_dap_write_reg16(dev_addr, IQM_CF_ADJ_SEL__A, 1, 0);
8421 if (rc != 0) {
8422 pr_err("error %d\n", rc);
8423 goto rw_error;
8424 }
8425 rc = drxj_dap_write_reg16(dev_addr, IQM_CF_POW_MEAS_LEN__A, 0, 0);
8426 if (rc != 0) {
8427 pr_err("error %d\n", rc);
8428 goto rw_error;
8429 }
8430 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_GPIO__A, 0, 0);
8431 if (rc != 0) {
8432 pr_err("error %d\n", rc);
8433 goto rw_error;
8434 }
8435
8436
8437
8438
8439 rc = set_iqm_af(demod, true);
8440 if (rc != 0) {
8441 pr_err("error %d\n", rc);
8442 goto rw_error;
8443 }
8444 rc = adc_synchronization(demod);
8445 if (rc != 0) {
8446 pr_err("error %d\n", rc);
8447 goto rw_error;
8448 }
8449
8450 rc = init_agc(demod);
8451 if (rc != 0) {
8452 pr_err("error %d\n", rc);
8453 goto rw_error;
8454 }
8455 rc = set_agc_if(demod, &(ext_attr->qam_if_agc_cfg), false);
8456 if (rc != 0) {
8457 pr_err("error %d\n", rc);
8458 goto rw_error;
8459 }
8460 rc = set_agc_rf(demod, &(ext_attr->qam_rf_agc_cfg), false);
8461 if (rc != 0) {
8462 pr_err("error %d\n", rc);
8463 goto rw_error;
8464 }
8465 {
8466
8467
8468 struct drxj_cfg_afe_gain qam_pga_cfg = { DRX_STANDARD_ITU_B, 0 };
8469
8470 qam_pga_cfg.gain = ext_attr->qam_pga_cfg;
8471 rc = ctrl_set_cfg_afe_gain(demod, &qam_pga_cfg);
8472 if (rc != 0) {
8473 pr_err("error %d\n", rc);
8474 goto rw_error;
8475 }
8476 }
8477 rc = ctrl_set_cfg_pre_saw(demod, &(ext_attr->qam_pre_saw_cfg));
8478 if (rc != 0) {
8479 pr_err("error %d\n", rc);
8480 goto rw_error;
8481 }
8482 }
8483
8484 if ((op & QAM_SET_OP_ALL) || (op & QAM_SET_OP_CONSTELLATION)) {
8485 if (ext_attr->standard == DRX_STANDARD_ITU_A) {
8486 rc = drxdap_fasi_write_block(dev_addr, IQM_CF_TAP_RE0__A, sizeof(qam_a_taps), ((u8 *)qam_a_taps), 0);
8487 if (rc != 0) {
8488 pr_err("error %d\n", rc);
8489 goto rw_error;
8490 }
8491 rc = drxdap_fasi_write_block(dev_addr, IQM_CF_TAP_IM0__A, sizeof(qam_a_taps), ((u8 *)qam_a_taps), 0);
8492 if (rc != 0) {
8493 pr_err("error %d\n", rc);
8494 goto rw_error;
8495 }
8496 } else if (ext_attr->standard == DRX_STANDARD_ITU_B) {
8497 switch (channel->constellation) {
8498 case DRX_CONSTELLATION_QAM64:
8499 rc = drxdap_fasi_write_block(dev_addr, IQM_CF_TAP_RE0__A, sizeof(qam_b64_taps), ((u8 *)qam_b64_taps), 0);
8500 if (rc != 0) {
8501 pr_err("error %d\n", rc);
8502 goto rw_error;
8503 }
8504 rc = drxdap_fasi_write_block(dev_addr, IQM_CF_TAP_IM0__A, sizeof(qam_b64_taps), ((u8 *)qam_b64_taps), 0);
8505 if (rc != 0) {
8506 pr_err("error %d\n", rc);
8507 goto rw_error;
8508 }
8509 break;
8510 case DRX_CONSTELLATION_QAM256:
8511 rc = drxdap_fasi_write_block(dev_addr, IQM_CF_TAP_RE0__A, sizeof(qam_b256_taps), ((u8 *)qam_b256_taps), 0);
8512 if (rc != 0) {
8513 pr_err("error %d\n", rc);
8514 goto rw_error;
8515 }
8516 rc = drxdap_fasi_write_block(dev_addr, IQM_CF_TAP_IM0__A, sizeof(qam_b256_taps), ((u8 *)qam_b256_taps), 0);
8517 if (rc != 0) {
8518 pr_err("error %d\n", rc);
8519 goto rw_error;
8520 }
8521 break;
8522 default:
8523 return -EIO;
8524 }
8525 } else if (ext_attr->standard == DRX_STANDARD_ITU_C) {
8526 rc = drxdap_fasi_write_block(dev_addr, IQM_CF_TAP_RE0__A, sizeof(qam_c_taps), ((u8 *)qam_c_taps), 0);
8527 if (rc != 0) {
8528 pr_err("error %d\n", rc);
8529 goto rw_error;
8530 }
8531 rc = drxdap_fasi_write_block(dev_addr, IQM_CF_TAP_IM0__A, sizeof(qam_c_taps), ((u8 *)qam_c_taps), 0);
8532 if (rc != 0) {
8533 pr_err("error %d\n", rc);
8534 goto rw_error;
8535 }
8536 }
8537
8538
8539 switch (channel->constellation) {
8540 case DRX_CONSTELLATION_QAM16:
8541 rc = set_qam16(demod);
8542 if (rc != 0) {
8543 pr_err("error %d\n", rc);
8544 goto rw_error;
8545 }
8546 break;
8547 case DRX_CONSTELLATION_QAM32:
8548 rc = set_qam32(demod);
8549 if (rc != 0) {
8550 pr_err("error %d\n", rc);
8551 goto rw_error;
8552 }
8553 break;
8554 case DRX_CONSTELLATION_QAM64:
8555 rc = set_qam64(demod);
8556 if (rc != 0) {
8557 pr_err("error %d\n", rc);
8558 goto rw_error;
8559 }
8560 break;
8561 case DRX_CONSTELLATION_QAM128:
8562 rc = set_qam128(demod);
8563 if (rc != 0) {
8564 pr_err("error %d\n", rc);
8565 goto rw_error;
8566 }
8567 break;
8568 case DRX_CONSTELLATION_QAM256:
8569 rc = set_qam256(demod);
8570 if (rc != 0) {
8571 pr_err("error %d\n", rc);
8572 goto rw_error;
8573 }
8574 break;
8575 default:
8576 return -EIO;
8577 }
8578 }
8579
8580 if ((op & QAM_SET_OP_ALL)) {
8581 rc = drxj_dap_write_reg16(dev_addr, IQM_CF_SCALE_SH__A, 0, 0);
8582 if (rc != 0) {
8583 pr_err("error %d\n", rc);
8584 goto rw_error;
8585 }
8586
8587
8588 rc = set_mpegtei_handling(demod);
8589 if (rc != 0) {
8590 pr_err("error %d\n", rc);
8591 goto rw_error;
8592 }
8593 rc = bit_reverse_mpeg_output(demod);
8594 if (rc != 0) {
8595 pr_err("error %d\n", rc);
8596 goto rw_error;
8597 }
8598 rc = set_mpeg_start_width(demod);
8599 if (rc != 0) {
8600 pr_err("error %d\n", rc);
8601 goto rw_error;
8602 }
8603 {
8604
8605
8606 struct drx_cfg_mpeg_output cfg_mpeg_output;
8607
8608 memcpy(&cfg_mpeg_output, &common_attr->mpeg_cfg, sizeof(cfg_mpeg_output));
8609 cfg_mpeg_output.enable_mpeg_output = true;
8610
8611 rc = ctrl_set_cfg_mpeg_output(demod, &cfg_mpeg_output);
8612 if (rc != 0) {
8613 pr_err("error %d\n", rc);
8614 goto rw_error;
8615 }
8616 }
8617 }
8618
8619 if ((op & QAM_SET_OP_ALL) || (op & QAM_SET_OP_CONSTELLATION)) {
8620
8621
8622 cmd_scu.command = SCU_RAM_COMMAND_STANDARD_QAM |
8623 SCU_RAM_COMMAND_CMD_DEMOD_START;
8624 cmd_scu.parameter_len = 0;
8625 cmd_scu.result_len = 1;
8626 cmd_scu.parameter = NULL;
8627 cmd_scu.result = &cmd_result;
8628 rc = scu_command(dev_addr, &cmd_scu);
8629 if (rc != 0) {
8630 pr_err("error %d\n", rc);
8631 goto rw_error;
8632 }
8633 }
8634
8635 rc = drxj_dap_write_reg16(dev_addr, IQM_COMM_EXEC__A, IQM_COMM_EXEC_ACTIVE, 0);
8636 if (rc != 0) {
8637 pr_err("error %d\n", rc);
8638 goto rw_error;
8639 }
8640 rc = drxj_dap_write_reg16(dev_addr, QAM_COMM_EXEC__A, QAM_COMM_EXEC_ACTIVE, 0);
8641 if (rc != 0) {
8642 pr_err("error %d\n", rc);
8643 goto rw_error;
8644 }
8645 rc = drxj_dap_write_reg16(dev_addr, FEC_COMM_EXEC__A, FEC_COMM_EXEC_ACTIVE, 0);
8646 if (rc != 0) {
8647 pr_err("error %d\n", rc);
8648 goto rw_error;
8649 }
8650
8651 return 0;
8652rw_error:
8653 return rc;
8654}
8655
8656
8657static int ctrl_get_qam_sig_quality(struct drx_demod_instance *demod);
8658
8659static int qam_flip_spec(struct drx_demod_instance *demod, struct drx_channel *channel)
8660{
8661 struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
8662 struct drxj_data *ext_attr = demod->my_ext_attr;
8663 int rc;
8664 u32 iqm_fs_rate_ofs = 0;
8665 u32 iqm_fs_rate_lo = 0;
8666 u16 qam_ctl_ena = 0;
8667 u16 data = 0;
8668 u16 equ_mode = 0;
8669 u16 fsm_state = 0;
8670 int i = 0;
8671 int ofsofs = 0;
8672
8673
8674 rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_QAM_CTL_ENA__A, &qam_ctl_ena, 0);
8675 if (rc != 0) {
8676 pr_err("error %d\n", rc);
8677 goto rw_error;
8678 }
8679 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_CTL_ENA__A, qam_ctl_ena & ~(SCU_RAM_QAM_CTL_ENA_ACQ__M | SCU_RAM_QAM_CTL_ENA_EQU__M | SCU_RAM_QAM_CTL_ENA_LC__M), 0);
8680 if (rc != 0) {
8681 pr_err("error %d\n", rc);
8682 goto rw_error;
8683 }
8684
8685
8686 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_CF__A, 0, 0);
8687 if (rc != 0) {
8688 pr_err("error %d\n", rc);
8689 goto rw_error;
8690 }
8691 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_CF1__A, 0, 0);
8692 if (rc != 0) {
8693 pr_err("error %d\n", rc);
8694 goto rw_error;
8695 }
8696
8697 rc = drxj_dap_atomic_read_reg32(dev_addr, IQM_FS_RATE_OFS_LO__A, &iqm_fs_rate_ofs, 0);
8698 if (rc != 0) {
8699 pr_err("error %d\n", rc);
8700 goto rw_error;
8701 }
8702 rc = drxj_dap_atomic_read_reg32(dev_addr, IQM_FS_RATE_LO__A, &iqm_fs_rate_lo, 0);
8703 if (rc != 0) {
8704 pr_err("error %d\n", rc);
8705 goto rw_error;
8706 }
8707 ofsofs = iqm_fs_rate_lo - iqm_fs_rate_ofs;
8708 iqm_fs_rate_ofs = ~iqm_fs_rate_ofs + 1;
8709 iqm_fs_rate_ofs -= 2 * ofsofs;
8710
8711
8712 rc = drxj_dap_read_reg16(dev_addr, QAM_DQ_MODE__A, &data, 0);
8713 if (rc != 0) {
8714 pr_err("error %d\n", rc);
8715 goto rw_error;
8716 }
8717 data = (data & 0xfff9);
8718 rc = drxj_dap_write_reg16(dev_addr, QAM_DQ_MODE__A, data, 0);
8719 if (rc != 0) {
8720 pr_err("error %d\n", rc);
8721 goto rw_error;
8722 }
8723 rc = drxj_dap_write_reg16(dev_addr, QAM_FQ_MODE__A, data, 0);
8724 if (rc != 0) {
8725 pr_err("error %d\n", rc);
8726 goto rw_error;
8727 }
8728
8729
8730 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_CI__A, 0, 0);
8731 if (rc != 0) {
8732 pr_err("error %d\n", rc);
8733 goto rw_error;
8734 }
8735 rc = drxj_dap_write_reg16(dev_addr, QAM_LC_EP__A, 0, 0);
8736 if (rc != 0) {
8737 pr_err("error %d\n", rc);
8738 goto rw_error;
8739 }
8740 rc = drxj_dap_write_reg16(dev_addr, QAM_FQ_LA_FACTOR__A, 0, 0);
8741 if (rc != 0) {
8742 pr_err("error %d\n", rc);
8743 goto rw_error;
8744 }
8745
8746
8747 rc = drxdap_fasi_write_reg32(dev_addr, IQM_FS_RATE_OFS_LO__A, iqm_fs_rate_ofs, 0);
8748 if (rc != 0) {
8749 pr_err("error %d\n", rc);
8750 goto rw_error;
8751 }
8752 ext_attr->iqm_fs_rate_ofs = iqm_fs_rate_ofs;
8753 ext_attr->pos_image = (ext_attr->pos_image) ? false : true;
8754
8755
8756 rc = drxj_dap_read_reg16(dev_addr, QAM_DQ_MODE__A, &data, 0);
8757 if (rc != 0) {
8758 pr_err("error %d\n", rc);
8759 goto rw_error;
8760 }
8761 equ_mode = data;
8762 data = (data & 0xfff9);
8763 rc = drxj_dap_write_reg16(dev_addr, QAM_DQ_MODE__A, data, 0);
8764 if (rc != 0) {
8765 pr_err("error %d\n", rc);
8766 goto rw_error;
8767 }
8768 rc = drxj_dap_write_reg16(dev_addr, QAM_FQ_MODE__A, data, 0);
8769 if (rc != 0) {
8770 pr_err("error %d\n", rc);
8771 goto rw_error;
8772 }
8773
8774 for (i = 0; i < 28; i++) {
8775 rc = drxj_dap_read_reg16(dev_addr, QAM_DQ_TAP_IM_EL0__A + (2 * i), &data, 0);
8776 if (rc != 0) {
8777 pr_err("error %d\n", rc);
8778 goto rw_error;
8779 }
8780 rc = drxj_dap_write_reg16(dev_addr, QAM_DQ_TAP_IM_EL0__A + (2 * i), -data, 0);
8781 if (rc != 0) {
8782 pr_err("error %d\n", rc);
8783 goto rw_error;
8784 }
8785 }
8786
8787 for (i = 0; i < 24; i++) {
8788 rc = drxj_dap_read_reg16(dev_addr, QAM_FQ_TAP_IM_EL0__A + (2 * i), &data, 0);
8789 if (rc != 0) {
8790 pr_err("error %d\n", rc);
8791 goto rw_error;
8792 }
8793 rc = drxj_dap_write_reg16(dev_addr, QAM_FQ_TAP_IM_EL0__A + (2 * i), -data, 0);
8794 if (rc != 0) {
8795 pr_err("error %d\n", rc);
8796 goto rw_error;
8797 }
8798 }
8799
8800 data = equ_mode;
8801 rc = drxj_dap_write_reg16(dev_addr, QAM_DQ_MODE__A, data, 0);
8802 if (rc != 0) {
8803 pr_err("error %d\n", rc);
8804 goto rw_error;
8805 }
8806 rc = drxj_dap_write_reg16(dev_addr, QAM_FQ_MODE__A, data, 0);
8807 if (rc != 0) {
8808 pr_err("error %d\n", rc);
8809 goto rw_error;
8810 }
8811
8812 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_FSM_STATE_TGT__A, 4, 0);
8813 if (rc != 0) {
8814 pr_err("error %d\n", rc);
8815 goto rw_error;
8816 }
8817
8818 i = 0;
8819 while ((fsm_state != 4) && (i++ < 100)) {
8820 rc = drxj_dap_read_reg16(dev_addr, SCU_RAM_QAM_FSM_STATE__A, &fsm_state, 0);
8821 if (rc != 0) {
8822 pr_err("error %d\n", rc);
8823 goto rw_error;
8824 }
8825 }
8826 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_QAM_CTL_ENA__A, (qam_ctl_ena | 0x0016), 0);
8827 if (rc != 0) {
8828 pr_err("error %d\n", rc);
8829 goto rw_error;
8830 }
8831
8832 return 0;
8833rw_error:
8834 return rc;
8835
8836}
8837
8838#define NO_LOCK 0x0
8839#define DEMOD_LOCKED 0x1
8840#define SYNC_FLIPPED 0x2
8841#define SPEC_MIRRORED 0x4
8842
8843
8844
8845
8846
8847
8848
8849
8850
8851static int
8852qam64auto(struct drx_demod_instance *demod,
8853 struct drx_channel *channel,
8854 s32 tuner_freq_offset, enum drx_lock_status *lock_status)
8855{
8856 struct drxj_data *ext_attr = demod->my_ext_attr;
8857 struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
8858 struct drx39xxj_state *state = dev_addr->user_data;
8859 struct dtv_frontend_properties *p = &state->frontend.dtv_property_cache;
8860 int rc;
8861 u32 lck_state = NO_LOCK;
8862 u32 start_time = 0;
8863 u32 d_locked_time = 0;
8864 u32 timeout_ofs = 0;
8865 u16 data = 0;
8866
8867
8868 *lock_status = DRX_NOT_LOCKED;
8869 start_time = jiffies_to_msecs(jiffies);
8870 lck_state = NO_LOCK;
8871 do {
8872 rc = ctrl_lock_status(demod, lock_status);
8873 if (rc != 0) {
8874 pr_err("error %d\n", rc);
8875 goto rw_error;
8876 }
8877
8878 switch (lck_state) {
8879 case NO_LOCK:
8880 if (*lock_status == DRXJ_DEMOD_LOCK) {
8881 rc = ctrl_get_qam_sig_quality(demod);
8882 if (rc != 0) {
8883 pr_err("error %d\n", rc);
8884 goto rw_error;
8885 }
8886 if (p->cnr.stat[0].svalue > 20800) {
8887 lck_state = DEMOD_LOCKED;
8888
8889 timeout_ofs += DRXJ_QAM_DEMOD_LOCK_EXT_WAITTIME;
8890 d_locked_time = jiffies_to_msecs(jiffies);
8891 }
8892 }
8893 break;
8894 case DEMOD_LOCKED:
8895 if ((*lock_status == DRXJ_DEMOD_LOCK) &&
8896 ((jiffies_to_msecs(jiffies) - d_locked_time) >
8897 DRXJ_QAM_FEC_LOCK_WAITTIME)) {
8898 rc = drxj_dap_read_reg16(demod->my_i2c_dev_addr, QAM_SY_TIMEOUT__A, &data, 0);
8899 if (rc != 0) {
8900 pr_err("error %d\n", rc);
8901 goto rw_error;
8902 }
8903 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, QAM_SY_TIMEOUT__A, data | 0x1, 0);
8904 if (rc != 0) {
8905 pr_err("error %d\n", rc);
8906 goto rw_error;
8907 }
8908 lck_state = SYNC_FLIPPED;
8909 msleep(10);
8910 }
8911 break;
8912 case SYNC_FLIPPED:
8913 if (*lock_status == DRXJ_DEMOD_LOCK) {
8914 if (channel->mirror == DRX_MIRROR_AUTO) {
8915
8916 rc = drxj_dap_read_reg16(demod->my_i2c_dev_addr, QAM_SY_TIMEOUT__A, &data, 0);
8917 if (rc != 0) {
8918 pr_err("error %d\n", rc);
8919 goto rw_error;
8920 }
8921 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, QAM_SY_TIMEOUT__A, data & 0xFFFE, 0);
8922 if (rc != 0) {
8923 pr_err("error %d\n", rc);
8924 goto rw_error;
8925 }
8926
8927 ext_attr->mirror = DRX_MIRROR_YES;
8928 rc = qam_flip_spec(demod, channel);
8929 if (rc != 0) {
8930 pr_err("error %d\n", rc);
8931 goto rw_error;
8932 }
8933 lck_state = SPEC_MIRRORED;
8934
8935 start_time = d_locked_time =
8936 jiffies_to_msecs(jiffies);
8937 timeout_ofs = 0;
8938 } else {
8939
8940 start_time =
8941 jiffies_to_msecs(jiffies) -
8942 DRXJ_QAM_MAX_WAITTIME - timeout_ofs;
8943 }
8944 }
8945 break;
8946 case SPEC_MIRRORED:
8947 if ((*lock_status == DRXJ_DEMOD_LOCK) &&
8948 ((jiffies_to_msecs(jiffies) - d_locked_time) >
8949 DRXJ_QAM_FEC_LOCK_WAITTIME)) {
8950 rc = ctrl_get_qam_sig_quality(demod);
8951 if (rc != 0) {
8952 pr_err("error %d\n", rc);
8953 goto rw_error;
8954 }
8955 if (p->cnr.stat[0].svalue > 20800) {
8956 rc = drxj_dap_read_reg16(demod->my_i2c_dev_addr, QAM_SY_TIMEOUT__A, &data, 0);
8957 if (rc != 0) {
8958 pr_err("error %d\n", rc);
8959 goto rw_error;
8960 }
8961 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr, QAM_SY_TIMEOUT__A, data | 0x1, 0);
8962 if (rc != 0) {
8963 pr_err("error %d\n", rc);
8964 goto rw_error;
8965 }
8966
8967 start_time =
8968 jiffies_to_msecs(jiffies) -
8969 DRXJ_QAM_MAX_WAITTIME - timeout_ofs;
8970 }
8971 }
8972 break;
8973 default:
8974 break;
8975 }
8976 msleep(10);
8977 } while
8978 ((*lock_status != DRX_LOCKED) &&
8979 (*lock_status != DRX_NEVER_LOCK) &&
8980 ((jiffies_to_msecs(jiffies) - start_time) <
8981 (DRXJ_QAM_MAX_WAITTIME + timeout_ofs))
8982 );
8983
8984
8985 return 0;
8986rw_error:
8987 return rc;
8988}
8989
8990
8991
8992
8993
8994
8995
8996
8997
8998
8999static int
9000qam256auto(struct drx_demod_instance *demod,
9001 struct drx_channel *channel,
9002 s32 tuner_freq_offset, enum drx_lock_status *lock_status)
9003{
9004 struct drxj_data *ext_attr = demod->my_ext_attr;
9005 struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
9006 struct drx39xxj_state *state = dev_addr->user_data;
9007 struct dtv_frontend_properties *p = &state->frontend.dtv_property_cache;
9008 int rc;
9009 u32 lck_state = NO_LOCK;
9010 u32 start_time = 0;
9011 u32 d_locked_time = 0;
9012 u32 timeout_ofs = DRXJ_QAM_DEMOD_LOCK_EXT_WAITTIME;
9013
9014
9015 *lock_status = DRX_NOT_LOCKED;
9016 start_time = jiffies_to_msecs(jiffies);
9017 lck_state = NO_LOCK;
9018 do {
9019 rc = ctrl_lock_status(demod, lock_status);
9020 if (rc != 0) {
9021 pr_err("error %d\n", rc);
9022 goto rw_error;
9023 }
9024 switch (lck_state) {
9025 case NO_LOCK:
9026 if (*lock_status == DRXJ_DEMOD_LOCK) {
9027 rc = ctrl_get_qam_sig_quality(demod);
9028 if (rc != 0) {
9029 pr_err("error %d\n", rc);
9030 goto rw_error;
9031 }
9032 if (p->cnr.stat[0].svalue > 26800) {
9033 lck_state = DEMOD_LOCKED;
9034 timeout_ofs += DRXJ_QAM_DEMOD_LOCK_EXT_WAITTIME;
9035 d_locked_time = jiffies_to_msecs(jiffies);
9036 }
9037 }
9038 break;
9039 case DEMOD_LOCKED:
9040 if (*lock_status == DRXJ_DEMOD_LOCK) {
9041 if ((channel->mirror == DRX_MIRROR_AUTO) &&
9042 ((jiffies_to_msecs(jiffies) - d_locked_time) >
9043 DRXJ_QAM_FEC_LOCK_WAITTIME)) {
9044 ext_attr->mirror = DRX_MIRROR_YES;
9045 rc = qam_flip_spec(demod, channel);
9046 if (rc != 0) {
9047 pr_err("error %d\n", rc);
9048 goto rw_error;
9049 }
9050 lck_state = SPEC_MIRRORED;
9051
9052 start_time = jiffies_to_msecs(jiffies);
9053 timeout_ofs = -DRXJ_QAM_MAX_WAITTIME / 2;
9054 }
9055 }
9056 break;
9057 case SPEC_MIRRORED:
9058 break;
9059 default:
9060 break;
9061 }
9062 msleep(10);
9063 } while
9064 ((*lock_status < DRX_LOCKED) &&
9065 (*lock_status != DRX_NEVER_LOCK) &&
9066 ((jiffies_to_msecs(jiffies) - start_time) <
9067 (DRXJ_QAM_MAX_WAITTIME + timeout_ofs)));
9068
9069 return 0;
9070rw_error:
9071 return rc;
9072}
9073
9074
9075
9076
9077
9078
9079
9080
9081static int
9082set_qam_channel(struct drx_demod_instance *demod,
9083 struct drx_channel *channel, s32 tuner_freq_offset)
9084{
9085 struct drxj_data *ext_attr = NULL;
9086 int rc;
9087 enum drx_lock_status lock_status = DRX_NOT_LOCKED;
9088 bool auto_flag = false;
9089
9090
9091 ext_attr = (struct drxj_data *) demod->my_ext_attr;
9092
9093
9094 switch (channel->constellation) {
9095 case DRX_CONSTELLATION_QAM16:
9096 case DRX_CONSTELLATION_QAM32:
9097 case DRX_CONSTELLATION_QAM128:
9098 return -EINVAL;
9099 case DRX_CONSTELLATION_QAM64:
9100 case DRX_CONSTELLATION_QAM256:
9101 if (ext_attr->standard != DRX_STANDARD_ITU_B)
9102 return -EINVAL;
9103
9104 ext_attr->constellation = channel->constellation;
9105 if (channel->mirror == DRX_MIRROR_AUTO)
9106 ext_attr->mirror = DRX_MIRROR_NO;
9107 else
9108 ext_attr->mirror = channel->mirror;
9109
9110 rc = set_qam(demod, channel, tuner_freq_offset, QAM_SET_OP_ALL);
9111 if (rc != 0) {
9112 pr_err("error %d\n", rc);
9113 goto rw_error;
9114 }
9115
9116 if (channel->constellation == DRX_CONSTELLATION_QAM64)
9117 rc = qam64auto(demod, channel, tuner_freq_offset,
9118 &lock_status);
9119 else
9120 rc = qam256auto(demod, channel, tuner_freq_offset,
9121 &lock_status);
9122 if (rc != 0) {
9123 pr_err("error %d\n", rc);
9124 goto rw_error;
9125 }
9126 break;
9127 case DRX_CONSTELLATION_AUTO:
9128 if (ext_attr->standard == DRX_STANDARD_ITU_B) {
9129 u16 qam_ctl_ena = 0;
9130
9131 auto_flag = true;
9132
9133
9134 channel->constellation = DRX_CONSTELLATION_QAM256;
9135 ext_attr->constellation = DRX_CONSTELLATION_QAM256;
9136 if (channel->mirror == DRX_MIRROR_AUTO)
9137 ext_attr->mirror = DRX_MIRROR_NO;
9138 else
9139 ext_attr->mirror = channel->mirror;
9140 rc = set_qam(demod, channel, tuner_freq_offset,
9141 QAM_SET_OP_ALL);
9142 if (rc != 0) {
9143 pr_err("error %d\n", rc);
9144 goto rw_error;
9145 }
9146 rc = qam256auto(demod, channel, tuner_freq_offset,
9147 &lock_status);
9148 if (rc != 0) {
9149 pr_err("error %d\n", rc);
9150 goto rw_error;
9151 }
9152
9153 if (lock_status >= DRX_LOCKED) {
9154 channel->constellation = DRX_CONSTELLATION_AUTO;
9155 break;
9156 }
9157
9158
9159 channel->constellation = DRX_CONSTELLATION_QAM64;
9160 ext_attr->constellation = DRX_CONSTELLATION_QAM64;
9161 if (channel->mirror == DRX_MIRROR_AUTO)
9162 ext_attr->mirror = DRX_MIRROR_NO;
9163 else
9164 ext_attr->mirror = channel->mirror;
9165
9166 rc = drxj_dap_read_reg16(demod->my_i2c_dev_addr,
9167 SCU_RAM_QAM_CTL_ENA__A,
9168 &qam_ctl_ena, 0);
9169 if (rc != 0) {
9170 pr_err("error %d\n", rc);
9171 goto rw_error;
9172 }
9173 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr,
9174 SCU_RAM_QAM_CTL_ENA__A,
9175 qam_ctl_ena & ~SCU_RAM_QAM_CTL_ENA_ACQ__M, 0);
9176 if (rc != 0) {
9177 pr_err("error %d\n", rc);
9178 goto rw_error;
9179 }
9180 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr,
9181 SCU_RAM_QAM_FSM_STATE_TGT__A,
9182 0x2, 0);
9183 if (rc != 0) {
9184 pr_err("error %d\n", rc);
9185 goto rw_error;
9186 }
9187
9188 rc = set_qam(demod, channel, tuner_freq_offset,
9189 QAM_SET_OP_CONSTELLATION);
9190 if (rc != 0) {
9191 pr_err("error %d\n", rc);
9192 goto rw_error;
9193 }
9194 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr,
9195 SCU_RAM_QAM_CTL_ENA__A,
9196 qam_ctl_ena, 0);
9197 if (rc != 0) {
9198 pr_err("error %d\n", rc);
9199 goto rw_error;
9200 }
9201
9202 rc = qam64auto(demod, channel, tuner_freq_offset,
9203 &lock_status);
9204 if (rc != 0) {
9205 pr_err("error %d\n", rc);
9206 goto rw_error;
9207 }
9208
9209 channel->constellation = DRX_CONSTELLATION_AUTO;
9210 } else if (ext_attr->standard == DRX_STANDARD_ITU_C) {
9211 u16 qam_ctl_ena = 0;
9212
9213 channel->constellation = DRX_CONSTELLATION_QAM64;
9214 ext_attr->constellation = DRX_CONSTELLATION_QAM64;
9215 auto_flag = true;
9216
9217 if (channel->mirror == DRX_MIRROR_AUTO)
9218 ext_attr->mirror = DRX_MIRROR_NO;
9219 else
9220 ext_attr->mirror = channel->mirror;
9221 rc = drxj_dap_read_reg16(demod->my_i2c_dev_addr,
9222 SCU_RAM_QAM_CTL_ENA__A,
9223 &qam_ctl_ena, 0);
9224 if (rc != 0) {
9225 pr_err("error %d\n", rc);
9226 goto rw_error;
9227 }
9228 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr,
9229 SCU_RAM_QAM_CTL_ENA__A,
9230 qam_ctl_ena & ~SCU_RAM_QAM_CTL_ENA_ACQ__M, 0);
9231 if (rc != 0) {
9232 pr_err("error %d\n", rc);
9233 goto rw_error;
9234 }
9235 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr,
9236 SCU_RAM_QAM_FSM_STATE_TGT__A,
9237 0x2, 0);
9238 if (rc != 0) {
9239 pr_err("error %d\n", rc);
9240 goto rw_error;
9241 }
9242
9243 rc = set_qam(demod, channel, tuner_freq_offset,
9244 QAM_SET_OP_CONSTELLATION);
9245 if (rc != 0) {
9246 pr_err("error %d\n", rc);
9247 goto rw_error;
9248 }
9249 rc = drxj_dap_write_reg16(demod->my_i2c_dev_addr,
9250 SCU_RAM_QAM_CTL_ENA__A,
9251 qam_ctl_ena, 0);
9252 if (rc != 0) {
9253 pr_err("error %d\n", rc);
9254 goto rw_error;
9255 }
9256 rc = qam64auto(demod, channel, tuner_freq_offset,
9257 &lock_status);
9258 if (rc != 0) {
9259 pr_err("error %d\n", rc);
9260 goto rw_error;
9261 }
9262 channel->constellation = DRX_CONSTELLATION_AUTO;
9263 } else {
9264 return -EINVAL;
9265 }
9266 break;
9267 default:
9268 return -EINVAL;
9269 }
9270
9271 return 0;
9272rw_error:
9273
9274 if (auto_flag)
9275 channel->constellation = DRX_CONSTELLATION_AUTO;
9276 return rc;
9277}
9278
9279
9280
9281
9282
9283
9284
9285
9286
9287
9288
9289static int
9290get_qamrs_err_count(struct i2c_device_addr *dev_addr,
9291 struct drxjrs_errors *rs_errors)
9292{
9293 int rc;
9294 u16 nr_bit_errors = 0,
9295 nr_symbol_errors = 0,
9296 nr_packet_errors = 0, nr_failures = 0, nr_snc_par_fail_count = 0;
9297
9298
9299 if (dev_addr == NULL)
9300 return -EINVAL;
9301
9302
9303
9304
9305 rc = drxj_dap_read_reg16(dev_addr, FEC_RS_NR_BIT_ERRORS__A, &nr_bit_errors, 0);
9306 if (rc != 0) {
9307 pr_err("error %d\n", rc);
9308 goto rw_error;
9309 }
9310
9311 rc = drxj_dap_read_reg16(dev_addr, FEC_RS_NR_SYMBOL_ERRORS__A, &nr_symbol_errors, 0);
9312 if (rc != 0) {
9313 pr_err("error %d\n", rc);
9314 goto rw_error;
9315 }
9316
9317 rc = drxj_dap_read_reg16(dev_addr, FEC_RS_NR_PACKET_ERRORS__A, &nr_packet_errors, 0);
9318 if (rc != 0) {
9319 pr_err("error %d\n", rc);
9320 goto rw_error;
9321 }
9322
9323 rc = drxj_dap_read_reg16(dev_addr, FEC_RS_NR_FAILURES__A, &nr_failures, 0);
9324 if (rc != 0) {
9325 pr_err("error %d\n", rc);
9326 goto rw_error;
9327 }
9328
9329 rc = drxj_dap_read_reg16(dev_addr, FEC_OC_SNC_FAIL_COUNT__A, &nr_snc_par_fail_count, 0);
9330 if (rc != 0) {
9331 pr_err("error %d\n", rc);
9332 goto rw_error;
9333 }
9334
9335
9336
9337
9338 rs_errors->nr_bit_errors = nr_bit_errors & FEC_RS_NR_BIT_ERRORS__M;
9339 rs_errors->nr_symbol_errors = nr_symbol_errors & FEC_RS_NR_SYMBOL_ERRORS__M;
9340 rs_errors->nr_packet_errors = nr_packet_errors & FEC_RS_NR_PACKET_ERRORS__M;
9341 rs_errors->nr_failures = nr_failures & FEC_RS_NR_FAILURES__M;
9342 rs_errors->nr_snc_par_fail_count =
9343 nr_snc_par_fail_count & FEC_OC_SNC_FAIL_COUNT__M;
9344
9345 return 0;
9346rw_error:
9347 return rc;
9348}
9349
9350
9351
9352
9353
9354
9355
9356
9357
9358
9359
9360
9361
9362#define DRXJ_AGC_TOP 0x2800
9363#define DRXJ_AGC_SNS 0x1600
9364#define DRXJ_RFAGC_MAX 0x3fff
9365#define DRXJ_RFAGC_MIN 0x800
9366
9367static int get_sig_strength(struct drx_demod_instance *demod, u16 *sig_strength)
9368{
9369 struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
9370 int rc;
9371 u16 rf_gain = 0;
9372 u16 if_gain = 0;
9373 u16 if_agc_sns = 0;
9374 u16 if_agc_top = 0;
9375 u16 rf_agc_max = 0;
9376 u16 rf_agc_min = 0;
9377
9378 rc = drxj_dap_read_reg16(dev_addr, IQM_AF_AGC_IF__A, &if_gain, 0);
9379 if (rc != 0) {
9380 pr_err("error %d\n", rc);
9381 goto rw_error;
9382 }
9383 if_gain &= IQM_AF_AGC_IF__M;
9384 rc = drxj_dap_read_reg16(dev_addr, IQM_AF_AGC_RF__A, &rf_gain, 0);
9385 if (rc != 0) {
9386 pr_err("error %d\n", rc);
9387 goto rw_error;
9388 }
9389 rf_gain &= IQM_AF_AGC_RF__M;
9390
9391 if_agc_sns = DRXJ_AGC_SNS;
9392 if_agc_top = DRXJ_AGC_TOP;
9393 rf_agc_max = DRXJ_RFAGC_MAX;
9394 rf_agc_min = DRXJ_RFAGC_MIN;
9395
9396 if (if_gain > if_agc_top) {
9397 if (rf_gain > rf_agc_max)
9398 *sig_strength = 100;
9399 else if (rf_gain > rf_agc_min) {
9400 if (rf_agc_max == rf_agc_min) {
9401 pr_err("error: rf_agc_max == rf_agc_min\n");
9402 return -EIO;
9403 }
9404 *sig_strength =
9405 75 + 25 * (rf_gain - rf_agc_min) / (rf_agc_max -
9406 rf_agc_min);
9407 } else
9408 *sig_strength = 75;
9409 } else if (if_gain > if_agc_sns) {
9410 if (if_agc_top == if_agc_sns) {
9411 pr_err("error: if_agc_top == if_agc_sns\n");
9412 return -EIO;
9413 }
9414 *sig_strength =
9415 20 + 55 * (if_gain - if_agc_sns) / (if_agc_top - if_agc_sns);
9416 } else {
9417 if (!if_agc_sns) {
9418 pr_err("error: if_agc_sns is zero!\n");
9419 return -EIO;
9420 }
9421 *sig_strength = (20 * if_gain / if_agc_sns);
9422 }
9423
9424 if (*sig_strength <= 7)
9425 *sig_strength = 0;
9426
9427 return 0;
9428rw_error:
9429 return rc;
9430}
9431
9432
9433
9434
9435
9436
9437
9438
9439
9440
9441
9442
9443
9444static int
9445ctrl_get_qam_sig_quality(struct drx_demod_instance *demod)
9446{
9447 struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
9448 struct drxj_data *ext_attr = demod->my_ext_attr;
9449 struct drx39xxj_state *state = dev_addr->user_data;
9450 struct dtv_frontend_properties *p = &state->frontend.dtv_property_cache;
9451 struct drxjrs_errors measuredrs_errors = { 0, 0, 0, 0, 0 };
9452 enum drx_modulation constellation = ext_attr->constellation;
9453 int rc;
9454
9455 u32 pre_bit_err_rs = 0;
9456 u32 post_bit_err_rs = 0;
9457 u32 pkt_errs = 0;
9458 u16 qam_sl_err_power = 0;
9459 u16 qsym_err_vd = 0;
9460 u16 fec_oc_period = 0;
9461 u16 fec_rs_prescale = 0;
9462 u16 fec_rs_period = 0;
9463
9464 u32 rs_bit_cnt = 0;
9465 u32 qam_sl_sig_power = 0;
9466
9467 u32 e = 0;
9468 u32 m = 0;
9469 u32 ber_cnt = 0;
9470
9471 u32 qam_sl_mer = 0;
9472 u32 qam_pre_rs_ber = 0;
9473 u32 qam_post_rs_ber = 0;
9474 u32 qam_vd_ser = 0;
9475 u16 qam_vd_prescale = 0;
9476 u16 qam_vd_period = 0;
9477 u32 vd_bit_cnt = 0;
9478
9479 p->block_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
9480
9481
9482
9483 rc = get_qamrs_err_count(dev_addr, &measuredrs_errors);
9484 if (rc != 0) {
9485 pr_err("error %d\n", rc);
9486 goto rw_error;
9487 }
9488
9489 rc = drxj_dap_read_reg16(dev_addr, QAM_SL_ERR_POWER__A, &qam_sl_err_power, 0);
9490 if (rc != 0) {
9491 pr_err("error %d\n", rc);
9492 goto rw_error;
9493 }
9494
9495 rc = drxj_dap_read_reg16(dev_addr, FEC_OC_SNC_FAIL_PERIOD__A, &fec_oc_period, 0);
9496 if (rc != 0) {
9497 pr_err("error %d\n", rc);
9498 goto rw_error;
9499 }
9500
9501
9502 fec_rs_period = ext_attr->fec_rs_period;
9503 fec_rs_prescale = ext_attr->fec_rs_prescale;
9504 rs_bit_cnt = fec_rs_period * fec_rs_prescale * ext_attr->fec_rs_plen;
9505 qam_vd_period = ext_attr->qam_vd_period;
9506 qam_vd_prescale = ext_attr->qam_vd_prescale;
9507 vd_bit_cnt = qam_vd_period * qam_vd_prescale * ext_attr->fec_vd_plen;
9508
9509
9510 switch (constellation) {
9511 case DRX_CONSTELLATION_QAM16:
9512 qam_sl_sig_power = DRXJ_QAM_SL_SIG_POWER_QAM16 << 2;
9513 break;
9514 case DRX_CONSTELLATION_QAM32:
9515 qam_sl_sig_power = DRXJ_QAM_SL_SIG_POWER_QAM32 << 2;
9516 break;
9517 case DRX_CONSTELLATION_QAM64:
9518 qam_sl_sig_power = DRXJ_QAM_SL_SIG_POWER_QAM64 << 2;
9519 break;
9520 case DRX_CONSTELLATION_QAM128:
9521 qam_sl_sig_power = DRXJ_QAM_SL_SIG_POWER_QAM128 << 2;
9522 break;
9523 case DRX_CONSTELLATION_QAM256:
9524 qam_sl_sig_power = DRXJ_QAM_SL_SIG_POWER_QAM256 << 2;
9525 break;
9526 default:
9527 return -EIO;
9528 }
9529
9530
9531
9532
9533
9534
9535
9536 if (qam_sl_err_power == 0)
9537 qam_sl_mer = 0;
9538 else
9539 qam_sl_mer = log1_times100(qam_sl_sig_power) - log1_times100((u32)qam_sl_err_power);
9540
9541
9542
9543
9544
9545
9546
9547
9548 rc = drxj_dap_read_reg16(dev_addr, QAM_VD_NR_QSYM_ERRORS__A, &qsym_err_vd, 0);
9549 if (rc != 0) {
9550 pr_err("error %d\n", rc);
9551 goto rw_error;
9552 }
9553
9554
9555 e = (qsym_err_vd & QAM_VD_NR_QSYM_ERRORS_EXP__M) >>
9556 QAM_VD_NR_QSYM_ERRORS_EXP__B;
9557 m = (qsym_err_vd & QAM_VD_NR_SYMBOL_ERRORS_FIXED_MANT__M) >>
9558 QAM_VD_NR_SYMBOL_ERRORS_FIXED_MANT__B;
9559
9560 if ((m << e) >> 3 > 549752)
9561 qam_vd_ser = 500000 * vd_bit_cnt * ((e > 2) ? 1 : 8) / 8;
9562 else
9563 qam_vd_ser = m << ((e > 2) ? (e - 3) : e);
9564
9565
9566
9567
9568
9569
9570
9571 pre_bit_err_rs = (u32) measuredrs_errors.nr_bit_errors;
9572 pkt_errs = post_bit_err_rs = (u32) measuredrs_errors.nr_snc_par_fail_count;
9573
9574
9575
9576 e = (pre_bit_err_rs & FEC_RS_NR_BIT_ERRORS_EXP__M) >>
9577 FEC_RS_NR_BIT_ERRORS_EXP__B;
9578 m = (pre_bit_err_rs & FEC_RS_NR_BIT_ERRORS_FIXED_MANT__M) >>
9579 FEC_RS_NR_BIT_ERRORS_FIXED_MANT__B;
9580
9581 ber_cnt = m << e;
9582
9583
9584 if (m > (rs_bit_cnt >> (e + 1)) || (rs_bit_cnt >> e) == 0)
9585 qam_pre_rs_ber = 500000 * rs_bit_cnt >> e;
9586 else
9587 qam_pre_rs_ber = ber_cnt;
9588
9589
9590
9591
9592
9593
9594
9595
9596
9597
9598
9599
9600 e = post_bit_err_rs * 742686;
9601 m = fec_oc_period * 100;
9602 if (fec_oc_period == 0)
9603 qam_post_rs_ber = 0xFFFFFFFF;
9604 else
9605 qam_post_rs_ber = e / m;
9606
9607
9608 p->pre_bit_count.stat[0].scale = FE_SCALE_COUNTER;
9609 p->post_bit_count.stat[0].scale = FE_SCALE_COUNTER;
9610 p->pre_bit_error.stat[0].scale = FE_SCALE_COUNTER;
9611 p->post_bit_error.stat[0].scale = FE_SCALE_COUNTER;
9612 p->block_error.stat[0].scale = FE_SCALE_COUNTER;
9613 p->cnr.stat[0].scale = FE_SCALE_DECIBEL;
9614
9615 p->cnr.stat[0].svalue = ((u16) qam_sl_mer) * 100;
9616 if (ext_attr->standard == DRX_STANDARD_ITU_B) {
9617 p->pre_bit_error.stat[0].uvalue += qam_vd_ser;
9618 p->pre_bit_count.stat[0].uvalue += vd_bit_cnt * ((e > 2) ? 1 : 8) / 8;
9619 } else {
9620 p->pre_bit_error.stat[0].uvalue += qam_pre_rs_ber;
9621 p->pre_bit_count.stat[0].uvalue += rs_bit_cnt >> e;
9622 }
9623
9624 p->post_bit_error.stat[0].uvalue += qam_post_rs_ber;
9625 p->post_bit_count.stat[0].uvalue += rs_bit_cnt >> e;
9626
9627 p->block_error.stat[0].uvalue += pkt_errs;
9628
9629#ifdef DRXJ_SIGNAL_ACCUM_ERR
9630 rc = get_acc_pkt_err(demod, &sig_quality->packet_error);
9631 if (rc != 0) {
9632 pr_err("error %d\n", rc);
9633 goto rw_error;
9634 }
9635#endif
9636
9637 return 0;
9638rw_error:
9639 p->pre_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
9640 p->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
9641 p->pre_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
9642 p->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
9643 p->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
9644 p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
9645
9646 return rc;
9647}
9648
9649#endif
9650
9651
9652
9653
9654
9655
9656
9657
9658
9659
9660
9661
9662
9663
9664
9665
9666
9667
9668
9669
9670
9671
9672
9673
9674
9675
9676
9677
9678
9679
9680
9681
9682
9683
9684
9685
9686
9687
9688
9689
9690
9691
9692
9693
9694
9695
9696
9697
9698
9699
9700
9701
9702
9703
9704
9705
9706
9707
9708
9709
9710
9711
9712
9713
9714
9715
9716
9717
9718
9719
9720
9721
9722
9723
9724
9725
9726
9727
9728static int
9729power_down_atv(struct drx_demod_instance *demod, enum drx_standard standard, bool primary)
9730{
9731 struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
9732 struct drxjscu_cmd cmd_scu = { 0,
9733 0,
9734 0,
9735 NULL,
9736 NULL
9737 };
9738 int rc;
9739 u16 cmd_result = 0;
9740
9741
9742
9743
9744 cmd_scu.command = SCU_RAM_COMMAND_STANDARD_ATV |
9745 SCU_RAM_COMMAND_CMD_DEMOD_STOP;
9746 cmd_scu.parameter_len = 0;
9747 cmd_scu.result_len = 1;
9748 cmd_scu.parameter = NULL;
9749 cmd_scu.result = &cmd_result;
9750 rc = scu_command(dev_addr, &cmd_scu);
9751 if (rc != 0) {
9752 pr_err("error %d\n", rc);
9753 goto rw_error;
9754 }
9755
9756 rc = drxj_dap_write_reg16(dev_addr, ATV_TOP_STDBY__A, (ATV_TOP_STDBY_SIF_STDBY_STANDBY & (~ATV_TOP_STDBY_CVBS_STDBY_A2_ACTIVE)), 0);
9757 if (rc != 0) {
9758 pr_err("error %d\n", rc);
9759 goto rw_error;
9760 }
9761
9762 rc = drxj_dap_write_reg16(dev_addr, ATV_COMM_EXEC__A, ATV_COMM_EXEC_STOP, 0);
9763 if (rc != 0) {
9764 pr_err("error %d\n", rc);
9765 goto rw_error;
9766 }
9767 if (primary) {
9768 rc = drxj_dap_write_reg16(dev_addr, IQM_COMM_EXEC__A, IQM_COMM_EXEC_STOP, 0);
9769 if (rc != 0) {
9770 pr_err("error %d\n", rc);
9771 goto rw_error;
9772 }
9773 rc = set_iqm_af(demod, false);
9774 if (rc != 0) {
9775 pr_err("error %d\n", rc);
9776 goto rw_error;
9777 }
9778 } else {
9779 rc = drxj_dap_write_reg16(dev_addr, IQM_FS_COMM_EXEC__A, IQM_FS_COMM_EXEC_STOP, 0);
9780 if (rc != 0) {
9781 pr_err("error %d\n", rc);
9782 goto rw_error;
9783 }
9784 rc = drxj_dap_write_reg16(dev_addr, IQM_FD_COMM_EXEC__A, IQM_FD_COMM_EXEC_STOP, 0);
9785 if (rc != 0) {
9786 pr_err("error %d\n", rc);
9787 goto rw_error;
9788 }
9789 rc = drxj_dap_write_reg16(dev_addr, IQM_RC_COMM_EXEC__A, IQM_RC_COMM_EXEC_STOP, 0);
9790 if (rc != 0) {
9791 pr_err("error %d\n", rc);
9792 goto rw_error;
9793 }
9794 rc = drxj_dap_write_reg16(dev_addr, IQM_RT_COMM_EXEC__A, IQM_RT_COMM_EXEC_STOP, 0);
9795 if (rc != 0) {
9796 pr_err("error %d\n", rc);
9797 goto rw_error;
9798 }
9799 rc = drxj_dap_write_reg16(dev_addr, IQM_CF_COMM_EXEC__A, IQM_CF_COMM_EXEC_STOP, 0);
9800 if (rc != 0) {
9801 pr_err("error %d\n", rc);
9802 goto rw_error;
9803 }
9804 }
9805 rc = power_down_aud(demod);
9806 if (rc != 0) {
9807 pr_err("error %d\n", rc);
9808 goto rw_error;
9809 }
9810
9811 return 0;
9812rw_error:
9813 return rc;
9814}
9815
9816
9817
9818
9819
9820
9821
9822
9823
9824static int power_down_aud(struct drx_demod_instance *demod)
9825{
9826 struct i2c_device_addr *dev_addr = NULL;
9827 struct drxj_data *ext_attr = NULL;
9828 int rc;
9829
9830 dev_addr = (struct i2c_device_addr *)demod->my_i2c_dev_addr;
9831 ext_attr = (struct drxj_data *) demod->my_ext_attr;
9832
9833 rc = drxj_dap_write_reg16(dev_addr, AUD_COMM_EXEC__A, AUD_COMM_EXEC_STOP, 0);
9834 if (rc != 0) {
9835 pr_err("error %d\n", rc);
9836 goto rw_error;
9837 }
9838
9839 ext_attr->aud_data.audio_is_active = false;
9840
9841 return 0;
9842rw_error:
9843 return rc;
9844}
9845
9846
9847
9848
9849
9850
9851
9852
9853static int set_orx_nsu_aox(struct drx_demod_instance *demod, bool active)
9854{
9855 struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
9856 int rc;
9857 u16 data = 0;
9858
9859
9860 rc = drxj_dap_read_reg16(dev_addr, ORX_NSU_AOX_STDBY_W__A, &data, 0);
9861 if (rc != 0) {
9862 pr_err("error %d\n", rc);
9863 goto rw_error;
9864 }
9865 if (!active)
9866 data &= ((~ORX_NSU_AOX_STDBY_W_STDBYADC_A2_ON) & (~ORX_NSU_AOX_STDBY_W_STDBYAMP_A2_ON) & (~ORX_NSU_AOX_STDBY_W_STDBYBIAS_A2_ON) & (~ORX_NSU_AOX_STDBY_W_STDBYPLL_A2_ON) & (~ORX_NSU_AOX_STDBY_W_STDBYPD_A2_ON) & (~ORX_NSU_AOX_STDBY_W_STDBYTAGC_IF_A2_ON) & (~ORX_NSU_AOX_STDBY_W_STDBYTAGC_RF_A2_ON) & (~ORX_NSU_AOX_STDBY_W_STDBYFLT_A2_ON));
9867 else
9868 data |= (ORX_NSU_AOX_STDBY_W_STDBYADC_A2_ON | ORX_NSU_AOX_STDBY_W_STDBYAMP_A2_ON | ORX_NSU_AOX_STDBY_W_STDBYBIAS_A2_ON | ORX_NSU_AOX_STDBY_W_STDBYPLL_A2_ON | ORX_NSU_AOX_STDBY_W_STDBYPD_A2_ON | ORX_NSU_AOX_STDBY_W_STDBYTAGC_IF_A2_ON | ORX_NSU_AOX_STDBY_W_STDBYTAGC_RF_A2_ON | ORX_NSU_AOX_STDBY_W_STDBYFLT_A2_ON);
9869 rc = drxj_dap_write_reg16(dev_addr, ORX_NSU_AOX_STDBY_W__A, data, 0);
9870 if (rc != 0) {
9871 pr_err("error %d\n", rc);
9872 goto rw_error;
9873 }
9874
9875 return 0;
9876rw_error:
9877 return rc;
9878}
9879
9880
9881
9882
9883
9884
9885
9886
9887
9888
9889
9890
9891
9892
9893
9894
9895
9896
9897#define IMPULSE_COSINE_ALPHA_0_3 {-3, -4, -1, 6, 10, 7, -5, -20, -25, -10, 29, 79, 123, 140}
9898#define IMPULSE_COSINE_ALPHA_0_5 { 2, 0, -2, -2, 2, 5, 2, -10, -20, -14, 20, 74, 125, 145}
9899#define IMPULSE_COSINE_ALPHA_RO_0_5 { 0, 0, 1, 2, 3, 0, -7, -15, -16, 0, 34, 77, 114, 128}
9900
9901
9902#define NYQFILTERLEN 27
9903
9904static int ctrl_set_oob(struct drx_demod_instance *demod, struct drxoob *oob_param)
9905{
9906 int rc;
9907 s32 freq = 0;
9908 struct i2c_device_addr *dev_addr = NULL;
9909 struct drxj_data *ext_attr = NULL;
9910 u16 i = 0;
9911 bool mirror_freq_spect_oob = false;
9912 u16 trk_filter_value = 0;
9913 struct drxjscu_cmd scu_cmd;
9914 u16 set_param_parameters[3];
9915 u16 cmd_result[2] = { 0, 0 };
9916 s16 nyquist_coeffs[4][(NYQFILTERLEN + 1) / 2] = {
9917 IMPULSE_COSINE_ALPHA_0_3,
9918 IMPULSE_COSINE_ALPHA_0_3,
9919 IMPULSE_COSINE_ALPHA_0_5,
9920 IMPULSE_COSINE_ALPHA_RO_0_5
9921 };
9922 u8 mode_val[4] = { 2, 2, 0, 1 };
9923 u8 pfi_coeffs[4][6] = {
9924 {DRXJ_16TO8(-92), DRXJ_16TO8(-108), DRXJ_16TO8(100)},
9925 {DRXJ_16TO8(-64), DRXJ_16TO8(-80), DRXJ_16TO8(80)},
9926 {DRXJ_16TO8(-80), DRXJ_16TO8(-98), DRXJ_16TO8(92)},
9927 {DRXJ_16TO8(-80), DRXJ_16TO8(-98), DRXJ_16TO8(92)}
9928 };
9929 u16 mode_index;
9930
9931 dev_addr = demod->my_i2c_dev_addr;
9932 ext_attr = (struct drxj_data *) demod->my_ext_attr;
9933 mirror_freq_spect_oob = ext_attr->mirror_freq_spect_oob;
9934
9935
9936 if (oob_param == NULL) {
9937
9938 scu_cmd.command = SCU_RAM_COMMAND_STANDARD_OOB
9939 | SCU_RAM_COMMAND_CMD_DEMOD_STOP;
9940 scu_cmd.parameter_len = 0;
9941 scu_cmd.result_len = 1;
9942 scu_cmd.result = cmd_result;
9943 rc = scu_command(dev_addr, &scu_cmd);
9944 if (rc != 0) {
9945 pr_err("error %d\n", rc);
9946 goto rw_error;
9947 }
9948 rc = set_orx_nsu_aox(demod, false);
9949 if (rc != 0) {
9950 pr_err("error %d\n", rc);
9951 goto rw_error;
9952 }
9953 rc = drxj_dap_write_reg16(dev_addr, ORX_COMM_EXEC__A, ORX_COMM_EXEC_STOP, 0);
9954 if (rc != 0) {
9955 pr_err("error %d\n", rc);
9956 goto rw_error;
9957 }
9958
9959 ext_attr->oob_power_on = false;
9960 return 0;
9961 }
9962
9963 freq = oob_param->frequency;
9964 if ((freq < 70000) || (freq > 130000))
9965 return -EIO;
9966 freq = (freq - 50000) / 50;
9967
9968 {
9969 u16 index = 0;
9970 u16 remainder = 0;
9971 u16 *trk_filtercfg = ext_attr->oob_trk_filter_cfg;
9972
9973 index = (u16) ((freq - 400) / 200);
9974 remainder = (u16) ((freq - 400) % 200);
9975 trk_filter_value =
9976 trk_filtercfg[index] - (trk_filtercfg[index] -
9977 trk_filtercfg[index +
9978 1]) / 10 * remainder /
9979 20;
9980 }
9981
9982
9983
9984
9985 rc = drxj_dap_write_reg16(dev_addr, ORX_COMM_EXEC__A, ORX_COMM_EXEC_STOP, 0);
9986 if (rc != 0) {
9987 pr_err("error %d\n", rc);
9988 goto rw_error;
9989 }
9990 scu_cmd.command = SCU_RAM_COMMAND_STANDARD_OOB
9991 | SCU_RAM_COMMAND_CMD_DEMOD_STOP;
9992 scu_cmd.parameter_len = 0;
9993 scu_cmd.result_len = 1;
9994 scu_cmd.result = cmd_result;
9995 rc = scu_command(dev_addr, &scu_cmd);
9996 if (rc != 0) {
9997 pr_err("error %d\n", rc);
9998 goto rw_error;
9999 }
10000
10001
10002
10003 scu_cmd.command = SCU_RAM_COMMAND_STANDARD_OOB
10004 | SCU_RAM_COMMAND_CMD_DEMOD_RESET;
10005 scu_cmd.parameter_len = 0;
10006 scu_cmd.result_len = 1;
10007 scu_cmd.result = cmd_result;
10008 rc = scu_command(dev_addr, &scu_cmd);
10009 if (rc != 0) {
10010 pr_err("error %d\n", rc);
10011 goto rw_error;
10012 }
10013
10014
10015
10016
10017 scu_cmd.command = SCU_RAM_COMMAND_STANDARD_OOB
10018 | SCU_RAM_COMMAND_CMD_DEMOD_SET_ENV;
10019 scu_cmd.parameter_len = 3;
10020
10021 switch (oob_param->standard) {
10022 case DRX_OOB_MODE_A:
10023 if (
10024
10025 ((oob_param->spectrum_inverted == true) &&
10026
10027 (!mirror_freq_spect_oob)) |
10028
10029
10030 ((oob_param->spectrum_inverted == false) &&
10031
10032 (mirror_freq_spect_oob))
10033 )
10034 set_param_parameters[0] =
10035 SCU_RAM_ORX_RF_RX_DATA_RATE_2048KBPS_INVSPEC;
10036 else
10037 set_param_parameters[0] =
10038 SCU_RAM_ORX_RF_RX_DATA_RATE_2048KBPS_REGSPEC;
10039 break;
10040 case DRX_OOB_MODE_B_GRADE_A:
10041 if (
10042
10043 ((oob_param->spectrum_inverted == true) &&
10044
10045 (!mirror_freq_spect_oob)) |
10046
10047
10048 ((oob_param->spectrum_inverted == false) &&
10049
10050 (mirror_freq_spect_oob))
10051 )
10052 set_param_parameters[0] =
10053 SCU_RAM_ORX_RF_RX_DATA_RATE_1544KBPS_INVSPEC;
10054 else
10055 set_param_parameters[0] =
10056 SCU_RAM_ORX_RF_RX_DATA_RATE_1544KBPS_REGSPEC;
10057 break;
10058 case DRX_OOB_MODE_B_GRADE_B:
10059 default:
10060 if (
10061
10062 ((oob_param->spectrum_inverted == true) &&
10063
10064 (!mirror_freq_spect_oob)) |
10065
10066
10067 ((oob_param->spectrum_inverted == false) &&
10068
10069 (mirror_freq_spect_oob))
10070 )
10071 set_param_parameters[0] =
10072 SCU_RAM_ORX_RF_RX_DATA_RATE_3088KBPS_INVSPEC;
10073 else
10074 set_param_parameters[0] =
10075 SCU_RAM_ORX_RF_RX_DATA_RATE_3088KBPS_REGSPEC;
10076 break;
10077 }
10078 set_param_parameters[1] = (u16) (freq & 0xFFFF);
10079 set_param_parameters[2] = trk_filter_value;
10080 scu_cmd.parameter = set_param_parameters;
10081 scu_cmd.result_len = 1;
10082 scu_cmd.result = cmd_result;
10083 mode_index = mode_val[(set_param_parameters[0] & 0xC0) >> 6];
10084 rc = scu_command(dev_addr, &scu_cmd);
10085 if (rc != 0) {
10086 pr_err("error %d\n", rc);
10087 goto rw_error;
10088 }
10089
10090 rc = drxj_dap_write_reg16(dev_addr, SIO_TOP_COMM_KEY__A, 0xFABA, 0);
10091 if (rc != 0) {
10092 pr_err("error %d\n", rc);
10093 goto rw_error;
10094 }
10095 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_OOB_CRX_CFG__A, OOB_CRX_DRIVE_STRENGTH << SIO_PDR_OOB_CRX_CFG_DRIVE__B | 0x03 << SIO_PDR_OOB_CRX_CFG_MODE__B, 0);
10096 if (rc != 0) {
10097 pr_err("error %d\n", rc);
10098 goto rw_error;
10099 }
10100 rc = drxj_dap_write_reg16(dev_addr, SIO_PDR_OOB_DRX_CFG__A, OOB_DRX_DRIVE_STRENGTH << SIO_PDR_OOB_DRX_CFG_DRIVE__B | 0x03 << SIO_PDR_OOB_DRX_CFG_MODE__B, 0);
10101 if (rc != 0) {
10102 pr_err("error %d\n", rc);
10103 goto rw_error;
10104 }
10105 rc = drxj_dap_write_reg16(dev_addr, SIO_TOP_COMM_KEY__A, 0x0000, 0);
10106 if (rc != 0) {
10107 pr_err("error %d\n", rc);
10108 goto rw_error;
10109 }
10110
10111 rc = drxj_dap_write_reg16(dev_addr, ORX_TOP_COMM_KEY__A, 0, 0);
10112 if (rc != 0) {
10113 pr_err("error %d\n", rc);
10114 goto rw_error;
10115 }
10116 rc = drxj_dap_write_reg16(dev_addr, ORX_FWP_AAG_LEN_W__A, 16000, 0);
10117 if (rc != 0) {
10118 pr_err("error %d\n", rc);
10119 goto rw_error;
10120 }
10121 rc = drxj_dap_write_reg16(dev_addr, ORX_FWP_AAG_THR_W__A, 40, 0);
10122 if (rc != 0) {
10123 pr_err("error %d\n", rc);
10124 goto rw_error;
10125 }
10126
10127
10128 rc = drxj_dap_write_reg16(dev_addr, ORX_DDC_OFO_SET_W__A, ORX_DDC_OFO_SET_W__PRE, 0);
10129 if (rc != 0) {
10130 pr_err("error %d\n", rc);
10131 goto rw_error;
10132 }
10133
10134
10135 rc = drxj_dap_write_reg16(dev_addr, ORX_NSU_AOX_LOPOW_W__A, ext_attr->oob_lo_pow, 0);
10136 if (rc != 0) {
10137 pr_err("error %d\n", rc);
10138 goto rw_error;
10139 }
10140
10141
10142 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_TARGET_MODE__A, SCU_RAM_ORX_TARGET_MODE_2048KBPS_SQRT, 0);
10143 if (rc != 0) {
10144 pr_err("error %d\n", rc);
10145 goto rw_error;
10146 }
10147 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_FREQ_GAIN_CORR__A, SCU_RAM_ORX_FREQ_GAIN_CORR_2048KBPS, 0);
10148 if (rc != 0) {
10149 pr_err("error %d\n", rc);
10150 goto rw_error;
10151 }
10152
10153
10154 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_RST_CPH__A, 0x0001, 0);
10155 if (rc != 0) {
10156 pr_err("error %d\n", rc);
10157 goto rw_error;
10158 }
10159 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_RST_CTI__A, 0x0002, 0);
10160 if (rc != 0) {
10161 pr_err("error %d\n", rc);
10162 goto rw_error;
10163 }
10164 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_RST_KRN__A, 0x0004, 0);
10165 if (rc != 0) {
10166 pr_err("error %d\n", rc);
10167 goto rw_error;
10168 }
10169 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_RST_KRP__A, 0x0008, 0);
10170 if (rc != 0) {
10171 pr_err("error %d\n", rc);
10172 goto rw_error;
10173 }
10174
10175
10176 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_AGN_LOCK_TH__A, 2048 >> 3, 0);
10177 if (rc != 0) {
10178 pr_err("error %d\n", rc);
10179 goto rw_error;
10180 }
10181 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_AGN_LOCK_TOTH__A, (u16)(-2048), 0);
10182 if (rc != 0) {
10183 pr_err("error %d\n", rc);
10184 goto rw_error;
10185 }
10186 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_AGN_ONLOCK_TTH__A, 8, 0);
10187 if (rc != 0) {
10188 pr_err("error %d\n", rc);
10189 goto rw_error;
10190 }
10191 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_AGN_UNLOCK_TTH__A, (u16)(-8), 0);
10192 if (rc != 0) {
10193 pr_err("error %d\n", rc);
10194 goto rw_error;
10195 }
10196 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_AGN_LOCK_MASK__A, 1, 0);
10197 if (rc != 0) {
10198 pr_err("error %d\n", rc);
10199 goto rw_error;
10200 }
10201
10202
10203 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_DGN_LOCK_TH__A, 10, 0);
10204 if (rc != 0) {
10205 pr_err("error %d\n", rc);
10206 goto rw_error;
10207 }
10208 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_DGN_LOCK_TOTH__A, (u16)(-2048), 0);
10209 if (rc != 0) {
10210 pr_err("error %d\n", rc);
10211 goto rw_error;
10212 }
10213 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_DGN_ONLOCK_TTH__A, 8, 0);
10214 if (rc != 0) {
10215 pr_err("error %d\n", rc);
10216 goto rw_error;
10217 }
10218 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_DGN_UNLOCK_TTH__A, (u16)(-8), 0);
10219 if (rc != 0) {
10220 pr_err("error %d\n", rc);
10221 goto rw_error;
10222 }
10223 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_DGN_LOCK_MASK__A, 1 << 1, 0);
10224 if (rc != 0) {
10225 pr_err("error %d\n", rc);
10226 goto rw_error;
10227 }
10228
10229
10230 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_FRQ_LOCK_TH__A, 17, 0);
10231 if (rc != 0) {
10232 pr_err("error %d\n", rc);
10233 goto rw_error;
10234 }
10235 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_FRQ_LOCK_TOTH__A, (u16)(-2048), 0);
10236 if (rc != 0) {
10237 pr_err("error %d\n", rc);
10238 goto rw_error;
10239 }
10240 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_FRQ_ONLOCK_TTH__A, 8, 0);
10241 if (rc != 0) {
10242 pr_err("error %d\n", rc);
10243 goto rw_error;
10244 }
10245 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_FRQ_UNLOCK_TTH__A, (u16)(-8), 0);
10246 if (rc != 0) {
10247 pr_err("error %d\n", rc);
10248 goto rw_error;
10249 }
10250 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_FRQ_LOCK_MASK__A, 1 << 2, 0);
10251 if (rc != 0) {
10252 pr_err("error %d\n", rc);
10253 goto rw_error;
10254 }
10255
10256
10257 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_PHA_LOCK_TH__A, 3000, 0);
10258 if (rc != 0) {
10259 pr_err("error %d\n", rc);
10260 goto rw_error;
10261 }
10262 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_PHA_LOCK_TOTH__A, (u16)(-2048), 0);
10263 if (rc != 0) {
10264 pr_err("error %d\n", rc);
10265 goto rw_error;
10266 }
10267 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_PHA_ONLOCK_TTH__A, 8, 0);
10268 if (rc != 0) {
10269 pr_err("error %d\n", rc);
10270 goto rw_error;
10271 }
10272 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_PHA_UNLOCK_TTH__A, (u16)(-8), 0);
10273 if (rc != 0) {
10274 pr_err("error %d\n", rc);
10275 goto rw_error;
10276 }
10277 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_PHA_LOCK_MASK__A, 1 << 3, 0);
10278 if (rc != 0) {
10279 pr_err("error %d\n", rc);
10280 goto rw_error;
10281 }
10282
10283
10284 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_TIM_LOCK_TH__A, 400, 0);
10285 if (rc != 0) {
10286 pr_err("error %d\n", rc);
10287 goto rw_error;
10288 }
10289 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_TIM_LOCK_TOTH__A, (u16)(-2048), 0);
10290 if (rc != 0) {
10291 pr_err("error %d\n", rc);
10292 goto rw_error;
10293 }
10294 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_TIM_ONLOCK_TTH__A, 8, 0);
10295 if (rc != 0) {
10296 pr_err("error %d\n", rc);
10297 goto rw_error;
10298 }
10299 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_TIM_UNLOCK_TTH__A, (u16)(-8), 0);
10300 if (rc != 0) {
10301 pr_err("error %d\n", rc);
10302 goto rw_error;
10303 }
10304 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_TIM_LOCK_MASK__A, 1 << 4, 0);
10305 if (rc != 0) {
10306 pr_err("error %d\n", rc);
10307 goto rw_error;
10308 }
10309
10310
10311 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_EQU_LOCK_TH__A, 20, 0);
10312 if (rc != 0) {
10313 pr_err("error %d\n", rc);
10314 goto rw_error;
10315 }
10316 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_EQU_LOCK_TOTH__A, (u16)(-2048), 0);
10317 if (rc != 0) {
10318 pr_err("error %d\n", rc);
10319 goto rw_error;
10320 }
10321 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_EQU_ONLOCK_TTH__A, 4, 0);
10322 if (rc != 0) {
10323 pr_err("error %d\n", rc);
10324 goto rw_error;
10325 }
10326 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_EQU_UNLOCK_TTH__A, (u16)(-4), 0);
10327 if (rc != 0) {
10328 pr_err("error %d\n", rc);
10329 goto rw_error;
10330 }
10331 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_ORX_EQU_LOCK_MASK__A, 1 << 5, 0);
10332 if (rc != 0) {
10333 pr_err("error %d\n", rc);
10334 goto rw_error;
10335 }
10336
10337
10338 rc = drxdap_fasi_write_block(dev_addr, ORX_FWP_PFI_A_W__A, sizeof(pfi_coeffs[mode_index]), ((u8 *)pfi_coeffs[mode_index]), 0);
10339 if (rc != 0) {
10340 pr_err("error %d\n", rc);
10341 goto rw_error;
10342 }
10343 rc = drxj_dap_write_reg16(dev_addr, ORX_TOP_MDE_W__A, mode_index, 0);
10344 if (rc != 0) {
10345 pr_err("error %d\n", rc);
10346 goto rw_error;
10347 }
10348
10349
10350 for (i = 0; i < (NYQFILTERLEN + 1) / 2; i++) {
10351 rc = drxj_dap_write_reg16(dev_addr, ORX_FWP_NYQ_ADR_W__A, i, 0);
10352 if (rc != 0) {
10353 pr_err("error %d\n", rc);
10354 goto rw_error;
10355 }
10356 rc = drxj_dap_write_reg16(dev_addr, ORX_FWP_NYQ_COF_RW__A, nyquist_coeffs[mode_index][i], 0);
10357 if (rc != 0) {
10358 pr_err("error %d\n", rc);
10359 goto rw_error;
10360 }
10361 }
10362 rc = drxj_dap_write_reg16(dev_addr, ORX_FWP_NYQ_ADR_W__A, 31, 0);
10363 if (rc != 0) {
10364 pr_err("error %d\n", rc);
10365 goto rw_error;
10366 }
10367 rc = drxj_dap_write_reg16(dev_addr, ORX_COMM_EXEC__A, ORX_COMM_EXEC_ACTIVE, 0);
10368 if (rc != 0) {
10369 pr_err("error %d\n", rc);
10370 goto rw_error;
10371 }
10372
10373
10374
10375 scu_cmd.command = SCU_RAM_COMMAND_STANDARD_OOB
10376 | SCU_RAM_COMMAND_CMD_DEMOD_START;
10377 scu_cmd.parameter_len = 0;
10378 scu_cmd.result_len = 1;
10379 scu_cmd.result = cmd_result;
10380 rc = scu_command(dev_addr, &scu_cmd);
10381 if (rc != 0) {
10382 pr_err("error %d\n", rc);
10383 goto rw_error;
10384 }
10385
10386 rc = set_orx_nsu_aox(demod, true);
10387 if (rc != 0) {
10388 pr_err("error %d\n", rc);
10389 goto rw_error;
10390 }
10391 rc = drxj_dap_write_reg16(dev_addr, ORX_NSU_AOX_STHR_W__A, ext_attr->oob_pre_saw, 0);
10392 if (rc != 0) {
10393 pr_err("error %d\n", rc);
10394 goto rw_error;
10395 }
10396
10397 ext_attr->oob_power_on = true;
10398
10399 return 0;
10400rw_error:
10401 return rc;
10402}
10403
10404
10405
10406
10407
10408
10409
10410
10411
10412
10413
10414
10415
10416
10417
10418
10419
10420
10421
10422
10423
10424
10425
10426static int
10427ctrl_set_channel(struct drx_demod_instance *demod, struct drx_channel *channel)
10428{
10429 int rc;
10430 s32 tuner_freq_offset = 0;
10431 struct drxj_data *ext_attr = NULL;
10432 struct i2c_device_addr *dev_addr = NULL;
10433 enum drx_standard standard = DRX_STANDARD_UNKNOWN;
10434#ifndef DRXJ_VSB_ONLY
10435 u32 min_symbol_rate = 0;
10436 u32 max_symbol_rate = 0;
10437 int bandwidth_temp = 0;
10438 int bandwidth = 0;
10439#endif
10440
10441 if ((demod == NULL) || (channel == NULL))
10442 return -EINVAL;
10443
10444 dev_addr = demod->my_i2c_dev_addr;
10445 ext_attr = (struct drxj_data *) demod->my_ext_attr;
10446 standard = ext_attr->standard;
10447
10448
10449 switch (standard) {
10450 case DRX_STANDARD_8VSB:
10451#ifndef DRXJ_VSB_ONLY
10452 case DRX_STANDARD_ITU_A:
10453 case DRX_STANDARD_ITU_B:
10454 case DRX_STANDARD_ITU_C:
10455#endif
10456 break;
10457 case DRX_STANDARD_UNKNOWN:
10458 default:
10459 return -EINVAL;
10460 }
10461
10462
10463 if ((standard == DRX_STANDARD_ITU_B) ||
10464 (standard == DRX_STANDARD_8VSB) ||
10465 (standard == DRX_STANDARD_NTSC)) {
10466 switch (channel->bandwidth) {
10467 case DRX_BANDWIDTH_6MHZ:
10468 case DRX_BANDWIDTH_UNKNOWN:
10469 channel->bandwidth = DRX_BANDWIDTH_6MHZ;
10470 break;
10471 case DRX_BANDWIDTH_8MHZ:
10472 case DRX_BANDWIDTH_7MHZ:
10473 default:
10474 return -EINVAL;
10475 }
10476 }
10477
10478
10479
10480
10481
10482#ifndef DRXJ_VSB_ONLY
10483 if ((standard == DRX_STANDARD_ITU_A) ||
10484 (standard == DRX_STANDARD_ITU_C)) {
10485 struct drxuio_cfg uio_cfg = { DRX_UIO1, DRX_UIO_MODE_FIRMWARE_SAW };
10486 int bw_rolloff_factor = 0;
10487
10488 bw_rolloff_factor = (standard == DRX_STANDARD_ITU_A) ? 115 : 113;
10489 min_symbol_rate = DRXJ_QAM_SYMBOLRATE_MIN;
10490 max_symbol_rate = DRXJ_QAM_SYMBOLRATE_MAX;
10491
10492 rc = ctrl_set_uio_cfg(demod, &uio_cfg);
10493 if (rc != 0) {
10494 pr_err("error %d\n", rc);
10495 goto rw_error;
10496 }
10497
10498 if (channel->symbolrate < min_symbol_rate ||
10499 channel->symbolrate > max_symbol_rate) {
10500 return -EINVAL;
10501 }
10502
10503 switch (channel->constellation) {
10504 case DRX_CONSTELLATION_QAM16:
10505 case DRX_CONSTELLATION_QAM32:
10506 case DRX_CONSTELLATION_QAM64:
10507 case DRX_CONSTELLATION_QAM128:
10508 case DRX_CONSTELLATION_QAM256:
10509 bandwidth_temp = channel->symbolrate * bw_rolloff_factor;
10510 bandwidth = bandwidth_temp / 100;
10511
10512 if ((bandwidth_temp % 100) >= 50)
10513 bandwidth++;
10514
10515 if (bandwidth <= 6100000) {
10516 channel->bandwidth = DRX_BANDWIDTH_6MHZ;
10517 } else if ((bandwidth > 6100000)
10518 && (bandwidth <= 7100000)) {
10519 channel->bandwidth = DRX_BANDWIDTH_7MHZ;
10520 } else if (bandwidth > 7100000) {
10521 channel->bandwidth = DRX_BANDWIDTH_8MHZ;
10522 }
10523 break;
10524 default:
10525 return -EINVAL;
10526 }
10527 }
10528
10529
10530
10531
10532 if (standard == DRX_STANDARD_ITU_B) {
10533 switch (channel->constellation) {
10534 case DRX_CONSTELLATION_AUTO:
10535 case DRX_CONSTELLATION_QAM256:
10536 case DRX_CONSTELLATION_QAM64:
10537 break;
10538 default:
10539 return -EINVAL;
10540 }
10541
10542 switch (channel->interleavemode) {
10543 case DRX_INTERLEAVEMODE_I128_J1:
10544 case DRX_INTERLEAVEMODE_I128_J1_V2:
10545 case DRX_INTERLEAVEMODE_I128_J2:
10546 case DRX_INTERLEAVEMODE_I64_J2:
10547 case DRX_INTERLEAVEMODE_I128_J3:
10548 case DRX_INTERLEAVEMODE_I32_J4:
10549 case DRX_INTERLEAVEMODE_I128_J4:
10550 case DRX_INTERLEAVEMODE_I16_J8:
10551 case DRX_INTERLEAVEMODE_I128_J5:
10552 case DRX_INTERLEAVEMODE_I8_J16:
10553 case DRX_INTERLEAVEMODE_I128_J6:
10554 case DRX_INTERLEAVEMODE_I128_J7:
10555 case DRX_INTERLEAVEMODE_I128_J8:
10556 case DRX_INTERLEAVEMODE_I12_J17:
10557 case DRX_INTERLEAVEMODE_I5_J4:
10558 case DRX_INTERLEAVEMODE_B52_M240:
10559 case DRX_INTERLEAVEMODE_B52_M720:
10560 case DRX_INTERLEAVEMODE_UNKNOWN:
10561 case DRX_INTERLEAVEMODE_AUTO:
10562 break;
10563 default:
10564 return -EINVAL;
10565 }
10566 }
10567
10568 if ((ext_attr->uio_sma_tx_mode) == DRX_UIO_MODE_FIRMWARE_SAW) {
10569
10570 struct drxuio_data uio1 = { DRX_UIO1, false };
10571
10572 switch (channel->bandwidth) {
10573 case DRX_BANDWIDTH_8MHZ:
10574 uio1.value = true;
10575 break;
10576 case DRX_BANDWIDTH_7MHZ:
10577 uio1.value = false;
10578 break;
10579 case DRX_BANDWIDTH_6MHZ:
10580 uio1.value = false;
10581 break;
10582 case DRX_BANDWIDTH_UNKNOWN:
10583 default:
10584 return -EINVAL;
10585 }
10586
10587 rc = ctrl_uio_write(demod, &uio1);
10588 if (rc != 0) {
10589 pr_err("error %d\n", rc);
10590 goto rw_error;
10591 }
10592 }
10593#endif
10594 rc = drxj_dap_write_reg16(dev_addr, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE, 0);
10595 if (rc != 0) {
10596 pr_err("error %d\n", rc);
10597 goto rw_error;
10598 }
10599
10600 tuner_freq_offset = 0;
10601
10602
10603 switch (standard) {
10604 case DRX_STANDARD_8VSB:
10605 if (channel->mirror == DRX_MIRROR_AUTO)
10606 ext_attr->mirror = DRX_MIRROR_NO;
10607 else
10608 ext_attr->mirror = channel->mirror;
10609 rc = set_vsb(demod);
10610 if (rc != 0) {
10611 pr_err("error %d\n", rc);
10612 goto rw_error;
10613 }
10614 rc = set_frequency(demod, channel, tuner_freq_offset);
10615 if (rc != 0) {
10616 pr_err("error %d\n", rc);
10617 goto rw_error;
10618 }
10619 break;
10620#ifndef DRXJ_VSB_ONLY
10621 case DRX_STANDARD_ITU_A:
10622 case DRX_STANDARD_ITU_B:
10623 case DRX_STANDARD_ITU_C:
10624 rc = set_qam_channel(demod, channel, tuner_freq_offset);
10625 if (rc != 0) {
10626 pr_err("error %d\n", rc);
10627 goto rw_error;
10628 }
10629 break;
10630#endif
10631 case DRX_STANDARD_UNKNOWN:
10632 default:
10633 return -EIO;
10634 }
10635
10636
10637 ext_attr->reset_pkt_err_acc = true;
10638
10639 return 0;
10640rw_error:
10641 return rc;
10642}
10643
10644
10645
10646
10647
10648
10649
10650
10651
10652
10653
10654
10655
10656
10657
10658
10659static int
10660ctrl_sig_quality(struct drx_demod_instance *demod,
10661 enum drx_lock_status lock_status)
10662{
10663 struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
10664 struct drxj_data *ext_attr = demod->my_ext_attr;
10665 struct drx39xxj_state *state = dev_addr->user_data;
10666 struct dtv_frontend_properties *p = &state->frontend.dtv_property_cache;
10667 enum drx_standard standard = ext_attr->standard;
10668 int rc;
10669 u32 ber, cnt, err, pkt;
10670 u16 mer, strength = 0;
10671
10672 rc = get_sig_strength(demod, &strength);
10673 if (rc < 0) {
10674 pr_err("error getting signal strength %d\n", rc);
10675 p->strength.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
10676 } else {
10677 p->strength.stat[0].scale = FE_SCALE_RELATIVE;
10678 p->strength.stat[0].uvalue = 65535UL * strength/ 100;
10679 }
10680
10681 switch (standard) {
10682 case DRX_STANDARD_8VSB:
10683#ifdef DRXJ_SIGNAL_ACCUM_ERR
10684 rc = get_acc_pkt_err(demod, &pkt);
10685 if (rc != 0) {
10686 pr_err("error %d\n", rc);
10687 goto rw_error;
10688 }
10689#endif
10690 if (lock_status != DRXJ_DEMOD_LOCK && lock_status != DRX_LOCKED) {
10691 p->pre_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
10692 p->pre_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
10693 p->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
10694 p->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
10695 p->block_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
10696 p->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
10697 p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
10698 } else {
10699 rc = get_vsb_post_rs_pck_err(dev_addr, &err, &pkt);
10700 if (rc != 0) {
10701 pr_err("error %d getting UCB\n", rc);
10702 p->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
10703 } else {
10704 p->block_error.stat[0].scale = FE_SCALE_COUNTER;
10705 p->block_error.stat[0].uvalue += err;
10706 p->block_count.stat[0].scale = FE_SCALE_COUNTER;
10707 p->block_count.stat[0].uvalue += pkt;
10708 }
10709
10710
10711 rc = get_vs_bpre_viterbi_ber(dev_addr, &ber, &cnt);
10712 if (rc != 0) {
10713 pr_err("error %d getting pre-ber\n", rc);
10714 p->pre_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
10715 } else {
10716 p->pre_bit_error.stat[0].scale = FE_SCALE_COUNTER;
10717 p->pre_bit_error.stat[0].uvalue += ber;
10718 p->pre_bit_count.stat[0].scale = FE_SCALE_COUNTER;
10719 p->pre_bit_count.stat[0].uvalue += cnt;
10720 }
10721
10722 rc = get_vs_bpost_viterbi_ber(dev_addr, &ber, &cnt);
10723 if (rc != 0) {
10724 pr_err("error %d getting post-ber\n", rc);
10725 p->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
10726 } else {
10727 p->post_bit_error.stat[0].scale = FE_SCALE_COUNTER;
10728 p->post_bit_error.stat[0].uvalue += ber;
10729 p->post_bit_count.stat[0].scale = FE_SCALE_COUNTER;
10730 p->post_bit_count.stat[0].uvalue += cnt;
10731 }
10732 rc = get_vsbmer(dev_addr, &mer);
10733 if (rc != 0) {
10734 pr_err("error %d getting MER\n", rc);
10735 p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
10736 } else {
10737 p->cnr.stat[0].svalue = mer * 100;
10738 p->cnr.stat[0].scale = FE_SCALE_DECIBEL;
10739 }
10740 }
10741 break;
10742#ifndef DRXJ_VSB_ONLY
10743 case DRX_STANDARD_ITU_A:
10744 case DRX_STANDARD_ITU_B:
10745 case DRX_STANDARD_ITU_C:
10746 rc = ctrl_get_qam_sig_quality(demod);
10747 if (rc != 0) {
10748 pr_err("error %d\n", rc);
10749 goto rw_error;
10750 }
10751 break;
10752#endif
10753 default:
10754 return -EIO;
10755 }
10756
10757 return 0;
10758rw_error:
10759 return rc;
10760}
10761
10762
10763
10764
10765
10766
10767
10768
10769
10770
10771
10772static int
10773ctrl_lock_status(struct drx_demod_instance *demod, enum drx_lock_status *lock_stat)
10774{
10775 enum drx_standard standard = DRX_STANDARD_UNKNOWN;
10776 struct drxj_data *ext_attr = NULL;
10777 struct i2c_device_addr *dev_addr = NULL;
10778 struct drxjscu_cmd cmd_scu = { 0,
10779 0,
10780 0,
10781 NULL,
10782 NULL
10783 };
10784 int rc;
10785 u16 cmd_result[2] = { 0, 0 };
10786 u16 demod_lock = SCU_RAM_PARAM_1_RES_DEMOD_GET_LOCK_DEMOD_LOCKED;
10787
10788
10789 if ((demod == NULL) || (lock_stat == NULL))
10790 return -EINVAL;
10791
10792 dev_addr = demod->my_i2c_dev_addr;
10793 ext_attr = (struct drxj_data *) demod->my_ext_attr;
10794 standard = ext_attr->standard;
10795
10796 *lock_stat = DRX_NOT_LOCKED;
10797
10798
10799 switch (standard) {
10800 case DRX_STANDARD_8VSB:
10801 cmd_scu.command = SCU_RAM_COMMAND_STANDARD_VSB |
10802 SCU_RAM_COMMAND_CMD_DEMOD_GET_LOCK;
10803 demod_lock |= 0x6;
10804 break;
10805#ifndef DRXJ_VSB_ONLY
10806 case DRX_STANDARD_ITU_A:
10807 case DRX_STANDARD_ITU_B:
10808 case DRX_STANDARD_ITU_C:
10809 cmd_scu.command = SCU_RAM_COMMAND_STANDARD_QAM |
10810 SCU_RAM_COMMAND_CMD_DEMOD_GET_LOCK;
10811 break;
10812#endif
10813 case DRX_STANDARD_UNKNOWN:
10814 default:
10815 return -EIO;
10816 }
10817
10818
10819 cmd_scu.parameter_len = 0;
10820 cmd_scu.result_len = 2;
10821 cmd_scu.parameter = NULL;
10822 cmd_scu.result = cmd_result;
10823 rc = scu_command(dev_addr, &cmd_scu);
10824 if (rc != 0) {
10825 pr_err("error %d\n", rc);
10826 goto rw_error;
10827 }
10828
10829
10830 if (cmd_scu.result[1] < demod_lock) {
10831
10832 *lock_stat = DRX_NOT_LOCKED;
10833 } else if (cmd_scu.result[1] < SCU_RAM_PARAM_1_RES_DEMOD_GET_LOCK_LOCKED) {
10834 *lock_stat = DRXJ_DEMOD_LOCK;
10835 } else if (cmd_scu.result[1] <
10836 SCU_RAM_PARAM_1_RES_DEMOD_GET_LOCK_NEVER_LOCK) {
10837
10838 *lock_stat = DRX_LOCKED;
10839 } else {
10840
10841
10842 *lock_stat = DRX_NEVER_LOCK;
10843 }
10844
10845 return 0;
10846rw_error:
10847 return rc;
10848}
10849
10850
10851
10852
10853
10854
10855
10856
10857
10858
10859
10860
10861
10862static int
10863ctrl_set_standard(struct drx_demod_instance *demod, enum drx_standard *standard)
10864{
10865 struct drxj_data *ext_attr = NULL;
10866 int rc;
10867 enum drx_standard prev_standard;
10868
10869
10870 if ((standard == NULL) || (demod == NULL))
10871 return -EINVAL;
10872
10873 ext_attr = (struct drxj_data *) demod->my_ext_attr;
10874 prev_standard = ext_attr->standard;
10875
10876
10877
10878
10879 switch (prev_standard) {
10880#ifndef DRXJ_VSB_ONLY
10881 case DRX_STANDARD_ITU_A:
10882 case DRX_STANDARD_ITU_B:
10883 case DRX_STANDARD_ITU_C:
10884 rc = power_down_qam(demod, false);
10885 if (rc != 0) {
10886 pr_err("error %d\n", rc);
10887 goto rw_error;
10888 }
10889 break;
10890#endif
10891 case DRX_STANDARD_8VSB:
10892 rc = power_down_vsb(demod, false);
10893 if (rc != 0) {
10894 pr_err("error %d\n", rc);
10895 goto rw_error;
10896 }
10897 break;
10898 case DRX_STANDARD_UNKNOWN:
10899
10900 break;
10901 case DRX_STANDARD_AUTO:
10902 default:
10903 return -EINVAL;
10904 }
10905
10906
10907
10908
10909
10910 ext_attr->standard = *standard;
10911
10912 switch (*standard) {
10913#ifndef DRXJ_VSB_ONLY
10914 case DRX_STANDARD_ITU_A:
10915 case DRX_STANDARD_ITU_B:
10916 case DRX_STANDARD_ITU_C:
10917 do {
10918 u16 dummy;
10919 rc = drxj_dap_read_reg16(demod->my_i2c_dev_addr, SCU_RAM_VERSION_HI__A, &dummy, 0);
10920 if (rc != 0) {
10921 pr_err("error %d\n", rc);
10922 goto rw_error;
10923 }
10924 } while (0);
10925 break;
10926#endif
10927 case DRX_STANDARD_8VSB:
10928 rc = set_vsb_leak_n_gain(demod);
10929 if (rc != 0) {
10930 pr_err("error %d\n", rc);
10931 goto rw_error;
10932 }
10933 break;
10934 default:
10935 ext_attr->standard = DRX_STANDARD_UNKNOWN;
10936 return -EINVAL;
10937 break;
10938 }
10939
10940 return 0;
10941rw_error:
10942
10943 ext_attr->standard = DRX_STANDARD_UNKNOWN;
10944 return rc;
10945}
10946
10947
10948
10949static void drxj_reset_mode(struct drxj_data *ext_attr)
10950{
10951
10952 if (ext_attr->has_lna) {
10953
10954#ifndef DRXJ_VSB_ONLY
10955 ext_attr->qam_if_agc_cfg.standard = DRX_STANDARD_ITU_B;
10956 ext_attr->qam_if_agc_cfg.ctrl_mode = DRX_AGC_CTRL_OFF;
10957 ext_attr->qam_pga_cfg = 140 + (11 * 13);
10958#endif
10959 ext_attr->vsb_if_agc_cfg.standard = DRX_STANDARD_8VSB;
10960 ext_attr->vsb_if_agc_cfg.ctrl_mode = DRX_AGC_CTRL_OFF;
10961 ext_attr->vsb_pga_cfg = 140 + (11 * 13);
10962 } else {
10963
10964#ifndef DRXJ_VSB_ONLY
10965 ext_attr->qam_if_agc_cfg.standard = DRX_STANDARD_ITU_B;
10966 ext_attr->qam_if_agc_cfg.ctrl_mode = DRX_AGC_CTRL_AUTO;
10967 ext_attr->qam_if_agc_cfg.min_output_level = 0;
10968 ext_attr->qam_if_agc_cfg.max_output_level = 0x7FFF;
10969 ext_attr->qam_if_agc_cfg.speed = 3;
10970 ext_attr->qam_if_agc_cfg.top = 1297;
10971 ext_attr->qam_pga_cfg = 140;
10972#endif
10973 ext_attr->vsb_if_agc_cfg.standard = DRX_STANDARD_8VSB;
10974 ext_attr->vsb_if_agc_cfg.ctrl_mode = DRX_AGC_CTRL_AUTO;
10975 ext_attr->vsb_if_agc_cfg.min_output_level = 0;
10976 ext_attr->vsb_if_agc_cfg.max_output_level = 0x7FFF;
10977 ext_attr->vsb_if_agc_cfg.speed = 3;
10978 ext_attr->vsb_if_agc_cfg.top = 1024;
10979 ext_attr->vsb_pga_cfg = 140;
10980 }
10981
10982
10983#ifndef DRXJ_VSB_ONLY
10984 ext_attr->qam_rf_agc_cfg.standard = DRX_STANDARD_ITU_B;
10985 ext_attr->qam_rf_agc_cfg.ctrl_mode = DRX_AGC_CTRL_AUTO;
10986 ext_attr->qam_rf_agc_cfg.min_output_level = 0;
10987 ext_attr->qam_rf_agc_cfg.max_output_level = 0x7FFF;
10988 ext_attr->qam_rf_agc_cfg.speed = 3;
10989 ext_attr->qam_rf_agc_cfg.top = 9500;
10990 ext_attr->qam_rf_agc_cfg.cut_off_current = 4000;
10991 ext_attr->qam_pre_saw_cfg.standard = DRX_STANDARD_ITU_B;
10992 ext_attr->qam_pre_saw_cfg.reference = 0x07;
10993 ext_attr->qam_pre_saw_cfg.use_pre_saw = true;
10994#endif
10995
10996 ext_attr->vsb_rf_agc_cfg.standard = DRX_STANDARD_8VSB;
10997 ext_attr->vsb_rf_agc_cfg.ctrl_mode = DRX_AGC_CTRL_AUTO;
10998 ext_attr->vsb_rf_agc_cfg.min_output_level = 0;
10999 ext_attr->vsb_rf_agc_cfg.max_output_level = 0x7FFF;
11000 ext_attr->vsb_rf_agc_cfg.speed = 3;
11001 ext_attr->vsb_rf_agc_cfg.top = 9500;
11002 ext_attr->vsb_rf_agc_cfg.cut_off_current = 4000;
11003 ext_attr->vsb_pre_saw_cfg.standard = DRX_STANDARD_8VSB;
11004 ext_attr->vsb_pre_saw_cfg.reference = 0x07;
11005 ext_attr->vsb_pre_saw_cfg.use_pre_saw = true;
11006}
11007
11008
11009
11010
11011
11012
11013
11014
11015
11016
11017
11018
11019
11020static int
11021ctrl_power_mode(struct drx_demod_instance *demod, enum drx_power_mode *mode)
11022{
11023 struct drx_common_attr *common_attr = (struct drx_common_attr *) NULL;
11024 struct drxj_data *ext_attr = (struct drxj_data *) NULL;
11025 struct i2c_device_addr *dev_addr = (struct i2c_device_addr *)NULL;
11026 int rc;
11027 u16 sio_cc_pwd_mode = 0;
11028
11029 common_attr = (struct drx_common_attr *) demod->my_common_attr;
11030 ext_attr = (struct drxj_data *) demod->my_ext_attr;
11031 dev_addr = demod->my_i2c_dev_addr;
11032
11033
11034 if (mode == NULL)
11035 return -EINVAL;
11036
11037
11038 if (common_attr->current_power_mode == *mode)
11039 return 0;
11040
11041 switch (*mode) {
11042 case DRX_POWER_UP:
11043 case DRXJ_POWER_DOWN_MAIN_PATH:
11044 sio_cc_pwd_mode = SIO_CC_PWD_MODE_LEVEL_NONE;
11045 break;
11046 case DRXJ_POWER_DOWN_CORE:
11047 sio_cc_pwd_mode = SIO_CC_PWD_MODE_LEVEL_CLOCK;
11048 break;
11049 case DRXJ_POWER_DOWN_PLL:
11050 sio_cc_pwd_mode = SIO_CC_PWD_MODE_LEVEL_PLL;
11051 break;
11052 case DRX_POWER_DOWN:
11053 sio_cc_pwd_mode = SIO_CC_PWD_MODE_LEVEL_OSC;
11054 break;
11055 default:
11056
11057 return -EINVAL;
11058 break;
11059 }
11060
11061
11062 if ((common_attr->current_power_mode != DRX_POWER_UP)) {
11063 rc = power_up_device(demod);
11064 if (rc != 0) {
11065 pr_err("error %d\n", rc);
11066 goto rw_error;
11067 }
11068 }
11069
11070 if ((*mode == DRX_POWER_UP)) {
11071
11072
11073
11074 drxj_reset_mode(ext_attr);
11075 } else {
11076
11077
11078
11079
11080
11081
11082
11083
11084
11085
11086
11087 switch (ext_attr->standard) {
11088 case DRX_STANDARD_ITU_A:
11089 case DRX_STANDARD_ITU_B:
11090 case DRX_STANDARD_ITU_C:
11091 rc = power_down_qam(demod, true);
11092 if (rc != 0) {
11093 pr_err("error %d\n", rc);
11094 goto rw_error;
11095 }
11096 break;
11097 case DRX_STANDARD_8VSB:
11098 rc = power_down_vsb(demod, true);
11099 if (rc != 0) {
11100 pr_err("error %d\n", rc);
11101 goto rw_error;
11102 }
11103 break;
11104 case DRX_STANDARD_PAL_SECAM_BG:
11105 case DRX_STANDARD_PAL_SECAM_DK:
11106 case DRX_STANDARD_PAL_SECAM_I:
11107 case DRX_STANDARD_PAL_SECAM_L:
11108 case DRX_STANDARD_PAL_SECAM_LP:
11109 case DRX_STANDARD_NTSC:
11110 case DRX_STANDARD_FM:
11111 rc = power_down_atv(demod, ext_attr->standard, true);
11112 if (rc != 0) {
11113 pr_err("error %d\n", rc);
11114 goto rw_error;
11115 }
11116 break;
11117 case DRX_STANDARD_UNKNOWN:
11118
11119 break;
11120 case DRX_STANDARD_AUTO:
11121 default:
11122 return -EIO;
11123 }
11124 ext_attr->standard = DRX_STANDARD_UNKNOWN;
11125 }
11126
11127 if (*mode != DRXJ_POWER_DOWN_MAIN_PATH) {
11128 rc = drxj_dap_write_reg16(dev_addr, SIO_CC_PWD_MODE__A, sio_cc_pwd_mode, 0);
11129 if (rc != 0) {
11130 pr_err("error %d\n", rc);
11131 goto rw_error;
11132 }
11133 rc = drxj_dap_write_reg16(dev_addr, SIO_CC_UPDATE__A, SIO_CC_UPDATE_KEY, 0);
11134 if (rc != 0) {
11135 pr_err("error %d\n", rc);
11136 goto rw_error;
11137 }
11138
11139 if ((*mode != DRX_POWER_UP)) {
11140
11141 rc = init_hi(demod);
11142 if (rc != 0) {
11143 pr_err("error %d\n", rc);
11144 goto rw_error;
11145 }
11146
11147 ext_attr->hi_cfg_ctrl |= SIO_HI_RA_RAM_PAR_5_CFG_SLEEP_ZZZ;
11148 rc = hi_cfg_command(demod);
11149 if (rc != 0) {
11150 pr_err("error %d\n", rc);
11151 goto rw_error;
11152 }
11153 }
11154 }
11155
11156 common_attr->current_power_mode = *mode;
11157
11158 return 0;
11159rw_error:
11160 return rc;
11161}
11162
11163
11164
11165
11166
11167
11168
11169
11170
11171
11172
11173
11174
11175
11176
11177
11178static int
11179ctrl_set_cfg_pre_saw(struct drx_demod_instance *demod, struct drxj_cfg_pre_saw *pre_saw)
11180{
11181 struct i2c_device_addr *dev_addr = NULL;
11182 struct drxj_data *ext_attr = NULL;
11183 int rc;
11184
11185 dev_addr = demod->my_i2c_dev_addr;
11186 ext_attr = (struct drxj_data *) demod->my_ext_attr;
11187
11188
11189 if ((pre_saw == NULL) || (pre_saw->reference > IQM_AF_PDREF__M)
11190 ) {
11191 return -EINVAL;
11192 }
11193
11194
11195 if ((ext_attr->standard == pre_saw->standard) ||
11196 (DRXJ_ISQAMSTD(ext_attr->standard) &&
11197 DRXJ_ISQAMSTD(pre_saw->standard)) ||
11198 (DRXJ_ISATVSTD(ext_attr->standard) &&
11199 DRXJ_ISATVSTD(pre_saw->standard))) {
11200 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_PDREF__A, pre_saw->reference, 0);
11201 if (rc != 0) {
11202 pr_err("error %d\n", rc);
11203 goto rw_error;
11204 }
11205 }
11206
11207
11208 switch (pre_saw->standard) {
11209 case DRX_STANDARD_8VSB:
11210 ext_attr->vsb_pre_saw_cfg = *pre_saw;
11211 break;
11212#ifndef DRXJ_VSB_ONLY
11213 case DRX_STANDARD_ITU_A:
11214 case DRX_STANDARD_ITU_B:
11215 case DRX_STANDARD_ITU_C:
11216 ext_attr->qam_pre_saw_cfg = *pre_saw;
11217 break;
11218#endif
11219 default:
11220 return -EINVAL;
11221 }
11222
11223 return 0;
11224rw_error:
11225 return rc;
11226}
11227
11228
11229
11230
11231
11232
11233
11234
11235
11236
11237
11238
11239
11240
11241static int
11242ctrl_set_cfg_afe_gain(struct drx_demod_instance *demod, struct drxj_cfg_afe_gain *afe_gain)
11243{
11244 struct i2c_device_addr *dev_addr = NULL;
11245 struct drxj_data *ext_attr = NULL;
11246 int rc;
11247 u8 gain = 0;
11248
11249
11250 if (afe_gain == NULL)
11251 return -EINVAL;
11252
11253 dev_addr = demod->my_i2c_dev_addr;
11254 ext_attr = (struct drxj_data *) demod->my_ext_attr;
11255
11256 switch (afe_gain->standard) {
11257 case DRX_STANDARD_8VSB:
11258#ifndef DRXJ_VSB_ONLY
11259 case DRX_STANDARD_ITU_A:
11260 case DRX_STANDARD_ITU_B:
11261 case DRX_STANDARD_ITU_C:
11262#endif
11263
11264 break;
11265 default:
11266 return -EINVAL;
11267 }
11268
11269
11270
11271
11272 if (afe_gain->gain >= 329)
11273 gain = 15;
11274 else if (afe_gain->gain <= 147)
11275 gain = 0;
11276 else
11277 gain = (afe_gain->gain - 140 + 6) / 13;
11278
11279
11280 if (ext_attr->standard == afe_gain->standard) {
11281 rc = drxj_dap_write_reg16(dev_addr, IQM_AF_PGA_GAIN__A, gain, 0);
11282 if (rc != 0) {
11283 pr_err("error %d\n", rc);
11284 goto rw_error;
11285 }
11286 }
11287
11288
11289 switch (afe_gain->standard) {
11290 case DRX_STANDARD_8VSB:
11291 ext_attr->vsb_pga_cfg = gain * 13 + 140;
11292 break;
11293#ifndef DRXJ_VSB_ONLY
11294 case DRX_STANDARD_ITU_A:
11295 case DRX_STANDARD_ITU_B:
11296 case DRX_STANDARD_ITU_C:
11297 ext_attr->qam_pga_cfg = gain * 13 + 140;
11298 break;
11299#endif
11300 default:
11301 return -EIO;
11302 }
11303
11304 return 0;
11305rw_error:
11306 return rc;
11307}
11308
11309
11310
11311
11312
11313
11314
11315static int drx_ctrl_u_code(struct drx_demod_instance *demod,
11316 struct drxu_code_info *mc_info,
11317 enum drxu_code_action action);
11318static int drxj_set_lna_state(struct drx_demod_instance *demod, bool state);
11319
11320
11321
11322
11323
11324
11325
11326
11327
11328
11329
11330
11331static int drxj_open(struct drx_demod_instance *demod)
11332{
11333 struct i2c_device_addr *dev_addr = NULL;
11334 struct drxj_data *ext_attr = NULL;
11335 struct drx_common_attr *common_attr = NULL;
11336 u32 driver_version = 0;
11337 struct drxu_code_info ucode_info;
11338 struct drx_cfg_mpeg_output cfg_mpeg_output;
11339 int rc;
11340 enum drx_power_mode power_mode = DRX_POWER_UP;
11341
11342 if ((demod == NULL) ||
11343 (demod->my_common_attr == NULL) ||
11344 (demod->my_ext_attr == NULL) ||
11345 (demod->my_i2c_dev_addr == NULL) ||
11346 (demod->my_common_attr->is_opened)) {
11347 return -EINVAL;
11348 }
11349
11350
11351 if (demod->my_ext_attr == NULL)
11352 return -EINVAL;
11353
11354 dev_addr = demod->my_i2c_dev_addr;
11355 ext_attr = (struct drxj_data *) demod->my_ext_attr;
11356 common_attr = (struct drx_common_attr *) demod->my_common_attr;
11357
11358 rc = ctrl_power_mode(demod, &power_mode);
11359 if (rc != 0) {
11360 pr_err("error %d\n", rc);
11361 goto rw_error;
11362 }
11363 if (power_mode != DRX_POWER_UP) {
11364 rc = -EINVAL;
11365 pr_err("failed to powerup device\n");
11366 goto rw_error;
11367 }
11368
11369
11370 rc = get_device_capabilities(demod);
11371 if (rc != 0) {
11372 pr_err("error %d\n", rc);
11373 goto rw_error;
11374 }
11375
11376
11377
11378
11379
11380
11381
11382
11383
11384 rc = drxj_dap_write_reg16(dev_addr, SIO_CC_SOFT_RST__A, (0x04 | SIO_CC_SOFT_RST_SYS__M | SIO_CC_SOFT_RST_OSC__M), 0);
11385 if (rc != 0) {
11386 pr_err("error %d\n", rc);
11387 goto rw_error;
11388 }
11389 rc = drxj_dap_write_reg16(dev_addr, SIO_CC_UPDATE__A, SIO_CC_UPDATE_KEY, 0);
11390 if (rc != 0) {
11391 pr_err("error %d\n", rc);
11392 goto rw_error;
11393 }
11394 msleep(1);
11395
11396
11397
11398 rc = drxj_dap_write_reg16(dev_addr, ATV_TOP_STDBY__A, (~ATV_TOP_STDBY_CVBS_STDBY_A2_ACTIVE) | ATV_TOP_STDBY_SIF_STDBY_STANDBY, 0);
11399 if (rc != 0) {
11400 pr_err("error %d\n", rc);
11401 goto rw_error;
11402 }
11403
11404 rc = set_iqm_af(demod, false);
11405 if (rc != 0) {
11406 pr_err("error %d\n", rc);
11407 goto rw_error;
11408 }
11409 rc = set_orx_nsu_aox(demod, false);
11410 if (rc != 0) {
11411 pr_err("error %d\n", rc);
11412 goto rw_error;
11413 }
11414
11415 rc = init_hi(demod);
11416 if (rc != 0) {
11417 pr_err("error %d\n", rc);
11418 goto rw_error;
11419 }
11420
11421
11422 memcpy(&cfg_mpeg_output, &common_attr->mpeg_cfg, sizeof(cfg_mpeg_output));
11423 cfg_mpeg_output.enable_mpeg_output = false;
11424
11425 rc = ctrl_set_cfg_mpeg_output(demod, &cfg_mpeg_output);
11426 if (rc != 0) {
11427 pr_err("error %d\n", rc);
11428 goto rw_error;
11429 }
11430
11431 rc = power_down_aud(demod);
11432 if (rc != 0) {
11433 pr_err("error %d\n", rc);
11434 goto rw_error;
11435 }
11436
11437 rc = drxj_dap_write_reg16(dev_addr, SCU_COMM_EXEC__A, SCU_COMM_EXEC_STOP, 0);
11438 if (rc != 0) {
11439 pr_err("error %d\n", rc);
11440 goto rw_error;
11441 }
11442
11443
11444 if (common_attr->microcode_file != NULL) {
11445
11446
11447 common_attr->is_opened = true;
11448 ucode_info.mc_file = common_attr->microcode_file;
11449
11450 if (DRX_ISPOWERDOWNMODE(demod->my_common_attr->current_power_mode)) {
11451 pr_err("Should powerup before loading the firmware.");
11452 return -EINVAL;
11453 }
11454
11455 rc = drx_ctrl_u_code(demod, &ucode_info, UCODE_UPLOAD);
11456 if (rc != 0) {
11457 pr_err("error %d while uploading the firmware\n", rc);
11458 goto rw_error;
11459 }
11460 if (common_attr->verify_microcode == true) {
11461 rc = drx_ctrl_u_code(demod, &ucode_info, UCODE_VERIFY);
11462 if (rc != 0) {
11463 pr_err("error %d while verifying the firmware\n",
11464 rc);
11465 goto rw_error;
11466 }
11467 }
11468 common_attr->is_opened = false;
11469 }
11470
11471
11472 rc = drxj_dap_write_reg16(dev_addr, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE, 0);
11473 if (rc != 0) {
11474 pr_err("error %d\n", rc);
11475 goto rw_error;
11476 }
11477
11478
11479 common_attr->scan_demod_lock_timeout = DRXJ_SCAN_TIMEOUT;
11480 common_attr->scan_desired_lock = DRX_LOCKED;
11481
11482 drxj_reset_mode(ext_attr);
11483 ext_attr->standard = DRX_STANDARD_UNKNOWN;
11484
11485 rc = smart_ant_init(demod);
11486 if (rc != 0) {
11487 pr_err("error %d\n", rc);
11488 goto rw_error;
11489 }
11490
11491
11492
11493
11494
11495 driver_version = (VERSION_MAJOR / 100) % 10;
11496 driver_version <<= 4;
11497 driver_version += (VERSION_MAJOR / 10) % 10;
11498 driver_version <<= 4;
11499 driver_version += (VERSION_MAJOR % 10);
11500 driver_version <<= 4;
11501 driver_version += (VERSION_MINOR % 10);
11502 driver_version <<= 4;
11503 driver_version += (VERSION_PATCH / 1000) % 10;
11504 driver_version <<= 4;
11505 driver_version += (VERSION_PATCH / 100) % 10;
11506 driver_version <<= 4;
11507 driver_version += (VERSION_PATCH / 10) % 10;
11508 driver_version <<= 4;
11509 driver_version += (VERSION_PATCH % 10);
11510 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_DRIVER_VER_HI__A, (u16)(driver_version >> 16), 0);
11511 if (rc != 0) {
11512 pr_err("error %d\n", rc);
11513 goto rw_error;
11514 }
11515 rc = drxj_dap_write_reg16(dev_addr, SCU_RAM_DRIVER_VER_LO__A, (u16)(driver_version & 0xFFFF), 0);
11516 if (rc != 0) {
11517 pr_err("error %d\n", rc);
11518 goto rw_error;
11519 }
11520
11521 rc = ctrl_set_oob(demod, NULL);
11522 if (rc != 0) {
11523 pr_err("error %d\n", rc);
11524 goto rw_error;
11525 }
11526
11527
11528 ext_attr->aud_data = drxj_default_aud_data_g;
11529
11530 demod->my_common_attr->is_opened = true;
11531 drxj_set_lna_state(demod, false);
11532 return 0;
11533rw_error:
11534 common_attr->is_opened = false;
11535 return rc;
11536}
11537
11538
11539
11540
11541
11542
11543
11544
11545static int drxj_close(struct drx_demod_instance *demod)
11546{
11547 struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
11548 int rc;
11549 enum drx_power_mode power_mode = DRX_POWER_UP;
11550
11551 if ((demod->my_common_attr == NULL) ||
11552 (demod->my_ext_attr == NULL) ||
11553 (demod->my_i2c_dev_addr == NULL) ||
11554 (!demod->my_common_attr->is_opened)) {
11555 return -EINVAL;
11556 }
11557
11558
11559 rc = ctrl_power_mode(demod, &power_mode);
11560 if (rc != 0) {
11561 pr_err("error %d\n", rc);
11562 goto rw_error;
11563 }
11564
11565 rc = drxj_dap_write_reg16(dev_addr, SCU_COMM_EXEC__A, SCU_COMM_EXEC_ACTIVE, 0);
11566 if (rc != 0) {
11567 pr_err("error %d\n", rc);
11568 goto rw_error;
11569 }
11570 power_mode = DRX_POWER_DOWN;
11571 rc = ctrl_power_mode(demod, &power_mode);
11572 if (rc != 0) {
11573 pr_err("error %d\n", rc);
11574 goto rw_error;
11575 }
11576
11577 DRX_ATTR_ISOPENED(demod) = false;
11578
11579 return 0;
11580rw_error:
11581 DRX_ATTR_ISOPENED(demod) = false;
11582
11583 return rc;
11584}
11585
11586
11587
11588
11589
11590
11591
11592
11593
11594
11595
11596
11597static u16 drx_u_code_compute_crc(u8 *block_data, u16 nr_words)
11598{
11599 u16 i = 0;
11600 u16 j = 0;
11601 u32 crc_word = 0;
11602 u32 carry = 0;
11603
11604 while (i < nr_words) {
11605 crc_word |= (u32)be16_to_cpu(*(__be16 *)(block_data));
11606 for (j = 0; j < 16; j++) {
11607 crc_word <<= 1;
11608 if (carry != 0)
11609 crc_word ^= 0x80050000UL;
11610 carry = crc_word & 0x80000000UL;
11611 }
11612 i++;
11613 block_data += (sizeof(u16));
11614 }
11615 return (u16)(crc_word >> 16);
11616}
11617
11618
11619
11620
11621
11622
11623
11624
11625static int drx_check_firmware(struct drx_demod_instance *demod, u8 *mc_data,
11626 unsigned size)
11627{
11628 struct drxu_code_block_hdr block_hdr;
11629 int i;
11630 unsigned count = 2 * sizeof(u16);
11631 u32 mc_dev_type, mc_version, mc_base_version;
11632 u16 mc_nr_of_blks = be16_to_cpu(*(__be16 *)(mc_data + sizeof(u16)));
11633
11634
11635
11636
11637
11638
11639
11640 DRX_ATTR_MCRECORD(demod).aux_type = 0;
11641 DRX_ATTR_MCRECORD(demod).mc_dev_type = 0;
11642 DRX_ATTR_MCRECORD(demod).mc_version = 0;
11643 DRX_ATTR_MCRECORD(demod).mc_base_version = 0;
11644
11645 for (i = 0; i < mc_nr_of_blks; i++) {
11646 if (count + 3 * sizeof(u16) + sizeof(u32) > size)
11647 goto eof;
11648
11649
11650 block_hdr.addr = be32_to_cpu(*(__be32 *)(mc_data + count));
11651 count += sizeof(u32);
11652 block_hdr.size = be16_to_cpu(*(__be16 *)(mc_data + count));
11653 count += sizeof(u16);
11654 block_hdr.flags = be16_to_cpu(*(__be16 *)(mc_data + count));
11655 count += sizeof(u16);
11656 block_hdr.CRC = be16_to_cpu(*(__be16 *)(mc_data + count));
11657 count += sizeof(u16);
11658
11659 pr_debug("%u: addr %u, size %u, flags 0x%04x, CRC 0x%04x\n",
11660 count, block_hdr.addr, block_hdr.size, block_hdr.flags,
11661 block_hdr.CRC);
11662
11663 if (block_hdr.flags & 0x8) {
11664 u8 *auxblk = ((void *)mc_data) + block_hdr.addr;
11665 u16 auxtype;
11666
11667 if (block_hdr.addr + sizeof(u16) > size)
11668 goto eof;
11669
11670 auxtype = be16_to_cpu(*(__be16 *)(auxblk));
11671
11672
11673 if (DRX_ISMCVERTYPE(auxtype)) {
11674 if (block_hdr.addr + 2 * sizeof(u16) + 2 * sizeof (u32) > size)
11675 goto eof;
11676
11677 auxblk += sizeof(u16);
11678 mc_dev_type = be32_to_cpu(*(__be32 *)(auxblk));
11679 auxblk += sizeof(u32);
11680 mc_version = be32_to_cpu(*(__be32 *)(auxblk));
11681 auxblk += sizeof(u32);
11682 mc_base_version = be32_to_cpu(*(__be32 *)(auxblk));
11683
11684 DRX_ATTR_MCRECORD(demod).aux_type = auxtype;
11685 DRX_ATTR_MCRECORD(demod).mc_dev_type = mc_dev_type;
11686 DRX_ATTR_MCRECORD(demod).mc_version = mc_version;
11687 DRX_ATTR_MCRECORD(demod).mc_base_version = mc_base_version;
11688
11689 pr_info("Firmware dev %x, ver %x, base ver %x\n",
11690 mc_dev_type, mc_version, mc_base_version);
11691
11692 }
11693 } else if (count + block_hdr.size * sizeof(u16) > size)
11694 goto eof;
11695
11696 count += block_hdr.size * sizeof(u16);
11697 }
11698 return 0;
11699eof:
11700 pr_err("Firmware is truncated at pos %u/%u\n", count, size);
11701 return -EINVAL;
11702}
11703
11704
11705
11706
11707
11708
11709
11710
11711
11712
11713
11714
11715
11716
11717
11718
11719
11720
11721
11722
11723static int drx_ctrl_u_code(struct drx_demod_instance *demod,
11724 struct drxu_code_info *mc_info,
11725 enum drxu_code_action action)
11726{
11727 struct i2c_device_addr *dev_addr = demod->my_i2c_dev_addr;
11728 int rc;
11729 u16 i = 0;
11730 u16 mc_nr_of_blks = 0;
11731 u16 mc_magic_word = 0;
11732 const u8 *mc_data_init = NULL;
11733 u8 *mc_data = NULL;
11734 unsigned size;
11735 char *mc_file;
11736
11737
11738 if (!mc_info || !mc_info->mc_file)
11739 return -EINVAL;
11740
11741 mc_file = mc_info->mc_file;
11742
11743 if (!demod->firmware) {
11744 const struct firmware *fw = NULL;
11745
11746 rc = request_firmware(&fw, mc_file, demod->i2c->dev.parent);
11747 if (rc < 0) {
11748 pr_err("Couldn't read firmware %s\n", mc_file);
11749 return rc;
11750 }
11751 demod->firmware = fw;
11752
11753 if (demod->firmware->size < 2 * sizeof(u16)) {
11754 rc = -EINVAL;
11755 pr_err("Firmware is too short!\n");
11756 goto release;
11757 }
11758
11759 pr_info("Firmware %s, size %zu\n",
11760 mc_file, demod->firmware->size);
11761 }
11762
11763 mc_data_init = demod->firmware->data;
11764 size = demod->firmware->size;
11765
11766 mc_data = (void *)mc_data_init;
11767
11768 mc_magic_word = be16_to_cpu(*(__be16 *)(mc_data));
11769 mc_data += sizeof(u16);
11770 mc_nr_of_blks = be16_to_cpu(*(__be16 *)(mc_data));
11771 mc_data += sizeof(u16);
11772
11773 if ((mc_magic_word != DRX_UCODE_MAGIC_WORD) || (mc_nr_of_blks == 0)) {
11774 rc = -EINVAL;
11775 pr_err("Firmware magic word doesn't match\n");
11776 goto release;
11777 }
11778
11779 if (action == UCODE_UPLOAD) {
11780 rc = drx_check_firmware(demod, (u8 *)mc_data_init, size);
11781 if (rc)
11782 goto release;
11783 pr_info("Uploading firmware %s\n", mc_file);
11784 } else {
11785 pr_info("Verifying if firmware upload was ok.\n");
11786 }
11787
11788
11789 for (i = 0; i < mc_nr_of_blks; i++) {
11790 struct drxu_code_block_hdr block_hdr;
11791 u16 mc_block_nr_bytes = 0;
11792
11793
11794 block_hdr.addr = be32_to_cpu(*(__be32 *)(mc_data));
11795 mc_data += sizeof(u32);
11796 block_hdr.size = be16_to_cpu(*(__be16 *)(mc_data));
11797 mc_data += sizeof(u16);
11798 block_hdr.flags = be16_to_cpu(*(__be16 *)(mc_data));
11799 mc_data += sizeof(u16);
11800 block_hdr.CRC = be16_to_cpu(*(__be16 *)(mc_data));
11801 mc_data += sizeof(u16);
11802
11803 pr_debug("%u: addr %u, size %u, flags 0x%04x, CRC 0x%04x\n",
11804 (unsigned)(mc_data - mc_data_init), block_hdr.addr,
11805 block_hdr.size, block_hdr.flags, block_hdr.CRC);
11806
11807
11808
11809
11810
11811 if ((block_hdr.size > 0x7FFF) ||
11812 (((block_hdr.flags & DRX_UCODE_CRC_FLAG) != 0) &&
11813 (block_hdr.CRC != drx_u_code_compute_crc(mc_data, block_hdr.size)))
11814 ) {
11815
11816 rc = -EINVAL;
11817 pr_err("firmware CRC is wrong\n");
11818 goto release;
11819 }
11820
11821 if (!block_hdr.size)
11822 continue;
11823
11824 mc_block_nr_bytes = block_hdr.size * ((u16) sizeof(u16));
11825
11826
11827 switch (action) {
11828 case UCODE_UPLOAD:
11829 if (drxdap_fasi_write_block(dev_addr,
11830 block_hdr.addr,
11831 mc_block_nr_bytes,
11832 mc_data, 0x0000)) {
11833 rc = -EIO;
11834 pr_err("error writing firmware at pos %u\n",
11835 (unsigned)(mc_data - mc_data_init));
11836 goto release;
11837 }
11838 break;
11839 case UCODE_VERIFY: {
11840 int result = 0;
11841 u8 mc_data_buffer[DRX_UCODE_MAX_BUF_SIZE];
11842 u32 bytes_to_comp = 0;
11843 u32 bytes_left = mc_block_nr_bytes;
11844 u32 curr_addr = block_hdr.addr;
11845 u8 *curr_ptr = mc_data;
11846
11847 while (bytes_left != 0) {
11848 if (bytes_left > DRX_UCODE_MAX_BUF_SIZE)
11849 bytes_to_comp = DRX_UCODE_MAX_BUF_SIZE;
11850 else
11851 bytes_to_comp = bytes_left;
11852
11853 if (drxdap_fasi_read_block(dev_addr,
11854 curr_addr,
11855 (u16)bytes_to_comp,
11856 (u8 *)mc_data_buffer,
11857 0x0000)) {
11858 pr_err("error reading firmware at pos %u\n",
11859 (unsigned)(mc_data - mc_data_init));
11860 return -EIO;
11861 }
11862
11863 result = memcmp(curr_ptr, mc_data_buffer,
11864 bytes_to_comp);
11865
11866 if (result) {
11867 pr_err("error verifying firmware at pos %u\n",
11868 (unsigned)(mc_data - mc_data_init));
11869 return -EIO;
11870 }
11871
11872 curr_addr += ((dr_xaddr_t)(bytes_to_comp / 2));
11873 curr_ptr =&(curr_ptr[bytes_to_comp]);
11874 bytes_left -=((u32) bytes_to_comp);
11875 }
11876 break;
11877 }
11878 default:
11879 return -EINVAL;
11880 break;
11881
11882 }
11883 mc_data += mc_block_nr_bytes;
11884 }
11885
11886 return 0;
11887
11888release:
11889 release_firmware(demod->firmware);
11890 demod->firmware = NULL;
11891
11892 return rc;
11893}
11894
11895
11896static int drxj_set_lna_state(struct drx_demod_instance *demod, bool state)
11897{
11898 struct drxuio_cfg uio_cfg;
11899 struct drxuio_data uio_data;
11900 int result;
11901
11902 uio_cfg.uio = DRX_UIO1;
11903 uio_cfg.mode = DRX_UIO_MODE_READWRITE;
11904
11905 result = ctrl_set_uio_cfg(demod, &uio_cfg);
11906 if (result) {
11907 pr_err("Failed to setup LNA GPIO!\n");
11908 return result;
11909 }
11910
11911 uio_data.uio = DRX_UIO1;
11912 uio_data.value = state;
11913 result = ctrl_uio_write(demod, &uio_data);
11914 if (result != 0) {
11915 pr_err("Failed to %sable LNA!\n",
11916 state ? "en" : "dis");
11917 return result;
11918 }
11919 return 0;
11920}
11921
11922
11923
11924
11925
11926
11927
11928static int drx39xxj_set_powerstate(struct dvb_frontend *fe, int enable)
11929{
11930 struct drx39xxj_state *state = fe->demodulator_priv;
11931 struct drx_demod_instance *demod = state->demod;
11932 int result;
11933 enum drx_power_mode power_mode;
11934
11935 if (enable)
11936 power_mode = DRX_POWER_UP;
11937 else
11938 power_mode = DRX_POWER_DOWN;
11939
11940 result = ctrl_power_mode(demod, &power_mode);
11941 if (result != 0) {
11942 pr_err("Power state change failed\n");
11943 return 0;
11944 }
11945
11946 return 0;
11947}
11948
11949static int drx39xxj_read_status(struct dvb_frontend *fe, enum fe_status *status)
11950{
11951 struct drx39xxj_state *state = fe->demodulator_priv;
11952 struct drx_demod_instance *demod = state->demod;
11953 int result;
11954 enum drx_lock_status lock_status;
11955
11956 *status = 0;
11957
11958 result = ctrl_lock_status(demod, &lock_status);
11959 if (result != 0) {
11960 pr_err("drx39xxj: could not get lock status!\n");
11961 *status = 0;
11962 }
11963
11964 switch (lock_status) {
11965 case DRX_NEVER_LOCK:
11966 *status = 0;
11967 pr_err("drx says NEVER_LOCK\n");
11968 break;
11969 case DRX_NOT_LOCKED:
11970 *status = 0;
11971 break;
11972 case DRX_LOCK_STATE_1:
11973 case DRX_LOCK_STATE_2:
11974 case DRX_LOCK_STATE_3:
11975 case DRX_LOCK_STATE_4:
11976 case DRX_LOCK_STATE_5:
11977 case DRX_LOCK_STATE_6:
11978 case DRX_LOCK_STATE_7:
11979 case DRX_LOCK_STATE_8:
11980 case DRX_LOCK_STATE_9:
11981 *status = FE_HAS_SIGNAL
11982 | FE_HAS_CARRIER | FE_HAS_VITERBI | FE_HAS_SYNC;
11983 break;
11984 case DRX_LOCKED:
11985 *status = FE_HAS_SIGNAL
11986 | FE_HAS_CARRIER
11987 | FE_HAS_VITERBI | FE_HAS_SYNC | FE_HAS_LOCK;
11988 break;
11989 default:
11990 pr_err("Lock state unknown %d\n", lock_status);
11991 }
11992 ctrl_sig_quality(demod, lock_status);
11993
11994 return 0;
11995}
11996
11997static int drx39xxj_read_ber(struct dvb_frontend *fe, u32 *ber)
11998{
11999 struct dtv_frontend_properties *p = &fe->dtv_property_cache;
12000
12001 if (p->pre_bit_error.stat[0].scale == FE_SCALE_NOT_AVAILABLE) {
12002 *ber = 0;
12003 return 0;
12004 }
12005
12006 if (!p->pre_bit_count.stat[0].uvalue) {
12007 if (!p->pre_bit_error.stat[0].uvalue)
12008 *ber = 0;
12009 else
12010 *ber = 1000000;
12011 } else {
12012 *ber = frac_times1e6(p->pre_bit_error.stat[0].uvalue,
12013 p->pre_bit_count.stat[0].uvalue);
12014 }
12015 return 0;
12016}
12017
12018static int drx39xxj_read_signal_strength(struct dvb_frontend *fe,
12019 u16 *strength)
12020{
12021 struct dtv_frontend_properties *p = &fe->dtv_property_cache;
12022
12023 if (p->strength.stat[0].scale == FE_SCALE_NOT_AVAILABLE) {
12024 *strength = 0;
12025 return 0;
12026 }
12027
12028 *strength = p->strength.stat[0].uvalue;
12029 return 0;
12030}
12031
12032static int drx39xxj_read_snr(struct dvb_frontend *fe, u16 *snr)
12033{
12034 struct dtv_frontend_properties *p = &fe->dtv_property_cache;
12035 u64 tmp64;
12036
12037 if (p->cnr.stat[0].scale == FE_SCALE_NOT_AVAILABLE) {
12038 *snr = 0;
12039 return 0;
12040 }
12041
12042 tmp64 = p->cnr.stat[0].svalue;
12043 do_div(tmp64, 10);
12044 *snr = tmp64;
12045 return 0;
12046}
12047
12048static int drx39xxj_read_ucblocks(struct dvb_frontend *fe, u32 *ucb)
12049{
12050 struct dtv_frontend_properties *p = &fe->dtv_property_cache;
12051
12052 if (p->block_error.stat[0].scale == FE_SCALE_NOT_AVAILABLE) {
12053 *ucb = 0;
12054 return 0;
12055 }
12056
12057 *ucb = p->block_error.stat[0].uvalue;
12058 return 0;
12059}
12060
12061static int drx39xxj_set_frontend(struct dvb_frontend *fe)
12062{
12063#ifdef DJH_DEBUG
12064 int i;
12065#endif
12066 struct dtv_frontend_properties *p = &fe->dtv_property_cache;
12067 struct drx39xxj_state *state = fe->demodulator_priv;
12068 struct drx_demod_instance *demod = state->demod;
12069 enum drx_standard standard = DRX_STANDARD_8VSB;
12070 struct drx_channel channel;
12071 int result;
12072 static const struct drx_channel def_channel = {
12073 0,
12074 DRX_BANDWIDTH_6MHZ,
12075 DRX_MIRROR_NO,
12076 DRX_CONSTELLATION_AUTO,
12077 DRX_HIERARCHY_UNKNOWN,
12078 DRX_PRIORITY_UNKNOWN,
12079 DRX_CODERATE_UNKNOWN,
12080 DRX_GUARD_UNKNOWN,
12081 DRX_FFTMODE_UNKNOWN,
12082 DRX_CLASSIFICATION_AUTO,
12083 5057000,
12084 DRX_INTERLEAVEMODE_UNKNOWN,
12085 DRX_LDPC_UNKNOWN,
12086 DRX_CARRIER_UNKNOWN,
12087 DRX_FRAMEMODE_UNKNOWN
12088 };
12089 u32 constellation = DRX_CONSTELLATION_AUTO;
12090
12091
12092 drx39xxj_set_powerstate(fe, 1);
12093
12094 if (fe->ops.tuner_ops.set_params) {
12095 u32 int_freq;
12096
12097 if (fe->ops.i2c_gate_ctrl)
12098 fe->ops.i2c_gate_ctrl(fe, 1);
12099
12100
12101 fe->ops.tuner_ops.set_params(fe);
12102
12103
12104 if (fe->ops.tuner_ops.get_if_frequency) {
12105 fe->ops.tuner_ops.get_if_frequency(fe, &int_freq);
12106 demod->my_common_attr->intermediate_freq = int_freq / 1000;
12107 }
12108
12109 if (fe->ops.i2c_gate_ctrl)
12110 fe->ops.i2c_gate_ctrl(fe, 0);
12111 }
12112
12113 switch (p->delivery_system) {
12114 case SYS_ATSC:
12115 standard = DRX_STANDARD_8VSB;
12116 break;
12117 case SYS_DVBC_ANNEX_B:
12118 standard = DRX_STANDARD_ITU_B;
12119
12120 switch (p->modulation) {
12121 case QAM_64:
12122 constellation = DRX_CONSTELLATION_QAM64;
12123 break;
12124 case QAM_256:
12125 constellation = DRX_CONSTELLATION_QAM256;
12126 break;
12127 default:
12128 constellation = DRX_CONSTELLATION_AUTO;
12129 break;
12130 }
12131 break;
12132 default:
12133 return -EINVAL;
12134 }
12135
12136 result = ctrl_set_standard(demod, &standard);
12137 if (result != 0) {
12138 pr_err("Failed to set standard! result=%02x\n",
12139 result);
12140 return -EINVAL;
12141 }
12142
12143
12144 channel = def_channel;
12145 channel.frequency = p->frequency / 1000;
12146 channel.bandwidth = DRX_BANDWIDTH_6MHZ;
12147 channel.constellation = constellation;
12148
12149
12150 result = ctrl_set_channel(demod, &channel);
12151 if (result != 0) {
12152 pr_err("Failed to set channel!\n");
12153 return -EINVAL;
12154 }
12155
12156 drxj_set_lna_state(demod, false);
12157
12158
12159 p->strength.stat[0].scale = FE_SCALE_RELATIVE;
12160
12161 return 0;
12162}
12163
12164static int drx39xxj_sleep(struct dvb_frontend *fe)
12165{
12166
12167 return drx39xxj_set_powerstate(fe, 0);
12168}
12169
12170static int drx39xxj_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
12171{
12172 struct drx39xxj_state *state = fe->demodulator_priv;
12173 struct drx_demod_instance *demod = state->demod;
12174 bool i2c_gate_state;
12175 int result;
12176
12177#ifdef DJH_DEBUG
12178 pr_debug("i2c gate call: enable=%d state=%d\n", enable,
12179 state->i2c_gate_open);
12180#endif
12181
12182 if (enable)
12183 i2c_gate_state = true;
12184 else
12185 i2c_gate_state = false;
12186
12187 if (state->i2c_gate_open == enable) {
12188
12189 return 0;
12190 }
12191
12192 result = ctrl_i2c_bridge(demod, &i2c_gate_state);
12193 if (result != 0) {
12194 pr_err("drx39xxj: could not open i2c gate [%d]\n",
12195 result);
12196 dump_stack();
12197 } else {
12198 state->i2c_gate_open = enable;
12199 }
12200 return 0;
12201}
12202
12203static int drx39xxj_init(struct dvb_frontend *fe)
12204{
12205 struct drx39xxj_state *state = fe->demodulator_priv;
12206 struct drx_demod_instance *demod = state->demod;
12207 int rc = 0;
12208
12209 if (fe->exit == DVB_FE_DEVICE_RESUME) {
12210
12211 demod->my_common_attr->is_opened = false;
12212 rc = drxj_open(demod);
12213 if (rc != 0)
12214 pr_err("drx39xxj_init(): DRX open failed rc=%d!\n", rc);
12215 } else
12216 drx39xxj_set_powerstate(fe, 1);
12217
12218 return rc;
12219}
12220
12221static int drx39xxj_set_lna(struct dvb_frontend *fe)
12222{
12223 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
12224 struct drx39xxj_state *state = fe->demodulator_priv;
12225 struct drx_demod_instance *demod = state->demod;
12226 struct drxj_data *ext_attr = demod->my_ext_attr;
12227
12228 if (c->lna) {
12229 if (!ext_attr->has_lna) {
12230 pr_err("LNA is not supported on this device!\n");
12231 return -EINVAL;
12232
12233 }
12234 }
12235
12236 return drxj_set_lna_state(demod, c->lna);
12237}
12238
12239static int drx39xxj_get_tune_settings(struct dvb_frontend *fe,
12240 struct dvb_frontend_tune_settings *tune)
12241{
12242 tune->min_delay_ms = 1000;
12243 return 0;
12244}
12245
12246static void drx39xxj_release(struct dvb_frontend *fe)
12247{
12248 struct drx39xxj_state *state = fe->demodulator_priv;
12249 struct drx_demod_instance *demod = state->demod;
12250
12251
12252 if (fe->exit != DVB_FE_DEVICE_REMOVED)
12253 drxj_close(demod);
12254
12255 kfree(demod->my_ext_attr);
12256 kfree(demod->my_common_attr);
12257 kfree(demod->my_i2c_dev_addr);
12258 release_firmware(demod->firmware);
12259 kfree(demod);
12260 kfree(state);
12261}
12262
12263static struct dvb_frontend_ops drx39xxj_ops;
12264
12265struct dvb_frontend *drx39xxj_attach(struct i2c_adapter *i2c)
12266{
12267 struct drx39xxj_state *state = NULL;
12268 struct i2c_device_addr *demod_addr = NULL;
12269 struct drx_common_attr *demod_comm_attr = NULL;
12270 struct drxj_data *demod_ext_attr = NULL;
12271 struct drx_demod_instance *demod = NULL;
12272 struct dtv_frontend_properties *p;
12273 int result;
12274
12275
12276 state = kzalloc(sizeof(struct drx39xxj_state), GFP_KERNEL);
12277 if (state == NULL)
12278 goto error;
12279
12280 demod = kmalloc(sizeof(struct drx_demod_instance), GFP_KERNEL);
12281 if (demod == NULL)
12282 goto error;
12283
12284 demod_addr = kmemdup(&drxj_default_addr_g,
12285 sizeof(struct i2c_device_addr), GFP_KERNEL);
12286 if (demod_addr == NULL)
12287 goto error;
12288
12289 demod_comm_attr = kmemdup(&drxj_default_comm_attr_g,
12290 sizeof(struct drx_common_attr), GFP_KERNEL);
12291 if (demod_comm_attr == NULL)
12292 goto error;
12293
12294 demod_ext_attr = kmemdup(&drxj_data_g, sizeof(struct drxj_data),
12295 GFP_KERNEL);
12296 if (demod_ext_attr == NULL)
12297 goto error;
12298
12299
12300 state->i2c = i2c;
12301 state->demod = demod;
12302
12303
12304 memcpy(demod, &drxj_default_demod_g, sizeof(struct drx_demod_instance));
12305
12306 demod->my_i2c_dev_addr = demod_addr;
12307 demod->my_common_attr = demod_comm_attr;
12308 demod->my_i2c_dev_addr->user_data = state;
12309 demod->my_common_attr->microcode_file = DRX39XX_MAIN_FIRMWARE;
12310 demod->my_common_attr->verify_microcode = true;
12311 demod->my_common_attr->intermediate_freq = 5000;
12312 demod->my_common_attr->current_power_mode = DRX_POWER_DOWN;
12313 demod->my_ext_attr = demod_ext_attr;
12314 ((struct drxj_data *)demod_ext_attr)->uio_sma_tx_mode = DRX_UIO_MODE_READWRITE;
12315 demod->i2c = i2c;
12316
12317 result = drxj_open(demod);
12318 if (result != 0) {
12319 pr_err("DRX open failed! Aborting\n");
12320 goto error;
12321 }
12322
12323
12324 memcpy(&state->frontend.ops, &drx39xxj_ops,
12325 sizeof(struct dvb_frontend_ops));
12326
12327 state->frontend.demodulator_priv = state;
12328
12329
12330 p = &state->frontend.dtv_property_cache;
12331 p->strength.len = 1;
12332 p->pre_bit_count.len = 1;
12333 p->pre_bit_error.len = 1;
12334 p->post_bit_count.len = 1;
12335 p->post_bit_error.len = 1;
12336 p->block_count.len = 1;
12337 p->block_error.len = 1;
12338 p->cnr.len = 1;
12339
12340 p->strength.stat[0].scale = FE_SCALE_RELATIVE;
12341 p->pre_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
12342 p->pre_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
12343 p->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
12344 p->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
12345 p->block_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
12346 p->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
12347 p->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
12348
12349 return &state->frontend;
12350
12351error:
12352 kfree(demod_ext_attr);
12353 kfree(demod_comm_attr);
12354 kfree(demod_addr);
12355 kfree(demod);
12356 kfree(state);
12357
12358 return NULL;
12359}
12360EXPORT_SYMBOL(drx39xxj_attach);
12361
12362static struct dvb_frontend_ops drx39xxj_ops = {
12363 .delsys = { SYS_ATSC, SYS_DVBC_ANNEX_B },
12364 .info = {
12365 .name = "Micronas DRX39xxj family Frontend",
12366 .frequency_stepsize = 62500,
12367 .frequency_min = 51000000,
12368 .frequency_max = 858000000,
12369 .caps = FE_CAN_QAM_64 | FE_CAN_QAM_256 | FE_CAN_8VSB
12370 },
12371
12372 .init = drx39xxj_init,
12373 .i2c_gate_ctrl = drx39xxj_i2c_gate_ctrl,
12374 .sleep = drx39xxj_sleep,
12375 .set_frontend = drx39xxj_set_frontend,
12376 .get_tune_settings = drx39xxj_get_tune_settings,
12377 .read_status = drx39xxj_read_status,
12378 .read_ber = drx39xxj_read_ber,
12379 .read_signal_strength = drx39xxj_read_signal_strength,
12380 .read_snr = drx39xxj_read_snr,
12381 .read_ucblocks = drx39xxj_read_ucblocks,
12382 .release = drx39xxj_release,
12383 .set_lna = drx39xxj_set_lna,
12384};
12385
12386MODULE_DESCRIPTION("Micronas DRX39xxj Frontend");
12387MODULE_AUTHOR("Devin Heitmueller");
12388MODULE_LICENSE("GPL");
12389MODULE_FIRMWARE(DRX39XX_MAIN_FIRMWARE);
12390