// SPDX-License-Identifier: GPL-2.0 /* * Copyright (c) 2020 Rockchip Electronics Co. Ltd. * * Author: Algea Cao */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #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, enum drm_bridge_attach_flags flags) { 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, flags); if (ret) { dev_err(dev, "failed to attach bridge\n"); return ret; } return 0; } static void rk628_hdmirx_bridge_mode_set(struct drm_bridge *bridge, const struct drm_display_mode *mode, const struct drm_display_mode *adj) { struct rk628_hdmirx *hdmirx = bridge_to_hdmirx(bridge); memcpy(&hdmirx->mode, adj, 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 "); MODULE_DESCRIPTION("Rockchip RK628 HDMI RX driver"); MODULE_LICENSE("GPL v2");