-
Notifications
You must be signed in to change notification settings - Fork 27
/
tda1997x-core.c
4605 lines (4095 loc) · 137 KB
/
tda1997x-core.c
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
/*
* Copyright (C) 2013 Gateworks Corporation
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* TODO
* - add gpio reset pin
* - add gpio pwrdn pin
* - document devicetree bindings
* - unload/reload module interrupts never fire (something not getting reset)
*/
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/slab.h>
#include <linux/device.h>
#include <linux/err.h>
#include <linux/gpio.h>
#include <linux/io.h>
#include <linux/clk.h>
#include <linux/spinlock.h>
#include <linux/irq.h>
#include <linux/interrupt.h>
#include <linux/of_device.h>
#include <linux/i2c.h>
#include <linux/sysfs.h>
#include <linux/delay.h>
#include <linux/regulator/consumer.h>
#include <linux/fsl_devices.h>
#include <linux/workqueue.h>
#include <linux/timer.h>
#include <linux/mfd/tda1997x-core.h>
#include <linux/time.h>
#include <drm/drm_edid.h>
#include <drm/drm_crtc.h>
/* Voltage regulators */
#define TDA1997X_VOLTAGE_DIGITAL_IO 3300000
#define TDA1997X_VOLTAGE_DIGITAL_CORE 1800000
#define TDA1997X_VOLTAGE_ANALOG 1800000
static struct regulator *dvddio_regulator;
static struct regulator *dvdd_regulator;
static struct regulator *avdd_regulator;
/* Page 0x00 */
#define REG_VERSION 0x0000
#define REG_INPUT_SEL 0x0001
#define REG_SERVICE_MODE 0x0002
#define REG_HPD_MAN_CTRL 0x0003
#define REG_RT_MAN_CTRL 0x0004
#define REG_STANDBY_SOFT_RST 0x000A
#define REG_HDMI_SOFT_RST 0x000B
#define REG_HDMI_INFO_RST 0x000C
#define REG_INT_FLG_CLR_TOP 0x000E
#define REG_INT_FLG_CLR_SUS 0x000F
#define REG_INT_FLG_CLR_DDC 0x0010
#define REG_INT_FLG_CLR_RATE 0x0011
#define REG_INT_FLG_CLR_MODE 0x0012
#define REG_INT_FLG_CLR_INFO 0x0013
#define REG_INT_FLG_CLR_AUDIO 0x0014
#define REG_INT_FLG_CLR_HDCP 0x0015
#define REG_INT_FLG_CLR_AFE 0x0016
#define REG_INT_MASK_TOP 0x0017
#define REG_INT_MASK_SUS 0x0018
#define REG_INT_MASK_DDC 0x0019
#define REG_INT_MASK_RATE 0x001A
#define REG_INT_MASK_MODE 0x001B
#define REG_INT_MASK_INFO 0x001C
#define REG_INT_MASK_AUDIO 0x001D
#define REG_INT_MASK_HDCP 0x001E
#define REG_INT_MASK_AFE 0x001F
#define REG_DETECT_5V 0x0020
#define REG_SUS_STATUS 0x0021
#define REG_V_PER 0x0022
#define REG_H_PER 0x0025
#define REG_HS_WIDTH 0x0027
#define REG_FMT_H_TOT 0x0029
#define REG_FMT_H_ACT 0x002b
#define REG_FMT_H_FRONT 0x002d
#define REG_FMT_H_SYNC 0x002f
#define REG_FMT_H_BACK 0x0031
#define REG_FMT_V_TOT 0x0033
#define REG_FMT_V_ACT 0x0035
#define REG_FMT_V_FRONT_F1 0x0037
#define REG_FMT_V_FRONT_F2 0x0038
#define REG_FMT_V_SYNC 0x0039
#define REG_FMT_V_BACK_F1 0x003a
#define REG_FMT_V_BACK_F2 0x003b
#define REG_FMT_DE_ACT 0x003c
#define REG_RATE_CTRL 0x0040
#define REG_CLK_MIN_RATE 0x0043
#define REG_CLK_MAX_RATE 0x0046
#define REG_CLK_A_STATUS 0x0049
#define REG_CLK_A_RATE 0x004A
#define REG_DRIFT_CLK_A_REG 0x004D
#define REG_CLK_B_STATUS 0x004E
#define REG_CLK_B_RATE 0x004F
#define REG_DRIFT_CLK_B_REG 0x0052
#define REG_HDCP_CTRL 0x0060
#define REG_HDCP_KDS 0x0061
#define REG_HDCP_BCAPS 0x0063
#define REG_HDCP_KEY_CTRL 0x0064
#define REG_INFO_CTRL 0x0076
#define REG_INFO_EXCEED 0x0077
#define REG_PIX_REPEAT 0x007B
#define REG_AUDIO_PATH 0x007C
#define REG_AUDIO_SEL 0x007D
#define REG_AUDIO_OUT_ENABLE 0x007E
#define REG_AUDIO_OUT_HIZ 0x007F
#define REG_VDP_CTRL 0x0080
#define REG_VHREF_CTRL 0x00A0
#define REG_PXCNT_PR 0x00A2
#define REG_PXCNT_NPIX 0x00A4
#define REG_LCNT_PR 0x00A6
#define REG_LCNT_NLIN 0x00A8
#define REG_HREF_S 0x00AA
#define REG_HREF_E 0x00AC
#define REG_HS_S 0x00AE
#define REG_HS_E 0x00B0
#define REG_VREF_F1_S 0x00B2
#define REG_VREF_F1_WIDTH 0x00B4
#define REG_VREF_F2_S 0x00B5
#define REG_VREF_F2_WIDTH 0x00B7
#define REG_VS_F1_LINE_S 0x00B8
#define REG_VS_F1_LINE_WIDTH 0x00BA
#define REG_VS_F2_LINE_S 0x00BB
#define REG_VS_F2_LINE_WIDTH 0x00BD
#define REG_VS_F1_PIX_S 0x00BE
#define REG_VS_F1_PIX_E 0x00C0
#define REG_VS_F2_PIX_S 0x00C2
#define REG_VS_F2_PIX_E 0x00C4
#define REG_FREF_F1_S 0x00C6
#define REG_FREF_F2_S 0x00C8
#define REG_FDW_S 0x00ca
#define REG_FDW_E 0x00cc
#define REG_BLK_GY 0x00da
#define REG_BLK_BU 0x00dc
#define REG_BLK_RV 0x00de
#define REG_FILTERS_CTRL 0x00e0
#define REG_DITHERING_CTRL 0x00E9
#define REG_OF_CTRL 0x00EA
#define REG_CLKOUT_CTRL 0x00EB
#define REG_HS_HREF_SEL 0x00EC
#define REG_VS_VREF_SEL 0x00ED
#define REG_DE_FREF_SEL 0x00EE
#define REG_VP35_32_CTRL 0x00EF
#define REG_VP31_28_CTRL 0x00F0
#define REG_VP27_24_CTRL 0x00F1
#define REG_VP23_20_CTRL 0x00F2
#define REG_VP19_16_CTRL 0x00F3
#define REG_VP15_12_CTRL 0x00F4
#define REG_VP11_08_CTRL 0x00F5
#define REG_VP07_04_CTRL 0x00F6
#define REG_VP03_00_CTRL 0x00F7
#define REG_CURPAGE_00H 0xFF
#define MASK_VPER 0x3fffff
#define MASK_HPER 0x0fff
#define MASK_HSWIDTH 0x03ff
/* Page 0x01 */
#define REG_HDMI_FLAGS 0x0100
#define REG_DEEP_COLOR_MODE 0x0101
#define REG_AUDIO_FLAGS 0x0108
#define REG_AUDIO_FREQ 0x0109
#define REG_ACP_PACKET_TYPE 0x0141
#define REG_ISRC1_PACKET_TYPE 0x0161
#define REG_ISRC2_PACKET_TYPE 0x0181
#define REG_GBD_PACKET_TYPE 0x01a1
#define ISRC_PACKET_HDR_LEN 3
#define ISRC_PACKET_DAT_LEN 16
#define GDB_PACKET_HDR_LEN 3
#define GDB_PACKET_DAT_LEN 28
#define ACP_PACKET_HDR_LEN 3
#define ACP_PACKET_DAT_LEN 16
#define MASK_AUDIO_DST_RATE 0x80
#define MASK_AUDIO_FREQ 0x07
#define MASK_DC_PIXEL_PHASE 0xf0
#define MASK_DC_COLOR_DEPTH 0x0f
/* Page 0x12 */
#define REG_CLK_CFG 0x1200
#define REG_CLK_OUT_CFG 0x1201
#define REG_CFG1 0x1202
#define REG_CFG2 0x1203
#define REG_WDL_CFG 0x1210
#define REG_DELOCK_DELAY 0x1212
#define REG_PON_OVR_EN 0x12A0
#define REG_PON_CBIAS 0x12A1
#define REG_PON_RESCAL 0x12A2
#define REG_PON_RES 0x12A3
#define REG_PON_CLK 0x12A4
#define REG_PON_PLL 0x12A5
#define REG_PON_EQ 0x12A6
#define REG_PON_DES 0x12A7
#define REG_PON_OUT 0x12A8
#define REG_PON_MUX 0x12A9
#define REG_MODE_RECOVER_CFG1 0x12F8
#define REG_MODE_RECOVER_CFG2 0x12F9
#define REG_MODE_RECOVER_STS 0x12FA
#define REG_AUDIO_LAYOUT 0x12D0
/* Page 0x13 */
#define REG_DEEP_COLOR_CTRL 0x1300
#define REG_CGU_DEBUG_SEL 0x1305
#define REG_HDCP_DDC_ADDR 0x1310
#define REG_HDCP_KIDX 0x1316
#define REG_DEEP_PLL7 0x1347
#define REG_HDCP_DE_CTRL 0x1370
#define REG_HDCP_EP_FILT_CTRL 0x1371
#define REG_HDMI_CTRL 0x1377
#define REG_HMTP_CTRL 0x137a
#define REG_TIMER_D 0x13CF
#define REG_SUS_SET_RGB0 0x13E1
#define REG_SUS_SET_RGB1 0x13E2
#define REG_SUS_SET_RGB2 0x13E3
#define REG_SUS_SET_RGB3 0x13E4
#define REG_SUS_SET_RGB4 0x13E5
#define REG_MAN_SUS_HDMI_SEL 0x13E8
#define REG_MAN_HDMI_SET 0x13E9
#define REG_SUS_CLOCK_GOOD 0x13EF
/* CGU_DEBUG_SEL bits */
#define CGU_DEBUG_CFG_CLK_MASK 0x18
#define CGU_DEBUG_XO_FRO_SEL (1<<2)
#define CGU_DEBUG_VDP_CLK_SEL (1<<1)
#define CGU_DEBUG_PIX_CLK_SEL (1<<0)
/* REG_MAN_SUS_HDMI_SEL / REG_MAN_HDMI_SET bits */
#define MAN_DIS_OUT_BUF (1<<7)
#define MAN_DIS_ANA_PATH (1<<6)
#define MAN_DIS_HDCP (1<<5)
#define MAN_DIS_TMDS_ENC (1<<4)
#define MAN_DIS_TMDS_FLOW (1<<3)
#define MAN_RST_HDCP (1<<2)
#define MAN_RST_TMDS_ENC (1<<1)
#define MAN_RST_TMDS_FLOW (1<<0)
/* Page 0x14 */
#define REG_FIFO_LATENCY_VAL 0x1403
#define REG_AUDIO_CLOCK_MODE 0x1411
#define REG_TEST_NCTS_CTRL 0x1415
#define REG_TEST_AUDIO_FREQ 0x1426
#define REG_TEST_MODE 0x1437
/* Page 0x20 */
#define REG_EDID_IN_BYTE0 0x2000 /* EDID base */
#define REG_EDID_IN_VERSION 0x2080
#define REG_EDID_ENABLE 0x2081
#define REG_HPD_POWER 0x2084
#define REG_HPD_AUTO_CTRL 0x2085
#define REG_HPD_DURATION 0x2086
#define REG_RX_HPD_HEAC 0x2087
/* Page 0x21 */
#define REG_EDID_IN_BYTE128 0x2100 /* CEA Extension block */
#define REG_EDID_IN_SPA_SUB 0x2180
#define REG_EDID_IN_SPA_AB_A 0x2181
#define REG_EDID_IN_SPA_CD_A 0x2182
#define REG_EDID_IN_CKSUM_A 0x2183
#define REG_EDID_IN_SPA_AB_B 0x2184
#define REG_EDID_IN_SPA_CD_B 0x2185
#define REG_EDID_IN_CKSUM_B 0x2186
/* Page 0x30 */
#define REG_RT_AUTO_CTRL 0x3000
#define REG_EQ_MAN_CTRL0 0x3001
#define REG_EQ_MAN_CTRL1 0x3002
#define REG_OUTPUT_CFG 0x3003
#define REG_MUTE_CTRL 0x3004
#define REG_SLAVE_ADDR 0x3005
#define REG_CMTP_REG6 0x3006
#define REG_CMTP_REG7 0x3007
#define REG_CMTP_REG8 0x3008
#define REG_CMTP_REG9 0x3009
#define REG_CMTP_REGA 0x300A
#define REG_CMTP_REGB 0x300B
#define REG_CMTP_REGC 0x300C
#define REG_CMTP_REGD 0x300D
#define REG_CMTP_REGE 0x300E
#define REG_CMTP_REGF 0x300F
#define REG_CMTP_REG10 0x3010
#define REG_CMTP_REG11 0x3011
/* CEC */
#define REG_PWR_CONTROL 0x80F4
#define REG_OSC_DIVIDER 0x80F5
#define REG_EN_OSC_PERIOD_LSB 0x80F8
#define REG_CONTROL 0x80FF
/* global interrupt flags (INT_FLG_CRL_TOP) */
#define INTERRUPT_AFE (1<<7) /* AFE module */
#define INTERRUPT_HDCP (1<<6) /* HDCP module */
#define INTERRUPT_AUDIO (1<<5) /* Audio module */
#define INTERRUPT_INFO (1<<4) /* Infoframe module */
#define INTERRUPT_MODE (1<<3) /* HDMI mode module */
#define INTERRUPT_RATE (1<<2) /* rate module */
#define INTERRUPT_DDC (1<<1) /* DDC module */
#define INTERRUPT_SUS (1<<0) /* SUS module */
/* INT_FLG_CLR_HDCP bits */
#define MASK_HDCP_MTP (1<<7) /* HDCP MTP busy */
#define MASK_HDCP_DLMTP (1<<4) /* HDCP end download MTP to SRAM */
#define MASK_HDCP_DLRAM (1<<3) /* HDCP end download keys from SRAM */
#define MASK_HDCP_ENC (1<<2) /* HDCP ENC */
#define MASK_STATE_C5 (1<<1) /* HDCP State C5 reached */
#define MASK_AKSV (1<<0) /* AKSV received (start of auth) */
/* INT_FLG_CLR_RATE bits */
#define MASK_RATE_B_DRIFT (1<<7) /* Rate measurement drifted */
#define MASK_RATE_B_ST (1<<6) /* Rate measurement stability change */
#define MASK_RATE_B_ACT (1<<5) /* Rate measurement activity change */
#define MASK_RATE_B_PST (1<<4) /* Rate measreument presence change */
#define MASK_RATE_A_DRIFT (1<<3) /* Rate measurement drifted */
#define MASK_RATE_A_ST (1<<2) /* Rate measurement stability change */
#define MASK_RATE_A_ACT (1<<1) /* Rate measurement presence change */
#define MASK_RATE_A_PST (1<<0) /* Rate measreument presence change */
/* INT_FLG_CLR_SUS (Start Up Sequencer) bits */
#define MASK_MPT_BIT (1<<7) /* Config MTP end of process */
#define MASK_FMT_BIT (1<<5) /* Video format changed */
#define MASK_RT_PULSE_BIT (1<<4) /* End of termination resistance pulse */
#define MASK_SUS_END_BIT (1<<3) /* SUS last state reached */
#define MASK_SUS_ACT_BIT (1<<2) /* Activity of selected input changed */
#define MASK_SUS_CH_BIT (1<<1) /* Selected input changed */
#define MASK_SUS_ST_BIT (1<<0) /* SUS state changed */
/* INT_FLG_CLR_DDC bits */
#define MASK_EDID_MTP (1<<7) /* EDID MTP end of process */
#define MASK_DDC_ERR (1<<6) /* master DDC error */
#define MASK_DDC_CMD_DONE (1<<5) /* master DDC cmd send correct */
#define MASK_READ_DONE (1<<4) /* End of down EDID read */
#define MASK_RX_DDC_SW (1<<3) /* Output DDC switching finished */
#define MASK_HDCP_DDC_SW (1<<2) /* HDCP DDC switching finished */
#define MASK_HDP_PULSE_END (1<<1) /* End of Hot Plug Detect pulse */
#define MASK_DET_5V (1<<0) /* Detection of +5V */
/* INT_FLG_CLR_MODE bits */
#define MASK_HDMI_FLG (1<<7) /* HDMI mode, avmute, encrypt-on, FIFO fail */
#define MASK_GAMUT (1<<6) /* Gamut packet */
#define MASK_ISRC2 (1<<5) /* ISRC2 packet */
#define MASK_ISRC1 (1<<4) /* ISRC1 packet */
#define MASK_ACP (1<<3) /* Audio Content Protection packet */
#define MASK_DC_NO_GCP (1<<2) /* GCP not recieved in 5 frames */
#define MASK_DC_PHASE (1<<1) /* deep color mode pixel phase needs update */
#define MASK_DC_MODE (1<<0) /* deep color mode color depth changed */
/* INT_FLG_CLR_INFO bits */
#define MASK_MPS_IF (1<<6) /* MPEG Source Product IF change */
#define MASK_AUD_IF (1<<5) /* Audio IF change */
#define MASK_SPD_IF (1<<4) /* Source Product Descriptor IF change */
#define MASK_AVI_IF (1<<3) /* Auxiliary Video information IF change */
#define MASK_VS_IF_OTHER_BK2 (1<<2) /* Vendor Specific IF (bank2) change */
#define MASK_VS_IF_OTHER_BK1 (1<<1) /* Vendor Specific IF (bank1) change */
#define MASK_VS_IF_HDMI (1<<0) /* Vendor Specific IF (with HDMI LLC reg code) change */
/* INT_FLG_CLR_AUDIO bits */
#define MASK_AUDIO_FREQ_FLG (1<<5) /* Audio freq change */
#define MASK_AUDIO_FLG (1<<4) /* DST, OBA, HBR, ASP change */
#define MASK_MUTE_FLG (1<<3) /* Audio Mute */
#define MASK_CH_STATE (1<<2) /* Channel status */
#define MASK_UNMUTE_FIFO (1<<1) /* Audio Unmute */
#define MASK_ERROR_FIFO_PT (1<<0) /* Audio FIFO pointer error */
/* INT_FLG_CLR_AFE bits */
#define MASK_AFE_WDL_UNLOCKED (1<<7) /* Wordlocker was unlocked */
#define MASK_AFE_GAIN_DONE (1<<6) /* Gain calibration done */
#define MASK_AFE_OFFSET_DONE (1<<5) /* Offset calibration done */
#define MASK_AFE_ACTIVITY_DET (1<<4) /* Activity detected on data */
#define MASK_AFE_PLL_LOCK (1<<3) /* TMDS PLL is locked */
#define MASK_AFE_TRMCAL_DONE (1<<2) /* Termination calibration done */
#define MASK_AFE_ASU_STATE (1<<1) /* ASU state is reached */
#define MASK_AFE_ASU_READY (1<<0) /* AFE calibration done: TMDS ready */
/* OF_CTRL bits */
#define VP_OUT (1<<7) /* enable VP[35:0], HS, VS, DE, V_CLK */
#define VP_HIZ (1<<6) /* unused VP pins Hi-Z */
#define VP_BLK (1<<4) /* Insert blanking code in data */
#define VP_TRC (1<<3) /* Insert timing code (SAV/EAV) in data*/
#define VP_FORMAT_SEL_MASK 0x7 /* format selection */
/* HDMI_SOFT_RST bits */
#define RESET_DC (1<<7) /* Reset deep color module */
#define RESET_HDCP (1<<6) /* Reset HDCP module */
#define RESET_KSV (1<<5) /* Reset KSV-FIFO */
#define RESET_SCFG (1<<4) /* Reset HDCP and repeater function */
#define RESET_HCFG (1<<3) /* Reset HDCP DDC part */
#define RESET_PA (1<<2) /* Reset polarity adjust */
#define RESET_EP (1<<1) /* Reset Error protection */
#define RESET_TMDS (1<<0) /* Reset TMDS (calib, encoding, flow) */
/* HDMI_INFO_RST bits */
#define NACK_HDCP (1<<7) /* No ACK on HDCP request */
#define RESET_FIFO (1<<4) /* Reset Audio FIFO control */
#define RESET_GAMUT (1<<3) /* Clear Gamut packet */
#define RESET_AI (1<<2) /* Clear ACP and ISRC packets */
#define RESET_IF (1<<1) /* Clear all Audio infoframe packets */
#define RESET_AUDIO (1<<0) /* Reset Audio FIFO control */
/* HDCP_BCAPS bits */
#define HDCP_HDMI (1<<7) /* HDCP suports HDMI (vs DVI only) */
#define HDCP_REPEATER (1<<6) /* HDCP supports repeater function */
#define HDCP_READY (1<<5) /* set by repeater function */
#define HDCP_FAST (1<<4) /* Up to 400kHz */
#define HDCP_11 (1<<1) /* HDCP 1.1 supported */
#define HDCP_FAST_REAUTH (1<<0) /* fast reauthentication suported */
/* masks for interrupt status registers */
#define MASK_SUS_STATE_VALUE 0x1F
#define LAST_STATE_REACHED 0x1B
#define MASK_CLK_STABLE 0x04
#define MASK_CLK_ACTIVE 0x02
#define MASK_SUS_STATE_BIT 0x10
#define MASK_SR_FIFO_FIFO_CTRL 0x30
#define MASK_AUDIO_FLAG 0x10
/* Power Control */
#define MASK_OF_CTRL_OUT_HIZ 0x80
#define MASK_AUDIO_PLL_PD 0x80
#define DC_PLL_PD 0x01
#define DC_PLL_PON 0x00
#define MASK_XTAL_OSC_PD 0x02
#define MASK_TMDS_CLK_DIS 0x08
#define CBIAS_PON 0x01
#define CBIAS_POFF 0x00
#define TMDS_AUTO_PON 0x00
#define TMDS_MAN_PON 0x01
#define MASK_LOW_PW_EDID 0x01
/* Rate measurement */
#define RATE_REFTIM_ENABLE 0x01
#define CLK_MIN_RATE 0x0057e4
#define CLK_MAX_RATE 0x0395f8
#define WDL_CFG_VAL 0x82
#define DC_FILTER_VAL 0x31
/* Infoframe */
#define VS_HDMI_IF_UPDATE 0x0200
#define VS_HDMI_IF_TYPE 0x0201
#define VS_BK1_IF_UPDATE 0x0220
#define VS_BK1_IF_TYPE 0x0221
#define VS_BK2_IF_UPDATE 0x0240
#define VS_BK2_IF_TYPE 0x0241
#define AVI_IF_UPDATE 0x0260
#define AVI_IF_TYPE 0x0261
#define AVI_IF_NB_DATA 17
#define SPD_IF_UPDATE 0x0280
#define SPD_IF_TYPE 0x0281
#define SPD_IF_NB_DATA 31
#define AUD_IF_UPDATE 0x02a0
#define AUD_IF_TYPE 0x02a1
#define AUD_IF_NB_DATA 14
#define MPS_IF_UPDATE 0x02c0
#define MPS_IF_TYPE 0x02c1
#define MPS_IF_NB_DATA 14
#define MAX_IF_DATA 40
#define VS_IF_NB 31
/* Input Selection */
#define MASK_DIG_INPUT 0x01
#define MASK_DIG_INPUT_VDPR_FMT 0x85
#define MASK_HDMIOUTMODE 0x02
#define FORMAT_RESET 0x80
/* Colorspace Conversion Registers */
#define MAT_OFFSET_NB 3
#define MAT_COEFF_NB 9
#define OFFSET_LOOP_NB 2
#define MIN_VAL_OFFSET -4096
#define MAX_VAL_OFFSET 4095
#define MIN_VAL_COEFF -16384
#define MAX_VAL_COEFF 16383
#define MASK_MAT_COEFF_LSB 0x00FF
/* Blanking code values depend on output colorspace (RGB or YUV) */
typedef struct
{
s16 blankingCodeGy;
s16 blankingCodeBu;
s16 blankingCodeRv;
} blankingcodes_t;
blankingcodes_t RGBBlankingCode = {64, 64, 64};
blankingcodes_t YUVBlankingCode = {64, 512, 512};
/* Video Colorspace formats */
typedef enum {
COLORSPACE_RGB,
COLORSPACE_YCBCR_422,
COLORSPACE_YCBCR_444,
COLORSPACE_FUTURE,
} tda1997x_colorspace_t;
/* Video Colorimetry formats */
typedef enum {
COLORIMETRY_NONE,
COLORIMETRY_ITU601,
COLORIMETRY_ITU709,
COLORIMETRY_XVYCC,
} tda1997x_colorimetry_t;
/* Video colormode formats */
typedef enum {
DEEPCOLORMODE_NOT_INDICATED = 0x00,
DEEPCOLORMODE_24 = 0x04,
DEEPCOLORMODE_30 = 0x05,
DEEPCOLORMODE_36 = 0x06,
DEEPCOLORMODE_48 = 0x07,
} tda1997x_deepcolor_t;
/* resolution type */
typedef enum {
RESTYPE_SDTV,
RESTYPE_HDTV,
RESTYPE_PC,
} tda1997x_restype_t;
/* Video output port format */
const char *vidfmt_names[] = {
"RGB444/YUV444", /* RGB/YUV444 16bit data bus, 8bpp */
"YUV422 semi-planar", /* YUV422 16bit data base, 8bpp */
"YUV422 CCIR656", /* BT656 (YUV 8bpp 2 clock per pixel) */
};
static char *colorspace_names[] = {
"RGB", "YUV422", "YUV444", "Future"
};
static char *colorimetry_names[] = {
"", "ITU601", "ITU709", "XVYCC"
};
/* HDCP */
#define RX_SEED_TABLE_LEN 10 /* HDCP Seed */
typedef enum
{
HDCP_DECRYPTKEY_OFF = 0x00,
HDCP_DECRYPTKEY_ON = 0x02
} hdcp_key_t;
typedef enum
{
DISABLE = 0x00,
ENABLE = 0x01
} enable_t;
/* MTP */
typedef enum {
MTP_START_DOWNLOAD,
MTP_START_READ,
} mtp_command_t;
/* HPD modes */
typedef enum {
HPD_LOW, /* HPD low and pulse of at least 100ms */
HPD_LOW_OTHER, /* HPD low and pulse of at least 100ms */
HPD_HIGH, /* HIGH */
HPD_HIGH_OTHER,
HPD_PULSE, /* HPD low pulse */
} hpdmode_t;
/** configure colorspace conversion matrix
* The color conversion matrix will convert between the colorimetry of the
* HDMI input to the desired output format RGB|YUV
*/
typedef enum {
ITU709_RGBLimited,
RGBLimited_ITU601,
ITU601_RGBLimited,
} colorconversion_t;
/* Colorspace conversion matrix coefficients and offsets
*/
typedef struct
{
/* Input offsets */
s16 offInt1;
s16 offInt2;
s16 offInt3;
/* Coeficients */
s16 P11Coef;
s16 P12Coef;
s16 P13Coef;
s16 P21Coef;
s16 P22Coef;
s16 P23Coef;
s16 P31Coef;
s16 P32Coef;
s16 P33Coef;
/* Output offsets */
s16 offOut1;
s16 offOut2;
s16 offOut3;
} colormatrixcoefs_t;
/* Conversion matrixes */
colormatrixcoefs_t conversion_matrix[] = {
/* ITU709 -> RGBLimited */
{
-256, -2048, -2048, /*Input Offset*/
4096, -1875, -750,
4096, 6307, 0,
4096, 0, 7431,
256, 256, 256 /*Output Offset*/
},
/* RGBLimited -> ITU601 */
{
-256, -256, -256, /*Input Offset*/
2404, 1225, 467,
-1754, 2095, -341,
-1388, -707, 2095, /*RGB limited range => ITU-601 YUV limited range */
256, 2048, 2048 /*Output Offset*/
},
/* YUV601 -> RGBLimited */
{
-256, -2048, -2048, /*Input Offset*/
4096, -2860, -1378,
4096, 5615, 0,
4096, 0, 7097, /*ITU-601 YUV limited range => RGB limited range */
256, 256, 256 /*Output Offset*/
}
};
/* HDCP seed table, arranged as pairs of 16bit integrers: lookup val, seed val
* If no table is programmed or KEY_SED in config file is null, HDCP will be
* disabled
*/
typedef struct {
u16 lookUpVal;
u16 seedVal;
} hdmi_cfg_seed_t;
const hdmi_cfg_seed_t rx_seed_table[RX_SEED_TABLE_LEN] = {
{0xF0, 0x1234},
{0xF1, 0xDBE6},
{0xF2, 0xDBE6},
{0, 0x1234},
{0, 0},
{0, 0},
{0, 0},
{0, 0},
{0, 0},
{0, 0}
};
/** Video Input mode database
* TODO: can I use something like modedb instead?
* More recent kernels have some CEA data
*/
static char *restype_names[] = {
"SDTV", "HDTV", "PC",
};
typedef enum
{
VIDEORES_1280_720p_24HZ,
VIDEORES_1280_720p_25HZ,
VIDEORES_1280_720p_30HZ,
VIDEORES_1920_1080p_24HZ,
VIDEORES_1920_1080p_25HZ,
VIDEORES_1920_1080p_30HZ,
VIDEORES_720_480p_60HZ,
VIDEORES_1280_720p_60HZ,
VIDEORES_1920_1080i_60HZ,
VIDEORES_720_480i_60HZ,
VIDEORES_1920_1080p_60HZ,
VIDEORES_720_576p_50HZ,
VIDEORES_1280_720p_50HZ,
VIDEORES_1920_1080i_50HZ,
VIDEORES_720_576i_50HZ,
VIDEORES_1920_1080p_50HZ,
VIDEORES_640_480p_60HZ, /* VGA */
VIDEORES_800_600p_60HZ, /* SVGA */
VIDEORES_1024_768p_60HZ, /* XGA */
VIDEORES_1280_768p_60HZ, /* WXGA */
VIDEORES_1280_960p_60HZ, /* ???? */
VIDEORES_1280_1024p_60HZ, /* SXGA */
VIDEORES_1440_900p_60HZ, /* ???? */
VIDEORES_1600_1200p_60HZ, /* UGA */
VIDEORES_1680_1050p_60HZ_RB, /* WSXGA */
VIDEORES_1920_1200p_60HZ_RB, /* WUXGA */
VIDEORES_640_480p_75HZ, /* VGA */
VIDEORES_800_600p_75HZ, /* SVGA */
VIDEORES_1024_768p_75HZ, /* XGA */
VIDEORES_1280_768p_75HZ, /* WXGA */
VIDEORES_1280_1024p_75HZ, /* SXGA */
VIDEORES_640_480p_85HZ, /* VGA */
VIDEORES_800_600p_85HZ, /* SVGA */
VIDEORES_1024_768p_85HZ, /* XGA */
VIDEORES_1280_768p_85HZ, /* WXGA */
VIDEORES_1280_1024p_85HZ, /* SXGA */
VIDEORES_720_240p_60HZ_M1, /* 720(1440, 2880)x240p 60Hz mode 1 */
VIDEORES_720_240p_60HZ_M2, /* 720(1440, 2880)x240p 60Hz mode 2 */
VIDEORES_720_288p_50HZ_M1, /* 720(1440)x288p 50Hz mode 1 */
VIDEORES_720_288p_50HZ_M2, /* 720(1440)x288p 50Hz mode 1 */
VIDEORES_720_288p_50HZ_M3, /* 720(1440)x288p 50Hz mode 1 */
VIDEORES_1360_768p_60HZ, /* 1360x768p 60Hz (PC resolution) */
VIDEORES_1400_1050p_60HZ, /* 1400x1050p 60Hz (PC resolution) */
VIDEORES_1400_1050p_60HZ_RB, /* 1400x1050p 60Hz Reduced Blanking (PC) */
VIDEORES_1024_768p_70HZ, /* XGA */
VIDEORES_640_480p_72HZ, /* VGA */
VIDEORES_800_600p_72HZ, /* SVGA */
VIDEORES_640_350p_85HZ, /* 640x350p 85Hz (PC) */
VIDEORES_640_400p_85HZ, /* 640x400p 85Hz (PC) */
VIDEORES_720_400p_85HZ, /* 720x400p 85Hz (PC) */
VIDEORES_UNKNOWN
} resolutionid_t;
/* structure for video format measurements */
typedef struct
{
u8 videoFormat; /* 1=interlaced or 0=progressive */
u8 vsPolarity; /* 1=negative 0=positive */
u8 hsPolarity; /* 1=negative 0=positive */
u16 horizontalTotalPeriod; /* period of 1 line (pixel clocks) */
u16 horizontalVideoActiveWidth; /* period of 1 active line (pixel clocks) */
u16 horizontalFrontPorchWidth; /* width of front porch */
u16 horizontalBackPorchWidth; /* width of back porch */
u16 horizontalSyncWidthPixClk;
u16 verticalTotalPeriod; /* period of a frame in line numbers */
u16 verticalVideoActiveWidth;
u16 verticalFrontPorchWidthF1; /* vertical front porch width of field 1 */
u16 verticalFrontPorchWidthF2; /* vertical front porch width of field 2*/
u16 verticalSyncWidth; /* width of the VS in line numbers */
u16 verticalBackPorchWidthF1; /* vertical back porch width of field 1 */
u16 verticalBackPorchWidthF2; /* vertical back porch width of field 2 */
u16 dataEnablePresent; /* 1=DE signal present */
} videoFormatDetails;
typedef struct
{
u8 resolutionID;
u16 width;
u16 height;
u8 horizfreq;
u8 interlaced;
u32 verticalPeriodMin; /* = MCLK(27MHz) / VFreq minus 0.7% */
u32 verticalPeriodMax; /* same + 0.7% */
u16 horizontalPeriodMin; /* = MCLK(27MHz) / HFreq minus 1% */
u16 horizontalPeriodMax;
u16 hsWidthMin; /* = MCLK(27MHz) / pixclk * hWidth minux ...% */
u16 hsWidthMax;
} resolution_data_t;
typedef struct
{
u16 href_start;
u16 href_end;
u16 vref_f1_start;
u8 vref_f1_width;
u16 vref_f2_start;
u8 vref_f2_width;
u16 fieldref_f1_start;
u8 fieldPolarity;
u16 fieldref_f2_start;
} vhref_values_t;
typedef struct
{
u8 resolutionID;
u16 pixCountPreset;
u16 pixCountNb;
u16 lineCountPreset;
u16 lineCountNb;
vhref_values_t vhref_values;
} resolution_timings_t;
const resolution_timings_t resolution_timings[] = {
/* Low TV */
{VIDEORES_1280_720p_24HZ, 1, 3300, 1, 750,
{261, 1541, 745, 30, 0, 0, 1, 0, 0}
},
{VIDEORES_1280_720p_25HZ, 1, 3960, 1, 750,
{261, 1541, 745, 30, 0, 0, 1, 0, 0}
},
{VIDEORES_1280_720p_30HZ, 1, 3300, 1, 750,
{261, 1541, 745, 30, 0, 0, 1, 0, 0}
},
{VIDEORES_1920_1080p_24HZ, 1, 2750, 1, 1125,
{193, 2113, 1121, 45, 0, 0, 1, 0, 0}
},
{VIDEORES_1920_1080p_25HZ, 1, 2640, 1, 1125,
{193, 2113, 1121, 45, 0, 0, 1, 0, 0}
},
{VIDEORES_1920_1080p_30HZ, 1, 2200, 1, 1125,
{193, 2113, 1121, 45, 0, 0, 1, 0, 0}
},
/* 60 Hz TV */
{VIDEORES_720_480p_60HZ, 1, 858, 1, 525,
{123, 843, 516, 45, 0, 0, 1, 0, 0}
},
{VIDEORES_1280_720p_60HZ, 1, 1650, 1, 750,
{261, 1541, 745, 30, 0, 0, 1, 0, 0}
},
{VIDEORES_1920_1080i_60HZ, 1, 2200, 1, 1125,
{193, 2113, 1123, 22, 560, 23, 1, 0, 563}
},
{VIDEORES_720_480i_60HZ, 1, 858, 1, 525,
{120, 840, 521, 22, 258, 23, 1, 0, 263}
},
{VIDEORES_1920_1080p_60HZ, 1, 2200, 1, 1125,
{193, 2113, 1121, 45, 0, 0, 1, 0, 0}
},
/* 50 Hz TV */
{VIDEORES_720_576p_50HZ, 1, 864, 1, 625,
{133, 853, 620, 49, 0, 0, 1, 0, 0}
},
{VIDEORES_1280_720p_50HZ, 1, 1980, 1, 750,
{261, 1541, 745, 30, 0, 0, 1, 0, 0}
},
{VIDEORES_1920_1080i_50HZ, 1, 2640, 1, 1125,
{193, 2113, 1123, 22, 560, 23, 1, 0, 563}
},
{VIDEORES_720_576i_50HZ, 1, 864, 1, 625,
{133, 853, 623, 24, 310, 25, 1, 0, 313 }
},
{VIDEORES_1920_1080p_50HZ, 1, 2640, 1, 1125,
{193, 2113, 1121, 45, 0, 0, 1, 0, 0}
},
/* 60 Hz PC */
{VIDEORES_640_480p_60HZ, 1, 800, 1, 525,
{145, 785, 515, 45, 0, 0, 1, 0, 0}
},
{VIDEORES_800_600p_60HZ, 1, 1056, 1, 628,
{217, 1017, 627, 28, 0, 0, 0, 0, 0}
},
{VIDEORES_1024_768p_60HZ, 1, 1344, 1, 806,
{297, 1321, 803, 38, 0, 0, 0, 0, 0}
},
{VIDEORES_1280_768p_60HZ, 1, 1440, 1, 790,
{321, 1601, 795, 30, 0, 0, 0, 0, 0}
},
{VIDEORES_1280_960p_60HZ, 1, 1800, 1, 1000,
{425, 1705, 999, 40, 0, 0, 0, 0, 0}
},
{VIDEORES_1280_1024p_60HZ, 1, 1688, 1, 1066,
{361, 1641, 1065, 42, 0, 0, 0, 0, 0}
},
{VIDEORES_1440_900p_60HZ, 1, 1904, 1, 934,
{385, 1825, 931, 34, 0, 0, 0, 0, 0}
},
{VIDEORES_1600_1200p_60HZ, 1, 2160, 1, 1250,
{497, 2097, 1249, 50, 0, 0, 0, 0, 0}
},
{VIDEORES_1680_1050p_60HZ_RB, 1, 1840, 1, 1080,
{113, 1793, 1077, 30, 0, 0, 0, 0, 0}
},
{VIDEORES_1920_1200p_60HZ_RB, 1, 2080, 1, 1235,
{113, 2033, 1232, 35, 0, 0, 0, 0, 0}
},
/* 75 HZ PC */
{VIDEORES_640_480p_75HZ, 1, 840, 1, 500,
{185, 825, 499, 20, 0, 0, 1, 0, 0}
},
{VIDEORES_800_600p_75HZ, 1, 1056, 1, 625,
{241, 1041, 624, 25, 0, 0, 0, 0, 0}
},
{VIDEORES_1024_768p_75HZ, 1, 1312, 1, 800,
{273, 1297, 799, 32, 0, 0, 0, 0, 0}
},
{VIDEORES_1280_768p_75HZ, 1, 1696, 1, 805,
{337, 1617, 802, 37, 0, 0, 0, 0, 0}
},
{VIDEORES_1280_1024p_75HZ, 1, 1688, 1, 1066,
{393, 1673, 1065, 42, 0, 0, 0, 0, 0}
},
/* 85 HZ PC */
{VIDEORES_640_480p_85HZ, 1, 832, 1, 509,
{137, 777, 508, 29, 0, 0, 1, 0, 0}
},
{VIDEORES_800_600p_85HZ, 1, 1048, 1, 631,
{217, 1017, 630, 31, 0, 0, 0, 0, 0}
},
{VIDEORES_1024_768p_85HZ, 1, 1376, 1, 808,
{305, 1329, 807, 40, 0, 0, 0, 0, 0}
},
{VIDEORES_1280_768p_85HZ, 1, 1712, 1, 908,
{353, 1633, 905, 140, 0, 0, 0, 0, 0}
},
{VIDEORES_1280_1024p_85HZ, 1, 1728, 1, 1072,
{385, 1665, 1071, 48, 0, 0, 0, 0, 0}
},
/* Other resolutions */
{VIDEORES_720_240p_60HZ_M1, 1, 858, 1, 262,
{120, 840, 258, 22, 0, 0, 0, 0, 0}
},
{VIDEORES_720_240p_60HZ_M2, 1, 858, 1, 263,
{120, 840, 258, 23, 0, 0, 0, 0, 0}
},
{VIDEORES_720_288p_50HZ_M1, 1, 864, 1, 312,
{133, 853, 310, 24, 0, 0, 0, 0, 0}
},
{VIDEORES_720_288p_50HZ_M2, 1, 864, 1, 313,
{133, 853, 310, 25, 0, 0, 0, 0, 0}
},
{VIDEORES_720_288p_50HZ_M3, 1, 864, 1, 314,
{133, 853, 310, 26, 0, 0, 0, 0, 0}
},
{VIDEORES_1360_768p_60HZ, 1, 1792, 1, 795,
{369, 1729, 792, 27, 0, 0, 0, 0, 0}
},
{VIDEORES_1400_1050p_60HZ, 1, 1864, 1, 1089,
{377, 1777, 1086, 39, 0, 0, 0, 0, 0}
},
{VIDEORES_1400_1050p_60HZ_RB, 1, 1560, 1, 1080,
{113, 1513, 1077, 30, 0, 0, 0, 0, 0}
},
{VIDEORES_1024_768p_70HZ, 1, 1328, 1, 806,
{281, 1305, 803, 38, 0, 0, 0, 0, 0}
},
{VIDEORES_640_480p_72HZ, 1, 832, 1, 520,
{169, 809, 511, 40, 0, 0, 0, 0, 0}
},
{VIDEORES_800_600p_72HZ, 1, 1040, 1, 666,
{185, 985, 629, 66, 0, 0, 0, 0, 0}
},
{VIDEORES_640_350p_85HZ, 1, 832, 1, 445,
{161, 801, 413, 95, 0, 0, 0, 0, 0}
},
{VIDEORES_640_400p_85HZ, 1, 832, 1, 445,
{161, 801, 444, 45, 0, 0, 0, 0, 0}
},
{VIDEORES_720_400p_85HZ, 1, 936, 1, 446,
{181, 901, 445, 46, 0, 0, 0, 0, 0}
}
};
const resolution_data_t supported_res[] =
{
/* Low TV */
{VIDEORES_1280_720p_24HZ, 1280,720,24,0, 1117178, 1134065, 1488, 1513, 17, 19},
{VIDEORES_1280_720p_25HZ, 1280,720,25,0, 1072491, 1087614, 1428, 1451, 13, 15},
{VIDEORES_1280_720p_30HZ, 1280,720,30,0, 893742, 907252, 1190, 1210, 13, 15},
{VIDEORES_1920_1080p_24HZ, 1920,1080,24,0, 1117178, 1134065, 992, 1009, 14, 17},
{VIDEORES_1920_1080p_25HZ, 1920,1080,25,0, 1072491, 1087614, 952, 967, 14, 17},
{VIDEORES_1920_1080p_30HZ, 1920,1080,30,0, 893742, 907252, 794, 806, 14, 17},
/* 60 Hz TV */
{VIDEORES_720_480p_60HZ, 720,480,60,0, 446870, 453626, 850, 865, 60, 63},
{VIDEORES_1280_720p_60HZ, 1280,720,60,0, 446870, 453626, 594, 605, 13, 15},
{VIDEORES_1920_1080i_60HZ, 1920,1080,60,1, 446870, 453626, 793, 807, 14, 17},
{VIDEORES_720_480i_60HZ, 720,480,60,1, 446870, 453626, 1701, 1729, 122, 125},
{VIDEORES_1920_1080p_60HZ, 1920,1080,60,0, 446870, 453626, 396, 404, 6, 9},
/* 50 Hz TV */
{VIDEORES_720_576p_50HZ, 720,576,50,0, 536245, 543807, 856, 871, 62, 65},
{VIDEORES_1280_720p_50HZ, 1280,720,50,0, 536245, 543807, 713, 726, 13, 15},
{VIDEORES_1920_1080i_50HZ, 1920,1080,50,1, 536245, 543807, 952, 967, 14, 17},
{VIDEORES_720_576i_50HZ, 720,576,50,1, 536245, 543807, 1714, 1741, 124, 127},
{VIDEORES_1920_1080p_50HZ, 1920,1080,50,0, 536245, 543807, 475, 484, 6, 9},
/* 60 HZ PC */
{VIDEORES_640_480p_60HZ, 640,480,60,0, 446870, 453626, 850, 865, 101, 104},
{VIDEORES_800_600p_60HZ, 800,600,60,0, 444523, 450791, 708, 718, 84, 88},
{VIDEORES_1024_768p_60HZ, 1024,768,60,0, 446842, 453142, 554, 562, 54, 58},
{VIDEORES_1280_768p_60HZ, 1280,768,60,0, 447842, 454156, 561, 569, 41, 46},
{VIDEORES_1280_960p_60HZ, 1280,960,60,0, 446872, 453172, 447, 453, 26, 30},
{VIDEORES_1280_1024p_60HZ, 1280,1024,60,0, 446723, 453021, 419, 425, 26, 30},
{VIDEORES_1440_900p_60HZ, 1440,900,60,0, 446723, 453021, 478, 486, 35, 40},
{VIDEORES_1600_1200p_60HZ, 1600,1200,60,0, 446872, 453172, 357, 363, 30, 34},
{VIDEORES_1680_1050p_60HZ_RB, 1680,1050,60,0, 447745, 454058, 415, 420, 5, 9},
{VIDEORES_1920_1200p_60HZ_RB, 1920,1200,60,0, 447235, 453550, 362, 367, 4, 8},
/* 75 HZ PC */
{VIDEORES_640_480p_75HZ, 640,480,75,0, 357498, 362538, 715, 725, 53, 57},
{VIDEORES_800_600p_75HZ, 800,600,75,0, 357498, 362538, 572, 580, 42, 46},
{VIDEORES_1024_768p_75HZ, 1024,768,75,0, 357359, 362398, 447, 453, 31, 35},
{VIDEORES_1280_768p_75HZ, 1280,768,75,0, 357480, 362520, 444, 450, 32, 36},
{VIDEORES_1280_1024p_75HZ, 1280,1024,75,0, 357378, 362417, 335, 340, 27, 31},