Lines Matching refs:hdmi
72 int (*configure)(struct dw_hdmi *hdmi,
120 void (*write)(struct dw_hdmi_qp *hdmi, u32 val, int offset);
121 u8 (*read)(struct dw_hdmi_qp *hdmi, int offset);
127 static inline void hdmi_writel(struct dw_hdmi_qp *hdmi, u32 val, int offset) in hdmi_writel() argument
129 writel(val, hdmi->regs + offset); in hdmi_writel()
132 static inline u32 hdmi_readl(struct dw_hdmi_qp *hdmi, int offset) in hdmi_readl() argument
134 return readl(hdmi->regs + offset); in hdmi_readl()
138 hdmi_modb(struct dw_hdmi_qp *hdmi, u32 data, u32 mask, unsigned int reg) in hdmi_modb() argument
140 u32 val = hdmi_readl(hdmi, reg) & ~mask; in hdmi_modb()
143 hdmi_writel(hdmi, val, reg); in hdmi_modb()
292 static void dw_hdmi_i2c_init(struct dw_hdmi_qp *hdmi) in dw_hdmi_i2c_init() argument
295 hdmi_writel(hdmi, 0x01, I2CM_CONTROL0); in dw_hdmi_i2c_init()
297 hdmi_writel(hdmi, 0x085c085c, I2CM_FM_SCL_CONFIG0); in dw_hdmi_i2c_init()
299 hdmi_modb(hdmi, 0, I2CM_FM_EN, I2CM_INTERFACE_CONTROL0); in dw_hdmi_i2c_init()
302 hdmi_writel(hdmi, I2CM_OP_DONE_CLEAR | I2CM_NACK_RCVD_CLEAR, in dw_hdmi_i2c_init()
306 static int dw_hdmi_i2c_read(struct dw_hdmi_qp *hdmi, in dw_hdmi_i2c_read() argument
309 struct dw_hdmi_i2c *i2c = hdmi->i2c; in dw_hdmi_i2c_read()
326 hdmi_modb(hdmi, i2c->slave_reg << 12, I2CM_ADDR, in dw_hdmi_i2c_read()
330 hdmi_modb(hdmi, I2CM_16BYTES, I2CM_NBYTES_MASK, in dw_hdmi_i2c_read()
335 hdmi_modb(hdmi, I2CM_1BYTES, I2CM_NBYTES_MASK, in dw_hdmi_i2c_read()
342 if (!hdmi->phy.ops->read_hpd(hdmi->rk_hdmi)) { in dw_hdmi_i2c_read()
349 hdmi_modb(hdmi, I2CM_EXT_READ, I2CM_WR_MASK, in dw_hdmi_i2c_read()
352 hdmi_modb(hdmi, I2CM_FM_READ, I2CM_WR_MASK, in dw_hdmi_i2c_read()
357 intr = hdmi_readl(hdmi, MAINUNIT_1_INT_STATUS); in dw_hdmi_i2c_read()
362 hdmi_writel(hdmi, intr, in dw_hdmi_i2c_read()
370 hdmi_writel(hdmi, 0x01, I2CM_CONTROL0); in dw_hdmi_i2c_read()
378 hdmi_writel(hdmi, 0x01, I2CM_CONTROL0); in dw_hdmi_i2c_read()
402 val = hdmi_readl(hdmi, reg); in dw_hdmi_i2c_read()
410 *buf++ = hdmi_readl(hdmi, I2CM_INTERFACE_RDDATA_0_3) & in dw_hdmi_i2c_read()
413 hdmi_readl(hdmi, I2CM_INTERFACE_RDDATA_0_3)); in dw_hdmi_i2c_read()
416 hdmi_modb(hdmi, 0, I2CM_WR_MASK, I2CM_INTERFACE_CONTROL0); in dw_hdmi_i2c_read()
423 static int dw_hdmi_i2c_write(struct dw_hdmi_qp *hdmi, in dw_hdmi_i2c_write() argument
426 struct dw_hdmi_i2c *i2c = hdmi->i2c; in dw_hdmi_i2c_write()
442 if (!hdmi->phy.ops->read_hpd(hdmi->rk_hdmi)) { in dw_hdmi_i2c_write()
448 hdmi_writel(hdmi, *buf++, I2CM_INTERFACE_WRDATA_0_3); in dw_hdmi_i2c_write()
449 hdmi_modb(hdmi, i2c->slave_reg++ << 12, I2CM_ADDR, in dw_hdmi_i2c_write()
451 hdmi_modb(hdmi, I2CM_FM_WRITE, I2CM_WR_MASK, in dw_hdmi_i2c_write()
456 intr = hdmi_readl(hdmi, MAINUNIT_1_INT_STATUS); in dw_hdmi_i2c_write()
461 hdmi_writel(hdmi, intr, in dw_hdmi_i2c_write()
469 hdmi_writel(hdmi, 0x01, I2CM_CONTROL0); in dw_hdmi_i2c_write()
477 hdmi_writel(hdmi, 0x01, I2CM_CONTROL0); in dw_hdmi_i2c_write()
485 hdmi_modb(hdmi, 0, I2CM_WR_MASK, I2CM_INTERFACE_CONTROL0); in dw_hdmi_i2c_write()
498 struct dw_hdmi_qp *hdmi = container_of(adap, struct dw_hdmi_qp, adap); in dw_hdmi_i2c_xfer() local
499 struct dw_hdmi_i2c *i2c = hdmi->i2c; in dw_hdmi_i2c_xfer()
514 hdmi_modb(hdmi, I2CM_NACK_RCVD_MASK_N | I2CM_OP_DONE_MASK_N, in dw_hdmi_i2c_xfer()
522 hdmi_modb(hdmi, addr << 5, I2CM_SLVADDR, I2CM_INTERFACE_CONTROL0); in dw_hdmi_i2c_xfer()
536 hdmi_modb(hdmi, DDC_SEGMENT_ADDR, I2CM_SEG_ADDR, in dw_hdmi_i2c_xfer()
538 hdmi_modb(hdmi, *msgs[i].buf << 7, I2CM_SEG_PTR, in dw_hdmi_i2c_xfer()
542 ret = dw_hdmi_i2c_read(hdmi, msgs[i].buf, in dw_hdmi_i2c_xfer()
545 ret = dw_hdmi_i2c_write(hdmi, msgs[i].buf, in dw_hdmi_i2c_xfer()
556 hdmi_modb(hdmi, 0, I2CM_OP_DONE_MASK_N | I2CM_NACK_RCVD_MASK_N, in dw_hdmi_i2c_xfer()
562 static int dw_hdmi_detect_phy(struct dw_hdmi_qp *hdmi) in dw_hdmi_detect_phy() argument
565 if (!hdmi->plat_data->qp_phy_ops || !hdmi->plat_data->phy_name) { in dw_hdmi_detect_phy()
566 dev_err(hdmi->dev, in dw_hdmi_detect_phy()
571 hdmi->phy.ops = hdmi->plat_data->qp_phy_ops; in dw_hdmi_detect_phy()
572 hdmi->phy.data = hdmi->plat_data->phy_data; in dw_hdmi_detect_phy()
573 hdmi->phy.name = hdmi->plat_data->phy_name; in dw_hdmi_detect_phy()
579 hdmi_get_tmdsclock(struct dw_hdmi_qp *hdmi, unsigned long mpixelclock) in hdmi_get_tmdsclock() argument
583 hdmi_bus_fmt_color_depth(hdmi->hdmi_data.enc_out_bus_format); in hdmi_get_tmdsclock()
585 if (!hdmi_bus_fmt_is_yuv422(hdmi->hdmi_data.enc_out_bus_format)) { in hdmi_get_tmdsclock()
617 static bool is_hdmi2_sink(struct dw_hdmi_qp *hdmi) in is_hdmi2_sink() argument
619 return hdmi->edid_data.display_info.hdmi.scdc.supported || in is_hdmi2_sink()
620 hdmi->edid_data.display_info.color_formats & DRM_COLOR_FORMAT_YCRCB420; in is_hdmi2_sink()
623 static void hdmi_config_AVI(struct dw_hdmi_qp *hdmi, struct drm_display_mode *mode) in hdmi_config_AVI() argument
630 hdmi->hdmi_data.quant_range; in hdmi_config_AVI()
632 if (hdmi_bus_fmt_is_yuv420(hdmi->hdmi_data.enc_out_bus_format) || in hdmi_config_AVI()
633 hdmi->edid_data.display_info.hdmi.scdc.supported) in hdmi_config_AVI()
644 if (hdmi_bus_fmt_is_yuv444(hdmi->hdmi_data.enc_out_bus_format)) in hdmi_config_AVI()
646 else if (hdmi_bus_fmt_is_yuv422(hdmi->hdmi_data.enc_out_bus_format)) in hdmi_config_AVI()
648 else if (hdmi_bus_fmt_is_yuv420(hdmi->hdmi_data.enc_out_bus_format)) in hdmi_config_AVI()
654 if (!hdmi_bus_fmt_is_rgb(hdmi->hdmi_data.enc_out_bus_format)) { in hdmi_config_AVI()
655 switch (hdmi->hdmi_data.enc_out_encoding) { in hdmi_config_AVI()
657 if (hdmi->hdmi_data.enc_in_encoding == V4L2_YCBCR_ENC_XV601) in hdmi_config_AVI()
665 if (hdmi->hdmi_data.enc_in_encoding == V4L2_YCBCR_ENC_XV709) in hdmi_config_AVI()
673 if (hdmi->hdmi_data.enc_in_encoding == V4L2_YCBCR_ENC_BT2020) in hdmi_config_AVI()
689 if (hdmi->hdmi_data.enc_out_encoding == V4L2_YCBCR_ENC_BT2020) { in hdmi_config_AVI()
699 if (is_hdmi2_sink(hdmi) && in hdmi_config_AVI()
711 if (hdmi->vic >= 128) { in hdmi_config_AVI()
716 buff[7] = hdmi->vic; in hdmi_config_AVI()
727 hdmi_writel(hdmi, val, PKT_AVI_CONTENTS0); in hdmi_config_AVI()
738 hdmi_writel(hdmi, val, PKT_AVI_CONTENTS1 + i * 4); in hdmi_config_AVI()
741 hdmi_modb(hdmi, 0, PKTSCHED_AVI_FIELDRATE, PKTSCHED_PKT_CONFIG1); in hdmi_config_AVI()
743 hdmi_modb(hdmi, PKTSCHED_AVI_TX_EN, PKTSCHED_AVI_TX_EN, in hdmi_config_AVI()
753 static void hdmi_config_vendor_specific_infoframe(struct dw_hdmi_qp *hdmi, in hdmi_config_vendor_specific_infoframe() argument
763 link_cfg = dw_hdmi_rockchip_get_link_cfg(hdmi->rk_hdmi); in hdmi_config_vendor_specific_infoframe()
765 hdmi_modb(hdmi, 0, PKTSCHED_VSI_TX_EN, PKTSCHED_PKT_EN); in hdmi_config_vendor_specific_infoframe()
768 hdmi_writel(hdmi, 0, PKT_VSI_CONTENTS0 + i * 4); in hdmi_config_vendor_specific_infoframe()
796 dev_err(hdmi->dev, "Failed to pack vendor infoframe: %zd\n", in hdmi_config_vendor_specific_infoframe()
804 hdmi_writel(hdmi, val, PKT_VSI_CONTENTS0); in hdmi_config_vendor_specific_infoframe()
818 hdmi_writel(hdmi, val, reg); in hdmi_config_vendor_specific_infoframe()
823 hdmi_writel(hdmi, 0, PKT_VSI_CONTENTS7); in hdmi_config_vendor_specific_infoframe()
825 hdmi_modb(hdmi, 0, PKTSCHED_VSI_FIELDRATE, PKTSCHED_PKT_CONFIG1); in hdmi_config_vendor_specific_infoframe()
826 hdmi_modb(hdmi, PKTSCHED_VSI_TX_EN, PKTSCHED_VSI_TX_EN, in hdmi_config_vendor_specific_infoframe()
830 static void hdmi_config_CVTEM(struct dw_hdmi_qp *hdmi, in hdmi_config_CVTEM() argument
843 struct drm_display_mode *mode = &hdmi->previous_mode; in hdmi_config_CVTEM()
846 hdmi_modb(hdmi, 0, PKTSCHED_EMP_CVTEM_TX_EN, PKTSCHED_PKT_EN); in hdmi_config_CVTEM()
861 hdmi_writel(hdmi, val, PKT0_EMP_CVTEM_CONTENTS0 + i * 0x20); in hdmi_config_CVTEM()
866 hdmi_writel(hdmi, val, PKT0_EMP_CVTEM_CONTENTS1); in hdmi_config_CVTEM()
869 hdmi_writel(hdmi, val, PKT0_EMP_CVTEM_CONTENTS2); in hdmi_config_CVTEM()
890 hdmi_writel(hdmi, val, reg); in hdmi_config_CVTEM()
897 hdmi_writel(hdmi, val, PKT4_EMP_CVTEM_CONTENTS6); in hdmi_config_CVTEM()
901 hdmi_writel(hdmi, val, PKT4_EMP_CVTEM_CONTENTS7); in hdmi_config_CVTEM()
904 hdmi_writel(hdmi, val, PKT5_EMP_CVTEM_CONTENTS1); in hdmi_config_CVTEM()
907 hdmi_writel(hdmi, 0, i); in hdmi_config_CVTEM()
909 hdmi_modb(hdmi, PKTSCHED_EMP_CVTEM_TX_EN, PKTSCHED_EMP_CVTEM_TX_EN, in hdmi_config_CVTEM()
933 static int hdmi_start_flt(struct dw_hdmi_qp *hdmi, u8 rate) in hdmi_start_flt() argument
941 hdmi_modb(hdmi, AVP_DATAPATH_VIDEO_SWDISABLE, in hdmi_start_flt()
944 hdmi_writel(hdmi, AVP_DATAPATH_SWINIT_P, GLOBAL_SWRESET_REQUEST); in hdmi_start_flt()
947 drm_scdc_writeb(&hdmi->adap, 0x10, 0xff); in hdmi_start_flt()
951 drm_scdc_readb(&hdmi->adap, SCDC_STATUS_FLAGS_0, &val); in hdmi_start_flt()
964 drm_scdc_writeb(&hdmi->adap, 0x31, val); in hdmi_start_flt()
966 hdmi_writel(hdmi, ffe_lv, FLT_CONFIG0); in hdmi_start_flt()
971 drm_scdc_readb(&hdmi->adap, 0x10, &val); in hdmi_start_flt()
979 drm_scdc_readb(&hdmi->adap, 0x41, ®_val); in hdmi_start_flt()
983 drm_scdc_readb(&hdmi->adap, 0x42, ®_val); in hdmi_start_flt()
990 hdmi_writel(hdmi, 0, FLT_CONFIG1); in hdmi_start_flt()
999 hdmi_writel(hdmi, value, FLT_CONFIG1); in hdmi_start_flt()
1003 drm_scdc_writeb(&hdmi->adap, 0x10, val); in hdmi_start_flt()
1006 hdmi_modb(hdmi, 0, AVP_DATAPATH_VIDEO_SWDISABLE, GLOBAL_SWDISABLE); in hdmi_start_flt()
1022 static void hdmi_set_op_mode(struct dw_hdmi_qp *hdmi, in hdmi_set_op_mode() argument
1032 hdmi_modb(hdmi, 0, OPMODE_FRL, LINK_CONFIG0); in hdmi_set_op_mode()
1033 hdmi_modb(hdmi, 0, OPMODE_FRL_4LANES, LINK_CONFIG0); in hdmi_set_op_mode()
1034 hdmi->phy.ops->init(conn, hdmi->rk_hdmi, state); in hdmi_set_op_mode()
1035 hdmi->phy.enabled = true; in hdmi_set_op_mode()
1040 hdmi_modb(hdmi, OPMODE_FRL_4LANES, OPMODE_FRL_4LANES, in hdmi_set_op_mode()
1043 hdmi_modb(hdmi, 0, OPMODE_FRL_4LANES, LINK_CONFIG0); in hdmi_set_op_mode()
1045 hdmi_modb(hdmi, 1, OPMODE_FRL, LINK_CONFIG0); in hdmi_set_op_mode()
1048 hdmi->phy.ops->init(conn, hdmi->rk_hdmi, state); in hdmi_set_op_mode()
1049 hdmi->phy.enabled = true; in hdmi_set_op_mode()
1052 ret = hdmi_start_flt(hdmi, frl_rate); in hdmi_set_op_mode()
1054 hdmi_writel(hdmi, 0, FLT_CONFIG0); in hdmi_set_op_mode()
1055 drm_scdc_writeb(&hdmi->adap, 0x31, 0); in hdmi_set_op_mode()
1056 hdmi_modb(hdmi, 0, AVP_DATAPATH_VIDEO_SWDISABLE, GLOBAL_SWDISABLE); in hdmi_set_op_mode()
1061 hdmi_modb(hdmi, PKTSCHED_NULL_TX_EN, PKTSCHED_NULL_TX_EN, PKTSCHED_PKT_EN); in hdmi_set_op_mode()
1063 hdmi_modb(hdmi, 0, PKTSCHED_NULL_TX_EN, PKTSCHED_PKT_EN); in hdmi_set_op_mode()
1068 static int dw_hdmi_setup(struct dw_hdmi_qp *hdmi, in dw_hdmi_setup() argument
1074 void *data = hdmi->plat_data->phy_data; in dw_hdmi_setup()
1076 struct drm_hdmi_info *hdmi_info = &hdmi->edid_data.display_info.hdmi; in dw_hdmi_setup()
1077 struct hdmi_vmode *vmode = &hdmi->hdmi_data.video_mode; in dw_hdmi_setup()
1080 if (!hdmi->vic) in dw_hdmi_setup()
1083 printf("CEA mode used vic=%d\n", hdmi->vic); in dw_hdmi_setup()
1086 vmode->mtmdsclock = hdmi_get_tmdsclock(hdmi, vmode->mpixelclock); in dw_hdmi_setup()
1087 if (hdmi_bus_fmt_is_yuv420(hdmi->hdmi_data.enc_out_bus_format)) in dw_hdmi_setup()
1091 if (hdmi->plat_data->get_enc_out_encoding) in dw_hdmi_setup()
1092 hdmi->hdmi_data.enc_out_encoding = in dw_hdmi_setup()
1093 hdmi->plat_data->get_enc_out_encoding(data); in dw_hdmi_setup()
1094 else if (hdmi->vic == 6 || hdmi->vic == 7 || in dw_hdmi_setup()
1095 hdmi->vic == 21 || hdmi->vic == 22 || in dw_hdmi_setup()
1096 hdmi->vic == 2 || hdmi->vic == 3 || in dw_hdmi_setup()
1097 hdmi->vic == 17 || hdmi->vic == 18) in dw_hdmi_setup()
1098 hdmi->hdmi_data.enc_out_encoding = V4L2_YCBCR_ENC_601; in dw_hdmi_setup()
1100 hdmi->hdmi_data.enc_out_encoding = V4L2_YCBCR_ENC_709; in dw_hdmi_setup()
1103 hdmi->hdmi_data.video_mode.mpixelrepetitionoutput = 1; in dw_hdmi_setup()
1104 hdmi->hdmi_data.video_mode.mpixelrepetitioninput = 1; in dw_hdmi_setup()
1106 hdmi->hdmi_data.video_mode.mpixelrepetitionoutput = 0; in dw_hdmi_setup()
1107 hdmi->hdmi_data.video_mode.mpixelrepetitioninput = 0; in dw_hdmi_setup()
1111 if (hdmi->plat_data->get_enc_in_encoding) in dw_hdmi_setup()
1112 hdmi->hdmi_data.enc_in_encoding = in dw_hdmi_setup()
1113 hdmi->plat_data->get_enc_in_encoding(data); in dw_hdmi_setup()
1114 else if (hdmi->plat_data->input_bus_encoding) in dw_hdmi_setup()
1115 hdmi->hdmi_data.enc_in_encoding = in dw_hdmi_setup()
1116 hdmi->plat_data->input_bus_encoding; in dw_hdmi_setup()
1118 hdmi->hdmi_data.enc_in_encoding = V4L2_YCBCR_ENC_DEFAULT; in dw_hdmi_setup()
1120 if (hdmi->plat_data->get_quant_range) in dw_hdmi_setup()
1121 hdmi->hdmi_data.quant_range = in dw_hdmi_setup()
1122 hdmi->plat_data->get_quant_range(data); in dw_hdmi_setup()
1124 hdmi->hdmi_data.quant_range = HDMI_QUANTIZATION_RANGE_DEFAULT; in dw_hdmi_setup()
1132 hdmi->hdmi_data.pix_repet_factor = in dw_hdmi_setup()
1134 hdmi->hdmi_data.video_mode.mdataenablepolarity = true; in dw_hdmi_setup()
1137 hdmi->phy.ops->set_pll(conn, hdmi->rk_hdmi, state); in dw_hdmi_setup()
1140 if (hdmi->hdmi_data.enc_out_bus_format == MEDIA_BUS_FMT_YUYV10_1X20) in dw_hdmi_setup()
1141 hdmi_writel(hdmi, BIT(20), VIDEO_INTERFACE_CONFIG0); in dw_hdmi_setup()
1142 dw_hdmi_qp_set_grf_cfg(hdmi->rk_hdmi); in dw_hdmi_setup()
1143 link_cfg = dw_hdmi_rockchip_get_link_cfg(hdmi->rk_hdmi); in dw_hdmi_setup()
1146 if (hdmi->sink_is_hdmi) { in dw_hdmi_setup()
1148 hdmi_modb(hdmi, 0, OPMODE_DVI, LINK_CONFIG0); in dw_hdmi_setup()
1149 hdmi_modb(hdmi, HDCP2_BYPASS, HDCP2_BYPASS, HDCP2LOGIC_CONFIG0); in dw_hdmi_setup()
1150 hdmi_modb(hdmi, KEEPOUT_REKEY_ALWAYS, KEEPOUT_REKEY_CFG, FRAME_COMPOSER_CONFIG9); in dw_hdmi_setup()
1151 hdmi_writel(hdmi, 0, FLT_CONFIG0); in dw_hdmi_setup()
1153 drm_scdc_writeb(&hdmi->adap, 0x31, 0); in dw_hdmi_setup()
1156 drm_scdc_readb(&hdmi->adap, SCDC_SINK_VERSION, &bytes); in dw_hdmi_setup()
1157 drm_scdc_writeb(&hdmi->adap, SCDC_SOURCE_VERSION, in dw_hdmi_setup()
1159 drm_scdc_set_high_tmds_clock_ratio(&hdmi->adap, 1); in dw_hdmi_setup()
1160 drm_scdc_set_scrambling(&hdmi->adap, 1); in dw_hdmi_setup()
1161 hdmi_writel(hdmi, 1, SCRAMB_CONFIG0); in dw_hdmi_setup()
1165 drm_scdc_set_high_tmds_clock_ratio(&hdmi->adap, 0); in dw_hdmi_setup()
1166 drm_scdc_set_scrambling(&hdmi->adap, 0); in dw_hdmi_setup()
1168 hdmi_writel(hdmi, 0, SCRAMB_CONFIG0); in dw_hdmi_setup()
1172 hdmi_config_AVI(hdmi, mode); in dw_hdmi_setup()
1173 hdmi_config_vendor_specific_infoframe(hdmi, mode); in dw_hdmi_setup()
1174 hdmi_config_CVTEM(hdmi, link_cfg); in dw_hdmi_setup()
1175 hdmi_set_op_mode(hdmi, link_cfg, state, conn); in dw_hdmi_setup()
1178 hdmi_writel(hdmi, 2, PKTSCHED_PKT_CONTROL0); in dw_hdmi_setup()
1179 hdmi_modb(hdmi, PKTSCHED_GCP_TX_EN, PKTSCHED_GCP_TX_EN, in dw_hdmi_setup()
1182 hdmi_modb(hdmi, OPMODE_DVI, OPMODE_DVI, LINK_CONFIG0); in dw_hdmi_setup()
1183 ret = hdmi->phy.ops->init(conn, hdmi->rk_hdmi, state); in dw_hdmi_setup()
1186 hdmi->phy.enabled = true; in dw_hdmi_setup()
1191 hdmi_writel(hdmi, BIT(21), VIDEO_INTERFACE_CONFIG0); in dw_hdmi_setup()
1196 int dw_hdmi_detect_hotplug(struct dw_hdmi_qp *hdmi, in dw_hdmi_detect_hotplug() argument
1203 ret = hdmi->phy.ops->read_hpd(hdmi->rk_hdmi); in dw_hdmi_detect_hotplug()
1210 if (!hdmi->id) in dw_hdmi_detect_hotplug()
1225 struct dw_hdmi_qp *hdmi; in rockchip_dw_hdmi_qp_init() local
1230 hdmi = malloc(sizeof(struct dw_hdmi_qp)); in rockchip_dw_hdmi_qp_init()
1231 if (!hdmi) in rockchip_dw_hdmi_qp_init()
1234 memset(hdmi, 0, sizeof(struct dw_hdmi_qp)); in rockchip_dw_hdmi_qp_init()
1239 hdmi->rk_hdmi = rk_hdmi; in rockchip_dw_hdmi_qp_init()
1240 hdmi->id = of_alias_get_id(ofnode_to_np(hdmi_node), "hdmi"); in rockchip_dw_hdmi_qp_init()
1241 if (hdmi->id < 0) in rockchip_dw_hdmi_qp_init()
1242 hdmi->id = 0; in rockchip_dw_hdmi_qp_init()
1243 conn_state->disp_info = rockchip_get_disp_info(conn_state->type, hdmi->id); in rockchip_dw_hdmi_qp_init()
1247 hdmi->regs = dev_read_addr_ptr(conn->dev); in rockchip_dw_hdmi_qp_init()
1252 &hdmi->adap.i2c_bus); in rockchip_dw_hdmi_qp_init()
1253 if (hdmi->adap.i2c_bus) in rockchip_dw_hdmi_qp_init()
1254 hdmi->adap.ops = i2c_get_ops(hdmi->adap.i2c_bus); in rockchip_dw_hdmi_qp_init()
1257 hdmi->i2c = malloc(sizeof(struct dw_hdmi_i2c)); in rockchip_dw_hdmi_qp_init()
1258 if (!hdmi->i2c) in rockchip_dw_hdmi_qp_init()
1260 hdmi->adap.ddc_xfer = dw_hdmi_i2c_xfer; in rockchip_dw_hdmi_qp_init()
1266 hdmi->i2c->scl_high_ns = in rockchip_dw_hdmi_qp_init()
1269 hdmi->i2c->scl_low_ns = in rockchip_dw_hdmi_qp_init()
1273 dw_hdmi_i2c_init(hdmi); in rockchip_dw_hdmi_qp_init()
1276 hdmi->dev_type = pdata->dev_type; in rockchip_dw_hdmi_qp_init()
1277 hdmi->plat_data = pdata; in rockchip_dw_hdmi_qp_init()
1278 hdmi->edid_data.mode_buf = mode_buf; in rockchip_dw_hdmi_qp_init()
1280 conn->data = hdmi; in rockchip_dw_hdmi_qp_init()
1282 dw_hdmi_detect_phy(hdmi); in rockchip_dw_hdmi_qp_init()
1283 hdmi_writel(hdmi, 0, MAINUNIT_0_INT_MASK_N); in rockchip_dw_hdmi_qp_init()
1284 hdmi_writel(hdmi, 0, MAINUNIT_1_INT_MASK_N); in rockchip_dw_hdmi_qp_init()
1285 hdmi_writel(hdmi, 428571429, TIMER_BASE_CONFIG0); in rockchip_dw_hdmi_qp_init()
1287 dw_hdmi_qp_io_path_init(hdmi->rk_hdmi); in rockchip_dw_hdmi_qp_init()
1294 struct dw_hdmi_qp *hdmi = conn->data; in rockchip_dw_hdmi_qp_deinit() local
1296 if (hdmi->i2c) in rockchip_dw_hdmi_qp_deinit()
1297 free(hdmi->i2c); in rockchip_dw_hdmi_qp_deinit()
1298 if (hdmi->edid_data.mode_buf) in rockchip_dw_hdmi_qp_deinit()
1299 free(hdmi->edid_data.mode_buf); in rockchip_dw_hdmi_qp_deinit()
1300 if (hdmi) in rockchip_dw_hdmi_qp_deinit()
1301 free(hdmi); in rockchip_dw_hdmi_qp_deinit()
1309 struct dw_hdmi_qp *hdmi = conn->data; in rockchip_dw_hdmi_qp_config_output() local
1314 dw_hdmi_qp_select_output(&hdmi->edid_data, conn, &bus_format, in rockchip_dw_hdmi_qp_config_output()
1315 overscan, hdmi->dev_type, in rockchip_dw_hdmi_qp_config_output()
1316 hdmi->output_bus_format_rgb, hdmi->rk_hdmi, in rockchip_dw_hdmi_qp_config_output()
1319 *mode = *hdmi->edid_data.preferred_mode; in rockchip_dw_hdmi_qp_config_output()
1320 hdmi->vic = drm_match_cea_mode(mode); in rockchip_dw_hdmi_qp_config_output()
1324 hdmi->hdmi_data.enc_in_bus_format = bus_format; in rockchip_dw_hdmi_qp_config_output()
1325 hdmi->hdmi_data.enc_out_bus_format = bus_format; in rockchip_dw_hdmi_qp_config_output()
1330 hdmi->hdmi_data.enc_in_bus_format = in rockchip_dw_hdmi_qp_config_output()
1336 hdmi->hdmi_data.enc_in_bus_format = in rockchip_dw_hdmi_qp_config_output()
1346 if (hdmi->vic == 6 || hdmi->vic == 7 || hdmi->vic == 21 || in rockchip_dw_hdmi_qp_config_output()
1347 hdmi->vic == 22 || hdmi->vic == 2 || hdmi->vic == 3 || in rockchip_dw_hdmi_qp_config_output()
1348 hdmi->vic == 17 || hdmi->vic == 18) in rockchip_dw_hdmi_qp_config_output()
1365 conn_state->color_range = hdmi->hdmi_data.quant_range == in rockchip_dw_hdmi_qp_config_output()
1370 conn_state->color_range = hdmi->hdmi_data.quant_range == in rockchip_dw_hdmi_qp_config_output()
1380 struct dw_hdmi_qp *hdmi = conn->data; in rockchip_dw_hdmi_qp_prepare() local
1382 if (!hdmi->edid_data.preferred_mode && conn->bridge) { in rockchip_dw_hdmi_qp_prepare()
1383 drm_add_hdmi_modes(&hdmi->edid_data, mode); in rockchip_dw_hdmi_qp_prepare()
1384 drm_mode_sort(&hdmi->edid_data); in rockchip_dw_hdmi_qp_prepare()
1385 hdmi->sink_is_hdmi = true; in rockchip_dw_hdmi_qp_prepare()
1386 hdmi->sink_has_audio = true; in rockchip_dw_hdmi_qp_prepare()
1397 struct dw_hdmi_qp *hdmi = conn->data; in rockchip_dw_hdmi_qp_check() local
1401 hdmi_writel(hdmi, 0, I2CM_INTERFACE_CONTROL0); in rockchip_dw_hdmi_qp_check()
1406 static void dw_hdmi_disable(struct rockchip_connector *conn, struct dw_hdmi_qp *hdmi, in dw_hdmi_disable() argument
1409 if (hdmi->phy.enabled) { in dw_hdmi_disable()
1410 hdmi->phy.ops->disable(conn, hdmi->rk_hdmi, state); in dw_hdmi_disable()
1411 hdmi->phy.enabled = false; in dw_hdmi_disable()
1419 struct dw_hdmi_qp *hdmi = conn->data; in rockchip_dw_hdmi_qp_enable() local
1421 if (!hdmi) in rockchip_dw_hdmi_qp_enable()
1425 memcpy(&hdmi->previous_mode, mode, sizeof(hdmi->previous_mode)); in rockchip_dw_hdmi_qp_enable()
1427 dw_hdmi_setup(hdmi, conn, mode, state); in rockchip_dw_hdmi_qp_enable()
1434 struct dw_hdmi_qp *hdmi = conn->data; in rockchip_dw_hdmi_qp_disable() local
1436 dw_hdmi_disable(conn, hdmi, state); in rockchip_dw_hdmi_qp_disable()
1440 static void rockchip_dw_hdmi_qp_mode_valid(struct dw_hdmi_qp *hdmi) in rockchip_dw_hdmi_qp_mode_valid() argument
1442 struct hdmi_edid_data *edid_data = &hdmi->edid_data; in rockchip_dw_hdmi_qp_mode_valid()
1444 bool enable_gpio = dw_hdmi_qp_check_enable_gpio(hdmi->rk_hdmi); in rockchip_dw_hdmi_qp_mode_valid()
1463 struct dw_hdmi_qp *hdmi = conn->data; in _rockchip_dw_hdmi_qp_get_timing() local
1468 if (!hdmi) in _rockchip_dw_hdmi_qp_get_timing()
1472 hdmi->sink_is_hdmi = in _rockchip_dw_hdmi_qp_get_timing()
1474 hdmi->sink_has_audio = drm_detect_monitor_audio(edid); in _rockchip_dw_hdmi_qp_get_timing()
1475 ret = drm_add_edid_modes(&hdmi->edid_data, conn_state->edid); in _rockchip_dw_hdmi_qp_get_timing()
1478 hdmi->sink_is_hdmi = true; in _rockchip_dw_hdmi_qp_get_timing()
1479 hdmi->sink_has_audio = true; in _rockchip_dw_hdmi_qp_get_timing()
1480 do_cea_modes(&hdmi->edid_data, def_modes_vic, in _rockchip_dw_hdmi_qp_get_timing()
1482 hdmi->edid_data.preferred_mode = &hdmi->edid_data.mode_buf[0]; in _rockchip_dw_hdmi_qp_get_timing()
1485 drm_rk_filter_whitelist(&hdmi->edid_data); in _rockchip_dw_hdmi_qp_get_timing()
1486 rockchip_dw_hdmi_qp_mode_valid(hdmi); in _rockchip_dw_hdmi_qp_get_timing()
1487 drm_mode_max_resolution_filter(&hdmi->edid_data, in _rockchip_dw_hdmi_qp_get_timing()
1489 if (!drm_mode_prune_invalid(&hdmi->edid_data)) { in _rockchip_dw_hdmi_qp_get_timing()
1494 for (i = 0; i < hdmi->edid_data.modes; i++) in _rockchip_dw_hdmi_qp_get_timing()
1495 hdmi->edid_data.mode_buf[i].vrefresh = in _rockchip_dw_hdmi_qp_get_timing()
1496 drm_mode_vrefresh(&hdmi->edid_data.mode_buf[i]); in _rockchip_dw_hdmi_qp_get_timing()
1498 drm_mode_sort(&hdmi->edid_data); in _rockchip_dw_hdmi_qp_get_timing()
1508 struct dw_hdmi_qp *hdmi = conn->data; in rockchip_dw_hdmi_qp_get_timing() local
1510 conn_state->edid = drm_do_get_edid(&hdmi->adap); in rockchip_dw_hdmi_qp_get_timing()
1522 struct dw_hdmi_qp *hdmi = conn->data; in rockchip_dw_hdmi_qp_detect() local
1524 if (!hdmi) in rockchip_dw_hdmi_qp_detect()
1527 ret = dw_hdmi_detect_hotplug(hdmi, state); in rockchip_dw_hdmi_qp_detect()
1536 struct dw_hdmi_qp *hdmi = conn->data; in rockchip_dw_hdmi_qp_get_edid() local
1538 conn_state->edid = drm_do_get_edid(&hdmi->adap); in rockchip_dw_hdmi_qp_get_edid()