Lines Matching full:hdmi

17 #include <linux/hdmi.h>
41 /* DW-HDMI Controller >= 0x200a are at least compliant with SCDC version 1 */
70 int (*configure)(struct dw_hdmi *hdmi,
118 void (*write)(struct dw_hdmi_qp *hdmi, u32 val, int offset);
119 u8 (*read)(struct dw_hdmi_qp *hdmi, int offset);
125 static inline void hdmi_writel(struct dw_hdmi_qp *hdmi, u32 val, int offset) in hdmi_writel() argument
127 writel(val, hdmi->regs + offset); in hdmi_writel()
130 static inline u32 hdmi_readl(struct dw_hdmi_qp *hdmi, int offset) in hdmi_readl() argument
132 return readl(hdmi->regs + offset); in hdmi_readl()
136 hdmi_modb(struct dw_hdmi_qp *hdmi, u32 data, u32 mask, unsigned int reg) in hdmi_modb() argument
138 u32 val = hdmi_readl(hdmi, reg) & ~mask; in hdmi_modb()
141 hdmi_writel(hdmi, val, reg); in hdmi_modb()
290 static void dw_hdmi_i2c_init(struct dw_hdmi_qp *hdmi) in dw_hdmi_i2c_init() argument
293 hdmi_writel(hdmi, 0x01, I2CM_CONTROL0); in dw_hdmi_i2c_init()
295 hdmi_writel(hdmi, 0x085c085c, I2CM_FM_SCL_CONFIG0); in dw_hdmi_i2c_init()
297 hdmi_modb(hdmi, 0, I2CM_FM_EN, I2CM_INTERFACE_CONTROL0); in dw_hdmi_i2c_init()
300 hdmi_writel(hdmi, I2CM_OP_DONE_CLEAR | I2CM_NACK_RCVD_CLEAR, in dw_hdmi_i2c_init()
304 static int dw_hdmi_i2c_read(struct dw_hdmi_qp *hdmi, in dw_hdmi_i2c_read() argument
307 struct dw_hdmi_i2c *i2c = hdmi->i2c; in dw_hdmi_i2c_read()
318 hdmi_modb(hdmi, i2c->slave_reg++ << 12, I2CM_ADDR, in dw_hdmi_i2c_read()
321 hdmi_modb(hdmi, I2CM_FM_READ, I2CM_WR_MASK, in dw_hdmi_i2c_read()
326 intr = hdmi_readl(hdmi, MAINUNIT_1_INT_STATUS) & in dw_hdmi_i2c_read()
330 hdmi_writel(hdmi, intr, MAINUNIT_1_INT_CLEAR); in dw_hdmi_i2c_read()
337 hdmi_writel(hdmi, 0x01, I2CM_CONTROL0); in dw_hdmi_i2c_read()
344 hdmi_writel(hdmi, 0x01, I2CM_CONTROL0); in dw_hdmi_i2c_read()
348 *buf++ = hdmi_readl(hdmi, I2CM_INTERFACE_RDDATA_0_3) & 0xff; in dw_hdmi_i2c_read()
349 hdmi_modb(hdmi, 0, I2CM_WR_MASK, I2CM_INTERFACE_CONTROL0); in dw_hdmi_i2c_read()
357 static int dw_hdmi_i2c_write(struct dw_hdmi_qp *hdmi, in dw_hdmi_i2c_write() argument
360 struct dw_hdmi_i2c *i2c = hdmi->i2c; in dw_hdmi_i2c_write()
373 hdmi_writel(hdmi, *buf++, I2CM_INTERFACE_WRDATA_0_3); in dw_hdmi_i2c_write()
374 hdmi_modb(hdmi, i2c->slave_reg++ << 12, I2CM_ADDR, in dw_hdmi_i2c_write()
376 hdmi_modb(hdmi, I2CM_FM_WRITE, I2CM_WR_MASK, in dw_hdmi_i2c_write()
381 intr = hdmi_readl(hdmi, MAINUNIT_1_INT_STATUS) & in dw_hdmi_i2c_write()
385 hdmi_writel(hdmi, intr, MAINUNIT_1_INT_CLEAR); in dw_hdmi_i2c_write()
392 hdmi_writel(hdmi, 0x01, I2CM_CONTROL0); in dw_hdmi_i2c_write()
399 hdmi_writel(hdmi, 0x01, I2CM_CONTROL0); in dw_hdmi_i2c_write()
402 hdmi_modb(hdmi, 0, I2CM_WR_MASK, I2CM_INTERFACE_CONTROL0); in dw_hdmi_i2c_write()
412 struct dw_hdmi_qp *hdmi = container_of(adap, struct dw_hdmi_qp, adap); in dw_hdmi_i2c_xfer() local
413 struct dw_hdmi_i2c *i2c = hdmi->i2c; in dw_hdmi_i2c_xfer()
428 hdmi_modb(hdmi, I2CM_NACK_RCVD_MASK_N | I2CM_OP_DONE_MASK_N, in dw_hdmi_i2c_xfer()
436 hdmi_modb(hdmi, addr << 5, I2CM_SLVADDR, I2CM_INTERFACE_CONTROL0); in dw_hdmi_i2c_xfer()
450 hdmi_modb(hdmi, DDC_SEGMENT_ADDR, I2CM_SEG_ADDR, in dw_hdmi_i2c_xfer()
452 hdmi_modb(hdmi, *msgs[i].buf, I2CM_SEG_PTR, in dw_hdmi_i2c_xfer()
456 ret = dw_hdmi_i2c_read(hdmi, msgs[i].buf, in dw_hdmi_i2c_xfer()
459 ret = dw_hdmi_i2c_write(hdmi, msgs[i].buf, in dw_hdmi_i2c_xfer()
470 hdmi_modb(hdmi, 0, I2CM_OP_DONE_MASK_N | I2CM_NACK_RCVD_MASK_N, in dw_hdmi_i2c_xfer()
476 static int dw_hdmi_detect_phy(struct dw_hdmi_qp *hdmi) in dw_hdmi_detect_phy() argument
479 if (!hdmi->plat_data->qp_phy_ops || !hdmi->plat_data->phy_name) { in dw_hdmi_detect_phy()
480 dev_err(hdmi->dev, in dw_hdmi_detect_phy()
481 "Vendor HDMI PHY not supported by glue layer\n"); in dw_hdmi_detect_phy()
485 hdmi->phy.ops = hdmi->plat_data->qp_phy_ops; in dw_hdmi_detect_phy()
486 hdmi->phy.data = hdmi->plat_data->phy_data; in dw_hdmi_detect_phy()
487 hdmi->phy.name = hdmi->plat_data->phy_name; in dw_hdmi_detect_phy()
493 hdmi_get_tmdsclock(struct dw_hdmi_qp *hdmi, unsigned long mpixelclock) in hdmi_get_tmdsclock() argument
497 hdmi_bus_fmt_color_depth(hdmi->hdmi_data.enc_out_bus_format); in hdmi_get_tmdsclock()
499 if (!hdmi_bus_fmt_is_yuv422(hdmi->hdmi_data.enc_out_bus_format)) { in hdmi_get_tmdsclock()
531 static bool is_hdmi2_sink(struct dw_hdmi_qp *hdmi) in is_hdmi2_sink() argument
533 return hdmi->edid_data.display_info.hdmi.scdc.supported || in is_hdmi2_sink()
534 hdmi->edid_data.display_info.color_formats & DRM_COLOR_FORMAT_YCRCB420; in is_hdmi2_sink()
537 static void hdmi_config_AVI(struct dw_hdmi_qp *hdmi, struct drm_display_mode *mode) in hdmi_config_AVI() argument
544 hdmi->hdmi_data.quant_range; in hdmi_config_AVI()
546 if (hdmi_bus_fmt_is_yuv420(hdmi->hdmi_data.enc_out_bus_format) || in hdmi_config_AVI()
547 hdmi->edid_data.display_info.hdmi.scdc.supported) in hdmi_config_AVI()
558 if (hdmi_bus_fmt_is_yuv444(hdmi->hdmi_data.enc_out_bus_format)) in hdmi_config_AVI()
560 else if (hdmi_bus_fmt_is_yuv422(hdmi->hdmi_data.enc_out_bus_format)) in hdmi_config_AVI()
562 else if (hdmi_bus_fmt_is_yuv420(hdmi->hdmi_data.enc_out_bus_format)) in hdmi_config_AVI()
568 if (!hdmi_bus_fmt_is_rgb(hdmi->hdmi_data.enc_out_bus_format)) { in hdmi_config_AVI()
569 switch (hdmi->hdmi_data.enc_out_encoding) { in hdmi_config_AVI()
571 if (hdmi->hdmi_data.enc_in_encoding == V4L2_YCBCR_ENC_XV601) in hdmi_config_AVI()
579 if (hdmi->hdmi_data.enc_in_encoding == V4L2_YCBCR_ENC_XV709) in hdmi_config_AVI()
587 if (hdmi->hdmi_data.enc_in_encoding == V4L2_YCBCR_ENC_BT2020) in hdmi_config_AVI()
603 if (hdmi->hdmi_data.enc_out_encoding == V4L2_YCBCR_ENC_BT2020) { in hdmi_config_AVI()
613 if (is_hdmi2_sink(hdmi) && in hdmi_config_AVI()
625 if (hdmi->vic >= 128) { in hdmi_config_AVI()
630 buff[7] = hdmi->vic; in hdmi_config_AVI()
641 hdmi_writel(hdmi, val, PKT_AVI_CONTENTS0); in hdmi_config_AVI()
652 hdmi_writel(hdmi, val, PKT_AVI_CONTENTS1 + i * 4); in hdmi_config_AVI()
655 hdmi_modb(hdmi, 0, PKTSCHED_AVI_FIELDRATE, PKTSCHED_PKT_CONFIG1); in hdmi_config_AVI()
657 hdmi_modb(hdmi, PKTSCHED_AVI_TX_EN, PKTSCHED_AVI_TX_EN, in hdmi_config_AVI()
667 static void hdmi_config_vendor_specific_infoframe(struct dw_hdmi_qp *hdmi, in hdmi_config_vendor_specific_infoframe() argument
677 link_cfg = dw_hdmi_rockchip_get_link_cfg(hdmi->rk_hdmi); in hdmi_config_vendor_specific_infoframe()
679 hdmi_modb(hdmi, 0, PKTSCHED_VSI_TX_EN, PKTSCHED_PKT_EN); in hdmi_config_vendor_specific_infoframe()
682 hdmi_writel(hdmi, 0, PKT_VSI_CONTENTS0 + i * 4); in hdmi_config_vendor_specific_infoframe()
710 dev_err(hdmi->dev, "Failed to pack vendor infoframe: %zd\n", in hdmi_config_vendor_specific_infoframe()
718 hdmi_writel(hdmi, val, PKT_VSI_CONTENTS0); in hdmi_config_vendor_specific_infoframe()
732 hdmi_writel(hdmi, val, reg); in hdmi_config_vendor_specific_infoframe()
737 hdmi_writel(hdmi, 0, PKT_VSI_CONTENTS7); in hdmi_config_vendor_specific_infoframe()
739 hdmi_modb(hdmi, 0, PKTSCHED_VSI_FIELDRATE, PKTSCHED_PKT_CONFIG1); in hdmi_config_vendor_specific_infoframe()
740 hdmi_modb(hdmi, PKTSCHED_VSI_TX_EN, PKTSCHED_VSI_TX_EN, in hdmi_config_vendor_specific_infoframe()
744 static void hdmi_config_CVTEM(struct dw_hdmi_qp *hdmi, in hdmi_config_CVTEM() argument
757 struct drm_display_mode *mode = &hdmi->previous_mode; in hdmi_config_CVTEM()
760 hdmi_modb(hdmi, 0, PKTSCHED_EMP_CVTEM_TX_EN, PKTSCHED_PKT_EN); in hdmi_config_CVTEM()
775 hdmi_writel(hdmi, val, PKT0_EMP_CVTEM_CONTENTS0 + i * 0x20); in hdmi_config_CVTEM()
780 hdmi_writel(hdmi, val, PKT0_EMP_CVTEM_CONTENTS1); in hdmi_config_CVTEM()
783 hdmi_writel(hdmi, val, PKT0_EMP_CVTEM_CONTENTS2); in hdmi_config_CVTEM()
804 hdmi_writel(hdmi, val, reg); in hdmi_config_CVTEM()
811 hdmi_writel(hdmi, val, PKT4_EMP_CVTEM_CONTENTS6); in hdmi_config_CVTEM()
815 hdmi_writel(hdmi, val, PKT4_EMP_CVTEM_CONTENTS7); in hdmi_config_CVTEM()
818 hdmi_writel(hdmi, val, PKT5_EMP_CVTEM_CONTENTS1); in hdmi_config_CVTEM()
821 hdmi_writel(hdmi, 0, i); in hdmi_config_CVTEM()
823 hdmi_modb(hdmi, PKTSCHED_EMP_CVTEM_TX_EN, PKTSCHED_EMP_CVTEM_TX_EN, in hdmi_config_CVTEM()
847 static int hdmi_start_flt(struct dw_hdmi_qp *hdmi, u8 rate) in hdmi_start_flt() argument
855 hdmi_modb(hdmi, AVP_DATAPATH_VIDEO_SWDISABLE, in hdmi_start_flt()
858 hdmi_writel(hdmi, AVP_DATAPATH_SWINIT_P, GLOBAL_SWRESET_REQUEST); in hdmi_start_flt()
861 drm_scdc_writeb(&hdmi->adap, 0x10, 0xff); in hdmi_start_flt()
865 drm_scdc_readb(&hdmi->adap, SCDC_STATUS_FLAGS_0, &val); in hdmi_start_flt()
878 drm_scdc_writeb(&hdmi->adap, 0x31, val); in hdmi_start_flt()
880 hdmi_writel(hdmi, ffe_lv, FLT_CONFIG0); in hdmi_start_flt()
885 drm_scdc_readb(&hdmi->adap, 0x10, &val); in hdmi_start_flt()
893 drm_scdc_readb(&hdmi->adap, 0x41, &reg_val); in hdmi_start_flt()
897 drm_scdc_readb(&hdmi->adap, 0x42, &reg_val); in hdmi_start_flt()
904 hdmi_writel(hdmi, 0, FLT_CONFIG1); in hdmi_start_flt()
913 hdmi_writel(hdmi, value, FLT_CONFIG1); in hdmi_start_flt()
917 drm_scdc_writeb(&hdmi->adap, 0x10, val); in hdmi_start_flt()
920 hdmi_modb(hdmi, 0, AVP_DATAPATH_VIDEO_SWDISABLE, GLOBAL_SWDISABLE); in hdmi_start_flt()
936 static void hdmi_set_op_mode(struct dw_hdmi_qp *hdmi, in hdmi_set_op_mode() argument
945 printf("dw hdmi qp use tmds mode\n"); in hdmi_set_op_mode()
946 hdmi_modb(hdmi, 0, OPMODE_FRL, LINK_CONFIG0); in hdmi_set_op_mode()
947 hdmi_modb(hdmi, 0, OPMODE_FRL_4LANES, LINK_CONFIG0); in hdmi_set_op_mode()
948 hdmi->phy.ops->init(conn, hdmi->rk_hdmi, state); in hdmi_set_op_mode()
949 hdmi->phy.enabled = true; in hdmi_set_op_mode()
954 hdmi_modb(hdmi, OPMODE_FRL_4LANES, OPMODE_FRL_4LANES, in hdmi_set_op_mode()
957 hdmi_modb(hdmi, 0, OPMODE_FRL_4LANES, LINK_CONFIG0); in hdmi_set_op_mode()
959 hdmi_modb(hdmi, 1, OPMODE_FRL, LINK_CONFIG0); in hdmi_set_op_mode()
962 hdmi->phy.ops->init(conn, hdmi->rk_hdmi, state); in hdmi_set_op_mode()
963 hdmi->phy.enabled = true; in hdmi_set_op_mode()
966 ret = hdmi_start_flt(hdmi, frl_rate); in hdmi_set_op_mode()
968 hdmi_writel(hdmi, 0, FLT_CONFIG0); in hdmi_set_op_mode()
969 drm_scdc_writeb(&hdmi->adap, 0x31, 0); in hdmi_set_op_mode()
970 hdmi_modb(hdmi, 0, AVP_DATAPATH_VIDEO_SWDISABLE, GLOBAL_SWDISABLE); in hdmi_set_op_mode()
975 hdmi_modb(hdmi, PKTSCHED_NULL_TX_EN, PKTSCHED_NULL_TX_EN, PKTSCHED_PKT_EN); in hdmi_set_op_mode()
977 hdmi_modb(hdmi, 0, PKTSCHED_NULL_TX_EN, PKTSCHED_PKT_EN); in hdmi_set_op_mode()
982 static int dw_hdmi_setup(struct dw_hdmi_qp *hdmi, in dw_hdmi_setup() argument
988 void *data = hdmi->plat_data->phy_data; in dw_hdmi_setup()
990 struct drm_hdmi_info *hdmi_info = &hdmi->edid_data.display_info.hdmi; in dw_hdmi_setup()
991 struct hdmi_vmode *vmode = &hdmi->hdmi_data.video_mode; in dw_hdmi_setup()
994 if (!hdmi->vic) in dw_hdmi_setup()
995 printf("Non-CEA mode used in HDMI\n"); in dw_hdmi_setup()
997 printf("CEA mode used vic=%d\n", hdmi->vic); in dw_hdmi_setup()
1000 vmode->mtmdsclock = hdmi_get_tmdsclock(hdmi, vmode->mpixelclock); in dw_hdmi_setup()
1001 if (hdmi_bus_fmt_is_yuv420(hdmi->hdmi_data.enc_out_bus_format)) in dw_hdmi_setup()
1005 if (hdmi->plat_data->get_enc_out_encoding) in dw_hdmi_setup()
1006 hdmi->hdmi_data.enc_out_encoding = in dw_hdmi_setup()
1007 hdmi->plat_data->get_enc_out_encoding(data); in dw_hdmi_setup()
1008 else if (hdmi->vic == 6 || hdmi->vic == 7 || in dw_hdmi_setup()
1009 hdmi->vic == 21 || hdmi->vic == 22 || in dw_hdmi_setup()
1010 hdmi->vic == 2 || hdmi->vic == 3 || in dw_hdmi_setup()
1011 hdmi->vic == 17 || hdmi->vic == 18) in dw_hdmi_setup()
1012 hdmi->hdmi_data.enc_out_encoding = V4L2_YCBCR_ENC_601; in dw_hdmi_setup()
1014 hdmi->hdmi_data.enc_out_encoding = V4L2_YCBCR_ENC_709; in dw_hdmi_setup()
1017 hdmi->hdmi_data.video_mode.mpixelrepetitionoutput = 1; in dw_hdmi_setup()
1018 hdmi->hdmi_data.video_mode.mpixelrepetitioninput = 1; in dw_hdmi_setup()
1020 hdmi->hdmi_data.video_mode.mpixelrepetitionoutput = 0; in dw_hdmi_setup()
1021 hdmi->hdmi_data.video_mode.mpixelrepetitioninput = 0; in dw_hdmi_setup()
1025 if (hdmi->plat_data->get_enc_in_encoding) in dw_hdmi_setup()
1026 hdmi->hdmi_data.enc_in_encoding = in dw_hdmi_setup()
1027 hdmi->plat_data->get_enc_in_encoding(data); in dw_hdmi_setup()
1028 else if (hdmi->plat_data->input_bus_encoding) in dw_hdmi_setup()
1029 hdmi->hdmi_data.enc_in_encoding = in dw_hdmi_setup()
1030 hdmi->plat_data->input_bus_encoding; in dw_hdmi_setup()
1032 hdmi->hdmi_data.enc_in_encoding = V4L2_YCBCR_ENC_DEFAULT; in dw_hdmi_setup()
1034 if (hdmi->plat_data->get_quant_range) in dw_hdmi_setup()
1035 hdmi->hdmi_data.quant_range = in dw_hdmi_setup()
1036 hdmi->plat_data->get_quant_range(data); in dw_hdmi_setup()
1038 hdmi->hdmi_data.quant_range = HDMI_QUANTIZATION_RANGE_DEFAULT; in dw_hdmi_setup()
1041 * According to the dw-hdmi specification 6.4.2 in dw_hdmi_setup()
1046 hdmi->hdmi_data.pix_repet_factor = in dw_hdmi_setup()
1048 hdmi->hdmi_data.video_mode.mdataenablepolarity = true; in dw_hdmi_setup()
1050 /* HDMI Initialization Step B.2 */ in dw_hdmi_setup()
1051 hdmi->phy.ops->set_pll(conn, hdmi->rk_hdmi, state); in dw_hdmi_setup()
1054 if (hdmi->hdmi_data.enc_out_bus_format == MEDIA_BUS_FMT_YUYV10_1X20) in dw_hdmi_setup()
1055 hdmi_writel(hdmi, BIT(20), VIDEO_INTERFACE_CONFIG0); in dw_hdmi_setup()
1056 rk3588_set_grf_cfg(hdmi->rk_hdmi); in dw_hdmi_setup()
1057 link_cfg = dw_hdmi_rockchip_get_link_cfg(hdmi->rk_hdmi); in dw_hdmi_setup()
1060 if (hdmi->sink_is_hdmi) { in dw_hdmi_setup()
1061 printf("%s HDMI mode\n", __func__); in dw_hdmi_setup()
1062 hdmi_modb(hdmi, 0, OPMODE_DVI, LINK_CONFIG0); in dw_hdmi_setup()
1063 hdmi_modb(hdmi, HDCP2_BYPASS, HDCP2_BYPASS, HDCP2LOGIC_CONFIG0); in dw_hdmi_setup()
1064 hdmi_modb(hdmi, KEEPOUT_REKEY_ALWAYS, KEEPOUT_REKEY_CFG, FRAME_COMPOSER_CONFIG9); in dw_hdmi_setup()
1065 hdmi_writel(hdmi, 0, FLT_CONFIG0); in dw_hdmi_setup()
1067 drm_scdc_writeb(&hdmi->adap, 0x31, 0); in dw_hdmi_setup()
1070 drm_scdc_readb(&hdmi->adap, SCDC_SINK_VERSION, &bytes); in dw_hdmi_setup()
1071 drm_scdc_writeb(&hdmi->adap, SCDC_SOURCE_VERSION, in dw_hdmi_setup()
1073 drm_scdc_set_high_tmds_clock_ratio(&hdmi->adap, 1); in dw_hdmi_setup()
1074 drm_scdc_set_scrambling(&hdmi->adap, 1); in dw_hdmi_setup()
1075 hdmi_writel(hdmi, 1, SCRAMB_CONFIG0); in dw_hdmi_setup()
1079 drm_scdc_set_high_tmds_clock_ratio(&hdmi->adap, 0); in dw_hdmi_setup()
1080 drm_scdc_set_scrambling(&hdmi->adap, 0); in dw_hdmi_setup()
1082 hdmi_writel(hdmi, 0, SCRAMB_CONFIG0); in dw_hdmi_setup()
1085 /* HDMI Initialization Step F - Configure AVI InfoFrame */ in dw_hdmi_setup()
1086 hdmi_config_AVI(hdmi, mode); in dw_hdmi_setup()
1087 hdmi_config_vendor_specific_infoframe(hdmi, mode); in dw_hdmi_setup()
1088 hdmi_config_CVTEM(hdmi, link_cfg); in dw_hdmi_setup()
1089 hdmi_set_op_mode(hdmi, link_cfg, state, conn); in dw_hdmi_setup()
1092 hdmi_writel(hdmi, 2, PKTSCHED_PKT_CONTROL0); in dw_hdmi_setup()
1093 hdmi_modb(hdmi, PKTSCHED_GCP_TX_EN, PKTSCHED_GCP_TX_EN, in dw_hdmi_setup()
1096 hdmi_modb(hdmi, OPMODE_DVI, OPMODE_DVI, LINK_CONFIG0); in dw_hdmi_setup()
1097 ret = hdmi->phy.ops->init(conn, hdmi->rk_hdmi, state); in dw_hdmi_setup()
1100 hdmi->phy.enabled = true; in dw_hdmi_setup()
1104 /* Mark uboot hdmi is enabled */ in dw_hdmi_setup()
1105 hdmi_writel(hdmi, BIT(21), VIDEO_INTERFACE_CONFIG0); in dw_hdmi_setup()
1110 int dw_hdmi_detect_hotplug(struct dw_hdmi_qp *hdmi, in dw_hdmi_detect_hotplug() argument
1116 ret = hdmi->phy.ops->read_hpd(hdmi->rk_hdmi); in dw_hdmi_detect_hotplug()
1118 if (!hdmi->id) in dw_hdmi_detect_hotplug()
1133 struct dw_hdmi_qp *hdmi; in rockchip_dw_hdmi_qp_init() local
1138 hdmi = malloc(sizeof(struct dw_hdmi_qp)); in rockchip_dw_hdmi_qp_init()
1139 if (!hdmi) in rockchip_dw_hdmi_qp_init()
1142 memset(hdmi, 0, sizeof(struct dw_hdmi_qp)); in rockchip_dw_hdmi_qp_init()
1147 hdmi->rk_hdmi = rk_hdmi; in rockchip_dw_hdmi_qp_init()
1148 hdmi->id = of_alias_get_id(ofnode_to_np(hdmi_node), "hdmi"); in rockchip_dw_hdmi_qp_init()
1149 if (hdmi->id < 0) in rockchip_dw_hdmi_qp_init()
1150 hdmi->id = 0; in rockchip_dw_hdmi_qp_init()
1151 conn_state->disp_info = rockchip_get_disp_info(conn_state->type, hdmi->id); in rockchip_dw_hdmi_qp_init()
1155 hdmi->regs = dev_read_addr_ptr(conn->dev); in rockchip_dw_hdmi_qp_init()
1160 &hdmi->adap.i2c_bus); in rockchip_dw_hdmi_qp_init()
1161 if (hdmi->adap.i2c_bus) in rockchip_dw_hdmi_qp_init()
1162 hdmi->adap.ops = i2c_get_ops(hdmi->adap.i2c_bus); in rockchip_dw_hdmi_qp_init()
1165 hdmi->i2c = malloc(sizeof(struct dw_hdmi_i2c)); in rockchip_dw_hdmi_qp_init()
1166 if (!hdmi->i2c) in rockchip_dw_hdmi_qp_init()
1168 hdmi->adap.ddc_xfer = dw_hdmi_i2c_xfer; in rockchip_dw_hdmi_qp_init()
1174 hdmi->i2c->scl_high_ns = in rockchip_dw_hdmi_qp_init()
1177 hdmi->i2c->scl_low_ns = in rockchip_dw_hdmi_qp_init()
1181 dw_hdmi_i2c_init(hdmi); in rockchip_dw_hdmi_qp_init()
1184 hdmi->dev_type = pdata->dev_type; in rockchip_dw_hdmi_qp_init()
1185 hdmi->plat_data = pdata; in rockchip_dw_hdmi_qp_init()
1186 hdmi->edid_data.mode_buf = mode_buf; in rockchip_dw_hdmi_qp_init()
1188 conn->data = hdmi; in rockchip_dw_hdmi_qp_init()
1190 dw_hdmi_detect_phy(hdmi); in rockchip_dw_hdmi_qp_init()
1191 hdmi_writel(hdmi, 0, MAINUNIT_0_INT_MASK_N); in rockchip_dw_hdmi_qp_init()
1192 hdmi_writel(hdmi, 0, MAINUNIT_1_INT_MASK_N); in rockchip_dw_hdmi_qp_init()
1193 hdmi_writel(hdmi, 428571429, TIMER_BASE_CONFIG0); in rockchip_dw_hdmi_qp_init()
1195 dw_hdmi_qp_set_iomux(hdmi->rk_hdmi); in rockchip_dw_hdmi_qp_init()
1202 struct dw_hdmi_qp *hdmi = conn->data; in rockchip_dw_hdmi_qp_deinit() local
1204 if (hdmi->i2c) in rockchip_dw_hdmi_qp_deinit()
1205 free(hdmi->i2c); in rockchip_dw_hdmi_qp_deinit()
1206 if (hdmi->edid_data.mode_buf) in rockchip_dw_hdmi_qp_deinit()
1207 free(hdmi->edid_data.mode_buf); in rockchip_dw_hdmi_qp_deinit()
1208 if (hdmi) in rockchip_dw_hdmi_qp_deinit()
1209 free(hdmi); in rockchip_dw_hdmi_qp_deinit()
1217 static void dw_hdmi_disable(struct rockchip_connector *conn, struct dw_hdmi_qp *hdmi, in dw_hdmi_disable() argument
1220 if (hdmi->phy.enabled) { in dw_hdmi_disable()
1221 hdmi->phy.ops->disable(conn, hdmi->rk_hdmi, state); in dw_hdmi_disable()
1222 hdmi->phy.enabled = false; in dw_hdmi_disable()
1230 struct dw_hdmi_qp *hdmi = conn->data; in rockchip_dw_hdmi_qp_enable() local
1232 if (!hdmi) in rockchip_dw_hdmi_qp_enable()
1236 memcpy(&hdmi->previous_mode, mode, sizeof(hdmi->previous_mode)); in rockchip_dw_hdmi_qp_enable()
1238 dw_hdmi_setup(hdmi, conn, mode, state); in rockchip_dw_hdmi_qp_enable()
1245 struct dw_hdmi_qp *hdmi = conn->data; in rockchip_dw_hdmi_qp_disable() local
1247 dw_hdmi_disable(conn, hdmi, state); in rockchip_dw_hdmi_qp_disable()
1251 static void rockchip_dw_hdmi_qp_mode_valid(struct dw_hdmi_qp *hdmi) in rockchip_dw_hdmi_qp_mode_valid() argument
1253 struct hdmi_edid_data *edid_data = &hdmi->edid_data; in rockchip_dw_hdmi_qp_mode_valid()
1270 struct dw_hdmi_qp *hdmi = conn->data; in _rockchip_dw_hdmi_qp_get_timing() local
1277 if (!hdmi) in _rockchip_dw_hdmi_qp_get_timing()
1281 hdmi->sink_is_hdmi = in _rockchip_dw_hdmi_qp_get_timing()
1283 hdmi->sink_has_audio = drm_detect_monitor_audio(edid); in _rockchip_dw_hdmi_qp_get_timing()
1284 edid_status = drm_add_edid_modes(&hdmi->edid_data, conn_state->edid); in _rockchip_dw_hdmi_qp_get_timing()
1287 hdmi->sink_is_hdmi = true; in _rockchip_dw_hdmi_qp_get_timing()
1288 hdmi->sink_has_audio = true; in _rockchip_dw_hdmi_qp_get_timing()
1289 do_cea_modes(&hdmi->edid_data, def_modes_vic, in _rockchip_dw_hdmi_qp_get_timing()
1291 hdmi->edid_data.preferred_mode = &hdmi->edid_data.mode_buf[0]; in _rockchip_dw_hdmi_qp_get_timing()
1294 drm_rk_filter_whitelist(&hdmi->edid_data); in _rockchip_dw_hdmi_qp_get_timing()
1295 rockchip_dw_hdmi_qp_mode_valid(hdmi); in _rockchip_dw_hdmi_qp_get_timing()
1296 drm_mode_max_resolution_filter(&hdmi->edid_data, in _rockchip_dw_hdmi_qp_get_timing()
1298 if (!drm_mode_prune_invalid(&hdmi->edid_data)) { in _rockchip_dw_hdmi_qp_get_timing()
1299 printf("can't find valid hdmi mode\n"); in _rockchip_dw_hdmi_qp_get_timing()
1303 for (i = 0; i < hdmi->edid_data.modes; i++) in _rockchip_dw_hdmi_qp_get_timing()
1304 hdmi->edid_data.mode_buf[i].vrefresh = in _rockchip_dw_hdmi_qp_get_timing()
1305 drm_mode_vrefresh(&hdmi->edid_data.mode_buf[i]); in _rockchip_dw_hdmi_qp_get_timing()
1307 drm_mode_sort(&hdmi->edid_data); in _rockchip_dw_hdmi_qp_get_timing()
1308 dw_hdmi_qp_selete_output(&hdmi->edid_data, conn, &bus_format, in _rockchip_dw_hdmi_qp_get_timing()
1309 overscan, hdmi->dev_type, in _rockchip_dw_hdmi_qp_get_timing()
1310 hdmi->output_bus_format_rgb, hdmi->rk_hdmi, in _rockchip_dw_hdmi_qp_get_timing()
1313 *mode = *hdmi->edid_data.preferred_mode; in _rockchip_dw_hdmi_qp_get_timing()
1314 hdmi->vic = drm_match_cea_mode(mode); in _rockchip_dw_hdmi_qp_get_timing()
1318 hdmi->hdmi_data.enc_in_bus_format = bus_format; in _rockchip_dw_hdmi_qp_get_timing()
1319 hdmi->hdmi_data.enc_out_bus_format = bus_format; in _rockchip_dw_hdmi_qp_get_timing()
1324 hdmi->hdmi_data.enc_in_bus_format = in _rockchip_dw_hdmi_qp_get_timing()
1330 hdmi->hdmi_data.enc_in_bus_format = in _rockchip_dw_hdmi_qp_get_timing()
1340 if (hdmi->vic == 6 || hdmi->vic == 7 || hdmi->vic == 21 || in _rockchip_dw_hdmi_qp_get_timing()
1341 hdmi->vic == 22 || hdmi->vic == 2 || hdmi->vic == 3 || in _rockchip_dw_hdmi_qp_get_timing()
1342 hdmi->vic == 17 || hdmi->vic == 18) in _rockchip_dw_hdmi_qp_get_timing()
1363 struct dw_hdmi_qp *hdmi = conn->data; in rockchip_dw_hdmi_qp_get_timing() local
1366 ret = drm_do_get_edid(&hdmi->adap, conn_state->edid); in rockchip_dw_hdmi_qp_get_timing()
1378 struct dw_hdmi_qp *hdmi = conn->data; in rockchip_dw_hdmi_qp_detect() local
1380 if (!hdmi) in rockchip_dw_hdmi_qp_detect()
1383 ret = dw_hdmi_detect_hotplug(hdmi, state); in rockchip_dw_hdmi_qp_detect()
1392 struct dw_hdmi_qp *hdmi = conn->data; in rockchip_dw_hdmi_qp_get_edid() local
1394 ret = drm_do_get_edid(&hdmi->adap, conn_state->edid); in rockchip_dw_hdmi_qp_get_edid()