Lines Matching full:hdmi
13 #include <linux/hdmi.h>
38 #include "dw-hdmi-qp-audio.h"
39 #include "dw-hdmi-qp.h"
40 #include "dw-hdmi-qp-cec.h"
49 /* DW-HDMI Controller >= 0x200a are at least compliant with SCDC version 1 */
62 * of HDMI Specification 2.1.
119 /* For 297 MHz+ HDMI spec have some other rule for setting N */
216 int (*configure)(struct dw_hdmi_qp *hdmi,
284 void (*enable_audio)(struct dw_hdmi_qp *hdmi);
285 void (*disable_audio)(struct dw_hdmi_qp *hdmi);
294 bool initialized; /* hdmi is enabled before bind */
295 bool logo_plug_out; /* hdmi is plug out when kernel logo */
308 static inline void hdmi_writel(struct dw_hdmi_qp *hdmi, u32 val, int offset) in hdmi_writel() argument
310 regmap_write(hdmi->regm, offset, val); in hdmi_writel()
313 static inline u32 hdmi_readl(struct dw_hdmi_qp *hdmi, int offset) in hdmi_readl() argument
317 regmap_read(hdmi->regm, offset, &val); in hdmi_readl()
322 static void handle_plugged_change(struct dw_hdmi_qp *hdmi, bool plugged) in handle_plugged_change() argument
324 if (hdmi->plugged_cb && hdmi->codec_dev) in handle_plugged_change()
325 hdmi->plugged_cb(hdmi->codec_dev, plugged); in handle_plugged_change()
328 int dw_hdmi_qp_set_plugged_cb(struct dw_hdmi_qp *hdmi, hdmi_codec_plugged_cb fn, in dw_hdmi_qp_set_plugged_cb() argument
333 mutex_lock(&hdmi->mutex); in dw_hdmi_qp_set_plugged_cb()
334 hdmi->plugged_cb = fn; in dw_hdmi_qp_set_plugged_cb()
335 hdmi->codec_dev = codec_dev; in dw_hdmi_qp_set_plugged_cb()
336 plugged = hdmi->last_connector_result == connector_status_connected; in dw_hdmi_qp_set_plugged_cb()
337 handle_plugged_change(hdmi, plugged); in dw_hdmi_qp_set_plugged_cb()
338 mutex_unlock(&hdmi->mutex); in dw_hdmi_qp_set_plugged_cb()
344 static void hdmi_modb(struct dw_hdmi_qp *hdmi, u32 data, u32 mask, u32 reg) in hdmi_modb() argument
346 regmap_update_bits(hdmi->regm, reg, mask, data); in hdmi_modb()
349 static void hdmi_set_cts_n(struct dw_hdmi_qp *hdmi, unsigned int cts, in hdmi_set_cts_n() argument
353 hdmi_modb(hdmi, n, AUDPKT_ACR_N_VALUE, AUDPKT_ACR_CONTROL0); in hdmi_set_cts_n()
357 hdmi_modb(hdmi, AUDPKT_ACR_CTS_OVR_EN, AUDPKT_ACR_CTS_OVR_EN_MSK, in hdmi_set_cts_n()
360 hdmi_modb(hdmi, 0, AUDPKT_ACR_CTS_OVR_EN_MSK, in hdmi_set_cts_n()
363 hdmi_modb(hdmi, AUDPKT_ACR_CTS_OVR_VAL(cts), AUDPKT_ACR_CTS_OVR_VAL_MSK, in hdmi_set_cts_n()
367 static int hdmi_match_frl_n_table(struct dw_hdmi_qp *hdmi, in hdmi_match_frl_n_table() argument
406 dev_err(hdmi->dev, "FRL; unexpected Rbit: %lu Gbps\n", r_bit); in hdmi_match_frl_n_table()
411 static int hdmi_match_tmds_n_table(struct dw_hdmi_qp *hdmi, in hdmi_match_tmds_n_table() argument
415 const struct dw_hdmi_plat_data *plat_data = hdmi->plat_data; in hdmi_match_tmds_n_table()
472 static unsigned int hdmi_compute_n(struct dw_hdmi_qp *hdmi, in hdmi_compute_n() argument
509 static unsigned int hdmi_find_n(struct dw_hdmi_qp *hdmi, unsigned long pixel_clk, in hdmi_find_n() argument
513 void *data = hdmi->plat_data->phy_data; in hdmi_find_n()
516 if (hdmi->plat_data->get_link_cfg) { in hdmi_find_n()
517 link_cfg = hdmi->plat_data->get_link_cfg(data); in hdmi_find_n()
519 return hdmi_match_frl_n_table(hdmi, link_cfg->rate_per_lane, sample_rate); in hdmi_find_n()
522 n = hdmi_match_tmds_n_table(hdmi, pixel_clk, sample_rate); in hdmi_find_n()
526 dev_warn(hdmi->dev, "Rate %lu missing; compute N dynamically\n", in hdmi_find_n()
529 return hdmi_compute_n(hdmi, pixel_clk, sample_rate); in hdmi_find_n()
532 void dw_hdmi_qp_set_audio_interface(struct dw_hdmi_qp *hdmi, in dw_hdmi_qp_set_audio_interface() argument
538 mutex_lock(&hdmi->audio_mutex); in dw_hdmi_qp_set_audio_interface()
539 if (!hdmi->dclk_en) { in dw_hdmi_qp_set_audio_interface()
540 mutex_unlock(&hdmi->audio_mutex); in dw_hdmi_qp_set_audio_interface()
545 hdmi_writel(hdmi, AVP_DATAPATH_PACKET_AUDIO_SWINIT_P, GLOBAL_SWRESET_REQUEST); in dw_hdmi_qp_set_audio_interface()
548 hdmi_modb(hdmi, 0, in dw_hdmi_qp_set_audio_interface()
553 hdmi_writel(hdmi, AUDIO_FIFO_CLR_P, AUDIO_INTERFACE_CONTROL0); in dw_hdmi_qp_set_audio_interface()
556 hdmi_modb(hdmi, AUD_IF_I2S, AUD_IF_SEL_MSK, AUDIO_INTERFACE_CONFIG0); in dw_hdmi_qp_set_audio_interface()
574 hdmi_modb(hdmi, conf0, I2S_LINES_EN_MSK, AUDIO_INTERFACE_CONFIG0); in dw_hdmi_qp_set_audio_interface()
590 hdmi_modb(hdmi, conf0, I2S_BPCUV_RCV_MSK | AUD_FORMAT_MSK, in dw_hdmi_qp_set_audio_interface()
594 hdmi_modb(hdmi, AUD_FIFO_INIT_ON_OVF_EN, AUD_FIFO_INIT_ON_OVF_MSK, in dw_hdmi_qp_set_audio_interface()
597 mutex_unlock(&hdmi->audio_mutex); in dw_hdmi_qp_set_audio_interface()
609 void dw_hdmi_qp_set_channel_status(struct dw_hdmi_qp *hdmi, in dw_hdmi_qp_set_channel_status() argument
612 mutex_lock(&hdmi->audio_mutex); in dw_hdmi_qp_set_channel_status()
613 if (!hdmi->dclk_en) { in dw_hdmi_qp_set_channel_status()
614 mutex_unlock(&hdmi->audio_mutex); in dw_hdmi_qp_set_channel_status()
640 if ((hdmi_readl(hdmi, AUDIO_INTERFACE_CONFIG0) & GENMASK(25, 24)) == AUD_HBR) { in dw_hdmi_qp_set_channel_status()
646 hdmi_writel(hdmi, channel_status[0] | (channel_status[1] << 8), in dw_hdmi_qp_set_channel_status()
649 regmap_bulk_write(hdmi->regm, AUDPKT_CHSTATUS_OVR1, &channel_status[3], 1); in dw_hdmi_qp_set_channel_status()
652 hdmi_modb(hdmi, 0, in dw_hdmi_qp_set_channel_status()
656 hdmi_modb(hdmi, AUDPKT_PBIT_FORCE_EN | AUDPKT_CHSTATUS_OVR_EN, in dw_hdmi_qp_set_channel_status()
660 mutex_unlock(&hdmi->audio_mutex); in dw_hdmi_qp_set_channel_status()
664 static void hdmi_set_clk_regenerator(struct dw_hdmi_qp *hdmi, in hdmi_set_clk_regenerator() argument
669 n = hdmi_find_n(hdmi, pixel_clk, sample_rate); in hdmi_set_clk_regenerator()
671 hdmi->audio_n = n; in hdmi_set_clk_regenerator()
672 hdmi->audio_cts = cts; in hdmi_set_clk_regenerator()
673 hdmi_set_cts_n(hdmi, cts, hdmi->audio_enable ? n : 0); in hdmi_set_clk_regenerator()
676 static void hdmi_init_clk_regenerator(struct dw_hdmi_qp *hdmi) in hdmi_init_clk_regenerator() argument
678 mutex_lock(&hdmi->audio_mutex); in hdmi_init_clk_regenerator()
679 if (hdmi->dclk_en) in hdmi_init_clk_regenerator()
680 hdmi_set_clk_regenerator(hdmi, 74250000, hdmi->sample_rate); in hdmi_init_clk_regenerator()
681 mutex_unlock(&hdmi->audio_mutex); in hdmi_init_clk_regenerator()
684 static void hdmi_clk_regenerator_update_pixel_clock(struct dw_hdmi_qp *hdmi) in hdmi_clk_regenerator_update_pixel_clock() argument
686 mutex_lock(&hdmi->audio_mutex); in hdmi_clk_regenerator_update_pixel_clock()
687 if (hdmi->dclk_en) in hdmi_clk_regenerator_update_pixel_clock()
688 hdmi_set_clk_regenerator(hdmi, hdmi->hdmi_data.video_mode.mtmdsclock, in hdmi_clk_regenerator_update_pixel_clock()
689 hdmi->sample_rate); in hdmi_clk_regenerator_update_pixel_clock()
690 mutex_unlock(&hdmi->audio_mutex); in hdmi_clk_regenerator_update_pixel_clock()
693 void dw_hdmi_qp_set_sample_rate(struct dw_hdmi_qp *hdmi, unsigned int rate) in dw_hdmi_qp_set_sample_rate() argument
695 mutex_lock(&hdmi->audio_mutex); in dw_hdmi_qp_set_sample_rate()
696 if (hdmi->dclk_en) { in dw_hdmi_qp_set_sample_rate()
697 hdmi->sample_rate = rate; in dw_hdmi_qp_set_sample_rate()
698 hdmi_set_clk_regenerator(hdmi, hdmi->hdmi_data.video_mode.mtmdsclock, in dw_hdmi_qp_set_sample_rate()
699 hdmi->sample_rate); in dw_hdmi_qp_set_sample_rate()
701 mutex_unlock(&hdmi->audio_mutex); in dw_hdmi_qp_set_sample_rate()
705 void dw_hdmi_qp_set_channel_count(struct dw_hdmi_qp *hdmi, unsigned int cnt) in dw_hdmi_qp_set_channel_count() argument
710 void dw_hdmi_qp_set_channel_allocation(struct dw_hdmi_qp *hdmi, unsigned int ca) in dw_hdmi_qp_set_channel_allocation() argument
715 static int dw_hdmi_qp_init_audio_infoframe(struct dw_hdmi_qp *hdmi) in dw_hdmi_qp_init_audio_infoframe() argument
731 dev_err(hdmi->dev, "%s: Failed to pack audio infoframe: %d\n", in dw_hdmi_qp_init_audio_infoframe()
736 regmap_bulk_write(hdmi->regm, PKT_AUDI_CONTENTS1, &infoframe_buf[3], 2); in dw_hdmi_qp_init_audio_infoframe()
737 hdmi_modb(hdmi, in dw_hdmi_qp_init_audio_infoframe()
745 void dw_hdmi_qp_set_audio_infoframe(struct dw_hdmi_qp *hdmi, in dw_hdmi_qp_set_audio_infoframe() argument
754 dev_err(hdmi->dev, "%s: Failed to pack audio infoframe: %d\n", in dw_hdmi_qp_set_audio_infoframe()
759 mutex_lock(&hdmi->audio_mutex); in dw_hdmi_qp_set_audio_infoframe()
760 if (!hdmi->dclk_en) { in dw_hdmi_qp_set_audio_infoframe()
761 mutex_unlock(&hdmi->audio_mutex); in dw_hdmi_qp_set_audio_infoframe()
778 * AUDI_CONTENTS0 default value defined by HDMI specification, in dw_hdmi_qp_set_audio_infoframe()
782 regmap_bulk_write(hdmi->regm, PKT_AUDI_CONTENTS1, &infoframe_buf[3], 2); in dw_hdmi_qp_set_audio_infoframe()
785 hdmi_modb(hdmi, PKTSCHED_ACR_TX_EN | PKTSCHED_AUDI_TX_EN, in dw_hdmi_qp_set_audio_infoframe()
790 hdmi_modb(hdmi, PKTSCHED_AUDS_TX_EN, PKTSCHED_AUDS_TX_EN, PKTSCHED_PKT_EN); in dw_hdmi_qp_set_audio_infoframe()
791 mutex_unlock(&hdmi->audio_mutex); in dw_hdmi_qp_set_audio_infoframe()
795 static void hdmi_enable_audio_clk(struct dw_hdmi_qp *hdmi, bool enable) in hdmi_enable_audio_clk() argument
798 hdmi_modb(hdmi, 0, in hdmi_enable_audio_clk()
801 hdmi_modb(hdmi, AVP_DATAPATH_PACKET_AUDIO_SWDISABLE, in hdmi_enable_audio_clk()
805 static void dw_hdmi_i2s_audio_enable(struct dw_hdmi_qp *hdmi) in dw_hdmi_i2s_audio_enable() argument
807 hdmi_set_cts_n(hdmi, hdmi->audio_cts, hdmi->audio_n); in dw_hdmi_i2s_audio_enable()
808 hdmi_enable_audio_clk(hdmi, true); in dw_hdmi_i2s_audio_enable()
811 static void dw_hdmi_i2s_audio_disable(struct dw_hdmi_qp *hdmi) in dw_hdmi_i2s_audio_disable() argument
820 hdmi_modb(hdmi, I2S_BPCUV_RCV_DIS, I2S_BPCUV_RCV_MSK, in dw_hdmi_i2s_audio_disable()
822 hdmi_modb(hdmi, AUDPKT_PBIT_FORCE_EN | AUDPKT_CHSTATUS_OVR_EN, in dw_hdmi_i2s_audio_disable()
827 void dw_hdmi_qp_audio_enable(struct dw_hdmi_qp *hdmi) in dw_hdmi_qp_audio_enable() argument
829 mutex_lock(&hdmi->audio_mutex); in dw_hdmi_qp_audio_enable()
830 if (hdmi->dclk_en) { in dw_hdmi_qp_audio_enable()
831 hdmi->audio_enable = true; in dw_hdmi_qp_audio_enable()
832 if (hdmi->enable_audio) in dw_hdmi_qp_audio_enable()
833 hdmi->enable_audio(hdmi); in dw_hdmi_qp_audio_enable()
835 mutex_unlock(&hdmi->audio_mutex); in dw_hdmi_qp_audio_enable()
839 void dw_hdmi_qp_audio_disable(struct dw_hdmi_qp *hdmi) in dw_hdmi_qp_audio_disable() argument
841 mutex_lock(&hdmi->audio_mutex); in dw_hdmi_qp_audio_disable()
842 if (hdmi->dclk_en) { in dw_hdmi_qp_audio_disable()
843 hdmi->audio_enable = false; in dw_hdmi_qp_audio_disable()
844 if (hdmi->disable_audio) in dw_hdmi_qp_audio_disable()
845 hdmi->disable_audio(hdmi); in dw_hdmi_qp_audio_disable()
847 mutex_unlock(&hdmi->audio_mutex); in dw_hdmi_qp_audio_disable()
943 static void dw_hdmi_i2c_init(struct dw_hdmi_qp *hdmi) in dw_hdmi_i2c_init() argument
946 hdmi_writel(hdmi, 0x01, I2CM_CONTROL0); in dw_hdmi_i2c_init()
948 hdmi_writel(hdmi, 0x085c085c, I2CM_FM_SCL_CONFIG0); in dw_hdmi_i2c_init()
950 hdmi_modb(hdmi, 0, I2CM_FM_EN, I2CM_INTERFACE_CONTROL0); in dw_hdmi_i2c_init()
953 hdmi_writel(hdmi, I2CM_OP_DONE_CLEAR | I2CM_NACK_RCVD_CLEAR, in dw_hdmi_i2c_init()
957 static int dw_hdmi_i2c_read(struct dw_hdmi_qp *hdmi, in dw_hdmi_i2c_read() argument
960 struct dw_hdmi_qp_i2c *i2c = hdmi->i2c; in dw_hdmi_i2c_read()
964 dev_dbg(hdmi->dev, "set read register address to 0\n"); in dw_hdmi_i2c_read()
972 hdmi_modb(hdmi, i2c->slave_reg++ << 12, I2CM_ADDR, in dw_hdmi_i2c_read()
976 hdmi_modb(hdmi, I2CM_EXT_READ, I2CM_WR_MASK, in dw_hdmi_i2c_read()
979 hdmi_modb(hdmi, I2CM_FM_READ, I2CM_WR_MASK, in dw_hdmi_i2c_read()
984 dev_err(hdmi->dev, "i2c read time out!\n"); in dw_hdmi_i2c_read()
985 hdmi_writel(hdmi, 0x01, I2CM_CONTROL0); in dw_hdmi_i2c_read()
991 dev_err(hdmi->dev, "i2c read err!\n"); in dw_hdmi_i2c_read()
992 hdmi_writel(hdmi, 0x01, I2CM_CONTROL0); in dw_hdmi_i2c_read()
996 *buf++ = hdmi_readl(hdmi, I2CM_INTERFACE_RDDATA_0_3) & 0xff; in dw_hdmi_i2c_read()
997 dev_dbg(hdmi->dev, "i2c read done! i2c->stat:%02x 0x%02x\n", in dw_hdmi_i2c_read()
998 i2c->stat, hdmi_readl(hdmi, I2CM_INTERFACE_RDDATA_0_3)); in dw_hdmi_i2c_read()
999 hdmi_modb(hdmi, 0, I2CM_WR_MASK, I2CM_INTERFACE_CONTROL0); in dw_hdmi_i2c_read()
1006 static int dw_hdmi_i2c_write(struct dw_hdmi_qp *hdmi, in dw_hdmi_i2c_write() argument
1009 struct dw_hdmi_qp_i2c *i2c = hdmi->i2c; in dw_hdmi_i2c_write()
1023 hdmi_writel(hdmi, *buf++, I2CM_INTERFACE_WRDATA_0_3); in dw_hdmi_i2c_write()
1024 hdmi_modb(hdmi, i2c->slave_reg++ << 12, I2CM_ADDR, in dw_hdmi_i2c_write()
1026 hdmi_modb(hdmi, I2CM_FM_WRITE, I2CM_WR_MASK, in dw_hdmi_i2c_write()
1031 dev_err(hdmi->dev, "i2c write time out!\n"); in dw_hdmi_i2c_write()
1032 hdmi_writel(hdmi, 0x01, I2CM_CONTROL0); in dw_hdmi_i2c_write()
1038 dev_err(hdmi->dev, "i2c write nack!\n"); in dw_hdmi_i2c_write()
1039 hdmi_writel(hdmi, 0x01, I2CM_CONTROL0); in dw_hdmi_i2c_write()
1042 hdmi_modb(hdmi, 0, I2CM_WR_MASK, I2CM_INTERFACE_CONTROL0); in dw_hdmi_i2c_write()
1044 dev_dbg(hdmi->dev, "i2c write done!\n"); in dw_hdmi_i2c_write()
1051 struct dw_hdmi_qp *hdmi = i2c_get_adapdata(adap); in dw_hdmi_i2c_xfer() local
1052 struct dw_hdmi_qp_i2c *i2c = hdmi->i2c; in dw_hdmi_i2c_xfer()
1065 dev_dbg(hdmi->dev, "i2c xfer: num: %d, addr: %#x\n", num, addr); in dw_hdmi_i2c_xfer()
1069 dev_err(hdmi->dev, in dw_hdmi_i2c_xfer()
1079 hdmi_modb(hdmi, I2CM_NACK_RCVD_MASK_N | I2CM_OP_DONE_MASK_N, in dw_hdmi_i2c_xfer()
1087 hdmi_modb(hdmi, addr << 5, I2CM_SLVADDR, I2CM_INTERFACE_CONTROL0); in dw_hdmi_i2c_xfer()
1096 dev_dbg(hdmi->dev, "xfer: num: %d/%d, len: %d, flags: %#x\n", in dw_hdmi_i2c_xfer()
1101 hdmi_modb(hdmi, DDC_SEGMENT_ADDR, I2CM_SEG_ADDR, in dw_hdmi_i2c_xfer()
1103 hdmi_modb(hdmi, *msgs[i].buf << 7, I2CM_SEG_PTR, in dw_hdmi_i2c_xfer()
1107 ret = dw_hdmi_i2c_read(hdmi, msgs[i].buf, in dw_hdmi_i2c_xfer()
1110 ret = dw_hdmi_i2c_write(hdmi, msgs[i].buf, in dw_hdmi_i2c_xfer()
1121 hdmi_modb(hdmi, 0, I2CM_OP_DONE_MASK_N | I2CM_NACK_RCVD_MASK_N, in dw_hdmi_i2c_xfer()
1139 static struct i2c_adapter *dw_hdmi_i2c_adapter(struct dw_hdmi_qp *hdmi) in dw_hdmi_i2c_adapter() argument
1145 i2c = devm_kzalloc(hdmi->dev, sizeof(*i2c), GFP_KERNEL); in dw_hdmi_i2c_adapter()
1155 adap->dev.parent = hdmi->dev; in dw_hdmi_i2c_adapter()
1158 i2c_set_adapdata(adap, hdmi); in dw_hdmi_i2c_adapter()
1162 dev_warn(hdmi->dev, "cannot add %s I2C adapter\n", adap->name); in dw_hdmi_i2c_adapter()
1163 devm_kfree(hdmi->dev, i2c); in dw_hdmi_i2c_adapter()
1167 hdmi->i2c = i2c; in dw_hdmi_i2c_adapter()
1169 dev_info(hdmi->dev, "registered %s I2C bus driver\n", adap->name); in dw_hdmi_i2c_adapter()
1176 int dw_hdmi_qp_set_earc(struct dw_hdmi_qp *hdmi) in dw_hdmi_qp_set_earc() argument
1180 /* set hdmi phy earc mode */ in dw_hdmi_qp_set_earc()
1181 hdmi->phy.ops->set_mode(hdmi, hdmi->phy.data, HDMI_PHY_EARC_MASK, in dw_hdmi_qp_set_earc()
1184 ret = hdmi->phy.ops->init(hdmi, hdmi->phy.data, in dw_hdmi_qp_set_earc()
1185 &hdmi->previous_mode); in dw_hdmi_qp_set_earc()
1189 hdmi->disabled = false; in dw_hdmi_qp_set_earc()
1191 reinit_completion(&hdmi->earc_cmp); in dw_hdmi_qp_set_earc()
1193 hdmi_modb(hdmi, EARCRX_CMDC_DISCOVERY_TIMEOUT_IRQ | in dw_hdmi_qp_set_earc()
1199 hdmi_modb(hdmi, EARCRX_CMDC_DISCOVERY_EN, EARCRX_CMDC_DISCOVERY_EN, in dw_hdmi_qp_set_earc()
1208 hdmi_modb(hdmi, EARCRX_CONNECTOR_HPD, EARCRX_CONNECTOR_HPD, in dw_hdmi_qp_set_earc()
1211 stat = wait_for_completion_timeout(&hdmi->earc_cmp, HZ / 10); in dw_hdmi_qp_set_earc()
1215 if (hdmi->earc_intr & EARCRX_CMDC_DISCOVERY_TIMEOUT_IRQ) { in dw_hdmi_qp_set_earc()
1216 dev_err(hdmi->dev, "discovery timeout\n"); in dw_hdmi_qp_set_earc()
1218 } else if (hdmi->earc_intr & EARCRX_CMDC_DISCOVERY_DONE_IRQ) { in dw_hdmi_qp_set_earc()
1219 dev_info(hdmi->dev, "discovery done\n"); in dw_hdmi_qp_set_earc()
1221 dev_err(hdmi->dev, "discovery failed\n"); in dw_hdmi_qp_set_earc()
1225 hdmi_writel(hdmi, 1, EARCRX_DMAC_PHY_CONTROL); in dw_hdmi_qp_set_earc()
1226 hdmi_modb(hdmi, EARCRX_CMDC_SWINIT_P, EARCRX_CMDC_SWINIT_P, in dw_hdmi_qp_set_earc()
1229 hdmi_writel(hdmi, 0xf3, EARCRX_DMAC_CONFIG); in dw_hdmi_qp_set_earc()
1230 hdmi_writel(hdmi, 0x63, EARCRX_DMAC_CONTROL0); in dw_hdmi_qp_set_earc()
1231 hdmi_writel(hdmi, 0xff, EARCRX_DMAC_CONTROL1); in dw_hdmi_qp_set_earc()
1233 hdmi_modb(hdmi, EARCRX_XACTREAD_STOP_CFG | EARCRX_XACTREAD_RETRY_CFG | in dw_hdmi_qp_set_earc()
1239 hdmi_writel(hdmi, 0, EARCRX_DMAC_CHSTATUS_STREAMER0); in dw_hdmi_qp_set_earc()
1240 hdmi_writel(hdmi, 0x1b0e, EARCRX_DMAC_CHSTATUS_STREAMER1); in dw_hdmi_qp_set_earc()
1241 hdmi_writel(hdmi, 0, EARCRX_DMAC_CHSTATUS_STREAMER2); in dw_hdmi_qp_set_earc()
1242 hdmi_writel(hdmi, 0, EARCRX_DMAC_CHSTATUS_STREAMER3); in dw_hdmi_qp_set_earc()
1243 hdmi_writel(hdmi, 0xf2000000, EARCRX_DMAC_CHSTATUS_STREAMER4); in dw_hdmi_qp_set_earc()
1244 hdmi_writel(hdmi, 0, EARCRX_DMAC_CHSTATUS_STREAMER5); in dw_hdmi_qp_set_earc()
1245 hdmi_writel(hdmi, 0, EARCRX_DMAC_CHSTATUS_STREAMER6); in dw_hdmi_qp_set_earc()
1246 hdmi_writel(hdmi, 0, EARCRX_DMAC_CHSTATUS_STREAMER7); in dw_hdmi_qp_set_earc()
1247 hdmi_writel(hdmi, 0, EARCRX_DMAC_CHSTATUS_STREAMER8); in dw_hdmi_qp_set_earc()
1254 * HDMI TX Setup
1275 return connector->display_info.hdmi.scdc.supported || in is_hdmi2_sink()
1279 static void hdmi_config_AVI(struct dw_hdmi_qp *hdmi, in hdmi_config_AVI() argument
1287 hdmi->hdmi_data.quant_range; in hdmi_config_AVI()
1297 if (hdmi_bus_fmt_is_yuv444(hdmi->hdmi_data.enc_out_bus_format)) in hdmi_config_AVI()
1299 else if (hdmi_bus_fmt_is_yuv422(hdmi->hdmi_data.enc_out_bus_format)) in hdmi_config_AVI()
1301 else if (hdmi_bus_fmt_is_yuv420(hdmi->hdmi_data.enc_out_bus_format)) in hdmi_config_AVI()
1307 if (!hdmi_bus_fmt_is_rgb(hdmi->hdmi_data.enc_out_bus_format)) { in hdmi_config_AVI()
1308 switch (hdmi->hdmi_data.enc_out_encoding) { in hdmi_config_AVI()
1310 if (hdmi->hdmi_data.enc_in_encoding == V4L2_YCBCR_ENC_XV601) in hdmi_config_AVI()
1318 if (hdmi->hdmi_data.enc_in_encoding == V4L2_YCBCR_ENC_XV709) in hdmi_config_AVI()
1326 if (hdmi->hdmi_data.enc_in_encoding == V4L2_YCBCR_ENC_BT2020) in hdmi_config_AVI()
1342 if (hdmi->hdmi_data.enc_out_encoding == V4L2_YCBCR_ENC_BT2020) { in hdmi_config_AVI()
1364 if (hdmi->vic >= 128) { in hdmi_config_AVI()
1369 buff[7] = hdmi->vic; in hdmi_config_AVI()
1372 buff[7] = hdmi->vic; in hdmi_config_AVI()
1382 hdmi_writel(hdmi, val, PKT_AVI_CONTENTS0); in hdmi_config_AVI()
1393 hdmi_writel(hdmi, val, PKT_AVI_CONTENTS1 + i * 4); in hdmi_config_AVI()
1396 hdmi_modb(hdmi, 0, PKTSCHED_AVI_FIELDRATE, PKTSCHED_PKT_CONFIG1); in hdmi_config_AVI()
1398 hdmi_modb(hdmi, PKTSCHED_AVI_TX_EN, PKTSCHED_AVI_TX_EN, PKTSCHED_PKT_EN); in hdmi_config_AVI()
1407 static void hdmi_config_vendor_specific_infoframe(struct dw_hdmi_qp *hdmi, in hdmi_config_vendor_specific_infoframe() argument
1417 void *data = hdmi->plat_data->phy_data; in hdmi_config_vendor_specific_infoframe()
1419 if (hdmi->plat_data->get_link_cfg) in hdmi_config_vendor_specific_infoframe()
1420 link_cfg = hdmi->plat_data->get_link_cfg(data); in hdmi_config_vendor_specific_infoframe()
1422 hdmi_modb(hdmi, 0, PKTSCHED_VSI_TX_EN, PKTSCHED_PKT_EN); in hdmi_config_vendor_specific_infoframe()
1424 hdmi_writel(hdmi, 0, PKT_VSI_CONTENTS0 + i * 4); in hdmi_config_vendor_specific_infoframe()
1426 if (hdmi->allm_enable && (link_cfg->add_func & SUPPORT_HDMI_ALLM)) { in hdmi_config_vendor_specific_infoframe()
1441 hdmi_modb(hdmi, 0, PKTSCHED_VSI_TX_EN, PKTSCHED_PKT_EN); in hdmi_config_vendor_specific_infoframe()
1457 dev_err(hdmi->dev, "Failed to pack vendor infoframe: %zd\n", in hdmi_config_vendor_specific_infoframe()
1465 hdmi_writel(hdmi, val, PKT_VSI_CONTENTS0); in hdmi_config_vendor_specific_infoframe()
1479 hdmi_writel(hdmi, val, reg); in hdmi_config_vendor_specific_infoframe()
1484 hdmi_writel(hdmi, 0, PKT_VSI_CONTENTS7); in hdmi_config_vendor_specific_infoframe()
1486 hdmi_modb(hdmi, 0, PKTSCHED_VSI_FIELDRATE, PKTSCHED_PKT_CONFIG1); in hdmi_config_vendor_specific_infoframe()
1487 hdmi_modb(hdmi, PKTSCHED_VSI_TX_EN, PKTSCHED_VSI_TX_EN, in hdmi_config_vendor_specific_infoframe()
1491 static void hdmi_config_CVTEM(struct dw_hdmi_qp *hdmi) in hdmi_config_CVTEM() argument
1503 struct drm_display_mode *mode = &hdmi->previous_mode; in hdmi_config_CVTEM()
1506 void *data = hdmi->plat_data->phy_data; in hdmi_config_CVTEM()
1508 hdmi_modb(hdmi, 0, PKTSCHED_EMP_CVTEM_TX_EN, PKTSCHED_PKT_EN); in hdmi_config_CVTEM()
1510 if (hdmi->plat_data->get_link_cfg) { in hdmi_config_CVTEM()
1511 link_cfg = hdmi->plat_data->get_link_cfg(data); in hdmi_config_CVTEM()
1513 dev_err(hdmi->dev, "can't get frl link cfg\n"); in hdmi_config_CVTEM()
1518 dev_info(hdmi->dev, "don't use dsc mode\n"); in hdmi_config_CVTEM()
1530 hdmi_writel(hdmi, val, PKT0_EMP_CVTEM_CONTENTS0 + i * 0x20); in hdmi_config_CVTEM()
1535 hdmi_writel(hdmi, val, PKT0_EMP_CVTEM_CONTENTS1); in hdmi_config_CVTEM()
1538 hdmi_writel(hdmi, val, PKT0_EMP_CVTEM_CONTENTS2); in hdmi_config_CVTEM()
1559 hdmi_writel(hdmi, val, reg); in hdmi_config_CVTEM()
1566 hdmi_writel(hdmi, val, PKT4_EMP_CVTEM_CONTENTS6); in hdmi_config_CVTEM()
1570 hdmi_writel(hdmi, val, PKT4_EMP_CVTEM_CONTENTS7); in hdmi_config_CVTEM()
1573 hdmi_writel(hdmi, val, PKT5_EMP_CVTEM_CONTENTS1); in hdmi_config_CVTEM()
1576 hdmi_writel(hdmi, 0, i); in hdmi_config_CVTEM()
1578 hdmi_modb(hdmi, PKTSCHED_EMP_CVTEM_TX_EN, PKTSCHED_EMP_CVTEM_TX_EN, in hdmi_config_CVTEM()
1582 static void hdmi_config_drm_infoframe(struct dw_hdmi_qp *hdmi, in hdmi_config_drm_infoframe() argument
1593 if (!hdmi->plat_data->use_drm_infoframe) in hdmi_config_drm_infoframe()
1596 hdmi_modb(hdmi, 0, PKTSCHED_DRMI_TX_EN, PKTSCHED_PKT_EN); in hdmi_config_drm_infoframe()
1598 if (!hdmi->connector.hdr_sink_metadata.hdmi_type1.eotf) { in hdmi_config_drm_infoframe()
1611 if (!(hdmi->connector.hdr_sink_metadata.hdmi_type1.eotf & in hdmi_config_drm_infoframe()
1624 dev_err(hdmi->dev, "Failed to pack drm infoframe: %zd\n", err); in hdmi_config_drm_infoframe()
1629 hdmi_writel(hdmi, val, PKT_DRMI_CONTENTS0); in hdmi_config_drm_infoframe()
1637 hdmi_writel(hdmi, val, PKT_DRMI_CONTENTS1 + ((i / 4) * 4)); in hdmi_config_drm_infoframe()
1640 hdmi_modb(hdmi, 0, PKTSCHED_DRMI_FIELDRATE, PKTSCHED_PKT_CONFIG1); in hdmi_config_drm_infoframe()
1647 hdmi_modb(hdmi, PKTSCHED_DRMI_TX_EN, PKTSCHED_DRMI_TX_EN, PKTSCHED_PKT_EN); in hdmi_config_drm_infoframe()
1654 static bool dw_hdmi_support_scdc(struct dw_hdmi_qp *hdmi, in dw_hdmi_support_scdc() argument
1658 if (!hdmi->ddc) in dw_hdmi_support_scdc()
1662 if (!display->hdmi.scdc.supported || in dw_hdmi_support_scdc()
1663 !display->hdmi.scdc.scrambling.supported) in dw_hdmi_support_scdc()
1670 if (!display->hdmi.scdc.scrambling.low_rates && in dw_hdmi_support_scdc()
1697 static int hdmi_start_flt(struct dw_hdmi_qp *hdmi, u8 rate) in hdmi_start_flt() argument
1705 hdmi_modb(hdmi, AVP_DATAPATH_VIDEO_SWDISABLE, in hdmi_start_flt()
1709 hdmi_writel(hdmi, BIT(6), GLOBAL_SWRESET_REQUEST); in hdmi_start_flt()
1713 drm_scdc_readb(hdmi->ddc, SCDC_STATUS_FLAGS_0, &val); in hdmi_start_flt()
1720 dev_err(hdmi->dev, "sink flt isn't ready\n"); in hdmi_start_flt()
1725 drm_scdc_readb(hdmi->ddc, 0x10, &val); in hdmi_start_flt()
1727 drm_scdc_writeb(hdmi->ddc, 0x10, BIT(5)); in hdmi_start_flt()
1731 drm_scdc_writeb(hdmi->ddc, 0x31, val); in hdmi_start_flt()
1734 hdmi_writel(hdmi, ffe_lv, FLT_CONFIG0); in hdmi_start_flt()
1741 drm_scdc_readb(hdmi->ddc, 0x10, &val); in hdmi_start_flt()
1749 drm_scdc_readb(hdmi->ddc, 0x41, ®_val); in hdmi_start_flt()
1753 drm_scdc_readb(hdmi->ddc, 0x42, ®_val); in hdmi_start_flt()
1758 dev_info(hdmi->dev, "goto ltsp\n"); in hdmi_start_flt()
1760 hdmi_writel(hdmi, 0, FLT_CONFIG1); in hdmi_start_flt()
1762 dev_err(hdmi->dev, "goto lts4\n"); in hdmi_start_flt()
1765 dev_info(hdmi->dev, "goto ffe\n"); in hdmi_start_flt()
1769 hdmi_writel(hdmi, value, FLT_CONFIG1); in hdmi_start_flt()
1774 drm_scdc_writeb(hdmi->ddc, 0x10, val & 0x30); in hdmi_start_flt()
1777 hdmi_modb(hdmi, 0, AVP_DATAPATH_VIDEO_SWDISABLE, GLOBAL_SWDISABLE); in hdmi_start_flt()
1778 dev_info(hdmi->dev, "flt success\n"); in hdmi_start_flt()
1784 dev_err(hdmi->dev, "flt time out\n"); in hdmi_start_flt()
1793 static int hdmi_set_op_mode(struct dw_hdmi_qp *hdmi, in hdmi_set_op_mode() argument
1800 if (hdmi->frl_switch) in hdmi_set_op_mode()
1804 dev_info(hdmi->dev, "dw hdmi qp use tmds mode\n"); in hdmi_set_op_mode()
1805 hdmi_modb(hdmi, 0, OPMODE_FRL, LINK_CONFIG0); in hdmi_set_op_mode()
1806 hdmi_modb(hdmi, 0, OPMODE_FRL_4LANES, LINK_CONFIG0); in hdmi_set_op_mode()
1807 if (!hdmi->update) { in hdmi_set_op_mode()
1808 ret = hdmi->phy.ops->init(hdmi, hdmi->phy.data, &hdmi->previous_mode); in hdmi_set_op_mode()
1810 hdmi->disabled = false; in hdmi_set_op_mode()
1816 if (hdmi->update) in hdmi_set_op_mode()
1820 hdmi_modb(hdmi, OPMODE_FRL_4LANES, OPMODE_FRL_4LANES, in hdmi_set_op_mode()
1823 hdmi_modb(hdmi, 0, OPMODE_FRL_4LANES, LINK_CONFIG0); in hdmi_set_op_mode()
1825 hdmi_modb(hdmi, 1, OPMODE_FRL, LINK_CONFIG0); in hdmi_set_op_mode()
1829 ret = hdmi->phy.ops->init(hdmi, hdmi->phy.data, &hdmi->previous_mode); in hdmi_set_op_mode()
1832 hdmi->disabled = false; in hdmi_set_op_mode()
1836 ret = hdmi_start_flt(hdmi, frl_rate); in hdmi_set_op_mode()
1838 hdmi_writel(hdmi, 0, FLT_CONFIG0); in hdmi_set_op_mode()
1839 drm_scdc_writeb(hdmi->ddc, 0x31, 0); in hdmi_set_op_mode()
1840 hdmi_modb(hdmi, 0, AVP_DATAPATH_VIDEO_SWDISABLE, GLOBAL_SWDISABLE); in hdmi_set_op_mode()
1845 hdmi_modb(hdmi, PKTSCHED_NULL_TX_EN, PKTSCHED_NULL_TX_EN, PKTSCHED_PKT_EN); in hdmi_set_op_mode()
1847 hdmi_modb(hdmi, 0, PKTSCHED_NULL_TX_EN, PKTSCHED_PKT_EN); in hdmi_set_op_mode()
1855 hdmi_get_tmdsclock(struct dw_hdmi_qp *hdmi, unsigned long mpixelclock) in hdmi_get_tmdsclock() argument
1859 hdmi_bus_fmt_color_depth(hdmi->hdmi_data.enc_out_bus_format); in hdmi_get_tmdsclock()
1861 if (!hdmi_bus_fmt_is_yuv422(hdmi->hdmi_data.enc_out_bus_format)) { in hdmi_get_tmdsclock()
1880 static int dw_hdmi_qp_setup(struct dw_hdmi_qp *hdmi, in dw_hdmi_qp_setup() argument
1884 void *data = hdmi->plat_data->phy_data; in dw_hdmi_qp_setup()
1885 struct hdmi_vmode_qp *vmode = &hdmi->hdmi_data.video_mode; in dw_hdmi_qp_setup()
1889 hdmi->vic = drm_match_cea_mode(mode); in dw_hdmi_qp_setup()
1890 if (!hdmi->vic) in dw_hdmi_qp_setup()
1891 dev_dbg(hdmi->dev, "Non-CEA mode used in HDMI\n"); in dw_hdmi_qp_setup()
1893 dev_dbg(hdmi->dev, "CEA mode used vic=%d\n", hdmi->vic); in dw_hdmi_qp_setup()
1895 if (hdmi->plat_data->get_enc_out_encoding) in dw_hdmi_qp_setup()
1896 hdmi->hdmi_data.enc_out_encoding = in dw_hdmi_qp_setup()
1897 hdmi->plat_data->get_enc_out_encoding(data); in dw_hdmi_qp_setup()
1898 else if ((hdmi->vic == 6) || (hdmi->vic == 7) || in dw_hdmi_qp_setup()
1899 (hdmi->vic == 21) || (hdmi->vic == 22) || in dw_hdmi_qp_setup()
1900 (hdmi->vic == 2) || (hdmi->vic == 3) || in dw_hdmi_qp_setup()
1901 (hdmi->vic == 17) || (hdmi->vic == 18)) in dw_hdmi_qp_setup()
1902 hdmi->hdmi_data.enc_out_encoding = V4L2_YCBCR_ENC_601; in dw_hdmi_qp_setup()
1904 hdmi->hdmi_data.enc_out_encoding = V4L2_YCBCR_ENC_709; in dw_hdmi_qp_setup()
1907 hdmi->hdmi_data.video_mode.mpixelrepetitionoutput = 1; in dw_hdmi_qp_setup()
1908 hdmi->hdmi_data.video_mode.mpixelrepetitioninput = 1; in dw_hdmi_qp_setup()
1910 hdmi->hdmi_data.video_mode.mpixelrepetitionoutput = 0; in dw_hdmi_qp_setup()
1911 hdmi->hdmi_data.video_mode.mpixelrepetitioninput = 0; in dw_hdmi_qp_setup()
1915 if (hdmi->plat_data->get_input_bus_format) in dw_hdmi_qp_setup()
1916 hdmi->hdmi_data.enc_in_bus_format = in dw_hdmi_qp_setup()
1917 hdmi->plat_data->get_input_bus_format(data); in dw_hdmi_qp_setup()
1918 else if (hdmi->plat_data->input_bus_format) in dw_hdmi_qp_setup()
1919 hdmi->hdmi_data.enc_in_bus_format = in dw_hdmi_qp_setup()
1920 hdmi->plat_data->input_bus_format; in dw_hdmi_qp_setup()
1922 hdmi->hdmi_data.enc_in_bus_format = MEDIA_BUS_FMT_RGB888_1X24; in dw_hdmi_qp_setup()
1925 if (hdmi->plat_data->get_output_bus_format) in dw_hdmi_qp_setup()
1926 hdmi->hdmi_data.enc_out_bus_format = in dw_hdmi_qp_setup()
1927 hdmi->plat_data->get_output_bus_format(data); in dw_hdmi_qp_setup()
1929 hdmi->hdmi_data.enc_out_bus_format = MEDIA_BUS_FMT_RGB888_1X24; in dw_hdmi_qp_setup()
1931 if (hdmi->plat_data->set_prev_bus_format) in dw_hdmi_qp_setup()
1932 hdmi->plat_data->set_prev_bus_format(data, hdmi->hdmi_data.enc_out_bus_format); in dw_hdmi_qp_setup()
1935 if (hdmi->plat_data->get_enc_in_encoding) in dw_hdmi_qp_setup()
1936 hdmi->hdmi_data.enc_in_encoding = in dw_hdmi_qp_setup()
1937 hdmi->plat_data->get_enc_in_encoding(data); in dw_hdmi_qp_setup()
1938 else if (hdmi->plat_data->input_bus_encoding) in dw_hdmi_qp_setup()
1939 hdmi->hdmi_data.enc_in_encoding = in dw_hdmi_qp_setup()
1940 hdmi->plat_data->input_bus_encoding; in dw_hdmi_qp_setup()
1942 hdmi->hdmi_data.enc_in_encoding = V4L2_YCBCR_ENC_DEFAULT; in dw_hdmi_qp_setup()
1944 if (hdmi->plat_data->get_quant_range) in dw_hdmi_qp_setup()
1945 hdmi->hdmi_data.quant_range = in dw_hdmi_qp_setup()
1946 hdmi->plat_data->get_quant_range(data); in dw_hdmi_qp_setup()
1948 hdmi->hdmi_data.quant_range = HDMI_QUANTIZATION_RANGE_DEFAULT; in dw_hdmi_qp_setup()
1950 if (hdmi->plat_data->get_link_cfg) in dw_hdmi_qp_setup()
1951 link_cfg = hdmi->plat_data->get_link_cfg(data); in dw_hdmi_qp_setup()
1955 hdmi->phy.ops->set_mode(hdmi, hdmi->phy.data, HDMI_MODE_FRL_MASK, in dw_hdmi_qp_setup()
1958 if (!hdmi->update && !hdmi->frl_switch && hdmi->plat_data->link_clk_set) in dw_hdmi_qp_setup()
1959 hdmi->plat_data->link_clk_set(data, true); in dw_hdmi_qp_setup()
1962 * According to the dw-hdmi specification 6.4.2 in dw_hdmi_qp_setup()
1967 hdmi->hdmi_data.pix_repet_factor = in dw_hdmi_qp_setup()
1969 hdmi->hdmi_data.video_mode.mdataenablepolarity = true; in dw_hdmi_qp_setup()
1972 if (hdmi->plat_data->split_mode) in dw_hdmi_qp_setup()
1977 dev_dbg(hdmi->dev, "final pixclk = %ld\n", vmode->mpixelclock); in dw_hdmi_qp_setup()
1979 vmode->mtmdsclock = hdmi_get_tmdsclock(hdmi, vmode->mpixelclock); in dw_hdmi_qp_setup()
1980 if (hdmi_bus_fmt_is_yuv420(hdmi->hdmi_data.enc_out_bus_format)) in dw_hdmi_qp_setup()
1982 dev_info(hdmi->dev, "final tmdsclk = %d\n", vmode->mtmdsclock); in dw_hdmi_qp_setup()
1984 if (hdmi->plat_data->set_grf_cfg) in dw_hdmi_qp_setup()
1985 hdmi->plat_data->set_grf_cfg(data); in dw_hdmi_qp_setup()
1987 if (hdmi->sink_has_audio) { in dw_hdmi_qp_setup()
1988 dev_dbg(hdmi->dev, "sink has audio support\n"); in dw_hdmi_qp_setup()
1990 /* HDMI Initialization Step E - Configure audio */ in dw_hdmi_qp_setup()
1991 hdmi_clk_regenerator_update_pixel_clock(hdmi); in dw_hdmi_qp_setup()
1992 hdmi_enable_audio_clk(hdmi, hdmi->audio_enable); in dw_hdmi_qp_setup()
1996 if (hdmi->sink_is_hdmi) { in dw_hdmi_qp_setup()
1999 dev_dbg(hdmi->dev, "%s HDMI mode\n", __func__); in dw_hdmi_qp_setup()
2000 hdmi_modb(hdmi, 0, OPMODE_DVI, LINK_CONFIG0); in dw_hdmi_qp_setup()
2001 hdmi_modb(hdmi, HDCP2_BYPASS, HDCP2_BYPASS, HDCP2LOGIC_CONFIG0); in dw_hdmi_qp_setup()
2002 hdmi_modb(hdmi, KEEPOUT_REKEY_ALWAYS, KEEPOUT_REKEY_CFG, FRAME_COMPOSER_CONFIG9); in dw_hdmi_qp_setup()
2004 if (!link_cfg->frl_mode && dw_hdmi_support_scdc(hdmi, &connector->display_info) && in dw_hdmi_qp_setup()
2005 !hdmi->update) { in dw_hdmi_qp_setup()
2007 drm_scdc_readb(hdmi->ddc, SCDC_SINK_VERSION, &bytes); in dw_hdmi_qp_setup()
2008 drm_scdc_writeb(hdmi->ddc, SCDC_SOURCE_VERSION, in dw_hdmi_qp_setup()
2010 drm_scdc_set_high_tmds_clock_ratio(hdmi->ddc, 1); in dw_hdmi_qp_setup()
2011 drm_scdc_set_scrambling(hdmi->ddc, 1); in dw_hdmi_qp_setup()
2012 hdmi_writel(hdmi, 1, SCRAMB_CONFIG0); in dw_hdmi_qp_setup()
2016 drm_scdc_set_high_tmds_clock_ratio(hdmi->ddc, 0); in dw_hdmi_qp_setup()
2017 drm_scdc_set_scrambling(hdmi->ddc, 0); in dw_hdmi_qp_setup()
2018 hdmi_writel(hdmi, 0, SCRAMB_CONFIG0); in dw_hdmi_qp_setup()
2021 /* HDMI Initialization Step F - Configure AVI InfoFrame */ in dw_hdmi_qp_setup()
2022 hdmi_config_AVI(hdmi, connector, mode); in dw_hdmi_qp_setup()
2023 hdmi_config_vendor_specific_infoframe(hdmi, connector, mode); in dw_hdmi_qp_setup()
2024 hdmi_config_CVTEM(hdmi); in dw_hdmi_qp_setup()
2025 hdmi_config_drm_infoframe(hdmi, connector); in dw_hdmi_qp_setup()
2026 ret = hdmi_set_op_mode(hdmi, link_cfg, connector); in dw_hdmi_qp_setup()
2028 dev_err(hdmi->dev, "%s hdmi set operation mode failed\n", __func__); in dw_hdmi_qp_setup()
2029 hdmi->frl_switch = false; in dw_hdmi_qp_setup()
2033 hdmi_modb(hdmi, HDCP2_BYPASS, HDCP2_BYPASS, HDCP2LOGIC_CONFIG0); in dw_hdmi_qp_setup()
2034 hdmi_modb(hdmi, OPMODE_DVI, OPMODE_DVI, LINK_CONFIG0); in dw_hdmi_qp_setup()
2035 hdmi_writel(hdmi, 2, PKTSCHED_PKT_CONTROL0); in dw_hdmi_qp_setup()
2036 hdmi_modb(hdmi, PKTSCHED_GCP_TX_EN, PKTSCHED_GCP_TX_EN, PKTSCHED_PKT_EN); in dw_hdmi_qp_setup()
2037 hdmi->phy.ops->init(hdmi, hdmi->phy.data, &hdmi->previous_mode); in dw_hdmi_qp_setup()
2038 dev_info(hdmi->dev, "%s DVI mode\n", __func__); in dw_hdmi_qp_setup()
2041 hdmi->frl_switch = false; in dw_hdmi_qp_setup()
2048 struct dw_hdmi_qp *hdmi = in dw_hdmi_connector_detect() local
2053 mutex_lock(&hdmi->mutex); in dw_hdmi_connector_detect()
2054 hdmi->force = DRM_FORCE_UNSPECIFIED; in dw_hdmi_connector_detect()
2055 mutex_unlock(&hdmi->mutex); in dw_hdmi_connector_detect()
2057 if (hdmi->panel) in dw_hdmi_connector_detect()
2060 if (hdmi->plat_data->left) in dw_hdmi_connector_detect()
2061 secondary = hdmi->plat_data->left; in dw_hdmi_connector_detect()
2062 else if (hdmi->plat_data->right) in dw_hdmi_connector_detect()
2063 secondary = hdmi->plat_data->right; in dw_hdmi_connector_detect()
2065 result = hdmi->phy.ops->read_hpd(hdmi, hdmi->phy.data); in dw_hdmi_connector_detect()
2083 struct dw_hdmi_qp *hdmi = container_of(connector, struct dw_hdmi_qp, in dw_hdmi_update_hdr_property() local
2085 void *data = hdmi->plat_data->phy_data; in dw_hdmi_update_hdr_property()
2093 if (hdmi->plat_data->get_hdr_property) in dw_hdmi_update_hdr_property()
2094 property = hdmi->plat_data->get_hdr_property(data); in dw_hdmi_update_hdr_property()
2098 if (hdmi->plat_data->get_hdr_blob) in dw_hdmi_update_hdr_property()
2099 blob = hdmi->plat_data->get_hdr_blob(data); in dw_hdmi_update_hdr_property()
2108 static bool dw_hdmi_qp_check_output_type_changed(struct dw_hdmi_qp *hdmi) in dw_hdmi_qp_check_output_type_changed() argument
2112 sink_hdmi = hdmi->sink_is_hdmi; in dw_hdmi_qp_check_output_type_changed()
2114 if (hdmi->force_output == 1) in dw_hdmi_qp_check_output_type_changed()
2115 hdmi->sink_is_hdmi = true; in dw_hdmi_qp_check_output_type_changed()
2116 else if (hdmi->force_output == 2) in dw_hdmi_qp_check_output_type_changed()
2117 hdmi->sink_is_hdmi = false; in dw_hdmi_qp_check_output_type_changed()
2119 hdmi->sink_is_hdmi = hdmi->support_hdmi; in dw_hdmi_qp_check_output_type_changed()
2121 if (sink_hdmi != hdmi->sink_is_hdmi) in dw_hdmi_qp_check_output_type_changed()
2129 struct dw_hdmi_qp *hdmi = in dw_hdmi_connector_get_modes() local
2136 void *data = hdmi->plat_data->phy_data; in dw_hdmi_connector_get_modes()
2139 if (hdmi->panel) in dw_hdmi_connector_get_modes()
2140 return drm_panel_get_modes(hdmi->panel, connector); in dw_hdmi_connector_get_modes()
2142 if (!hdmi->ddc) in dw_hdmi_connector_get_modes()
2146 edid = drm_get_edid(connector, hdmi->ddc); in dw_hdmi_connector_get_modes()
2148 dev_dbg(hdmi->dev, "got edid: width[%d] x height[%d]\n", in dw_hdmi_connector_get_modes()
2151 hdmi->support_hdmi = drm_detect_hdmi_monitor(edid); in dw_hdmi_connector_get_modes()
2152 hdmi->sink_has_audio = drm_detect_monitor_audio(edid); in dw_hdmi_connector_get_modes()
2154 if (hdmi->cec_notifier) in dw_hdmi_connector_get_modes()
2155 cec_notifier_set_phys_addr_from_edid(hdmi->cec_notifier, edid); in dw_hdmi_connector_get_modes()
2156 if (hdmi->plat_data->get_edid_dsc_info) in dw_hdmi_connector_get_modes()
2157 hdmi->plat_data->get_edid_dsc_info(data, edid); in dw_hdmi_connector_get_modes()
2159 if (hdmi->plat_data->get_colorimetry) in dw_hdmi_connector_get_modes()
2160 hdmi->plat_data->get_colorimetry(data, edid); in dw_hdmi_connector_get_modes()
2161 if (hdmi->plat_data->get_yuv422_format) in dw_hdmi_connector_get_modes()
2162 hdmi->plat_data->get_yuv422_format(connector, edid); in dw_hdmi_connector_get_modes()
2164 if (ret > 0 && hdmi->plat_data->split_mode) { in dw_hdmi_connector_get_modes()
2168 if (hdmi->plat_data->left) in dw_hdmi_connector_get_modes()
2169 secondary = hdmi->plat_data->left; in dw_hdmi_connector_get_modes()
2170 else if (hdmi->plat_data->right) in dw_hdmi_connector_get_modes()
2171 secondary = hdmi->plat_data->right; in dw_hdmi_connector_get_modes()
2178 hdmi->plat_data->convert_to_split_mode(mode); in dw_hdmi_connector_get_modes()
2190 hdmi->support_hdmi = true; in dw_hdmi_connector_get_modes()
2191 hdmi->sink_has_audio = true; in dw_hdmi_connector_get_modes()
2193 if (hdmi->plat_data->split_mode) { in dw_hdmi_connector_get_modes()
2194 if (hdmi->plat_data->left) { in dw_hdmi_connector_get_modes()
2195 hdmi->plat_data->left->sink_is_hdmi = true; in dw_hdmi_connector_get_modes()
2196 hdmi->plat_data->left->sink_has_audio = true; in dw_hdmi_connector_get_modes()
2197 } else if (hdmi->plat_data->right) { in dw_hdmi_connector_get_modes()
2198 hdmi->plat_data->right->sink_is_hdmi = true; in dw_hdmi_connector_get_modes()
2199 hdmi->plat_data->right->sink_has_audio = true; in dw_hdmi_connector_get_modes()
2215 if (ret > 0 && hdmi->plat_data->split_mode) { in dw_hdmi_connector_get_modes()
2219 hdmi->plat_data->convert_to_split_mode(mode); in dw_hdmi_connector_get_modes()
2222 info->hdmi.y420_dc_modes = 0; in dw_hdmi_connector_get_modes()
2225 dev_info(hdmi->dev, "failed to get edid\n"); in dw_hdmi_connector_get_modes()
2227 dw_hdmi_qp_check_output_type_changed(hdmi); in dw_hdmi_connector_get_modes()
2232 void dw_hdmi_qp_set_allm_enable(struct dw_hdmi_qp *hdmi, bool enable) in dw_hdmi_qp_set_allm_enable() argument
2237 if (!hdmi || !hdmi->curr_conn) in dw_hdmi_qp_set_allm_enable()
2240 data = hdmi->plat_data->phy_data; in dw_hdmi_qp_set_allm_enable()
2242 if (hdmi->plat_data->get_link_cfg) in dw_hdmi_qp_set_allm_enable()
2243 link_cfg = hdmi->plat_data->get_link_cfg(data); in dw_hdmi_qp_set_allm_enable()
2248 if (enable == hdmi->allm_enable) in dw_hdmi_qp_set_allm_enable()
2251 hdmi->allm_enable = enable; in dw_hdmi_qp_set_allm_enable()
2254 hdmi->allm_enable = false; in dw_hdmi_qp_set_allm_enable()
2255 dev_err(hdmi->dev, "sink don't support allm, allm won't be enabled\n"); in dw_hdmi_qp_set_allm_enable()
2259 hdmi_config_vendor_specific_infoframe(hdmi, hdmi->curr_conn, &hdmi->previous_mode); in dw_hdmi_qp_set_allm_enable()
2269 struct dw_hdmi_qp *hdmi = in dw_hdmi_atomic_connector_set_property() local
2271 const struct dw_hdmi_property_ops *ops = hdmi->plat_data->property_ops; in dw_hdmi_atomic_connector_set_property()
2275 val, hdmi->plat_data->phy_data); in dw_hdmi_atomic_connector_set_property()
2286 struct dw_hdmi_qp *hdmi = in dw_hdmi_atomic_connector_get_property() local
2288 const struct dw_hdmi_property_ops *ops = hdmi->plat_data->property_ops; in dw_hdmi_atomic_connector_get_property()
2292 val, hdmi->plat_data->phy_data); in dw_hdmi_atomic_connector_get_property()
2305 static void dw_hdmi_attach_properties(struct dw_hdmi_qp *hdmi) in dw_hdmi_attach_properties() argument
2310 hdmi->plat_data->property_ops; in dw_hdmi_attach_properties()
2311 void *data = hdmi->plat_data->phy_data; in dw_hdmi_attach_properties()
2313 hdmi->phy.ops->read_hpd(hdmi, hdmi->phy.data); in dw_hdmi_attach_properties()
2316 hdmi->initialized) { in dw_hdmi_attach_properties()
2317 if (hdmi->plat_data->get_grf_color_fmt) in dw_hdmi_attach_properties()
2318 color = hdmi->plat_data->get_grf_color_fmt(data); in dw_hdmi_attach_properties()
2320 val = (hdmi_readl(hdmi, PKT_VSI_CONTENTS1) >> 8) & 0xffffff; in dw_hdmi_attach_properties()
2322 hdmi->allm_enable = true; in dw_hdmi_attach_properties()
2324 hdmi->allm_enable = false; in dw_hdmi_attach_properties()
2328 * Because all hdmi registers are configured the same value in dw_hdmi_attach_properties()
2333 !(hdmi_readl(hdmi, VIDEO_INTERFACE_CONFIG0) & BIT(20))) in dw_hdmi_attach_properties()
2337 return ops->attach_properties(&hdmi->connector, color, 0, in dw_hdmi_attach_properties()
2338 hdmi->plat_data->phy_data, hdmi->allm_enable); in dw_hdmi_attach_properties()
2341 static void dw_hdmi_destroy_properties(struct dw_hdmi_qp *hdmi) in dw_hdmi_destroy_properties() argument
2344 hdmi->plat_data->property_ops; in dw_hdmi_destroy_properties()
2347 return ops->destroy_properties(&hdmi->connector, in dw_hdmi_destroy_properties()
2348 hdmi->plat_data->phy_data); in dw_hdmi_destroy_properties()
2354 struct dw_hdmi_qp *hdmi = in dw_hdmi_connector_best_encoder() local
2357 return hdmi->bridge.encoder; in dw_hdmi_connector_best_encoder()
2363 struct dw_hdmi_qp *hdmi = in dw_hdmi_color_changed() local
2365 void *data = hdmi->plat_data->phy_data; in dw_hdmi_color_changed()
2372 if (hdmi->plat_data->get_color_changed) in dw_hdmi_color_changed()
2373 ret = hdmi->plat_data->get_color_changed(data); in dw_hdmi_color_changed()
2381 static bool hdr_metadata_equal(struct dw_hdmi_qp *hdmi, const struct drm_connector_state *old_state, in hdr_metadata_equal() argument
2389 hdmi->hdr2sdr = false; in hdr_metadata_equal()
2427 hdmi->hdr2sdr = true; in hdr_metadata_equal()
2435 struct dw_hdmi_qp *hdmi) in check_hdr_color_change() argument
2437 void *data = hdmi->plat_data->phy_data; in check_hdr_color_change()
2439 if (!hdr_metadata_equal(hdmi, old_state, new_state)) { in check_hdr_color_change()
2440 hdmi->plat_data->check_hdr_color_change(new_state, data); in check_hdr_color_change()
2457 struct dw_hdmi_qp *hdmi = in dw_hdmi_connector_atomic_check() local
2460 void *data = hdmi->plat_data->phy_data; in dw_hdmi_connector_atomic_check()
2461 struct hdmi_vmode_qp *vmode = &hdmi->hdmi_data.video_mode; in dw_hdmi_connector_atomic_check()
2468 if (hdmi->plat_data->get_vp_id) in dw_hdmi_connector_atomic_check()
2469 hdmi->old_vp_id = hdmi->plat_data->get_vp_id(old_crtc_state); in dw_hdmi_connector_atomic_check()
2479 if (hdmi->plat_data->get_vp_id) in dw_hdmi_connector_atomic_check()
2480 hdmi->vp_id = hdmi->plat_data->get_vp_id(crtc_state); in dw_hdmi_connector_atomic_check()
2484 * If HDMI is enabled in uboot, it's need to record in dw_hdmi_connector_atomic_check()
2491 if (hdmi->plat_data->left) in dw_hdmi_connector_atomic_check()
2492 secondary = hdmi->plat_data->left; in dw_hdmi_connector_atomic_check()
2493 else if (hdmi->plat_data->right) in dw_hdmi_connector_atomic_check()
2494 secondary = hdmi->plat_data->right; in dw_hdmi_connector_atomic_check()
2495 hdmi->curr_conn = connector; in dw_hdmi_connector_atomic_check()
2498 if (hdmi->plat_data->get_enc_in_encoding) in dw_hdmi_connector_atomic_check()
2499 hdmi->hdmi_data.enc_in_encoding = in dw_hdmi_connector_atomic_check()
2500 hdmi->plat_data->get_enc_in_encoding(data); in dw_hdmi_connector_atomic_check()
2501 if (hdmi->plat_data->get_enc_out_encoding) in dw_hdmi_connector_atomic_check()
2502 hdmi->hdmi_data.enc_out_encoding = in dw_hdmi_connector_atomic_check()
2503 hdmi->plat_data->get_enc_out_encoding(data); in dw_hdmi_connector_atomic_check()
2504 if (hdmi->plat_data->get_input_bus_format) in dw_hdmi_connector_atomic_check()
2505 hdmi->hdmi_data.enc_in_bus_format = in dw_hdmi_connector_atomic_check()
2506 hdmi->plat_data->get_input_bus_format(data); in dw_hdmi_connector_atomic_check()
2507 if (hdmi->plat_data->get_output_bus_format) in dw_hdmi_connector_atomic_check()
2508 hdmi->hdmi_data.enc_out_bus_format = in dw_hdmi_connector_atomic_check()
2509 hdmi->plat_data->get_output_bus_format(data); in dw_hdmi_connector_atomic_check()
2511 if (hdmi->plat_data->split_mode) { in dw_hdmi_connector_atomic_check()
2512 hdmi->plat_data->convert_to_origin_mode(&mode); in dw_hdmi_connector_atomic_check()
2515 memcpy(&hdmi->previous_mode, &mode, sizeof(hdmi->previous_mode)); in dw_hdmi_connector_atomic_check()
2519 vmode->mtmdsclock = hdmi_get_tmdsclock(hdmi, in dw_hdmi_connector_atomic_check()
2521 if (hdmi_bus_fmt_is_yuv420(hdmi->hdmi_data.enc_out_bus_format)) in dw_hdmi_connector_atomic_check()
2526 * but atomic_disable will be called when hdmi plug out. in dw_hdmi_connector_atomic_check()
2531 if (hdmi->initialized && !hdmi->dclk_en) { in dw_hdmi_connector_atomic_check()
2532 mutex_lock(&hdmi->audio_mutex); in dw_hdmi_connector_atomic_check()
2533 if (hdmi->plat_data->dclk_set) in dw_hdmi_connector_atomic_check()
2534 hdmi->plat_data->dclk_set(data, true, hdmi->vp_id); in dw_hdmi_connector_atomic_check()
2535 hdmi->dclk_en = true; in dw_hdmi_connector_atomic_check()
2536 mutex_unlock(&hdmi->audio_mutex); in dw_hdmi_connector_atomic_check()
2537 hdmi->curr_conn = connector; in dw_hdmi_connector_atomic_check()
2538 extcon_set_state_sync(hdmi->extcon, EXTCON_DISP_HDMI, true); in dw_hdmi_connector_atomic_check()
2541 drm_scdc_readb(hdmi->ddc, SCDC_TMDS_CONFIG, &val); in dw_hdmi_connector_atomic_check()
2542 /* if plug out before hdmi bind, reset hdmi */ in dw_hdmi_connector_atomic_check()
2545 hdmi->logo_plug_out = true; in dw_hdmi_connector_atomic_check()
2548 if (check_hdr_color_change(old_state, new_state, hdmi) || hdmi->logo_plug_out || in dw_hdmi_connector_atomic_check()
2556 if (hdmi->plat_data->update_color_format) in dw_hdmi_connector_atomic_check()
2557 hdmi->plat_data->update_color_format(new_state, data); in dw_hdmi_connector_atomic_check()
2558 if (hdmi->plat_data->get_enc_in_encoding) in dw_hdmi_connector_atomic_check()
2559 hdmi->hdmi_data.enc_in_encoding = in dw_hdmi_connector_atomic_check()
2560 hdmi->plat_data->get_enc_in_encoding(data); in dw_hdmi_connector_atomic_check()
2561 if (hdmi->plat_data->get_enc_out_encoding) in dw_hdmi_connector_atomic_check()
2562 hdmi->hdmi_data.enc_out_encoding = in dw_hdmi_connector_atomic_check()
2563 hdmi->plat_data->get_enc_out_encoding(data); in dw_hdmi_connector_atomic_check()
2564 if (hdmi->plat_data->get_input_bus_format) in dw_hdmi_connector_atomic_check()
2565 hdmi->hdmi_data.enc_in_bus_format = in dw_hdmi_connector_atomic_check()
2566 hdmi->plat_data->get_input_bus_format(data); in dw_hdmi_connector_atomic_check()
2567 if (hdmi->plat_data->get_output_bus_format) in dw_hdmi_connector_atomic_check()
2568 hdmi->hdmi_data.enc_out_bus_format = in dw_hdmi_connector_atomic_check()
2569 hdmi->plat_data->get_output_bus_format(data); in dw_hdmi_connector_atomic_check()
2571 mtmdsclk = hdmi_get_tmdsclock(hdmi, mode.clock); in dw_hdmi_connector_atomic_check()
2572 if (hdmi_bus_fmt_is_yuv420(hdmi->hdmi_data.enc_out_bus_format)) in dw_hdmi_connector_atomic_check()
2575 if (hdmi->hdmi_data.video_mode.mpixelclock == (mode.clock * 1000) && in dw_hdmi_connector_atomic_check()
2576 hdmi->hdmi_data.video_mode.mtmdsclock == (mtmdsclk * 1000) && in dw_hdmi_connector_atomic_check()
2577 mode.clock <= 600000 && !hdmi->disabled && !hdmi->logo_plug_out) { in dw_hdmi_connector_atomic_check()
2578 hdmi->update = true; in dw_hdmi_connector_atomic_check()
2579 hdmi_writel(hdmi, 1, PKTSCHED_PKT_CONTROL0); in dw_hdmi_connector_atomic_check()
2580 hdmi_modb(hdmi, PKTSCHED_GCP_TX_EN, PKTSCHED_GCP_TX_EN, PKTSCHED_PKT_EN); in dw_hdmi_connector_atomic_check()
2582 } else if (!hdmi->disabled) { in dw_hdmi_connector_atomic_check()
2584 hdmi->frl_switch = true; in dw_hdmi_connector_atomic_check()
2585 hdmi->update = false; in dw_hdmi_connector_atomic_check()
2587 hdmi->logo_plug_out = false; in dw_hdmi_connector_atomic_check()
2597 struct dw_hdmi_qp *hdmi = in dw_hdmi_connector_atomic_commit() local
2600 if (hdmi->update) { in dw_hdmi_connector_atomic_commit()
2601 dw_hdmi_qp_setup(hdmi, hdmi->curr_conn, &hdmi->previous_mode); in dw_hdmi_connector_atomic_commit()
2603 hdmi_writel(hdmi, 2, PKTSCHED_PKT_CONTROL0); in dw_hdmi_connector_atomic_commit()
2604 hdmi->update = false; in dw_hdmi_connector_atomic_commit()
2608 void dw_hdmi_qp_set_output_type(struct dw_hdmi_qp *hdmi, u64 val) in dw_hdmi_qp_set_output_type() argument
2610 hdmi->force_output = val; in dw_hdmi_qp_set_output_type()
2612 if (!dw_hdmi_qp_check_output_type_changed(hdmi)) in dw_hdmi_qp_set_output_type()
2615 if (hdmi->disabled) in dw_hdmi_qp_set_output_type()
2618 if (!hdmi->sink_is_hdmi) in dw_hdmi_qp_set_output_type()
2619 hdmi_modb(hdmi, OPMODE_DVI, OPMODE_DVI, LINK_CONFIG0); in dw_hdmi_qp_set_output_type()
2621 hdmi_modb(hdmi, 0, OPMODE_DVI, LINK_CONFIG0); in dw_hdmi_qp_set_output_type()
2625 bool dw_hdmi_qp_get_output_whether_hdmi(struct dw_hdmi_qp *hdmi) in dw_hdmi_qp_get_output_whether_hdmi() argument
2627 return hdmi->sink_is_hdmi; in dw_hdmi_qp_get_output_whether_hdmi()
2631 int dw_hdmi_qp_get_output_type_cap(struct dw_hdmi_qp *hdmi) in dw_hdmi_qp_get_output_type_cap() argument
2633 return hdmi->support_hdmi; in dw_hdmi_qp_get_output_type_cap()
2639 struct dw_hdmi_qp *hdmi = in dw_hdmi_connector_force() local
2642 mutex_lock(&hdmi->mutex); in dw_hdmi_connector_force()
2644 if (hdmi->force != connector->force) { in dw_hdmi_connector_force()
2645 if (!hdmi->disabled && connector->force == DRM_FORCE_OFF) in dw_hdmi_connector_force()
2646 extcon_set_state_sync(hdmi->extcon, EXTCON_DISP_HDMI, in dw_hdmi_connector_force()
2648 else if (hdmi->disabled && connector->force == DRM_FORCE_ON) in dw_hdmi_connector_force()
2649 extcon_set_state_sync(hdmi->extcon, EXTCON_DISP_HDMI, in dw_hdmi_connector_force()
2653 hdmi->force = connector->force; in dw_hdmi_connector_force()
2654 mutex_unlock(&hdmi->mutex); in dw_hdmi_connector_force()
2680 struct dw_hdmi_qp *hdmi = bridge->driver_private; in dw_hdmi_qp_bridge_attach() local
2682 struct drm_connector *connector = &hdmi->connector; in dw_hdmi_qp_bridge_attach()
2698 dw_hdmi_attach_properties(hdmi); in dw_hdmi_qp_bridge_attach()
2700 if (hdmi->cec_enable) { in dw_hdmi_qp_bridge_attach()
2702 notifier = cec_notifier_conn_register(hdmi->dev, NULL, &conn_info); in dw_hdmi_qp_bridge_attach()
2706 mutex_lock(&hdmi->cec_notifier_mutex); in dw_hdmi_qp_bridge_attach()
2707 hdmi->cec_notifier = notifier; in dw_hdmi_qp_bridge_attach()
2708 mutex_unlock(&hdmi->cec_notifier_mutex); in dw_hdmi_qp_bridge_attach()
2716 struct dw_hdmi_qp *hdmi = bridge->driver_private; in dw_hdmi_qp_bridge_detach() local
2718 if (hdmi->cec_notifier) { in dw_hdmi_qp_bridge_detach()
2719 mutex_lock(&hdmi->cec_notifier_mutex); in dw_hdmi_qp_bridge_detach()
2720 cec_notifier_conn_unregister(hdmi->cec_notifier); in dw_hdmi_qp_bridge_detach()
2721 hdmi->cec_notifier = NULL; in dw_hdmi_qp_bridge_detach()
2722 mutex_unlock(&hdmi->cec_notifier_mutex); in dw_hdmi_qp_bridge_detach()
2741 struct dw_hdmi_qp *hdmi = bridge->driver_private; in dw_hdmi_qp_bridge_mode_set() local
2743 mutex_lock(&hdmi->mutex); in dw_hdmi_qp_bridge_mode_set()
2746 hdmi->frl_switch = false; in dw_hdmi_qp_bridge_mode_set()
2748 memcpy(&hdmi->previous_mode, mode, sizeof(hdmi->previous_mode)); in dw_hdmi_qp_bridge_mode_set()
2749 if (hdmi->plat_data->split_mode) in dw_hdmi_qp_bridge_mode_set()
2750 hdmi->plat_data->convert_to_origin_mode(&hdmi->previous_mode); in dw_hdmi_qp_bridge_mode_set()
2752 mutex_unlock(&hdmi->mutex); in dw_hdmi_qp_bridge_mode_set()
2758 struct dw_hdmi_qp *hdmi = bridge->driver_private; in dw_hdmi_qp_bridge_atomic_disable() local
2759 void *data = hdmi->plat_data->phy_data; in dw_hdmi_qp_bridge_atomic_disable()
2761 if (hdmi->panel) in dw_hdmi_qp_bridge_atomic_disable()
2762 drm_panel_disable(hdmi->panel); in dw_hdmi_qp_bridge_atomic_disable()
2765 hdmi_writel(hdmi, 1, PKTSCHED_PKT_CONTROL0); in dw_hdmi_qp_bridge_atomic_disable()
2768 extcon_set_state_sync(hdmi->extcon, EXTCON_DISP_HDMI, false); in dw_hdmi_qp_bridge_atomic_disable()
2769 handle_plugged_change(hdmi, false); in dw_hdmi_qp_bridge_atomic_disable()
2770 mutex_lock(&hdmi->mutex); in dw_hdmi_qp_bridge_atomic_disable()
2772 if (hdmi->dclk_en) { in dw_hdmi_qp_bridge_atomic_disable()
2773 mutex_lock(&hdmi->audio_mutex); in dw_hdmi_qp_bridge_atomic_disable()
2774 if (hdmi->plat_data->dclk_set) in dw_hdmi_qp_bridge_atomic_disable()
2775 hdmi->plat_data->dclk_set(data, false, hdmi->old_vp_id); in dw_hdmi_qp_bridge_atomic_disable()
2776 hdmi->dclk_en = false; in dw_hdmi_qp_bridge_atomic_disable()
2777 mutex_unlock(&hdmi->audio_mutex); in dw_hdmi_qp_bridge_atomic_disable()
2780 if (hdmi->phy.ops->disable && !hdmi->frl_switch) { in dw_hdmi_qp_bridge_atomic_disable()
2781 hdmi_writel(hdmi, 0, FLT_CONFIG0); in dw_hdmi_qp_bridge_atomic_disable()
2782 hdmi_writel(hdmi, 0, SCRAMB_CONFIG0); in dw_hdmi_qp_bridge_atomic_disable()
2784 if (hdmi->curr_conn && dw_hdmi_support_scdc(hdmi, &hdmi->curr_conn->display_info)) in dw_hdmi_qp_bridge_atomic_disable()
2785 drm_scdc_writeb(hdmi->ddc, 0x31, 0); in dw_hdmi_qp_bridge_atomic_disable()
2787 hdmi->phy.ops->disable(hdmi, hdmi->phy.data); in dw_hdmi_qp_bridge_atomic_disable()
2788 hdmi->disabled = true; in dw_hdmi_qp_bridge_atomic_disable()
2789 if (hdmi->plat_data->link_clk_set) in dw_hdmi_qp_bridge_atomic_disable()
2790 hdmi->plat_data->link_clk_set(data, false); in dw_hdmi_qp_bridge_atomic_disable()
2793 hdmi->curr_conn = NULL; in dw_hdmi_qp_bridge_atomic_disable()
2794 mutex_unlock(&hdmi->mutex); in dw_hdmi_qp_bridge_atomic_disable()
2796 if (hdmi->panel) in dw_hdmi_qp_bridge_atomic_disable()
2797 drm_panel_unprepare(hdmi->panel); in dw_hdmi_qp_bridge_atomic_disable()
2803 struct dw_hdmi_qp *hdmi = bridge->driver_private; in dw_hdmi_qp_bridge_atomic_enable() local
2806 void *data = hdmi->plat_data->phy_data; in dw_hdmi_qp_bridge_atomic_enable()
2808 if (hdmi->panel) in dw_hdmi_qp_bridge_atomic_enable()
2809 drm_panel_prepare(hdmi->panel); in dw_hdmi_qp_bridge_atomic_enable()
2814 mutex_lock(&hdmi->mutex); in dw_hdmi_qp_bridge_atomic_enable()
2815 hdmi->curr_conn = connector; in dw_hdmi_qp_bridge_atomic_enable()
2817 dw_hdmi_qp_setup(hdmi, hdmi->curr_conn, &hdmi->previous_mode); in dw_hdmi_qp_bridge_atomic_enable()
2818 hdmi_writel(hdmi, 2, PKTSCHED_PKT_CONTROL0); in dw_hdmi_qp_bridge_atomic_enable()
2819 hdmi_modb(hdmi, PKTSCHED_GCP_TX_EN, PKTSCHED_GCP_TX_EN, PKTSCHED_PKT_EN); in dw_hdmi_qp_bridge_atomic_enable()
2820 mutex_unlock(&hdmi->mutex); in dw_hdmi_qp_bridge_atomic_enable()
2822 if (!hdmi->dclk_en) { in dw_hdmi_qp_bridge_atomic_enable()
2823 mutex_lock(&hdmi->audio_mutex); in dw_hdmi_qp_bridge_atomic_enable()
2824 if (hdmi->plat_data->dclk_set) in dw_hdmi_qp_bridge_atomic_enable()
2825 hdmi->plat_data->dclk_set(data, true, hdmi->vp_id); in dw_hdmi_qp_bridge_atomic_enable()
2826 hdmi->dclk_en = true; in dw_hdmi_qp_bridge_atomic_enable()
2827 mutex_unlock(&hdmi->audio_mutex); in dw_hdmi_qp_bridge_atomic_enable()
2829 dw_hdmi_qp_init_audio_infoframe(hdmi); in dw_hdmi_qp_bridge_atomic_enable()
2830 dw_hdmi_qp_audio_enable(hdmi); in dw_hdmi_qp_bridge_atomic_enable()
2831 hdmi_clk_regenerator_update_pixel_clock(hdmi); in dw_hdmi_qp_bridge_atomic_enable()
2833 extcon_set_state_sync(hdmi->extcon, EXTCON_DISP_HDMI, true); in dw_hdmi_qp_bridge_atomic_enable()
2834 handle_plugged_change(hdmi, true); in dw_hdmi_qp_bridge_atomic_enable()
2836 if (hdmi->panel) in dw_hdmi_qp_bridge_atomic_enable()
2837 drm_panel_enable(hdmi->panel); in dw_hdmi_qp_bridge_atomic_enable()
2852 void dw_hdmi_qp_set_cec_adap(struct dw_hdmi_qp *hdmi, struct cec_adapter *adap) in dw_hdmi_qp_set_cec_adap() argument
2854 hdmi->cec_adap = adap; in dw_hdmi_qp_set_cec_adap()
2860 struct dw_hdmi_qp *hdmi = dev_id; in dw_hdmi_qp_main_hardirq() local
2861 struct dw_hdmi_qp_i2c *i2c = hdmi->i2c; in dw_hdmi_qp_main_hardirq()
2864 stat = hdmi_readl(hdmi, MAINUNIT_1_INT_STATUS); in dw_hdmi_qp_main_hardirq()
2868 hdmi->scdc_intr = stat & (SCDC_UPD_FLAGS_RD_IRQ | in dw_hdmi_qp_main_hardirq()
2873 hdmi->flt_intr = stat & (FLT_EXIT_TO_LTSP_IRQ | in dw_hdmi_qp_main_hardirq()
2877 dev_dbg(hdmi->dev, "i2c main unit irq:%#x\n", stat); in dw_hdmi_qp_main_hardirq()
2879 hdmi_writel(hdmi, i2c->stat, MAINUNIT_1_INT_CLEAR); in dw_hdmi_qp_main_hardirq()
2883 if (hdmi->flt_intr) { in dw_hdmi_qp_main_hardirq()
2884 dev_dbg(hdmi->dev, "i2c flt irq:%#x\n", hdmi->flt_intr); in dw_hdmi_qp_main_hardirq()
2885 hdmi_writel(hdmi, hdmi->flt_intr, MAINUNIT_1_INT_CLEAR); in dw_hdmi_qp_main_hardirq()
2886 complete(&hdmi->flt_cmp); in dw_hdmi_qp_main_hardirq()
2889 if (hdmi->scdc_intr) { in dw_hdmi_qp_main_hardirq()
2892 dev_dbg(hdmi->dev, "i2c scdc irq:%#x\n", hdmi->scdc_intr); in dw_hdmi_qp_main_hardirq()
2893 hdmi_writel(hdmi, hdmi->scdc_intr, MAINUNIT_1_INT_CLEAR); in dw_hdmi_qp_main_hardirq()
2894 val = hdmi_readl(hdmi, SCDC_STATUS0); in dw_hdmi_qp_main_hardirq()
2898 hdmi_modb(hdmi, 0, SCDC_UPD_FLAGS_POLL_EN | in dw_hdmi_qp_main_hardirq()
2900 hdmi_modb(hdmi, 0, SCDC_UPD_FLAGS_RD_IRQ, in dw_hdmi_qp_main_hardirq()
2902 dev_info(hdmi->dev, "frl start\n"); in dw_hdmi_qp_main_hardirq()
2915 struct dw_hdmi_qp *hdmi = dev_id; in dw_hdmi_qp_avp_hardirq() local
2918 stat = hdmi_readl(hdmi, AVP_1_INT_STATUS); in dw_hdmi_qp_avp_hardirq()
2920 dev_dbg(hdmi->dev, "HDCP irq %#x\n", stat); in dw_hdmi_qp_avp_hardirq()
2922 hdmi_writel(hdmi, stat, AVP_1_INT_MASK_N); in dw_hdmi_qp_avp_hardirq()
2931 struct dw_hdmi_qp *hdmi = dev_id; in dw_hdmi_qp_earc_hardirq() local
2934 stat = hdmi_readl(hdmi, EARCRX_0_INT_STATUS); in dw_hdmi_qp_earc_hardirq()
2936 dev_dbg(hdmi->dev, "earc irq %#x\n", stat); in dw_hdmi_qp_earc_hardirq()
2938 hdmi_writel(hdmi, stat, EARCRX_0_INT_MASK_N); in dw_hdmi_qp_earc_hardirq()
2947 struct dw_hdmi_qp *hdmi = dev_id; in dw_hdmi_qp_avp_irq() local
2950 stat = hdmi_readl(hdmi, AVP_1_INT_STATUS); in dw_hdmi_qp_avp_irq()
2955 hdmi_writel(hdmi, stat, AVP_1_INT_CLEAR); in dw_hdmi_qp_avp_irq()
2962 struct dw_hdmi_qp *hdmi = dev_id; in dw_hdmi_qp_earc_irq() local
2965 stat = hdmi_readl(hdmi, EARCRX_0_INT_STATUS); in dw_hdmi_qp_earc_irq()
2970 hdmi_writel(hdmi, stat, EARCRX_0_INT_CLEAR); in dw_hdmi_qp_earc_irq()
2972 hdmi->earc_intr = stat; in dw_hdmi_qp_earc_irq()
2973 complete(&hdmi->earc_cmp); in dw_hdmi_qp_earc_irq()
2978 static int dw_hdmi_detect_phy(struct dw_hdmi_qp *hdmi) in dw_hdmi_detect_phy() argument
2982 phy_type = hdmi->plat_data->phy_force_vendor ? in dw_hdmi_detect_phy()
2987 if (!hdmi->plat_data->qp_phy_ops || !hdmi->plat_data->phy_name) { in dw_hdmi_detect_phy()
2988 dev_err(hdmi->dev, in dw_hdmi_detect_phy()
2989 "Vendor HDMI PHY not supported by glue layer\n"); in dw_hdmi_detect_phy()
2993 hdmi->phy.ops = hdmi->plat_data->qp_phy_ops; in dw_hdmi_detect_phy()
2994 hdmi->phy.data = hdmi->plat_data->phy_data; in dw_hdmi_detect_phy()
2995 hdmi->phy.name = hdmi->plat_data->phy_name; in dw_hdmi_detect_phy()
3001 void dw_hdmi_qp_cec_set_hpd(struct dw_hdmi_qp *hdmi, bool plug_in, bool change) in dw_hdmi_qp_cec_set_hpd() argument
3006 if (!hdmi->cec_notifier) in dw_hdmi_qp_cec_set_hpd()
3010 cec_notifier_set_phys_addr(hdmi->cec_notifier, in dw_hdmi_qp_cec_set_hpd()
3013 if (hdmi->bridge.dev) { in dw_hdmi_qp_cec_set_hpd()
3014 if (change && hdmi->cec_adap && hdmi->cec_adap->devnode.registered) in dw_hdmi_qp_cec_set_hpd()
3015 cec_queue_pin_hpd_event(hdmi->cec_adap, plug_in, ktime_get()); in dw_hdmi_qp_cec_set_hpd()
3016 drm_bridge_hpd_notify(&hdmi->bridge, status); in dw_hdmi_qp_cec_set_hpd()
3021 static void dw_hdmi_qp_cec_enable(struct dw_hdmi_qp *hdmi) in dw_hdmi_qp_cec_enable() argument
3023 mutex_lock(&hdmi->mutex); in dw_hdmi_qp_cec_enable()
3024 hdmi_modb(hdmi, 0, CEC_SWDISABLE, GLOBAL_SWDISABLE); in dw_hdmi_qp_cec_enable()
3025 mutex_unlock(&hdmi->mutex); in dw_hdmi_qp_cec_enable()
3028 static void dw_hdmi_qp_cec_disable(struct dw_hdmi_qp *hdmi) in dw_hdmi_qp_cec_disable() argument
3030 mutex_lock(&hdmi->mutex); in dw_hdmi_qp_cec_disable()
3031 hdmi_modb(hdmi, CEC_SWDISABLE, CEC_SWDISABLE, GLOBAL_SWDISABLE); in dw_hdmi_qp_cec_disable()
3032 mutex_unlock(&hdmi->mutex); in dw_hdmi_qp_cec_disable()
3124 struct dw_hdmi_qp *hdmi = s->private; in dw_hdmi_ctrl_show() local
3132 val = hdmi_readl(hdmi, j); in dw_hdmi_ctrl_show()
3153 struct dw_hdmi_qp *hdmi = in dw_hdmi_ctrl_write() local
3159 dev_err(hdmi->dev, "out of buf range\n"); in dw_hdmi_ctrl_write()
3170 dev_err(hdmi->dev, "it is no a hdmi register\n"); in dw_hdmi_ctrl_write()
3173 dev_info(hdmi->dev, "/**********hdmi register config******/"); in dw_hdmi_ctrl_write()
3174 dev_info(hdmi->dev, "\n reg=%x val=%x\n", reg, val); in dw_hdmi_ctrl_write()
3175 hdmi_writel(hdmi, val, reg); in dw_hdmi_ctrl_write()
3190 struct dw_hdmi_qp *hdmi = s->private; in dw_hdmi_status_show() local
3194 if (hdmi->disabled) { in dw_hdmi_status_show()
3199 if (hdmi->sink_is_hdmi) in dw_hdmi_status_show()
3200 seq_puts(s, "HDMI\n"); in dw_hdmi_status_show()
3204 if (hdmi->hdmi_data.video_mode.mpixelclock > 600000000) { in dw_hdmi_status_show()
3206 hdmi->hdmi_data.video_mode.mpixelclock); in dw_hdmi_status_show()
3208 if (hdmi->hdmi_data.video_mode.mtmdsclock > 340000000) in dw_hdmi_status_show()
3209 val = hdmi->hdmi_data.video_mode.mtmdsclock / 4; in dw_hdmi_status_show()
3211 val = hdmi->hdmi_data.video_mode.mtmdsclock; in dw_hdmi_status_show()
3213 hdmi->hdmi_data.video_mode.mpixelclock, val); in dw_hdmi_status_show()
3215 seq_printf(s, "ALLM: %d\n", hdmi->allm_enable); in dw_hdmi_status_show()
3217 if (hdmi_bus_fmt_is_rgb(hdmi->hdmi_data.enc_out_bus_format)) in dw_hdmi_status_show()
3219 else if (hdmi_bus_fmt_is_yuv444(hdmi->hdmi_data.enc_out_bus_format)) in dw_hdmi_status_show()
3221 else if (hdmi_bus_fmt_is_yuv422(hdmi->hdmi_data.enc_out_bus_format)) in dw_hdmi_status_show()
3223 else if (hdmi_bus_fmt_is_yuv420(hdmi->hdmi_data.enc_out_bus_format)) in dw_hdmi_status_show()
3227 val = hdmi_bus_fmt_color_depth(hdmi->hdmi_data.enc_out_bus_format); in dw_hdmi_status_show()
3230 switch (hdmi->hdmi_data.enc_out_encoding) { in dw_hdmi_status_show()
3247 val = hdmi_readl(hdmi, PKTSCHED_PKT_EN); in dw_hdmi_status_show()
3253 val = hdmi_readl(hdmi, PKT_DRMI_CONTENTS1); in dw_hdmi_status_show()
3273 val = hdmi_readl(hdmi, PKT_DRMI_CONTENTS1); in dw_hdmi_status_show()
3276 val = hdmi_readl(hdmi, PKT_DRMI_CONTENTS2); in dw_hdmi_status_show()
3279 val = hdmi_readl(hdmi, PKT_DRMI_CONTENTS2); in dw_hdmi_status_show()
3282 val = hdmi_readl(hdmi, PKT_DRMI_CONTENTS3); in dw_hdmi_status_show()
3285 val = hdmi_readl(hdmi, PKT_DRMI_CONTENTS3); in dw_hdmi_status_show()
3288 val = hdmi_readl(hdmi, PKT_DRMI_CONTENTS4); in dw_hdmi_status_show()
3291 val = hdmi_readl(hdmi, PKT_DRMI_CONTENTS4); in dw_hdmi_status_show()
3294 val = hdmi_readl(hdmi, PKT_DRMI_CONTENTS5); in dw_hdmi_status_show()
3297 val = hdmi_readl(hdmi, PKT_DRMI_CONTENTS5); in dw_hdmi_status_show()
3300 val = hdmi_readl(hdmi, PKT_DRMI_CONTENTS6); in dw_hdmi_status_show()
3303 val = hdmi_readl(hdmi, PKT_DRMI_CONTENTS6); in dw_hdmi_status_show()
3306 val = hdmi_readl(hdmi, PKT_DRMI_CONTENTS7); in dw_hdmi_status_show()
3325 static void dw_hdmi_register_debugfs(struct device *dev, struct dw_hdmi_qp *hdmi) in dw_hdmi_register_debugfs() argument
3329 snprintf(buf, sizeof(buf), "dw-hdmi%d", hdmi->plat_data->id); in dw_hdmi_register_debugfs()
3330 hdmi->debugfs_dir = debugfs_create_dir(buf, NULL); in dw_hdmi_register_debugfs()
3331 if (IS_ERR(hdmi->debugfs_dir)) { in dw_hdmi_register_debugfs()
3336 debugfs_create_file("status", 0400, hdmi->debugfs_dir, in dw_hdmi_register_debugfs()
3337 hdmi, &dw_hdmi_status_fops); in dw_hdmi_register_debugfs()
3338 debugfs_create_file("ctrl", 0600, hdmi->debugfs_dir, in dw_hdmi_register_debugfs()
3339 hdmi, &dw_hdmi_ctrl_fops); in dw_hdmi_register_debugfs()
3349 struct dw_hdmi_qp *hdmi; in __dw_hdmi_probe() local
3362 hdmi = devm_kzalloc(dev, sizeof(*hdmi), GFP_KERNEL); in __dw_hdmi_probe()
3363 if (!hdmi) in __dw_hdmi_probe()
3366 hdmi->panel = panel; in __dw_hdmi_probe()
3367 hdmi->connector.stereo_allowed = 1; in __dw_hdmi_probe()
3368 hdmi->plat_data = plat_data; in __dw_hdmi_probe()
3369 hdmi->dev = dev; in __dw_hdmi_probe()
3370 hdmi->sample_rate = 48000; in __dw_hdmi_probe()
3371 hdmi->disabled = true; in __dw_hdmi_probe()
3373 mutex_init(&hdmi->mutex); in __dw_hdmi_probe()
3374 mutex_init(&hdmi->audio_mutex); in __dw_hdmi_probe()
3375 mutex_init(&hdmi->cec_notifier_mutex); in __dw_hdmi_probe()
3379 hdmi->ddc = of_get_i2c_adapter_by_node(ddc_node); in __dw_hdmi_probe()
3381 if (!hdmi->ddc) { in __dw_hdmi_probe()
3382 dev_dbg(hdmi->dev, "failed to read ddc node\n"); in __dw_hdmi_probe()
3387 dev_dbg(hdmi->dev, "no ddc property found\n"); in __dw_hdmi_probe()
3396 hdmi->regs = devm_ioremap_resource(dev, iores); in __dw_hdmi_probe()
3397 if (IS_ERR(hdmi->regs)) { in __dw_hdmi_probe()
3398 ret = PTR_ERR(hdmi->regs); in __dw_hdmi_probe()
3402 hdmi->regm = devm_regmap_init_mmio(dev, hdmi->regs, reg_config); in __dw_hdmi_probe()
3403 if (IS_ERR(hdmi->regm)) { in __dw_hdmi_probe()
3405 ret = PTR_ERR(hdmi->regm); in __dw_hdmi_probe()
3409 hdmi->regm = plat_data->regm; in __dw_hdmi_probe()
3412 ret = dw_hdmi_detect_phy(hdmi); in __dw_hdmi_probe()
3416 hdmi_writel(hdmi, 0, MAINUNIT_0_INT_MASK_N); in __dw_hdmi_probe()
3417 hdmi_writel(hdmi, 0, MAINUNIT_1_INT_MASK_N); in __dw_hdmi_probe()
3418 hdmi_writel(hdmi, 428571429, TIMER_BASE_CONFIG0); in __dw_hdmi_probe()
3419 hdmi->logo_plug_out = false; in __dw_hdmi_probe()
3420 if (hdmi->phy.ops->read_hpd(hdmi, hdmi->phy.data) == connector_status_connected && in __dw_hdmi_probe()
3421 hdmi_readl(hdmi, I2CM_INTERFACE_CONTROL0)) { in __dw_hdmi_probe()
3422 hdmi->initialized = true; in __dw_hdmi_probe()
3423 hdmi->disabled = false; in __dw_hdmi_probe()
3426 hdmi->sink_is_hdmi = true; in __dw_hdmi_probe()
3428 /* If DDC bus is not specified, try to register HDMI I2C bus */ in __dw_hdmi_probe()
3429 if (!hdmi->ddc) { in __dw_hdmi_probe()
3430 hdmi->ddc = dw_hdmi_i2c_adapter(hdmi); in __dw_hdmi_probe()
3431 if (IS_ERR(hdmi->ddc)) in __dw_hdmi_probe()
3432 hdmi->ddc = NULL; in __dw_hdmi_probe()
3438 &hdmi->i2c->scl_high_ns)) in __dw_hdmi_probe()
3439 hdmi->i2c->scl_high_ns = 4708; in __dw_hdmi_probe()
3441 &hdmi->i2c->scl_low_ns)) in __dw_hdmi_probe()
3442 hdmi->i2c->scl_low_ns = 4916; in __dw_hdmi_probe()
3445 /* Reset HDMI DDC I2C master controller and mute I2CM interrupts */ in __dw_hdmi_probe()
3446 if (hdmi->i2c) in __dw_hdmi_probe()
3447 dw_hdmi_i2c_init(hdmi); in __dw_hdmi_probe()
3449 init_completion(&hdmi->flt_cmp); in __dw_hdmi_probe()
3450 init_completion(&hdmi->earc_cmp); in __dw_hdmi_probe()
3453 hdmi->scramble_low_rates = true; in __dw_hdmi_probe()
3455 hdmi_init_clk_regenerator(hdmi); in __dw_hdmi_probe()
3457 hdmi->bridge.driver_private = hdmi; in __dw_hdmi_probe()
3458 hdmi->bridge.funcs = &dw_hdmi_bridge_funcs; in __dw_hdmi_probe()
3460 hdmi->bridge.of_node = pdev->dev.of_node; in __dw_hdmi_probe()
3463 if (hdmi->phy.ops->setup_hpd) in __dw_hdmi_probe()
3464 hdmi->phy.ops->setup_hpd(hdmi, hdmi->phy.data); in __dw_hdmi_probe()
3466 hdmi->connector.ycbcr_420_allowed = hdmi->plat_data->ycbcr_420_allowed; in __dw_hdmi_probe()
3468 audio.hdmi = hdmi; in __dw_hdmi_probe()
3469 audio.eld = hdmi->connector.eld; in __dw_hdmi_probe()
3473 hdmi->enable_audio = dw_hdmi_i2s_audio_enable; in __dw_hdmi_probe()
3474 hdmi->disable_audio = dw_hdmi_i2s_audio_disable; in __dw_hdmi_probe()
3479 pdevinfo.name = "dw-hdmi-qp-i2s-audio"; in __dw_hdmi_probe()
3483 hdmi->audio = platform_device_register_full(&pdevinfo); in __dw_hdmi_probe()
3485 hdmi->extcon = devm_extcon_dev_allocate(hdmi->dev, dw_hdmi_cable); in __dw_hdmi_probe()
3486 if (IS_ERR(hdmi->extcon)) { in __dw_hdmi_probe()
3487 dev_err(hdmi->dev, "allocate extcon failed\n"); in __dw_hdmi_probe()
3488 ret = PTR_ERR(hdmi->extcon); in __dw_hdmi_probe()
3492 ret = devm_extcon_dev_register(hdmi->dev, hdmi->extcon); in __dw_hdmi_probe()
3494 dev_err(hdmi->dev, "failed to register extcon: %d\n", ret); in __dw_hdmi_probe()
3498 ret = extcon_set_property_capability(hdmi->extcon, EXTCON_DISP_HDMI, in __dw_hdmi_probe()
3501 dev_err(hdmi->dev, in __dw_hdmi_probe()
3512 hdmi->avp_irq = irq; in __dw_hdmi_probe()
3513 ret = devm_request_threaded_irq(dev, hdmi->avp_irq, in __dw_hdmi_probe()
3516 dev_name(dev), hdmi); in __dw_hdmi_probe()
3529 hdmi->cec_enable = true; in __dw_hdmi_probe()
3530 cec.hdmi = hdmi; in __dw_hdmi_probe()
3532 pdevinfo.name = "dw-hdmi-qp-cec"; in __dw_hdmi_probe()
3536 hdmi->cec = platform_device_register_full(&pdevinfo); in __dw_hdmi_probe()
3545 hdmi->earc_irq = irq; in __dw_hdmi_probe()
3546 ret = devm_request_threaded_irq(dev, hdmi->earc_irq, in __dw_hdmi_probe()
3549 dev_name(dev), hdmi); in __dw_hdmi_probe()
3559 hdmi->main_irq = irq; in __dw_hdmi_probe()
3560 ret = devm_request_threaded_irq(dev, hdmi->main_irq, in __dw_hdmi_probe()
3562 IRQF_SHARED, dev_name(dev), hdmi); in __dw_hdmi_probe()
3566 dw_hdmi_register_debugfs(dev, hdmi); in __dw_hdmi_probe()
3568 return hdmi; in __dw_hdmi_probe()
3571 if (!IS_ERR(hdmi->cec)) in __dw_hdmi_probe()
3572 platform_device_unregister(hdmi->cec); in __dw_hdmi_probe()
3575 if (hdmi->audio && !IS_ERR(hdmi->audio)) in __dw_hdmi_probe()
3576 platform_device_unregister(hdmi->audio); in __dw_hdmi_probe()
3579 if (hdmi->i2c) in __dw_hdmi_probe()
3580 i2c_del_adapter(&hdmi->i2c->adap); in __dw_hdmi_probe()
3582 i2c_put_adapter(hdmi->ddc); in __dw_hdmi_probe()
3584 if (!hdmi->plat_data->first_screen) { in __dw_hdmi_probe()
3585 dw_hdmi_destroy_properties(hdmi); in __dw_hdmi_probe()
3586 hdmi->connector.funcs->destroy(&hdmi->connector); in __dw_hdmi_probe()
3589 if (hdmi->bridge.encoder && !hdmi->plat_data->first_screen) in __dw_hdmi_probe()
3590 hdmi->bridge.encoder->funcs->destroy(hdmi->bridge.encoder); in __dw_hdmi_probe()
3595 static void __dw_hdmi_remove(struct dw_hdmi_qp *hdmi) in __dw_hdmi_remove() argument
3597 if (hdmi->avp_irq) in __dw_hdmi_remove()
3598 disable_irq(hdmi->avp_irq); in __dw_hdmi_remove()
3600 if (hdmi->main_irq) in __dw_hdmi_remove()
3601 disable_irq(hdmi->main_irq); in __dw_hdmi_remove()
3603 if (hdmi->earc_irq) in __dw_hdmi_remove()
3604 disable_irq(hdmi->earc_irq); in __dw_hdmi_remove()
3606 debugfs_remove_recursive(hdmi->debugfs_dir); in __dw_hdmi_remove()
3608 if (!hdmi->plat_data->first_screen) { in __dw_hdmi_remove()
3609 dw_hdmi_destroy_properties(hdmi); in __dw_hdmi_remove()
3610 hdmi->connector.funcs->destroy(&hdmi->connector); in __dw_hdmi_remove()
3613 if (hdmi->audio && !IS_ERR(hdmi->audio)) in __dw_hdmi_remove()
3614 platform_device_unregister(hdmi->audio); in __dw_hdmi_remove()
3616 if (hdmi->bridge.encoder && !hdmi->plat_data->first_screen) in __dw_hdmi_remove()
3617 hdmi->bridge.encoder->funcs->destroy(hdmi->bridge.encoder); in __dw_hdmi_remove()
3618 if (!IS_ERR(hdmi->cec)) in __dw_hdmi_remove()
3619 platform_device_unregister(hdmi->cec); in __dw_hdmi_remove()
3620 if (hdmi->i2c) in __dw_hdmi_remove()
3621 i2c_del_adapter(&hdmi->i2c->adap); in __dw_hdmi_remove()
3623 i2c_put_adapter(hdmi->ddc); in __dw_hdmi_remove()
3633 struct dw_hdmi_qp *hdmi; in dw_hdmi_qp_bind() local
3636 hdmi = __dw_hdmi_probe(pdev, plat_data); in dw_hdmi_qp_bind()
3637 if (IS_ERR(hdmi)) in dw_hdmi_qp_bind()
3638 return hdmi; in dw_hdmi_qp_bind()
3641 ret = drm_bridge_attach(encoder, &hdmi->bridge, NULL, 0); in dw_hdmi_qp_bind()
3643 __dw_hdmi_remove(hdmi); in dw_hdmi_qp_bind()
3644 dev_err(hdmi->dev, "Failed to initialize bridge with drm\n"); in dw_hdmi_qp_bind()
3648 plat_data->connector = &hdmi->connector; in dw_hdmi_qp_bind()
3651 if (plat_data->split_mode && !hdmi->plat_data->first_screen) { in dw_hdmi_qp_bind()
3654 if (hdmi->plat_data->left) in dw_hdmi_qp_bind()
3655 secondary = hdmi->plat_data->left; in dw_hdmi_qp_bind()
3656 else if (hdmi->plat_data->right) in dw_hdmi_qp_bind()
3657 secondary = hdmi->plat_data->right; in dw_hdmi_qp_bind()
3661 ret = drm_bridge_attach(encoder, &secondary->bridge, &hdmi->bridge, in dw_hdmi_qp_bind()
3667 return hdmi; in dw_hdmi_qp_bind()
3671 void dw_hdmi_qp_unbind(struct dw_hdmi_qp *hdmi) in dw_hdmi_qp_unbind() argument
3673 __dw_hdmi_remove(hdmi); in dw_hdmi_qp_unbind()
3677 void dw_hdmi_qp_suspend(struct device *dev, struct dw_hdmi_qp *hdmi) in dw_hdmi_qp_suspend() argument
3679 if (!hdmi) { in dw_hdmi_qp_suspend()
3680 dev_warn(dev, "Hdmi has not been initialized\n"); in dw_hdmi_qp_suspend()
3684 mutex_lock(&hdmi->mutex); in dw_hdmi_qp_suspend()
3687 * When system shutdown, hdmi should be disabled. in dw_hdmi_qp_suspend()
3688 * When system suspend, dw_hdmi_qp_bridge_disable will disable hdmi first. in dw_hdmi_qp_suspend()
3689 * To prevent duplicate operation, we should determine whether hdmi in dw_hdmi_qp_suspend()
3692 if (!hdmi->disabled) in dw_hdmi_qp_suspend()
3693 hdmi->disabled = true; in dw_hdmi_qp_suspend()
3694 mutex_unlock(&hdmi->mutex); in dw_hdmi_qp_suspend()
3696 if (hdmi->avp_irq) in dw_hdmi_qp_suspend()
3697 disable_irq(hdmi->avp_irq); in dw_hdmi_qp_suspend()
3699 if (hdmi->main_irq) in dw_hdmi_qp_suspend()
3700 disable_irq(hdmi->main_irq); in dw_hdmi_qp_suspend()
3702 if (hdmi->earc_irq) in dw_hdmi_qp_suspend()
3703 disable_irq(hdmi->earc_irq); in dw_hdmi_qp_suspend()
3709 void dw_hdmi_qp_resume(struct device *dev, struct dw_hdmi_qp *hdmi) in dw_hdmi_qp_resume() argument
3711 if (!hdmi) { in dw_hdmi_qp_resume()
3712 dev_warn(dev, "Hdmi has not been initialized\n"); in dw_hdmi_qp_resume()
3716 hdmi_writel(hdmi, 0, MAINUNIT_0_INT_MASK_N); in dw_hdmi_qp_resume()
3717 hdmi_writel(hdmi, 0, MAINUNIT_1_INT_MASK_N); in dw_hdmi_qp_resume()
3718 hdmi_writel(hdmi, 428571429, TIMER_BASE_CONFIG0); in dw_hdmi_qp_resume()
3722 if (hdmi->cec_adap) in dw_hdmi_qp_resume()
3723 hdmi->cec_adap->ops->adap_enable(hdmi->cec_adap, true); in dw_hdmi_qp_resume()
3725 mutex_lock(&hdmi->mutex); in dw_hdmi_qp_resume()
3726 if (hdmi->i2c) in dw_hdmi_qp_resume()
3727 dw_hdmi_i2c_init(hdmi); in dw_hdmi_qp_resume()
3728 if (hdmi->avp_irq) in dw_hdmi_qp_resume()
3729 enable_irq(hdmi->avp_irq); in dw_hdmi_qp_resume()
3731 if (hdmi->main_irq) in dw_hdmi_qp_resume()
3732 enable_irq(hdmi->main_irq); in dw_hdmi_qp_resume()
3734 if (hdmi->earc_irq) in dw_hdmi_qp_resume()
3735 enable_irq(hdmi->earc_irq); in dw_hdmi_qp_resume()
3737 mutex_unlock(&hdmi->mutex); in dw_hdmi_qp_resume()
3742 MODULE_DESCRIPTION("DW HDMI QP transmitter driver");
3744 MODULE_ALIAS("platform:dw-hdmi-qp");