Lines Matching refs:hdmi
10 #include <linux/hdmi.h>
25 #include <sound/hdmi-codec.h>
163 struct sti_hdmi *hdmi;
170 u32 hdmi_read(struct sti_hdmi *hdmi, int offset)
172 return readl(hdmi->regs + offset);
175 void hdmi_write(struct sti_hdmi *hdmi, u32 val, int offset)
177 writel(val, hdmi->regs + offset);
188 struct sti_hdmi *hdmi = arg;
191 if (hdmi->irq_status & HDMI_INT_HOT_PLUG) {
192 hdmi->hpd = readl(hdmi->regs + HDMI_STA) & HDMI_STA_HOT_PLUG;
193 if (hdmi->drm_dev)
194 drm_helper_hpd_irq_event(hdmi->drm_dev);
200 if (hdmi->irq_status & (HDMI_INT_SW_RST | HDMI_INT_DLL_LCK)) {
201 hdmi->event_received = true;
202 wake_up_interruptible(&hdmi->wait_event);
206 if (hdmi->irq_status & HDMI_INT_AUDIO_FIFO_XRUN)
220 struct sti_hdmi *hdmi = arg;
223 hdmi->irq_status = hdmi_read(hdmi, HDMI_INT_STA);
226 hdmi_write(hdmi, hdmi->irq_status, HDMI_INT_CLR);
229 hdmi_read(hdmi, HDMI_INT_STA);
235 * Set hdmi active area depending on the drm display mode selected
237 * @hdmi: pointer on the hdmi internal structure
239 static void hdmi_active_area(struct sti_hdmi *hdmi)
244 xmin = sti_vtg_get_pixel_number(hdmi->mode, 1);
245 xmax = sti_vtg_get_pixel_number(hdmi->mode, hdmi->mode.hdisplay);
246 ymin = sti_vtg_get_line_number(hdmi->mode, 0);
247 ymax = sti_vtg_get_line_number(hdmi->mode, hdmi->mode.vdisplay - 1);
249 hdmi_write(hdmi, xmin, HDMI_ACTIVE_VID_XMIN);
250 hdmi_write(hdmi, xmax, HDMI_ACTIVE_VID_XMAX);
251 hdmi_write(hdmi, ymin, HDMI_ACTIVE_VID_YMIN);
252 hdmi_write(hdmi, ymax, HDMI_ACTIVE_VID_YMAX);
256 * Overall hdmi configuration
258 * @hdmi: pointer on the hdmi internal structure
260 static void hdmi_config(struct sti_hdmi *hdmi)
271 if (hdmi->hdmi_monitor)
275 if (hdmi->mode.flags & DRM_MODE_FLAG_NHSYNC) {
281 if (hdmi->mode.flags & DRM_MODE_FLAG_NVSYNC) {
289 hdmi_write(hdmi, conf, HDMI_CFG);
295 * @hdmi: pointer on the hdmi internal structure
298 static void hdmi_infoframe_reset(struct sti_hdmi *hdmi,
323 val = hdmi_read(hdmi, HDMI_SW_DI_CFG);
325 hdmi_write(hdmi, val, HDMI_SW_DI_CFG);
328 hdmi_write(hdmi, 0x0, head_offset);
330 hdmi_write(hdmi, 0x0, pack_offset + i);
336 * @ptr: pointer on the hdmi internal structure
353 * @hdmi: pointer on the hdmi internal structure
357 static void hdmi_infoframe_write_infopack(struct sti_hdmi *hdmi,
390 val = hdmi_read(hdmi, HDMI_SW_DI_CFG);
392 hdmi_write(hdmi, val, HDMI_SW_DI_CFG);
397 writel(val, hdmi->regs + head_offset);
411 writel(val, hdmi->regs + pack_offset + i);
415 val = hdmi_read(hdmi, HDMI_SW_DI_CFG);
417 hdmi_write(hdmi, val, HDMI_SW_DI_CFG);
427 * @hdmi: pointer on the hdmi internal structure
431 static int hdmi_avi_infoframe_config(struct sti_hdmi *hdmi)
433 struct drm_display_mode *mode = &hdmi->mode;
441 hdmi->drm_connector, mode);
448 infoframe.colorspace = hdmi->colorspace;
458 hdmi_infoframe_write_infopack(hdmi, buffer, ret);
470 * @hdmi: pointer on the hdmi internal structure
474 static int hdmi_audio_infoframe_config(struct sti_hdmi *hdmi)
476 struct hdmi_audio_params *audio = &hdmi->audio;
490 hdmi_infoframe_write_infopack(hdmi, buffer, ret);
493 val = hdmi_read(hdmi, HDMI_SW_DI_CFG);
496 hdmi_write(hdmi, val, HDMI_SW_DI_CFG);
508 * @hdmi: pointer on the hdmi internal structure
513 static int hdmi_vendor_infoframe_config(struct sti_hdmi *hdmi)
515 struct drm_display_mode *mode = &hdmi->mode;
523 hdmi->drm_connector,
541 hdmi_infoframe_write_infopack(hdmi, buffer, ret);
549 * Software reset of the hdmi subsystem
551 * @hdmi: pointer on the hdmi internal structure
554 static void hdmi_swreset(struct sti_hdmi *hdmi)
560 /* Enable hdmi_audio clock only during hdmi reset */
561 if (clk_prepare_enable(hdmi->clk_audio))
565 hdmi->event_received = false;
567 val = hdmi_read(hdmi, HDMI_CFG);
569 hdmi_write(hdmi, val, HDMI_CFG);
572 wait_event_interruptible_timeout(hdmi->wait_event,
573 hdmi->event_received,
581 if ((hdmi_read(hdmi, HDMI_STA) & HDMI_STA_SW_RST) == 0)
584 val = hdmi_read(hdmi, HDMI_CFG);
586 hdmi_write(hdmi, val, HDMI_CFG);
589 clk_disable_unprepare(hdmi->clk_audio);
595 hdmi_read(hdmi, reg))
631 DBGFS_PRINT_STR("hdmi cable:", tmp ? "connected" : "not connected");
665 struct sti_hdmi *hdmi = (struct sti_hdmi *)node->info_ent->data;
667 seq_printf(s, "HDMI: (vaddr = 0x%p)", hdmi->regs);
669 hdmi_dbg_cfg(s, hdmi_read(hdmi, HDMI_CFG));
672 hdmi_dbg_sta(s, hdmi_read(hdmi, HDMI_STA));
675 DBGFS_PRINT_INT("Xmin:", hdmi_read(hdmi, HDMI_ACTIVE_VID_XMIN));
678 DBGFS_PRINT_INT("Xmax:", hdmi_read(hdmi, HDMI_ACTIVE_VID_XMAX));
681 DBGFS_PRINT_INT("Ymin:", hdmi_read(hdmi, HDMI_ACTIVE_VID_YMIN));
684 DBGFS_PRINT_INT("Ymax:", hdmi_read(hdmi, HDMI_ACTIVE_VID_YMAX));
686 hdmi_dbg_sw_di_cfg(s, hdmi_read(hdmi, HDMI_SW_DI_CFG));
727 { "hdmi", hdmi_dbg_show, 0, NULL },
730 static void hdmi_debugfs_init(struct sti_hdmi *hdmi, struct drm_minor *minor)
735 hdmi_debugfs_files[i].data = hdmi;
744 struct sti_hdmi *hdmi = bridge->driver_private;
746 u32 val = hdmi_read(hdmi, HDMI_CFG);
748 if (!hdmi->enabled)
755 hdmi_write(hdmi, val, HDMI_CFG);
757 hdmi_write(hdmi, 0xffffffff, HDMI_INT_CLR);
760 hdmi->phy_ops->stop(hdmi);
763 hdmi_infoframe_reset(hdmi, HDMI_IFRAME_SLOT_AVI);
764 hdmi_infoframe_reset(hdmi, HDMI_IFRAME_SLOT_AUDIO);
765 hdmi_infoframe_reset(hdmi, HDMI_IFRAME_SLOT_VENDOR);
768 hdmi_write(hdmi, 0x0000, HDMI_DFLT_CHL0_DAT);
769 hdmi_write(hdmi, 0x0000, HDMI_DFLT_CHL1_DAT);
770 hdmi_write(hdmi, 0x0060, HDMI_DFLT_CHL2_DAT);
772 /* Disable/unprepare hdmi clock */
773 clk_disable_unprepare(hdmi->clk_phy);
774 clk_disable_unprepare(hdmi->clk_tmds);
775 clk_disable_unprepare(hdmi->clk_pix);
777 hdmi->enabled = false;
779 cec_notifier_set_phys_addr(hdmi->notifier, CEC_PHYS_ADDR_INVALID);
828 static int hdmi_audio_configure(struct sti_hdmi *hdmi)
831 struct hdmi_audio_params *params = &hdmi->audio;
836 if (!hdmi->enabled)
843 params->sample_rate, hdmi->mode.clock * 1000, n);
844 hdmi_write(hdmi, n, HDMI_AUDN);
869 hdmi_write(hdmi, audio_cfg, HDMI_AUDIO_CFG);
871 return hdmi_audio_infoframe_config(hdmi);
876 struct sti_hdmi *hdmi = bridge->driver_private;
880 if (hdmi->enabled)
884 if (clk_prepare_enable(hdmi->clk_pix))
886 if (clk_prepare_enable(hdmi->clk_tmds))
888 if (clk_prepare_enable(hdmi->clk_phy))
891 hdmi->enabled = true;
893 /* Program hdmi serializer and start phy */
894 if (!hdmi->phy_ops->start(hdmi)) {
895 DRM_ERROR("Unable to start hdmi phy\n");
899 /* Program hdmi active area */
900 hdmi_active_area(hdmi);
903 hdmi_write(hdmi, HDMI_WORKING_INT, HDMI_INT_EN);
905 /* Program hdmi config */
906 hdmi_config(hdmi);
909 if (hdmi_avi_infoframe_config(hdmi))
912 if (hdmi->audio.enabled) {
913 if (hdmi_audio_configure(hdmi))
916 hdmi_audio_infoframe_config(hdmi);
920 if (hdmi_vendor_infoframe_config(hdmi))
924 hdmi_swreset(hdmi);
931 struct sti_hdmi *hdmi = bridge->driver_private;
937 drm_mode_copy(&hdmi->mode, mode);
940 ret = clk_set_rate(hdmi->clk_pix, mode->clock * 1000);
946 ret = clk_set_rate(hdmi->clk_phy, mode->clock * 1000);
971 struct sti_hdmi *hdmi = hdmi_connector->hdmi;
977 edid = drm_get_edid(connector, hdmi->ddc_adapt);
981 hdmi->hdmi_monitor = drm_detect_hdmi_monitor(edid);
983 (hdmi->hdmi_monitor ? "hdmi monitor" : "dvi monitor"),
985 cec_notifier_set_phys_addr_from_edid(hdmi->notifier, edid);
1010 struct sti_hdmi *hdmi = hdmi_connector->hdmi;
1013 result = clk_round_rate(hdmi->clk_pix, target);
1019 DRM_DEBUG_DRIVER("hdmi pixclk=%d not supported\n", target);
1038 struct sti_hdmi *hdmi = hdmi_connector->hdmi;
1042 if (hdmi->hpd) {
1043 DRM_DEBUG_DRIVER("hdmi cable connected\n");
1047 DRM_DEBUG_DRIVER("hdmi cable disconnected\n");
1048 cec_notifier_set_phys_addr(hdmi->notifier, CEC_PHYS_ADDR_INVALID);
1057 struct sti_hdmi *hdmi = hdmi_connector->hdmi;
1061 hdmi->colorspace = DEFAULT_COLORSPACE_MODE;
1070 drm_object_attach_property(&connector->base, prop, hdmi->colorspace);
1081 struct sti_hdmi *hdmi = hdmi_connector->hdmi;
1084 hdmi->colorspace = val;
1088 DRM_ERROR("failed to set hdmi connector property\n");
1100 struct sti_hdmi *hdmi = hdmi_connector->hdmi;
1103 *val = hdmi->colorspace;
1107 DRM_ERROR("failed to get hdmi connector property\n");
1115 struct sti_hdmi *hdmi = hdmi_connector->hdmi;
1117 hdmi_debugfs_init(hdmi, hdmi->drm_dev->primary);
1148 struct sti_hdmi *hdmi = dev_get_drvdata(dev);
1156 hdmi_write(hdmi, audio_cfg, HDMI_AUDIO_CFG);
1158 hdmi->audio.enabled = false;
1159 hdmi_audio_infoframe_config(hdmi);
1167 struct sti_hdmi *hdmi = dev_get_drvdata(dev);
1182 hdmi->audio.sample_width = params->sample_width;
1183 hdmi->audio.sample_rate = params->sample_rate;
1184 hdmi->audio.cea = params->cea;
1186 hdmi->audio.enabled = true;
1188 ret = hdmi_audio_configure(hdmi);
1198 struct sti_hdmi *hdmi = dev_get_drvdata(dev);
1203 hdmi_write(hdmi, HDMI_SAMPLE_FLAT_ALL, HDMI_SAMPLE_FLAT_MASK);
1205 hdmi_write(hdmi, HDMI_SAMPLE_FLAT_NO, HDMI_SAMPLE_FLAT_MASK);
1212 struct sti_hdmi *hdmi = dev_get_drvdata(dev);
1213 struct drm_connector *connector = hdmi->drm_connector;
1230 struct sti_hdmi *hdmi)
1240 hdmi->audio.enabled = false;
1242 hdmi->audio_pdev = platform_device_register_data(
1246 if (IS_ERR(hdmi->audio_pdev))
1247 return PTR_ERR(hdmi->audio_pdev);
1256 struct sti_hdmi *hdmi = dev_get_drvdata(dev);
1266 hdmi->drm_dev = drm_dev;
1276 connector->hdmi = hdmi;
1282 bridge->driver_private = hdmi;
1295 hdmi->ddc_adapt);
1302 hdmi->drm_connector = drm_connector;
1310 err = sti_hdmi_register_audio_driver(dev, hdmi);
1317 err = hdmi_audio_infoframe_init(&hdmi->audio.cea);
1324 hdmi->notifier = cec_notifier_conn_register(&hdmi->dev, NULL,
1326 if (!hdmi->notifier) {
1327 hdmi->drm_connector = NULL;
1332 hdmi_write(hdmi, HDMI_DEFAULT_INT, HDMI_INT_EN);
1337 hdmi->drm_connector = NULL;
1344 struct sti_hdmi *hdmi = dev_get_drvdata(dev);
1346 cec_notifier_conn_unregister(hdmi->notifier);
1356 .compatible = "st,stih407-hdmi",
1367 struct sti_hdmi *hdmi;
1375 hdmi = devm_kzalloc(dev, sizeof(*hdmi), GFP_KERNEL);
1376 if (!hdmi)
1381 hdmi->ddc_adapt = of_get_i2c_adapter_by_node(ddc);
1383 if (!hdmi->ddc_adapt)
1387 hdmi->dev = pdev->dev;
1390 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "hdmi-reg");
1392 DRM_ERROR("Invalid hdmi resource\n");
1396 hdmi->regs = devm_ioremap(dev, res->start, resource_size(res));
1397 if (!hdmi->regs) {
1402 hdmi->phy_ops = (struct hdmi_phy_ops *)
1406 hdmi->clk_pix = devm_clk_get(dev, "pix");
1407 if (IS_ERR(hdmi->clk_pix)) {
1409 ret = PTR_ERR(hdmi->clk_pix);
1413 hdmi->clk_tmds = devm_clk_get(dev, "tmds");
1414 if (IS_ERR(hdmi->clk_tmds)) {
1416 ret = PTR_ERR(hdmi->clk_tmds);
1420 hdmi->clk_phy = devm_clk_get(dev, "phy");
1421 if (IS_ERR(hdmi->clk_phy)) {
1423 ret = PTR_ERR(hdmi->clk_phy);
1427 hdmi->clk_audio = devm_clk_get(dev, "audio");
1428 if (IS_ERR(hdmi->clk_audio)) {
1430 ret = PTR_ERR(hdmi->clk_audio);
1434 hdmi->hpd = readl(hdmi->regs + HDMI_STA) & HDMI_STA_HOT_PLUG;
1436 init_waitqueue_head(&hdmi->wait_event);
1438 hdmi->irq = platform_get_irq_byname(pdev, "irq");
1439 if (hdmi->irq < 0) {
1441 ret = hdmi->irq;
1445 ret = devm_request_threaded_irq(dev, hdmi->irq, hdmi_irq,
1446 hdmi_irq_thread, IRQF_ONESHOT, dev_name(dev), hdmi);
1452 hdmi->reset = devm_reset_control_get(dev, "hdmi");
1453 /* Take hdmi out of reset */
1454 if (!IS_ERR(hdmi->reset))
1455 reset_control_deassert(hdmi->reset);
1457 platform_set_drvdata(pdev, hdmi);
1462 i2c_put_adapter(hdmi->ddc_adapt);
1469 struct sti_hdmi *hdmi = dev_get_drvdata(&pdev->dev);
1471 i2c_put_adapter(hdmi->ddc_adapt);
1472 if (hdmi->audio_pdev)
1473 platform_device_unregister(hdmi->audio_pdev);
1481 .name = "sti-hdmi",