Lines Matching refs:hdmi
10 #include <linux/hdmi.h>
21 #include <sound/hdmi-codec.h>
33 #include "hdmi.h"
66 struct regulator *hdmi;
112 static inline u32 tegra_hdmi_readl(struct tegra_hdmi *hdmi,
115 u32 value = readl(hdmi->regs + (offset << 2));
117 trace_hdmi_readl(hdmi->dev, offset, value);
122 static inline void tegra_hdmi_writel(struct tegra_hdmi *hdmi, u32 value,
125 trace_hdmi_writel(hdmi->dev, offset, value);
126 writel(value, hdmi->regs + (offset << 2));
372 static void tegra_hdmi_audio_lock(struct tegra_hdmi *hdmi)
374 mutex_lock(&hdmi->audio_lock);
375 disable_irq(hdmi->irq);
378 static void tegra_hdmi_audio_unlock(struct tegra_hdmi *hdmi)
380 enable_irq(hdmi->irq);
381 mutex_unlock(&hdmi->audio_lock);
433 static void tegra_hdmi_setup_audio_fs_tables(struct tegra_hdmi *hdmi)
456 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_AUDIO_FS(i));
460 static void tegra_hdmi_write_aval(struct tegra_hdmi *hdmi, u32 value)
477 if (regs[i].sample_rate == hdmi->format.sample_rate) {
478 tegra_hdmi_writel(hdmi, value, regs[i].offset);
484 static int tegra_hdmi_setup_audio(struct tegra_hdmi *hdmi)
490 switch (hdmi->audio_source) {
492 if (hdmi->config->has_hda)
500 if (hdmi->config->has_hda)
507 if (hdmi->config->has_hda)
521 if (hdmi->config->has_hda) {
532 if (hdmi->format.channels == 2)
539 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_SOR_AUDIO_CNTRL0);
549 if (!hdmi->config->has_hda)
552 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_AUDIO_CNTRL0);
557 if (hdmi->config->has_hbr) {
558 value = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_SOR_AUDIO_SPARE0);
560 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_SOR_AUDIO_SPARE0);
563 err = tegra_hdmi_get_audio_config(hdmi->format.sample_rate,
564 hdmi->pixel_clock, &config);
566 dev_err(hdmi->dev,
568 hdmi->format.sample_rate, hdmi->pixel_clock);
572 dev_dbg(hdmi->dev, "audio: pixclk=%u, n=%u, cts=%u, aval=%u\n",
573 hdmi->pixel_clock, config.n, config.cts, config.aval);
575 tegra_hdmi_writel(hdmi, 0, HDMI_NV_PDISP_HDMI_ACR_CTRL);
579 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_AUDIO_N);
581 tegra_hdmi_writel(hdmi, ACR_SUBPACK_N(config.n) | ACR_ENABLE,
584 tegra_hdmi_writel(hdmi, ACR_SUBPACK_CTS(config.cts),
588 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_HDMI_SPARE);
590 value = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_AUDIO_N);
592 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_AUDIO_N);
594 if (hdmi->config->has_hda)
595 tegra_hdmi_write_aval(hdmi, config.aval);
597 tegra_hdmi_setup_audio_fs_tables(hdmi);
602 static void tegra_hdmi_disable_audio(struct tegra_hdmi *hdmi)
606 value = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_HDMI_GENERIC_CTRL);
608 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_HDMI_GENERIC_CTRL);
611 static void tegra_hdmi_enable_audio(struct tegra_hdmi *hdmi)
615 value = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_HDMI_GENERIC_CTRL);
617 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_HDMI_GENERIC_CTRL);
620 static void tegra_hdmi_write_eld(struct tegra_hdmi *hdmi)
622 size_t length = drm_eld_size(hdmi->output.connector.eld), i;
626 tegra_hdmi_writel(hdmi, i << 8 | hdmi->output.connector.eld[i],
636 tegra_hdmi_writel(hdmi, i << 8 | 0,
640 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_SOR_AUDIO_HDA_PRESENSE);
654 static void tegra_hdmi_write_infopack(struct tegra_hdmi *hdmi, const void *data,
676 dev_err(hdmi->dev, "unsupported infoframe type: %02x\n",
684 tegra_hdmi_writel(hdmi, value, offset);
696 tegra_hdmi_writel(hdmi, value, offset++);
701 tegra_hdmi_writel(hdmi, value, offset++);
705 static void tegra_hdmi_setup_avi_infoframe(struct tegra_hdmi *hdmi,
713 &hdmi->output.connector, mode);
715 dev_err(hdmi->dev, "failed to setup AVI infoframe: %zd\n", err);
721 dev_err(hdmi->dev, "failed to pack AVI infoframe: %zd\n", err);
725 tegra_hdmi_write_infopack(hdmi, buffer, err);
728 static void tegra_hdmi_disable_avi_infoframe(struct tegra_hdmi *hdmi)
732 value = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_HDMI_AVI_INFOFRAME_CTRL);
734 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_HDMI_AVI_INFOFRAME_CTRL);
737 static void tegra_hdmi_enable_avi_infoframe(struct tegra_hdmi *hdmi)
741 value = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_HDMI_AVI_INFOFRAME_CTRL);
743 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_HDMI_AVI_INFOFRAME_CTRL);
746 static void tegra_hdmi_setup_audio_infoframe(struct tegra_hdmi *hdmi)
754 dev_err(hdmi->dev, "failed to setup audio infoframe: %zd\n",
759 frame.channels = hdmi->format.channels;
763 dev_err(hdmi->dev, "failed to pack audio infoframe: %zd\n",
774 tegra_hdmi_write_infopack(hdmi, buffer, min_t(size_t, 10, err));
777 static void tegra_hdmi_disable_audio_infoframe(struct tegra_hdmi *hdmi)
781 value = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_HDMI_AUDIO_INFOFRAME_CTRL);
783 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_HDMI_AUDIO_INFOFRAME_CTRL);
786 static void tegra_hdmi_enable_audio_infoframe(struct tegra_hdmi *hdmi)
790 value = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_HDMI_AUDIO_INFOFRAME_CTRL);
792 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_HDMI_AUDIO_INFOFRAME_CTRL);
795 static void tegra_hdmi_setup_stereo_infoframe(struct tegra_hdmi *hdmi)
806 dev_err(hdmi->dev, "failed to pack vendor infoframe: %zd\n",
811 tegra_hdmi_write_infopack(hdmi, buffer, err);
814 static void tegra_hdmi_disable_stereo_infoframe(struct tegra_hdmi *hdmi)
818 value = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_HDMI_GENERIC_CTRL);
820 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_HDMI_GENERIC_CTRL);
823 static void tegra_hdmi_enable_stereo_infoframe(struct tegra_hdmi *hdmi)
827 value = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_HDMI_GENERIC_CTRL);
829 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_HDMI_GENERIC_CTRL);
832 static void tegra_hdmi_setup_tmds(struct tegra_hdmi *hdmi,
837 tegra_hdmi_writel(hdmi, tmds->pll0, HDMI_NV_PDISP_SOR_PLL0);
838 tegra_hdmi_writel(hdmi, tmds->pll1, HDMI_NV_PDISP_SOR_PLL1);
839 tegra_hdmi_writel(hdmi, tmds->pe_current, HDMI_NV_PDISP_PE_CURRENT);
841 tegra_hdmi_writel(hdmi, tmds->drive_current,
844 value = tegra_hdmi_readl(hdmi, hdmi->config->fuse_override_offset);
845 value |= hdmi->config->fuse_override_value;
846 tegra_hdmi_writel(hdmi, value, hdmi->config->fuse_override_offset);
848 if (hdmi->config->has_sor_io_peak_current)
849 tegra_hdmi_writel(hdmi, tmds->peak_current,
853 static int tegra_hdmi_reconfigure_audio(struct tegra_hdmi *hdmi)
857 err = tegra_hdmi_setup_audio(hdmi);
859 tegra_hdmi_disable_audio_infoframe(hdmi);
860 tegra_hdmi_disable_audio(hdmi);
862 tegra_hdmi_setup_audio_infoframe(hdmi);
863 tegra_hdmi_enable_audio_infoframe(hdmi);
864 tegra_hdmi_enable_audio(hdmi);
879 struct tegra_hdmi *hdmi = to_hdmi(output);
886 tegra_hdmi_writel(hdmi, 0, HDMI_NV_PDISP_SOR_AUDIO_HDA_PRESENSE);
1062 struct tegra_hdmi *hdmi = node->info_ent->data;
1063 struct drm_crtc *crtc = hdmi->output.encoder.crtc;
1079 offset, tegra_hdmi_readl(hdmi, offset));
1097 struct tegra_hdmi *hdmi = to_hdmi(output);
1099 hdmi->debugfs_files = kmemdup(debugfs_files, sizeof(debugfs_files),
1101 if (!hdmi->debugfs_files)
1105 hdmi->debugfs_files[i].data = hdmi;
1107 drm_debugfs_create_files(hdmi->debugfs_files, count, root, minor);
1117 struct tegra_hdmi *hdmi = to_hdmi(output);
1119 drm_debugfs_remove_files(hdmi->debugfs_files, count, minor);
1120 kfree(hdmi->debugfs_files);
1121 hdmi->debugfs_files = NULL;
1140 struct tegra_hdmi *hdmi = to_hdmi(output);
1146 parent = clk_get_parent(hdmi->clk_parent);
1165 struct tegra_hdmi *hdmi = to_hdmi(output);
1169 tegra_hdmi_audio_lock(hdmi);
1183 if (!hdmi->dvi) {
1184 if (hdmi->stereo)
1185 tegra_hdmi_disable_stereo_infoframe(hdmi);
1187 tegra_hdmi_disable_audio_infoframe(hdmi);
1188 tegra_hdmi_disable_avi_infoframe(hdmi);
1189 tegra_hdmi_disable_audio(hdmi);
1192 tegra_hdmi_writel(hdmi, 0, HDMI_NV_PDISP_INT_ENABLE);
1193 tegra_hdmi_writel(hdmi, 0, HDMI_NV_PDISP_INT_MASK);
1195 hdmi->pixel_clock = 0;
1197 tegra_hdmi_audio_unlock(hdmi);
1199 err = host1x_client_suspend(&hdmi->client);
1201 dev_err(hdmi->dev, "failed to suspend: %d\n", err);
1210 struct tegra_hdmi *hdmi = to_hdmi(output);
1216 err = host1x_client_resume(&hdmi->client);
1218 dev_err(hdmi->dev, "failed to resume: %d\n", err);
1222 tegra_hdmi_audio_lock(hdmi);
1229 tegra_hdmi_writel(hdmi, INT_CODEC_SCRATCH0, HDMI_NV_PDISP_INT_ENABLE);
1230 tegra_hdmi_writel(hdmi, INT_CODEC_SCRATCH0, HDMI_NV_PDISP_INT_MASK);
1232 hdmi->pixel_clock = mode->clock * 1000;
1237 err = dev_pm_opp_set_rate(hdmi->dev, hdmi->pixel_clock);
1239 dev_err(hdmi->dev, "failed to set HDMI clock frequency: %d\n",
1243 DRM_DEBUG_KMS("HDMI clock rate: %lu Hz\n", clk_get_rate(hdmi->clk));
1246 value = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_SOR_PLL0);
1248 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_SOR_PLL0);
1252 value = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_SOR_PLL0);
1254 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_SOR_PLL0);
1275 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_HDMI_VSYNC_WINDOW);
1284 tegra_hdmi_writel(hdmi,
1288 tegra_hdmi_writel(hdmi,
1292 div82 = clk_get_rate(hdmi->clk) / 1000000 * 4;
1294 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_SOR_REFCLK);
1296 hdmi->dvi = !tegra_output_is_hdmi(output);
1297 if (!hdmi->dvi) {
1302 if (hdmi->format.sample_rate > 0) {
1303 err = tegra_hdmi_setup_audio(hdmi);
1305 hdmi->dvi = true;
1309 if (hdmi->config->has_hda)
1310 tegra_hdmi_write_eld(hdmi);
1317 if (!hdmi->dvi)
1320 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_HDMI_CTRL);
1322 if (!hdmi->dvi) {
1323 tegra_hdmi_setup_avi_infoframe(hdmi, mode);
1324 tegra_hdmi_setup_audio_infoframe(hdmi);
1326 if (hdmi->stereo)
1327 tegra_hdmi_setup_stereo_infoframe(hdmi);
1331 for (i = 0; i < hdmi->config->num_tmds; i++) {
1332 if (hdmi->pixel_clock <= hdmi->config->tmds[i].pclk) {
1333 tegra_hdmi_setup_tmds(hdmi, &hdmi->config->tmds[i]);
1338 tegra_hdmi_writel(hdmi,
1352 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_SOR_SEQ_INST(0));
1353 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_SOR_SEQ_INST(8));
1355 value = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_SOR_CSTM);
1362 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_SOR_CSTM);
1365 tegra_hdmi_writel(hdmi,
1371 tegra_hdmi_writel(hdmi,
1380 value = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_SOR_PWR);
1402 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_SOR_STATE2);
1405 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_SOR_STATE1);
1407 tegra_hdmi_writel(hdmi, 0, HDMI_NV_PDISP_SOR_STATE0);
1408 tegra_hdmi_writel(hdmi, SOR_STATE_UPDATE, HDMI_NV_PDISP_SOR_STATE0);
1409 tegra_hdmi_writel(hdmi, value | SOR_STATE_ATTACHED,
1411 tegra_hdmi_writel(hdmi, 0, HDMI_NV_PDISP_SOR_STATE0);
1419 if (!hdmi->dvi) {
1420 tegra_hdmi_enable_avi_infoframe(hdmi);
1421 tegra_hdmi_enable_audio_infoframe(hdmi);
1422 tegra_hdmi_enable_audio(hdmi);
1424 if (hdmi->stereo)
1425 tegra_hdmi_enable_stereo_infoframe(hdmi);
1430 tegra_hdmi_audio_unlock(hdmi);
1441 struct tegra_hdmi *hdmi = to_hdmi(output);
1444 err = tegra_dc_state_setup_clock(dc, crtc_state, hdmi->clk_parent,
1464 struct tegra_hdmi *hdmi = data;
1467 tegra_hdmi_audio_lock(hdmi);
1469 hdmi->format.sample_rate = hparms->sample_rate;
1470 hdmi->format.channels = hparms->channels;
1472 if (hdmi->pixel_clock && !hdmi->dvi)
1473 ret = tegra_hdmi_reconfigure_audio(hdmi);
1475 tegra_hdmi_audio_unlock(hdmi);
1482 struct tegra_hdmi *hdmi = data;
1485 ret = host1x_client_resume(&hdmi->client);
1487 dev_err(hdmi->dev, "failed to resume: %d\n", ret);
1494 struct tegra_hdmi *hdmi = data;
1497 tegra_hdmi_audio_lock(hdmi);
1499 hdmi->format.sample_rate = 0;
1500 hdmi->format.channels = 0;
1502 tegra_hdmi_audio_unlock(hdmi);
1504 ret = host1x_client_suspend(&hdmi->client);
1506 dev_err(hdmi->dev, "failed to suspend: %d\n", ret);
1515 static int tegra_hdmi_codec_register(struct tegra_hdmi *hdmi)
1519 if (hdmi->config->has_hda)
1523 codec_data.data = hdmi;
1526 hdmi->audio_pdev = platform_device_register_data(hdmi->dev,
1531 if (IS_ERR(hdmi->audio_pdev))
1532 return PTR_ERR(hdmi->audio_pdev);
1534 hdmi->format.channels = 2;
1539 static void tegra_hdmi_codec_unregister(struct tegra_hdmi *hdmi)
1541 if (hdmi->audio_pdev)
1542 platform_device_unregister(hdmi->audio_pdev);
1547 struct tegra_hdmi *hdmi = host1x_client_to_hdmi(client);
1552 hdmi->output.dev = client->dev;
1554 drm_simple_encoder_init(drm, &hdmi->output.encoder,
1556 drm_encoder_helper_add(&hdmi->output.encoder,
1559 if (hdmi->output.bridge) {
1560 err = drm_bridge_attach(&hdmi->output.encoder, hdmi->output.bridge,
1568 connector = drm_bridge_connector_init(drm, &hdmi->output.encoder);
1576 drm_connector_attach_encoder(connector, &hdmi->output.encoder);
1578 drm_connector_init_with_ddc(drm, &hdmi->output.connector,
1581 hdmi->output.ddc);
1582 drm_connector_helper_add(&hdmi->output.connector,
1584 hdmi->output.connector.dpms = DRM_MODE_DPMS_OFF;
1586 drm_connector_attach_encoder(&hdmi->output.connector,
1587 &hdmi->output.encoder);
1588 drm_connector_register(&hdmi->output.connector);
1591 err = tegra_output_init(drm, &hdmi->output);
1597 hdmi->output.encoder.possible_crtcs = 0x3;
1599 err = regulator_enable(hdmi->hdmi);
1606 err = regulator_enable(hdmi->pll);
1608 dev_err(hdmi->dev, "failed to enable PLL regulator: %d\n", err);
1612 err = regulator_enable(hdmi->vdd);
1614 dev_err(hdmi->dev, "failed to enable VDD regulator: %d\n", err);
1618 err = tegra_hdmi_codec_register(hdmi);
1620 dev_err(hdmi->dev, "failed to register audio codec: %d\n", err);
1627 regulator_disable(hdmi->vdd);
1629 regulator_disable(hdmi->pll);
1631 regulator_disable(hdmi->hdmi);
1633 tegra_output_exit(&hdmi->output);
1640 struct tegra_hdmi *hdmi = host1x_client_to_hdmi(client);
1642 tegra_hdmi_codec_unregister(hdmi);
1644 tegra_output_exit(&hdmi->output);
1646 regulator_disable(hdmi->vdd);
1647 regulator_disable(hdmi->pll);
1648 regulator_disable(hdmi->hdmi);
1655 struct tegra_hdmi *hdmi = host1x_client_to_hdmi(client);
1659 err = reset_control_assert(hdmi->rst);
1667 clk_disable_unprepare(hdmi->clk);
1675 struct tegra_hdmi *hdmi = host1x_client_to_hdmi(client);
1685 err = clk_prepare_enable(hdmi->clk);
1693 err = reset_control_deassert(hdmi->rst);
1702 clk_disable_unprepare(hdmi->clk);
1756 { .compatible = "nvidia,tegra124-hdmi", .data = &tegra124_hdmi_config },
1757 { .compatible = "nvidia,tegra114-hdmi", .data = &tegra114_hdmi_config },
1758 { .compatible = "nvidia,tegra30-hdmi", .data = &tegra30_hdmi_config },
1759 { .compatible = "nvidia,tegra20-hdmi", .data = &tegra20_hdmi_config },
1766 struct tegra_hdmi *hdmi = data;
1769 value = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_INT_STATUS);
1770 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_INT_STATUS);
1776 value = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_SOR_AUDIO_HDA_CODEC_SCRATCH0);
1781 tegra_hda_parse_format(format, &hdmi->format);
1782 tegra_hdmi_reconfigure_audio(hdmi);
1784 tegra_hdmi_disable_audio_infoframe(hdmi);
1785 tegra_hdmi_disable_audio(hdmi);
1794 struct tegra_hdmi *hdmi;
1797 hdmi = devm_kzalloc(&pdev->dev, sizeof(*hdmi), GFP_KERNEL);
1798 if (!hdmi)
1801 hdmi->config = of_device_get_match_data(&pdev->dev);
1802 hdmi->dev = &pdev->dev;
1804 hdmi->audio_source = AUTO;
1805 hdmi->stereo = false;
1806 hdmi->dvi = false;
1808 mutex_init(&hdmi->audio_lock);
1810 hdmi->clk = devm_clk_get(&pdev->dev, NULL);
1811 if (IS_ERR(hdmi->clk)) {
1813 return PTR_ERR(hdmi->clk);
1816 hdmi->rst = devm_reset_control_get(&pdev->dev, "hdmi");
1817 if (IS_ERR(hdmi->rst)) {
1819 return PTR_ERR(hdmi->rst);
1822 hdmi->clk_parent = devm_clk_get(&pdev->dev, "parent");
1823 if (IS_ERR(hdmi->clk_parent))
1824 return PTR_ERR(hdmi->clk_parent);
1826 err = clk_set_parent(hdmi->clk, hdmi->clk_parent);
1832 hdmi->hdmi = devm_regulator_get(&pdev->dev, "hdmi");
1833 err = PTR_ERR_OR_ZERO(hdmi->hdmi);
1838 hdmi->pll = devm_regulator_get(&pdev->dev, "pll");
1839 err = PTR_ERR_OR_ZERO(hdmi->pll);
1844 hdmi->vdd = devm_regulator_get(&pdev->dev, "vdd");
1845 err = PTR_ERR_OR_ZERO(hdmi->vdd);
1850 hdmi->output.dev = &pdev->dev;
1852 err = tegra_output_probe(&hdmi->output);
1856 hdmi->regs = devm_platform_ioremap_resource(pdev, 0);
1857 if (IS_ERR(hdmi->regs)) {
1858 err = PTR_ERR(hdmi->regs);
1866 hdmi->irq = err;
1868 err = devm_request_irq(hdmi->dev, hdmi->irq, tegra_hdmi_irq, 0,
1869 dev_name(hdmi->dev), hdmi);
1872 hdmi->irq, err);
1876 platform_set_drvdata(pdev, hdmi);
1886 INIT_LIST_HEAD(&hdmi->client.list);
1887 hdmi->client.ops = &hdmi_client_ops;
1888 hdmi->client.dev = &pdev->dev;
1890 err = host1x_client_register(&hdmi->client);
1900 tegra_output_remove(&hdmi->output);
1906 struct tegra_hdmi *hdmi = platform_get_drvdata(pdev);
1908 host1x_client_unregister(&hdmi->client);
1910 tegra_output_remove(&hdmi->output);
1915 .name = "tegra-hdmi",