hc
2023-03-21 4b55d97acc464242bcd6a8ae77b8ff37c22dec58
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
// SPDX-License-Identifier: GPL-2.0
/*
 * Copyright (c) 2020 Rockchip Electronics Co. Ltd.
 *
 * Author: Algea Cao <algea.cao@rock-chips.com>
 */
 
#include <linux/clk.h>
#include <linux/debugfs.h>
#include <linux/delay.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/platform_device.h>
#include <linux/regmap.h>
#include <linux/reset.h>
#include <linux/timer.h>
#include <linux/workqueue.h>
#include <linux/mfd/rk628.h>
#include <linux/phy/phy.h>
 
#include <drm/drmP.h>
#include <drm/drm_atomic.h>
#include <drm/drm_atomic_helper.h>
#include <drm/drm_crtc_helper.h>
#include <drm/drm_dp_helper.h>
#include <drm/drm_of.h>
 
#define REG(x)                             ((x) + 0x30000)
#define HDMI_RX_HDMI_SETUP_CTRL            REG(0x0000)
#define HOT_PLUG_DETECT_MASK               BIT(0)
#define HOT_PLUG_DETECT(x)                 UPDATE(x, 0, 0)
#define HDMI_RX_HDMI_OVR_CTRL              REG(0x0004)
#define HDMI_RX_HDMI_TIMER_CTRL            REG(0x0008)
#define HDMI_RX_HDMI_RES_OVR               REG(0x0010)
#define HDMI_RX_HDMI_RES_STS               REG(0x0014)
#define HDMI_RX_HDMI_PLL_CTRL              REG(0x0018)
#define HDMI_RX_HDMI_PLL_FRQSET1           REG(0x001c)
#define HDMI_RX_HDMI_PLL_FRQSET2           REG(0x0020)
#define HDMI_RX_HDMI_PLL_PAR1              REG(0x0024)
#define HDMI_RX_HDMI_PLL_PAR2              REG(0x0028)
#define HDMI_RX_HDMI_PLL_PAR3              REG(0x002c)
#define HDMI_RX_HDMI_PLL_LCK_STS           REG(0x0030)
#define HDMI_RX_HDMI_CLK_CTRL              REG(0x0034)
#define HDMI_RX_HDMI_PCB_CTRL              REG(0x0038)
#define SEL_PIXCLKSRC_MASK                 GENMASK(19, 18)
#define SEL_PIXCLKSRC(x)                   UPDATE(x, 19, 18)
#define HDMI_RX_HDMI_PHS_CTR               REG(0x0040)
#define HDMI_RX_HDMI_PHS_USED              REG(0x0044)
#define HDMI_RX_HDMI_MISC_CTRL             REG(0x0048)
#define HDMI_RX_HDMI_EQOFF_CTRL            REG(0x004c)
#define HDMI_RX_HDMI_EQGAIN_CTRL           REG(0x0050)
#define HDMI_RX_HDMI_EQCAL_STS             REG(0x0054)
#define HDMI_RX_HDMI_EQRESULT              REG(0x0058)
#define HDMI_RX_HDMI_EQ_MEAS_CTRL          REG(0x005c)
#define HDMI_RX_HDMI_WR_CFG                REG(0x0060)
#define HDMI_RX_HDMI_CTRL                  REG(0x0064)
#define HDMI_RX_HDMI_MODE_RECOVER          REG(0x0080)
#define PREAMBLE_CNT_LIMIT_MASK            GENMASK(31, 27)
#define PREAMBLE_CNT_LIMIT(x)              UPDATE(x, 31, 27)
#define OESSCTL3_THR_MASK                  GENMASK(20, 19)
#define OESSCTL3_THR(x)                    UPDATE(x, 20, 19)
#define SPIKE_FILTER_EN_MASK               BIT(18)
#define SPIKE_FILTER_EN(x)                 UPDATE(x, 18, 18)
#define DVI_MODE_HYST_MASK                 GENMASK(17, 13)
#define DVI_MODE_HYST(x)                   UPDATE(x, 17, 13)
#define HDMI_MODE_HYST_MASK                GENMASK(12, 8)
#define HDMI_MODE_HYST(x)                  UPDATE(x, 12, 8)
#define HDMI_MODE_MASK                     GENMASK(7, 6)
#define HDMI_MODE(x)                       UPDATE(x, 7, 6)
#define GB_DET_MASK                        GENMASK(5, 4)
#define GB_DET(x)                          UPDATE(x, 5, 4)
#define EESS_OESS_MASK                     GENMASK(3, 2)
#define EESS_OESS(x)                       UPDATE(x, 3, 2)
#define SEL_CTL01_MASK                     GENMASK(1, 0)
#define SEL_CTL01(x)                       UPDATE(x, 1, 0)
#define HDMI_RX_HDMI_ERROR_PROTECT         REG(0x0084)
#define RG_BLOCK_OFF_MASK                  BIT(20)
#define RG_BLOCK_OFF(x)                    UPDATE(x, 20, 20)
#define BLOCK_OFF_MASK                     BIT(19)
#define BLOCK_OFF(x)                       UPDATE(x, 19, 19)
#define VALID_MODE_MASK                    GENMASK(18, 16)
#define VALID_MODE(x)                      UPDATE(x, 18, 16)
#define CTRL_FILT_SEN_MASK                 GENMASK(13, 12)
#define CTRL_FILT_SEN(x)                   UPDATE(x, 13, 12)
#define VS_FILT_SENS_MASK                  GENMASK(11, 10)
#define VS_FILT_SENS(x)                    UPDATE(x, 11, 10)
#define HS_FILT_SENS_MASK                  GENMASK(9, 8)
#define HS_FILT_SENS(x)                    UPDATE(x, 9, 8)
#define DE_MEASURE_MODE_MASK               GENMASK(7, 6)
#define DE_MEASURE_MODE(x)                 UPDATE(x, 7, 6)
#define DE_REGEN_MASK                      BIT(5)
#define DE_REGEN(x)                        UPDATE(x, 5, 5)
#define DE_FILTER_SENS_MASK                GENMASK(4, 3)
#define DE_FILTER_SENS(x)                  UPDATE(x, 4, 3)
#define HDMI_RX_HDMI_ERD_STS               REG(0x0088)
#define HDMI_RX_HDMI_SYNC_CTRL             REG(0x0090)
#define VS_POL_ADJ_MODE_MASK               GENMASK(4, 3)
#define VS_POL_ADJ_MODE(x)                 UPDATE(x, 4, 3)
#define HS_POL_ADJ_MODE_MASK               GENMASK(2, 1)
#define HS_POL_ADJ_MODE(x)                 UPDATE(x, 2, 1)
#define HDMI_RX_HDMI_CKM_EVLTM             REG(0x0094)
#define LOCK_HYST_MASK                     GENMASK(21, 20)
#define LOCK_HYST(x)                       UPDATE(x, 21, 20)
#define CLK_HYST_MASK                      GENMASK(18, 16)
#define CLK_HYST(x)                        UPDATE(x, 18, 16)
#define EVAL_TIME_MASK                     GENMASK(15, 4)
#define EVAL_TIME(x)                       UPDATE(x, 15, 4)
#define HDMI_RX_HDMI_CKM_F                 REG(0x0098)
#define HDMIRX_MAXFREQ_MASK                GENMASK(31, 16)
#define HDMIRX_MAXFREQ(x)                  UPDATE(x, 31, 16)
#define MINFREQ_MASK                       GENMASK(15, 0)
#define MINFREQ(x)                         UPDATE(x, 15, 0)
#define HDMI_RX_HDMI_CKM_RESULT            REG(0x009c)
#define HDMI_RX_HDMI_PVO_CONFIG            REG(0x00a0)
#define HDMI_RX_HDMI_RESMPL_CTRL           REG(0x00a4)
#define MAN_VID_DEREPEAT_MASK              GENMASK(4, 1)
#define MAN_VID_DEREPEAT(x)                UPDATE(x, 4, 1)
#define AUTO_DEREPEAT_MASK                 BIT(0)
#define AUTO_DEREPEAT(x)                   UPDATE(x, 0, 0)
#define HDMI_RX_HDMI_DCM_CTRL              REG(0x00a8)
#define DCM_DEFAULT_PHASE_MASK             BIT(18)
#define DCM_DEFAULT_PHASE(x)               UPDATE(x, 18, 18)
#define DCM_COLOUR_DEPTH_SEL_MASK          BIT(12)
#define DCM_COLOUR_DEPTH_SEL(x)            UPDATE(x, 12, 12)
#define DCM_COLOUR_DEPTH_MASK              GENMASK(11, 8)
#define DCM_COLOUR_DEPTH(x)                UPDATE(x, 11, 8)
#define DCM_GCP_ZERO_FIELDS_MASK           GENMASK(5, 2)
#define DCM_GCP_ZERO_FIELDS(x)             UPDATE(x, 5, 2)
#define HDMI_RX_HDMI_VM_CFG_CH_0_1         REG(0x00b0)
#define HDMI_RX_HDMI_VM_CFG_CH2            REG(0x00b4)
#define HDMI_RX_HDMI_SPARE                 REG(0x00b8)
#define HDMI_RX_HDMI_STS                   REG(0x00bc)
#define HDMI_RX_HDCP_CTRL                  REG(0x00c0)
#define HDCP_ENABLE_MASK                   BIT(24)
#define HDCP_ENABLE(x)                     UPDATE(x, 24, 24)
#define FREEZE_HDCP_FSM_MASK               BIT(21)
#define FREEZE_HDCP_FSM(x)                 UPDATE(x, 21, 21)
#define FREEZE_HDCP_STATE_MASK             GENMASK(20, 15)
#define FREEZE_HDCP_STATE(x)               UPDATE(x, 20, 15)
#define HDCP_CTL_MASK                      GENMASK(9, 8)
#define HDCP_CTL(x)                        UPDATE(x, 9, 8)
#define HDCP_RI_RATE_MASK                  GENMASK(7, 6)
#define HDCP_RI_RATE(x)                    UPDATE(x, 7, 6)
#define KEY_DECRYPT_ENABLE_MASK            BIT(1)
#define KEY_DECRYPT_ENABLE(x)              UPDATE(x, 1, 1)
#define HDCP_ENC_EN_MASK                   BIT(0)
#define HDCP_ENC_EN(x)                     UPDATE(x, 0, 0)
#define HDMI_RX_HDCP_SETTINGS              REG(0x00c4)
#define HDMI_RX_HDCP_SEED                  REG(0x00c8)
#define HDMI_RX_HDCP_BKSV1                 REG(0x00cc)
#define HDMI_RX_HDCP_BKSV0                 REG(0x00d0)
#define HDMI_RX_HDCP_KIDX                  REG(0x00d4)
#define HDMI_RX_HDCP_KEY1                  REG(0x00d8)
#define HDMI_RX_HDCP_KEY0                  REG(0x00dc)
#define HDMI_RX_HDCP_DBG                   REG(0x00e0)
#define HDMI_RX_HDCP_AKSV1                 REG(0x00e4)
#define HDMI_RX_HDCP_AKSV0                 REG(0x00e8)
#define HDMI_RX_HDCP_AN1                   REG(0x00ec)
#define HDMI_RX_HDCP_AN0                   REG(0x00f0)
#define HDMI_RX_HDCP_EESS_WOO              REG(0x00f4)
#define HDMI_RX_HDCP_I2C_TIMEOUT           REG(0x00f8)
#define HDMI_RX_HDCP_STS                   REG(0x00fc)
#define HDMI_RX_MD_HCTRL1                  REG(0x0140)
#define HACT_PIX_ITH_MASK                  GENMASK(10, 8)
#define HACT_PIX_ITH(x)                    UPDATE(x, 10, 8)
#define HACT_PIX_SRC_MASK                  BIT(5)
#define HACT_PIX_SRC(x)                    UPDATE(x, 5, 5)
#define HTOT_PIX_SRC_MASK                  BIT(4)
#define HTOT_PIX_SRC(x)                    UPDATE(x, 4, 4)
#define HDMI_RX_MD_HCTRL2                  REG(0x0144)
#define HS_CLK_ITH_MASK                    GENMASK(14, 12)
#define HS_CLK_ITH(x)                      UPDATE(x, 14, 12)
#define HTOT32_CLK_ITH_MASK                GENMASK(9, 8)
#define HTOT32_CLK_ITH(x)                  UPDATE(x, 9, 8)
#define VS_ACT_TIME_MASK                   BIT(5)
#define VS_ACT_TIME(x)                     UPDATE(x, 5, 5)
#define HS_ACT_TIME_MASK                   GENMASK(4, 3)
#define HS_ACT_TIME(x)                     UPDATE(x, 4, 3)
#define H_START_POS_MASK                   GENMASK(1, 0)
#define H_START_POS(x)                     UPDATE(x, 1, 0)
#define HDMI_RX_MD_HT0                     REG(0x0148)
#define HDMI_RX_MD_HT1                     REG(0x014c)
#define HDMI_RX_MD_HACT_PX                 REG(0x0150)
#define HDMI_RX_MD_HACT_RSV                REG(0x0154)
#define HDMI_RX_MD_VCTRL                   REG(0x0158)
#define V_OFFS_LIN_MODE_MASK               BIT(4)
#define V_OFFS_LIN_MODE(x)                 UPDATE(x, 4, 4)
#define V_EDGE_MASK                        BIT(1)
#define V_EDGE(x)                          UPDATE(x, 1, 1)
#define V_MODE_MASK                        BIT(0)
#define V_MODE(x)                          UPDATE(x, 0, 0)
#define HDMI_RX_MD_VSC                     REG(0x015c)
#define HDMI_RX_MD_VTC                     REG(0x0160)
#define HDMI_RX_MD_VOL                     REG(0x0164)
#define HDMI_RX_MD_VAL                     REG(0x0168)
#define HDMI_RX_MD_VTH                     REG(0x016c)
#define VOFS_LIN_ITH_MASK                  GENMASK(11, 10)
#define VOFS_LIN_ITH(x)                    UPDATE(x, 11, 10)
#define VACT_LIN_ITH_MASK                  GENMASK(9, 8)
#define VACT_LIN_ITH(x)                    UPDATE(x, 9, 8)
#define VTOT_LIN_ITH_MASK                  GENMASK(7, 6)
#define VTOT_LIN_ITH(x)                    UPDATE(x, 7, 6)
#define VS_CLK_ITH_MASK                    GENMASK(5, 3)
#define VS_CLK_ITH(x)                      UPDATE(x, 5, 3)
#define VTOT_CLK_ITH_MASK                  GENMASK(2, 0)
#define VTOT_CLK_ITH(x)                    UPDATE(x, 2, 0)
#define HDMI_RX_MD_VTL                     REG(0x0170)
#define HDMI_RX_MD_IL_CTRL                 REG(0x0174)
#define HDMI_RX_MD_IL_SKEW                 REG(0x0178)
#define HDMI_RX_MD_IL_POL                  REG(0x017c)
#define FAFIELDDET_EN_MASK                 BIT(2)
#define FAFIELDDET_EN(x)                   UPDATE(x, 2, 2)
#define FIELD_POL_MODE_MASK                GENMASK(1, 0)
#define FIELD_POL_MODE(x)                  UPDATE(x, 1, 0)
#define HDMI_RX_MD_STS                     REG(0x0180)
#define HDMI_RX_AUD_CTRL                   REG(0x0200)
#define HDMI_RX_AUD_PLL_CTRL               REG(0x0208)
#define PLL_LOCK_TOGGLE_DIV_MASK           GENMASK(27, 24)
#define PLL_LOCK_TOGGLE_DIV(x)             UPDATE(x, 27, 24)
#define HDMI_RX_AUD_CLK_CTRL               REG(0x0214)
#define CTS_N_REF_MASK                     BIT(4)
#define CTS_N_REF(x)                       UPDATE(x, 4, 4)
#define HDMI_RX_AUD_CLK_STS                REG(0x023c)
#define HDMI_RX_AUD_FIFO_CTRL              REG(0x0240)
#define AFIF_SUBPACKET_DESEL_MASK          GENMASK(27, 24)
#define AFIF_SUBPACKET_DESEL(x)            UPDATE(x, 27, 24)
#define AFIF_SUBPACKETS_MASK               BIT(16)
#define AFIF_SUBPACKETS(x)                 UPDATE(x, 16, 16)
#define MSA_CHANNEL_DESELECT               BIT(24)
#define HDMI_RX_AUD_FIFO_TH                REG(0x0244)
#define AFIF_TH_START_MASK                 GENMASK(26, 18)
#define AFIF_TH_START(x)                   UPDATE(x, 26, 18)
#define AFIF_TH_MAX_MASK                   GENMASK(17, 9)
#define AFIF_TH_MAX(x)                     UPDATE(x, 17, 9)
#define AFIF_TH_MIN_MASK                   GENMASK(8, 0)
#define AFIF_TH_MIN(x)                     UPDATE(x, 8, 0)
#define HDMI_RX_AUD_FIFO_FILL_S            REG(0x0248)
#define HDMI_RX_AUD_FIFO_CLR_MM            REG(0x024c)
#define HDMI_RX_AUD_FIFO_FILLSTS           REG(0x0250)
#define HDMI_RX_AUD_CHEXTR_CTRL            REG(0x0254)
#define AUD_LAYOUT_CTRL(x)                 UPDATE(x, 1, 0)
#define HDMI_RX_AUD_MUTE_CTRL              REG(0x0258)
#define APPLY_INT_MUTE_MASK                BIT(31)
#define APPLY_INT_MUTE(x)                  UPDATE(x, 31, 31)
#define APORT_SHDW_CTRL_MASK               GENMASK(22, 21)
#define APORT_SHDW_CTRL(x)                 UPDATE(x, 22, 21)
#define AUTO_ACLK_MUTE_MASK                GENMASK(20, 19)
#define AUTO_ACLK_MUTE(x)                  UPDATE(x, 20, 19)
#define AUD_MUTE_SPEED_MASK                GENMASK(16, 10)
#define AUD_MUTE_SPEED(x)                  UPDATE(x, 16, 10)
#define AUD_AVMUTE_EN_MASK                 BIT(7)
#define AUD_AVMUTE_EN(x)                   UPDATE(x, 7, 7)
#define AUD_MUTE_SEL_MASK                  GENMASK(6, 5)
#define AUD_MUTE_SEL(x)                    UPDATE(x, 6, 5)
#define AUD_MUTE_MODE_MASK                 GENMASK(4, 3)
#define AUD_MUTE_MODE(x)                   UPDATE(x, 4, 3)
#define HDMI_RX_AUD_FIFO_FILLSTS1          REG(0x025c)
#define HDMI_RX_AUD_SAO_CTRL               REG(0x0260)
#define I2S_LPCM_BPCUV_MASK                BIT(11)
#define I2S_LPCM_BPCUV(x)                  UPDATE(x, 11, 11)
#define I2S_32_16_MASK                     BIT(0)
#define I2S_32_16(x)                       UPDATE(x, 0, 0)
#define HDMI_RX_AUD_PAO_CTRL               REG(0x0264)
#define PAO_RATE_MASK                      GENMASK(17, 16)
#define PAO_RATE(x)                        UPDATE(x, 17, 16)
#define HDMI_RX_AUD_SPARE                  REG(0x0268)
#define HDMI_RX_AUD_FIFO_STS               REG(0x027c)
#define HDMI_RX_AUDPLL_GEN_CTS             REG(0x0280)
#define AUDPLL_CTS_MANUAL(x)               UPDATE(x, 19, 0)
#define HDMI_RX_AUDPLL_GEN_N               REG(0x0284)
#define AUDPLL_N_MANUAL(x)                 UPDATE(x, 19, 0)
#define HDMI_RX_AUDPLL_GEN_CTRL_RW1        REG(0x0288)
#define HDMI_RX_AUDPLL_GEN_CTRL_RW2        REG(0x028c)
#define HDMI_RX_AUDPLL_GEN_CTRL_W1         REG(0x0298)
#define HDMI_RX_AUDPLL_GEN_STS_RO1         REG(0x02a0)
#define HDMI_RX_AUDPLL_GEN_STS_RO2         REG(0x02a4)
#define HDMI_RX_AUDPLL_SC_NDIVCTSTH        REG(0x02a8)
#define HDMI_RX_AUDPLL_SC_CTS              REG(0x02ac)
#define HDMI_RX_AUDPLL_SC_N                REG(0x02b0)
#define HDMI_RX_AUDPLL_SC_CTRL             REG(0x02b4)
#define HDMI_RX_AUDPLL_SC_STS1             REG(0x02b8)
#define HDMI_RX_AUDPLL_SC_STS2             REG(0x02bc)
#define HDMI_RX_SNPS_PHYG3_CTRL            REG(0x02c0)
#define PORTSELECT_MASK                    GENMASK(3, 2)
#define PORTSELECT(x)                      UPDATE(x, 3, 2)
#define HDMI_RX_I2CM_PHYG3_SLAVE           REG(0x02c4)
#define HDMI_RX_I2CM_PHYG3_ADDRESS         REG(0x02c8)
#define HDMI_RX_I2CM_PHYG3_DATAO           REG(0x02cc)
#define HDMI_RX_I2CM_PHYG3_DATAI           REG(0x02d0)
#define HDMI_RX_I2CM_PHYG3_OPERATION       REG(0x02d4)
#define HDMI_RX_I2CM_PHYG3_MODE            REG(0x02d8)
#define HDMI_RX_I2CM_PHYG3_SOFTRST         REG(0x02dc)
#define HDMI_RX_I2CM_PHYG3_SS_CNTS         REG(0x02e0)
#define HDMI_RX_I2CM_PHYG3_FS_HCNT         REG(0x02e4)
#define HDMI_RX_JTAG_CONF                  REG(0x02ec)
#define HDMI_RX_JTAG_TAP_TCLK              REG(0x02f0)
#define HDMI_RX_JTAG_TAP_IN                REG(0x02f4)
#define HDMI_RX_JTAG_TAP_OUT               REG(0x02f8)
#define HDMI_RX_JTAG_ADDR                  REG(0x02fc)
#define HDMI_RX_PDEC_CTRL                  REG(0x0300)
#define PFIFO_SCORE_FILTER_EN              BIT(31)
#define PFIFO_SCORE_HDP_IF                 BIT(29)
#define PFIFO_SCORE_AMP_IF                 BIT(28)
#define PFIFO_SCORE_NTSCVBI_IF             BIT(27)
#define PFIFO_SCORE_MPEGS_IF               BIT(26)
#define PFIFO_SCORE_AUD_IF                 BIT(25)
#define PFIFO_SCORE_SPD_IF                 BIT(24)
#define PFIFO_SCORE_AVI_IF                 BIT(23)
#define PFIFO_SCORE_VS_IF                  BIT(22)
#define PFIFO_SCORE_GMTP                   BIT(21)
#define PFIFO_SCORE_ISRC2                  BIT(20)
#define PFIFO_SCORE_ISRC1                  BIT(19)
#define PFIFO_SCORE_ACP                    BIT(18)
#define PFIFO_SCORE_GCP                    BIT(17)
#define PFIFO_SCORE_ACR                    BIT(16)
#define GCP_GLOBAVMUTE                     BIT(15)
#define PD_FIFO_WE                         BIT(4)
#define PDEC_BCH_EN                        BIT(0)
#define HDMI_RX_PDEC_FIFO_CFG              REG(0x0304)
#define PD_FIFO_TH_START_MASK              GENMASK(29, 20)
#define PD_FIFO_TH_START(x)                UPDATE(x, 29, 20)
#define PD_FIFO_TH_MAX_MASK                GENMASK(19, 10)
#define PD_FIFO_TH_MAX(x)                  UPDATE(x, 19, 10)
#define PD_FIFO_TH_MIN_MASK                GENMASK(9, 0)
#define PD_FIFO_TH_MIN(x)                  UPDATE(x, 9, 0)
#define HDMI_RX_PDEC_FIFO_STS              REG(0x0308)
#define HDMI_RX_PDEC_FIFO_DATA             REG(0x030c)
#define HDMI_RX_PDEC_AUDIODET_CTRL         REG(0x0310)
#define AUDIODET_THRESHOLD_MASK            GENMASK(13, 9)
#define AUDIODET_THRESHOLD(x)              UPDATE(x, 13, 9)
#define HDMI_RX_PDEC_DBG_ACP               REG(0x031c)
#define HDMI_RX_PDEC_DBG_ERR_CORR          REG(0x0320)
#define HDMI_RX_PDEC_FIFO_STS1             REG(0x0324)
#define HDMI_RX_PDEC_ACRM_CTRL             REG(0x0330)
#define DELTACTS_IRQTRIG_MASK              GENMASK(4, 2)
#define DELTACTS_IRQTRIG(x)                UPDATE(x, 4, 2)
#define HDMI_RX_PDEC_ACRM_MAX              REG(0x0334)
#define HDMI_RX_PDEC_ACRM_MIN              REG(0x0338)
#define HDMI_RX_PDEC_ERR_FILTER            REG(0x033c)
#define HDMI_RX_PDEC_ASP_CTRL              REG(0x0340)
#define HDMI_RX_PDEC_ASP_ERR               REG(0x0344)
#define HDMI_RX_PDEC_STS                   REG(0x0360)
#define HDMI_RX_PDEC_AUD_STS               REG(0x0364)
#define HDMI_RX_PDEC_VSI_PAYLOAD0          REG(0x0368)
#define HDMI_RX_PDEC_VSI_PAYLOAD1          REG(0x036c)
#define HDMI_RX_PDEC_VSI_PAYLOAD2          REG(0x0370)
#define HDMI_RX_PDEC_VSI_PAYLOAD3          REG(0x0374)
#define HDMI_RX_PDEC_VSI_PAYLOAD4          REG(0x0378)
#define HDMI_RX_PDEC_VSI_PAYLOAD5          REG(0x037c)
#define HDMI_RX_PDEC_GCP_AVMUTE            REG(0x0380)
#define PKTDEC_GCP_CD_MASK                 GENMASK(7, 4)
#define HDMI_RX_PDEC_ACR_CTS               REG(0x0390)
#define HDMI_RX_PDEC_ACR_N                 REG(0x0394)
#define HDMI_RX_PDEC_AVI_HB                REG(0x03a0)
#define HDMI_RX_PDEC_AVI_PB                REG(0x03a4)
#define VID_IDENT_CODE_VIC7                BIT(31)
#define VID_IDENT_CODE                     GENMASK(30, 24)
#define VIDEO_FORMAT                       GENMASK(6, 5)
#define HDMI_RX_PDEC_AVI_TBB               REG(0x03a8)
#define HDMI_RX_PDEC_AVI_LRB               REG(0x03ac)
#define HDMI_RX_PDEC_AIF_CTRL              REG(0x03c0)
#define FC_LFE_EXCHG                       BIT(18)
#define HDMI_RX_PDEC_AIF_HB                REG(0x03c4)
#define HDMI_RX_PDEC_AIF_PB0               REG(0x03c8)
#define HDMI_RX_PDEC_AIF_PB1               REG(0x03cc)
#define HDMI_RX_PDEC_GMD_HB                REG(0x03d0)
#define HDMI_RX_PDEC_GMD_PB                REG(0x03d4)
#define HDMI_RX_PDEC_VSI_ST0               REG(0x03e0)
#define HDMI_RX_PDEC_VSI_ST1               REG(0x03e4)
#define HDMI_RX_PDEC_VSI_PB0               REG(0x03e8)
#define HDMI_RX_PDEC_VSI_PB1               REG(0x03ec)
#define HDMI_RX_PDEC_VSI_PB2               REG(0x03f0)
#define HDMI_RX_PDEC_VSI_PB3               REG(0x03f4)
#define HDMI_RX_PDEC_VSI_PB4               REG(0x03f8)
#define HDMI_RX_PDEC_VSI_PB5               REG(0x03fc)
#define HDMI_RX_CEAVID_CONFIG              REG(0x0400)
#define HDMI_RX_CEAVID_3DCONFIG            REG(0x0404)
#define HDMI_RX_CEAVID_HCONFIG_LO          REG(0x0408)
#define HDMI_RX_CEAVID_HCONFIG_HI          REG(0x040c)
#define HDMI_RX_CEAVID_VCONFIG_LO          REG(0x0410)
#define HDMI_RX_CEAVID_VCONFIG_HI          REG(0x0414)
#define HDMI_RX_CEAVID_STATUS              REG(0x0418)
#define HDMI_RX_PDEC_AMP_HB                REG(0x0480)
#define HDMI_RX_PDEC_AMP_PAYLOAD0          REG(0x0484)
#define HDMI_RX_PDEC_AMP_PAYLOAD1          REG(0x0488)
#define HDMI_RX_PDEC_AMP_PAYLOAD2          REG(0x048c)
#define HDMI_RX_PDEC_AMP_PAYLOAD3          REG(0x0490)
#define HDMI_RX_PDEC_AMP_PAYLOAD4          REG(0x0494)
#define HDMI_RX_PDEC_AMP_PAYLOAD5          REG(0x0498)
#define HDMI_RX_PDEC_AMP_PAYLOAD6          REG(0x049c)
#define HDMI_RX_PDEC_NTSCVBI_HB            REG(0x04a0)
#define HDMI_RX_PDEC_NTSCVBI_PAYLOAD0      REG(0x04a4)
#define HDMI_RX_PDEC_NTSCVBI_PAYLOAD1      REG(0x04a8)
#define HDMI_RX_PDEC_NTSCVBI_PAYLOAD2      REG(0x04ac)
#define HDMI_RX_PDEC_NTSCVBI_PAYLOAD3      REG(0x04b0)
#define HDMI_RX_PDEC_NTSCVBI_PAYLOAD4      REG(0x04b4)
#define HDMI_RX_PDEC_NTSCVBI_PAYLOAD5      REG(0x04b8)
#define HDMI_RX_PDEC_NTSCVBI_PAYLOAD6      REG(0x04bc)
#define HDMI_RX_PDEC_DRM_HB                REG(0x04c0)
#define HDMI_RX_PDEC_DRM_PAYLOAD0          REG(0x04c4)
#define HDMI_RX_PDEC_DRM_PAYLOAD1          REG(0x04c8)
#define HDMI_RX_PDEC_DRM_PAYLOAD2          REG(0x04cc)
#define HDMI_RX_PDEC_DRM_PAYLOAD3          REG(0x04d0)
#define HDMI_RX_PDEC_DRM_PAYLOAD4          REG(0x04d4)
#define HDMI_RX_PDEC_DRM_PAYLOAD5          REG(0x04d8)
#define HDMI_RX_PDEC_DRM_PAYLOAD6          REG(0x04dc)
#define HDMI_RX_MHLMODE_CTRL               REG(0x0500)
#define HDMI_RX_CDSENSE_STATUS             REG(0x0504)
#define HDMI_RX_DESERFIFO_CTRL             REG(0x0508)
#define HDMI_RX_DESER_INTTRSHCTRL          REG(0x050c)
#define HDMI_RX_DESER_INTCNTCTRL           REG(0x0510)
#define HDMI_RX_DESER_INTCNT               REG(0x0514)
#define HDMI_RX_HDCP_RPT_CTRL              REG(0x0600)
#define HDMI_RX_HDCP_RPT_BSTATUS           REG(0x0604)
#define HDMI_RX_HDCP_RPT_KSVFIFO_CTRL      REG(0x0608)
#define HDMI_RX_HDCP_RPT_KSVFIFO1          REG(0x060c)
#define HDMI_RX_HDCP_RPT_KSVFIFO0          REG(0x0610)
#define HDMI_RX_HDMI20_CONTROL             REG(0x0800)
#define HDMI_RX_SCDC_I2CCONFIG             REG(0x0804)
#define I2CSPIKESUPPR_MASK                 GENMASK(25, 24)
#define I2CSPIKESUPPR(x)                   UPDATE(x, 25, 24)
#define HDMI_RX_SCDC_CONFIG                REG(0x0808)
#define HDMI_RX_CHLOCK_CONFIG              REG(0x080c)
#define CHLOCKMAXER_MASK                   GENMASK(29, 20)
#define CHLOCKMAXER(x)                     UPDATE(x, 29, 20)
#define MILISECTIMERLIMIT_MASK             GENMASK(15, 0)
#define MILISECTIMERLIMIT(x)               UPDATE(x, 15, 0)
#define HDMI_RX_HDCP22_CONTROL             REG(0x081c)
#define HDMI_RX_SCDC_REGS0                 REG(0x0820)
#define HDMI_RX_SCDC_REGS1                 REG(0x0824)
#define HDMI_RX_SCDC_REGS2                 REG(0x0828)
#define HDMI_RX_SCDC_REGS3                 REG(0x082c)
#define HDMI_RX_SCDC_MANSPEC0              REG(0x0840)
#define HDMI_RX_SCDC_MANSPEC1              REG(0x0844)
#define HDMI_RX_SCDC_MANSPEC2              REG(0x0848)
#define HDMI_RX_SCDC_MANSPEC3              REG(0x084c)
#define HDMI_RX_SCDC_MANSPEC4              REG(0x0850)
#define HDMI_RX_SCDC_WRDATA0               REG(0x0860)
#define MANUFACTUREROUI_MASK               GENMASK(31, 8)
#define MANUFACTUREROUI(x)                 UPDATE(x, 31, 8)
#define SINKVERSION_MASK                   GENMASK(7, 0)
#define SINKVERSION(x)                     UPDATE(x, 7, 0)
#define HDMI_RX_SCDC_WRDATA1               REG(0x0864)
#define HDMI_RX_SCDC_WRDATA2               REG(0x0868)
#define HDMI_RX_SCDC_WRDATA3               REG(0x086c)
#define HDMI_RX_SCDC_WRDATA4               REG(0x0870)
#define HDMI_RX_SCDC_WRDATA5               REG(0x0874)
#define HDMI_RX_SCDC_WRDATA6               REG(0x0878)
#define HDMI_RX_SCDC_WRDATA7               REG(0x087c)
#define HDMI_RX_HDMI20_STATUS              REG(0x08e0)
#define HDMI_RX_HDCP2_ESM_GLOBAL_GPIO_IN   REG(0x08e8)
#define HDMI_RX_HDCP2_ESM_GLOBAL_GPIO_OUT  REG(0x08ec)
#define HDMI_RX_HDCP2_ESM_P0_GPIO_IN       REG(0x08f0)
#define HDMI_RX_HDCP2_ESM_P0_GPIO_OUT      REG(0x08f4)
#define HDMI_RX_HDCP22_STATUS              REG(0x08fc)
#define HDMI_RX_HDMI2_IEN_CLR              REG(0x0f60)
#define HDMI_RX_HDMI2_IEN_SET              REG(0x0f64)
#define HDMI_RX_HDMI2_ISTS                 REG(0x0f68)
#define HDMI_RX_HDMI2_IEN                  REG(0x0f6c)
#define HDMI_RX_HDMI2_ICLR                 REG(0x0f70)
#define HDMI_RX_HDMI2_ISET                 REG(0x0f74)
#define HDMI_RX_PDEC_IEN_CLR               REG(0x0f78)
#define HDMI_RX_PDEC_IEN_SET               REG(0x0f7c)
#define HDMI_RX_PDEC_ISTS                  REG(0x0f80)
#define HDMI_RX_PDEC_IEN                   REG(0x0f84)
#define HDMI_RX_PDEC_ICLR                  REG(0x0f88)
#define HDMI_RX_PDEC_ISET                  REG(0x0f8c)
#define HDMI_RX_AUD_CEC_IEN_CLR            REG(0x0f90)
#define HDMI_RX_AUD_CEC_IEN_SET            REG(0x0f94)
#define HDMI_RX_AUD_CEC_ISTS               REG(0x0f98)
#define HDMI_RX_AUD_CEC_IEN                REG(0x0f9c)
#define HDMI_RX_AUD_CEC_ICLR               REG(0x0fa0)
#define HDMI_RX_AUD_CEC_ISET               REG(0x0fa4)
#define HDMI_RX_AUD_FIFO_IEN_CLR           REG(0x0fa8)
#define HDMI_RX_AUD_FIFO_IEN_SET           REG(0x0fac)
#define HDMI_RX_AUD_FIFO_ISTS              REG(0x0fb0)
#define HDMI_RX_AUD_FIFO_IEN               REG(0x0fb4)
#define HDMI_RX_AUD_FIFO_ICLR              REG(0x0fb8)
#define HDMI_RX_AUD_FIFO_ISET              REG(0x0fbc)
#define HDMI_RX_MD_IEN_CLR                 REG(0x0fc0)
#define HDMI_RX_MD_IEN_SET                 REG(0x0fc4)
#define HDMI_RX_MD_ISTS                    REG(0x0fc8)
#define HDMI_RX_MD_IEN                     REG(0x0fcc)
#define HDMI_RX_MD_ICLR                    REG(0x0fd0)
#define HDMI_RX_MD_ISET                    REG(0x0fd4)
#define HDMI_RX_HDMI_IEN_CLR               REG(0x0fd8)
#define HDMI_RX_HDMI_IEN_SET               REG(0x0fdc)
#define HDCP_DKSET_DONE_ENCLR_MASK         BIT(31)
#define HDCP_DKSET_DONE_ENCLR(x)           UPDATE(x, 31, 31)
#define HDMI_RX_HDMI_ISTS                  REG(0x0fe0)
#define HDMI_RX_HDMI_IEN                   REG(0x0fe4)
#define HDMI_RX_HDMI_ICLR                  REG(0x0fe8)
#define HDMI_RX_HDMI_ISET                  REG(0x0fec)
#define HDMI_RX_DMI_SW_RST                 REG(0x0ff0)
#define HDMI_RX_DMI_DISABLE_IF             REG(0x0ff4)
#define MAIN_ENABLE                        BIT(0)
#define MODET_ENABLE                       BIT(1)
#define HDMI_ENABLE                        BIT(2)
#define BUS_ENABLE                         BIT(3)
#define AUD_ENABLE                         BIT(4)
#define CEC_ENABLE                         BIT(5)
#define PIXEL_ENABLE                       BIT(6)
#define VID_ENABLE                         BIT(7)
#define TMDS_ENABLE_MASK                   BIT(16)
#define TMDS_ENABLE(x)                     UPDATE(x, 16, 16)
#define HDMI_RX_DMI_MODULE_ID_EXT          REG(0x0ff8)
#define HDMI_RX_DMI_MODULE_ID              REG(0x0ffc)
#define HDMI_RX_CEC_CTRL                   REG(0x1f00)
#define HDMI_RX_CEC_MASK                   REG(0x1f08)
#define HDMI_RX_CEC_ADDR_L                 REG(0x1f14)
#define HDMI_RX_CEC_ADDR_H                 REG(0x1f18)
#define HDMI_RX_CEC_TX_CNT                 REG(0x1f1c)
#define HDMI_RX_CEC_RX_CNT                 REG(0x1f20)
#define HDMI_RX_CEC_TX_DATA_0              REG(0x1f40)
#define HDMI_RX_CEC_TX_DATA_1              REG(0x1f44)
#define HDMI_RX_CEC_TX_DATA_2              REG(0x1f48)
#define HDMI_RX_CEC_TX_DATA_3              REG(0x1f4c)
#define HDMI_RX_CEC_TX_DATA_4              REG(0x1f50)
#define HDMI_RX_CEC_TX_DATA_5              REG(0x1f54)
#define HDMI_RX_CEC_TX_DATA_6              REG(0x1f58)
#define HDMI_RX_CEC_TX_DATA_7              REG(0x1f5c)
#define HDMI_RX_CEC_TX_DATA_8              REG(0x1f60)
#define HDMI_RX_CEC_TX_DATA_9              REG(0x1f64)
#define HDMI_RX_CEC_TX_DATA_10             REG(0x1f68)
#define HDMI_RX_CEC_TX_DATA_11             REG(0x1f6c)
#define HDMI_RX_CEC_TX_DATA_12             REG(0x1f70)
#define HDMI_RX_CEC_TX_DATA_13             REG(0x1f74)
#define HDMI_RX_CEC_TX_DATA_14             REG(0x1f78)
#define HDMI_RX_CEC_TX_DATA_15             REG(0x1f7c)
#define HDMI_RX_CEC_RX_DATA_0              REG(0x1f80)
#define HDMI_RX_CEC_RX_DATA_1              REG(0x1f84)
#define HDMI_RX_CEC_RX_DATA_2              REG(0x1f88)
#define HDMI_RX_CEC_RX_DATA_3              REG(0x1f8c)
#define HDMI_RX_CEC_RX_DATA_4              REG(0x1f90)
#define HDMI_RX_CEC_RX_DATA_5              REG(0x1f94)
#define HDMI_RX_CEC_RX_DATA_6              REG(0x1f98)
#define HDMI_RX_CEC_RX_DATA_7              REG(0x1f9c)
#define HDMI_RX_CEC_RX_DATA_8              REG(0x1fa0)
#define HDMI_RX_CEC_RX_DATA_9              REG(0x1fa4)
#define HDMI_RX_CEC_RX_DATA_10             REG(0x1fa8)
#define HDMI_RX_CEC_RX_DATA_11             REG(0x1fac)
#define HDMI_RX_CEC_RX_DATA_12             REG(0x1fb0)
#define HDMI_RX_CEC_RX_DATA_13             REG(0x1fb4)
#define HDMI_RX_CEC_RX_DATA_14             REG(0x1fb8)
#define HDMI_RX_CEC_RX_DATA_15             REG(0x1fbc)
#define HDMI_RX_CEC_LOCK                   REG(0x1fc0)
#define HDMI_RX_CEC_WAKEUPCTRL             REG(0x1fc4)
#define HDMI_RX_CBUSSWRESETREQ             REG(0x3000)
#define HDMI_RX_CBUSENABLEIF               REG(0x3004)
#define HDMI_RX_CB_LOCKONCLOCK_STS         REG(0x3010)
#define HDMI_RX_CB_LOCKONCLOCKCLR          REG(0x3014)
#define HDMI_RX_CBUSIOCTRL                 REG(0x3020)
#define HDMI_RX_DD_CTRL                    REG(0x3040)
#define HDMI_RX_DD_OP_CTRL                 REG(0x3044)
#define HDMI_RX_DD_STS                     REG(0x3048)
#define HDMI_RX_DD_BYPASS_EN               REG(0x304c)
#define HDMI_RX_DD_BYPASS_CTRL             REG(0x3050)
#define HDMI_RX_DD_BYPASS_CBUS             REG(0x3054)
#define HDMI_RX_LL_TXPCKFIFO               REG(0x3080)
#define HDMI_RX_LL_RXPCKFIFO_RD_CLR        REG(0x3084)
#define HDMI_RX_LL_RXPCKFIFO_A             REG(0x3088)
#define HDMI_RX_LL_RXPCKFIFO_B             REG(0x308c)
#define HDMI_RX_LL_TXPCKCTRL_0             REG(0x3090)
#define HDMI_RX_LL_TXPCKCTRL_1             REG(0x3094)
#define HDMI_RX_LL_PCKFIFO_STS             REG(0x309c)
#define HDMI_RX_LL_RXPCKCTRL_0             REG(0x30a0)
#define HDMI_RX_LL_RXPCKCTRL_1             REG(0x30a4)
#define HDMI_RX_LL_INTTRSHLDCTRL           REG(0x30b0)
#define HDMI_RX_LL_INTCNTCTRL              REG(0x30b4)
#define HDMI_RX_LL_INTCNT_0                REG(0x30b8)
#define HDMI_RX_LL_INTCNT_1                REG(0x30bc)
#define HDMI_RX_CBHDCP_OPCTRL              REG(0x3100)
#define HDMI_RX_CBHDCP_WDATA_0             REG(0x3104)
#define HDMI_RX_CBHDCP_WDATA_1             REG(0x3108)
#define HDMI_RX_CBHDCP_RDATA_0             REG(0x310c)
#define HDMI_RX_CBHDCP_RDATA_1             REG(0x3110)
#define HDMI_RX_CBHDCP_STATUS              REG(0x3114)
#define HDMI_RX_CBHDCP_DDC_REPORT          REG(0x3118)
#define HDMI_RX_ISTAT_CB_DD                REG(0x3200)
#define HDMI_RX_IMASK_CB_DD                REG(0x3204)
#define HDMI_RX_IFORCE_CB_DD               REG(0x3208)
#define HDMI_RX_ICLEAR_CB_DD               REG(0x320c)
#define HDMI_RX_IMUTE_CB_DD                REG(0x3210)
#define HDMI_RX_ISTAT_CB_LL                REG(0x3220)
#define HDMI_RX_IMASK_CB_LL                REG(0x3224)
#define HDMI_RX_IFORCE_CB_LL               REG(0x3228)
#define HDMI_RX_ICLEAR_CB_LL               REG(0x322c)
#define HDMI_RX_IMUTE_CB_LL                REG(0x3230)
#define HDMI_RX_ISTAT_CB_HDCP              REG(0x3240)
#define HDMI_RX_IMASK_CB_HDCP              REG(0x3244)
#define HDMI_RX_IFORCE_CB_HDCP             REG(0x3248)
#define HDMI_RX_ICLEAR_CB_HDCP             REG(0x324c)
#define HDMI_RX_IMUTE_CB_HDCP              REG(0x3250)
#define HDMI_RX_ISTAT_CB_MCTRL             REG(0x3260)
#define HDMI_RX_IMASK_CB_MCTRL             REG(0x3264)
#define HDMI_RX_IFORCE_CB_MCTRL            REG(0x3268)
#define HDMI_RX_ICLEAR_CB_MCTRL            REG(0x326c)
#define HDMI_RX_IMUTE_CB_MCTRL             REG(0x3270)
#define HDMI_RX_IMASTER_MUTE_CB            REG(0x32e0)
#define HDMI_RX_IVECTOR_INDEX_CB           REG(0x32e4)
#define HDMI_RX_MAX_REGISTER               HDMI_RX_IVECTOR_INDEX_CB
 
struct rk628_hdmirx {
   struct drm_bridge base;
   struct drm_bridge *bridge;
   struct device *dev;
   struct regmap *regmap;
   struct regmap *grf;
   struct phy *phy;
   struct clk *pclk;
   struct clk *cec_clk;
   struct clk *aud_clk;
   struct clk *imodet_clk;
   struct reset_control *hdmirx;
   struct reset_control *hdmirx_pon;
   struct rk628 *parent;
   struct drm_display_mode mode;
};
 
static const struct regmap_range rk628_hdmirx_readable_ranges[] = {
   regmap_reg_range(HDMI_RX_HDMI_SETUP_CTRL, HDMI_RX_HDMI_TIMER_CTRL),
   regmap_reg_range(HDMI_RX_HDMI_MODE_RECOVER, HDMI_RX_HDMI_ERD_STS),
   regmap_reg_range(HDMI_RX_MD_HCTRL1, HDMI_RX_MD_STS),
   regmap_reg_range(HDMI_RX_PDEC_ACRM_CTRL, HDMI_RX_PDEC_ASP_ERR),
   regmap_reg_range(HDMI_RX_PDEC_AVI_HB, HDMI_RX_PDEC_AVI_LRB),
   regmap_reg_range(HDMI_RX_PDEC_AIF_CTRL, HDMI_RX_PDEC_GMD_PB),
   regmap_reg_range(HDMI_RX_HDMI20_CONTROL, HDMI_RX_CHLOCK_CONFIG),
   regmap_reg_range(HDMI_RX_SCDC_REGS1, HDMI_RX_SCDC_REGS3),
   regmap_reg_range(HDMI_RX_SCDC_WRDATA0, HDMI_RX_SCDC_WRDATA7),
   regmap_reg_range(HDMI_RX_DMI_DISABLE_IF, HDMI_RX_DMI_DISABLE_IF),
};
 
static const struct regmap_access_table rk628_hdmirx_readable_table = {
   .yes_ranges    = rk628_hdmirx_readable_ranges,
   .n_yes_ranges   = ARRAY_SIZE(rk628_hdmirx_readable_ranges),
};
 
static const struct regmap_config rk628_hdmirx_regmap_config = {
   .name = "hdmirx",
   .reg_bits = 32,
   .val_bits = 32,
   .reg_stride = 4,
   .max_register = HDMI_RX_MAX_REGISTER,
   .reg_format_endian = REGMAP_ENDIAN_LITTLE,
   .val_format_endian = REGMAP_ENDIAN_LITTLE,
   .rd_table = &rk628_hdmirx_readable_table,
};
 
static inline struct rk628_hdmirx *bridge_to_hdmirx(struct drm_bridge *bridge)
{
   return container_of(bridge, struct rk628_hdmirx, base);
}
 
static void rk628_hdmirx_ctrl_enable(struct rk628_hdmirx *hdmirx)
{
   clk_prepare_enable(hdmirx->pclk);
   clk_prepare_enable(hdmirx->aud_clk);
   clk_prepare_enable(hdmirx->imodet_clk);
 
   reset_control_deassert(hdmirx->hdmirx);
   reset_control_deassert(hdmirx->hdmirx_pon);
 
   regmap_update_bits(hdmirx->grf, GRF_SYSTEM_CON0,
              SW_INPUT_MODE_MASK,
              SW_INPUT_MODE(INPUT_MODE_HDMI));
 
   regmap_write(hdmirx->regmap, HDMI_RX_DMI_SW_RST, 0x000101ff);
 
   regmap_write(hdmirx->regmap, HDMI_RX_DMI_DISABLE_IF, 0x00000000);
   regmap_write(hdmirx->regmap, HDMI_RX_DMI_DISABLE_IF, 0x0000017f);
   regmap_write(hdmirx->regmap, HDMI_RX_DMI_DISABLE_IF, 0x0001017f);
 
   regmap_write(hdmirx->regmap, HDMI_RX_HDMI20_CONTROL, 0x10001f10);
 
   regmap_update_bits(hdmirx->regmap, HDMI_RX_CHLOCK_CONFIG,
              CHLOCKMAXER_MASK | MILISECTIMERLIMIT_MASK,
              CHLOCKMAXER(0x1) | MILISECTIMERLIMIT(49500));
 
   regmap_write(hdmirx->regmap, HDMI_RX_SCDC_CONFIG, 0x00000001);
   regmap_write(hdmirx->regmap, HDMI_RX_DMI_SW_RST, 0x000001fe);
   regmap_write(hdmirx->regmap, HDMI_RX_HDMI_CKM_EVLTM, 0x0016fff0);
   regmap_write(hdmirx->regmap, HDMI_RX_HDMI_CKM_F, 0xf98a0190);
 
   regmap_update_bits(hdmirx->regmap, HDMI_RX_HDMI_MODE_RECOVER,
              SPIKE_FILTER_EN_MASK | DVI_MODE_HYST_MASK |
              HDMI_MODE_HYST_MASK | HDMI_MODE_MASK |
              GB_DET_MASK | EESS_OESS_MASK | SEL_CTL01_MASK,
              SPIKE_FILTER_EN(0) |
              DVI_MODE_HYST(0) |
              HDMI_MODE_HYST(0) |
              HDMI_MODE(3) |
              GB_DET(2) |
              EESS_OESS(0) |
              SEL_CTL01(1));
 
   regmap_write(hdmirx->regmap, HDMI_RX_PDEC_CTRL, 0xbfff8011);
   regmap_write(hdmirx->regmap, HDMI_RX_PDEC_ASP_CTRL, 0x00000040);
 
   regmap_update_bits(hdmirx->regmap, HDMI_RX_HDMI_RESMPL_CTRL,
              MAN_VID_DEREPEAT_MASK, MAN_VID_DEREPEAT(1));
 
   regmap_update_bits(hdmirx->regmap, HDMI_RX_HDMI_SYNC_CTRL,
              VS_POL_ADJ_MODE_MASK | HS_POL_ADJ_MODE_MASK,
              VS_POL_ADJ_MODE(2) | HS_POL_ADJ_MODE(2));
 
   regmap_write(hdmirx->regmap, HDMI_RX_PDEC_ERR_FILTER, 0x00000008);
 
   regmap_update_bits(hdmirx->regmap, HDMI_RX_SCDC_I2CCONFIG,
              I2CSPIKESUPPR_MASK, I2CSPIKESUPPR(1));
 
   regmap_write(hdmirx->regmap, HDMI_RX_SCDC_CONFIG, 0x00000001);
   regmap_write(hdmirx->regmap, HDMI_RX_SCDC_WRDATA0, 0xabcdef01);
 
   regmap_update_bits(hdmirx->regmap, HDMI_RX_CHLOCK_CONFIG,
              CHLOCKMAXER_MASK | MILISECTIMERLIMIT_MASK,
              CHLOCKMAXER(0x1) | MILISECTIMERLIMIT(49500));
 
   regmap_write(hdmirx->regmap, HDMI_RX_HDMI_ERROR_PROTECT, 0x000d0c98);
   regmap_write(hdmirx->regmap, HDMI_RX_MD_HCTRL1, 0x00000010);
   regmap_write(hdmirx->regmap, HDMI_RX_MD_HCTRL2, 0x00001738);
   regmap_write(hdmirx->regmap, HDMI_RX_MD_VCTRL, 0x00000012);
   regmap_write(hdmirx->regmap, HDMI_RX_MD_VTH, 0x0000073a);
   regmap_write(hdmirx->regmap, HDMI_RX_MD_IL_POL, 0x00000004);
   regmap_write(hdmirx->regmap, HDMI_RX_PDEC_ACRM_CTRL, 0x00000000);
   regmap_write(hdmirx->regmap, HDMI_RX_HDMI_DCM_CTRL, 0x00040414);
   regmap_write(hdmirx->regmap, HDMI_RX_HDMI_PCB_CTRL, 0x00100000);
   regmap_write(hdmirx->regmap, HDMI_RX_HDMI_SETUP_CTRL, 0x0f000fff);
   regmap_write(hdmirx->regmap, HDMI_RX_HDMI_CKM_EVLTM, 0x00104260);
   regmap_write(hdmirx->regmap, HDMI_RX_HDMI_CKM_F, 0x0f2d0eed);
   regmap_write(hdmirx->regmap, HDMI_RX_DMI_DISABLE_IF, 0x00000001);
   udelay(400);
   regmap_write(hdmirx->regmap, HDMI_RX_DMI_DISABLE_IF, 0x0001017f);
   regmap_update_bits(hdmirx->regmap, HDMI_RX_HDMI_RESMPL_CTRL,
              MAN_VID_DEREPEAT_MASK, MAN_VID_DEREPEAT(1));
   regmap_write(hdmirx->regmap, HDMI_RX_DMI_SW_RST, 0x000001fe);
}
 
static void rk628_hdmirx_ctrl_disable(struct rk628_hdmirx *hdmirx)
{
   reset_control_assert(hdmirx->hdmirx);
   reset_control_assert(hdmirx->hdmirx_pon);
   clk_disable_unprepare(hdmirx->pclk);
   clk_disable_unprepare(hdmirx->aud_clk);
   clk_disable_unprepare(hdmirx->imodet_clk);
}
 
static void rk628_hdmirx_bridge_enable(struct drm_bridge *bridge)
{
   bool locked;
   u32 value, i, hact, vact, bus_width, hdisplay, vdisplay;
   struct rk628_hdmirx *hdmirx = bridge_to_hdmirx(bridge);
 
   /* force 594m mode to yuv420 format */
   if (hdmirx->mode.clock == 594000) {
       /*
        * bit30 is used to indicate whether it is
        * yuv420 format
        */
       bus_width = hdmirx->mode.clock | BIT(30);
       hdisplay = hdmirx->mode.hdisplay / 2;
   } else {
       bus_width = hdmirx->mode.clock;
       hdisplay = hdmirx->mode.hdisplay;
   }
 
   vdisplay = hdmirx->mode.vdisplay;
 
   phy_set_bus_width(hdmirx->phy, bus_width);
   phy_power_on(hdmirx->phy);
   usleep_range(10*1000, 11*1000);
   rk628_hdmirx_ctrl_enable(hdmirx);
 
   /* if hdmirx ctrl unlock or get incorrect timing, reset ctrl and phy */
   for (i = 0; i < 5; i++) {
       usleep_range(100*1000, 110*1000);
       regmap_read(hdmirx->regmap, HDMI_RX_SCDC_REGS1, &value);
       dev_dbg(hdmirx->dev, "HDMI_RX_SCDC_REGS1:0x%x\n", value);
       value = (value >> 8) & 0xf;
 
       regmap_read(hdmirx->regmap, HDMI_RX_MD_HACT_PX, &hact);
       regmap_read(hdmirx->regmap, HDMI_RX_MD_VAL, &vact);
 
       hact = hact & 0xffff;
       vact = vact & 0xffff;
       dev_dbg(hdmirx->dev, "hact:%d,vact:%d\n", hact, vact);
 
       if (value == 0xf && hact == hdisplay && vact == vdisplay)
           locked = true;
       else
           locked = false;
 
       if (!locked) {
           rk628_hdmirx_ctrl_disable(hdmirx);
           usleep_range(10*1000, 11*1000);
           phy_power_off(hdmirx->phy);
           usleep_range(10*1000, 11*1000);
           phy_power_on(hdmirx->phy);
           usleep_range(10*1000, 11*1000);
           rk628_hdmirx_ctrl_enable(hdmirx);
       } else {
           /* hdmirx ctrl get correct timing, enable output */
           regmap_write(hdmirx->regmap, HDMI_RX_DMI_DISABLE_IF,
                    0x000001ff);
           return;
       }
   }
 
   dev_err(hdmirx->dev, "hdmirx channel can't lock!\n");
 
}
 
static void rk628_hdmirx_bridge_disable(struct drm_bridge *bridge)
{
   struct rk628_hdmirx *hdmirx = bridge_to_hdmirx(bridge);
 
   rk628_hdmirx_ctrl_disable(hdmirx);
   phy_power_off(hdmirx->phy);
}
 
static int rk628_hdmirx_bridge_attach(struct drm_bridge *bridge)
{
   struct rk628_hdmirx *hdmirx = bridge_to_hdmirx(bridge);
   struct device *dev = hdmirx->dev;
   int ret;
 
   ret = drm_of_find_panel_or_bridge(dev->of_node, 1, -1,
                     NULL, &hdmirx->bridge);
   if (ret) {
       dev_err(dev, "failed to find next bridge\n");
       return ret;
   }
 
   ret = drm_bridge_attach(bridge->encoder, hdmirx->bridge, bridge);
   if (ret) {
       dev_err(dev, "failed to attach bridge\n");
       return ret;
   }
 
   bridge->next = hdmirx->bridge;
 
   return 0;
}
 
static void rk628_hdmirx_bridge_mode_set(struct drm_bridge *bridge,
                   struct drm_display_mode *orig_mode,
                   struct drm_display_mode *mode)
{
   struct rk628_hdmirx *hdmirx = bridge_to_hdmirx(bridge);
 
   memcpy(&hdmirx->mode, mode, sizeof(hdmirx->mode));
}
 
static const struct drm_bridge_funcs rk628_hdmirx_bridge_funcs = {
   .attach = rk628_hdmirx_bridge_attach,
   .enable = rk628_hdmirx_bridge_enable,
   .disable = rk628_hdmirx_bridge_disable,
   .mode_set = rk628_hdmirx_bridge_mode_set,
};
 
static int rk628_hdmirx_probe(struct platform_device *pdev)
{
   struct rk628 *rk628 = dev_get_drvdata(pdev->dev.parent);
   struct device *dev = &pdev->dev;
   struct platform_device_info pdevinfo;
   struct rk628_hdmirx *hdmirx;
   int ret, irq;
 
   if (!of_device_is_available(dev->of_node))
       return -ENODEV;
 
   hdmirx = devm_kzalloc(dev, sizeof(*hdmirx), GFP_KERNEL);
   if (!hdmirx)
       return -ENOMEM;
 
   hdmirx->dev = dev;
   hdmirx->parent = rk628;
   platform_set_drvdata(pdev, hdmirx);
 
   irq = platform_get_irq(pdev, 0);
   if (irq < 0)
       return irq;
 
   hdmirx->grf = rk628->grf;
   if (!hdmirx->grf)
       return -ENODEV;
 
   hdmirx->pclk = devm_clk_get(dev, "pclk");
   if (IS_ERR(hdmirx->pclk)) {
       ret = PTR_ERR(hdmirx->pclk);
       dev_err(dev, "failed to get pclk: %d\n", ret);
       return ret;
   }
 
   hdmirx->cec_clk = devm_clk_get(dev, "cec");
   if (IS_ERR(hdmirx->cec_clk)) {
       ret = PTR_ERR(hdmirx->cec_clk);
       dev_err(dev, "failed to get cec clk: %d\n", ret);
       return ret;
   }
 
   hdmirx->aud_clk = devm_clk_get(dev, "audio");
   if (IS_ERR(hdmirx->aud_clk)) {
       ret = PTR_ERR(hdmirx->aud_clk);
       dev_err(dev, "failed to get audio clk: %d\n", ret);
       return ret;
   }
 
   hdmirx->imodet_clk = devm_clk_get(dev, "imodet");
   if (IS_ERR(hdmirx->imodet_clk)) {
       ret = PTR_ERR(hdmirx->imodet_clk);
       dev_err(dev, "failed to get imodet clk: %d\n", ret);
       return ret;
   }
 
   hdmirx->hdmirx = of_reset_control_get(dev->of_node, "hdmirx");
   if (IS_ERR(hdmirx->hdmirx)) {
       ret = PTR_ERR(hdmirx->hdmirx);
       DRM_DEV_ERROR(dev, "failed to get hdmirx control: %d\n", ret);
       return ret;
   }
 
   hdmirx->hdmirx_pon = of_reset_control_get(dev->of_node, "hdmirx_pon");
   if (IS_ERR(hdmirx->hdmirx_pon)) {
       ret = PTR_ERR(hdmirx->hdmirx_pon);
       DRM_DEV_ERROR(dev, "failed to get hdmirx_pon control: %d\n", ret);
       return ret;
   }
 
   hdmirx->phy = devm_of_phy_get(dev, dev->of_node, NULL);
   if (IS_ERR(hdmirx->phy)) {
       ret = PTR_ERR(hdmirx->phy);
       dev_err(dev, "failed to get phy: %d\n", ret);
       return ret;
   }
 
   hdmirx->regmap = devm_regmap_init_i2c(rk628->client,
                         &rk628_hdmirx_regmap_config);
   if (IS_ERR(hdmirx->regmap)) {
       ret = PTR_ERR(hdmirx->regmap);
       dev_err(dev, "failed to allocate register map: %d\n", ret);
       return ret;
   }
 
   hdmirx->base.funcs = &rk628_hdmirx_bridge_funcs;
   hdmirx->base.of_node = dev->of_node;
   drm_bridge_add(&hdmirx->base);
 
   memset(&pdevinfo, 0, sizeof(pdevinfo));
   pdevinfo.parent = dev;
   pdevinfo.id = PLATFORM_DEVID_AUTO;
 
   return 0;
}
 
static int rk628_hdmirx_remove(struct platform_device *pdev)
{
   struct rk628_hdmirx *hdmirx = platform_get_drvdata(pdev);
 
   drm_bridge_remove(&hdmirx->base);
 
   return 0;
}
 
static const struct of_device_id rk628_hdmirx_of_match[] = {
   { .compatible = "rockchip,rk628-hdmirx", },
   {},
};
MODULE_DEVICE_TABLE(of, rk628_hdmirx_of_match);
 
static struct platform_driver rk628_hdmirx_driver = {
   .driver = {
       .name = "rk628-hdmirx",
       .of_match_table = of_match_ptr(rk628_hdmirx_of_match),
   },
   .probe = rk628_hdmirx_probe,
   .remove = rk628_hdmirx_remove,
};
module_platform_driver(rk628_hdmirx_driver);
 
MODULE_AUTHOR("Algea Cao <algea.cao@rock-chips.com>");
MODULE_DESCRIPTION("Rockchip RK628 HDMI RX driver");
MODULE_LICENSE("GPL v2");