Lines Matching refs:hdmi
119 struct sti_hdmi *hdmi; member
125 u32 hdmi_read(struct sti_hdmi *hdmi, int offset) in hdmi_read() argument
127 return readl(hdmi->regs + offset); in hdmi_read()
130 void hdmi_write(struct sti_hdmi *hdmi, u32 val, int offset) in hdmi_write() argument
132 writel(val, hdmi->regs + offset); in hdmi_write()
143 struct sti_hdmi *hdmi = arg; in hdmi_irq_thread() local
146 if (hdmi->irq_status & HDMI_INT_HOT_PLUG) { in hdmi_irq_thread()
147 hdmi->hpd = readl(hdmi->regs + HDMI_STA) & HDMI_STA_HOT_PLUG; in hdmi_irq_thread()
148 if (hdmi->drm_dev) in hdmi_irq_thread()
149 drm_helper_hpd_irq_event(hdmi->drm_dev); in hdmi_irq_thread()
155 if (hdmi->irq_status & (HDMI_INT_SW_RST | HDMI_INT_DLL_LCK)) { in hdmi_irq_thread()
156 hdmi->event_received = true; in hdmi_irq_thread()
157 wake_up_interruptible(&hdmi->wait_event); in hdmi_irq_thread()
171 struct sti_hdmi *hdmi = arg; in hdmi_irq() local
174 hdmi->irq_status = hdmi_read(hdmi, HDMI_INT_STA); in hdmi_irq()
177 hdmi_write(hdmi, hdmi->irq_status, HDMI_INT_CLR); in hdmi_irq()
180 hdmi_read(hdmi, HDMI_INT_STA); in hdmi_irq()
190 static void hdmi_active_area(struct sti_hdmi *hdmi) in hdmi_active_area() argument
195 xmin = sti_vtg_get_pixel_number(hdmi->mode, 1); in hdmi_active_area()
196 xmax = sti_vtg_get_pixel_number(hdmi->mode, hdmi->mode.hdisplay); in hdmi_active_area()
197 ymin = sti_vtg_get_line_number(hdmi->mode, 0); in hdmi_active_area()
198 ymax = sti_vtg_get_line_number(hdmi->mode, hdmi->mode.vdisplay - 1); in hdmi_active_area()
200 hdmi_write(hdmi, xmin, HDMI_ACTIVE_VID_XMIN); in hdmi_active_area()
201 hdmi_write(hdmi, xmax, HDMI_ACTIVE_VID_XMAX); in hdmi_active_area()
202 hdmi_write(hdmi, ymin, HDMI_ACTIVE_VID_YMIN); in hdmi_active_area()
203 hdmi_write(hdmi, ymax, HDMI_ACTIVE_VID_YMAX); in hdmi_active_area()
211 static void hdmi_config(struct sti_hdmi *hdmi) in hdmi_config() argument
227 if (hdmi->mode.flags & DRM_MODE_FLAG_NHSYNC) { in hdmi_config()
233 if (hdmi->mode.flags & DRM_MODE_FLAG_NVSYNC) { in hdmi_config()
241 hdmi_write(hdmi, conf, HDMI_CFG); in hdmi_config()
269 static void hdmi_infoframe_write_infopack(struct sti_hdmi *hdmi, const u8 *data) in hdmi_infoframe_write_infopack() argument
299 val = hdmi_read(hdmi, HDMI_SW_DI_CFG); in hdmi_infoframe_write_infopack()
301 hdmi_write(hdmi, val, HDMI_SW_DI_CFG); in hdmi_infoframe_write_infopack()
306 writel(val, hdmi->regs + head_offset); in hdmi_infoframe_write_infopack()
319 writel(val, hdmi->regs + pack_offset + i); in hdmi_infoframe_write_infopack()
323 val = hdmi_read(hdmi, HDMI_SW_DI_CFG); in hdmi_infoframe_write_infopack()
325 hdmi_write(hdmi, val, HDMI_SW_DI_CFG); in hdmi_infoframe_write_infopack()
339 static int hdmi_avi_infoframe_config(struct sti_hdmi *hdmi) in hdmi_avi_infoframe_config() argument
341 struct drm_display_mode *mode = &hdmi->mode; in hdmi_avi_infoframe_config()
365 hdmi_infoframe_write_infopack(hdmi, buffer); in hdmi_avi_infoframe_config()
381 static int hdmi_audio_infoframe_config(struct sti_hdmi *hdmi) in hdmi_audio_infoframe_config() argument
401 hdmi_infoframe_write_infopack(hdmi, buffer); in hdmi_audio_infoframe_config()
413 static void hdmi_swreset(struct sti_hdmi *hdmi) in hdmi_swreset() argument
420 if (clk_prepare_enable(hdmi->clk_audio)) in hdmi_swreset()
424 hdmi->event_received = false; in hdmi_swreset()
426 val = hdmi_read(hdmi, HDMI_CFG); in hdmi_swreset()
428 hdmi_write(hdmi, val, HDMI_CFG); in hdmi_swreset()
431 wait_event_interruptible_timeout(hdmi->wait_event, in hdmi_swreset()
432 hdmi->event_received == true, in hdmi_swreset()
440 if ((hdmi_read(hdmi, HDMI_STA) & HDMI_STA_SW_RST) == 0) in hdmi_swreset()
443 val = hdmi_read(hdmi, HDMI_CFG); in hdmi_swreset()
445 hdmi_write(hdmi, val, HDMI_CFG); in hdmi_swreset()
448 clk_disable_unprepare(hdmi->clk_audio); in hdmi_swreset()
453 struct sti_hdmi *hdmi = bridge->driver_private; in sti_hdmi_disable() local
455 u32 val = hdmi_read(hdmi, HDMI_CFG); in sti_hdmi_disable()
457 if (!hdmi->enabled) in sti_hdmi_disable()
464 hdmi_write(hdmi, val, HDMI_CFG); in sti_hdmi_disable()
466 hdmi_write(hdmi, 0xffffffff, HDMI_INT_CLR); in sti_hdmi_disable()
469 hdmi->phy_ops->stop(hdmi); in sti_hdmi_disable()
472 hdmi_write(hdmi, 0x0000, HDMI_DFLT_CHL0_DAT); in sti_hdmi_disable()
473 hdmi_write(hdmi, 0x0000, HDMI_DFLT_CHL1_DAT); in sti_hdmi_disable()
474 hdmi_write(hdmi, 0x0060, HDMI_DFLT_CHL2_DAT); in sti_hdmi_disable()
477 clk_disable_unprepare(hdmi->clk_phy); in sti_hdmi_disable()
478 clk_disable_unprepare(hdmi->clk_tmds); in sti_hdmi_disable()
479 clk_disable_unprepare(hdmi->clk_pix); in sti_hdmi_disable()
481 hdmi->enabled = false; in sti_hdmi_disable()
486 struct sti_hdmi *hdmi = bridge->driver_private; in sti_hdmi_pre_enable() local
490 if (hdmi->enabled) in sti_hdmi_pre_enable()
494 if (clk_prepare_enable(hdmi->clk_pix)) in sti_hdmi_pre_enable()
496 if (clk_prepare_enable(hdmi->clk_tmds)) in sti_hdmi_pre_enable()
498 if (clk_prepare_enable(hdmi->clk_phy)) in sti_hdmi_pre_enable()
501 hdmi->enabled = true; in sti_hdmi_pre_enable()
504 if (!hdmi->phy_ops->start(hdmi)) { in sti_hdmi_pre_enable()
510 hdmi_active_area(hdmi); in sti_hdmi_pre_enable()
513 hdmi_write(hdmi, HDMI_WORKING_INT, HDMI_INT_EN); in sti_hdmi_pre_enable()
516 hdmi_config(hdmi); in sti_hdmi_pre_enable()
519 if (hdmi_avi_infoframe_config(hdmi)) in sti_hdmi_pre_enable()
523 if (hdmi_audio_infoframe_config(hdmi)) in sti_hdmi_pre_enable()
527 hdmi_swreset(hdmi); in sti_hdmi_pre_enable()
534 struct sti_hdmi *hdmi = bridge->driver_private; in sti_hdmi_set_mode() local
540 memcpy(&hdmi->mode, mode, sizeof(struct drm_display_mode)); in sti_hdmi_set_mode()
543 ret = clk_set_rate(hdmi->clk_pix, mode->clock * 1000); in sti_hdmi_set_mode()
549 ret = clk_set_rate(hdmi->clk_phy, mode->clock * 1000); in sti_hdmi_set_mode()
574 struct sti_hdmi *hdmi = hdmi_connector->hdmi; in sti_hdmi_connector_get_modes() local
580 edid = drm_get_edid(connector, hdmi->ddc_adapt); in sti_hdmi_connector_get_modes()
606 struct sti_hdmi *hdmi = hdmi_connector->hdmi; in sti_hdmi_connector_mode_valid() local
609 result = clk_round_rate(hdmi->clk_pix, target); in sti_hdmi_connector_mode_valid()
644 struct sti_hdmi *hdmi = hdmi_connector->hdmi; in sti_hdmi_connector_detect() local
648 if (hdmi->hpd) { in sti_hdmi_connector_detect()
691 struct sti_hdmi *hdmi = dev_get_drvdata(dev); in sti_hdmi_bind() local
700 hdmi->drm_dev = drm_dev; in sti_hdmi_bind()
710 connector->hdmi = hdmi; in sti_hdmi_bind()
716 bridge->driver_private = hdmi; in sti_hdmi_bind()
743 hdmi_write(hdmi, HDMI_DEFAULT_INT, HDMI_INT_EN); in sti_hdmi_bind()
782 struct sti_hdmi *hdmi; in sti_hdmi_probe() local
790 hdmi = devm_kzalloc(dev, sizeof(*hdmi), GFP_KERNEL); in sti_hdmi_probe()
791 if (!hdmi) in sti_hdmi_probe()
796 hdmi->ddc_adapt = of_get_i2c_adapter_by_node(ddc); in sti_hdmi_probe()
798 if (!hdmi->ddc_adapt) in sti_hdmi_probe()
802 hdmi->dev = pdev->dev; in sti_hdmi_probe()
811 hdmi->regs = devm_ioremap_nocache(dev, res->start, resource_size(res)); in sti_hdmi_probe()
812 if (!hdmi->regs) { in sti_hdmi_probe()
825 hdmi->syscfg = devm_ioremap_nocache(dev, res->start, in sti_hdmi_probe()
827 if (!hdmi->syscfg) { in sti_hdmi_probe()
833 hdmi->phy_ops = (struct hdmi_phy_ops *) in sti_hdmi_probe()
837 hdmi->clk_pix = devm_clk_get(dev, "pix"); in sti_hdmi_probe()
838 if (IS_ERR(hdmi->clk_pix)) { in sti_hdmi_probe()
840 ret = PTR_ERR(hdmi->clk_pix); in sti_hdmi_probe()
844 hdmi->clk_tmds = devm_clk_get(dev, "tmds"); in sti_hdmi_probe()
845 if (IS_ERR(hdmi->clk_tmds)) { in sti_hdmi_probe()
847 ret = PTR_ERR(hdmi->clk_tmds); in sti_hdmi_probe()
851 hdmi->clk_phy = devm_clk_get(dev, "phy"); in sti_hdmi_probe()
852 if (IS_ERR(hdmi->clk_phy)) { in sti_hdmi_probe()
854 ret = PTR_ERR(hdmi->clk_phy); in sti_hdmi_probe()
858 hdmi->clk_audio = devm_clk_get(dev, "audio"); in sti_hdmi_probe()
859 if (IS_ERR(hdmi->clk_audio)) { in sti_hdmi_probe()
861 ret = PTR_ERR(hdmi->clk_audio); in sti_hdmi_probe()
865 hdmi->hpd = readl(hdmi->regs + HDMI_STA) & HDMI_STA_HOT_PLUG; in sti_hdmi_probe()
867 init_waitqueue_head(&hdmi->wait_event); in sti_hdmi_probe()
869 hdmi->irq = platform_get_irq_byname(pdev, "irq"); in sti_hdmi_probe()
871 ret = devm_request_threaded_irq(dev, hdmi->irq, hdmi_irq, in sti_hdmi_probe()
872 hdmi_irq_thread, IRQF_ONESHOT, dev_name(dev), hdmi); in sti_hdmi_probe()
878 hdmi->reset = devm_reset_control_get(dev, "hdmi"); in sti_hdmi_probe()
880 if (!IS_ERR(hdmi->reset)) in sti_hdmi_probe()
881 reset_control_deassert(hdmi->reset); in sti_hdmi_probe()
883 platform_set_drvdata(pdev, hdmi); in sti_hdmi_probe()
888 i2c_put_adapter(hdmi->ddc_adapt); in sti_hdmi_probe()
895 struct sti_hdmi *hdmi = dev_get_drvdata(&pdev->dev); in sti_hdmi_remove() local
897 i2c_put_adapter(hdmi->ddc_adapt); in sti_hdmi_remove()