Lines Matching full:hdmi
13 #include <linux/hdmi.h>
27 #include "hdmi.h"
60 struct regulator *hdmi; member
104 static inline u32 tegra_hdmi_readl(struct tegra_hdmi *hdmi, in tegra_hdmi_readl() argument
107 u32 value = readl(hdmi->regs + (offset << 2)); in tegra_hdmi_readl()
109 trace_hdmi_readl(hdmi->dev, offset, value); in tegra_hdmi_readl()
114 static inline void tegra_hdmi_writel(struct tegra_hdmi *hdmi, u32 value, in tegra_hdmi_writel() argument
117 trace_hdmi_writel(hdmi->dev, offset, value); in tegra_hdmi_writel()
118 writel(value, hdmi->regs + (offset << 2)); in tegra_hdmi_writel()
469 static void tegra_hdmi_setup_audio_fs_tables(struct tegra_hdmi *hdmi) in tegra_hdmi_setup_audio_fs_tables() argument
492 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_AUDIO_FS(i)); in tegra_hdmi_setup_audio_fs_tables()
496 static void tegra_hdmi_write_aval(struct tegra_hdmi *hdmi, u32 value) in tegra_hdmi_write_aval() argument
513 if (regs[i].sample_rate == hdmi->audio_sample_rate) { in tegra_hdmi_write_aval()
514 tegra_hdmi_writel(hdmi, value, regs[i].offset); in tegra_hdmi_write_aval()
520 static int tegra_hdmi_setup_audio(struct tegra_hdmi *hdmi) in tegra_hdmi_setup_audio() argument
525 switch (hdmi->audio_source) { in tegra_hdmi_setup_audio()
527 if (hdmi->config->has_hda) in tegra_hdmi_setup_audio()
535 if (hdmi->config->has_hda) in tegra_hdmi_setup_audio()
542 if (hdmi->config->has_hda) in tegra_hdmi_setup_audio()
552 * audio input source for HDMI. The source select field has moved to in tegra_hdmi_setup_audio()
556 if (hdmi->config->has_hda) { in tegra_hdmi_setup_audio()
567 if (hdmi->audio_channels == 2) in tegra_hdmi_setup_audio()
574 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_SOR_AUDIO_CNTRL0); in tegra_hdmi_setup_audio()
584 if (!hdmi->config->has_hda) in tegra_hdmi_setup_audio()
587 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_AUDIO_CNTRL0); in tegra_hdmi_setup_audio()
592 if (hdmi->config->has_hbr) { in tegra_hdmi_setup_audio()
593 value = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_SOR_AUDIO_SPARE0); in tegra_hdmi_setup_audio()
595 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_SOR_AUDIO_SPARE0); in tegra_hdmi_setup_audio()
598 config = tegra_hdmi_get_audio_config(hdmi->audio_sample_rate, in tegra_hdmi_setup_audio()
599 hdmi->pixel_clock); in tegra_hdmi_setup_audio()
601 dev_err(hdmi->dev, in tegra_hdmi_setup_audio()
603 hdmi->audio_sample_rate, hdmi->pixel_clock); in tegra_hdmi_setup_audio()
607 tegra_hdmi_writel(hdmi, 0, HDMI_NV_PDISP_HDMI_ACR_CTRL); in tegra_hdmi_setup_audio()
611 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_AUDIO_N); in tegra_hdmi_setup_audio()
613 tegra_hdmi_writel(hdmi, ACR_SUBPACK_N(config->n) | ACR_ENABLE, in tegra_hdmi_setup_audio()
616 tegra_hdmi_writel(hdmi, ACR_SUBPACK_CTS(config->cts), in tegra_hdmi_setup_audio()
620 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_HDMI_SPARE); in tegra_hdmi_setup_audio()
622 value = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_AUDIO_N); in tegra_hdmi_setup_audio()
624 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_AUDIO_N); in tegra_hdmi_setup_audio()
626 if (hdmi->config->has_hda) in tegra_hdmi_setup_audio()
627 tegra_hdmi_write_aval(hdmi, config->aval); in tegra_hdmi_setup_audio()
629 tegra_hdmi_setup_audio_fs_tables(hdmi); in tegra_hdmi_setup_audio()
634 static void tegra_hdmi_disable_audio(struct tegra_hdmi *hdmi) in tegra_hdmi_disable_audio() argument
638 value = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_HDMI_GENERIC_CTRL); in tegra_hdmi_disable_audio()
640 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_HDMI_GENERIC_CTRL); in tegra_hdmi_disable_audio()
643 static void tegra_hdmi_enable_audio(struct tegra_hdmi *hdmi) in tegra_hdmi_enable_audio() argument
647 value = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_HDMI_GENERIC_CTRL); in tegra_hdmi_enable_audio()
649 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_HDMI_GENERIC_CTRL); in tegra_hdmi_enable_audio()
652 static void tegra_hdmi_write_eld(struct tegra_hdmi *hdmi) in tegra_hdmi_write_eld() argument
654 size_t length = drm_eld_size(hdmi->output.connector.eld), i; in tegra_hdmi_write_eld()
658 tegra_hdmi_writel(hdmi, i << 8 | hdmi->output.connector.eld[i], in tegra_hdmi_write_eld()
668 tegra_hdmi_writel(hdmi, i << 8 | 0, in tegra_hdmi_write_eld()
672 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_SOR_AUDIO_HDA_PRESENSE); in tegra_hdmi_write_eld()
686 static void tegra_hdmi_write_infopack(struct tegra_hdmi *hdmi, const void *data, in tegra_hdmi_write_infopack() argument
708 dev_err(hdmi->dev, "unsupported infoframe type: %02x\n", in tegra_hdmi_write_infopack()
716 tegra_hdmi_writel(hdmi, value, offset); in tegra_hdmi_write_infopack()
728 tegra_hdmi_writel(hdmi, value, offset++); in tegra_hdmi_write_infopack()
733 tegra_hdmi_writel(hdmi, value, offset++); in tegra_hdmi_write_infopack()
737 static void tegra_hdmi_setup_avi_infoframe(struct tegra_hdmi *hdmi, in tegra_hdmi_setup_avi_infoframe() argument
746 dev_err(hdmi->dev, "failed to setup AVI infoframe: %zd\n", err); in tegra_hdmi_setup_avi_infoframe()
752 dev_err(hdmi->dev, "failed to pack AVI infoframe: %zd\n", err); in tegra_hdmi_setup_avi_infoframe()
756 tegra_hdmi_write_infopack(hdmi, buffer, err); in tegra_hdmi_setup_avi_infoframe()
759 static void tegra_hdmi_disable_avi_infoframe(struct tegra_hdmi *hdmi) in tegra_hdmi_disable_avi_infoframe() argument
763 value = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_HDMI_AVI_INFOFRAME_CTRL); in tegra_hdmi_disable_avi_infoframe()
765 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_HDMI_AVI_INFOFRAME_CTRL); in tegra_hdmi_disable_avi_infoframe()
768 static void tegra_hdmi_enable_avi_infoframe(struct tegra_hdmi *hdmi) in tegra_hdmi_enable_avi_infoframe() argument
772 value = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_HDMI_AVI_INFOFRAME_CTRL); in tegra_hdmi_enable_avi_infoframe()
774 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_HDMI_AVI_INFOFRAME_CTRL); in tegra_hdmi_enable_avi_infoframe()
777 static void tegra_hdmi_setup_audio_infoframe(struct tegra_hdmi *hdmi) in tegra_hdmi_setup_audio_infoframe() argument
785 dev_err(hdmi->dev, "failed to setup audio infoframe: %zd\n", in tegra_hdmi_setup_audio_infoframe()
790 frame.channels = hdmi->audio_channels; in tegra_hdmi_setup_audio_infoframe()
794 dev_err(hdmi->dev, "failed to pack audio infoframe: %zd\n", in tegra_hdmi_setup_audio_infoframe()
805 tegra_hdmi_write_infopack(hdmi, buffer, min_t(size_t, 10, err)); in tegra_hdmi_setup_audio_infoframe()
808 static void tegra_hdmi_disable_audio_infoframe(struct tegra_hdmi *hdmi) in tegra_hdmi_disable_audio_infoframe() argument
812 value = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_HDMI_AUDIO_INFOFRAME_CTRL); in tegra_hdmi_disable_audio_infoframe()
814 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_HDMI_AUDIO_INFOFRAME_CTRL); in tegra_hdmi_disable_audio_infoframe()
817 static void tegra_hdmi_enable_audio_infoframe(struct tegra_hdmi *hdmi) in tegra_hdmi_enable_audio_infoframe() argument
821 value = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_HDMI_AUDIO_INFOFRAME_CTRL); in tegra_hdmi_enable_audio_infoframe()
823 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_HDMI_AUDIO_INFOFRAME_CTRL); in tegra_hdmi_enable_audio_infoframe()
826 static void tegra_hdmi_setup_stereo_infoframe(struct tegra_hdmi *hdmi) in tegra_hdmi_setup_stereo_infoframe() argument
837 dev_err(hdmi->dev, "failed to pack vendor infoframe: %zd\n", in tegra_hdmi_setup_stereo_infoframe()
842 tegra_hdmi_write_infopack(hdmi, buffer, err); in tegra_hdmi_setup_stereo_infoframe()
845 static void tegra_hdmi_disable_stereo_infoframe(struct tegra_hdmi *hdmi) in tegra_hdmi_disable_stereo_infoframe() argument
849 value = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_HDMI_GENERIC_CTRL); in tegra_hdmi_disable_stereo_infoframe()
851 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_HDMI_GENERIC_CTRL); in tegra_hdmi_disable_stereo_infoframe()
854 static void tegra_hdmi_enable_stereo_infoframe(struct tegra_hdmi *hdmi) in tegra_hdmi_enable_stereo_infoframe() argument
858 value = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_HDMI_GENERIC_CTRL); in tegra_hdmi_enable_stereo_infoframe()
860 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_HDMI_GENERIC_CTRL); in tegra_hdmi_enable_stereo_infoframe()
863 static void tegra_hdmi_setup_tmds(struct tegra_hdmi *hdmi, in tegra_hdmi_setup_tmds() argument
868 tegra_hdmi_writel(hdmi, tmds->pll0, HDMI_NV_PDISP_SOR_PLL0); in tegra_hdmi_setup_tmds()
869 tegra_hdmi_writel(hdmi, tmds->pll1, HDMI_NV_PDISP_SOR_PLL1); in tegra_hdmi_setup_tmds()
870 tegra_hdmi_writel(hdmi, tmds->pe_current, HDMI_NV_PDISP_PE_CURRENT); in tegra_hdmi_setup_tmds()
872 tegra_hdmi_writel(hdmi, tmds->drive_current, in tegra_hdmi_setup_tmds()
875 value = tegra_hdmi_readl(hdmi, hdmi->config->fuse_override_offset); in tegra_hdmi_setup_tmds()
876 value |= hdmi->config->fuse_override_value; in tegra_hdmi_setup_tmds()
877 tegra_hdmi_writel(hdmi, value, hdmi->config->fuse_override_offset); in tegra_hdmi_setup_tmds()
879 if (hdmi->config->has_sor_io_peak_current) in tegra_hdmi_setup_tmds()
880 tegra_hdmi_writel(hdmi, tmds->peak_current, in tegra_hdmi_setup_tmds()
900 struct tegra_hdmi *hdmi = to_hdmi(output); in tegra_hdmi_connector_detect() local
907 tegra_hdmi_writel(hdmi, 0, HDMI_NV_PDISP_SOR_AUDIO_HDA_PRESENSE); in tegra_hdmi_connector_detect()
1083 struct tegra_hdmi *hdmi = node->info_ent->data; in tegra_hdmi_show_regs() local
1084 struct drm_crtc *crtc = hdmi->output.encoder.crtc; in tegra_hdmi_show_regs()
1100 offset, tegra_hdmi_readl(hdmi, offset)); in tegra_hdmi_show_regs()
1118 struct tegra_hdmi *hdmi = to_hdmi(output); in tegra_hdmi_late_register() local
1121 hdmi->debugfs_files = kmemdup(debugfs_files, sizeof(debugfs_files), in tegra_hdmi_late_register()
1123 if (!hdmi->debugfs_files) in tegra_hdmi_late_register()
1127 hdmi->debugfs_files[i].data = hdmi; in tegra_hdmi_late_register()
1129 err = drm_debugfs_create_files(hdmi->debugfs_files, count, root, minor); in tegra_hdmi_late_register()
1136 kfree(hdmi->debugfs_files); in tegra_hdmi_late_register()
1137 hdmi->debugfs_files = NULL; in tegra_hdmi_late_register()
1147 struct tegra_hdmi *hdmi = to_hdmi(output); in tegra_hdmi_early_unregister() local
1149 drm_debugfs_remove_files(hdmi->debugfs_files, count, minor); in tegra_hdmi_early_unregister()
1150 kfree(hdmi->debugfs_files); in tegra_hdmi_early_unregister()
1151 hdmi->debugfs_files = NULL; in tegra_hdmi_early_unregister()
1170 struct tegra_hdmi *hdmi = to_hdmi(output); in tegra_hdmi_connector_mode_valid() local
1176 parent = clk_get_parent(hdmi->clk_parent); in tegra_hdmi_connector_mode_valid()
1199 struct tegra_hdmi *hdmi = to_hdmi(output); in tegra_hdmi_encoder_disable() local
1214 if (!hdmi->dvi) { in tegra_hdmi_encoder_disable()
1215 if (hdmi->stereo) in tegra_hdmi_encoder_disable()
1216 tegra_hdmi_disable_stereo_infoframe(hdmi); in tegra_hdmi_encoder_disable()
1218 tegra_hdmi_disable_audio_infoframe(hdmi); in tegra_hdmi_encoder_disable()
1219 tegra_hdmi_disable_avi_infoframe(hdmi); in tegra_hdmi_encoder_disable()
1220 tegra_hdmi_disable_audio(hdmi); in tegra_hdmi_encoder_disable()
1223 tegra_hdmi_writel(hdmi, 0, HDMI_NV_PDISP_INT_ENABLE); in tegra_hdmi_encoder_disable()
1224 tegra_hdmi_writel(hdmi, 0, HDMI_NV_PDISP_INT_MASK); in tegra_hdmi_encoder_disable()
1226 pm_runtime_put(hdmi->dev); in tegra_hdmi_encoder_disable()
1235 struct tegra_hdmi *hdmi = to_hdmi(output); in tegra_hdmi_encoder_enable() local
1241 pm_runtime_get_sync(hdmi->dev); in tegra_hdmi_encoder_enable()
1246 * HDMI driver. in tegra_hdmi_encoder_enable()
1248 tegra_hdmi_writel(hdmi, INT_CODEC_SCRATCH0, HDMI_NV_PDISP_INT_ENABLE); in tegra_hdmi_encoder_enable()
1249 tegra_hdmi_writel(hdmi, INT_CODEC_SCRATCH0, HDMI_NV_PDISP_INT_MASK); in tegra_hdmi_encoder_enable()
1251 hdmi->pixel_clock = mode->clock * 1000; in tegra_hdmi_encoder_enable()
1256 err = clk_set_rate(hdmi->clk, hdmi->pixel_clock); in tegra_hdmi_encoder_enable()
1258 dev_err(hdmi->dev, "failed to set HDMI clock frequency: %d\n", in tegra_hdmi_encoder_enable()
1262 DRM_DEBUG_KMS("HDMI clock rate: %lu Hz\n", clk_get_rate(hdmi->clk)); in tegra_hdmi_encoder_enable()
1265 value = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_SOR_PLL0); in tegra_hdmi_encoder_enable()
1267 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_SOR_PLL0); in tegra_hdmi_encoder_enable()
1271 value = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_SOR_PLL0); in tegra_hdmi_encoder_enable()
1273 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_SOR_PLL0); in tegra_hdmi_encoder_enable()
1294 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_HDMI_VSYNC_WINDOW); in tegra_hdmi_encoder_enable()
1303 tegra_hdmi_writel(hdmi, in tegra_hdmi_encoder_enable()
1307 tegra_hdmi_writel(hdmi, in tegra_hdmi_encoder_enable()
1311 div82 = clk_get_rate(hdmi->clk) / 1000000 * 4; in tegra_hdmi_encoder_enable()
1313 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_SOR_REFCLK); in tegra_hdmi_encoder_enable()
1315 hdmi->dvi = !tegra_output_is_hdmi(output); in tegra_hdmi_encoder_enable()
1316 if (!hdmi->dvi) { in tegra_hdmi_encoder_enable()
1317 err = tegra_hdmi_setup_audio(hdmi); in tegra_hdmi_encoder_enable()
1319 hdmi->dvi = true; in tegra_hdmi_encoder_enable()
1322 if (hdmi->config->has_hda) in tegra_hdmi_encoder_enable()
1323 tegra_hdmi_write_eld(hdmi); in tegra_hdmi_encoder_enable()
1330 if (!hdmi->dvi) in tegra_hdmi_encoder_enable()
1333 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_HDMI_CTRL); in tegra_hdmi_encoder_enable()
1335 if (!hdmi->dvi) { in tegra_hdmi_encoder_enable()
1336 tegra_hdmi_setup_avi_infoframe(hdmi, mode); in tegra_hdmi_encoder_enable()
1337 tegra_hdmi_setup_audio_infoframe(hdmi); in tegra_hdmi_encoder_enable()
1339 if (hdmi->stereo) in tegra_hdmi_encoder_enable()
1340 tegra_hdmi_setup_stereo_infoframe(hdmi); in tegra_hdmi_encoder_enable()
1344 for (i = 0; i < hdmi->config->num_tmds; i++) { in tegra_hdmi_encoder_enable()
1345 if (hdmi->pixel_clock <= hdmi->config->tmds[i].pclk) { in tegra_hdmi_encoder_enable()
1346 tegra_hdmi_setup_tmds(hdmi, &hdmi->config->tmds[i]); in tegra_hdmi_encoder_enable()
1351 tegra_hdmi_writel(hdmi, in tegra_hdmi_encoder_enable()
1365 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_SOR_SEQ_INST(0)); in tegra_hdmi_encoder_enable()
1366 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_SOR_SEQ_INST(8)); in tegra_hdmi_encoder_enable()
1368 value = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_SOR_CSTM); in tegra_hdmi_encoder_enable()
1375 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_SOR_CSTM); in tegra_hdmi_encoder_enable()
1378 tegra_hdmi_writel(hdmi, in tegra_hdmi_encoder_enable()
1384 tegra_hdmi_writel(hdmi, in tegra_hdmi_encoder_enable()
1393 value = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_SOR_PWR); in tegra_hdmi_encoder_enable()
1415 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_SOR_STATE2); in tegra_hdmi_encoder_enable()
1418 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_SOR_STATE1); in tegra_hdmi_encoder_enable()
1420 tegra_hdmi_writel(hdmi, 0, HDMI_NV_PDISP_SOR_STATE0); in tegra_hdmi_encoder_enable()
1421 tegra_hdmi_writel(hdmi, SOR_STATE_UPDATE, HDMI_NV_PDISP_SOR_STATE0); in tegra_hdmi_encoder_enable()
1422 tegra_hdmi_writel(hdmi, value | SOR_STATE_ATTACHED, in tegra_hdmi_encoder_enable()
1424 tegra_hdmi_writel(hdmi, 0, HDMI_NV_PDISP_SOR_STATE0); in tegra_hdmi_encoder_enable()
1432 if (!hdmi->dvi) { in tegra_hdmi_encoder_enable()
1433 tegra_hdmi_enable_avi_infoframe(hdmi); in tegra_hdmi_encoder_enable()
1434 tegra_hdmi_enable_audio_infoframe(hdmi); in tegra_hdmi_encoder_enable()
1435 tegra_hdmi_enable_audio(hdmi); in tegra_hdmi_encoder_enable()
1437 if (hdmi->stereo) in tegra_hdmi_encoder_enable()
1438 tegra_hdmi_enable_stereo_infoframe(hdmi); in tegra_hdmi_encoder_enable()
1452 struct tegra_hdmi *hdmi = to_hdmi(output); in tegra_hdmi_encoder_atomic_check() local
1455 err = tegra_dc_state_setup_clock(dc, crtc_state, hdmi->clk_parent, in tegra_hdmi_encoder_atomic_check()
1474 struct tegra_hdmi *hdmi = host1x_client_to_hdmi(client); in tegra_hdmi_init() local
1477 hdmi->output.dev = client->dev; in tegra_hdmi_init()
1479 drm_connector_init(drm, &hdmi->output.connector, in tegra_hdmi_init()
1482 drm_connector_helper_add(&hdmi->output.connector, in tegra_hdmi_init()
1484 hdmi->output.connector.dpms = DRM_MODE_DPMS_OFF; in tegra_hdmi_init()
1486 drm_encoder_init(drm, &hdmi->output.encoder, &tegra_hdmi_encoder_funcs, in tegra_hdmi_init()
1488 drm_encoder_helper_add(&hdmi->output.encoder, in tegra_hdmi_init()
1491 drm_connector_attach_encoder(&hdmi->output.connector, in tegra_hdmi_init()
1492 &hdmi->output.encoder); in tegra_hdmi_init()
1493 drm_connector_register(&hdmi->output.connector); in tegra_hdmi_init()
1495 err = tegra_output_init(drm, &hdmi->output); in tegra_hdmi_init()
1501 hdmi->output.encoder.possible_crtcs = 0x3; in tegra_hdmi_init()
1503 err = regulator_enable(hdmi->hdmi); in tegra_hdmi_init()
1505 dev_err(client->dev, "failed to enable HDMI regulator: %d\n", in tegra_hdmi_init()
1510 err = regulator_enable(hdmi->pll); in tegra_hdmi_init()
1512 dev_err(hdmi->dev, "failed to enable PLL regulator: %d\n", err); in tegra_hdmi_init()
1516 err = regulator_enable(hdmi->vdd); in tegra_hdmi_init()
1518 dev_err(hdmi->dev, "failed to enable VDD regulator: %d\n", err); in tegra_hdmi_init()
1527 struct tegra_hdmi *hdmi = host1x_client_to_hdmi(client); in tegra_hdmi_exit() local
1529 tegra_output_exit(&hdmi->output); in tegra_hdmi_exit()
1531 regulator_disable(hdmi->vdd); in tegra_hdmi_exit()
1532 regulator_disable(hdmi->pll); in tegra_hdmi_exit()
1533 regulator_disable(hdmi->hdmi); in tegra_hdmi_exit()
1584 { .compatible = "nvidia,tegra124-hdmi", .data = &tegra124_hdmi_config },
1585 { .compatible = "nvidia,tegra114-hdmi", .data = &tegra114_hdmi_config },
1586 { .compatible = "nvidia,tegra30-hdmi", .data = &tegra30_hdmi_config },
1587 { .compatible = "nvidia,tegra20-hdmi", .data = &tegra20_hdmi_config },
1612 struct tegra_hdmi *hdmi = data; in tegra_hdmi_irq() local
1616 value = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_INT_STATUS); in tegra_hdmi_irq()
1617 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_INT_STATUS); in tegra_hdmi_irq()
1623 value = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_SOR_AUDIO_HDA_CODEC_SCRATCH0); in tegra_hdmi_irq()
1632 hdmi->audio_sample_rate = sample_rate; in tegra_hdmi_irq()
1633 hdmi->audio_channels = channels; in tegra_hdmi_irq()
1635 err = tegra_hdmi_setup_audio(hdmi); in tegra_hdmi_irq()
1637 tegra_hdmi_disable_audio_infoframe(hdmi); in tegra_hdmi_irq()
1638 tegra_hdmi_disable_audio(hdmi); in tegra_hdmi_irq()
1640 tegra_hdmi_setup_audio_infoframe(hdmi); in tegra_hdmi_irq()
1641 tegra_hdmi_enable_audio_infoframe(hdmi); in tegra_hdmi_irq()
1642 tegra_hdmi_enable_audio(hdmi); in tegra_hdmi_irq()
1645 tegra_hdmi_disable_audio_infoframe(hdmi); in tegra_hdmi_irq()
1646 tegra_hdmi_disable_audio(hdmi); in tegra_hdmi_irq()
1655 struct tegra_hdmi *hdmi; in tegra_hdmi_probe() local
1659 hdmi = devm_kzalloc(&pdev->dev, sizeof(*hdmi), GFP_KERNEL); in tegra_hdmi_probe()
1660 if (!hdmi) in tegra_hdmi_probe()
1663 hdmi->config = of_device_get_match_data(&pdev->dev); in tegra_hdmi_probe()
1664 hdmi->dev = &pdev->dev; in tegra_hdmi_probe()
1666 hdmi->audio_source = AUTO; in tegra_hdmi_probe()
1667 hdmi->audio_sample_rate = 48000; in tegra_hdmi_probe()
1668 hdmi->audio_channels = 2; in tegra_hdmi_probe()
1669 hdmi->stereo = false; in tegra_hdmi_probe()
1670 hdmi->dvi = false; in tegra_hdmi_probe()
1672 hdmi->clk = devm_clk_get(&pdev->dev, NULL); in tegra_hdmi_probe()
1673 if (IS_ERR(hdmi->clk)) { in tegra_hdmi_probe()
1675 return PTR_ERR(hdmi->clk); in tegra_hdmi_probe()
1678 hdmi->rst = devm_reset_control_get(&pdev->dev, "hdmi"); in tegra_hdmi_probe()
1679 if (IS_ERR(hdmi->rst)) { in tegra_hdmi_probe()
1681 return PTR_ERR(hdmi->rst); in tegra_hdmi_probe()
1684 hdmi->clk_parent = devm_clk_get(&pdev->dev, "parent"); in tegra_hdmi_probe()
1685 if (IS_ERR(hdmi->clk_parent)) in tegra_hdmi_probe()
1686 return PTR_ERR(hdmi->clk_parent); in tegra_hdmi_probe()
1688 err = clk_set_parent(hdmi->clk, hdmi->clk_parent); in tegra_hdmi_probe()
1694 hdmi->hdmi = devm_regulator_get(&pdev->dev, "hdmi"); in tegra_hdmi_probe()
1695 if (IS_ERR(hdmi->hdmi)) { in tegra_hdmi_probe()
1696 dev_err(&pdev->dev, "failed to get HDMI regulator\n"); in tegra_hdmi_probe()
1697 return PTR_ERR(hdmi->hdmi); in tegra_hdmi_probe()
1700 hdmi->pll = devm_regulator_get(&pdev->dev, "pll"); in tegra_hdmi_probe()
1701 if (IS_ERR(hdmi->pll)) { in tegra_hdmi_probe()
1703 return PTR_ERR(hdmi->pll); in tegra_hdmi_probe()
1706 hdmi->vdd = devm_regulator_get(&pdev->dev, "vdd"); in tegra_hdmi_probe()
1707 if (IS_ERR(hdmi->vdd)) { in tegra_hdmi_probe()
1709 return PTR_ERR(hdmi->vdd); in tegra_hdmi_probe()
1712 hdmi->output.notifier = cec_notifier_get(&pdev->dev); in tegra_hdmi_probe()
1713 if (hdmi->output.notifier == NULL) in tegra_hdmi_probe()
1716 hdmi->output.dev = &pdev->dev; in tegra_hdmi_probe()
1718 err = tegra_output_probe(&hdmi->output); in tegra_hdmi_probe()
1723 hdmi->regs = devm_ioremap_resource(&pdev->dev, regs); in tegra_hdmi_probe()
1724 if (IS_ERR(hdmi->regs)) in tegra_hdmi_probe()
1725 return PTR_ERR(hdmi->regs); in tegra_hdmi_probe()
1731 hdmi->irq = err; in tegra_hdmi_probe()
1733 err = devm_request_irq(hdmi->dev, hdmi->irq, tegra_hdmi_irq, 0, in tegra_hdmi_probe()
1734 dev_name(hdmi->dev), hdmi); in tegra_hdmi_probe()
1737 hdmi->irq, err); in tegra_hdmi_probe()
1741 platform_set_drvdata(pdev, hdmi); in tegra_hdmi_probe()
1744 INIT_LIST_HEAD(&hdmi->client.list); in tegra_hdmi_probe()
1745 hdmi->client.ops = &hdmi_client_ops; in tegra_hdmi_probe()
1746 hdmi->client.dev = &pdev->dev; in tegra_hdmi_probe()
1748 err = host1x_client_register(&hdmi->client); in tegra_hdmi_probe()
1760 struct tegra_hdmi *hdmi = platform_get_drvdata(pdev); in tegra_hdmi_remove() local
1765 err = host1x_client_unregister(&hdmi->client); in tegra_hdmi_remove()
1772 tegra_output_remove(&hdmi->output); in tegra_hdmi_remove()
1774 if (hdmi->output.notifier) in tegra_hdmi_remove()
1775 cec_notifier_put(hdmi->output.notifier); in tegra_hdmi_remove()
1783 struct tegra_hdmi *hdmi = dev_get_drvdata(dev); in tegra_hdmi_suspend() local
1786 err = reset_control_assert(hdmi->rst); in tegra_hdmi_suspend()
1794 clk_disable_unprepare(hdmi->clk); in tegra_hdmi_suspend()
1801 struct tegra_hdmi *hdmi = dev_get_drvdata(dev); in tegra_hdmi_resume() local
1804 err = clk_prepare_enable(hdmi->clk); in tegra_hdmi_resume()
1812 err = reset_control_deassert(hdmi->rst); in tegra_hdmi_resume()
1815 clk_disable_unprepare(hdmi->clk); in tegra_hdmi_resume()
1829 .name = "tegra-hdmi",