Lines Matching full:hdmi

10 #include <linux/hdmi.h>
21 #include <sound/hdmi-codec.h>
34 #include "hdmi.h"
67 struct regulator *hdmi; member
113 static inline u32 tegra_hdmi_readl(struct tegra_hdmi *hdmi, in tegra_hdmi_readl() argument
116 u32 value = readl(hdmi->regs + (offset << 2)); in tegra_hdmi_readl()
118 trace_hdmi_readl(hdmi->dev, offset, value); in tegra_hdmi_readl()
123 static inline void tegra_hdmi_writel(struct tegra_hdmi *hdmi, u32 value, in tegra_hdmi_writel() argument
126 trace_hdmi_writel(hdmi->dev, offset, value); in tegra_hdmi_writel()
127 writel(value, hdmi->regs + (offset << 2)); in tegra_hdmi_writel()
373 static void tegra_hdmi_audio_lock(struct tegra_hdmi *hdmi) in tegra_hdmi_audio_lock() argument
375 mutex_lock(&hdmi->audio_lock); in tegra_hdmi_audio_lock()
376 disable_irq(hdmi->irq); in tegra_hdmi_audio_lock()
379 static void tegra_hdmi_audio_unlock(struct tegra_hdmi *hdmi) in tegra_hdmi_audio_unlock() argument
381 enable_irq(hdmi->irq); in tegra_hdmi_audio_unlock()
382 mutex_unlock(&hdmi->audio_lock); in tegra_hdmi_audio_unlock()
434 static void tegra_hdmi_setup_audio_fs_tables(struct tegra_hdmi *hdmi) in tegra_hdmi_setup_audio_fs_tables() argument
457 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_AUDIO_FS(i)); in tegra_hdmi_setup_audio_fs_tables()
461 static void tegra_hdmi_write_aval(struct tegra_hdmi *hdmi, u32 value) in tegra_hdmi_write_aval() argument
478 if (regs[i].sample_rate == hdmi->format.sample_rate) { in tegra_hdmi_write_aval()
479 tegra_hdmi_writel(hdmi, value, regs[i].offset); in tegra_hdmi_write_aval()
485 static int tegra_hdmi_setup_audio(struct tegra_hdmi *hdmi) in tegra_hdmi_setup_audio() argument
491 switch (hdmi->audio_source) { in tegra_hdmi_setup_audio()
493 if (hdmi->config->has_hda) in tegra_hdmi_setup_audio()
501 if (hdmi->config->has_hda) in tegra_hdmi_setup_audio()
508 if (hdmi->config->has_hda) in tegra_hdmi_setup_audio()
518 * audio input source for HDMI. The source select field has moved to in tegra_hdmi_setup_audio()
522 if (hdmi->config->has_hda) { in tegra_hdmi_setup_audio()
533 if (hdmi->format.channels == 2) in tegra_hdmi_setup_audio()
540 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_SOR_AUDIO_CNTRL0); in tegra_hdmi_setup_audio()
550 if (!hdmi->config->has_hda) in tegra_hdmi_setup_audio()
553 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_AUDIO_CNTRL0); in tegra_hdmi_setup_audio()
558 if (hdmi->config->has_hbr) { in tegra_hdmi_setup_audio()
559 value = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_SOR_AUDIO_SPARE0); in tegra_hdmi_setup_audio()
561 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_SOR_AUDIO_SPARE0); in tegra_hdmi_setup_audio()
564 err = tegra_hdmi_get_audio_config(hdmi->format.sample_rate, in tegra_hdmi_setup_audio()
565 hdmi->pixel_clock, &config); in tegra_hdmi_setup_audio()
567 dev_err(hdmi->dev, in tegra_hdmi_setup_audio()
569 hdmi->format.sample_rate, hdmi->pixel_clock); in tegra_hdmi_setup_audio()
573 dev_dbg(hdmi->dev, "audio: pixclk=%u, n=%u, cts=%u, aval=%u\n", in tegra_hdmi_setup_audio()
574 hdmi->pixel_clock, config.n, config.cts, config.aval); in tegra_hdmi_setup_audio()
576 tegra_hdmi_writel(hdmi, 0, HDMI_NV_PDISP_HDMI_ACR_CTRL); in tegra_hdmi_setup_audio()
580 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_AUDIO_N); in tegra_hdmi_setup_audio()
582 tegra_hdmi_writel(hdmi, ACR_SUBPACK_N(config.n) | ACR_ENABLE, in tegra_hdmi_setup_audio()
585 tegra_hdmi_writel(hdmi, ACR_SUBPACK_CTS(config.cts), in tegra_hdmi_setup_audio()
589 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_HDMI_SPARE); in tegra_hdmi_setup_audio()
591 value = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_AUDIO_N); in tegra_hdmi_setup_audio()
593 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_AUDIO_N); in tegra_hdmi_setup_audio()
595 if (hdmi->config->has_hda) in tegra_hdmi_setup_audio()
596 tegra_hdmi_write_aval(hdmi, config.aval); in tegra_hdmi_setup_audio()
598 tegra_hdmi_setup_audio_fs_tables(hdmi); in tegra_hdmi_setup_audio()
603 static void tegra_hdmi_disable_audio(struct tegra_hdmi *hdmi) in tegra_hdmi_disable_audio() argument
607 value = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_HDMI_GENERIC_CTRL); in tegra_hdmi_disable_audio()
609 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_HDMI_GENERIC_CTRL); in tegra_hdmi_disable_audio()
612 static void tegra_hdmi_enable_audio(struct tegra_hdmi *hdmi) in tegra_hdmi_enable_audio() argument
616 value = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_HDMI_GENERIC_CTRL); in tegra_hdmi_enable_audio()
618 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_HDMI_GENERIC_CTRL); in tegra_hdmi_enable_audio()
621 static void tegra_hdmi_write_eld(struct tegra_hdmi *hdmi) in tegra_hdmi_write_eld() argument
623 size_t length = drm_eld_size(hdmi->output.connector.eld), i; in tegra_hdmi_write_eld()
627 tegra_hdmi_writel(hdmi, i << 8 | hdmi->output.connector.eld[i], in tegra_hdmi_write_eld()
637 tegra_hdmi_writel(hdmi, i << 8 | 0, in tegra_hdmi_write_eld()
641 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_SOR_AUDIO_HDA_PRESENSE); in tegra_hdmi_write_eld()
655 static void tegra_hdmi_write_infopack(struct tegra_hdmi *hdmi, const void *data, in tegra_hdmi_write_infopack() argument
677 dev_err(hdmi->dev, "unsupported infoframe type: %02x\n", in tegra_hdmi_write_infopack()
685 tegra_hdmi_writel(hdmi, value, offset); in tegra_hdmi_write_infopack()
697 tegra_hdmi_writel(hdmi, value, offset++); in tegra_hdmi_write_infopack()
702 tegra_hdmi_writel(hdmi, value, offset++); in tegra_hdmi_write_infopack()
706 static void tegra_hdmi_setup_avi_infoframe(struct tegra_hdmi *hdmi, in tegra_hdmi_setup_avi_infoframe() argument
714 &hdmi->output.connector, mode); in tegra_hdmi_setup_avi_infoframe()
716 dev_err(hdmi->dev, "failed to setup AVI infoframe: %zd\n", err); in tegra_hdmi_setup_avi_infoframe()
722 dev_err(hdmi->dev, "failed to pack AVI infoframe: %zd\n", err); in tegra_hdmi_setup_avi_infoframe()
726 tegra_hdmi_write_infopack(hdmi, buffer, err); in tegra_hdmi_setup_avi_infoframe()
729 static void tegra_hdmi_disable_avi_infoframe(struct tegra_hdmi *hdmi) in tegra_hdmi_disable_avi_infoframe() argument
733 value = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_HDMI_AVI_INFOFRAME_CTRL); in tegra_hdmi_disable_avi_infoframe()
735 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_HDMI_AVI_INFOFRAME_CTRL); in tegra_hdmi_disable_avi_infoframe()
738 static void tegra_hdmi_enable_avi_infoframe(struct tegra_hdmi *hdmi) in tegra_hdmi_enable_avi_infoframe() argument
742 value = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_HDMI_AVI_INFOFRAME_CTRL); in tegra_hdmi_enable_avi_infoframe()
744 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_HDMI_AVI_INFOFRAME_CTRL); in tegra_hdmi_enable_avi_infoframe()
747 static void tegra_hdmi_setup_audio_infoframe(struct tegra_hdmi *hdmi) in tegra_hdmi_setup_audio_infoframe() argument
755 dev_err(hdmi->dev, "failed to setup audio infoframe: %zd\n", in tegra_hdmi_setup_audio_infoframe()
760 frame.channels = hdmi->format.channels; in tegra_hdmi_setup_audio_infoframe()
764 dev_err(hdmi->dev, "failed to pack audio infoframe: %zd\n", in tegra_hdmi_setup_audio_infoframe()
775 tegra_hdmi_write_infopack(hdmi, buffer, min_t(size_t, 10, err)); in tegra_hdmi_setup_audio_infoframe()
778 static void tegra_hdmi_disable_audio_infoframe(struct tegra_hdmi *hdmi) in tegra_hdmi_disable_audio_infoframe() argument
782 value = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_HDMI_AUDIO_INFOFRAME_CTRL); in tegra_hdmi_disable_audio_infoframe()
784 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_HDMI_AUDIO_INFOFRAME_CTRL); in tegra_hdmi_disable_audio_infoframe()
787 static void tegra_hdmi_enable_audio_infoframe(struct tegra_hdmi *hdmi) in tegra_hdmi_enable_audio_infoframe() argument
791 value = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_HDMI_AUDIO_INFOFRAME_CTRL); in tegra_hdmi_enable_audio_infoframe()
793 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_HDMI_AUDIO_INFOFRAME_CTRL); in tegra_hdmi_enable_audio_infoframe()
796 static void tegra_hdmi_setup_stereo_infoframe(struct tegra_hdmi *hdmi) in tegra_hdmi_setup_stereo_infoframe() argument
807 dev_err(hdmi->dev, "failed to pack vendor infoframe: %zd\n", in tegra_hdmi_setup_stereo_infoframe()
812 tegra_hdmi_write_infopack(hdmi, buffer, err); in tegra_hdmi_setup_stereo_infoframe()
815 static void tegra_hdmi_disable_stereo_infoframe(struct tegra_hdmi *hdmi) in tegra_hdmi_disable_stereo_infoframe() argument
819 value = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_HDMI_GENERIC_CTRL); in tegra_hdmi_disable_stereo_infoframe()
821 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_HDMI_GENERIC_CTRL); in tegra_hdmi_disable_stereo_infoframe()
824 static void tegra_hdmi_enable_stereo_infoframe(struct tegra_hdmi *hdmi) in tegra_hdmi_enable_stereo_infoframe() argument
828 value = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_HDMI_GENERIC_CTRL); in tegra_hdmi_enable_stereo_infoframe()
830 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_HDMI_GENERIC_CTRL); in tegra_hdmi_enable_stereo_infoframe()
833 static void tegra_hdmi_setup_tmds(struct tegra_hdmi *hdmi, in tegra_hdmi_setup_tmds() argument
838 tegra_hdmi_writel(hdmi, tmds->pll0, HDMI_NV_PDISP_SOR_PLL0); in tegra_hdmi_setup_tmds()
839 tegra_hdmi_writel(hdmi, tmds->pll1, HDMI_NV_PDISP_SOR_PLL1); in tegra_hdmi_setup_tmds()
840 tegra_hdmi_writel(hdmi, tmds->pe_current, HDMI_NV_PDISP_PE_CURRENT); in tegra_hdmi_setup_tmds()
842 tegra_hdmi_writel(hdmi, tmds->drive_current, in tegra_hdmi_setup_tmds()
845 value = tegra_hdmi_readl(hdmi, hdmi->config->fuse_override_offset); in tegra_hdmi_setup_tmds()
846 value |= hdmi->config->fuse_override_value; in tegra_hdmi_setup_tmds()
847 tegra_hdmi_writel(hdmi, value, hdmi->config->fuse_override_offset); in tegra_hdmi_setup_tmds()
849 if (hdmi->config->has_sor_io_peak_current) in tegra_hdmi_setup_tmds()
850 tegra_hdmi_writel(hdmi, tmds->peak_current, in tegra_hdmi_setup_tmds()
854 static int tegra_hdmi_reconfigure_audio(struct tegra_hdmi *hdmi) in tegra_hdmi_reconfigure_audio() argument
858 err = tegra_hdmi_setup_audio(hdmi); in tegra_hdmi_reconfigure_audio()
860 tegra_hdmi_disable_audio_infoframe(hdmi); in tegra_hdmi_reconfigure_audio()
861 tegra_hdmi_disable_audio(hdmi); in tegra_hdmi_reconfigure_audio()
863 tegra_hdmi_setup_audio_infoframe(hdmi); in tegra_hdmi_reconfigure_audio()
864 tegra_hdmi_enable_audio_infoframe(hdmi); in tegra_hdmi_reconfigure_audio()
865 tegra_hdmi_enable_audio(hdmi); in tegra_hdmi_reconfigure_audio()
880 struct tegra_hdmi *hdmi = to_hdmi(output); in tegra_hdmi_connector_detect() local
887 tegra_hdmi_writel(hdmi, 0, HDMI_NV_PDISP_SOR_AUDIO_HDA_PRESENSE); in tegra_hdmi_connector_detect()
1063 struct tegra_hdmi *hdmi = node->info_ent->data; in tegra_hdmi_show_regs() local
1064 struct drm_crtc *crtc = hdmi->output.encoder.crtc; in tegra_hdmi_show_regs()
1080 offset, tegra_hdmi_readl(hdmi, offset)); in tegra_hdmi_show_regs()
1098 struct tegra_hdmi *hdmi = to_hdmi(output); in tegra_hdmi_late_register() local
1100 hdmi->debugfs_files = kmemdup(debugfs_files, sizeof(debugfs_files), in tegra_hdmi_late_register()
1102 if (!hdmi->debugfs_files) in tegra_hdmi_late_register()
1106 hdmi->debugfs_files[i].data = hdmi; in tegra_hdmi_late_register()
1108 drm_debugfs_create_files(hdmi->debugfs_files, count, root, minor); in tegra_hdmi_late_register()
1118 struct tegra_hdmi *hdmi = to_hdmi(output); in tegra_hdmi_early_unregister() local
1120 drm_debugfs_remove_files(hdmi->debugfs_files, count, in tegra_hdmi_early_unregister()
1122 kfree(hdmi->debugfs_files); in tegra_hdmi_early_unregister()
1123 hdmi->debugfs_files = NULL; in tegra_hdmi_early_unregister()
1142 struct tegra_hdmi *hdmi = to_hdmi(output); in tegra_hdmi_connector_mode_valid() local
1148 parent = clk_get_parent(hdmi->clk_parent); in tegra_hdmi_connector_mode_valid()
1167 struct tegra_hdmi *hdmi = to_hdmi(output); in tegra_hdmi_encoder_disable() local
1171 tegra_hdmi_audio_lock(hdmi); in tegra_hdmi_encoder_disable()
1185 if (!hdmi->dvi) { in tegra_hdmi_encoder_disable()
1186 if (hdmi->stereo) in tegra_hdmi_encoder_disable()
1187 tegra_hdmi_disable_stereo_infoframe(hdmi); in tegra_hdmi_encoder_disable()
1189 tegra_hdmi_disable_audio_infoframe(hdmi); in tegra_hdmi_encoder_disable()
1190 tegra_hdmi_disable_avi_infoframe(hdmi); in tegra_hdmi_encoder_disable()
1191 tegra_hdmi_disable_audio(hdmi); in tegra_hdmi_encoder_disable()
1194 tegra_hdmi_writel(hdmi, 0, HDMI_NV_PDISP_INT_ENABLE); in tegra_hdmi_encoder_disable()
1195 tegra_hdmi_writel(hdmi, 0, HDMI_NV_PDISP_INT_MASK); in tegra_hdmi_encoder_disable()
1197 hdmi->pixel_clock = 0; in tegra_hdmi_encoder_disable()
1199 tegra_hdmi_audio_unlock(hdmi); in tegra_hdmi_encoder_disable()
1201 err = host1x_client_suspend(&hdmi->client); in tegra_hdmi_encoder_disable()
1203 dev_err(hdmi->dev, "failed to suspend: %d\n", err); in tegra_hdmi_encoder_disable()
1212 struct tegra_hdmi *hdmi = to_hdmi(output); in tegra_hdmi_encoder_enable() local
1218 err = host1x_client_resume(&hdmi->client); in tegra_hdmi_encoder_enable()
1220 dev_err(hdmi->dev, "failed to resume: %d\n", err); in tegra_hdmi_encoder_enable()
1224 tegra_hdmi_audio_lock(hdmi); in tegra_hdmi_encoder_enable()
1229 * HDMI driver. in tegra_hdmi_encoder_enable()
1231 tegra_hdmi_writel(hdmi, INT_CODEC_SCRATCH0, HDMI_NV_PDISP_INT_ENABLE); in tegra_hdmi_encoder_enable()
1232 tegra_hdmi_writel(hdmi, INT_CODEC_SCRATCH0, HDMI_NV_PDISP_INT_MASK); in tegra_hdmi_encoder_enable()
1234 hdmi->pixel_clock = mode->clock * 1000; in tegra_hdmi_encoder_enable()
1239 err = dev_pm_opp_set_rate(hdmi->dev, hdmi->pixel_clock); in tegra_hdmi_encoder_enable()
1241 dev_err(hdmi->dev, "failed to set HDMI clock frequency: %d\n", in tegra_hdmi_encoder_enable()
1245 DRM_DEBUG_KMS("HDMI clock rate: %lu Hz\n", clk_get_rate(hdmi->clk)); in tegra_hdmi_encoder_enable()
1248 value = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_SOR_PLL0); in tegra_hdmi_encoder_enable()
1250 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_SOR_PLL0); in tegra_hdmi_encoder_enable()
1254 value = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_SOR_PLL0); in tegra_hdmi_encoder_enable()
1256 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_SOR_PLL0); in tegra_hdmi_encoder_enable()
1277 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_HDMI_VSYNC_WINDOW); in tegra_hdmi_encoder_enable()
1286 tegra_hdmi_writel(hdmi, in tegra_hdmi_encoder_enable()
1290 tegra_hdmi_writel(hdmi, in tegra_hdmi_encoder_enable()
1294 div82 = clk_get_rate(hdmi->clk) / 1000000 * 4; in tegra_hdmi_encoder_enable()
1296 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_SOR_REFCLK); in tegra_hdmi_encoder_enable()
1298 hdmi->dvi = !tegra_output_is_hdmi(output); in tegra_hdmi_encoder_enable()
1299 if (!hdmi->dvi) { in tegra_hdmi_encoder_enable()
1304 if (hdmi->format.sample_rate > 0) { in tegra_hdmi_encoder_enable()
1305 err = tegra_hdmi_setup_audio(hdmi); in tegra_hdmi_encoder_enable()
1307 hdmi->dvi = true; in tegra_hdmi_encoder_enable()
1311 if (hdmi->config->has_hda) in tegra_hdmi_encoder_enable()
1312 tegra_hdmi_write_eld(hdmi); in tegra_hdmi_encoder_enable()
1319 if (!hdmi->dvi) in tegra_hdmi_encoder_enable()
1322 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_HDMI_CTRL); in tegra_hdmi_encoder_enable()
1324 if (!hdmi->dvi) { in tegra_hdmi_encoder_enable()
1325 tegra_hdmi_setup_avi_infoframe(hdmi, mode); in tegra_hdmi_encoder_enable()
1326 tegra_hdmi_setup_audio_infoframe(hdmi); in tegra_hdmi_encoder_enable()
1328 if (hdmi->stereo) in tegra_hdmi_encoder_enable()
1329 tegra_hdmi_setup_stereo_infoframe(hdmi); in tegra_hdmi_encoder_enable()
1333 for (i = 0; i < hdmi->config->num_tmds; i++) { in tegra_hdmi_encoder_enable()
1334 if (hdmi->pixel_clock <= hdmi->config->tmds[i].pclk) { in tegra_hdmi_encoder_enable()
1335 tegra_hdmi_setup_tmds(hdmi, &hdmi->config->tmds[i]); in tegra_hdmi_encoder_enable()
1340 tegra_hdmi_writel(hdmi, in tegra_hdmi_encoder_enable()
1354 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_SOR_SEQ_INST(0)); in tegra_hdmi_encoder_enable()
1355 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_SOR_SEQ_INST(8)); in tegra_hdmi_encoder_enable()
1357 value = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_SOR_CSTM); in tegra_hdmi_encoder_enable()
1364 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_SOR_CSTM); in tegra_hdmi_encoder_enable()
1367 tegra_hdmi_writel(hdmi, in tegra_hdmi_encoder_enable()
1373 tegra_hdmi_writel(hdmi, in tegra_hdmi_encoder_enable()
1382 value = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_SOR_PWR); in tegra_hdmi_encoder_enable()
1404 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_SOR_STATE2); in tegra_hdmi_encoder_enable()
1407 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_SOR_STATE1); in tegra_hdmi_encoder_enable()
1409 tegra_hdmi_writel(hdmi, 0, HDMI_NV_PDISP_SOR_STATE0); in tegra_hdmi_encoder_enable()
1410 tegra_hdmi_writel(hdmi, SOR_STATE_UPDATE, HDMI_NV_PDISP_SOR_STATE0); in tegra_hdmi_encoder_enable()
1411 tegra_hdmi_writel(hdmi, value | SOR_STATE_ATTACHED, in tegra_hdmi_encoder_enable()
1413 tegra_hdmi_writel(hdmi, 0, HDMI_NV_PDISP_SOR_STATE0); in tegra_hdmi_encoder_enable()
1421 if (!hdmi->dvi) { in tegra_hdmi_encoder_enable()
1422 tegra_hdmi_enable_avi_infoframe(hdmi); in tegra_hdmi_encoder_enable()
1423 tegra_hdmi_enable_audio_infoframe(hdmi); in tegra_hdmi_encoder_enable()
1424 tegra_hdmi_enable_audio(hdmi); in tegra_hdmi_encoder_enable()
1426 if (hdmi->stereo) in tegra_hdmi_encoder_enable()
1427 tegra_hdmi_enable_stereo_infoframe(hdmi); in tegra_hdmi_encoder_enable()
1432 tegra_hdmi_audio_unlock(hdmi); in tegra_hdmi_encoder_enable()
1443 struct tegra_hdmi *hdmi = to_hdmi(output); in tegra_hdmi_encoder_atomic_check() local
1446 err = tegra_dc_state_setup_clock(dc, crtc_state, hdmi->clk_parent, in tegra_hdmi_encoder_atomic_check()
1466 struct tegra_hdmi *hdmi = data; in tegra_hdmi_hw_params() local
1469 tegra_hdmi_audio_lock(hdmi); in tegra_hdmi_hw_params()
1471 hdmi->format.sample_rate = hparms->sample_rate; in tegra_hdmi_hw_params()
1472 hdmi->format.channels = hparms->channels; in tegra_hdmi_hw_params()
1474 if (hdmi->pixel_clock && !hdmi->dvi) in tegra_hdmi_hw_params()
1475 ret = tegra_hdmi_reconfigure_audio(hdmi); in tegra_hdmi_hw_params()
1477 tegra_hdmi_audio_unlock(hdmi); in tegra_hdmi_hw_params()
1484 struct tegra_hdmi *hdmi = data; in tegra_hdmi_audio_startup() local
1487 ret = host1x_client_resume(&hdmi->client); in tegra_hdmi_audio_startup()
1489 dev_err(hdmi->dev, "failed to resume: %d\n", ret); in tegra_hdmi_audio_startup()
1496 struct tegra_hdmi *hdmi = data; in tegra_hdmi_audio_shutdown() local
1499 tegra_hdmi_audio_lock(hdmi); in tegra_hdmi_audio_shutdown()
1501 hdmi->format.sample_rate = 0; in tegra_hdmi_audio_shutdown()
1502 hdmi->format.channels = 0; in tegra_hdmi_audio_shutdown()
1504 tegra_hdmi_audio_unlock(hdmi); in tegra_hdmi_audio_shutdown()
1506 ret = host1x_client_suspend(&hdmi->client); in tegra_hdmi_audio_shutdown()
1508 dev_err(hdmi->dev, "failed to suspend: %d\n", ret); in tegra_hdmi_audio_shutdown()
1517 static int tegra_hdmi_codec_register(struct tegra_hdmi *hdmi) in tegra_hdmi_codec_register() argument
1521 if (hdmi->config->has_hda) in tegra_hdmi_codec_register()
1525 codec_data.data = hdmi; in tegra_hdmi_codec_register()
1528 hdmi->audio_pdev = platform_device_register_data(hdmi->dev, in tegra_hdmi_codec_register()
1533 if (IS_ERR(hdmi->audio_pdev)) in tegra_hdmi_codec_register()
1534 return PTR_ERR(hdmi->audio_pdev); in tegra_hdmi_codec_register()
1536 hdmi->format.channels = 2; in tegra_hdmi_codec_register()
1541 static void tegra_hdmi_codec_unregister(struct tegra_hdmi *hdmi) in tegra_hdmi_codec_unregister() argument
1543 if (hdmi->audio_pdev) in tegra_hdmi_codec_unregister()
1544 platform_device_unregister(hdmi->audio_pdev); in tegra_hdmi_codec_unregister()
1549 struct tegra_hdmi *hdmi = host1x_client_to_hdmi(client); in tegra_hdmi_init() local
1554 hdmi->output.dev = client->dev; in tegra_hdmi_init()
1556 drm_simple_encoder_init(drm, &hdmi->output.encoder, in tegra_hdmi_init()
1558 drm_encoder_helper_add(&hdmi->output.encoder, in tegra_hdmi_init()
1561 if (hdmi->output.bridge) { in tegra_hdmi_init()
1562 err = drm_bridge_attach(&hdmi->output.encoder, hdmi->output.bridge, in tegra_hdmi_init()
1570 connector = drm_bridge_connector_init(drm, &hdmi->output.encoder); in tegra_hdmi_init()
1578 drm_connector_attach_encoder(connector, &hdmi->output.encoder); in tegra_hdmi_init()
1580 drm_connector_init_with_ddc(drm, &hdmi->output.connector, in tegra_hdmi_init()
1583 hdmi->output.ddc); in tegra_hdmi_init()
1584 drm_connector_helper_add(&hdmi->output.connector, in tegra_hdmi_init()
1586 hdmi->output.connector.dpms = DRM_MODE_DPMS_OFF; in tegra_hdmi_init()
1588 drm_connector_attach_encoder(&hdmi->output.connector, in tegra_hdmi_init()
1589 &hdmi->output.encoder); in tegra_hdmi_init()
1590 drm_connector_register(&hdmi->output.connector); in tegra_hdmi_init()
1593 err = tegra_output_init(drm, &hdmi->output); in tegra_hdmi_init()
1599 hdmi->output.encoder.possible_crtcs = 0x3; in tegra_hdmi_init()
1601 err = regulator_enable(hdmi->hdmi); in tegra_hdmi_init()
1603 dev_err(client->dev, "failed to enable HDMI regulator: %d\n", in tegra_hdmi_init()
1608 err = regulator_enable(hdmi->pll); in tegra_hdmi_init()
1610 dev_err(hdmi->dev, "failed to enable PLL regulator: %d\n", err); in tegra_hdmi_init()
1614 err = regulator_enable(hdmi->vdd); in tegra_hdmi_init()
1616 dev_err(hdmi->dev, "failed to enable VDD regulator: %d\n", err); in tegra_hdmi_init()
1620 err = tegra_hdmi_codec_register(hdmi); in tegra_hdmi_init()
1622 dev_err(hdmi->dev, "failed to register audio codec: %d\n", err); in tegra_hdmi_init()
1629 regulator_disable(hdmi->vdd); in tegra_hdmi_init()
1631 regulator_disable(hdmi->pll); in tegra_hdmi_init()
1633 regulator_disable(hdmi->hdmi); in tegra_hdmi_init()
1635 tegra_output_exit(&hdmi->output); in tegra_hdmi_init()
1642 struct tegra_hdmi *hdmi = host1x_client_to_hdmi(client); in tegra_hdmi_exit() local
1644 tegra_hdmi_codec_unregister(hdmi); in tegra_hdmi_exit()
1646 tegra_output_exit(&hdmi->output); in tegra_hdmi_exit()
1648 regulator_disable(hdmi->vdd); in tegra_hdmi_exit()
1649 regulator_disable(hdmi->pll); in tegra_hdmi_exit()
1650 regulator_disable(hdmi->hdmi); in tegra_hdmi_exit()
1657 struct tegra_hdmi *hdmi = host1x_client_to_hdmi(client); in tegra_hdmi_runtime_suspend() local
1661 err = reset_control_assert(hdmi->rst); in tegra_hdmi_runtime_suspend()
1669 clk_disable_unprepare(hdmi->clk); in tegra_hdmi_runtime_suspend()
1677 struct tegra_hdmi *hdmi = host1x_client_to_hdmi(client); in tegra_hdmi_runtime_resume() local
1687 err = clk_prepare_enable(hdmi->clk); in tegra_hdmi_runtime_resume()
1695 err = reset_control_deassert(hdmi->rst); in tegra_hdmi_runtime_resume()
1704 clk_disable_unprepare(hdmi->clk); in tegra_hdmi_runtime_resume()
1758 { .compatible = "nvidia,tegra124-hdmi", .data = &tegra124_hdmi_config },
1759 { .compatible = "nvidia,tegra114-hdmi", .data = &tegra114_hdmi_config },
1760 { .compatible = "nvidia,tegra30-hdmi", .data = &tegra30_hdmi_config },
1761 { .compatible = "nvidia,tegra20-hdmi", .data = &tegra20_hdmi_config },
1768 struct tegra_hdmi *hdmi = data; in tegra_hdmi_irq() local
1771 value = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_INT_STATUS); in tegra_hdmi_irq()
1772 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_INT_STATUS); in tegra_hdmi_irq()
1778 value = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_SOR_AUDIO_HDA_CODEC_SCRATCH0); in tegra_hdmi_irq()
1783 tegra_hda_parse_format(format, &hdmi->format); in tegra_hdmi_irq()
1784 tegra_hdmi_reconfigure_audio(hdmi); in tegra_hdmi_irq()
1786 tegra_hdmi_disable_audio_infoframe(hdmi); in tegra_hdmi_irq()
1787 tegra_hdmi_disable_audio(hdmi); in tegra_hdmi_irq()
1796 struct tegra_hdmi *hdmi; in tegra_hdmi_probe() local
1799 hdmi = devm_kzalloc(&pdev->dev, sizeof(*hdmi), GFP_KERNEL); in tegra_hdmi_probe()
1800 if (!hdmi) in tegra_hdmi_probe()
1803 hdmi->config = of_device_get_match_data(&pdev->dev); in tegra_hdmi_probe()
1804 hdmi->dev = &pdev->dev; in tegra_hdmi_probe()
1806 hdmi->audio_source = AUTO; in tegra_hdmi_probe()
1807 hdmi->stereo = false; in tegra_hdmi_probe()
1808 hdmi->dvi = false; in tegra_hdmi_probe()
1810 mutex_init(&hdmi->audio_lock); in tegra_hdmi_probe()
1812 hdmi->clk = devm_clk_get(&pdev->dev, NULL); in tegra_hdmi_probe()
1813 if (IS_ERR(hdmi->clk)) { in tegra_hdmi_probe()
1815 return PTR_ERR(hdmi->clk); in tegra_hdmi_probe()
1818 hdmi->rst = devm_reset_control_get(&pdev->dev, "hdmi"); in tegra_hdmi_probe()
1819 if (IS_ERR(hdmi->rst)) { in tegra_hdmi_probe()
1821 return PTR_ERR(hdmi->rst); in tegra_hdmi_probe()
1824 hdmi->clk_parent = devm_clk_get(&pdev->dev, "parent"); in tegra_hdmi_probe()
1825 if (IS_ERR(hdmi->clk_parent)) in tegra_hdmi_probe()
1826 return PTR_ERR(hdmi->clk_parent); in tegra_hdmi_probe()
1828 err = clk_set_parent(hdmi->clk, hdmi->clk_parent); in tegra_hdmi_probe()
1834 hdmi->hdmi = devm_regulator_get(&pdev->dev, "hdmi"); in tegra_hdmi_probe()
1835 err = PTR_ERR_OR_ZERO(hdmi->hdmi); in tegra_hdmi_probe()
1838 "failed to get HDMI regulator\n"); in tegra_hdmi_probe()
1840 hdmi->pll = devm_regulator_get(&pdev->dev, "pll"); in tegra_hdmi_probe()
1841 err = PTR_ERR_OR_ZERO(hdmi->pll); in tegra_hdmi_probe()
1846 hdmi->vdd = devm_regulator_get(&pdev->dev, "vdd"); in tegra_hdmi_probe()
1847 err = PTR_ERR_OR_ZERO(hdmi->vdd); in tegra_hdmi_probe()
1852 hdmi->output.dev = &pdev->dev; in tegra_hdmi_probe()
1854 err = tegra_output_probe(&hdmi->output); in tegra_hdmi_probe()
1858 hdmi->regs = devm_platform_ioremap_resource(pdev, 0); in tegra_hdmi_probe()
1859 if (IS_ERR(hdmi->regs)) in tegra_hdmi_probe()
1860 return PTR_ERR(hdmi->regs); in tegra_hdmi_probe()
1866 hdmi->irq = err; in tegra_hdmi_probe()
1868 err = devm_request_irq(hdmi->dev, hdmi->irq, tegra_hdmi_irq, 0, in tegra_hdmi_probe()
1869 dev_name(hdmi->dev), hdmi); in tegra_hdmi_probe()
1872 hdmi->irq, err); in tegra_hdmi_probe()
1876 platform_set_drvdata(pdev, hdmi); in tegra_hdmi_probe()
1886 INIT_LIST_HEAD(&hdmi->client.list); in tegra_hdmi_probe()
1887 hdmi->client.ops = &hdmi_client_ops; in tegra_hdmi_probe()
1888 hdmi->client.dev = &pdev->dev; in tegra_hdmi_probe()
1890 err = host1x_client_register(&hdmi->client); in tegra_hdmi_probe()
1902 struct tegra_hdmi *hdmi = platform_get_drvdata(pdev); in tegra_hdmi_remove() local
1904 host1x_client_unregister(&hdmi->client); in tegra_hdmi_remove()
1906 tegra_output_remove(&hdmi->output); in tegra_hdmi_remove()
1911 .name = "tegra-hdmi",