Lines Matching refs:hdmi
49 struct regulator *hdmi; member
92 static inline u32 tegra_hdmi_readl(struct tegra_hdmi *hdmi, in tegra_hdmi_readl() argument
95 return readl(hdmi->regs + (offset << 2)); in tegra_hdmi_readl()
98 static inline void tegra_hdmi_writel(struct tegra_hdmi *hdmi, u32 value, in tegra_hdmi_writel() argument
101 writel(value, hdmi->regs + (offset << 2)); in tegra_hdmi_writel()
452 static void tegra_hdmi_setup_audio_fs_tables(struct tegra_hdmi *hdmi) in tegra_hdmi_setup_audio_fs_tables() argument
475 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_AUDIO_FS(i)); in tegra_hdmi_setup_audio_fs_tables()
479 static int tegra_hdmi_setup_audio(struct tegra_hdmi *hdmi, unsigned int pclk) in tegra_hdmi_setup_audio() argument
481 struct device_node *node = hdmi->dev->of_node; in tegra_hdmi_setup_audio()
486 switch (hdmi->audio_source) { in tegra_hdmi_setup_audio()
503 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_AUDIO_CNTRL0); in tegra_hdmi_setup_audio()
506 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_SOR_AUDIO_CNTRL0); in tegra_hdmi_setup_audio()
510 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_AUDIO_CNTRL0); in tegra_hdmi_setup_audio()
513 config = tegra_hdmi_get_audio_config(hdmi->audio_freq, pclk); in tegra_hdmi_setup_audio()
515 dev_err(hdmi->dev, "cannot set audio to %u at %u pclk\n", in tegra_hdmi_setup_audio()
516 hdmi->audio_freq, pclk); in tegra_hdmi_setup_audio()
520 tegra_hdmi_writel(hdmi, 0, HDMI_NV_PDISP_HDMI_ACR_CTRL); in tegra_hdmi_setup_audio()
524 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_AUDIO_N); in tegra_hdmi_setup_audio()
526 tegra_hdmi_writel(hdmi, ACR_SUBPACK_N(config->n) | ACR_ENABLE, in tegra_hdmi_setup_audio()
530 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_HDMI_ACR_0441_SUBPACK_LOW); in tegra_hdmi_setup_audio()
533 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_HDMI_SPARE); in tegra_hdmi_setup_audio()
535 value = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_AUDIO_N); in tegra_hdmi_setup_audio()
537 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_AUDIO_N); in tegra_hdmi_setup_audio()
540 switch (hdmi->audio_freq) { in tegra_hdmi_setup_audio()
570 tegra_hdmi_writel(hdmi, config->aval, offset); in tegra_hdmi_setup_audio()
573 tegra_hdmi_setup_audio_fs_tables(hdmi); in tegra_hdmi_setup_audio()
589 static void tegra_hdmi_write_infopack(struct tegra_hdmi *hdmi, const void *data, in tegra_hdmi_write_infopack() argument
611 dev_err(hdmi->dev, "unsupported infoframe type: %02x\n", in tegra_hdmi_write_infopack()
619 tegra_hdmi_writel(hdmi, value, offset); in tegra_hdmi_write_infopack()
631 tegra_hdmi_writel(hdmi, value, offset++); in tegra_hdmi_write_infopack()
636 tegra_hdmi_writel(hdmi, value, offset++); in tegra_hdmi_write_infopack()
640 static void tegra_hdmi_setup_avi_infoframe(struct tegra_hdmi *hdmi, in tegra_hdmi_setup_avi_infoframe() argument
647 if (hdmi->dvi) { in tegra_hdmi_setup_avi_infoframe()
648 tegra_hdmi_writel(hdmi, 0, in tegra_hdmi_setup_avi_infoframe()
655 dev_err(hdmi->dev, "failed to setup AVI infoframe: %zd\n", err); in tegra_hdmi_setup_avi_infoframe()
661 dev_err(hdmi->dev, "failed to pack AVI infoframe: %zd\n", err); in tegra_hdmi_setup_avi_infoframe()
665 tegra_hdmi_write_infopack(hdmi, buffer, err); in tegra_hdmi_setup_avi_infoframe()
667 tegra_hdmi_writel(hdmi, INFOFRAME_CTRL_ENABLE, in tegra_hdmi_setup_avi_infoframe()
671 static void tegra_hdmi_setup_audio_infoframe(struct tegra_hdmi *hdmi) in tegra_hdmi_setup_audio_infoframe() argument
677 if (hdmi->dvi) { in tegra_hdmi_setup_audio_infoframe()
678 tegra_hdmi_writel(hdmi, 0, in tegra_hdmi_setup_audio_infoframe()
685 dev_err(hdmi->dev, "failed to setup audio infoframe: %zd\n", in tegra_hdmi_setup_audio_infoframe()
694 dev_err(hdmi->dev, "failed to pack audio infoframe: %zd\n", in tegra_hdmi_setup_audio_infoframe()
705 tegra_hdmi_write_infopack(hdmi, buffer, min_t(size_t, 10, err)); in tegra_hdmi_setup_audio_infoframe()
707 tegra_hdmi_writel(hdmi, INFOFRAME_CTRL_ENABLE, in tegra_hdmi_setup_audio_infoframe()
711 static void tegra_hdmi_setup_stereo_infoframe(struct tegra_hdmi *hdmi) in tegra_hdmi_setup_stereo_infoframe() argument
718 if (!hdmi->stereo) { in tegra_hdmi_setup_stereo_infoframe()
719 value = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_HDMI_GENERIC_CTRL); in tegra_hdmi_setup_stereo_infoframe()
721 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_HDMI_GENERIC_CTRL); in tegra_hdmi_setup_stereo_infoframe()
730 dev_err(hdmi->dev, "failed to pack vendor infoframe: %zd\n", in tegra_hdmi_setup_stereo_infoframe()
735 tegra_hdmi_write_infopack(hdmi, buffer, err); in tegra_hdmi_setup_stereo_infoframe()
737 value = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_HDMI_GENERIC_CTRL); in tegra_hdmi_setup_stereo_infoframe()
739 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_HDMI_GENERIC_CTRL); in tegra_hdmi_setup_stereo_infoframe()
742 static void tegra_hdmi_setup_tmds(struct tegra_hdmi *hdmi, in tegra_hdmi_setup_tmds() argument
747 tegra_hdmi_writel(hdmi, tmds->pll0, HDMI_NV_PDISP_SOR_PLL0); in tegra_hdmi_setup_tmds()
748 tegra_hdmi_writel(hdmi, tmds->pll1, HDMI_NV_PDISP_SOR_PLL1); in tegra_hdmi_setup_tmds()
749 tegra_hdmi_writel(hdmi, tmds->pe_current, HDMI_NV_PDISP_PE_CURRENT); in tegra_hdmi_setup_tmds()
751 tegra_hdmi_writel(hdmi, tmds->drive_current, in tegra_hdmi_setup_tmds()
754 value = tegra_hdmi_readl(hdmi, hdmi->config->fuse_override_offset); in tegra_hdmi_setup_tmds()
755 value |= hdmi->config->fuse_override_value; in tegra_hdmi_setup_tmds()
756 tegra_hdmi_writel(hdmi, value, hdmi->config->fuse_override_offset); in tegra_hdmi_setup_tmds()
758 if (hdmi->config->has_sor_io_peak_current) in tegra_hdmi_setup_tmds()
759 tegra_hdmi_writel(hdmi, tmds->peak_current, in tegra_hdmi_setup_tmds()
795 struct tegra_hdmi *hdmi = to_hdmi(output); in tegra_hdmi_connector_mode_valid() local
801 parent = clk_get_parent(hdmi->clk_parent); in tegra_hdmi_connector_mode_valid()
841 struct tegra_hdmi *hdmi = to_hdmi(output); in tegra_hdmi_encoder_mode_set() local
847 hdmi->dvi = !tegra_output_is_hdmi(output); in tegra_hdmi_encoder_mode_set()
854 err = clk_set_rate(hdmi->clk, pclk); in tegra_hdmi_encoder_mode_set()
856 dev_err(hdmi->dev, "failed to set HDMI clock frequency: %d\n", in tegra_hdmi_encoder_mode_set()
860 DRM_DEBUG_KMS("HDMI clock rate: %lu Hz\n", clk_get_rate(hdmi->clk)); in tegra_hdmi_encoder_mode_set()
863 value = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_SOR_PLL0); in tegra_hdmi_encoder_mode_set()
865 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_SOR_PLL0); in tegra_hdmi_encoder_mode_set()
869 value = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_SOR_PLL0); in tegra_hdmi_encoder_mode_set()
871 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_SOR_PLL0); in tegra_hdmi_encoder_mode_set()
892 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_HDMI_VSYNC_WINDOW); in tegra_hdmi_encoder_mode_set()
901 tegra_hdmi_writel(hdmi, in tegra_hdmi_encoder_mode_set()
905 tegra_hdmi_writel(hdmi, in tegra_hdmi_encoder_mode_set()
909 div82 = clk_get_rate(hdmi->clk) / 1000000 * 4; in tegra_hdmi_encoder_mode_set()
911 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_SOR_REFCLK); in tegra_hdmi_encoder_mode_set()
913 if (!hdmi->dvi) { in tegra_hdmi_encoder_mode_set()
914 err = tegra_hdmi_setup_audio(hdmi, pclk); in tegra_hdmi_encoder_mode_set()
916 hdmi->dvi = true; in tegra_hdmi_encoder_mode_set()
930 if (!hdmi->dvi) in tegra_hdmi_encoder_mode_set()
933 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_HDMI_CTRL); in tegra_hdmi_encoder_mode_set()
935 if (hdmi->dvi) in tegra_hdmi_encoder_mode_set()
936 tegra_hdmi_writel(hdmi, 0x0, in tegra_hdmi_encoder_mode_set()
939 tegra_hdmi_writel(hdmi, GENERIC_CTRL_AUDIO, in tegra_hdmi_encoder_mode_set()
942 tegra_hdmi_setup_avi_infoframe(hdmi, mode); in tegra_hdmi_encoder_mode_set()
943 tegra_hdmi_setup_audio_infoframe(hdmi); in tegra_hdmi_encoder_mode_set()
944 tegra_hdmi_setup_stereo_infoframe(hdmi); in tegra_hdmi_encoder_mode_set()
947 for (i = 0; i < hdmi->config->num_tmds; i++) { in tegra_hdmi_encoder_mode_set()
948 if (pclk <= hdmi->config->tmds[i].pclk) { in tegra_hdmi_encoder_mode_set()
949 tegra_hdmi_setup_tmds(hdmi, &hdmi->config->tmds[i]); in tegra_hdmi_encoder_mode_set()
954 tegra_hdmi_writel(hdmi, in tegra_hdmi_encoder_mode_set()
968 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_SOR_SEQ_INST(0)); in tegra_hdmi_encoder_mode_set()
969 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_SOR_SEQ_INST(8)); in tegra_hdmi_encoder_mode_set()
971 value = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_SOR_CSTM); in tegra_hdmi_encoder_mode_set()
978 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_SOR_CSTM); in tegra_hdmi_encoder_mode_set()
981 tegra_hdmi_writel(hdmi, in tegra_hdmi_encoder_mode_set()
987 tegra_hdmi_writel(hdmi, in tegra_hdmi_encoder_mode_set()
996 value = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_SOR_PWR); in tegra_hdmi_encoder_mode_set()
1018 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_SOR_STATE2); in tegra_hdmi_encoder_mode_set()
1021 tegra_hdmi_writel(hdmi, value, HDMI_NV_PDISP_SOR_STATE1); in tegra_hdmi_encoder_mode_set()
1023 tegra_hdmi_writel(hdmi, 0, HDMI_NV_PDISP_SOR_STATE0); in tegra_hdmi_encoder_mode_set()
1024 tegra_hdmi_writel(hdmi, SOR_STATE_UPDATE, HDMI_NV_PDISP_SOR_STATE0); in tegra_hdmi_encoder_mode_set()
1025 tegra_hdmi_writel(hdmi, value | SOR_STATE_ATTACHED, in tegra_hdmi_encoder_mode_set()
1027 tegra_hdmi_writel(hdmi, 0, HDMI_NV_PDISP_SOR_STATE0); in tegra_hdmi_encoder_mode_set()
1064 struct tegra_hdmi *hdmi = to_hdmi(output); in tegra_hdmi_encoder_atomic_check() local
1067 err = tegra_dc_state_setup_clock(dc, crtc_state, hdmi->clk_parent, in tegra_hdmi_encoder_atomic_check()
1089 struct tegra_hdmi *hdmi = node->info_ent->data; in tegra_hdmi_show_regs() local
1092 err = clk_prepare_enable(hdmi->clk); in tegra_hdmi_show_regs()
1098 tegra_hdmi_readl(hdmi, name)) in tegra_hdmi_show_regs()
1261 clk_disable_unprepare(hdmi->clk); in tegra_hdmi_show_regs()
1270 static int tegra_hdmi_debugfs_init(struct tegra_hdmi *hdmi, in tegra_hdmi_debugfs_init() argument
1276 hdmi->debugfs = debugfs_create_dir("hdmi", minor->debugfs_root); in tegra_hdmi_debugfs_init()
1277 if (!hdmi->debugfs) in tegra_hdmi_debugfs_init()
1280 hdmi->debugfs_files = kmemdup(debugfs_files, sizeof(debugfs_files), in tegra_hdmi_debugfs_init()
1282 if (!hdmi->debugfs_files) { in tegra_hdmi_debugfs_init()
1288 hdmi->debugfs_files[i].data = hdmi; in tegra_hdmi_debugfs_init()
1290 err = drm_debugfs_create_files(hdmi->debugfs_files, in tegra_hdmi_debugfs_init()
1292 hdmi->debugfs, minor); in tegra_hdmi_debugfs_init()
1296 hdmi->minor = minor; in tegra_hdmi_debugfs_init()
1301 kfree(hdmi->debugfs_files); in tegra_hdmi_debugfs_init()
1302 hdmi->debugfs_files = NULL; in tegra_hdmi_debugfs_init()
1304 debugfs_remove(hdmi->debugfs); in tegra_hdmi_debugfs_init()
1305 hdmi->debugfs = NULL; in tegra_hdmi_debugfs_init()
1310 static void tegra_hdmi_debugfs_exit(struct tegra_hdmi *hdmi) in tegra_hdmi_debugfs_exit() argument
1312 drm_debugfs_remove_files(hdmi->debugfs_files, ARRAY_SIZE(debugfs_files), in tegra_hdmi_debugfs_exit()
1313 hdmi->minor); in tegra_hdmi_debugfs_exit()
1314 hdmi->minor = NULL; in tegra_hdmi_debugfs_exit()
1316 kfree(hdmi->debugfs_files); in tegra_hdmi_debugfs_exit()
1317 hdmi->debugfs_files = NULL; in tegra_hdmi_debugfs_exit()
1319 debugfs_remove(hdmi->debugfs); in tegra_hdmi_debugfs_exit()
1320 hdmi->debugfs = NULL; in tegra_hdmi_debugfs_exit()
1326 struct tegra_hdmi *hdmi = host1x_client_to_hdmi(client); in tegra_hdmi_init() local
1329 hdmi->output.dev = client->dev; in tegra_hdmi_init()
1331 drm_connector_init(drm, &hdmi->output.connector, in tegra_hdmi_init()
1334 drm_connector_helper_add(&hdmi->output.connector, in tegra_hdmi_init()
1336 hdmi->output.connector.dpms = DRM_MODE_DPMS_OFF; in tegra_hdmi_init()
1338 drm_encoder_init(drm, &hdmi->output.encoder, &tegra_hdmi_encoder_funcs, in tegra_hdmi_init()
1340 drm_encoder_helper_add(&hdmi->output.encoder, in tegra_hdmi_init()
1343 drm_mode_connector_attach_encoder(&hdmi->output.connector, in tegra_hdmi_init()
1344 &hdmi->output.encoder); in tegra_hdmi_init()
1345 drm_connector_register(&hdmi->output.connector); in tegra_hdmi_init()
1347 err = tegra_output_init(drm, &hdmi->output); in tegra_hdmi_init()
1353 hdmi->output.encoder.possible_crtcs = 0x3; in tegra_hdmi_init()
1356 err = tegra_hdmi_debugfs_init(hdmi, drm->primary); in tegra_hdmi_init()
1361 err = regulator_enable(hdmi->hdmi); in tegra_hdmi_init()
1368 err = regulator_enable(hdmi->pll); in tegra_hdmi_init()
1370 dev_err(hdmi->dev, "failed to enable PLL regulator: %d\n", err); in tegra_hdmi_init()
1374 err = regulator_enable(hdmi->vdd); in tegra_hdmi_init()
1376 dev_err(hdmi->dev, "failed to enable VDD regulator: %d\n", err); in tegra_hdmi_init()
1380 err = clk_prepare_enable(hdmi->clk); in tegra_hdmi_init()
1382 dev_err(hdmi->dev, "failed to enable clock: %d\n", err); in tegra_hdmi_init()
1386 reset_control_deassert(hdmi->rst); in tegra_hdmi_init()
1393 struct tegra_hdmi *hdmi = host1x_client_to_hdmi(client); in tegra_hdmi_exit() local
1395 tegra_output_exit(&hdmi->output); in tegra_hdmi_exit()
1397 reset_control_assert(hdmi->rst); in tegra_hdmi_exit()
1398 clk_disable_unprepare(hdmi->clk); in tegra_hdmi_exit()
1400 regulator_disable(hdmi->vdd); in tegra_hdmi_exit()
1401 regulator_disable(hdmi->pll); in tegra_hdmi_exit()
1402 regulator_disable(hdmi->hdmi); in tegra_hdmi_exit()
1405 tegra_hdmi_debugfs_exit(hdmi); in tegra_hdmi_exit()
1459 struct tegra_hdmi *hdmi; in tegra_hdmi_probe() local
1467 hdmi = devm_kzalloc(&pdev->dev, sizeof(*hdmi), GFP_KERNEL); in tegra_hdmi_probe()
1468 if (!hdmi) in tegra_hdmi_probe()
1471 hdmi->config = match->data; in tegra_hdmi_probe()
1472 hdmi->dev = &pdev->dev; in tegra_hdmi_probe()
1473 hdmi->audio_source = AUTO; in tegra_hdmi_probe()
1474 hdmi->audio_freq = 44100; in tegra_hdmi_probe()
1475 hdmi->stereo = false; in tegra_hdmi_probe()
1476 hdmi->dvi = false; in tegra_hdmi_probe()
1478 hdmi->clk = devm_clk_get(&pdev->dev, NULL); in tegra_hdmi_probe()
1479 if (IS_ERR(hdmi->clk)) { in tegra_hdmi_probe()
1481 return PTR_ERR(hdmi->clk); in tegra_hdmi_probe()
1484 hdmi->rst = devm_reset_control_get(&pdev->dev, "hdmi"); in tegra_hdmi_probe()
1485 if (IS_ERR(hdmi->rst)) { in tegra_hdmi_probe()
1487 return PTR_ERR(hdmi->rst); in tegra_hdmi_probe()
1490 hdmi->clk_parent = devm_clk_get(&pdev->dev, "parent"); in tegra_hdmi_probe()
1491 if (IS_ERR(hdmi->clk_parent)) in tegra_hdmi_probe()
1492 return PTR_ERR(hdmi->clk_parent); in tegra_hdmi_probe()
1494 err = clk_set_parent(hdmi->clk, hdmi->clk_parent); in tegra_hdmi_probe()
1500 hdmi->hdmi = devm_regulator_get(&pdev->dev, "hdmi"); in tegra_hdmi_probe()
1501 if (IS_ERR(hdmi->hdmi)) { in tegra_hdmi_probe()
1503 return PTR_ERR(hdmi->hdmi); in tegra_hdmi_probe()
1506 hdmi->pll = devm_regulator_get(&pdev->dev, "pll"); in tegra_hdmi_probe()
1507 if (IS_ERR(hdmi->pll)) { in tegra_hdmi_probe()
1509 return PTR_ERR(hdmi->pll); in tegra_hdmi_probe()
1512 hdmi->vdd = devm_regulator_get(&pdev->dev, "vdd"); in tegra_hdmi_probe()
1513 if (IS_ERR(hdmi->vdd)) { in tegra_hdmi_probe()
1515 return PTR_ERR(hdmi->vdd); in tegra_hdmi_probe()
1518 hdmi->output.dev = &pdev->dev; in tegra_hdmi_probe()
1520 err = tegra_output_probe(&hdmi->output); in tegra_hdmi_probe()
1525 hdmi->regs = devm_ioremap_resource(&pdev->dev, regs); in tegra_hdmi_probe()
1526 if (IS_ERR(hdmi->regs)) in tegra_hdmi_probe()
1527 return PTR_ERR(hdmi->regs); in tegra_hdmi_probe()
1533 hdmi->irq = err; in tegra_hdmi_probe()
1535 INIT_LIST_HEAD(&hdmi->client.list); in tegra_hdmi_probe()
1536 hdmi->client.ops = &hdmi_client_ops; in tegra_hdmi_probe()
1537 hdmi->client.dev = &pdev->dev; in tegra_hdmi_probe()
1539 err = host1x_client_register(&hdmi->client); in tegra_hdmi_probe()
1546 platform_set_drvdata(pdev, hdmi); in tegra_hdmi_probe()
1553 struct tegra_hdmi *hdmi = platform_get_drvdata(pdev); in tegra_hdmi_remove() local
1556 err = host1x_client_unregister(&hdmi->client); in tegra_hdmi_remove()
1563 tegra_output_remove(&hdmi->output); in tegra_hdmi_remove()
1565 clk_disable_unprepare(hdmi->clk_parent); in tegra_hdmi_remove()
1566 clk_disable_unprepare(hdmi->clk); in tegra_hdmi_remove()