Lines Matching +full:hdmi +full:- +full:switch

1 // SPDX-License-Identifier: GPL-2.0-only
7 #include <linux/arm-smccc.h>
10 #include <linux/hdmi.h>
24 #include <sound/hdmi-codec.h>
184 static u32 mtk_hdmi_read(struct mtk_hdmi *hdmi, u32 offset) in mtk_hdmi_read() argument
186 return readl(hdmi->regs + offset); in mtk_hdmi_read()
189 static void mtk_hdmi_write(struct mtk_hdmi *hdmi, u32 offset, u32 val) in mtk_hdmi_write() argument
191 writel(val, hdmi->regs + offset); in mtk_hdmi_write()
194 static void mtk_hdmi_clear_bits(struct mtk_hdmi *hdmi, u32 offset, u32 bits) in mtk_hdmi_clear_bits() argument
196 void __iomem *reg = hdmi->regs + offset; in mtk_hdmi_clear_bits()
204 static void mtk_hdmi_set_bits(struct mtk_hdmi *hdmi, u32 offset, u32 bits) in mtk_hdmi_set_bits() argument
206 void __iomem *reg = hdmi->regs + offset; in mtk_hdmi_set_bits()
214 static void mtk_hdmi_mask(struct mtk_hdmi *hdmi, u32 offset, u32 val, u32 mask) in mtk_hdmi_mask() argument
216 void __iomem *reg = hdmi->regs + offset; in mtk_hdmi_mask()
224 static void mtk_hdmi_hw_vid_black(struct mtk_hdmi *hdmi, bool black) in mtk_hdmi_hw_vid_black() argument
226 mtk_hdmi_mask(hdmi, VIDEO_CFG_4, black ? GEN_RGB : NORMAL_PATH, in mtk_hdmi_hw_vid_black()
230 static void mtk_hdmi_hw_make_reg_writable(struct mtk_hdmi *hdmi, bool enable) in mtk_hdmi_hw_make_reg_writable() argument
235 * MT8173 HDMI hardware has an output control bit to enable/disable HDMI in mtk_hdmi_hw_make_reg_writable()
237 * The ARM trusted firmware provides an API for the HDMI driver to set in mtk_hdmi_hw_make_reg_writable()
238 * this control bit to enable HDMI output in supervisor mode. in mtk_hdmi_hw_make_reg_writable()
240 if (hdmi->conf && hdmi->conf->tz_disabled) in mtk_hdmi_hw_make_reg_writable()
241 regmap_update_bits(hdmi->sys_regmap, in mtk_hdmi_hw_make_reg_writable()
242 hdmi->sys_offset + HDMI_SYS_CFG20, in mtk_hdmi_hw_make_reg_writable()
248 regmap_update_bits(hdmi->sys_regmap, hdmi->sys_offset + HDMI_SYS_CFG20, in mtk_hdmi_hw_make_reg_writable()
250 regmap_update_bits(hdmi->sys_regmap, hdmi->sys_offset + HDMI_SYS_CFG1C, in mtk_hdmi_hw_make_reg_writable()
254 static void mtk_hdmi_hw_1p4_version_enable(struct mtk_hdmi *hdmi, bool enable) in mtk_hdmi_hw_1p4_version_enable() argument
256 regmap_update_bits(hdmi->sys_regmap, hdmi->sys_offset + HDMI_SYS_CFG20, in mtk_hdmi_hw_1p4_version_enable()
260 static void mtk_hdmi_hw_aud_mute(struct mtk_hdmi *hdmi) in mtk_hdmi_hw_aud_mute() argument
262 mtk_hdmi_set_bits(hdmi, GRL_AUDIO_CFG, AUDIO_ZERO); in mtk_hdmi_hw_aud_mute()
265 static void mtk_hdmi_hw_aud_unmute(struct mtk_hdmi *hdmi) in mtk_hdmi_hw_aud_unmute() argument
267 mtk_hdmi_clear_bits(hdmi, GRL_AUDIO_CFG, AUDIO_ZERO); in mtk_hdmi_hw_aud_unmute()
270 static void mtk_hdmi_hw_reset(struct mtk_hdmi *hdmi) in mtk_hdmi_hw_reset() argument
272 regmap_update_bits(hdmi->sys_regmap, hdmi->sys_offset + HDMI_SYS_CFG1C, in mtk_hdmi_hw_reset()
274 regmap_update_bits(hdmi->sys_regmap, hdmi->sys_offset + HDMI_SYS_CFG1C, in mtk_hdmi_hw_reset()
276 mtk_hdmi_clear_bits(hdmi, GRL_CFG3, CFG3_CONTROL_PACKET_DELAY); in mtk_hdmi_hw_reset()
277 regmap_update_bits(hdmi->sys_regmap, hdmi->sys_offset + HDMI_SYS_CFG1C, in mtk_hdmi_hw_reset()
281 static void mtk_hdmi_hw_enable_notice(struct mtk_hdmi *hdmi, bool enable_notice) in mtk_hdmi_hw_enable_notice() argument
283 mtk_hdmi_mask(hdmi, GRL_CFG2, enable_notice ? CFG2_NOTICE_EN : 0, in mtk_hdmi_hw_enable_notice()
287 static void mtk_hdmi_hw_write_int_mask(struct mtk_hdmi *hdmi, u32 int_mask) in mtk_hdmi_hw_write_int_mask() argument
289 mtk_hdmi_write(hdmi, GRL_INT_MASK, int_mask); in mtk_hdmi_hw_write_int_mask()
292 static void mtk_hdmi_hw_enable_dvi_mode(struct mtk_hdmi *hdmi, bool enable) in mtk_hdmi_hw_enable_dvi_mode() argument
294 mtk_hdmi_mask(hdmi, GRL_CFG1, enable ? CFG1_DVI : 0, CFG1_DVI); in mtk_hdmi_hw_enable_dvi_mode()
297 static void mtk_hdmi_hw_send_info_frame(struct mtk_hdmi *hdmi, u8 *buffer, in mtk_hdmi_hw_send_info_frame() argument
315 dev_dbg(hdmi->dev, in mtk_hdmi_hw_send_info_frame()
319 switch (frame_type) { in mtk_hdmi_hw_send_info_frame()
337 dev_err(hdmi->dev, "Unknown infoframe type %d\n", frame_type); in mtk_hdmi_hw_send_info_frame()
340 mtk_hdmi_clear_bits(hdmi, ctrl_reg, ctrl_frame_en); in mtk_hdmi_hw_send_info_frame()
341 mtk_hdmi_write(hdmi, GRL_INFOFRM_TYPE, frame_type); in mtk_hdmi_hw_send_info_frame()
342 mtk_hdmi_write(hdmi, GRL_INFOFRM_VER, frame_ver); in mtk_hdmi_hw_send_info_frame()
343 mtk_hdmi_write(hdmi, GRL_INFOFRM_LNG, frame_len); in mtk_hdmi_hw_send_info_frame()
345 mtk_hdmi_write(hdmi, GRL_IFM_PORT, checksum); in mtk_hdmi_hw_send_info_frame()
347 mtk_hdmi_write(hdmi, GRL_IFM_PORT, frame_data[i]); in mtk_hdmi_hw_send_info_frame()
349 mtk_hdmi_set_bits(hdmi, ctrl_reg, ctrl_frame_en); in mtk_hdmi_hw_send_info_frame()
352 static void mtk_hdmi_hw_send_aud_packet(struct mtk_hdmi *hdmi, bool enable) in mtk_hdmi_hw_send_aud_packet() argument
354 mtk_hdmi_mask(hdmi, GRL_SHIFT_R2, enable ? 0 : AUDIO_PACKET_OFF, in mtk_hdmi_hw_send_aud_packet()
358 static void mtk_hdmi_hw_config_sys(struct mtk_hdmi *hdmi) in mtk_hdmi_hw_config_sys() argument
360 regmap_update_bits(hdmi->sys_regmap, hdmi->sys_offset + HDMI_SYS_CFG20, in mtk_hdmi_hw_config_sys()
363 regmap_update_bits(hdmi->sys_regmap, hdmi->sys_offset + HDMI_SYS_CFG20, in mtk_hdmi_hw_config_sys()
367 static void mtk_hdmi_hw_set_deep_color_mode(struct mtk_hdmi *hdmi) in mtk_hdmi_hw_set_deep_color_mode() argument
369 regmap_update_bits(hdmi->sys_regmap, hdmi->sys_offset + HDMI_SYS_CFG20, in mtk_hdmi_hw_set_deep_color_mode()
374 static void mtk_hdmi_hw_send_av_mute(struct mtk_hdmi *hdmi) in mtk_hdmi_hw_send_av_mute() argument
376 mtk_hdmi_clear_bits(hdmi, GRL_CFG4, CTRL_AVMUTE); in mtk_hdmi_hw_send_av_mute()
378 mtk_hdmi_set_bits(hdmi, GRL_CFG4, CTRL_AVMUTE); in mtk_hdmi_hw_send_av_mute()
381 static void mtk_hdmi_hw_send_av_unmute(struct mtk_hdmi *hdmi) in mtk_hdmi_hw_send_av_unmute() argument
383 mtk_hdmi_mask(hdmi, GRL_CFG4, CFG4_AV_UNMUTE_EN, in mtk_hdmi_hw_send_av_unmute()
386 mtk_hdmi_mask(hdmi, GRL_CFG4, CFG4_AV_UNMUTE_SET, in mtk_hdmi_hw_send_av_unmute()
390 static void mtk_hdmi_hw_ncts_enable(struct mtk_hdmi *hdmi, bool on) in mtk_hdmi_hw_ncts_enable() argument
392 mtk_hdmi_mask(hdmi, GRL_CTS_CTRL, on ? 0 : CTS_CTRL_SOFT, in mtk_hdmi_hw_ncts_enable()
396 static void mtk_hdmi_hw_ncts_auto_write_enable(struct mtk_hdmi *hdmi, in mtk_hdmi_hw_ncts_auto_write_enable() argument
399 mtk_hdmi_mask(hdmi, GRL_CTS_CTRL, enable ? NCTS_WRI_ANYTIME : 0, in mtk_hdmi_hw_ncts_auto_write_enable()
403 static void mtk_hdmi_hw_msic_setting(struct mtk_hdmi *hdmi, in mtk_hdmi_hw_msic_setting() argument
406 mtk_hdmi_clear_bits(hdmi, GRL_CFG4, CFG4_MHL_MODE); in mtk_hdmi_hw_msic_setting()
408 if (mode->flags & DRM_MODE_FLAG_INTERLACE && in mtk_hdmi_hw_msic_setting()
409 mode->clock == 74250 && in mtk_hdmi_hw_msic_setting()
410 mode->vdisplay == 1080) in mtk_hdmi_hw_msic_setting()
411 mtk_hdmi_clear_bits(hdmi, GRL_CFG2, CFG2_MHL_DE_SEL); in mtk_hdmi_hw_msic_setting()
413 mtk_hdmi_set_bits(hdmi, GRL_CFG2, CFG2_MHL_DE_SEL); in mtk_hdmi_hw_msic_setting()
416 static void mtk_hdmi_hw_aud_set_channel_swap(struct mtk_hdmi *hdmi, in mtk_hdmi_hw_aud_set_channel_swap() argument
421 switch (swap) { in mtk_hdmi_hw_aud_set_channel_swap()
441 mtk_hdmi_mask(hdmi, GRL_CH_SWAP, swap_bit, 0xff); in mtk_hdmi_hw_aud_set_channel_swap()
444 static void mtk_hdmi_hw_aud_set_bit_num(struct mtk_hdmi *hdmi, in mtk_hdmi_hw_aud_set_bit_num() argument
449 switch (bit_num) { in mtk_hdmi_hw_aud_set_bit_num()
462 mtk_hdmi_mask(hdmi, GRL_AOUT_CFG, val, AOUT_BNUM_SEL_MASK); in mtk_hdmi_hw_aud_set_bit_num()
465 static void mtk_hdmi_hw_aud_set_i2s_fmt(struct mtk_hdmi *hdmi, in mtk_hdmi_hw_aud_set_i2s_fmt() argument
470 val = mtk_hdmi_read(hdmi, GRL_CFG0); in mtk_hdmi_hw_aud_set_i2s_fmt()
473 switch (i2s_fmt) { in mtk_hdmi_hw_aud_set_i2s_fmt()
494 mtk_hdmi_write(hdmi, GRL_CFG0, val); in mtk_hdmi_hw_aud_set_i2s_fmt()
497 static void mtk_hdmi_hw_audio_config(struct mtk_hdmi *hdmi, bool dst) in mtk_hdmi_hw_audio_config() argument
503 mtk_hdmi_clear_bits(hdmi, GRL_AOUT_CFG, HIGH_BIT_RATE_PACKET_ALIGN); in mtk_hdmi_hw_audio_config()
510 mtk_hdmi_mask(hdmi, GRL_AUDIO_CFG, val, mask); in mtk_hdmi_hw_audio_config()
513 static void mtk_hdmi_hw_aud_set_i2s_chan_num(struct mtk_hdmi *hdmi, in mtk_hdmi_hw_aud_set_i2s_chan_num() argument
551 mtk_hdmi_write(hdmi, GRL_CH_SW0, ch_switch & 0xff); in mtk_hdmi_hw_aud_set_i2s_chan_num()
552 mtk_hdmi_write(hdmi, GRL_CH_SW1, (ch_switch >> 8) & 0xff); in mtk_hdmi_hw_aud_set_i2s_chan_num()
553 mtk_hdmi_write(hdmi, GRL_CH_SW2, (ch_switch >> 16) & 0xff); in mtk_hdmi_hw_aud_set_i2s_chan_num()
554 mtk_hdmi_write(hdmi, GRL_I2S_UV, i2s_uv); in mtk_hdmi_hw_aud_set_i2s_chan_num()
557 static void mtk_hdmi_hw_aud_set_input_type(struct mtk_hdmi *hdmi, in mtk_hdmi_hw_aud_set_input_type() argument
562 val = mtk_hdmi_read(hdmi, GRL_CFG1); in mtk_hdmi_hw_aud_set_input_type()
570 mtk_hdmi_write(hdmi, GRL_CFG1, val); in mtk_hdmi_hw_aud_set_input_type()
573 static void mtk_hdmi_hw_aud_set_channel_status(struct mtk_hdmi *hdmi, in mtk_hdmi_hw_aud_set_channel_status() argument
579 mtk_hdmi_write(hdmi, GRL_I2S_C_STA0 + i * 4, channel_status[i]); in mtk_hdmi_hw_aud_set_channel_status()
580 mtk_hdmi_write(hdmi, GRL_L_STATUS_0 + i * 4, channel_status[i]); in mtk_hdmi_hw_aud_set_channel_status()
581 mtk_hdmi_write(hdmi, GRL_R_STATUS_0 + i * 4, channel_status[i]); in mtk_hdmi_hw_aud_set_channel_status()
584 mtk_hdmi_write(hdmi, GRL_L_STATUS_0 + i * 4, 0); in mtk_hdmi_hw_aud_set_channel_status()
585 mtk_hdmi_write(hdmi, GRL_R_STATUS_0 + i * 4, 0); in mtk_hdmi_hw_aud_set_channel_status()
589 static void mtk_hdmi_hw_aud_src_reenable(struct mtk_hdmi *hdmi) in mtk_hdmi_hw_aud_src_reenable() argument
593 val = mtk_hdmi_read(hdmi, GRL_MIX_CTRL); in mtk_hdmi_hw_aud_src_reenable()
596 mtk_hdmi_write(hdmi, GRL_MIX_CTRL, val); in mtk_hdmi_hw_aud_src_reenable()
599 mtk_hdmi_write(hdmi, GRL_MIX_CTRL, val); in mtk_hdmi_hw_aud_src_reenable()
603 static void mtk_hdmi_hw_aud_src_disable(struct mtk_hdmi *hdmi) in mtk_hdmi_hw_aud_src_disable() argument
607 val = mtk_hdmi_read(hdmi, GRL_MIX_CTRL); in mtk_hdmi_hw_aud_src_disable()
609 mtk_hdmi_write(hdmi, GRL_MIX_CTRL, val); in mtk_hdmi_hw_aud_src_disable()
610 mtk_hdmi_write(hdmi, GRL_SHIFT_L1, 0x00); in mtk_hdmi_hw_aud_src_disable()
613 static void mtk_hdmi_hw_aud_set_mclk(struct mtk_hdmi *hdmi, in mtk_hdmi_hw_aud_set_mclk() argument
618 val = mtk_hdmi_read(hdmi, GRL_CFG5); in mtk_hdmi_hw_aud_set_mclk()
621 switch (mclk) { in mtk_hdmi_hw_aud_set_mclk()
641 mtk_hdmi_write(hdmi, GRL_CFG5, val); in mtk_hdmi_hw_aud_set_mclk()
649 /* Recommended N values from HDMI specification, tables 7-1 to 7-3 */
661 * hdmi_recommended_n() - Return N value recommended by HDMI specification
670 for (i = 0; i < ARRAY_SIZE(hdmi_rec_n_table) - 1; i++) { in hdmi_recommended_n()
676 switch (freq) { in hdmi_recommended_n()
678 return recommended->n[0]; in hdmi_recommended_n()
680 return recommended->n[1]; in hdmi_recommended_n()
682 return recommended->n[2]; in hdmi_recommended_n()
684 return recommended->n[1] * 2; in hdmi_recommended_n()
686 return recommended->n[2] * 2; in hdmi_recommended_n()
688 return recommended->n[1] * 4; in hdmi_recommended_n()
690 return recommended->n[2] * 4; in hdmi_recommended_n()
698 switch (clock) { in hdmi_mode_clock_to_hz()
719 static void do_hdmi_hw_aud_set_ncts(struct mtk_hdmi *hdmi, unsigned int n, in do_hdmi_hw_aud_set_ncts() argument
725 mtk_hdmi_write(hdmi, GRL_NCTS, 0); in do_hdmi_hw_aud_set_ncts()
726 mtk_hdmi_write(hdmi, GRL_NCTS, 0); in do_hdmi_hw_aud_set_ncts()
727 mtk_hdmi_write(hdmi, GRL_NCTS, 0); in do_hdmi_hw_aud_set_ncts()
740 mtk_hdmi_write(hdmi, GRL_NCTS, val[i]); in do_hdmi_hw_aud_set_ncts()
743 static void mtk_hdmi_hw_aud_set_ncts(struct mtk_hdmi *hdmi, in mtk_hdmi_hw_aud_set_ncts() argument
752 dev_dbg(hdmi->dev, "%s: sample_rate=%u, clock=%d, cts=%u, n=%u\n", in mtk_hdmi_hw_aud_set_ncts()
755 mtk_hdmi_mask(hdmi, DUMMY_304, AUDIO_I2S_NCTS_SEL_64, in mtk_hdmi_hw_aud_set_ncts()
757 do_hdmi_hw_aud_set_ncts(hdmi, n, cts); in mtk_hdmi_hw_aud_set_ncts()
762 switch (channel_type) { in mtk_hdmi_aud_get_chnl_count()
830 static int mtk_hdmi_video_change_vpll(struct mtk_hdmi *hdmi, u32 clock) in mtk_hdmi_video_change_vpll() argument
836 ret = clk_set_rate(hdmi->clk[MTK_HDMI_CLK_HDMI_PLL], clock); in mtk_hdmi_video_change_vpll()
838 dev_err(hdmi->dev, "Failed to set PLL to %u Hz: %d\n", clock, in mtk_hdmi_video_change_vpll()
843 rate = clk_get_rate(hdmi->clk[MTK_HDMI_CLK_HDMI_PLL]); in mtk_hdmi_video_change_vpll()
846 dev_warn(hdmi->dev, "Want PLL %u Hz, got %lu Hz\n", clock, in mtk_hdmi_video_change_vpll()
849 dev_dbg(hdmi->dev, "Want PLL %u Hz, got %lu Hz\n", clock, rate); in mtk_hdmi_video_change_vpll()
851 mtk_hdmi_hw_config_sys(hdmi); in mtk_hdmi_video_change_vpll()
852 mtk_hdmi_hw_set_deep_color_mode(hdmi); in mtk_hdmi_video_change_vpll()
856 static void mtk_hdmi_video_set_display_mode(struct mtk_hdmi *hdmi, in mtk_hdmi_video_set_display_mode() argument
859 mtk_hdmi_hw_reset(hdmi); in mtk_hdmi_video_set_display_mode()
860 mtk_hdmi_hw_enable_notice(hdmi, true); in mtk_hdmi_video_set_display_mode()
861 mtk_hdmi_hw_write_int_mask(hdmi, 0xff); in mtk_hdmi_video_set_display_mode()
862 mtk_hdmi_hw_enable_dvi_mode(hdmi, hdmi->dvi_mode); in mtk_hdmi_video_set_display_mode()
863 mtk_hdmi_hw_ncts_auto_write_enable(hdmi, true); in mtk_hdmi_video_set_display_mode()
865 mtk_hdmi_hw_msic_setting(hdmi, mode); in mtk_hdmi_video_set_display_mode()
869 static void mtk_hdmi_aud_set_input(struct mtk_hdmi *hdmi) in mtk_hdmi_aud_set_input() argument
875 mtk_hdmi_hw_aud_set_channel_swap(hdmi, HDMI_AUD_SWAP_LFE_CC); in mtk_hdmi_aud_set_input()
876 mtk_hdmi_set_bits(hdmi, GRL_MIX_CTRL, MIX_CTRL_FLAT); in mtk_hdmi_aud_set_input()
878 if (hdmi->aud_param.aud_input_type == HDMI_AUD_INPUT_SPDIF && in mtk_hdmi_aud_set_input()
879 hdmi->aud_param.aud_codec == HDMI_AUDIO_CODING_TYPE_DST) { in mtk_hdmi_aud_set_input()
880 mtk_hdmi_hw_aud_set_bit_num(hdmi, HDMI_AUDIO_SAMPLE_SIZE_24); in mtk_hdmi_aud_set_input()
881 } else if (hdmi->aud_param.aud_i2s_fmt == HDMI_I2S_MODE_LJT_24BIT) { in mtk_hdmi_aud_set_input()
882 hdmi->aud_param.aud_i2s_fmt = HDMI_I2S_MODE_LJT_16BIT; in mtk_hdmi_aud_set_input()
885 mtk_hdmi_hw_aud_set_i2s_fmt(hdmi, hdmi->aud_param.aud_i2s_fmt); in mtk_hdmi_aud_set_input()
886 mtk_hdmi_hw_aud_set_bit_num(hdmi, HDMI_AUDIO_SAMPLE_SIZE_24); in mtk_hdmi_aud_set_input()
888 dst = ((hdmi->aud_param.aud_input_type == HDMI_AUD_INPUT_SPDIF) && in mtk_hdmi_aud_set_input()
889 (hdmi->aud_param.aud_codec == HDMI_AUDIO_CODING_TYPE_DST)); in mtk_hdmi_aud_set_input()
890 mtk_hdmi_hw_audio_config(hdmi, dst); in mtk_hdmi_aud_set_input()
892 if (hdmi->aud_param.aud_input_type == HDMI_AUD_INPUT_SPDIF) in mtk_hdmi_aud_set_input()
895 chan_type = hdmi->aud_param.aud_input_chan_type; in mtk_hdmi_aud_set_input()
897 mtk_hdmi_hw_aud_set_i2s_chan_num(hdmi, chan_type, chan_count); in mtk_hdmi_aud_set_input()
898 mtk_hdmi_hw_aud_set_input_type(hdmi, hdmi->aud_param.aud_input_type); in mtk_hdmi_aud_set_input()
901 static int mtk_hdmi_aud_set_src(struct mtk_hdmi *hdmi, in mtk_hdmi_aud_set_src() argument
904 unsigned int sample_rate = hdmi->aud_param.codec_params.sample_rate; in mtk_hdmi_aud_set_src()
906 mtk_hdmi_hw_ncts_enable(hdmi, false); in mtk_hdmi_aud_set_src()
907 mtk_hdmi_hw_aud_src_disable(hdmi); in mtk_hdmi_aud_set_src()
908 mtk_hdmi_clear_bits(hdmi, GRL_CFG2, CFG2_ACLK_INV); in mtk_hdmi_aud_set_src()
910 if (hdmi->aud_param.aud_input_type == HDMI_AUD_INPUT_I2S) { in mtk_hdmi_aud_set_src()
911 switch (sample_rate) { in mtk_hdmi_aud_set_src()
919 return -EINVAL; in mtk_hdmi_aud_set_src()
921 mtk_hdmi_hw_aud_set_mclk(hdmi, hdmi->aud_param.aud_mclk); in mtk_hdmi_aud_set_src()
923 switch (sample_rate) { in mtk_hdmi_aud_set_src()
929 return -EINVAL; in mtk_hdmi_aud_set_src()
931 mtk_hdmi_hw_aud_set_mclk(hdmi, HDMI_AUD_MCLK_128FS); in mtk_hdmi_aud_set_src()
934 mtk_hdmi_hw_aud_set_ncts(hdmi, sample_rate, display_mode->clock); in mtk_hdmi_aud_set_src()
936 mtk_hdmi_hw_aud_src_reenable(hdmi); in mtk_hdmi_aud_set_src()
940 static int mtk_hdmi_aud_output_config(struct mtk_hdmi *hdmi, in mtk_hdmi_aud_output_config() argument
943 mtk_hdmi_hw_aud_mute(hdmi); in mtk_hdmi_aud_output_config()
944 mtk_hdmi_hw_send_aud_packet(hdmi, false); in mtk_hdmi_aud_output_config()
946 mtk_hdmi_aud_set_input(hdmi); in mtk_hdmi_aud_output_config()
947 mtk_hdmi_aud_set_src(hdmi, display_mode); in mtk_hdmi_aud_output_config()
948 mtk_hdmi_hw_aud_set_channel_status(hdmi, in mtk_hdmi_aud_output_config()
949 hdmi->aud_param.codec_params.iec.status); in mtk_hdmi_aud_output_config()
953 mtk_hdmi_hw_ncts_enable(hdmi, true); in mtk_hdmi_aud_output_config()
954 mtk_hdmi_hw_send_aud_packet(hdmi, true); in mtk_hdmi_aud_output_config()
955 mtk_hdmi_hw_aud_unmute(hdmi); in mtk_hdmi_aud_output_config()
959 static int mtk_hdmi_setup_avi_infoframe(struct mtk_hdmi *hdmi, in mtk_hdmi_setup_avi_infoframe() argument
967 hdmi->curr_conn, mode); in mtk_hdmi_setup_avi_infoframe()
969 dev_err(hdmi->dev, in mtk_hdmi_setup_avi_infoframe()
976 dev_err(hdmi->dev, "Failed to pack AVI infoframe: %zd\n", err); in mtk_hdmi_setup_avi_infoframe()
980 mtk_hdmi_hw_send_info_frame(hdmi, buffer, sizeof(buffer)); in mtk_hdmi_setup_avi_infoframe()
984 static int mtk_hdmi_setup_spd_infoframe(struct mtk_hdmi *hdmi) in mtk_hdmi_setup_spd_infoframe() argument
986 struct drm_bridge *bridge = &hdmi->bridge; in mtk_hdmi_setup_spd_infoframe()
991 err = hdmi_spd_infoframe_init(&frame, bridge->vendor, bridge->product); in mtk_hdmi_setup_spd_infoframe()
993 dev_err(hdmi->dev, "Failed to initialize SPD infoframe: %zd\n", in mtk_hdmi_setup_spd_infoframe()
1000 dev_err(hdmi->dev, "Failed to pack SDP infoframe: %zd\n", err); in mtk_hdmi_setup_spd_infoframe()
1004 mtk_hdmi_hw_send_info_frame(hdmi, buffer, sizeof(buffer)); in mtk_hdmi_setup_spd_infoframe()
1008 static int mtk_hdmi_setup_audio_infoframe(struct mtk_hdmi *hdmi) in mtk_hdmi_setup_audio_infoframe() argument
1016 dev_err(hdmi->dev, "Failed to setup audio infoframe: %zd\n", in mtk_hdmi_setup_audio_infoframe()
1025 hdmi->aud_param.aud_input_chan_type); in mtk_hdmi_setup_audio_infoframe()
1029 dev_err(hdmi->dev, "Failed to pack audio infoframe: %zd\n", in mtk_hdmi_setup_audio_infoframe()
1034 mtk_hdmi_hw_send_info_frame(hdmi, buffer, sizeof(buffer)); in mtk_hdmi_setup_audio_infoframe()
1038 static int mtk_hdmi_setup_vendor_specific_infoframe(struct mtk_hdmi *hdmi, in mtk_hdmi_setup_vendor_specific_infoframe() argument
1046 hdmi->curr_conn, mode); in mtk_hdmi_setup_vendor_specific_infoframe()
1048 dev_err(hdmi->dev, in mtk_hdmi_setup_vendor_specific_infoframe()
1055 dev_err(hdmi->dev, "Failed to pack vendor infoframe: %zd\n", in mtk_hdmi_setup_vendor_specific_infoframe()
1060 mtk_hdmi_hw_send_info_frame(hdmi, buffer, sizeof(buffer)); in mtk_hdmi_setup_vendor_specific_infoframe()
1064 static int mtk_hdmi_output_init(struct mtk_hdmi *hdmi) in mtk_hdmi_output_init() argument
1066 struct hdmi_audio_param *aud_param = &hdmi->aud_param; in mtk_hdmi_output_init()
1068 aud_param->aud_codec = HDMI_AUDIO_CODING_TYPE_PCM; in mtk_hdmi_output_init()
1069 aud_param->aud_sample_size = HDMI_AUDIO_SAMPLE_SIZE_16; in mtk_hdmi_output_init()
1070 aud_param->aud_input_type = HDMI_AUD_INPUT_I2S; in mtk_hdmi_output_init()
1071 aud_param->aud_i2s_fmt = HDMI_I2S_MODE_I2S_24BIT; in mtk_hdmi_output_init()
1072 aud_param->aud_mclk = HDMI_AUD_MCLK_128FS; in mtk_hdmi_output_init()
1073 aud_param->aud_input_chan_type = HDMI_AUD_CHAN_TYPE_2_0; in mtk_hdmi_output_init()
1078 static void mtk_hdmi_audio_enable(struct mtk_hdmi *hdmi) in mtk_hdmi_audio_enable() argument
1080 mtk_hdmi_hw_send_aud_packet(hdmi, true); in mtk_hdmi_audio_enable()
1081 hdmi->audio_enable = true; in mtk_hdmi_audio_enable()
1084 static void mtk_hdmi_audio_disable(struct mtk_hdmi *hdmi) in mtk_hdmi_audio_disable() argument
1086 mtk_hdmi_hw_send_aud_packet(hdmi, false); in mtk_hdmi_audio_disable()
1087 hdmi->audio_enable = false; in mtk_hdmi_audio_disable()
1090 static int mtk_hdmi_audio_set_param(struct mtk_hdmi *hdmi, in mtk_hdmi_audio_set_param() argument
1093 if (!hdmi->audio_enable) { in mtk_hdmi_audio_set_param()
1094 dev_err(hdmi->dev, "hdmi audio is in disable state!\n"); in mtk_hdmi_audio_set_param()
1095 return -EINVAL; in mtk_hdmi_audio_set_param()
1097 dev_dbg(hdmi->dev, "codec:%d, input:%d, channel:%d, fs:%d\n", in mtk_hdmi_audio_set_param()
1098 param->aud_codec, param->aud_input_type, in mtk_hdmi_audio_set_param()
1099 param->aud_input_chan_type, param->codec_params.sample_rate); in mtk_hdmi_audio_set_param()
1100 memcpy(&hdmi->aud_param, param, sizeof(*param)); in mtk_hdmi_audio_set_param()
1101 return mtk_hdmi_aud_output_config(hdmi, &hdmi->mode); in mtk_hdmi_audio_set_param()
1104 static int mtk_hdmi_output_set_display_mode(struct mtk_hdmi *hdmi, in mtk_hdmi_output_set_display_mode() argument
1109 mtk_hdmi_hw_vid_black(hdmi, true); in mtk_hdmi_output_set_display_mode()
1110 mtk_hdmi_hw_aud_mute(hdmi); in mtk_hdmi_output_set_display_mode()
1111 mtk_hdmi_hw_send_av_mute(hdmi); in mtk_hdmi_output_set_display_mode()
1112 phy_power_off(hdmi->phy); in mtk_hdmi_output_set_display_mode()
1114 ret = mtk_hdmi_video_change_vpll(hdmi, in mtk_hdmi_output_set_display_mode()
1115 mode->clock * 1000); in mtk_hdmi_output_set_display_mode()
1117 dev_err(hdmi->dev, "Failed to set vpll: %d\n", ret); in mtk_hdmi_output_set_display_mode()
1120 mtk_hdmi_video_set_display_mode(hdmi, mode); in mtk_hdmi_output_set_display_mode()
1122 phy_power_on(hdmi->phy); in mtk_hdmi_output_set_display_mode()
1123 mtk_hdmi_aud_output_config(hdmi, mode); in mtk_hdmi_output_set_display_mode()
1125 mtk_hdmi_hw_vid_black(hdmi, false); in mtk_hdmi_output_set_display_mode()
1126 mtk_hdmi_hw_aud_unmute(hdmi); in mtk_hdmi_output_set_display_mode()
1127 mtk_hdmi_hw_send_av_unmute(hdmi); in mtk_hdmi_output_set_display_mode()
1139 static int mtk_hdmi_get_all_clk(struct mtk_hdmi *hdmi, in mtk_hdmi_get_all_clk() argument
1145 hdmi->clk[i] = of_clk_get_by_name(np, in mtk_hdmi_get_all_clk()
1147 if (IS_ERR(hdmi->clk[i])) in mtk_hdmi_get_all_clk()
1148 return PTR_ERR(hdmi->clk[i]); in mtk_hdmi_get_all_clk()
1153 static int mtk_hdmi_clk_enable_audio(struct mtk_hdmi *hdmi) in mtk_hdmi_clk_enable_audio() argument
1157 ret = clk_prepare_enable(hdmi->clk[MTK_HDMI_CLK_AUD_BCLK]); in mtk_hdmi_clk_enable_audio()
1161 ret = clk_prepare_enable(hdmi->clk[MTK_HDMI_CLK_AUD_SPDIF]); in mtk_hdmi_clk_enable_audio()
1163 clk_disable_unprepare(hdmi->clk[MTK_HDMI_CLK_AUD_BCLK]); in mtk_hdmi_clk_enable_audio()
1170 static void mtk_hdmi_clk_disable_audio(struct mtk_hdmi *hdmi) in mtk_hdmi_clk_disable_audio() argument
1172 clk_disable_unprepare(hdmi->clk[MTK_HDMI_CLK_AUD_BCLK]); in mtk_hdmi_clk_disable_audio()
1173 clk_disable_unprepare(hdmi->clk[MTK_HDMI_CLK_AUD_SPDIF]); in mtk_hdmi_clk_disable_audio()
1177 mtk_hdmi_update_plugged_status(struct mtk_hdmi *hdmi) in mtk_hdmi_update_plugged_status() argument
1181 mutex_lock(&hdmi->update_plugged_status_lock); in mtk_hdmi_update_plugged_status()
1182 connected = mtk_cec_hpd_high(hdmi->cec_dev); in mtk_hdmi_update_plugged_status()
1183 if (hdmi->plugged_cb && hdmi->codec_dev) in mtk_hdmi_update_plugged_status()
1184 hdmi->plugged_cb(hdmi->codec_dev, connected); in mtk_hdmi_update_plugged_status()
1185 mutex_unlock(&hdmi->update_plugged_status_lock); in mtk_hdmi_update_plugged_status()
1191 static enum drm_connector_status mtk_hdmi_detect(struct mtk_hdmi *hdmi) in mtk_hdmi_detect() argument
1193 return mtk_hdmi_update_plugged_status(hdmi); in mtk_hdmi_detect()
1201 struct mtk_hdmi *hdmi = hdmi_ctx_from_bridge(bridge); in mtk_hdmi_bridge_mode_valid() local
1203 dev_dbg(hdmi->dev, "xres=%d, yres=%d, refresh=%d, intl=%d clock=%d\n", in mtk_hdmi_bridge_mode_valid()
1204 mode->hdisplay, mode->vdisplay, drm_mode_vrefresh(mode), in mtk_hdmi_bridge_mode_valid()
1205 !!(mode->flags & DRM_MODE_FLAG_INTERLACE), mode->clock * 1000); in mtk_hdmi_bridge_mode_valid()
1207 if (hdmi->conf) { in mtk_hdmi_bridge_mode_valid()
1208 if (hdmi->conf->cea_modes_only && !drm_match_cea_mode(mode)) in mtk_hdmi_bridge_mode_valid()
1211 if (hdmi->conf->max_mode_clock && in mtk_hdmi_bridge_mode_valid()
1212 mode->clock > hdmi->conf->max_mode_clock) in mtk_hdmi_bridge_mode_valid()
1216 if (mode->clock < 27000) in mtk_hdmi_bridge_mode_valid()
1218 if (mode->clock > 297000) in mtk_hdmi_bridge_mode_valid()
1226 struct mtk_hdmi *hdmi = dev_get_drvdata(dev); in mtk_hdmi_hpd_event() local
1228 if (hdmi && hdmi->bridge.encoder && hdmi->bridge.encoder->dev) { in mtk_hdmi_hpd_event()
1231 status = mtk_hdmi_detect(hdmi); in mtk_hdmi_hpd_event()
1232 drm_helper_hpd_irq_event(hdmi->bridge.encoder->dev); in mtk_hdmi_hpd_event()
1233 drm_bridge_hpd_notify(&hdmi->bridge, status); in mtk_hdmi_hpd_event()
1243 struct mtk_hdmi *hdmi = hdmi_ctx_from_bridge(bridge); in mtk_hdmi_bridge_detect() local
1245 return mtk_hdmi_detect(hdmi); in mtk_hdmi_bridge_detect()
1251 struct mtk_hdmi *hdmi = hdmi_ctx_from_bridge(bridge); in mtk_hdmi_bridge_edid_read() local
1254 if (!hdmi->ddc_adpt) in mtk_hdmi_bridge_edid_read()
1256 drm_edid = drm_edid_read_ddc(connector, hdmi->ddc_adpt); in mtk_hdmi_bridge_edid_read()
1259 * FIXME: This should use !connector->display_info.has_audio (or in mtk_hdmi_bridge_edid_read()
1260 * !connector->display_info.is_hdmi) from a path that has read in mtk_hdmi_bridge_edid_read()
1265 hdmi->dvi_mode = !drm_detect_monitor_audio(edid); in mtk_hdmi_bridge_edid_read()
1274 struct mtk_hdmi *hdmi = hdmi_ctx_from_bridge(bridge); in mtk_hdmi_bridge_attach() local
1280 return -EINVAL; in mtk_hdmi_bridge_attach()
1283 if (hdmi->next_bridge) { in mtk_hdmi_bridge_attach()
1284 ret = drm_bridge_attach(bridge->encoder, hdmi->next_bridge, in mtk_hdmi_bridge_attach()
1290 mtk_cec_set_hpd_event(hdmi->cec_dev, mtk_hdmi_hpd_event, hdmi->dev); in mtk_hdmi_bridge_attach()
1305 struct mtk_hdmi *hdmi = hdmi_ctx_from_bridge(bridge); in mtk_hdmi_bridge_atomic_disable() local
1307 if (!hdmi->enabled) in mtk_hdmi_bridge_atomic_disable()
1310 phy_power_off(hdmi->phy); in mtk_hdmi_bridge_atomic_disable()
1311 clk_disable_unprepare(hdmi->clk[MTK_HDMI_CLK_HDMI_PIXEL]); in mtk_hdmi_bridge_atomic_disable()
1312 clk_disable_unprepare(hdmi->clk[MTK_HDMI_CLK_HDMI_PLL]); in mtk_hdmi_bridge_atomic_disable()
1314 hdmi->curr_conn = NULL; in mtk_hdmi_bridge_atomic_disable()
1316 hdmi->enabled = false; in mtk_hdmi_bridge_atomic_disable()
1322 struct mtk_hdmi *hdmi = hdmi_ctx_from_bridge(bridge); in mtk_hdmi_bridge_atomic_post_disable() local
1324 if (!hdmi->powered) in mtk_hdmi_bridge_atomic_post_disable()
1327 mtk_hdmi_hw_1p4_version_enable(hdmi, true); in mtk_hdmi_bridge_atomic_post_disable()
1328 mtk_hdmi_hw_make_reg_writable(hdmi, false); in mtk_hdmi_bridge_atomic_post_disable()
1330 hdmi->powered = false; in mtk_hdmi_bridge_atomic_post_disable()
1337 struct mtk_hdmi *hdmi = hdmi_ctx_from_bridge(bridge); in mtk_hdmi_bridge_mode_set() local
1339 dev_dbg(hdmi->dev, "cur info: name:%s, hdisplay:%d\n", in mtk_hdmi_bridge_mode_set()
1340 adjusted_mode->name, adjusted_mode->hdisplay); in mtk_hdmi_bridge_mode_set()
1341 dev_dbg(hdmi->dev, "hsync_start:%d,hsync_end:%d, htotal:%d", in mtk_hdmi_bridge_mode_set()
1342 adjusted_mode->hsync_start, adjusted_mode->hsync_end, in mtk_hdmi_bridge_mode_set()
1343 adjusted_mode->htotal); in mtk_hdmi_bridge_mode_set()
1344 dev_dbg(hdmi->dev, "hskew:%d, vdisplay:%d\n", in mtk_hdmi_bridge_mode_set()
1345 adjusted_mode->hskew, adjusted_mode->vdisplay); in mtk_hdmi_bridge_mode_set()
1346 dev_dbg(hdmi->dev, "vsync_start:%d, vsync_end:%d, vtotal:%d", in mtk_hdmi_bridge_mode_set()
1347 adjusted_mode->vsync_start, adjusted_mode->vsync_end, in mtk_hdmi_bridge_mode_set()
1348 adjusted_mode->vtotal); in mtk_hdmi_bridge_mode_set()
1349 dev_dbg(hdmi->dev, "vscan:%d, flag:%d\n", in mtk_hdmi_bridge_mode_set()
1350 adjusted_mode->vscan, adjusted_mode->flags); in mtk_hdmi_bridge_mode_set()
1352 drm_mode_copy(&hdmi->mode, adjusted_mode); in mtk_hdmi_bridge_mode_set()
1358 struct mtk_hdmi *hdmi = hdmi_ctx_from_bridge(bridge); in mtk_hdmi_bridge_atomic_pre_enable() local
1360 mtk_hdmi_hw_make_reg_writable(hdmi, true); in mtk_hdmi_bridge_atomic_pre_enable()
1361 mtk_hdmi_hw_1p4_version_enable(hdmi, true); in mtk_hdmi_bridge_atomic_pre_enable()
1363 hdmi->powered = true; in mtk_hdmi_bridge_atomic_pre_enable()
1366 static void mtk_hdmi_send_infoframe(struct mtk_hdmi *hdmi, in mtk_hdmi_send_infoframe() argument
1369 mtk_hdmi_setup_audio_infoframe(hdmi); in mtk_hdmi_send_infoframe()
1370 mtk_hdmi_setup_avi_infoframe(hdmi, mode); in mtk_hdmi_send_infoframe()
1371 mtk_hdmi_setup_spd_infoframe(hdmi); in mtk_hdmi_send_infoframe()
1372 if (mode->flags & DRM_MODE_FLAG_3D_MASK) in mtk_hdmi_send_infoframe()
1373 mtk_hdmi_setup_vendor_specific_infoframe(hdmi, mode); in mtk_hdmi_send_infoframe()
1379 struct mtk_hdmi *hdmi = hdmi_ctx_from_bridge(bridge); in mtk_hdmi_bridge_atomic_enable() local
1382 hdmi->curr_conn = drm_atomic_get_new_connector_for_encoder(state, in mtk_hdmi_bridge_atomic_enable()
1383 bridge->encoder); in mtk_hdmi_bridge_atomic_enable()
1385 mtk_hdmi_output_set_display_mode(hdmi, &hdmi->mode); in mtk_hdmi_bridge_atomic_enable()
1386 clk_prepare_enable(hdmi->clk[MTK_HDMI_CLK_HDMI_PLL]); in mtk_hdmi_bridge_atomic_enable()
1387 clk_prepare_enable(hdmi->clk[MTK_HDMI_CLK_HDMI_PIXEL]); in mtk_hdmi_bridge_atomic_enable()
1388 phy_power_on(hdmi->phy); in mtk_hdmi_bridge_atomic_enable()
1389 mtk_hdmi_send_infoframe(hdmi, &hdmi->mode); in mtk_hdmi_bridge_atomic_enable()
1391 hdmi->enabled = true; in mtk_hdmi_bridge_atomic_enable()
1410 static int mtk_hdmi_dt_parse_pdata(struct mtk_hdmi *hdmi, in mtk_hdmi_dt_parse_pdata() argument
1413 struct device *dev = &pdev->dev; in mtk_hdmi_dt_parse_pdata()
1414 struct device_node *np = dev->of_node; in mtk_hdmi_dt_parse_pdata()
1420 ret = mtk_hdmi_get_all_clk(hdmi, np); in mtk_hdmi_dt_parse_pdata()
1422 if (ret != -EPROBE_DEFER) in mtk_hdmi_dt_parse_pdata()
1428 /* The CEC module handles HDMI hotplug detection */ in mtk_hdmi_dt_parse_pdata()
1429 cec_np = of_get_compatible_child(np->parent, "mediatek,mt8173-cec"); in mtk_hdmi_dt_parse_pdata()
1432 return -EINVAL; in mtk_hdmi_dt_parse_pdata()
1437 dev_err(hdmi->dev, "Waiting for CEC device %pOF\n", in mtk_hdmi_dt_parse_pdata()
1440 return -EPROBE_DEFER; in mtk_hdmi_dt_parse_pdata()
1443 hdmi->cec_dev = &cec_pdev->dev; in mtk_hdmi_dt_parse_pdata()
1446 * The mediatek,syscon-hdmi property contains a phandle link to the in mtk_hdmi_dt_parse_pdata()
1450 regmap = syscon_regmap_lookup_by_phandle(np, "mediatek,syscon-hdmi"); in mtk_hdmi_dt_parse_pdata()
1451 ret = of_property_read_u32_index(np, "mediatek,syscon-hdmi", 1, in mtk_hdmi_dt_parse_pdata()
1452 &hdmi->sys_offset); in mtk_hdmi_dt_parse_pdata()
1461 hdmi->sys_regmap = regmap; in mtk_hdmi_dt_parse_pdata()
1463 hdmi->regs = devm_platform_ioremap_resource(pdev, 0); in mtk_hdmi_dt_parse_pdata()
1464 if (IS_ERR(hdmi->regs)) { in mtk_hdmi_dt_parse_pdata()
1465 ret = PTR_ERR(hdmi->regs); in mtk_hdmi_dt_parse_pdata()
1471 ret = -EINVAL; in mtk_hdmi_dt_parse_pdata()
1475 if (!of_device_is_compatible(remote, "hdmi-connector")) { in mtk_hdmi_dt_parse_pdata()
1476 hdmi->next_bridge = of_drm_find_bridge(remote); in mtk_hdmi_dt_parse_pdata()
1477 if (!hdmi->next_bridge) { in mtk_hdmi_dt_parse_pdata()
1480 ret = -EPROBE_DEFER; in mtk_hdmi_dt_parse_pdata()
1485 i2c_np = of_parse_phandle(remote, "ddc-i2c-bus", 0); in mtk_hdmi_dt_parse_pdata()
1487 dev_err(dev, "Failed to find ddc-i2c-bus node in %pOF\n", in mtk_hdmi_dt_parse_pdata()
1490 ret = -EINVAL; in mtk_hdmi_dt_parse_pdata()
1495 hdmi->ddc_adpt = of_find_i2c_adapter_by_node(i2c_np); in mtk_hdmi_dt_parse_pdata()
1497 if (!hdmi->ddc_adpt) { in mtk_hdmi_dt_parse_pdata()
1499 ret = -EINVAL; in mtk_hdmi_dt_parse_pdata()
1505 put_device(hdmi->cec_dev); in mtk_hdmi_dt_parse_pdata()
1510 * HDMI audio codec callbacks
1517 struct mtk_hdmi *hdmi = dev_get_drvdata(dev); in mtk_hdmi_audio_hw_params() local
1519 unsigned int chan = params->cea.channels; in mtk_hdmi_audio_hw_params()
1521 dev_dbg(hdmi->dev, "%s: %u Hz, %d bit, %d channels\n", __func__, in mtk_hdmi_audio_hw_params()
1522 params->sample_rate, params->sample_width, chan); in mtk_hdmi_audio_hw_params()
1524 if (!hdmi->bridge.encoder) in mtk_hdmi_audio_hw_params()
1525 return -ENODEV; in mtk_hdmi_audio_hw_params()
1527 switch (chan) { in mtk_hdmi_audio_hw_params()
1541 dev_err(hdmi->dev, "channel[%d] not supported!\n", chan); in mtk_hdmi_audio_hw_params()
1542 return -EINVAL; in mtk_hdmi_audio_hw_params()
1545 switch (params->sample_rate) { in mtk_hdmi_audio_hw_params()
1555 dev_err(hdmi->dev, "rate[%d] not supported!\n", in mtk_hdmi_audio_hw_params()
1556 params->sample_rate); in mtk_hdmi_audio_hw_params()
1557 return -EINVAL; in mtk_hdmi_audio_hw_params()
1560 switch (daifmt->fmt) { in mtk_hdmi_audio_hw_params()
1574 dev_err(hdmi->dev, "%s: Invalid DAI format %d\n", __func__, in mtk_hdmi_audio_hw_params()
1575 daifmt->fmt); in mtk_hdmi_audio_hw_params()
1576 return -EINVAL; in mtk_hdmi_audio_hw_params()
1582 mtk_hdmi_audio_set_param(hdmi, &hdmi_params); in mtk_hdmi_audio_hw_params()
1589 struct mtk_hdmi *hdmi = dev_get_drvdata(dev); in mtk_hdmi_audio_startup() local
1591 mtk_hdmi_audio_enable(hdmi); in mtk_hdmi_audio_startup()
1598 struct mtk_hdmi *hdmi = dev_get_drvdata(dev); in mtk_hdmi_audio_shutdown() local
1600 mtk_hdmi_audio_disable(hdmi); in mtk_hdmi_audio_shutdown()
1607 struct mtk_hdmi *hdmi = dev_get_drvdata(dev); in mtk_hdmi_audio_mute() local
1610 mtk_hdmi_hw_aud_mute(hdmi); in mtk_hdmi_audio_mute()
1612 mtk_hdmi_hw_aud_unmute(hdmi); in mtk_hdmi_audio_mute()
1619 struct mtk_hdmi *hdmi = dev_get_drvdata(dev); in mtk_hdmi_audio_get_eld() local
1621 if (hdmi->enabled) in mtk_hdmi_audio_get_eld()
1622 memcpy(buf, hdmi->curr_conn->eld, min(sizeof(hdmi->curr_conn->eld), len)); in mtk_hdmi_audio_get_eld()
1632 struct mtk_hdmi *hdmi = data; in mtk_hdmi_audio_hook_plugged_cb() local
1634 mutex_lock(&hdmi->update_plugged_status_lock); in mtk_hdmi_audio_hook_plugged_cb()
1635 hdmi->plugged_cb = fn; in mtk_hdmi_audio_hook_plugged_cb()
1636 hdmi->codec_dev = codec_dev; in mtk_hdmi_audio_hook_plugged_cb()
1637 mutex_unlock(&hdmi->update_plugged_status_lock); in mtk_hdmi_audio_hook_plugged_cb()
1639 mtk_hdmi_update_plugged_status(hdmi); in mtk_hdmi_audio_hook_plugged_cb()
1660 struct mtk_hdmi *hdmi = dev_get_drvdata(dev); in mtk_hdmi_register_audio_driver() local
1665 .data = hdmi, in mtk_hdmi_register_audio_driver()
1670 hdmi->audio_pdev = platform_device_register_data(dev, in mtk_hdmi_register_audio_driver()
1675 if (IS_ERR(hdmi->audio_pdev)) in mtk_hdmi_register_audio_driver()
1676 return PTR_ERR(hdmi->audio_pdev); in mtk_hdmi_register_audio_driver()
1679 hdmi->audio_pdev); in mtk_hdmi_register_audio_driver()
1688 struct mtk_hdmi *hdmi; in mtk_hdmi_probe() local
1689 struct device *dev = &pdev->dev; in mtk_hdmi_probe()
1692 hdmi = devm_kzalloc(dev, sizeof(*hdmi), GFP_KERNEL); in mtk_hdmi_probe()
1693 if (!hdmi) in mtk_hdmi_probe()
1694 return -ENOMEM; in mtk_hdmi_probe()
1696 hdmi->dev = dev; in mtk_hdmi_probe()
1697 hdmi->conf = of_device_get_match_data(dev); in mtk_hdmi_probe()
1699 ret = mtk_hdmi_dt_parse_pdata(hdmi, pdev); in mtk_hdmi_probe()
1703 hdmi->phy = devm_phy_get(dev, "hdmi"); in mtk_hdmi_probe()
1704 if (IS_ERR(hdmi->phy)) in mtk_hdmi_probe()
1705 return dev_err_probe(dev, PTR_ERR(hdmi->phy), in mtk_hdmi_probe()
1706 "Failed to get HDMI PHY\n"); in mtk_hdmi_probe()
1708 mutex_init(&hdmi->update_plugged_status_lock); in mtk_hdmi_probe()
1709 platform_set_drvdata(pdev, hdmi); in mtk_hdmi_probe()
1711 ret = mtk_hdmi_output_init(hdmi); in mtk_hdmi_probe()
1714 "Failed to initialize hdmi output\n"); in mtk_hdmi_probe()
1721 hdmi->bridge.funcs = &mtk_hdmi_bridge_funcs; in mtk_hdmi_probe()
1722 hdmi->bridge.of_node = pdev->dev.of_node; in mtk_hdmi_probe()
1723 hdmi->bridge.ops = DRM_BRIDGE_OP_DETECT | DRM_BRIDGE_OP_EDID in mtk_hdmi_probe()
1725 hdmi->bridge.type = DRM_MODE_CONNECTOR_HDMIA; in mtk_hdmi_probe()
1726 hdmi->bridge.vendor = "MediaTek"; in mtk_hdmi_probe()
1727 hdmi->bridge.product = "On-Chip HDMI"; in mtk_hdmi_probe()
1729 ret = devm_drm_bridge_add(dev, &hdmi->bridge); in mtk_hdmi_probe()
1733 ret = mtk_hdmi_clk_enable_audio(hdmi); in mtk_hdmi_probe()
1743 struct mtk_hdmi *hdmi = platform_get_drvdata(pdev); in mtk_hdmi_remove() local
1745 mtk_hdmi_clk_disable_audio(hdmi); in mtk_hdmi_remove()
1750 struct mtk_hdmi *hdmi = dev_get_drvdata(dev); in mtk_hdmi_suspend() local
1752 mtk_hdmi_clk_disable_audio(hdmi); in mtk_hdmi_suspend()
1759 struct mtk_hdmi *hdmi = dev_get_drvdata(dev); in mtk_hdmi_resume() local
1761 return mtk_hdmi_clk_enable_audio(hdmi); in mtk_hdmi_resume()
1776 { .compatible = "mediatek,mt2701-hdmi", .data = &mtk_hdmi_conf_mt2701 },
1777 { .compatible = "mediatek,mt8167-hdmi", .data = &mtk_hdmi_conf_mt8167 },
1778 { .compatible = "mediatek,mt8173-hdmi" },
1787 .name = "mediatek-drm-hdmi",
1815 MODULE_DESCRIPTION("MediaTek HDMI Driver");