xref: /OK3568_Linux_fs/kernel/drivers/gpu/drm/rockchip/rk628/rk628_hdmirx.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Copyright (c) 2020 Rockchip Electronics Co. Ltd.
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Author: Algea Cao <algea.cao@rock-chips.com>
6*4882a593Smuzhiyun  */
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun #include <linux/clk.h>
9*4882a593Smuzhiyun #include <linux/debugfs.h>
10*4882a593Smuzhiyun #include <linux/delay.h>
11*4882a593Smuzhiyun #include <linux/module.h>
12*4882a593Smuzhiyun #include <linux/of.h>
13*4882a593Smuzhiyun #include <linux/platform_device.h>
14*4882a593Smuzhiyun #include <linux/regmap.h>
15*4882a593Smuzhiyun #include <linux/reset.h>
16*4882a593Smuzhiyun #include <linux/timer.h>
17*4882a593Smuzhiyun #include <linux/workqueue.h>
18*4882a593Smuzhiyun #include <linux/mfd/rk628.h>
19*4882a593Smuzhiyun #include <linux/phy/phy.h>
20*4882a593Smuzhiyun 
21*4882a593Smuzhiyun #include <drm/drm_atomic.h>
22*4882a593Smuzhiyun #include <drm/drm_atomic_helper.h>
23*4882a593Smuzhiyun #include <drm/drm_print.h>
24*4882a593Smuzhiyun #include <drm/drm_dp_helper.h>
25*4882a593Smuzhiyun #include <drm/drm_of.h>
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun #define REG(x)                             ((x) + 0x30000)
28*4882a593Smuzhiyun #define HDMI_RX_HDMI_SETUP_CTRL            REG(0x0000)
29*4882a593Smuzhiyun #define HOT_PLUG_DETECT_MASK               BIT(0)
30*4882a593Smuzhiyun #define HOT_PLUG_DETECT(x)                 UPDATE(x, 0, 0)
31*4882a593Smuzhiyun #define HDMI_RX_HDMI_OVR_CTRL              REG(0x0004)
32*4882a593Smuzhiyun #define HDMI_RX_HDMI_TIMER_CTRL            REG(0x0008)
33*4882a593Smuzhiyun #define HDMI_RX_HDMI_RES_OVR               REG(0x0010)
34*4882a593Smuzhiyun #define HDMI_RX_HDMI_RES_STS               REG(0x0014)
35*4882a593Smuzhiyun #define HDMI_RX_HDMI_PLL_CTRL              REG(0x0018)
36*4882a593Smuzhiyun #define HDMI_RX_HDMI_PLL_FRQSET1           REG(0x001c)
37*4882a593Smuzhiyun #define HDMI_RX_HDMI_PLL_FRQSET2           REG(0x0020)
38*4882a593Smuzhiyun #define HDMI_RX_HDMI_PLL_PAR1              REG(0x0024)
39*4882a593Smuzhiyun #define HDMI_RX_HDMI_PLL_PAR2              REG(0x0028)
40*4882a593Smuzhiyun #define HDMI_RX_HDMI_PLL_PAR3              REG(0x002c)
41*4882a593Smuzhiyun #define HDMI_RX_HDMI_PLL_LCK_STS           REG(0x0030)
42*4882a593Smuzhiyun #define HDMI_RX_HDMI_CLK_CTRL              REG(0x0034)
43*4882a593Smuzhiyun #define HDMI_RX_HDMI_PCB_CTRL              REG(0x0038)
44*4882a593Smuzhiyun #define SEL_PIXCLKSRC_MASK                 GENMASK(19, 18)
45*4882a593Smuzhiyun #define SEL_PIXCLKSRC(x)                   UPDATE(x, 19, 18)
46*4882a593Smuzhiyun #define HDMI_RX_HDMI_PHS_CTR               REG(0x0040)
47*4882a593Smuzhiyun #define HDMI_RX_HDMI_PHS_USED              REG(0x0044)
48*4882a593Smuzhiyun #define HDMI_RX_HDMI_MISC_CTRL             REG(0x0048)
49*4882a593Smuzhiyun #define HDMI_RX_HDMI_EQOFF_CTRL            REG(0x004c)
50*4882a593Smuzhiyun #define HDMI_RX_HDMI_EQGAIN_CTRL           REG(0x0050)
51*4882a593Smuzhiyun #define HDMI_RX_HDMI_EQCAL_STS             REG(0x0054)
52*4882a593Smuzhiyun #define HDMI_RX_HDMI_EQRESULT              REG(0x0058)
53*4882a593Smuzhiyun #define HDMI_RX_HDMI_EQ_MEAS_CTRL          REG(0x005c)
54*4882a593Smuzhiyun #define HDMI_RX_HDMI_WR_CFG                REG(0x0060)
55*4882a593Smuzhiyun #define HDMI_RX_HDMI_CTRL                  REG(0x0064)
56*4882a593Smuzhiyun #define HDMI_RX_HDMI_MODE_RECOVER          REG(0x0080)
57*4882a593Smuzhiyun #define PREAMBLE_CNT_LIMIT_MASK            GENMASK(31, 27)
58*4882a593Smuzhiyun #define PREAMBLE_CNT_LIMIT(x)              UPDATE(x, 31, 27)
59*4882a593Smuzhiyun #define OESSCTL3_THR_MASK                  GENMASK(20, 19)
60*4882a593Smuzhiyun #define OESSCTL3_THR(x)                    UPDATE(x, 20, 19)
61*4882a593Smuzhiyun #define SPIKE_FILTER_EN_MASK               BIT(18)
62*4882a593Smuzhiyun #define SPIKE_FILTER_EN(x)                 UPDATE(x, 18, 18)
63*4882a593Smuzhiyun #define DVI_MODE_HYST_MASK                 GENMASK(17, 13)
64*4882a593Smuzhiyun #define DVI_MODE_HYST(x)                   UPDATE(x, 17, 13)
65*4882a593Smuzhiyun #define HDMI_MODE_HYST_MASK                GENMASK(12, 8)
66*4882a593Smuzhiyun #define HDMI_MODE_HYST(x)                  UPDATE(x, 12, 8)
67*4882a593Smuzhiyun #define HDMI_MODE_MASK                     GENMASK(7, 6)
68*4882a593Smuzhiyun #define HDMI_MODE(x)                       UPDATE(x, 7, 6)
69*4882a593Smuzhiyun #define GB_DET_MASK                        GENMASK(5, 4)
70*4882a593Smuzhiyun #define GB_DET(x)                          UPDATE(x, 5, 4)
71*4882a593Smuzhiyun #define EESS_OESS_MASK                     GENMASK(3, 2)
72*4882a593Smuzhiyun #define EESS_OESS(x)                       UPDATE(x, 3, 2)
73*4882a593Smuzhiyun #define SEL_CTL01_MASK                     GENMASK(1, 0)
74*4882a593Smuzhiyun #define SEL_CTL01(x)                       UPDATE(x, 1, 0)
75*4882a593Smuzhiyun #define HDMI_RX_HDMI_ERROR_PROTECT         REG(0x0084)
76*4882a593Smuzhiyun #define RG_BLOCK_OFF_MASK                  BIT(20)
77*4882a593Smuzhiyun #define RG_BLOCK_OFF(x)                    UPDATE(x, 20, 20)
78*4882a593Smuzhiyun #define BLOCK_OFF_MASK                     BIT(19)
79*4882a593Smuzhiyun #define BLOCK_OFF(x)                       UPDATE(x, 19, 19)
80*4882a593Smuzhiyun #define VALID_MODE_MASK                    GENMASK(18, 16)
81*4882a593Smuzhiyun #define VALID_MODE(x)                      UPDATE(x, 18, 16)
82*4882a593Smuzhiyun #define CTRL_FILT_SEN_MASK                 GENMASK(13, 12)
83*4882a593Smuzhiyun #define CTRL_FILT_SEN(x)                   UPDATE(x, 13, 12)
84*4882a593Smuzhiyun #define VS_FILT_SENS_MASK                  GENMASK(11, 10)
85*4882a593Smuzhiyun #define VS_FILT_SENS(x)                    UPDATE(x, 11, 10)
86*4882a593Smuzhiyun #define HS_FILT_SENS_MASK                  GENMASK(9, 8)
87*4882a593Smuzhiyun #define HS_FILT_SENS(x)                    UPDATE(x, 9, 8)
88*4882a593Smuzhiyun #define DE_MEASURE_MODE_MASK               GENMASK(7, 6)
89*4882a593Smuzhiyun #define DE_MEASURE_MODE(x)                 UPDATE(x, 7, 6)
90*4882a593Smuzhiyun #define DE_REGEN_MASK                      BIT(5)
91*4882a593Smuzhiyun #define DE_REGEN(x)                        UPDATE(x, 5, 5)
92*4882a593Smuzhiyun #define DE_FILTER_SENS_MASK                GENMASK(4, 3)
93*4882a593Smuzhiyun #define DE_FILTER_SENS(x)                  UPDATE(x, 4, 3)
94*4882a593Smuzhiyun #define HDMI_RX_HDMI_ERD_STS               REG(0x0088)
95*4882a593Smuzhiyun #define HDMI_RX_HDMI_SYNC_CTRL             REG(0x0090)
96*4882a593Smuzhiyun #define VS_POL_ADJ_MODE_MASK               GENMASK(4, 3)
97*4882a593Smuzhiyun #define VS_POL_ADJ_MODE(x)                 UPDATE(x, 4, 3)
98*4882a593Smuzhiyun #define HS_POL_ADJ_MODE_MASK               GENMASK(2, 1)
99*4882a593Smuzhiyun #define HS_POL_ADJ_MODE(x)                 UPDATE(x, 2, 1)
100*4882a593Smuzhiyun #define HDMI_RX_HDMI_CKM_EVLTM             REG(0x0094)
101*4882a593Smuzhiyun #define LOCK_HYST_MASK                     GENMASK(21, 20)
102*4882a593Smuzhiyun #define LOCK_HYST(x)                       UPDATE(x, 21, 20)
103*4882a593Smuzhiyun #define CLK_HYST_MASK                      GENMASK(18, 16)
104*4882a593Smuzhiyun #define CLK_HYST(x)                        UPDATE(x, 18, 16)
105*4882a593Smuzhiyun #define EVAL_TIME_MASK                     GENMASK(15, 4)
106*4882a593Smuzhiyun #define EVAL_TIME(x)                       UPDATE(x, 15, 4)
107*4882a593Smuzhiyun #define HDMI_RX_HDMI_CKM_F                 REG(0x0098)
108*4882a593Smuzhiyun #define HDMIRX_MAXFREQ_MASK                GENMASK(31, 16)
109*4882a593Smuzhiyun #define HDMIRX_MAXFREQ(x)                  UPDATE(x, 31, 16)
110*4882a593Smuzhiyun #define MINFREQ_MASK                       GENMASK(15, 0)
111*4882a593Smuzhiyun #define MINFREQ(x)                         UPDATE(x, 15, 0)
112*4882a593Smuzhiyun #define HDMI_RX_HDMI_CKM_RESULT            REG(0x009c)
113*4882a593Smuzhiyun #define HDMI_RX_HDMI_PVO_CONFIG            REG(0x00a0)
114*4882a593Smuzhiyun #define HDMI_RX_HDMI_RESMPL_CTRL           REG(0x00a4)
115*4882a593Smuzhiyun #define MAN_VID_DEREPEAT_MASK              GENMASK(4, 1)
116*4882a593Smuzhiyun #define MAN_VID_DEREPEAT(x)                UPDATE(x, 4, 1)
117*4882a593Smuzhiyun #define AUTO_DEREPEAT_MASK                 BIT(0)
118*4882a593Smuzhiyun #define AUTO_DEREPEAT(x)                   UPDATE(x, 0, 0)
119*4882a593Smuzhiyun #define HDMI_RX_HDMI_DCM_CTRL              REG(0x00a8)
120*4882a593Smuzhiyun #define DCM_DEFAULT_PHASE_MASK             BIT(18)
121*4882a593Smuzhiyun #define DCM_DEFAULT_PHASE(x)               UPDATE(x, 18, 18)
122*4882a593Smuzhiyun #define DCM_COLOUR_DEPTH_SEL_MASK          BIT(12)
123*4882a593Smuzhiyun #define DCM_COLOUR_DEPTH_SEL(x)            UPDATE(x, 12, 12)
124*4882a593Smuzhiyun #define DCM_COLOUR_DEPTH_MASK              GENMASK(11, 8)
125*4882a593Smuzhiyun #define DCM_COLOUR_DEPTH(x)                UPDATE(x, 11, 8)
126*4882a593Smuzhiyun #define DCM_GCP_ZERO_FIELDS_MASK           GENMASK(5, 2)
127*4882a593Smuzhiyun #define DCM_GCP_ZERO_FIELDS(x)             UPDATE(x, 5, 2)
128*4882a593Smuzhiyun #define HDMI_RX_HDMI_VM_CFG_CH_0_1         REG(0x00b0)
129*4882a593Smuzhiyun #define HDMI_RX_HDMI_VM_CFG_CH2            REG(0x00b4)
130*4882a593Smuzhiyun #define HDMI_RX_HDMI_SPARE                 REG(0x00b8)
131*4882a593Smuzhiyun #define HDMI_RX_HDMI_STS                   REG(0x00bc)
132*4882a593Smuzhiyun #define HDMI_RX_HDCP_CTRL                  REG(0x00c0)
133*4882a593Smuzhiyun #define HDCP_ENABLE_MASK                   BIT(24)
134*4882a593Smuzhiyun #define HDCP_ENABLE(x)                     UPDATE(x, 24, 24)
135*4882a593Smuzhiyun #define FREEZE_HDCP_FSM_MASK               BIT(21)
136*4882a593Smuzhiyun #define FREEZE_HDCP_FSM(x)                 UPDATE(x, 21, 21)
137*4882a593Smuzhiyun #define FREEZE_HDCP_STATE_MASK             GENMASK(20, 15)
138*4882a593Smuzhiyun #define FREEZE_HDCP_STATE(x)               UPDATE(x, 20, 15)
139*4882a593Smuzhiyun #define HDCP_CTL_MASK                      GENMASK(9, 8)
140*4882a593Smuzhiyun #define HDCP_CTL(x)                        UPDATE(x, 9, 8)
141*4882a593Smuzhiyun #define HDCP_RI_RATE_MASK                  GENMASK(7, 6)
142*4882a593Smuzhiyun #define HDCP_RI_RATE(x)                    UPDATE(x, 7, 6)
143*4882a593Smuzhiyun #define KEY_DECRYPT_ENABLE_MASK            BIT(1)
144*4882a593Smuzhiyun #define KEY_DECRYPT_ENABLE(x)              UPDATE(x, 1, 1)
145*4882a593Smuzhiyun #define HDCP_ENC_EN_MASK                   BIT(0)
146*4882a593Smuzhiyun #define HDCP_ENC_EN(x)                     UPDATE(x, 0, 0)
147*4882a593Smuzhiyun #define HDMI_RX_HDCP_SETTINGS              REG(0x00c4)
148*4882a593Smuzhiyun #define HDMI_RX_HDCP_SEED                  REG(0x00c8)
149*4882a593Smuzhiyun #define HDMI_RX_HDCP_BKSV1                 REG(0x00cc)
150*4882a593Smuzhiyun #define HDMI_RX_HDCP_BKSV0                 REG(0x00d0)
151*4882a593Smuzhiyun #define HDMI_RX_HDCP_KIDX                  REG(0x00d4)
152*4882a593Smuzhiyun #define HDMI_RX_HDCP_KEY1                  REG(0x00d8)
153*4882a593Smuzhiyun #define HDMI_RX_HDCP_KEY0                  REG(0x00dc)
154*4882a593Smuzhiyun #define HDMI_RX_HDCP_DBG                   REG(0x00e0)
155*4882a593Smuzhiyun #define HDMI_RX_HDCP_AKSV1                 REG(0x00e4)
156*4882a593Smuzhiyun #define HDMI_RX_HDCP_AKSV0                 REG(0x00e8)
157*4882a593Smuzhiyun #define HDMI_RX_HDCP_AN1                   REG(0x00ec)
158*4882a593Smuzhiyun #define HDMI_RX_HDCP_AN0                   REG(0x00f0)
159*4882a593Smuzhiyun #define HDMI_RX_HDCP_EESS_WOO              REG(0x00f4)
160*4882a593Smuzhiyun #define HDMI_RX_HDCP_I2C_TIMEOUT           REG(0x00f8)
161*4882a593Smuzhiyun #define HDMI_RX_HDCP_STS                   REG(0x00fc)
162*4882a593Smuzhiyun #define HDMI_RX_MD_HCTRL1                  REG(0x0140)
163*4882a593Smuzhiyun #define HACT_PIX_ITH_MASK                  GENMASK(10, 8)
164*4882a593Smuzhiyun #define HACT_PIX_ITH(x)                    UPDATE(x, 10, 8)
165*4882a593Smuzhiyun #define HACT_PIX_SRC_MASK                  BIT(5)
166*4882a593Smuzhiyun #define HACT_PIX_SRC(x)                    UPDATE(x, 5, 5)
167*4882a593Smuzhiyun #define HTOT_PIX_SRC_MASK                  BIT(4)
168*4882a593Smuzhiyun #define HTOT_PIX_SRC(x)                    UPDATE(x, 4, 4)
169*4882a593Smuzhiyun #define HDMI_RX_MD_HCTRL2                  REG(0x0144)
170*4882a593Smuzhiyun #define HS_CLK_ITH_MASK                    GENMASK(14, 12)
171*4882a593Smuzhiyun #define HS_CLK_ITH(x)                      UPDATE(x, 14, 12)
172*4882a593Smuzhiyun #define HTOT32_CLK_ITH_MASK                GENMASK(9, 8)
173*4882a593Smuzhiyun #define HTOT32_CLK_ITH(x)                  UPDATE(x, 9, 8)
174*4882a593Smuzhiyun #define VS_ACT_TIME_MASK                   BIT(5)
175*4882a593Smuzhiyun #define VS_ACT_TIME(x)                     UPDATE(x, 5, 5)
176*4882a593Smuzhiyun #define HS_ACT_TIME_MASK                   GENMASK(4, 3)
177*4882a593Smuzhiyun #define HS_ACT_TIME(x)                     UPDATE(x, 4, 3)
178*4882a593Smuzhiyun #define H_START_POS_MASK                   GENMASK(1, 0)
179*4882a593Smuzhiyun #define H_START_POS(x)                     UPDATE(x, 1, 0)
180*4882a593Smuzhiyun #define HDMI_RX_MD_HT0                     REG(0x0148)
181*4882a593Smuzhiyun #define HDMI_RX_MD_HT1                     REG(0x014c)
182*4882a593Smuzhiyun #define HDMI_RX_MD_HACT_PX                 REG(0x0150)
183*4882a593Smuzhiyun #define HDMI_RX_MD_HACT_RSV                REG(0x0154)
184*4882a593Smuzhiyun #define HDMI_RX_MD_VCTRL                   REG(0x0158)
185*4882a593Smuzhiyun #define V_OFFS_LIN_MODE_MASK               BIT(4)
186*4882a593Smuzhiyun #define V_OFFS_LIN_MODE(x)                 UPDATE(x, 4, 4)
187*4882a593Smuzhiyun #define V_EDGE_MASK                        BIT(1)
188*4882a593Smuzhiyun #define V_EDGE(x)                          UPDATE(x, 1, 1)
189*4882a593Smuzhiyun #define V_MODE_MASK                        BIT(0)
190*4882a593Smuzhiyun #define V_MODE(x)                          UPDATE(x, 0, 0)
191*4882a593Smuzhiyun #define HDMI_RX_MD_VSC                     REG(0x015c)
192*4882a593Smuzhiyun #define HDMI_RX_MD_VTC                     REG(0x0160)
193*4882a593Smuzhiyun #define HDMI_RX_MD_VOL                     REG(0x0164)
194*4882a593Smuzhiyun #define HDMI_RX_MD_VAL                     REG(0x0168)
195*4882a593Smuzhiyun #define HDMI_RX_MD_VTH                     REG(0x016c)
196*4882a593Smuzhiyun #define VOFS_LIN_ITH_MASK                  GENMASK(11, 10)
197*4882a593Smuzhiyun #define VOFS_LIN_ITH(x)                    UPDATE(x, 11, 10)
198*4882a593Smuzhiyun #define VACT_LIN_ITH_MASK                  GENMASK(9, 8)
199*4882a593Smuzhiyun #define VACT_LIN_ITH(x)                    UPDATE(x, 9, 8)
200*4882a593Smuzhiyun #define VTOT_LIN_ITH_MASK                  GENMASK(7, 6)
201*4882a593Smuzhiyun #define VTOT_LIN_ITH(x)                    UPDATE(x, 7, 6)
202*4882a593Smuzhiyun #define VS_CLK_ITH_MASK                    GENMASK(5, 3)
203*4882a593Smuzhiyun #define VS_CLK_ITH(x)                      UPDATE(x, 5, 3)
204*4882a593Smuzhiyun #define VTOT_CLK_ITH_MASK                  GENMASK(2, 0)
205*4882a593Smuzhiyun #define VTOT_CLK_ITH(x)                    UPDATE(x, 2, 0)
206*4882a593Smuzhiyun #define HDMI_RX_MD_VTL                     REG(0x0170)
207*4882a593Smuzhiyun #define HDMI_RX_MD_IL_CTRL                 REG(0x0174)
208*4882a593Smuzhiyun #define HDMI_RX_MD_IL_SKEW                 REG(0x0178)
209*4882a593Smuzhiyun #define HDMI_RX_MD_IL_POL                  REG(0x017c)
210*4882a593Smuzhiyun #define FAFIELDDET_EN_MASK                 BIT(2)
211*4882a593Smuzhiyun #define FAFIELDDET_EN(x)                   UPDATE(x, 2, 2)
212*4882a593Smuzhiyun #define FIELD_POL_MODE_MASK                GENMASK(1, 0)
213*4882a593Smuzhiyun #define FIELD_POL_MODE(x)                  UPDATE(x, 1, 0)
214*4882a593Smuzhiyun #define HDMI_RX_MD_STS                     REG(0x0180)
215*4882a593Smuzhiyun #define HDMI_RX_AUD_CTRL                   REG(0x0200)
216*4882a593Smuzhiyun #define HDMI_RX_AUD_PLL_CTRL               REG(0x0208)
217*4882a593Smuzhiyun #define PLL_LOCK_TOGGLE_DIV_MASK           GENMASK(27, 24)
218*4882a593Smuzhiyun #define PLL_LOCK_TOGGLE_DIV(x)             UPDATE(x, 27, 24)
219*4882a593Smuzhiyun #define HDMI_RX_AUD_CLK_CTRL               REG(0x0214)
220*4882a593Smuzhiyun #define CTS_N_REF_MASK                     BIT(4)
221*4882a593Smuzhiyun #define CTS_N_REF(x)                       UPDATE(x, 4, 4)
222*4882a593Smuzhiyun #define HDMI_RX_AUD_CLK_STS                REG(0x023c)
223*4882a593Smuzhiyun #define HDMI_RX_AUD_FIFO_CTRL              REG(0x0240)
224*4882a593Smuzhiyun #define AFIF_SUBPACKET_DESEL_MASK          GENMASK(27, 24)
225*4882a593Smuzhiyun #define AFIF_SUBPACKET_DESEL(x)            UPDATE(x, 27, 24)
226*4882a593Smuzhiyun #define AFIF_SUBPACKETS_MASK               BIT(16)
227*4882a593Smuzhiyun #define AFIF_SUBPACKETS(x)                 UPDATE(x, 16, 16)
228*4882a593Smuzhiyun #define MSA_CHANNEL_DESELECT               BIT(24)
229*4882a593Smuzhiyun #define HDMI_RX_AUD_FIFO_TH                REG(0x0244)
230*4882a593Smuzhiyun #define AFIF_TH_START_MASK                 GENMASK(26, 18)
231*4882a593Smuzhiyun #define AFIF_TH_START(x)                   UPDATE(x, 26, 18)
232*4882a593Smuzhiyun #define AFIF_TH_MAX_MASK                   GENMASK(17, 9)
233*4882a593Smuzhiyun #define AFIF_TH_MAX(x)                     UPDATE(x, 17, 9)
234*4882a593Smuzhiyun #define AFIF_TH_MIN_MASK                   GENMASK(8, 0)
235*4882a593Smuzhiyun #define AFIF_TH_MIN(x)                     UPDATE(x, 8, 0)
236*4882a593Smuzhiyun #define HDMI_RX_AUD_FIFO_FILL_S            REG(0x0248)
237*4882a593Smuzhiyun #define HDMI_RX_AUD_FIFO_CLR_MM            REG(0x024c)
238*4882a593Smuzhiyun #define HDMI_RX_AUD_FIFO_FILLSTS           REG(0x0250)
239*4882a593Smuzhiyun #define HDMI_RX_AUD_CHEXTR_CTRL            REG(0x0254)
240*4882a593Smuzhiyun #define AUD_LAYOUT_CTRL(x)                 UPDATE(x, 1, 0)
241*4882a593Smuzhiyun #define HDMI_RX_AUD_MUTE_CTRL              REG(0x0258)
242*4882a593Smuzhiyun #define APPLY_INT_MUTE_MASK                BIT(31)
243*4882a593Smuzhiyun #define APPLY_INT_MUTE(x)                  UPDATE(x, 31, 31)
244*4882a593Smuzhiyun #define APORT_SHDW_CTRL_MASK               GENMASK(22, 21)
245*4882a593Smuzhiyun #define APORT_SHDW_CTRL(x)                 UPDATE(x, 22, 21)
246*4882a593Smuzhiyun #define AUTO_ACLK_MUTE_MASK                GENMASK(20, 19)
247*4882a593Smuzhiyun #define AUTO_ACLK_MUTE(x)                  UPDATE(x, 20, 19)
248*4882a593Smuzhiyun #define AUD_MUTE_SPEED_MASK                GENMASK(16, 10)
249*4882a593Smuzhiyun #define AUD_MUTE_SPEED(x)                  UPDATE(x, 16, 10)
250*4882a593Smuzhiyun #define AUD_AVMUTE_EN_MASK                 BIT(7)
251*4882a593Smuzhiyun #define AUD_AVMUTE_EN(x)                   UPDATE(x, 7, 7)
252*4882a593Smuzhiyun #define AUD_MUTE_SEL_MASK                  GENMASK(6, 5)
253*4882a593Smuzhiyun #define AUD_MUTE_SEL(x)                    UPDATE(x, 6, 5)
254*4882a593Smuzhiyun #define AUD_MUTE_MODE_MASK                 GENMASK(4, 3)
255*4882a593Smuzhiyun #define AUD_MUTE_MODE(x)                   UPDATE(x, 4, 3)
256*4882a593Smuzhiyun #define HDMI_RX_AUD_FIFO_FILLSTS1          REG(0x025c)
257*4882a593Smuzhiyun #define HDMI_RX_AUD_SAO_CTRL               REG(0x0260)
258*4882a593Smuzhiyun #define I2S_LPCM_BPCUV_MASK                BIT(11)
259*4882a593Smuzhiyun #define I2S_LPCM_BPCUV(x)                  UPDATE(x, 11, 11)
260*4882a593Smuzhiyun #define I2S_32_16_MASK                     BIT(0)
261*4882a593Smuzhiyun #define I2S_32_16(x)                       UPDATE(x, 0, 0)
262*4882a593Smuzhiyun #define HDMI_RX_AUD_PAO_CTRL               REG(0x0264)
263*4882a593Smuzhiyun #define PAO_RATE_MASK                      GENMASK(17, 16)
264*4882a593Smuzhiyun #define PAO_RATE(x)                        UPDATE(x, 17, 16)
265*4882a593Smuzhiyun #define HDMI_RX_AUD_SPARE                  REG(0x0268)
266*4882a593Smuzhiyun #define HDMI_RX_AUD_FIFO_STS               REG(0x027c)
267*4882a593Smuzhiyun #define HDMI_RX_AUDPLL_GEN_CTS             REG(0x0280)
268*4882a593Smuzhiyun #define AUDPLL_CTS_MANUAL(x)               UPDATE(x, 19, 0)
269*4882a593Smuzhiyun #define HDMI_RX_AUDPLL_GEN_N               REG(0x0284)
270*4882a593Smuzhiyun #define AUDPLL_N_MANUAL(x)                 UPDATE(x, 19, 0)
271*4882a593Smuzhiyun #define HDMI_RX_AUDPLL_GEN_CTRL_RW1        REG(0x0288)
272*4882a593Smuzhiyun #define HDMI_RX_AUDPLL_GEN_CTRL_RW2        REG(0x028c)
273*4882a593Smuzhiyun #define HDMI_RX_AUDPLL_GEN_CTRL_W1         REG(0x0298)
274*4882a593Smuzhiyun #define HDMI_RX_AUDPLL_GEN_STS_RO1         REG(0x02a0)
275*4882a593Smuzhiyun #define HDMI_RX_AUDPLL_GEN_STS_RO2         REG(0x02a4)
276*4882a593Smuzhiyun #define HDMI_RX_AUDPLL_SC_NDIVCTSTH        REG(0x02a8)
277*4882a593Smuzhiyun #define HDMI_RX_AUDPLL_SC_CTS              REG(0x02ac)
278*4882a593Smuzhiyun #define HDMI_RX_AUDPLL_SC_N                REG(0x02b0)
279*4882a593Smuzhiyun #define HDMI_RX_AUDPLL_SC_CTRL             REG(0x02b4)
280*4882a593Smuzhiyun #define HDMI_RX_AUDPLL_SC_STS1             REG(0x02b8)
281*4882a593Smuzhiyun #define HDMI_RX_AUDPLL_SC_STS2             REG(0x02bc)
282*4882a593Smuzhiyun #define HDMI_RX_SNPS_PHYG3_CTRL            REG(0x02c0)
283*4882a593Smuzhiyun #define PORTSELECT_MASK                    GENMASK(3, 2)
284*4882a593Smuzhiyun #define PORTSELECT(x)                      UPDATE(x, 3, 2)
285*4882a593Smuzhiyun #define HDMI_RX_I2CM_PHYG3_SLAVE           REG(0x02c4)
286*4882a593Smuzhiyun #define HDMI_RX_I2CM_PHYG3_ADDRESS         REG(0x02c8)
287*4882a593Smuzhiyun #define HDMI_RX_I2CM_PHYG3_DATAO           REG(0x02cc)
288*4882a593Smuzhiyun #define HDMI_RX_I2CM_PHYG3_DATAI           REG(0x02d0)
289*4882a593Smuzhiyun #define HDMI_RX_I2CM_PHYG3_OPERATION       REG(0x02d4)
290*4882a593Smuzhiyun #define HDMI_RX_I2CM_PHYG3_MODE            REG(0x02d8)
291*4882a593Smuzhiyun #define HDMI_RX_I2CM_PHYG3_SOFTRST         REG(0x02dc)
292*4882a593Smuzhiyun #define HDMI_RX_I2CM_PHYG3_SS_CNTS         REG(0x02e0)
293*4882a593Smuzhiyun #define HDMI_RX_I2CM_PHYG3_FS_HCNT         REG(0x02e4)
294*4882a593Smuzhiyun #define HDMI_RX_JTAG_CONF                  REG(0x02ec)
295*4882a593Smuzhiyun #define HDMI_RX_JTAG_TAP_TCLK              REG(0x02f0)
296*4882a593Smuzhiyun #define HDMI_RX_JTAG_TAP_IN                REG(0x02f4)
297*4882a593Smuzhiyun #define HDMI_RX_JTAG_TAP_OUT               REG(0x02f8)
298*4882a593Smuzhiyun #define HDMI_RX_JTAG_ADDR                  REG(0x02fc)
299*4882a593Smuzhiyun #define HDMI_RX_PDEC_CTRL                  REG(0x0300)
300*4882a593Smuzhiyun #define PFIFO_SCORE_FILTER_EN              BIT(31)
301*4882a593Smuzhiyun #define PFIFO_SCORE_HDP_IF                 BIT(29)
302*4882a593Smuzhiyun #define PFIFO_SCORE_AMP_IF                 BIT(28)
303*4882a593Smuzhiyun #define PFIFO_SCORE_NTSCVBI_IF             BIT(27)
304*4882a593Smuzhiyun #define PFIFO_SCORE_MPEGS_IF               BIT(26)
305*4882a593Smuzhiyun #define PFIFO_SCORE_AUD_IF                 BIT(25)
306*4882a593Smuzhiyun #define PFIFO_SCORE_SPD_IF                 BIT(24)
307*4882a593Smuzhiyun #define PFIFO_SCORE_AVI_IF                 BIT(23)
308*4882a593Smuzhiyun #define PFIFO_SCORE_VS_IF                  BIT(22)
309*4882a593Smuzhiyun #define PFIFO_SCORE_GMTP                   BIT(21)
310*4882a593Smuzhiyun #define PFIFO_SCORE_ISRC2                  BIT(20)
311*4882a593Smuzhiyun #define PFIFO_SCORE_ISRC1                  BIT(19)
312*4882a593Smuzhiyun #define PFIFO_SCORE_ACP                    BIT(18)
313*4882a593Smuzhiyun #define PFIFO_SCORE_GCP                    BIT(17)
314*4882a593Smuzhiyun #define PFIFO_SCORE_ACR                    BIT(16)
315*4882a593Smuzhiyun #define GCP_GLOBAVMUTE                     BIT(15)
316*4882a593Smuzhiyun #define PD_FIFO_WE                         BIT(4)
317*4882a593Smuzhiyun #define PDEC_BCH_EN                        BIT(0)
318*4882a593Smuzhiyun #define HDMI_RX_PDEC_FIFO_CFG              REG(0x0304)
319*4882a593Smuzhiyun #define PD_FIFO_TH_START_MASK              GENMASK(29, 20)
320*4882a593Smuzhiyun #define PD_FIFO_TH_START(x)                UPDATE(x, 29, 20)
321*4882a593Smuzhiyun #define PD_FIFO_TH_MAX_MASK                GENMASK(19, 10)
322*4882a593Smuzhiyun #define PD_FIFO_TH_MAX(x)                  UPDATE(x, 19, 10)
323*4882a593Smuzhiyun #define PD_FIFO_TH_MIN_MASK                GENMASK(9, 0)
324*4882a593Smuzhiyun #define PD_FIFO_TH_MIN(x)                  UPDATE(x, 9, 0)
325*4882a593Smuzhiyun #define HDMI_RX_PDEC_FIFO_STS              REG(0x0308)
326*4882a593Smuzhiyun #define HDMI_RX_PDEC_FIFO_DATA             REG(0x030c)
327*4882a593Smuzhiyun #define HDMI_RX_PDEC_AUDIODET_CTRL         REG(0x0310)
328*4882a593Smuzhiyun #define AUDIODET_THRESHOLD_MASK            GENMASK(13, 9)
329*4882a593Smuzhiyun #define AUDIODET_THRESHOLD(x)              UPDATE(x, 13, 9)
330*4882a593Smuzhiyun #define HDMI_RX_PDEC_DBG_ACP               REG(0x031c)
331*4882a593Smuzhiyun #define HDMI_RX_PDEC_DBG_ERR_CORR          REG(0x0320)
332*4882a593Smuzhiyun #define HDMI_RX_PDEC_FIFO_STS1             REG(0x0324)
333*4882a593Smuzhiyun #define HDMI_RX_PDEC_ACRM_CTRL             REG(0x0330)
334*4882a593Smuzhiyun #define DELTACTS_IRQTRIG_MASK              GENMASK(4, 2)
335*4882a593Smuzhiyun #define DELTACTS_IRQTRIG(x)                UPDATE(x, 4, 2)
336*4882a593Smuzhiyun #define HDMI_RX_PDEC_ACRM_MAX              REG(0x0334)
337*4882a593Smuzhiyun #define HDMI_RX_PDEC_ACRM_MIN              REG(0x0338)
338*4882a593Smuzhiyun #define HDMI_RX_PDEC_ERR_FILTER            REG(0x033c)
339*4882a593Smuzhiyun #define HDMI_RX_PDEC_ASP_CTRL              REG(0x0340)
340*4882a593Smuzhiyun #define HDMI_RX_PDEC_ASP_ERR               REG(0x0344)
341*4882a593Smuzhiyun #define HDMI_RX_PDEC_STS                   REG(0x0360)
342*4882a593Smuzhiyun #define HDMI_RX_PDEC_AUD_STS               REG(0x0364)
343*4882a593Smuzhiyun #define HDMI_RX_PDEC_VSI_PAYLOAD0          REG(0x0368)
344*4882a593Smuzhiyun #define HDMI_RX_PDEC_VSI_PAYLOAD1          REG(0x036c)
345*4882a593Smuzhiyun #define HDMI_RX_PDEC_VSI_PAYLOAD2          REG(0x0370)
346*4882a593Smuzhiyun #define HDMI_RX_PDEC_VSI_PAYLOAD3          REG(0x0374)
347*4882a593Smuzhiyun #define HDMI_RX_PDEC_VSI_PAYLOAD4          REG(0x0378)
348*4882a593Smuzhiyun #define HDMI_RX_PDEC_VSI_PAYLOAD5          REG(0x037c)
349*4882a593Smuzhiyun #define HDMI_RX_PDEC_GCP_AVMUTE            REG(0x0380)
350*4882a593Smuzhiyun #define PKTDEC_GCP_CD_MASK                 GENMASK(7, 4)
351*4882a593Smuzhiyun #define HDMI_RX_PDEC_ACR_CTS               REG(0x0390)
352*4882a593Smuzhiyun #define HDMI_RX_PDEC_ACR_N                 REG(0x0394)
353*4882a593Smuzhiyun #define HDMI_RX_PDEC_AVI_HB                REG(0x03a0)
354*4882a593Smuzhiyun #define HDMI_RX_PDEC_AVI_PB                REG(0x03a4)
355*4882a593Smuzhiyun #define VID_IDENT_CODE_VIC7                BIT(31)
356*4882a593Smuzhiyun #define VID_IDENT_CODE                     GENMASK(30, 24)
357*4882a593Smuzhiyun #define VIDEO_FORMAT                       GENMASK(6, 5)
358*4882a593Smuzhiyun #define HDMI_RX_PDEC_AVI_TBB               REG(0x03a8)
359*4882a593Smuzhiyun #define HDMI_RX_PDEC_AVI_LRB               REG(0x03ac)
360*4882a593Smuzhiyun #define HDMI_RX_PDEC_AIF_CTRL              REG(0x03c0)
361*4882a593Smuzhiyun #define FC_LFE_EXCHG                       BIT(18)
362*4882a593Smuzhiyun #define HDMI_RX_PDEC_AIF_HB                REG(0x03c4)
363*4882a593Smuzhiyun #define HDMI_RX_PDEC_AIF_PB0               REG(0x03c8)
364*4882a593Smuzhiyun #define HDMI_RX_PDEC_AIF_PB1               REG(0x03cc)
365*4882a593Smuzhiyun #define HDMI_RX_PDEC_GMD_HB                REG(0x03d0)
366*4882a593Smuzhiyun #define HDMI_RX_PDEC_GMD_PB                REG(0x03d4)
367*4882a593Smuzhiyun #define HDMI_RX_PDEC_VSI_ST0               REG(0x03e0)
368*4882a593Smuzhiyun #define HDMI_RX_PDEC_VSI_ST1               REG(0x03e4)
369*4882a593Smuzhiyun #define HDMI_RX_PDEC_VSI_PB0               REG(0x03e8)
370*4882a593Smuzhiyun #define HDMI_RX_PDEC_VSI_PB1               REG(0x03ec)
371*4882a593Smuzhiyun #define HDMI_RX_PDEC_VSI_PB2               REG(0x03f0)
372*4882a593Smuzhiyun #define HDMI_RX_PDEC_VSI_PB3               REG(0x03f4)
373*4882a593Smuzhiyun #define HDMI_RX_PDEC_VSI_PB4               REG(0x03f8)
374*4882a593Smuzhiyun #define HDMI_RX_PDEC_VSI_PB5               REG(0x03fc)
375*4882a593Smuzhiyun #define HDMI_RX_CEAVID_CONFIG              REG(0x0400)
376*4882a593Smuzhiyun #define HDMI_RX_CEAVID_3DCONFIG            REG(0x0404)
377*4882a593Smuzhiyun #define HDMI_RX_CEAVID_HCONFIG_LO          REG(0x0408)
378*4882a593Smuzhiyun #define HDMI_RX_CEAVID_HCONFIG_HI          REG(0x040c)
379*4882a593Smuzhiyun #define HDMI_RX_CEAVID_VCONFIG_LO          REG(0x0410)
380*4882a593Smuzhiyun #define HDMI_RX_CEAVID_VCONFIG_HI          REG(0x0414)
381*4882a593Smuzhiyun #define HDMI_RX_CEAVID_STATUS              REG(0x0418)
382*4882a593Smuzhiyun #define HDMI_RX_PDEC_AMP_HB                REG(0x0480)
383*4882a593Smuzhiyun #define HDMI_RX_PDEC_AMP_PAYLOAD0          REG(0x0484)
384*4882a593Smuzhiyun #define HDMI_RX_PDEC_AMP_PAYLOAD1          REG(0x0488)
385*4882a593Smuzhiyun #define HDMI_RX_PDEC_AMP_PAYLOAD2          REG(0x048c)
386*4882a593Smuzhiyun #define HDMI_RX_PDEC_AMP_PAYLOAD3          REG(0x0490)
387*4882a593Smuzhiyun #define HDMI_RX_PDEC_AMP_PAYLOAD4          REG(0x0494)
388*4882a593Smuzhiyun #define HDMI_RX_PDEC_AMP_PAYLOAD5          REG(0x0498)
389*4882a593Smuzhiyun #define HDMI_RX_PDEC_AMP_PAYLOAD6          REG(0x049c)
390*4882a593Smuzhiyun #define HDMI_RX_PDEC_NTSCVBI_HB            REG(0x04a0)
391*4882a593Smuzhiyun #define HDMI_RX_PDEC_NTSCVBI_PAYLOAD0      REG(0x04a4)
392*4882a593Smuzhiyun #define HDMI_RX_PDEC_NTSCVBI_PAYLOAD1      REG(0x04a8)
393*4882a593Smuzhiyun #define HDMI_RX_PDEC_NTSCVBI_PAYLOAD2      REG(0x04ac)
394*4882a593Smuzhiyun #define HDMI_RX_PDEC_NTSCVBI_PAYLOAD3      REG(0x04b0)
395*4882a593Smuzhiyun #define HDMI_RX_PDEC_NTSCVBI_PAYLOAD4      REG(0x04b4)
396*4882a593Smuzhiyun #define HDMI_RX_PDEC_NTSCVBI_PAYLOAD5      REG(0x04b8)
397*4882a593Smuzhiyun #define HDMI_RX_PDEC_NTSCVBI_PAYLOAD6      REG(0x04bc)
398*4882a593Smuzhiyun #define HDMI_RX_PDEC_DRM_HB                REG(0x04c0)
399*4882a593Smuzhiyun #define HDMI_RX_PDEC_DRM_PAYLOAD0          REG(0x04c4)
400*4882a593Smuzhiyun #define HDMI_RX_PDEC_DRM_PAYLOAD1          REG(0x04c8)
401*4882a593Smuzhiyun #define HDMI_RX_PDEC_DRM_PAYLOAD2          REG(0x04cc)
402*4882a593Smuzhiyun #define HDMI_RX_PDEC_DRM_PAYLOAD3          REG(0x04d0)
403*4882a593Smuzhiyun #define HDMI_RX_PDEC_DRM_PAYLOAD4          REG(0x04d4)
404*4882a593Smuzhiyun #define HDMI_RX_PDEC_DRM_PAYLOAD5          REG(0x04d8)
405*4882a593Smuzhiyun #define HDMI_RX_PDEC_DRM_PAYLOAD6          REG(0x04dc)
406*4882a593Smuzhiyun #define HDMI_RX_MHLMODE_CTRL               REG(0x0500)
407*4882a593Smuzhiyun #define HDMI_RX_CDSENSE_STATUS             REG(0x0504)
408*4882a593Smuzhiyun #define HDMI_RX_DESERFIFO_CTRL             REG(0x0508)
409*4882a593Smuzhiyun #define HDMI_RX_DESER_INTTRSHCTRL          REG(0x050c)
410*4882a593Smuzhiyun #define HDMI_RX_DESER_INTCNTCTRL           REG(0x0510)
411*4882a593Smuzhiyun #define HDMI_RX_DESER_INTCNT               REG(0x0514)
412*4882a593Smuzhiyun #define HDMI_RX_HDCP_RPT_CTRL              REG(0x0600)
413*4882a593Smuzhiyun #define HDMI_RX_HDCP_RPT_BSTATUS           REG(0x0604)
414*4882a593Smuzhiyun #define HDMI_RX_HDCP_RPT_KSVFIFO_CTRL      REG(0x0608)
415*4882a593Smuzhiyun #define HDMI_RX_HDCP_RPT_KSVFIFO1          REG(0x060c)
416*4882a593Smuzhiyun #define HDMI_RX_HDCP_RPT_KSVFIFO0          REG(0x0610)
417*4882a593Smuzhiyun #define HDMI_RX_HDMI20_CONTROL             REG(0x0800)
418*4882a593Smuzhiyun #define HDMI_RX_SCDC_I2CCONFIG             REG(0x0804)
419*4882a593Smuzhiyun #define I2CSPIKESUPPR_MASK                 GENMASK(25, 24)
420*4882a593Smuzhiyun #define I2CSPIKESUPPR(x)                   UPDATE(x, 25, 24)
421*4882a593Smuzhiyun #define HDMI_RX_SCDC_CONFIG                REG(0x0808)
422*4882a593Smuzhiyun #define HDMI_RX_CHLOCK_CONFIG              REG(0x080c)
423*4882a593Smuzhiyun #define CHLOCKMAXER_MASK                   GENMASK(29, 20)
424*4882a593Smuzhiyun #define CHLOCKMAXER(x)                     UPDATE(x, 29, 20)
425*4882a593Smuzhiyun #define MILISECTIMERLIMIT_MASK             GENMASK(15, 0)
426*4882a593Smuzhiyun #define MILISECTIMERLIMIT(x)               UPDATE(x, 15, 0)
427*4882a593Smuzhiyun #define HDMI_RX_HDCP22_CONTROL             REG(0x081c)
428*4882a593Smuzhiyun #define HDMI_RX_SCDC_REGS0                 REG(0x0820)
429*4882a593Smuzhiyun #define HDMI_RX_SCDC_REGS1                 REG(0x0824)
430*4882a593Smuzhiyun #define HDMI_RX_SCDC_REGS2                 REG(0x0828)
431*4882a593Smuzhiyun #define HDMI_RX_SCDC_REGS3                 REG(0x082c)
432*4882a593Smuzhiyun #define HDMI_RX_SCDC_MANSPEC0              REG(0x0840)
433*4882a593Smuzhiyun #define HDMI_RX_SCDC_MANSPEC1              REG(0x0844)
434*4882a593Smuzhiyun #define HDMI_RX_SCDC_MANSPEC2              REG(0x0848)
435*4882a593Smuzhiyun #define HDMI_RX_SCDC_MANSPEC3              REG(0x084c)
436*4882a593Smuzhiyun #define HDMI_RX_SCDC_MANSPEC4              REG(0x0850)
437*4882a593Smuzhiyun #define HDMI_RX_SCDC_WRDATA0               REG(0x0860)
438*4882a593Smuzhiyun #define MANUFACTUREROUI_MASK               GENMASK(31, 8)
439*4882a593Smuzhiyun #define MANUFACTUREROUI(x)                 UPDATE(x, 31, 8)
440*4882a593Smuzhiyun #define SINKVERSION_MASK                   GENMASK(7, 0)
441*4882a593Smuzhiyun #define SINKVERSION(x)                     UPDATE(x, 7, 0)
442*4882a593Smuzhiyun #define HDMI_RX_SCDC_WRDATA1               REG(0x0864)
443*4882a593Smuzhiyun #define HDMI_RX_SCDC_WRDATA2               REG(0x0868)
444*4882a593Smuzhiyun #define HDMI_RX_SCDC_WRDATA3               REG(0x086c)
445*4882a593Smuzhiyun #define HDMI_RX_SCDC_WRDATA4               REG(0x0870)
446*4882a593Smuzhiyun #define HDMI_RX_SCDC_WRDATA5               REG(0x0874)
447*4882a593Smuzhiyun #define HDMI_RX_SCDC_WRDATA6               REG(0x0878)
448*4882a593Smuzhiyun #define HDMI_RX_SCDC_WRDATA7               REG(0x087c)
449*4882a593Smuzhiyun #define HDMI_RX_HDMI20_STATUS              REG(0x08e0)
450*4882a593Smuzhiyun #define HDMI_RX_HDCP2_ESM_GLOBAL_GPIO_IN   REG(0x08e8)
451*4882a593Smuzhiyun #define HDMI_RX_HDCP2_ESM_GLOBAL_GPIO_OUT  REG(0x08ec)
452*4882a593Smuzhiyun #define HDMI_RX_HDCP2_ESM_P0_GPIO_IN       REG(0x08f0)
453*4882a593Smuzhiyun #define HDMI_RX_HDCP2_ESM_P0_GPIO_OUT      REG(0x08f4)
454*4882a593Smuzhiyun #define HDMI_RX_HDCP22_STATUS              REG(0x08fc)
455*4882a593Smuzhiyun #define HDMI_RX_HDMI2_IEN_CLR              REG(0x0f60)
456*4882a593Smuzhiyun #define HDMI_RX_HDMI2_IEN_SET              REG(0x0f64)
457*4882a593Smuzhiyun #define HDMI_RX_HDMI2_ISTS                 REG(0x0f68)
458*4882a593Smuzhiyun #define HDMI_RX_HDMI2_IEN                  REG(0x0f6c)
459*4882a593Smuzhiyun #define HDMI_RX_HDMI2_ICLR                 REG(0x0f70)
460*4882a593Smuzhiyun #define HDMI_RX_HDMI2_ISET                 REG(0x0f74)
461*4882a593Smuzhiyun #define HDMI_RX_PDEC_IEN_CLR               REG(0x0f78)
462*4882a593Smuzhiyun #define HDMI_RX_PDEC_IEN_SET               REG(0x0f7c)
463*4882a593Smuzhiyun #define HDMI_RX_PDEC_ISTS                  REG(0x0f80)
464*4882a593Smuzhiyun #define HDMI_RX_PDEC_IEN                   REG(0x0f84)
465*4882a593Smuzhiyun #define HDMI_RX_PDEC_ICLR                  REG(0x0f88)
466*4882a593Smuzhiyun #define HDMI_RX_PDEC_ISET                  REG(0x0f8c)
467*4882a593Smuzhiyun #define HDMI_RX_AUD_CEC_IEN_CLR            REG(0x0f90)
468*4882a593Smuzhiyun #define HDMI_RX_AUD_CEC_IEN_SET            REG(0x0f94)
469*4882a593Smuzhiyun #define HDMI_RX_AUD_CEC_ISTS               REG(0x0f98)
470*4882a593Smuzhiyun #define HDMI_RX_AUD_CEC_IEN                REG(0x0f9c)
471*4882a593Smuzhiyun #define HDMI_RX_AUD_CEC_ICLR               REG(0x0fa0)
472*4882a593Smuzhiyun #define HDMI_RX_AUD_CEC_ISET               REG(0x0fa4)
473*4882a593Smuzhiyun #define HDMI_RX_AUD_FIFO_IEN_CLR           REG(0x0fa8)
474*4882a593Smuzhiyun #define HDMI_RX_AUD_FIFO_IEN_SET           REG(0x0fac)
475*4882a593Smuzhiyun #define HDMI_RX_AUD_FIFO_ISTS              REG(0x0fb0)
476*4882a593Smuzhiyun #define HDMI_RX_AUD_FIFO_IEN               REG(0x0fb4)
477*4882a593Smuzhiyun #define HDMI_RX_AUD_FIFO_ICLR              REG(0x0fb8)
478*4882a593Smuzhiyun #define HDMI_RX_AUD_FIFO_ISET              REG(0x0fbc)
479*4882a593Smuzhiyun #define HDMI_RX_MD_IEN_CLR                 REG(0x0fc0)
480*4882a593Smuzhiyun #define HDMI_RX_MD_IEN_SET                 REG(0x0fc4)
481*4882a593Smuzhiyun #define HDMI_RX_MD_ISTS                    REG(0x0fc8)
482*4882a593Smuzhiyun #define HDMI_RX_MD_IEN                     REG(0x0fcc)
483*4882a593Smuzhiyun #define HDMI_RX_MD_ICLR                    REG(0x0fd0)
484*4882a593Smuzhiyun #define HDMI_RX_MD_ISET                    REG(0x0fd4)
485*4882a593Smuzhiyun #define HDMI_RX_HDMI_IEN_CLR               REG(0x0fd8)
486*4882a593Smuzhiyun #define HDMI_RX_HDMI_IEN_SET               REG(0x0fdc)
487*4882a593Smuzhiyun #define HDCP_DKSET_DONE_ENCLR_MASK         BIT(31)
488*4882a593Smuzhiyun #define HDCP_DKSET_DONE_ENCLR(x)           UPDATE(x, 31, 31)
489*4882a593Smuzhiyun #define HDMI_RX_HDMI_ISTS                  REG(0x0fe0)
490*4882a593Smuzhiyun #define HDMI_RX_HDMI_IEN                   REG(0x0fe4)
491*4882a593Smuzhiyun #define HDMI_RX_HDMI_ICLR                  REG(0x0fe8)
492*4882a593Smuzhiyun #define HDMI_RX_HDMI_ISET                  REG(0x0fec)
493*4882a593Smuzhiyun #define HDMI_RX_DMI_SW_RST                 REG(0x0ff0)
494*4882a593Smuzhiyun #define HDMI_RX_DMI_DISABLE_IF             REG(0x0ff4)
495*4882a593Smuzhiyun #define MAIN_ENABLE                        BIT(0)
496*4882a593Smuzhiyun #define MODET_ENABLE                       BIT(1)
497*4882a593Smuzhiyun #define HDMI_ENABLE                        BIT(2)
498*4882a593Smuzhiyun #define BUS_ENABLE                         BIT(3)
499*4882a593Smuzhiyun #define AUD_ENABLE                         BIT(4)
500*4882a593Smuzhiyun #define CEC_ENABLE                         BIT(5)
501*4882a593Smuzhiyun #define PIXEL_ENABLE                       BIT(6)
502*4882a593Smuzhiyun #define VID_ENABLE                         BIT(7)
503*4882a593Smuzhiyun #define TMDS_ENABLE_MASK                   BIT(16)
504*4882a593Smuzhiyun #define TMDS_ENABLE(x)                     UPDATE(x, 16, 16)
505*4882a593Smuzhiyun #define HDMI_RX_DMI_MODULE_ID_EXT          REG(0x0ff8)
506*4882a593Smuzhiyun #define HDMI_RX_DMI_MODULE_ID              REG(0x0ffc)
507*4882a593Smuzhiyun #define HDMI_RX_CEC_CTRL                   REG(0x1f00)
508*4882a593Smuzhiyun #define HDMI_RX_CEC_MASK                   REG(0x1f08)
509*4882a593Smuzhiyun #define HDMI_RX_CEC_ADDR_L                 REG(0x1f14)
510*4882a593Smuzhiyun #define HDMI_RX_CEC_ADDR_H                 REG(0x1f18)
511*4882a593Smuzhiyun #define HDMI_RX_CEC_TX_CNT                 REG(0x1f1c)
512*4882a593Smuzhiyun #define HDMI_RX_CEC_RX_CNT                 REG(0x1f20)
513*4882a593Smuzhiyun #define HDMI_RX_CEC_TX_DATA_0              REG(0x1f40)
514*4882a593Smuzhiyun #define HDMI_RX_CEC_TX_DATA_1              REG(0x1f44)
515*4882a593Smuzhiyun #define HDMI_RX_CEC_TX_DATA_2              REG(0x1f48)
516*4882a593Smuzhiyun #define HDMI_RX_CEC_TX_DATA_3              REG(0x1f4c)
517*4882a593Smuzhiyun #define HDMI_RX_CEC_TX_DATA_4              REG(0x1f50)
518*4882a593Smuzhiyun #define HDMI_RX_CEC_TX_DATA_5              REG(0x1f54)
519*4882a593Smuzhiyun #define HDMI_RX_CEC_TX_DATA_6              REG(0x1f58)
520*4882a593Smuzhiyun #define HDMI_RX_CEC_TX_DATA_7              REG(0x1f5c)
521*4882a593Smuzhiyun #define HDMI_RX_CEC_TX_DATA_8              REG(0x1f60)
522*4882a593Smuzhiyun #define HDMI_RX_CEC_TX_DATA_9              REG(0x1f64)
523*4882a593Smuzhiyun #define HDMI_RX_CEC_TX_DATA_10             REG(0x1f68)
524*4882a593Smuzhiyun #define HDMI_RX_CEC_TX_DATA_11             REG(0x1f6c)
525*4882a593Smuzhiyun #define HDMI_RX_CEC_TX_DATA_12             REG(0x1f70)
526*4882a593Smuzhiyun #define HDMI_RX_CEC_TX_DATA_13             REG(0x1f74)
527*4882a593Smuzhiyun #define HDMI_RX_CEC_TX_DATA_14             REG(0x1f78)
528*4882a593Smuzhiyun #define HDMI_RX_CEC_TX_DATA_15             REG(0x1f7c)
529*4882a593Smuzhiyun #define HDMI_RX_CEC_RX_DATA_0              REG(0x1f80)
530*4882a593Smuzhiyun #define HDMI_RX_CEC_RX_DATA_1              REG(0x1f84)
531*4882a593Smuzhiyun #define HDMI_RX_CEC_RX_DATA_2              REG(0x1f88)
532*4882a593Smuzhiyun #define HDMI_RX_CEC_RX_DATA_3              REG(0x1f8c)
533*4882a593Smuzhiyun #define HDMI_RX_CEC_RX_DATA_4              REG(0x1f90)
534*4882a593Smuzhiyun #define HDMI_RX_CEC_RX_DATA_5              REG(0x1f94)
535*4882a593Smuzhiyun #define HDMI_RX_CEC_RX_DATA_6              REG(0x1f98)
536*4882a593Smuzhiyun #define HDMI_RX_CEC_RX_DATA_7              REG(0x1f9c)
537*4882a593Smuzhiyun #define HDMI_RX_CEC_RX_DATA_8              REG(0x1fa0)
538*4882a593Smuzhiyun #define HDMI_RX_CEC_RX_DATA_9              REG(0x1fa4)
539*4882a593Smuzhiyun #define HDMI_RX_CEC_RX_DATA_10             REG(0x1fa8)
540*4882a593Smuzhiyun #define HDMI_RX_CEC_RX_DATA_11             REG(0x1fac)
541*4882a593Smuzhiyun #define HDMI_RX_CEC_RX_DATA_12             REG(0x1fb0)
542*4882a593Smuzhiyun #define HDMI_RX_CEC_RX_DATA_13             REG(0x1fb4)
543*4882a593Smuzhiyun #define HDMI_RX_CEC_RX_DATA_14             REG(0x1fb8)
544*4882a593Smuzhiyun #define HDMI_RX_CEC_RX_DATA_15             REG(0x1fbc)
545*4882a593Smuzhiyun #define HDMI_RX_CEC_LOCK                   REG(0x1fc0)
546*4882a593Smuzhiyun #define HDMI_RX_CEC_WAKEUPCTRL             REG(0x1fc4)
547*4882a593Smuzhiyun #define HDMI_RX_CBUSSWRESETREQ             REG(0x3000)
548*4882a593Smuzhiyun #define HDMI_RX_CBUSENABLEIF               REG(0x3004)
549*4882a593Smuzhiyun #define HDMI_RX_CB_LOCKONCLOCK_STS         REG(0x3010)
550*4882a593Smuzhiyun #define HDMI_RX_CB_LOCKONCLOCKCLR          REG(0x3014)
551*4882a593Smuzhiyun #define HDMI_RX_CBUSIOCTRL                 REG(0x3020)
552*4882a593Smuzhiyun #define HDMI_RX_DD_CTRL                    REG(0x3040)
553*4882a593Smuzhiyun #define HDMI_RX_DD_OP_CTRL                 REG(0x3044)
554*4882a593Smuzhiyun #define HDMI_RX_DD_STS                     REG(0x3048)
555*4882a593Smuzhiyun #define HDMI_RX_DD_BYPASS_EN               REG(0x304c)
556*4882a593Smuzhiyun #define HDMI_RX_DD_BYPASS_CTRL             REG(0x3050)
557*4882a593Smuzhiyun #define HDMI_RX_DD_BYPASS_CBUS             REG(0x3054)
558*4882a593Smuzhiyun #define HDMI_RX_LL_TXPCKFIFO               REG(0x3080)
559*4882a593Smuzhiyun #define HDMI_RX_LL_RXPCKFIFO_RD_CLR        REG(0x3084)
560*4882a593Smuzhiyun #define HDMI_RX_LL_RXPCKFIFO_A             REG(0x3088)
561*4882a593Smuzhiyun #define HDMI_RX_LL_RXPCKFIFO_B             REG(0x308c)
562*4882a593Smuzhiyun #define HDMI_RX_LL_TXPCKCTRL_0             REG(0x3090)
563*4882a593Smuzhiyun #define HDMI_RX_LL_TXPCKCTRL_1             REG(0x3094)
564*4882a593Smuzhiyun #define HDMI_RX_LL_PCKFIFO_STS             REG(0x309c)
565*4882a593Smuzhiyun #define HDMI_RX_LL_RXPCKCTRL_0             REG(0x30a0)
566*4882a593Smuzhiyun #define HDMI_RX_LL_RXPCKCTRL_1             REG(0x30a4)
567*4882a593Smuzhiyun #define HDMI_RX_LL_INTTRSHLDCTRL           REG(0x30b0)
568*4882a593Smuzhiyun #define HDMI_RX_LL_INTCNTCTRL              REG(0x30b4)
569*4882a593Smuzhiyun #define HDMI_RX_LL_INTCNT_0                REG(0x30b8)
570*4882a593Smuzhiyun #define HDMI_RX_LL_INTCNT_1                REG(0x30bc)
571*4882a593Smuzhiyun #define HDMI_RX_CBHDCP_OPCTRL              REG(0x3100)
572*4882a593Smuzhiyun #define HDMI_RX_CBHDCP_WDATA_0             REG(0x3104)
573*4882a593Smuzhiyun #define HDMI_RX_CBHDCP_WDATA_1             REG(0x3108)
574*4882a593Smuzhiyun #define HDMI_RX_CBHDCP_RDATA_0             REG(0x310c)
575*4882a593Smuzhiyun #define HDMI_RX_CBHDCP_RDATA_1             REG(0x3110)
576*4882a593Smuzhiyun #define HDMI_RX_CBHDCP_STATUS              REG(0x3114)
577*4882a593Smuzhiyun #define HDMI_RX_CBHDCP_DDC_REPORT          REG(0x3118)
578*4882a593Smuzhiyun #define HDMI_RX_ISTAT_CB_DD                REG(0x3200)
579*4882a593Smuzhiyun #define HDMI_RX_IMASK_CB_DD                REG(0x3204)
580*4882a593Smuzhiyun #define HDMI_RX_IFORCE_CB_DD               REG(0x3208)
581*4882a593Smuzhiyun #define HDMI_RX_ICLEAR_CB_DD               REG(0x320c)
582*4882a593Smuzhiyun #define HDMI_RX_IMUTE_CB_DD                REG(0x3210)
583*4882a593Smuzhiyun #define HDMI_RX_ISTAT_CB_LL                REG(0x3220)
584*4882a593Smuzhiyun #define HDMI_RX_IMASK_CB_LL                REG(0x3224)
585*4882a593Smuzhiyun #define HDMI_RX_IFORCE_CB_LL               REG(0x3228)
586*4882a593Smuzhiyun #define HDMI_RX_ICLEAR_CB_LL               REG(0x322c)
587*4882a593Smuzhiyun #define HDMI_RX_IMUTE_CB_LL                REG(0x3230)
588*4882a593Smuzhiyun #define HDMI_RX_ISTAT_CB_HDCP              REG(0x3240)
589*4882a593Smuzhiyun #define HDMI_RX_IMASK_CB_HDCP              REG(0x3244)
590*4882a593Smuzhiyun #define HDMI_RX_IFORCE_CB_HDCP             REG(0x3248)
591*4882a593Smuzhiyun #define HDMI_RX_ICLEAR_CB_HDCP             REG(0x324c)
592*4882a593Smuzhiyun #define HDMI_RX_IMUTE_CB_HDCP              REG(0x3250)
593*4882a593Smuzhiyun #define HDMI_RX_ISTAT_CB_MCTRL             REG(0x3260)
594*4882a593Smuzhiyun #define HDMI_RX_IMASK_CB_MCTRL             REG(0x3264)
595*4882a593Smuzhiyun #define HDMI_RX_IFORCE_CB_MCTRL            REG(0x3268)
596*4882a593Smuzhiyun #define HDMI_RX_ICLEAR_CB_MCTRL            REG(0x326c)
597*4882a593Smuzhiyun #define HDMI_RX_IMUTE_CB_MCTRL             REG(0x3270)
598*4882a593Smuzhiyun #define HDMI_RX_IMASTER_MUTE_CB            REG(0x32e0)
599*4882a593Smuzhiyun #define HDMI_RX_IVECTOR_INDEX_CB           REG(0x32e4)
600*4882a593Smuzhiyun #define HDMI_RX_MAX_REGISTER               HDMI_RX_IVECTOR_INDEX_CB
601*4882a593Smuzhiyun 
602*4882a593Smuzhiyun struct rk628_hdmirx {
603*4882a593Smuzhiyun 	struct drm_bridge base;
604*4882a593Smuzhiyun 	struct drm_bridge *bridge;
605*4882a593Smuzhiyun 	struct device *dev;
606*4882a593Smuzhiyun 	struct regmap *regmap;
607*4882a593Smuzhiyun 	struct regmap *grf;
608*4882a593Smuzhiyun 	struct phy *phy;
609*4882a593Smuzhiyun 	struct clk *pclk;
610*4882a593Smuzhiyun 	struct clk *cec_clk;
611*4882a593Smuzhiyun 	struct clk *aud_clk;
612*4882a593Smuzhiyun 	struct clk *imodet_clk;
613*4882a593Smuzhiyun 	struct reset_control *hdmirx;
614*4882a593Smuzhiyun 	struct reset_control *hdmirx_pon;
615*4882a593Smuzhiyun 	struct rk628 *parent;
616*4882a593Smuzhiyun 	struct drm_display_mode mode;
617*4882a593Smuzhiyun };
618*4882a593Smuzhiyun 
619*4882a593Smuzhiyun static const struct regmap_range rk628_hdmirx_readable_ranges[] = {
620*4882a593Smuzhiyun 	regmap_reg_range(HDMI_RX_HDMI_SETUP_CTRL, HDMI_RX_HDMI_TIMER_CTRL),
621*4882a593Smuzhiyun 	regmap_reg_range(HDMI_RX_HDMI_MODE_RECOVER, HDMI_RX_HDMI_ERD_STS),
622*4882a593Smuzhiyun 	regmap_reg_range(HDMI_RX_MD_HCTRL1, HDMI_RX_MD_STS),
623*4882a593Smuzhiyun 	regmap_reg_range(HDMI_RX_PDEC_ACRM_CTRL, HDMI_RX_PDEC_ASP_ERR),
624*4882a593Smuzhiyun 	regmap_reg_range(HDMI_RX_PDEC_AVI_HB, HDMI_RX_PDEC_AVI_LRB),
625*4882a593Smuzhiyun 	regmap_reg_range(HDMI_RX_PDEC_AIF_CTRL, HDMI_RX_PDEC_GMD_PB),
626*4882a593Smuzhiyun 	regmap_reg_range(HDMI_RX_HDMI20_CONTROL, HDMI_RX_CHLOCK_CONFIG),
627*4882a593Smuzhiyun 	regmap_reg_range(HDMI_RX_SCDC_REGS1, HDMI_RX_SCDC_REGS3),
628*4882a593Smuzhiyun 	regmap_reg_range(HDMI_RX_SCDC_WRDATA0, HDMI_RX_SCDC_WRDATA7),
629*4882a593Smuzhiyun 	regmap_reg_range(HDMI_RX_DMI_DISABLE_IF, HDMI_RX_DMI_DISABLE_IF),
630*4882a593Smuzhiyun };
631*4882a593Smuzhiyun 
632*4882a593Smuzhiyun static const struct regmap_access_table rk628_hdmirx_readable_table = {
633*4882a593Smuzhiyun 	.yes_ranges	= rk628_hdmirx_readable_ranges,
634*4882a593Smuzhiyun 	.n_yes_ranges   = ARRAY_SIZE(rk628_hdmirx_readable_ranges),
635*4882a593Smuzhiyun };
636*4882a593Smuzhiyun 
637*4882a593Smuzhiyun static const struct regmap_config rk628_hdmirx_regmap_config = {
638*4882a593Smuzhiyun 	.name = "hdmirx",
639*4882a593Smuzhiyun 	.reg_bits = 32,
640*4882a593Smuzhiyun 	.val_bits = 32,
641*4882a593Smuzhiyun 	.reg_stride = 4,
642*4882a593Smuzhiyun 	.max_register = HDMI_RX_MAX_REGISTER,
643*4882a593Smuzhiyun 	.reg_format_endian = REGMAP_ENDIAN_LITTLE,
644*4882a593Smuzhiyun 	.val_format_endian = REGMAP_ENDIAN_LITTLE,
645*4882a593Smuzhiyun 	.rd_table = &rk628_hdmirx_readable_table,
646*4882a593Smuzhiyun };
647*4882a593Smuzhiyun 
bridge_to_hdmirx(struct drm_bridge * bridge)648*4882a593Smuzhiyun static inline struct rk628_hdmirx *bridge_to_hdmirx(struct drm_bridge *bridge)
649*4882a593Smuzhiyun {
650*4882a593Smuzhiyun 	return container_of(bridge, struct rk628_hdmirx, base);
651*4882a593Smuzhiyun }
652*4882a593Smuzhiyun 
rk628_hdmirx_ctrl_enable(struct rk628_hdmirx * hdmirx)653*4882a593Smuzhiyun static void rk628_hdmirx_ctrl_enable(struct rk628_hdmirx *hdmirx)
654*4882a593Smuzhiyun {
655*4882a593Smuzhiyun 	clk_prepare_enable(hdmirx->pclk);
656*4882a593Smuzhiyun 	clk_prepare_enable(hdmirx->aud_clk);
657*4882a593Smuzhiyun 	clk_prepare_enable(hdmirx->imodet_clk);
658*4882a593Smuzhiyun 
659*4882a593Smuzhiyun 	reset_control_deassert(hdmirx->hdmirx);
660*4882a593Smuzhiyun 	reset_control_deassert(hdmirx->hdmirx_pon);
661*4882a593Smuzhiyun 
662*4882a593Smuzhiyun 	regmap_update_bits(hdmirx->grf, GRF_SYSTEM_CON0,
663*4882a593Smuzhiyun 			   SW_INPUT_MODE_MASK,
664*4882a593Smuzhiyun 			   SW_INPUT_MODE(INPUT_MODE_HDMI));
665*4882a593Smuzhiyun 
666*4882a593Smuzhiyun 	regmap_write(hdmirx->regmap, HDMI_RX_DMI_SW_RST, 0x000101ff);
667*4882a593Smuzhiyun 
668*4882a593Smuzhiyun 	regmap_write(hdmirx->regmap, HDMI_RX_DMI_DISABLE_IF, 0x00000000);
669*4882a593Smuzhiyun 	regmap_write(hdmirx->regmap, HDMI_RX_DMI_DISABLE_IF, 0x0000017f);
670*4882a593Smuzhiyun 	regmap_write(hdmirx->regmap, HDMI_RX_DMI_DISABLE_IF, 0x0001017f);
671*4882a593Smuzhiyun 
672*4882a593Smuzhiyun 	regmap_write(hdmirx->regmap, HDMI_RX_HDMI20_CONTROL, 0x10001f10);
673*4882a593Smuzhiyun 
674*4882a593Smuzhiyun 	regmap_update_bits(hdmirx->regmap, HDMI_RX_CHLOCK_CONFIG,
675*4882a593Smuzhiyun 			   CHLOCKMAXER_MASK | MILISECTIMERLIMIT_MASK,
676*4882a593Smuzhiyun 			   CHLOCKMAXER(0x1) | MILISECTIMERLIMIT(49500));
677*4882a593Smuzhiyun 
678*4882a593Smuzhiyun 	regmap_write(hdmirx->regmap, HDMI_RX_SCDC_CONFIG, 0x00000001);
679*4882a593Smuzhiyun 	regmap_write(hdmirx->regmap, HDMI_RX_DMI_SW_RST, 0x000001fe);
680*4882a593Smuzhiyun 	regmap_write(hdmirx->regmap, HDMI_RX_HDMI_CKM_EVLTM, 0x0016fff0);
681*4882a593Smuzhiyun 	regmap_write(hdmirx->regmap, HDMI_RX_HDMI_CKM_F, 0xf98a0190);
682*4882a593Smuzhiyun 
683*4882a593Smuzhiyun 	regmap_update_bits(hdmirx->regmap, HDMI_RX_HDMI_MODE_RECOVER,
684*4882a593Smuzhiyun 			   SPIKE_FILTER_EN_MASK | DVI_MODE_HYST_MASK |
685*4882a593Smuzhiyun 			   HDMI_MODE_HYST_MASK | HDMI_MODE_MASK |
686*4882a593Smuzhiyun 			   GB_DET_MASK | EESS_OESS_MASK | SEL_CTL01_MASK,
687*4882a593Smuzhiyun 			   SPIKE_FILTER_EN(0) |
688*4882a593Smuzhiyun 			   DVI_MODE_HYST(0) |
689*4882a593Smuzhiyun 			   HDMI_MODE_HYST(0) |
690*4882a593Smuzhiyun 			   HDMI_MODE(3) |
691*4882a593Smuzhiyun 			   GB_DET(2) |
692*4882a593Smuzhiyun 			   EESS_OESS(0) |
693*4882a593Smuzhiyun 			   SEL_CTL01(1));
694*4882a593Smuzhiyun 
695*4882a593Smuzhiyun 	regmap_write(hdmirx->regmap, HDMI_RX_PDEC_CTRL, 0xbfff8011);
696*4882a593Smuzhiyun 	regmap_write(hdmirx->regmap, HDMI_RX_PDEC_ASP_CTRL, 0x00000040);
697*4882a593Smuzhiyun 
698*4882a593Smuzhiyun 	regmap_update_bits(hdmirx->regmap, HDMI_RX_HDMI_RESMPL_CTRL,
699*4882a593Smuzhiyun 			   MAN_VID_DEREPEAT_MASK, MAN_VID_DEREPEAT(1));
700*4882a593Smuzhiyun 
701*4882a593Smuzhiyun 	regmap_update_bits(hdmirx->regmap, HDMI_RX_HDMI_SYNC_CTRL,
702*4882a593Smuzhiyun 			   VS_POL_ADJ_MODE_MASK | HS_POL_ADJ_MODE_MASK,
703*4882a593Smuzhiyun 			   VS_POL_ADJ_MODE(2) | HS_POL_ADJ_MODE(2));
704*4882a593Smuzhiyun 
705*4882a593Smuzhiyun 	regmap_write(hdmirx->regmap, HDMI_RX_PDEC_ERR_FILTER, 0x00000008);
706*4882a593Smuzhiyun 
707*4882a593Smuzhiyun 	regmap_update_bits(hdmirx->regmap, HDMI_RX_SCDC_I2CCONFIG,
708*4882a593Smuzhiyun 			   I2CSPIKESUPPR_MASK, I2CSPIKESUPPR(1));
709*4882a593Smuzhiyun 
710*4882a593Smuzhiyun 	regmap_write(hdmirx->regmap, HDMI_RX_SCDC_CONFIG, 0x00000001);
711*4882a593Smuzhiyun 	regmap_write(hdmirx->regmap, HDMI_RX_SCDC_WRDATA0, 0xabcdef01);
712*4882a593Smuzhiyun 
713*4882a593Smuzhiyun 	regmap_update_bits(hdmirx->regmap, HDMI_RX_CHLOCK_CONFIG,
714*4882a593Smuzhiyun 			   CHLOCKMAXER_MASK | MILISECTIMERLIMIT_MASK,
715*4882a593Smuzhiyun 			   CHLOCKMAXER(0x1) | MILISECTIMERLIMIT(49500));
716*4882a593Smuzhiyun 
717*4882a593Smuzhiyun 	regmap_write(hdmirx->regmap, HDMI_RX_HDMI_ERROR_PROTECT, 0x000d0c98);
718*4882a593Smuzhiyun 	regmap_write(hdmirx->regmap, HDMI_RX_MD_HCTRL1, 0x00000010);
719*4882a593Smuzhiyun 	regmap_write(hdmirx->regmap, HDMI_RX_MD_HCTRL2, 0x00001738);
720*4882a593Smuzhiyun 	regmap_write(hdmirx->regmap, HDMI_RX_MD_VCTRL, 0x00000012);
721*4882a593Smuzhiyun 	regmap_write(hdmirx->regmap, HDMI_RX_MD_VTH, 0x0000073a);
722*4882a593Smuzhiyun 	regmap_write(hdmirx->regmap, HDMI_RX_MD_IL_POL, 0x00000004);
723*4882a593Smuzhiyun 	regmap_write(hdmirx->regmap, HDMI_RX_PDEC_ACRM_CTRL, 0x00000000);
724*4882a593Smuzhiyun 	regmap_write(hdmirx->regmap, HDMI_RX_HDMI_DCM_CTRL, 0x00040414);
725*4882a593Smuzhiyun 	regmap_write(hdmirx->regmap, HDMI_RX_HDMI_PCB_CTRL, 0x00100000);
726*4882a593Smuzhiyun 	regmap_write(hdmirx->regmap, HDMI_RX_HDMI_SETUP_CTRL, 0x0f000fff);
727*4882a593Smuzhiyun 	regmap_write(hdmirx->regmap, HDMI_RX_HDMI_CKM_EVLTM, 0x00104260);
728*4882a593Smuzhiyun 	regmap_write(hdmirx->regmap, HDMI_RX_HDMI_CKM_F, 0x0f2d0eed);
729*4882a593Smuzhiyun 	regmap_write(hdmirx->regmap, HDMI_RX_DMI_DISABLE_IF, 0x00000001);
730*4882a593Smuzhiyun 	udelay(400);
731*4882a593Smuzhiyun 	regmap_write(hdmirx->regmap, HDMI_RX_DMI_DISABLE_IF, 0x0001017f);
732*4882a593Smuzhiyun 	regmap_update_bits(hdmirx->regmap, HDMI_RX_HDMI_RESMPL_CTRL,
733*4882a593Smuzhiyun 			   MAN_VID_DEREPEAT_MASK, MAN_VID_DEREPEAT(1));
734*4882a593Smuzhiyun 	regmap_write(hdmirx->regmap, HDMI_RX_DMI_SW_RST, 0x000001fe);
735*4882a593Smuzhiyun }
736*4882a593Smuzhiyun 
rk628_hdmirx_ctrl_disable(struct rk628_hdmirx * hdmirx)737*4882a593Smuzhiyun static void rk628_hdmirx_ctrl_disable(struct rk628_hdmirx *hdmirx)
738*4882a593Smuzhiyun {
739*4882a593Smuzhiyun 	reset_control_assert(hdmirx->hdmirx);
740*4882a593Smuzhiyun 	reset_control_assert(hdmirx->hdmirx_pon);
741*4882a593Smuzhiyun 	clk_disable_unprepare(hdmirx->pclk);
742*4882a593Smuzhiyun 	clk_disable_unprepare(hdmirx->aud_clk);
743*4882a593Smuzhiyun 	clk_disable_unprepare(hdmirx->imodet_clk);
744*4882a593Smuzhiyun }
745*4882a593Smuzhiyun 
rk628_hdmirx_bridge_enable(struct drm_bridge * bridge)746*4882a593Smuzhiyun static void rk628_hdmirx_bridge_enable(struct drm_bridge *bridge)
747*4882a593Smuzhiyun {
748*4882a593Smuzhiyun 	bool locked;
749*4882a593Smuzhiyun 	u32 value, i, hact, vact, bus_width, hdisplay, vdisplay;
750*4882a593Smuzhiyun 	struct rk628_hdmirx *hdmirx = bridge_to_hdmirx(bridge);
751*4882a593Smuzhiyun 
752*4882a593Smuzhiyun 	/* force 594m mode to yuv420 format */
753*4882a593Smuzhiyun 	if (hdmirx->mode.clock == 594000) {
754*4882a593Smuzhiyun 		/*
755*4882a593Smuzhiyun 		 * bit30 is used to indicate whether it is
756*4882a593Smuzhiyun 		 * yuv420 format
757*4882a593Smuzhiyun 		 */
758*4882a593Smuzhiyun 		bus_width = hdmirx->mode.clock | BIT(30);
759*4882a593Smuzhiyun 		hdisplay = hdmirx->mode.hdisplay / 2;
760*4882a593Smuzhiyun 	} else {
761*4882a593Smuzhiyun 		bus_width = hdmirx->mode.clock;
762*4882a593Smuzhiyun 		hdisplay = hdmirx->mode.hdisplay;
763*4882a593Smuzhiyun 	}
764*4882a593Smuzhiyun 
765*4882a593Smuzhiyun 	vdisplay = hdmirx->mode.vdisplay;
766*4882a593Smuzhiyun 
767*4882a593Smuzhiyun 	phy_set_bus_width(hdmirx->phy, bus_width);
768*4882a593Smuzhiyun 	phy_power_on(hdmirx->phy);
769*4882a593Smuzhiyun 	usleep_range(10*1000, 11*1000);
770*4882a593Smuzhiyun 	rk628_hdmirx_ctrl_enable(hdmirx);
771*4882a593Smuzhiyun 
772*4882a593Smuzhiyun 	/* if hdmirx ctrl unlock or get incorrect timing, reset ctrl and phy */
773*4882a593Smuzhiyun 	for (i = 0; i < 5; i++) {
774*4882a593Smuzhiyun 		usleep_range(100*1000, 110*1000);
775*4882a593Smuzhiyun 		regmap_read(hdmirx->regmap, HDMI_RX_SCDC_REGS1, &value);
776*4882a593Smuzhiyun 		dev_dbg(hdmirx->dev, "HDMI_RX_SCDC_REGS1:0x%x\n", value);
777*4882a593Smuzhiyun 		value = (value >> 8) & 0xf;
778*4882a593Smuzhiyun 
779*4882a593Smuzhiyun 		regmap_read(hdmirx->regmap, HDMI_RX_MD_HACT_PX, &hact);
780*4882a593Smuzhiyun 		regmap_read(hdmirx->regmap, HDMI_RX_MD_VAL, &vact);
781*4882a593Smuzhiyun 
782*4882a593Smuzhiyun 		hact = hact & 0xffff;
783*4882a593Smuzhiyun 		vact = vact & 0xffff;
784*4882a593Smuzhiyun 		dev_dbg(hdmirx->dev, "hact:%d,vact:%d\n", hact, vact);
785*4882a593Smuzhiyun 
786*4882a593Smuzhiyun 		if (value == 0xf && hact == hdisplay && vact == vdisplay)
787*4882a593Smuzhiyun 			locked = true;
788*4882a593Smuzhiyun 		else
789*4882a593Smuzhiyun 			locked = false;
790*4882a593Smuzhiyun 
791*4882a593Smuzhiyun 		if (!locked) {
792*4882a593Smuzhiyun 			rk628_hdmirx_ctrl_disable(hdmirx);
793*4882a593Smuzhiyun 			usleep_range(10*1000, 11*1000);
794*4882a593Smuzhiyun 			phy_power_off(hdmirx->phy);
795*4882a593Smuzhiyun 			usleep_range(10*1000, 11*1000);
796*4882a593Smuzhiyun 			phy_power_on(hdmirx->phy);
797*4882a593Smuzhiyun 			usleep_range(10*1000, 11*1000);
798*4882a593Smuzhiyun 			rk628_hdmirx_ctrl_enable(hdmirx);
799*4882a593Smuzhiyun 		} else {
800*4882a593Smuzhiyun 			/* hdmirx ctrl get correct timing, enable output */
801*4882a593Smuzhiyun 			regmap_write(hdmirx->regmap, HDMI_RX_DMI_DISABLE_IF,
802*4882a593Smuzhiyun 				     0x000001ff);
803*4882a593Smuzhiyun 			return;
804*4882a593Smuzhiyun 		}
805*4882a593Smuzhiyun 	}
806*4882a593Smuzhiyun 
807*4882a593Smuzhiyun 	dev_err(hdmirx->dev, "hdmirx channel can't lock!\n");
808*4882a593Smuzhiyun 
809*4882a593Smuzhiyun }
810*4882a593Smuzhiyun 
rk628_hdmirx_bridge_disable(struct drm_bridge * bridge)811*4882a593Smuzhiyun static void rk628_hdmirx_bridge_disable(struct drm_bridge *bridge)
812*4882a593Smuzhiyun {
813*4882a593Smuzhiyun 	struct rk628_hdmirx *hdmirx = bridge_to_hdmirx(bridge);
814*4882a593Smuzhiyun 
815*4882a593Smuzhiyun 	rk628_hdmirx_ctrl_disable(hdmirx);
816*4882a593Smuzhiyun 	phy_power_off(hdmirx->phy);
817*4882a593Smuzhiyun }
818*4882a593Smuzhiyun 
rk628_hdmirx_bridge_attach(struct drm_bridge * bridge,enum drm_bridge_attach_flags flags)819*4882a593Smuzhiyun static int rk628_hdmirx_bridge_attach(struct drm_bridge *bridge,
820*4882a593Smuzhiyun 				      enum drm_bridge_attach_flags flags)
821*4882a593Smuzhiyun {
822*4882a593Smuzhiyun 	struct rk628_hdmirx *hdmirx = bridge_to_hdmirx(bridge);
823*4882a593Smuzhiyun 	struct device *dev = hdmirx->dev;
824*4882a593Smuzhiyun 	int ret;
825*4882a593Smuzhiyun 
826*4882a593Smuzhiyun 	ret = drm_of_find_panel_or_bridge(dev->of_node, 1, -1,
827*4882a593Smuzhiyun 					  NULL, &hdmirx->bridge);
828*4882a593Smuzhiyun 	if (ret) {
829*4882a593Smuzhiyun 		dev_err(dev, "failed to find next bridge\n");
830*4882a593Smuzhiyun 		return ret;
831*4882a593Smuzhiyun 	}
832*4882a593Smuzhiyun 
833*4882a593Smuzhiyun 	ret = drm_bridge_attach(bridge->encoder, hdmirx->bridge, bridge, flags);
834*4882a593Smuzhiyun 	if (ret) {
835*4882a593Smuzhiyun 		dev_err(dev, "failed to attach bridge\n");
836*4882a593Smuzhiyun 		return ret;
837*4882a593Smuzhiyun 	}
838*4882a593Smuzhiyun 
839*4882a593Smuzhiyun 	return 0;
840*4882a593Smuzhiyun }
841*4882a593Smuzhiyun 
rk628_hdmirx_bridge_mode_set(struct drm_bridge * bridge,const struct drm_display_mode * mode,const struct drm_display_mode * adj)842*4882a593Smuzhiyun static void rk628_hdmirx_bridge_mode_set(struct drm_bridge *bridge,
843*4882a593Smuzhiyun 					 const struct drm_display_mode *mode,
844*4882a593Smuzhiyun 					 const struct drm_display_mode *adj)
845*4882a593Smuzhiyun {
846*4882a593Smuzhiyun 	struct rk628_hdmirx *hdmirx = bridge_to_hdmirx(bridge);
847*4882a593Smuzhiyun 
848*4882a593Smuzhiyun 	memcpy(&hdmirx->mode, adj, sizeof(hdmirx->mode));
849*4882a593Smuzhiyun }
850*4882a593Smuzhiyun 
851*4882a593Smuzhiyun static const struct drm_bridge_funcs rk628_hdmirx_bridge_funcs = {
852*4882a593Smuzhiyun 	.attach = rk628_hdmirx_bridge_attach,
853*4882a593Smuzhiyun 	.enable = rk628_hdmirx_bridge_enable,
854*4882a593Smuzhiyun 	.disable = rk628_hdmirx_bridge_disable,
855*4882a593Smuzhiyun 	.mode_set = rk628_hdmirx_bridge_mode_set,
856*4882a593Smuzhiyun };
857*4882a593Smuzhiyun 
rk628_hdmirx_probe(struct platform_device * pdev)858*4882a593Smuzhiyun static int rk628_hdmirx_probe(struct platform_device *pdev)
859*4882a593Smuzhiyun {
860*4882a593Smuzhiyun 	struct rk628 *rk628 = dev_get_drvdata(pdev->dev.parent);
861*4882a593Smuzhiyun 	struct device *dev = &pdev->dev;
862*4882a593Smuzhiyun 	struct platform_device_info pdevinfo;
863*4882a593Smuzhiyun 	struct rk628_hdmirx *hdmirx;
864*4882a593Smuzhiyun 	int ret, irq;
865*4882a593Smuzhiyun 
866*4882a593Smuzhiyun 	if (!of_device_is_available(dev->of_node))
867*4882a593Smuzhiyun 		return -ENODEV;
868*4882a593Smuzhiyun 
869*4882a593Smuzhiyun 	hdmirx = devm_kzalloc(dev, sizeof(*hdmirx), GFP_KERNEL);
870*4882a593Smuzhiyun 	if (!hdmirx)
871*4882a593Smuzhiyun 		return -ENOMEM;
872*4882a593Smuzhiyun 
873*4882a593Smuzhiyun 	hdmirx->dev = dev;
874*4882a593Smuzhiyun 	hdmirx->parent = rk628;
875*4882a593Smuzhiyun 	platform_set_drvdata(pdev, hdmirx);
876*4882a593Smuzhiyun 
877*4882a593Smuzhiyun 	irq = platform_get_irq(pdev, 0);
878*4882a593Smuzhiyun 	if (irq < 0)
879*4882a593Smuzhiyun 		return irq;
880*4882a593Smuzhiyun 
881*4882a593Smuzhiyun 	hdmirx->grf = rk628->grf;
882*4882a593Smuzhiyun 	if (!hdmirx->grf)
883*4882a593Smuzhiyun 		return -ENODEV;
884*4882a593Smuzhiyun 
885*4882a593Smuzhiyun 	hdmirx->pclk = devm_clk_get(dev, "pclk");
886*4882a593Smuzhiyun 	if (IS_ERR(hdmirx->pclk)) {
887*4882a593Smuzhiyun 		ret = PTR_ERR(hdmirx->pclk);
888*4882a593Smuzhiyun 		dev_err(dev, "failed to get pclk: %d\n", ret);
889*4882a593Smuzhiyun 		return ret;
890*4882a593Smuzhiyun 	}
891*4882a593Smuzhiyun 
892*4882a593Smuzhiyun 	hdmirx->cec_clk = devm_clk_get(dev, "cec");
893*4882a593Smuzhiyun 	if (IS_ERR(hdmirx->cec_clk)) {
894*4882a593Smuzhiyun 		ret = PTR_ERR(hdmirx->cec_clk);
895*4882a593Smuzhiyun 		dev_err(dev, "failed to get cec clk: %d\n", ret);
896*4882a593Smuzhiyun 		return ret;
897*4882a593Smuzhiyun 	}
898*4882a593Smuzhiyun 
899*4882a593Smuzhiyun 	hdmirx->aud_clk = devm_clk_get(dev, "audio");
900*4882a593Smuzhiyun 	if (IS_ERR(hdmirx->aud_clk)) {
901*4882a593Smuzhiyun 		ret = PTR_ERR(hdmirx->aud_clk);
902*4882a593Smuzhiyun 		dev_err(dev, "failed to get audio clk: %d\n", ret);
903*4882a593Smuzhiyun 		return ret;
904*4882a593Smuzhiyun 	}
905*4882a593Smuzhiyun 
906*4882a593Smuzhiyun 	hdmirx->imodet_clk = devm_clk_get(dev, "imodet");
907*4882a593Smuzhiyun 	if (IS_ERR(hdmirx->imodet_clk)) {
908*4882a593Smuzhiyun 		ret = PTR_ERR(hdmirx->imodet_clk);
909*4882a593Smuzhiyun 		dev_err(dev, "failed to get imodet clk: %d\n", ret);
910*4882a593Smuzhiyun 		return ret;
911*4882a593Smuzhiyun 	}
912*4882a593Smuzhiyun 
913*4882a593Smuzhiyun 	hdmirx->hdmirx = of_reset_control_get(dev->of_node, "hdmirx");
914*4882a593Smuzhiyun 	if (IS_ERR(hdmirx->hdmirx)) {
915*4882a593Smuzhiyun 		ret = PTR_ERR(hdmirx->hdmirx);
916*4882a593Smuzhiyun 		DRM_DEV_ERROR(dev, "failed to get hdmirx control: %d\n", ret);
917*4882a593Smuzhiyun 		return ret;
918*4882a593Smuzhiyun 	}
919*4882a593Smuzhiyun 
920*4882a593Smuzhiyun 	hdmirx->hdmirx_pon = of_reset_control_get(dev->of_node, "hdmirx_pon");
921*4882a593Smuzhiyun 	if (IS_ERR(hdmirx->hdmirx_pon)) {
922*4882a593Smuzhiyun 		ret = PTR_ERR(hdmirx->hdmirx_pon);
923*4882a593Smuzhiyun 		DRM_DEV_ERROR(dev, "failed to get hdmirx_pon control: %d\n", ret);
924*4882a593Smuzhiyun 		return ret;
925*4882a593Smuzhiyun 	}
926*4882a593Smuzhiyun 
927*4882a593Smuzhiyun 	hdmirx->phy = devm_of_phy_get(dev, dev->of_node, NULL);
928*4882a593Smuzhiyun 	if (IS_ERR(hdmirx->phy)) {
929*4882a593Smuzhiyun 		ret = PTR_ERR(hdmirx->phy);
930*4882a593Smuzhiyun 		dev_err(dev, "failed to get phy: %d\n", ret);
931*4882a593Smuzhiyun 		return ret;
932*4882a593Smuzhiyun 	}
933*4882a593Smuzhiyun 
934*4882a593Smuzhiyun 	hdmirx->regmap = devm_regmap_init_i2c(rk628->client,
935*4882a593Smuzhiyun 					      &rk628_hdmirx_regmap_config);
936*4882a593Smuzhiyun 	if (IS_ERR(hdmirx->regmap)) {
937*4882a593Smuzhiyun 		ret = PTR_ERR(hdmirx->regmap);
938*4882a593Smuzhiyun 		dev_err(dev, "failed to allocate register map: %d\n", ret);
939*4882a593Smuzhiyun 		return ret;
940*4882a593Smuzhiyun 	}
941*4882a593Smuzhiyun 
942*4882a593Smuzhiyun 	hdmirx->base.funcs = &rk628_hdmirx_bridge_funcs;
943*4882a593Smuzhiyun 	hdmirx->base.of_node = dev->of_node;
944*4882a593Smuzhiyun 	drm_bridge_add(&hdmirx->base);
945*4882a593Smuzhiyun 
946*4882a593Smuzhiyun 	memset(&pdevinfo, 0, sizeof(pdevinfo));
947*4882a593Smuzhiyun 	pdevinfo.parent = dev;
948*4882a593Smuzhiyun 	pdevinfo.id = PLATFORM_DEVID_AUTO;
949*4882a593Smuzhiyun 
950*4882a593Smuzhiyun 	return 0;
951*4882a593Smuzhiyun }
952*4882a593Smuzhiyun 
rk628_hdmirx_remove(struct platform_device * pdev)953*4882a593Smuzhiyun static int rk628_hdmirx_remove(struct platform_device *pdev)
954*4882a593Smuzhiyun {
955*4882a593Smuzhiyun 	struct rk628_hdmirx *hdmirx = platform_get_drvdata(pdev);
956*4882a593Smuzhiyun 
957*4882a593Smuzhiyun 	drm_bridge_remove(&hdmirx->base);
958*4882a593Smuzhiyun 
959*4882a593Smuzhiyun 	return 0;
960*4882a593Smuzhiyun }
961*4882a593Smuzhiyun 
962*4882a593Smuzhiyun static const struct of_device_id rk628_hdmirx_of_match[] = {
963*4882a593Smuzhiyun 	{ .compatible = "rockchip,rk628-hdmirx", },
964*4882a593Smuzhiyun 	{},
965*4882a593Smuzhiyun };
966*4882a593Smuzhiyun MODULE_DEVICE_TABLE(of, rk628_hdmirx_of_match);
967*4882a593Smuzhiyun 
968*4882a593Smuzhiyun static struct platform_driver rk628_hdmirx_driver = {
969*4882a593Smuzhiyun 	.driver = {
970*4882a593Smuzhiyun 		.name = "rk628-hdmirx",
971*4882a593Smuzhiyun 		.of_match_table = of_match_ptr(rk628_hdmirx_of_match),
972*4882a593Smuzhiyun 	},
973*4882a593Smuzhiyun 	.probe = rk628_hdmirx_probe,
974*4882a593Smuzhiyun 	.remove = rk628_hdmirx_remove,
975*4882a593Smuzhiyun };
976*4882a593Smuzhiyun module_platform_driver(rk628_hdmirx_driver);
977*4882a593Smuzhiyun 
978*4882a593Smuzhiyun MODULE_AUTHOR("Algea Cao <algea.cao@rock-chips.com>");
979*4882a593Smuzhiyun MODULE_DESCRIPTION("Rockchip RK628 HDMI RX driver");
980*4882a593Smuzhiyun MODULE_LICENSE("GPL v2");
981