Lines Matching refs:hdmi

10 #include <linux/hdmi.h>
26 #include <sound/hdmi-codec.h>
164 struct sti_hdmi *hdmi;
177 u32 hdmi_read(struct sti_hdmi *hdmi, int offset)
179 return readl(hdmi->regs + offset);
182 void hdmi_write(struct sti_hdmi *hdmi, u32 val, int offset)
184 writel(val, hdmi->regs + offset);
195 struct sti_hdmi *hdmi = arg;
198 if (hdmi->irq_status & HDMI_INT_HOT_PLUG) {
199 hdmi->hpd = readl(hdmi->regs + HDMI_STA) & HDMI_STA_HOT_PLUG;
200 if (hdmi->drm_dev)
201 drm_helper_hpd_irq_event(hdmi->drm_dev);
207 if (hdmi->irq_status & (HDMI_INT_SW_RST | HDMI_INT_DLL_LCK)) {
208 hdmi->event_received = true;
209 wake_up_interruptible(&hdmi->wait_event);
213 if (hdmi->irq_status & HDMI_INT_AUDIO_FIFO_XRUN)
227 struct sti_hdmi *hdmi = arg;
230 hdmi->irq_status = hdmi_read(hdmi, HDMI_INT_STA);
233 hdmi_write(hdmi, hdmi->irq_status, HDMI_INT_CLR);
236 hdmi_read(hdmi, HDMI_INT_STA);
242 * Set hdmi active area depending on the drm display mode selected
244 * @hdmi: pointer on the hdmi internal structure
246 static void hdmi_active_area(struct sti_hdmi *hdmi)
251 xmin = sti_vtg_get_pixel_number(hdmi->mode, 1);
252 xmax = sti_vtg_get_pixel_number(hdmi->mode, hdmi->mode.hdisplay);
253 ymin = sti_vtg_get_line_number(hdmi->mode, 0);
254 ymax = sti_vtg_get_line_number(hdmi->mode, hdmi->mode.vdisplay - 1);
256 hdmi_write(hdmi, xmin, HDMI_ACTIVE_VID_XMIN);
257 hdmi_write(hdmi, xmax, HDMI_ACTIVE_VID_XMAX);
258 hdmi_write(hdmi, ymin, HDMI_ACTIVE_VID_YMIN);
259 hdmi_write(hdmi, ymax, HDMI_ACTIVE_VID_YMAX);
263 * Overall hdmi configuration
265 * @hdmi: pointer on the hdmi internal structure
267 static void hdmi_config(struct sti_hdmi *hdmi)
269 struct drm_connector *connector = hdmi->drm_connector;
283 if (hdmi->mode.flags & DRM_MODE_FLAG_NHSYNC) {
289 if (hdmi->mode.flags & DRM_MODE_FLAG_NVSYNC) {
297 hdmi_write(hdmi, conf, HDMI_CFG);
303 * @hdmi: pointer on the hdmi internal structure
306 static void hdmi_infoframe_reset(struct sti_hdmi *hdmi,
331 val = hdmi_read(hdmi, HDMI_SW_DI_CFG);
333 hdmi_write(hdmi, val, HDMI_SW_DI_CFG);
336 hdmi_write(hdmi, 0x0, head_offset);
338 hdmi_write(hdmi, 0x0, pack_offset + i);
344 * @ptr: pointer on the hdmi internal structure
361 * @hdmi: pointer on the hdmi internal structure
365 static void hdmi_infoframe_write_infopack(struct sti_hdmi *hdmi,
398 val = hdmi_read(hdmi, HDMI_SW_DI_CFG);
400 hdmi_write(hdmi, val, HDMI_SW_DI_CFG);
405 writel(val, hdmi->regs + head_offset);
419 writel(val, hdmi->regs + pack_offset + i);
423 val = hdmi_read(hdmi, HDMI_SW_DI_CFG);
425 hdmi_write(hdmi, val, HDMI_SW_DI_CFG);
435 * @hdmi: pointer on the hdmi internal structure
439 static int hdmi_avi_infoframe_config(struct sti_hdmi *hdmi)
441 struct drm_display_mode *mode = &hdmi->mode;
449 hdmi->drm_connector, mode);
456 infoframe.colorspace = hdmi->colorspace;
466 hdmi_infoframe_write_infopack(hdmi, buffer, ret);
478 * @hdmi: pointer on the hdmi internal structure
482 static int hdmi_audio_infoframe_config(struct sti_hdmi *hdmi)
484 struct hdmi_audio_params *audio = &hdmi->audio;
498 hdmi_infoframe_write_infopack(hdmi, buffer, ret);
501 val = hdmi_read(hdmi, HDMI_SW_DI_CFG);
504 hdmi_write(hdmi, val, HDMI_SW_DI_CFG);
516 * @hdmi: pointer on the hdmi internal structure
521 static int hdmi_vendor_infoframe_config(struct sti_hdmi *hdmi)
523 struct drm_display_mode *mode = &hdmi->mode;
531 hdmi->drm_connector,
549 hdmi_infoframe_write_infopack(hdmi, buffer, ret);
557 * Software reset of the hdmi subsystem
559 * @hdmi: pointer on the hdmi internal structure
562 static void hdmi_swreset(struct sti_hdmi *hdmi)
568 /* Enable hdmi_audio clock only during hdmi reset */
569 if (clk_prepare_enable(hdmi->clk_audio))
573 hdmi->event_received = false;
575 val = hdmi_read(hdmi, HDMI_CFG);
577 hdmi_write(hdmi, val, HDMI_CFG);
580 wait_event_interruptible_timeout(hdmi->wait_event,
581 hdmi->event_received,
589 if ((hdmi_read(hdmi, HDMI_STA) & HDMI_STA_SW_RST) == 0)
592 val = hdmi_read(hdmi, HDMI_CFG);
594 hdmi_write(hdmi, val, HDMI_CFG);
597 clk_disable_unprepare(hdmi->clk_audio);
603 hdmi_read(hdmi, reg))
639 DBGFS_PRINT_STR("hdmi cable:", tmp ? "connected" : "not connected");
673 struct sti_hdmi *hdmi = (struct sti_hdmi *)node->info_ent->data;
675 seq_printf(s, "HDMI: (vaddr = 0x%p)", hdmi->regs);
677 hdmi_dbg_cfg(s, hdmi_read(hdmi, HDMI_CFG));
680 hdmi_dbg_sta(s, hdmi_read(hdmi, HDMI_STA));
683 DBGFS_PRINT_INT("Xmin:", hdmi_read(hdmi, HDMI_ACTIVE_VID_XMIN));
686 DBGFS_PRINT_INT("Xmax:", hdmi_read(hdmi, HDMI_ACTIVE_VID_XMAX));
689 DBGFS_PRINT_INT("Ymin:", hdmi_read(hdmi, HDMI_ACTIVE_VID_YMIN));
692 DBGFS_PRINT_INT("Ymax:", hdmi_read(hdmi, HDMI_ACTIVE_VID_YMAX));
694 hdmi_dbg_sw_di_cfg(s, hdmi_read(hdmi, HDMI_SW_DI_CFG));
735 { "hdmi", hdmi_dbg_show, 0, NULL },
738 static void hdmi_debugfs_init(struct sti_hdmi *hdmi, struct drm_minor *minor)
743 hdmi_debugfs_files[i].data = hdmi;
752 struct sti_hdmi *hdmi = bridge->driver_private;
754 u32 val = hdmi_read(hdmi, HDMI_CFG);
756 if (!hdmi->enabled)
763 hdmi_write(hdmi, val, HDMI_CFG);
765 hdmi_write(hdmi, 0xffffffff, HDMI_INT_CLR);
768 hdmi->phy_ops->stop(hdmi);
771 hdmi_infoframe_reset(hdmi, HDMI_IFRAME_SLOT_AVI);
772 hdmi_infoframe_reset(hdmi, HDMI_IFRAME_SLOT_AUDIO);
773 hdmi_infoframe_reset(hdmi, HDMI_IFRAME_SLOT_VENDOR);
776 hdmi_write(hdmi, 0x0000, HDMI_DFLT_CHL0_DAT);
777 hdmi_write(hdmi, 0x0000, HDMI_DFLT_CHL1_DAT);
778 hdmi_write(hdmi, 0x0060, HDMI_DFLT_CHL2_DAT);
780 /* Disable/unprepare hdmi clock */
781 clk_disable_unprepare(hdmi->clk_phy);
782 clk_disable_unprepare(hdmi->clk_tmds);
783 clk_disable_unprepare(hdmi->clk_pix);
785 hdmi->enabled = false;
787 cec_notifier_set_phys_addr(hdmi->notifier, CEC_PHYS_ADDR_INVALID);
836 static int hdmi_audio_configure(struct sti_hdmi *hdmi)
839 struct hdmi_audio_params *params = &hdmi->audio;
844 if (!hdmi->enabled)
851 params->sample_rate, hdmi->mode.clock * 1000, n);
852 hdmi_write(hdmi, n, HDMI_AUDN);
877 hdmi_write(hdmi, audio_cfg, HDMI_AUDIO_CFG);
879 return hdmi_audio_infoframe_config(hdmi);
884 struct sti_hdmi *hdmi = bridge->driver_private;
888 if (hdmi->enabled)
892 if (clk_prepare_enable(hdmi->clk_pix))
894 if (clk_prepare_enable(hdmi->clk_tmds))
896 if (clk_prepare_enable(hdmi->clk_phy))
899 hdmi->enabled = true;
901 /* Program hdmi serializer and start phy */
902 if (!hdmi->phy_ops->start(hdmi)) {
903 DRM_ERROR("Unable to start hdmi phy\n");
907 /* Program hdmi active area */
908 hdmi_active_area(hdmi);
911 hdmi_write(hdmi, HDMI_WORKING_INT, HDMI_INT_EN);
913 /* Program hdmi config */
914 hdmi_config(hdmi);
917 if (hdmi_avi_infoframe_config(hdmi))
920 if (hdmi->audio.enabled) {
921 if (hdmi_audio_configure(hdmi))
924 hdmi_audio_infoframe_config(hdmi);
928 if (hdmi_vendor_infoframe_config(hdmi))
932 hdmi_swreset(hdmi);
939 struct sti_hdmi *hdmi = bridge->driver_private;
945 drm_mode_copy(&hdmi->mode, mode);
948 ret = clk_set_rate(hdmi->clk_pix, mode->clock * 1000);
954 ret = clk_set_rate(hdmi->clk_phy, mode->clock * 1000);
979 struct sti_hdmi *hdmi = hdmi_connector->hdmi;
985 edid = drm_get_edid(connector, hdmi->ddc_adapt);
989 cec_notifier_set_phys_addr_from_edid(hdmi->notifier, edid);
995 (connector->display_info.is_hdmi ? "hdmi monitor" : "dvi monitor"),
1018 struct sti_hdmi *hdmi = hdmi_connector->hdmi;
1021 result = clk_round_rate(hdmi->clk_pix, target);
1027 DRM_DEBUG_DRIVER("hdmi pixclk=%d not supported\n", target);
1046 struct sti_hdmi *hdmi = hdmi_connector->hdmi;
1050 if (hdmi->hpd) {
1051 DRM_DEBUG_DRIVER("hdmi cable connected\n");
1055 DRM_DEBUG_DRIVER("hdmi cable disconnected\n");
1056 cec_notifier_set_phys_addr(hdmi->notifier, CEC_PHYS_ADDR_INVALID);
1065 struct sti_hdmi *hdmi = hdmi_connector->hdmi;
1069 hdmi->colorspace = DEFAULT_COLORSPACE_MODE;
1078 drm_object_attach_property(&connector->base, prop, hdmi->colorspace);
1089 struct sti_hdmi *hdmi = hdmi_connector->hdmi;
1092 hdmi->colorspace = val;
1096 DRM_ERROR("failed to set hdmi connector property\n");
1108 struct sti_hdmi *hdmi = hdmi_connector->hdmi;
1111 *val = hdmi->colorspace;
1115 DRM_ERROR("failed to get hdmi connector property\n");
1123 struct sti_hdmi *hdmi = hdmi_connector->hdmi;
1125 hdmi_debugfs_init(hdmi, hdmi->drm_dev->primary);
1156 struct sti_hdmi *hdmi = dev_get_drvdata(dev);
1164 hdmi_write(hdmi, audio_cfg, HDMI_AUDIO_CFG);
1166 hdmi->audio.enabled = false;
1167 hdmi_audio_infoframe_config(hdmi);
1175 struct sti_hdmi *hdmi = dev_get_drvdata(dev);
1190 hdmi->audio.sample_width = params->sample_width;
1191 hdmi->audio.sample_rate = params->sample_rate;
1192 hdmi->audio.cea = params->cea;
1194 hdmi->audio.enabled = true;
1196 ret = hdmi_audio_configure(hdmi);
1206 struct sti_hdmi *hdmi = dev_get_drvdata(dev);
1211 hdmi_write(hdmi, HDMI_SAMPLE_FLAT_ALL, HDMI_SAMPLE_FLAT_MASK);
1213 hdmi_write(hdmi, HDMI_SAMPLE_FLAT_NO, HDMI_SAMPLE_FLAT_MASK);
1220 struct sti_hdmi *hdmi = dev_get_drvdata(dev);
1221 struct drm_connector *connector = hdmi->drm_connector;
1238 struct sti_hdmi *hdmi)
1248 hdmi->audio.enabled = false;
1250 hdmi->audio_pdev = platform_device_register_data(
1254 if (IS_ERR(hdmi->audio_pdev))
1255 return PTR_ERR(hdmi->audio_pdev);
1264 struct sti_hdmi *hdmi = dev_get_drvdata(dev);
1274 hdmi->drm_dev = drm_dev;
1284 connector->hdmi = hdmi;
1290 bridge->driver_private = hdmi;
1303 hdmi->ddc_adapt);
1310 hdmi->drm_connector = drm_connector;
1318 err = sti_hdmi_register_audio_driver(dev, hdmi);
1325 err = hdmi_audio_infoframe_init(&hdmi->audio.cea);
1332 hdmi->notifier = cec_notifier_conn_register(&hdmi->dev, NULL,
1334 if (!hdmi->notifier) {
1335 hdmi->drm_connector = NULL;
1340 hdmi_write(hdmi, HDMI_DEFAULT_INT, HDMI_INT_EN);
1345 hdmi->drm_connector = NULL;
1352 struct sti_hdmi *hdmi = dev_get_drvdata(dev);
1354 cec_notifier_conn_unregister(hdmi->notifier);
1364 .compatible = "st,stih407-hdmi",
1375 struct sti_hdmi *hdmi;
1383 hdmi = devm_kzalloc(dev, sizeof(*hdmi), GFP_KERNEL);
1384 if (!hdmi)
1389 hdmi->ddc_adapt = of_get_i2c_adapter_by_node(ddc);
1391 if (!hdmi->ddc_adapt)
1395 hdmi->dev = pdev->dev;
1398 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "hdmi-reg");
1400 DRM_ERROR("Invalid hdmi resource\n");
1404 hdmi->regs = devm_ioremap(dev, res->start, resource_size(res));
1405 if (!hdmi->regs) {
1410 hdmi->phy_ops = (struct hdmi_phy_ops *)
1414 hdmi->clk_pix = devm_clk_get(dev, "pix");
1415 if (IS_ERR(hdmi->clk_pix)) {
1417 ret = PTR_ERR(hdmi->clk_pix);
1421 hdmi->clk_tmds = devm_clk_get(dev, "tmds");
1422 if (IS_ERR(hdmi->clk_tmds)) {
1424 ret = PTR_ERR(hdmi->clk_tmds);
1428 hdmi->clk_phy = devm_clk_get(dev, "phy");
1429 if (IS_ERR(hdmi->clk_phy)) {
1431 ret = PTR_ERR(hdmi->clk_phy);
1435 hdmi->clk_audio = devm_clk_get(dev, "audio");
1436 if (IS_ERR(hdmi->clk_audio)) {
1438 ret = PTR_ERR(hdmi->clk_audio);
1442 hdmi->hpd = readl(hdmi->regs + HDMI_STA) & HDMI_STA_HOT_PLUG;
1444 init_waitqueue_head(&hdmi->wait_event);
1446 hdmi->irq = platform_get_irq_byname(pdev, "irq");
1447 if (hdmi->irq < 0) {
1449 ret = hdmi->irq;
1453 ret = devm_request_threaded_irq(dev, hdmi->irq, hdmi_irq,
1454 hdmi_irq_thread, IRQF_ONESHOT, dev_name(dev), hdmi);
1460 hdmi->reset = devm_reset_control_get(dev, "hdmi");
1461 /* Take hdmi out of reset */
1462 if (!IS_ERR(hdmi->reset))
1463 reset_control_deassert(hdmi->reset);
1465 platform_set_drvdata(pdev, hdmi);
1470 i2c_put_adapter(hdmi->ddc_adapt);
1477 struct sti_hdmi *hdmi = dev_get_drvdata(&pdev->dev);
1479 i2c_put_adapter(hdmi->ddc_adapt);
1480 if (hdmi->audio_pdev)
1481 platform_device_unregister(hdmi->audio_pdev);
1487 .name = "sti-hdmi",