Lines Matching refs:vc4_hdmi

129 	struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);  in vc4_hdmi_supports_scrambling()  local
130 struct drm_display_info *display = &vc4_hdmi->connector.display_info; in vc4_hdmi_supports_scrambling()
132 lockdep_assert_held(&vc4_hdmi->mutex); in vc4_hdmi_supports_scrambling()
153 static bool vc4_hdmi_is_full_range_rgb(struct vc4_hdmi *vc4_hdmi, in vc4_hdmi_is_full_range_rgb() argument
156 struct drm_display_info *display = &vc4_hdmi->connector.display_info; in vc4_hdmi_is_full_range_rgb()
165 struct vc4_hdmi *vc4_hdmi = node->info_ent->data; in vc4_hdmi_debugfs_regs() local
166 struct drm_device *drm = vc4_hdmi->connector.dev; in vc4_hdmi_debugfs_regs()
173 drm_print_regset32(&p, &vc4_hdmi->hdmi_regset); in vc4_hdmi_debugfs_regs()
174 drm_print_regset32(&p, &vc4_hdmi->hd_regset); in vc4_hdmi_debugfs_regs()
175 drm_print_regset32(&p, &vc4_hdmi->cec_regset); in vc4_hdmi_debugfs_regs()
176 drm_print_regset32(&p, &vc4_hdmi->csc_regset); in vc4_hdmi_debugfs_regs()
177 drm_print_regset32(&p, &vc4_hdmi->dvp_regset); in vc4_hdmi_debugfs_regs()
178 drm_print_regset32(&p, &vc4_hdmi->phy_regset); in vc4_hdmi_debugfs_regs()
179 drm_print_regset32(&p, &vc4_hdmi->ram_regset); in vc4_hdmi_debugfs_regs()
180 drm_print_regset32(&p, &vc4_hdmi->rm_regset); in vc4_hdmi_debugfs_regs()
187 static void vc4_hdmi_reset(struct vc4_hdmi *vc4_hdmi) in vc4_hdmi_reset() argument
189 struct drm_device *drm = vc4_hdmi->connector.dev; in vc4_hdmi_reset()
200 spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_reset()
214 spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_reset()
220 static void vc5_hdmi_reset(struct vc4_hdmi *vc4_hdmi) in vc5_hdmi_reset() argument
222 struct drm_device *drm = vc4_hdmi->connector.dev; in vc5_hdmi_reset()
233 reset_control_reset(vc4_hdmi->reset); in vc5_hdmi_reset()
235 spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); in vc5_hdmi_reset()
242 spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags); in vc5_hdmi_reset()
249 static void vc4_hdmi_cec_update_clk_div(struct vc4_hdmi *vc4_hdmi) in vc4_hdmi_cec_update_clk_div() argument
251 struct drm_device *drm = vc4_hdmi->connector.dev; in vc4_hdmi_cec_update_clk_div()
267 cec_rate = clk_get_rate(vc4_hdmi->cec_clock); in vc4_hdmi_cec_update_clk_div()
269 spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_cec_update_clk_div()
282 spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_cec_update_clk_div()
288 static void vc4_hdmi_cec_update_clk_div(struct vc4_hdmi *vc4_hdmi) {} in vc4_hdmi_cec_update_clk_div() argument
323 struct vc4_hdmi *vc4_hdmi = connector_to_vc4_hdmi(connector); in vc4_hdmi_reset_link() local
324 struct drm_encoder *encoder = &vc4_hdmi->encoder.base; in vc4_hdmi_reset_link()
352 mutex_lock(&vc4_hdmi->mutex); in vc4_hdmi_reset_link()
355 mutex_unlock(&vc4_hdmi->mutex); in vc4_hdmi_reset_link()
359 scrambling_needed = vc4_hdmi_mode_needs_scrambling(&vc4_hdmi->saved_adjusted_mode, in vc4_hdmi_reset_link()
360 vc4_hdmi->output_bpc, in vc4_hdmi_reset_link()
361 vc4_hdmi->output_format); in vc4_hdmi_reset_link()
363 mutex_unlock(&vc4_hdmi->mutex); in vc4_hdmi_reset_link()
369 mutex_unlock(&vc4_hdmi->mutex); in vc4_hdmi_reset_link()
376 mutex_unlock(&vc4_hdmi->mutex); in vc4_hdmi_reset_link()
381 mutex_unlock(&vc4_hdmi->mutex); in vc4_hdmi_reset_link()
385 mutex_unlock(&vc4_hdmi->mutex); in vc4_hdmi_reset_link()
399 static void vc4_hdmi_handle_hotplug(struct vc4_hdmi *vc4_hdmi, in vc4_hdmi_handle_hotplug() argument
403 struct drm_connector *connector = &vc4_hdmi->connector; in vc4_hdmi_handle_hotplug()
422 cec_phys_addr_invalidate(vc4_hdmi->cec_adap); in vc4_hdmi_handle_hotplug()
426 edid = drm_get_edid(connector, vc4_hdmi->ddc); in vc4_hdmi_handle_hotplug()
430 cec_s_phys_addr_from_edid(vc4_hdmi->cec_adap, edid); in vc4_hdmi_handle_hotplug()
440 struct vc4_hdmi *vc4_hdmi = connector_to_vc4_hdmi(connector); in vc4_hdmi_connector_detect_ctx() local
454 WARN_ON(pm_runtime_resume_and_get(&vc4_hdmi->pdev->dev)); in vc4_hdmi_connector_detect_ctx()
456 if (vc4_hdmi->hpd_gpio) { in vc4_hdmi_connector_detect_ctx()
457 if (gpiod_get_value_cansleep(vc4_hdmi->hpd_gpio)) in vc4_hdmi_connector_detect_ctx()
460 if (vc4_hdmi->variant->hp_detect && in vc4_hdmi_connector_detect_ctx()
461 vc4_hdmi->variant->hp_detect(vc4_hdmi)) in vc4_hdmi_connector_detect_ctx()
465 vc4_hdmi_handle_hotplug(vc4_hdmi, ctx, status); in vc4_hdmi_connector_detect_ctx()
466 pm_runtime_put(&vc4_hdmi->pdev->dev); in vc4_hdmi_connector_detect_ctx()
473 struct vc4_hdmi *vc4_hdmi = connector_to_vc4_hdmi(connector); in vc4_hdmi_connector_get_modes() local
488 edid = drm_get_edid(connector, vc4_hdmi->ddc); in vc4_hdmi_connector_get_modes()
489 cec_s_phys_addr_from_edid(vc4_hdmi->cec_adap, edid); in vc4_hdmi_connector_get_modes()
497 if (vc4_hdmi->disable_4kp60) { in vc4_hdmi_connector_get_modes()
593 struct vc4_hdmi *vc4_hdmi) in vc4_hdmi_connector_init() argument
595 struct drm_connector *connector = &vc4_hdmi->connector; in vc4_hdmi_connector_init()
596 struct drm_encoder *encoder = &vc4_hdmi->encoder.base; in vc4_hdmi_connector_init()
602 vc4_hdmi->ddc); in vc4_hdmi_connector_init()
635 if (vc4_hdmi->variant->supports_hdr) in vc4_hdmi_connector_init()
647 struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder); in vc4_hdmi_stop_packet() local
648 struct drm_device *drm = vc4_hdmi->connector.dev; in vc4_hdmi_stop_packet()
657 spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_stop_packet()
660 spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_stop_packet()
674 struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder); in vc4_hdmi_write_infoframe() local
675 struct drm_device *drm = vc4_hdmi->connector.dev; in vc4_hdmi_write_infoframe()
678 &vc4_hdmi->variant->registers[HDMI_RAM_PACKET_START]; in vc4_hdmi_write_infoframe()
682 void __iomem *base = __vc4_hdmi_get_field_base(vc4_hdmi, in vc4_hdmi_write_infoframe()
707 spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_write_infoframe()
734 spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_write_infoframe()
772 struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder); in vc4_hdmi_set_avi_infoframe() local
773 struct drm_connector *connector = &vc4_hdmi->connector; in vc4_hdmi_set_avi_infoframe()
777 const struct drm_display_mode *mode = &vc4_hdmi->saved_adjusted_mode; in vc4_hdmi_set_avi_infoframe()
781 lockdep_assert_held(&vc4_hdmi->mutex); in vc4_hdmi_set_avi_infoframe()
792 vc4_hdmi_is_full_range_rgb(vc4_hdmi, mode) ? in vc4_hdmi_set_avi_infoframe()
820 struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder); in vc4_hdmi_set_audio_infoframe() local
821 struct hdmi_audio_infoframe *audio = &vc4_hdmi->audio.infoframe; in vc4_hdmi_set_audio_infoframe()
826 if (vc4_hdmi->packet_ram_enabled) in vc4_hdmi_set_audio_infoframe()
832 struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder); in vc4_hdmi_set_hdr_infoframe() local
833 struct drm_connector *connector = &vc4_hdmi->connector; in vc4_hdmi_set_hdr_infoframe()
837 lockdep_assert_held(&vc4_hdmi->mutex); in vc4_hdmi_set_hdr_infoframe()
839 if (!vc4_hdmi->variant->supports_hdr) in vc4_hdmi_set_hdr_infoframe()
853 struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder); in vc4_hdmi_set_infoframes() local
855 lockdep_assert_held(&vc4_hdmi->mutex); in vc4_hdmi_set_infoframes()
863 if (vc4_hdmi->audio.streaming) in vc4_hdmi_set_infoframes()
873 struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder); in vc4_hdmi_enable_scrambling() local
874 struct drm_device *drm = vc4_hdmi->connector.dev; in vc4_hdmi_enable_scrambling()
875 const struct drm_display_mode *mode = &vc4_hdmi->saved_adjusted_mode; in vc4_hdmi_enable_scrambling()
879 lockdep_assert_held(&vc4_hdmi->mutex); in vc4_hdmi_enable_scrambling()
885 vc4_hdmi->output_bpc, in vc4_hdmi_enable_scrambling()
886 vc4_hdmi->output_format)) in vc4_hdmi_enable_scrambling()
892 drm_scdc_set_high_tmds_clock_ratio(vc4_hdmi->ddc, true); in vc4_hdmi_enable_scrambling()
893 drm_scdc_set_scrambling(vc4_hdmi->ddc, true); in vc4_hdmi_enable_scrambling()
895 spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_enable_scrambling()
898 spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_enable_scrambling()
902 vc4_hdmi->scdc_enabled = true; in vc4_hdmi_enable_scrambling()
904 queue_delayed_work(system_wq, &vc4_hdmi->scrambling_work, in vc4_hdmi_enable_scrambling()
910 struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder); in vc4_hdmi_disable_scrambling() local
911 struct drm_device *drm = vc4_hdmi->connector.dev; in vc4_hdmi_disable_scrambling()
915 lockdep_assert_held(&vc4_hdmi->mutex); in vc4_hdmi_disable_scrambling()
917 if (!vc4_hdmi->scdc_enabled) in vc4_hdmi_disable_scrambling()
920 vc4_hdmi->scdc_enabled = false; in vc4_hdmi_disable_scrambling()
922 if (delayed_work_pending(&vc4_hdmi->scrambling_work)) in vc4_hdmi_disable_scrambling()
923 cancel_delayed_work_sync(&vc4_hdmi->scrambling_work); in vc4_hdmi_disable_scrambling()
928 spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_disable_scrambling()
931 spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_disable_scrambling()
933 drm_scdc_set_scrambling(vc4_hdmi->ddc, false); in vc4_hdmi_disable_scrambling()
934 drm_scdc_set_high_tmds_clock_ratio(vc4_hdmi->ddc, false); in vc4_hdmi_disable_scrambling()
941 struct vc4_hdmi *vc4_hdmi = container_of(to_delayed_work(work), in vc4_hdmi_scrambling_wq() local
942 struct vc4_hdmi, in vc4_hdmi_scrambling_wq()
945 if (drm_scdc_get_scrambling_status(vc4_hdmi->ddc)) in vc4_hdmi_scrambling_wq()
948 drm_scdc_set_high_tmds_clock_ratio(vc4_hdmi->ddc, true); in vc4_hdmi_scrambling_wq()
949 drm_scdc_set_scrambling(vc4_hdmi->ddc, true); in vc4_hdmi_scrambling_wq()
951 queue_delayed_work(system_wq, &vc4_hdmi->scrambling_work, in vc4_hdmi_scrambling_wq()
958 struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder); in vc4_hdmi_encoder_post_crtc_disable() local
959 struct drm_device *drm = vc4_hdmi->connector.dev; in vc4_hdmi_encoder_post_crtc_disable()
963 mutex_lock(&vc4_hdmi->mutex); in vc4_hdmi_encoder_post_crtc_disable()
965 vc4_hdmi->packet_ram_enabled = false; in vc4_hdmi_encoder_post_crtc_disable()
970 spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_encoder_post_crtc_disable()
976 spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_encoder_post_crtc_disable()
980 spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_encoder_post_crtc_disable()
983 spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_encoder_post_crtc_disable()
990 mutex_unlock(&vc4_hdmi->mutex); in vc4_hdmi_encoder_post_crtc_disable()
996 struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder); in vc4_hdmi_encoder_post_crtc_powerdown() local
997 struct drm_device *drm = vc4_hdmi->connector.dev; in vc4_hdmi_encoder_post_crtc_powerdown()
1002 mutex_lock(&vc4_hdmi->mutex); in vc4_hdmi_encoder_post_crtc_powerdown()
1007 spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_encoder_post_crtc_powerdown()
1010 spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_encoder_post_crtc_powerdown()
1012 if (vc4_hdmi->variant->phy_disable) in vc4_hdmi_encoder_post_crtc_powerdown()
1013 vc4_hdmi->variant->phy_disable(vc4_hdmi); in vc4_hdmi_encoder_post_crtc_powerdown()
1015 clk_disable_unprepare(vc4_hdmi->pixel_bvb_clock); in vc4_hdmi_encoder_post_crtc_powerdown()
1016 clk_disable_unprepare(vc4_hdmi->pixel_clock); in vc4_hdmi_encoder_post_crtc_powerdown()
1018 ret = pm_runtime_put(&vc4_hdmi->pdev->dev); in vc4_hdmi_encoder_post_crtc_powerdown()
1025 mutex_unlock(&vc4_hdmi->mutex); in vc4_hdmi_encoder_post_crtc_powerdown()
1028 static void vc4_hdmi_csc_setup(struct vc4_hdmi *vc4_hdmi, in vc4_hdmi_csc_setup() argument
1032 struct drm_device *drm = vc4_hdmi->connector.dev; in vc4_hdmi_csc_setup()
1040 spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_csc_setup()
1045 if (!vc4_hdmi_is_full_range_rgb(vc4_hdmi, mode)) { in vc4_hdmi_csc_setup()
1072 spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_csc_setup()
1142 static void vc5_hdmi_set_csc_coeffs(struct vc4_hdmi *vc4_hdmi, in vc5_hdmi_set_csc_coeffs() argument
1145 lockdep_assert_held(&vc4_hdmi->hw_lock); in vc5_hdmi_set_csc_coeffs()
1155 static void vc5_hdmi_csc_setup(struct vc4_hdmi *vc4_hdmi, in vc5_hdmi_csc_setup() argument
1159 struct drm_device *drm = vc4_hdmi->connector.dev; in vc5_hdmi_csc_setup()
1173 spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); in vc5_hdmi_csc_setup()
1177 vc5_hdmi_set_csc_coeffs(vc4_hdmi, vc5_hdmi_csc_full_rgb_to_limited_yuv444_bt709); in vc5_hdmi_csc_setup()
1192 vc5_hdmi_set_csc_coeffs(vc4_hdmi, vc5_hdmi_csc_full_rgb_to_limited_yuv422_bt709); in vc5_hdmi_csc_setup()
1198 if (!vc4_hdmi_is_full_range_rgb(vc4_hdmi, mode)) in vc5_hdmi_csc_setup()
1199 vc5_hdmi_set_csc_coeffs(vc4_hdmi, vc5_hdmi_csc_full_rgb_to_limited_rgb); in vc5_hdmi_csc_setup()
1201 vc5_hdmi_set_csc_coeffs(vc4_hdmi, vc5_hdmi_csc_full_rgb_unity); in vc5_hdmi_csc_setup()
1213 spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags); in vc5_hdmi_csc_setup()
1218 static void vc4_hdmi_set_timings(struct vc4_hdmi *vc4_hdmi, in vc4_hdmi_set_timings() argument
1222 struct drm_device *drm = vc4_hdmi->connector.dev; in vc4_hdmi_set_timings()
1247 spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_set_timings()
1277 spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_set_timings()
1282 static void vc5_hdmi_set_timings(struct vc4_hdmi *vc4_hdmi, in vc5_hdmi_set_timings() argument
1286 struct drm_device *drm = vc4_hdmi->connector.dev; in vc5_hdmi_set_timings()
1315 spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); in vc5_hdmi_set_timings()
1389 spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags); in vc5_hdmi_set_timings()
1394 static void vc4_hdmi_recenter_fifo(struct vc4_hdmi *vc4_hdmi) in vc4_hdmi_recenter_fifo() argument
1396 struct drm_device *drm = vc4_hdmi->connector.dev; in vc4_hdmi_recenter_fifo()
1405 spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_recenter_fifo()
1415 spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_recenter_fifo()
1419 spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_recenter_fifo()
1426 spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_recenter_fifo()
1439 struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder); in vc4_hdmi_encoder_pre_crtc_configure() local
1440 struct drm_device *drm = vc4_hdmi->connector.dev; in vc4_hdmi_encoder_pre_crtc_configure()
1441 struct drm_connector *connector = &vc4_hdmi->connector; in vc4_hdmi_encoder_pre_crtc_configure()
1446 const struct drm_display_mode *mode = &vc4_hdmi->saved_adjusted_mode; in vc4_hdmi_encoder_pre_crtc_configure()
1453 mutex_lock(&vc4_hdmi->mutex); in vc4_hdmi_encoder_pre_crtc_configure()
1475 ret = clk_set_min_rate(vc4_hdmi->hsm_clock, hsm_rate); in vc4_hdmi_encoder_pre_crtc_configure()
1481 ret = pm_runtime_resume_and_get(&vc4_hdmi->pdev->dev); in vc4_hdmi_encoder_pre_crtc_configure()
1487 ret = clk_set_rate(vc4_hdmi->pixel_clock, tmds_char_rate); in vc4_hdmi_encoder_pre_crtc_configure()
1493 ret = clk_prepare_enable(vc4_hdmi->pixel_clock); in vc4_hdmi_encoder_pre_crtc_configure()
1500 vc4_hdmi_cec_update_clk_div(vc4_hdmi); in vc4_hdmi_encoder_pre_crtc_configure()
1509 ret = clk_set_min_rate(vc4_hdmi->pixel_bvb_clock, bvb_rate); in vc4_hdmi_encoder_pre_crtc_configure()
1515 ret = clk_prepare_enable(vc4_hdmi->pixel_bvb_clock); in vc4_hdmi_encoder_pre_crtc_configure()
1521 if (vc4_hdmi->variant->phy_init) in vc4_hdmi_encoder_pre_crtc_configure()
1522 vc4_hdmi->variant->phy_init(vc4_hdmi, vc4_conn_state); in vc4_hdmi_encoder_pre_crtc_configure()
1524 spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_encoder_pre_crtc_configure()
1531 spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_encoder_pre_crtc_configure()
1533 if (vc4_hdmi->variant->set_timings) in vc4_hdmi_encoder_pre_crtc_configure()
1534 vc4_hdmi->variant->set_timings(vc4_hdmi, conn_state, mode); in vc4_hdmi_encoder_pre_crtc_configure()
1538 mutex_unlock(&vc4_hdmi->mutex); in vc4_hdmi_encoder_pre_crtc_configure()
1543 clk_disable_unprepare(vc4_hdmi->pixel_clock); in vc4_hdmi_encoder_pre_crtc_configure()
1545 pm_runtime_put(&vc4_hdmi->pdev->dev); in vc4_hdmi_encoder_pre_crtc_configure()
1549 mutex_unlock(&vc4_hdmi->mutex); in vc4_hdmi_encoder_pre_crtc_configure()
1556 struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder); in vc4_hdmi_encoder_pre_crtc_enable() local
1557 struct drm_device *drm = vc4_hdmi->connector.dev; in vc4_hdmi_encoder_pre_crtc_enable()
1558 struct drm_connector *connector = &vc4_hdmi->connector; in vc4_hdmi_encoder_pre_crtc_enable()
1559 const struct drm_display_mode *mode = &vc4_hdmi->saved_adjusted_mode; in vc4_hdmi_encoder_pre_crtc_enable()
1565 mutex_lock(&vc4_hdmi->mutex); in vc4_hdmi_encoder_pre_crtc_enable()
1570 if (vc4_hdmi->variant->csc_setup) in vc4_hdmi_encoder_pre_crtc_enable()
1571 vc4_hdmi->variant->csc_setup(vc4_hdmi, conn_state, mode); in vc4_hdmi_encoder_pre_crtc_enable()
1573 spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_encoder_pre_crtc_enable()
1575 spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_encoder_pre_crtc_enable()
1580 mutex_unlock(&vc4_hdmi->mutex); in vc4_hdmi_encoder_pre_crtc_enable()
1586 struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder); in vc4_hdmi_encoder_post_crtc_enable() local
1587 struct drm_device *drm = vc4_hdmi->connector.dev; in vc4_hdmi_encoder_post_crtc_enable()
1588 const struct drm_display_mode *mode = &vc4_hdmi->saved_adjusted_mode; in vc4_hdmi_encoder_post_crtc_enable()
1589 struct drm_display_info *display = &vc4_hdmi->connector.display_info; in vc4_hdmi_encoder_post_crtc_enable()
1596 mutex_lock(&vc4_hdmi->mutex); in vc4_hdmi_encoder_post_crtc_enable()
1601 spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_encoder_post_crtc_enable()
1619 spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_encoder_post_crtc_enable()
1633 spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_encoder_post_crtc_enable()
1642 spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_encoder_post_crtc_enable()
1650 spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_encoder_post_crtc_enable()
1651 vc4_hdmi->packet_ram_enabled = true; in vc4_hdmi_encoder_post_crtc_enable()
1656 vc4_hdmi_recenter_fifo(vc4_hdmi); in vc4_hdmi_encoder_post_crtc_enable()
1662 mutex_unlock(&vc4_hdmi->mutex); in vc4_hdmi_encoder_post_crtc_enable()
1669 struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder); in vc4_hdmi_encoder_atomic_mode_set() local
1673 mutex_lock(&vc4_hdmi->mutex); in vc4_hdmi_encoder_atomic_mode_set()
1674 drm_mode_copy(&vc4_hdmi->saved_adjusted_mode, in vc4_hdmi_encoder_atomic_mode_set()
1676 vc4_hdmi->output_bpc = vc4_state->output_bpc; in vc4_hdmi_encoder_atomic_mode_set()
1677 vc4_hdmi->output_format = vc4_state->output_format; in vc4_hdmi_encoder_atomic_mode_set()
1678 mutex_unlock(&vc4_hdmi->mutex); in vc4_hdmi_encoder_atomic_mode_set()
1682 vc4_hdmi_sink_supports_format_bpc(const struct vc4_hdmi *vc4_hdmi, in vc4_hdmi_sink_supports_format_bpc() argument
1687 struct drm_device *dev = vc4_hdmi->connector.dev; in vc4_hdmi_sink_supports_format_bpc()
1766 vc4_hdmi_encoder_clock_valid(const struct vc4_hdmi *vc4_hdmi, in vc4_hdmi_encoder_clock_valid() argument
1769 const struct drm_connector *connector = &vc4_hdmi->connector; in vc4_hdmi_encoder_clock_valid()
1772 if (clock > vc4_hdmi->variant->max_pixel_clock) in vc4_hdmi_encoder_clock_valid()
1775 if (vc4_hdmi->disable_4kp60 && clock > HDMI_14_MAX_TMDS_CLK) in vc4_hdmi_encoder_clock_valid()
1804 vc4_hdmi_encoder_compute_clock(const struct vc4_hdmi *vc4_hdmi, in vc4_hdmi_encoder_compute_clock() argument
1812 if (vc4_hdmi_encoder_clock_valid(vc4_hdmi, clock) != MODE_OK) in vc4_hdmi_encoder_compute_clock()
1821 vc4_hdmi_encoder_compute_format(const struct vc4_hdmi *vc4_hdmi, in vc4_hdmi_encoder_compute_format() argument
1826 struct drm_device *dev = vc4_hdmi->connector.dev; in vc4_hdmi_encoder_compute_format()
1827 const struct drm_connector *connector = &vc4_hdmi->connector; in vc4_hdmi_encoder_compute_format()
1834 if (vc4_hdmi_sink_supports_format_bpc(vc4_hdmi, info, mode, format, bpc)) { in vc4_hdmi_encoder_compute_format()
1837 ret = vc4_hdmi_encoder_compute_clock(vc4_hdmi, vc4_state, in vc4_hdmi_encoder_compute_format()
1848 if (vc4_hdmi_sink_supports_format_bpc(vc4_hdmi, info, mode, format, bpc)) { in vc4_hdmi_encoder_compute_format()
1851 ret = vc4_hdmi_encoder_compute_clock(vc4_hdmi, vc4_state, in vc4_hdmi_encoder_compute_format()
1865 vc4_hdmi_encoder_compute_config(const struct vc4_hdmi *vc4_hdmi, in vc4_hdmi_encoder_compute_config() argument
1869 struct drm_device *dev = vc4_hdmi->connector.dev; in vc4_hdmi_encoder_compute_config()
1878 ret = vc4_hdmi_encoder_compute_format(vc4_hdmi, vc4_state, in vc4_hdmi_encoder_compute_config()
1905 struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder); in vc4_hdmi_encoder_atomic_check() local
1906 struct drm_connector *connector = &vc4_hdmi->connector; in vc4_hdmi_encoder_atomic_check()
1917 if (vc4_hdmi->variant->unsupported_odd_h_timings) { in vc4_hdmi_encoder_atomic_check()
1944 if (vc4_hdmi->disable_wifi_frequencies && in vc4_hdmi_encoder_atomic_check()
1951 ret = vc4_hdmi_encoder_compute_config(vc4_hdmi, vc4_state, mode); in vc4_hdmi_encoder_atomic_check()
1967 struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder); in vc4_hdmi_encoder_mode_valid() local
1969 if (vc4_hdmi->variant->unsupported_odd_h_timings && in vc4_hdmi_encoder_mode_valid()
1975 return vc4_hdmi_encoder_clock_valid(vc4_hdmi, mode->clock * 1000); in vc4_hdmi_encoder_mode_valid()
1987 struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder); in vc4_hdmi_late_register() local
1988 const struct vc4_hdmi_variant *variant = vc4_hdmi->variant; in vc4_hdmi_late_register()
1993 vc4_hdmi); in vc4_hdmi_late_register()
2004 static u32 vc4_hdmi_channel_map(struct vc4_hdmi *vc4_hdmi, u32 channel_mask) in vc4_hdmi_channel_map() argument
2016 static u32 vc5_hdmi_channel_map(struct vc4_hdmi *vc4_hdmi, u32 channel_mask) in vc5_hdmi_channel_map() argument
2028 static bool vc5_hdmi_hp_detect(struct vc4_hdmi *vc4_hdmi) in vc5_hdmi_hp_detect() argument
2030 struct drm_device *drm = vc4_hdmi->connector.dev; in vc5_hdmi_hp_detect()
2038 spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); in vc5_hdmi_hp_detect()
2040 spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags); in vc5_hdmi_hp_detect()
2048 static void vc4_hdmi_audio_set_mai_clock(struct vc4_hdmi *vc4_hdmi, in vc4_hdmi_audio_set_mai_clock() argument
2051 struct drm_device *drm = vc4_hdmi->connector.dev; in vc4_hdmi_audio_set_mai_clock()
2060 hsm_clock = clk_get_rate(vc4_hdmi->audio_clock); in vc4_hdmi_audio_set_mai_clock()
2068 spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_audio_set_mai_clock()
2072 spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_audio_set_mai_clock()
2077 static void vc4_hdmi_set_n_cts(struct vc4_hdmi *vc4_hdmi, unsigned int samplerate) in vc4_hdmi_set_n_cts() argument
2079 const struct drm_display_mode *mode = &vc4_hdmi->saved_adjusted_mode; in vc4_hdmi_set_n_cts()
2083 lockdep_assert_held(&vc4_hdmi->mutex); in vc4_hdmi_set_n_cts()
2084 lockdep_assert_held(&vc4_hdmi->hw_lock); in vc4_hdmi_set_n_cts()
2104 static inline struct vc4_hdmi *dai_to_hdmi(struct snd_soc_dai *dai) in dai_to_hdmi()
2111 static bool vc4_hdmi_audio_can_stream(struct vc4_hdmi *vc4_hdmi) in vc4_hdmi_audio_can_stream() argument
2113 struct drm_display_info *display = &vc4_hdmi->connector.display_info; in vc4_hdmi_audio_can_stream()
2115 lockdep_assert_held(&vc4_hdmi->mutex); in vc4_hdmi_audio_can_stream()
2129 struct vc4_hdmi *vc4_hdmi = dev_get_drvdata(dev); in vc4_hdmi_audio_startup() local
2130 struct drm_device *drm = vc4_hdmi->connector.dev; in vc4_hdmi_audio_startup()
2135 mutex_lock(&vc4_hdmi->mutex); in vc4_hdmi_audio_startup()
2142 if (!vc4_hdmi_audio_can_stream(vc4_hdmi)) { in vc4_hdmi_audio_startup()
2147 vc4_hdmi->audio.streaming = true; in vc4_hdmi_audio_startup()
2149 spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_audio_startup()
2156 spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_audio_startup()
2158 if (vc4_hdmi->variant->phy_rng_enable) in vc4_hdmi_audio_startup()
2159 vc4_hdmi->variant->phy_rng_enable(vc4_hdmi); in vc4_hdmi_audio_startup()
2164 mutex_unlock(&vc4_hdmi->mutex); in vc4_hdmi_audio_startup()
2169 static void vc4_hdmi_audio_reset(struct vc4_hdmi *vc4_hdmi) in vc4_hdmi_audio_reset() argument
2171 struct drm_encoder *encoder = &vc4_hdmi->encoder.base; in vc4_hdmi_audio_reset()
2172 struct device *dev = &vc4_hdmi->pdev->dev; in vc4_hdmi_audio_reset()
2176 lockdep_assert_held(&vc4_hdmi->mutex); in vc4_hdmi_audio_reset()
2178 vc4_hdmi->audio.streaming = false; in vc4_hdmi_audio_reset()
2183 spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_audio_reset()
2189 spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_audio_reset()
2194 struct vc4_hdmi *vc4_hdmi = dev_get_drvdata(dev); in vc4_hdmi_audio_shutdown() local
2195 struct drm_device *drm = vc4_hdmi->connector.dev; in vc4_hdmi_audio_shutdown()
2199 mutex_lock(&vc4_hdmi->mutex); in vc4_hdmi_audio_shutdown()
2204 spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_audio_shutdown()
2211 spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_audio_shutdown()
2213 if (vc4_hdmi->variant->phy_rng_disable) in vc4_hdmi_audio_shutdown()
2214 vc4_hdmi->variant->phy_rng_disable(vc4_hdmi); in vc4_hdmi_audio_shutdown()
2216 vc4_hdmi->audio.streaming = false; in vc4_hdmi_audio_shutdown()
2217 vc4_hdmi_audio_reset(vc4_hdmi); in vc4_hdmi_audio_shutdown()
2222 mutex_unlock(&vc4_hdmi->mutex); in vc4_hdmi_audio_shutdown()
2268 struct vc4_hdmi *vc4_hdmi = dev_get_drvdata(dev); in vc4_hdmi_audio_prepare() local
2269 struct drm_device *drm = vc4_hdmi->connector.dev; in vc4_hdmi_audio_prepare()
2270 struct drm_encoder *encoder = &vc4_hdmi->encoder.base; in vc4_hdmi_audio_prepare()
2284 mutex_lock(&vc4_hdmi->mutex); in vc4_hdmi_audio_prepare()
2291 if (!vc4_hdmi_audio_can_stream(vc4_hdmi)) { in vc4_hdmi_audio_prepare()
2296 vc4_hdmi_audio_set_mai_clock(vc4_hdmi, sample_rate); in vc4_hdmi_audio_prepare()
2298 spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_audio_prepare()
2339 channel_map = vc4_hdmi->variant->channel_map(vc4_hdmi, channel_mask); in vc4_hdmi_audio_prepare()
2343 vc4_hdmi_set_n_cts(vc4_hdmi, sample_rate); in vc4_hdmi_audio_prepare()
2345 spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_audio_prepare()
2347 memcpy(&vc4_hdmi->audio.infoframe, &params->cea, sizeof(params->cea)); in vc4_hdmi_audio_prepare()
2353 mutex_unlock(&vc4_hdmi->mutex); in vc4_hdmi_audio_prepare()
2365 struct vc4_hdmi *vc4_hdmi = dai_to_hdmi(dai); in vc4_hdmi_audio_cpu_dai_probe() local
2367 snd_soc_dai_init_dma_data(dai, &vc4_hdmi->audio.dma_data, NULL); in vc4_hdmi_audio_cpu_dai_probe()
2395 struct vc4_hdmi *vc4_hdmi = dev_get_drvdata(dev); in vc4_hdmi_audio_get_eld() local
2396 struct drm_connector *connector = &vc4_hdmi->connector; in vc4_hdmi_audio_get_eld()
2398 mutex_lock(&vc4_hdmi->mutex); in vc4_hdmi_audio_get_eld()
2400 mutex_unlock(&vc4_hdmi->mutex); in vc4_hdmi_audio_get_eld()
2420 struct vc4_hdmi *vc4_hdmi = ptr; in vc4_hdmi_audio_codec_release() local
2422 platform_device_unregister(vc4_hdmi->audio.codec_pdev); in vc4_hdmi_audio_codec_release()
2423 vc4_hdmi->audio.codec_pdev = NULL; in vc4_hdmi_audio_codec_release()
2426 static int vc4_hdmi_audio_init(struct vc4_hdmi *vc4_hdmi) in vc4_hdmi_audio_init() argument
2429 &vc4_hdmi->variant->registers[HDMI_MAI_DATA]; in vc4_hdmi_audio_init()
2430 struct snd_soc_dai_link *dai_link = &vc4_hdmi->audio.link; in vc4_hdmi_audio_init()
2431 struct snd_soc_card *card = &vc4_hdmi->audio.card; in vc4_hdmi_audio_init()
2432 struct device *dev = &vc4_hdmi->pdev->dev; in vc4_hdmi_audio_init()
2456 BUILD_BUG_ON(offsetof(struct vc4_hdmi, audio) != 0); in vc4_hdmi_audio_init()
2483 vc4_hdmi->audio.dma_data.addr = be32_to_cpup(addr) + mai_data->offset; in vc4_hdmi_audio_init()
2484 vc4_hdmi->audio.dma_data.addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; in vc4_hdmi_audio_init()
2485 vc4_hdmi->audio.dma_data.maxburst = 2; in vc4_hdmi_audio_init()
2532 vc4_hdmi->audio.codec_pdev = codec_pdev; in vc4_hdmi_audio_init()
2534 ret = devm_add_action_or_reset(dev, vc4_hdmi_audio_codec_release, vc4_hdmi); in vc4_hdmi_audio_init()
2538 dai_link->cpus = &vc4_hdmi->audio.cpu; in vc4_hdmi_audio_init()
2539 dai_link->codecs = &vc4_hdmi->audio.codec; in vc4_hdmi_audio_init()
2540 dai_link->platforms = &vc4_hdmi->audio.platform; in vc4_hdmi_audio_init()
2555 card->name = vc4_hdmi->variant->card_name; in vc4_hdmi_audio_init()
2567 snd_soc_card_set_drvdata(card, vc4_hdmi); in vc4_hdmi_audio_init()
2578 struct vc4_hdmi *vc4_hdmi = priv; in vc4_hdmi_hpd_irq_thread() local
2579 struct drm_connector *connector = &vc4_hdmi->connector; in vc4_hdmi_hpd_irq_thread()
2588 static int vc4_hdmi_hotplug_init(struct vc4_hdmi *vc4_hdmi) in vc4_hdmi_hotplug_init() argument
2590 struct drm_connector *connector = &vc4_hdmi->connector; in vc4_hdmi_hotplug_init()
2591 struct platform_device *pdev = vc4_hdmi->pdev; in vc4_hdmi_hotplug_init()
2594 if (vc4_hdmi->variant->external_irq_controller) { in vc4_hdmi_hotplug_init()
2601 "vc4 hdmi hpd connected", vc4_hdmi); in vc4_hdmi_hotplug_init()
2608 "vc4 hdmi hpd disconnected", vc4_hdmi); in vc4_hdmi_hotplug_init()
2621 struct vc4_hdmi *vc4_hdmi = priv; in vc4_cec_irq_handler_rx_thread() local
2623 if (vc4_hdmi->cec_rx_msg.len) in vc4_cec_irq_handler_rx_thread()
2624 cec_received_msg(vc4_hdmi->cec_adap, in vc4_cec_irq_handler_rx_thread()
2625 &vc4_hdmi->cec_rx_msg); in vc4_cec_irq_handler_rx_thread()
2632 struct vc4_hdmi *vc4_hdmi = priv; in vc4_cec_irq_handler_tx_thread() local
2634 if (vc4_hdmi->cec_tx_ok) { in vc4_cec_irq_handler_tx_thread()
2635 cec_transmit_done(vc4_hdmi->cec_adap, CEC_TX_STATUS_OK, in vc4_cec_irq_handler_tx_thread()
2642 cec_transmit_done(vc4_hdmi->cec_adap, CEC_TX_STATUS_NACK, in vc4_cec_irq_handler_tx_thread()
2650 struct vc4_hdmi *vc4_hdmi = priv; in vc4_cec_irq_handler_thread() local
2653 if (vc4_hdmi->cec_irq_was_rx) in vc4_cec_irq_handler_thread()
2661 static void vc4_cec_read_msg(struct vc4_hdmi *vc4_hdmi, u32 cntrl1) in vc4_cec_read_msg() argument
2663 struct drm_device *dev = vc4_hdmi->connector.dev; in vc4_cec_read_msg()
2664 struct cec_msg *msg = &vc4_hdmi->cec_rx_msg; in vc4_cec_read_msg()
2667 lockdep_assert_held(&vc4_hdmi->hw_lock); in vc4_cec_read_msg()
2687 static irqreturn_t vc4_cec_irq_handler_tx_bare_locked(struct vc4_hdmi *vc4_hdmi) in vc4_cec_irq_handler_tx_bare_locked() argument
2702 lockdep_assert_held(&vc4_hdmi->hw_lock); in vc4_cec_irq_handler_tx_bare_locked()
2705 vc4_hdmi->cec_tx_ok = cntrl1 & VC4_HDMI_CEC_TX_STATUS_GOOD; in vc4_cec_irq_handler_tx_bare_locked()
2714 struct vc4_hdmi *vc4_hdmi = priv; in vc4_cec_irq_handler_tx_bare() local
2717 spin_lock(&vc4_hdmi->hw_lock); in vc4_cec_irq_handler_tx_bare()
2718 ret = vc4_cec_irq_handler_tx_bare_locked(vc4_hdmi); in vc4_cec_irq_handler_tx_bare()
2719 spin_unlock(&vc4_hdmi->hw_lock); in vc4_cec_irq_handler_tx_bare()
2724 static irqreturn_t vc4_cec_irq_handler_rx_bare_locked(struct vc4_hdmi *vc4_hdmi) in vc4_cec_irq_handler_rx_bare_locked() argument
2728 lockdep_assert_held(&vc4_hdmi->hw_lock); in vc4_cec_irq_handler_rx_bare_locked()
2741 vc4_hdmi->cec_rx_msg.len = 0; in vc4_cec_irq_handler_rx_bare_locked()
2743 vc4_cec_read_msg(vc4_hdmi, cntrl1); in vc4_cec_irq_handler_rx_bare_locked()
2755 struct vc4_hdmi *vc4_hdmi = priv; in vc4_cec_irq_handler_rx_bare() local
2758 spin_lock(&vc4_hdmi->hw_lock); in vc4_cec_irq_handler_rx_bare()
2759 ret = vc4_cec_irq_handler_rx_bare_locked(vc4_hdmi); in vc4_cec_irq_handler_rx_bare()
2760 spin_unlock(&vc4_hdmi->hw_lock); in vc4_cec_irq_handler_rx_bare()
2767 struct vc4_hdmi *vc4_hdmi = priv; in vc4_cec_irq_handler() local
2786 spin_lock(&vc4_hdmi->hw_lock); in vc4_cec_irq_handler()
2788 vc4_hdmi->cec_irq_was_rx = cntrl5 & VC4_HDMI_CEC_RX_CEC_INT; in vc4_cec_irq_handler()
2789 if (vc4_hdmi->cec_irq_was_rx) in vc4_cec_irq_handler()
2790 ret = vc4_cec_irq_handler_rx_bare_locked(vc4_hdmi); in vc4_cec_irq_handler()
2792 ret = vc4_cec_irq_handler_tx_bare_locked(vc4_hdmi); in vc4_cec_irq_handler()
2795 spin_unlock(&vc4_hdmi->hw_lock); in vc4_cec_irq_handler()
2802 struct vc4_hdmi *vc4_hdmi = cec_get_drvdata(adap); in vc4_hdmi_cec_enable() local
2803 struct drm_device *drm = vc4_hdmi->connector.dev; in vc4_hdmi_cec_enable()
2819 ret = pm_runtime_resume_and_get(&vc4_hdmi->pdev->dev); in vc4_hdmi_cec_enable()
2825 mutex_lock(&vc4_hdmi->mutex); in vc4_hdmi_cec_enable()
2827 spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_cec_enable()
2856 if (!vc4_hdmi->variant->external_irq_controller) in vc4_hdmi_cec_enable()
2859 spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_cec_enable()
2861 mutex_unlock(&vc4_hdmi->mutex); in vc4_hdmi_cec_enable()
2869 struct vc4_hdmi *vc4_hdmi = cec_get_drvdata(adap); in vc4_hdmi_cec_disable() local
2870 struct drm_device *drm = vc4_hdmi->connector.dev; in vc4_hdmi_cec_disable()
2882 mutex_lock(&vc4_hdmi->mutex); in vc4_hdmi_cec_disable()
2884 spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_cec_disable()
2886 if (!vc4_hdmi->variant->external_irq_controller) in vc4_hdmi_cec_disable()
2892 spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_cec_disable()
2894 mutex_unlock(&vc4_hdmi->mutex); in vc4_hdmi_cec_disable()
2896 pm_runtime_put(&vc4_hdmi->pdev->dev); in vc4_hdmi_cec_disable()
2913 struct vc4_hdmi *vc4_hdmi = cec_get_drvdata(adap); in vc4_hdmi_cec_adap_log_addr() local
2914 struct drm_device *drm = vc4_hdmi->connector.dev; in vc4_hdmi_cec_adap_log_addr()
2926 mutex_lock(&vc4_hdmi->mutex); in vc4_hdmi_cec_adap_log_addr()
2927 spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_cec_adap_log_addr()
2931 spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_cec_adap_log_addr()
2932 mutex_unlock(&vc4_hdmi->mutex); in vc4_hdmi_cec_adap_log_addr()
2942 struct vc4_hdmi *vc4_hdmi = cec_get_drvdata(adap); in vc4_hdmi_cec_adap_transmit() local
2943 struct drm_device *dev = vc4_hdmi->connector.dev; in vc4_hdmi_cec_adap_transmit()
2958 mutex_lock(&vc4_hdmi->mutex); in vc4_hdmi_cec_adap_transmit()
2960 spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_cec_adap_transmit()
2978 spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_cec_adap_transmit()
2979 mutex_unlock(&vc4_hdmi->mutex); in vc4_hdmi_cec_adap_transmit()
2993 struct vc4_hdmi *vc4_hdmi = ptr; in vc4_hdmi_cec_release() local
2995 cec_unregister_adapter(vc4_hdmi->cec_adap); in vc4_hdmi_cec_release()
2996 vc4_hdmi->cec_adap = NULL; in vc4_hdmi_cec_release()
2999 static int vc4_hdmi_cec_init(struct vc4_hdmi *vc4_hdmi) in vc4_hdmi_cec_init() argument
3002 struct platform_device *pdev = vc4_hdmi->pdev; in vc4_hdmi_cec_init()
3011 vc4_hdmi->cec_adap = cec_allocate_adapter(&vc4_hdmi_cec_adap_ops, in vc4_hdmi_cec_init()
3012 vc4_hdmi, "vc4", in vc4_hdmi_cec_init()
3015 ret = PTR_ERR_OR_ZERO(vc4_hdmi->cec_adap); in vc4_hdmi_cec_init()
3019 cec_fill_conn_info_from_drm(&conn_info, &vc4_hdmi->connector); in vc4_hdmi_cec_init()
3020 cec_s_conn_info(vc4_hdmi->cec_adap, &conn_info); in vc4_hdmi_cec_init()
3022 if (vc4_hdmi->variant->external_irq_controller) { in vc4_hdmi_cec_init()
3026 "vc4 hdmi cec rx", vc4_hdmi); in vc4_hdmi_cec_init()
3033 "vc4 hdmi cec tx", vc4_hdmi); in vc4_hdmi_cec_init()
3040 "vc4 hdmi cec", vc4_hdmi); in vc4_hdmi_cec_init()
3045 ret = cec_register_adapter(vc4_hdmi->cec_adap, &pdev->dev); in vc4_hdmi_cec_init()
3072 ret = devm_add_action_or_reset(dev, vc4_hdmi_cec_release, vc4_hdmi); in vc4_hdmi_cec_init()
3079 cec_delete_adapter(vc4_hdmi->cec_adap); in vc4_hdmi_cec_init()
3084 static int vc4_hdmi_cec_init(struct vc4_hdmi *vc4_hdmi) in vc4_hdmi_cec_init() argument
3098 struct vc4_hdmi *vc4_hdmi, in vc4_hdmi_build_regset() argument
3102 const struct vc4_hdmi_variant *variant = vc4_hdmi->variant; in vc4_hdmi_build_regset()
3128 regset->base = __vc4_hdmi_get_field_base(vc4_hdmi, reg); in vc4_hdmi_build_regset()
3140 struct vc4_hdmi *vc4_hdmi) in vc4_hdmi_init_resources() argument
3142 struct platform_device *pdev = vc4_hdmi->pdev; in vc4_hdmi_init_resources()
3146 vc4_hdmi->hdmicore_regs = vc4_ioremap_regs(pdev, 0); in vc4_hdmi_init_resources()
3147 if (IS_ERR(vc4_hdmi->hdmicore_regs)) in vc4_hdmi_init_resources()
3148 return PTR_ERR(vc4_hdmi->hdmicore_regs); in vc4_hdmi_init_resources()
3150 vc4_hdmi->hd_regs = vc4_ioremap_regs(pdev, 1); in vc4_hdmi_init_resources()
3151 if (IS_ERR(vc4_hdmi->hd_regs)) in vc4_hdmi_init_resources()
3152 return PTR_ERR(vc4_hdmi->hd_regs); in vc4_hdmi_init_resources()
3154 ret = vc4_hdmi_build_regset(drm, vc4_hdmi, &vc4_hdmi->hd_regset, VC4_HD); in vc4_hdmi_init_resources()
3158 ret = vc4_hdmi_build_regset(drm, vc4_hdmi, &vc4_hdmi->hdmi_regset, VC4_HDMI); in vc4_hdmi_init_resources()
3162 vc4_hdmi->pixel_clock = devm_clk_get(dev, "pixel"); in vc4_hdmi_init_resources()
3163 if (IS_ERR(vc4_hdmi->pixel_clock)) { in vc4_hdmi_init_resources()
3164 ret = PTR_ERR(vc4_hdmi->pixel_clock); in vc4_hdmi_init_resources()
3170 vc4_hdmi->hsm_clock = devm_clk_get(dev, "hdmi"); in vc4_hdmi_init_resources()
3171 if (IS_ERR(vc4_hdmi->hsm_clock)) { in vc4_hdmi_init_resources()
3173 return PTR_ERR(vc4_hdmi->hsm_clock); in vc4_hdmi_init_resources()
3176 vc4_hdmi->audio_clock = vc4_hdmi->hsm_clock; in vc4_hdmi_init_resources()
3177 vc4_hdmi->cec_clock = vc4_hdmi->hsm_clock; in vc4_hdmi_init_resources()
3179 vc4_hdmi->hsm_rpm_clock = devm_clk_get(dev, "hdmi"); in vc4_hdmi_init_resources()
3180 if (IS_ERR(vc4_hdmi->hsm_rpm_clock)) { in vc4_hdmi_init_resources()
3182 return PTR_ERR(vc4_hdmi->hsm_rpm_clock); in vc4_hdmi_init_resources()
3189 struct vc4_hdmi *vc4_hdmi) in vc5_hdmi_init_resources() argument
3191 struct platform_device *pdev = vc4_hdmi->pdev; in vc5_hdmi_init_resources()
3200 vc4_hdmi->hdmicore_regs = devm_ioremap(dev, res->start, in vc5_hdmi_init_resources()
3202 if (!vc4_hdmi->hdmicore_regs) in vc5_hdmi_init_resources()
3209 vc4_hdmi->hd_regs = devm_ioremap(dev, res->start, resource_size(res)); in vc5_hdmi_init_resources()
3210 if (!vc4_hdmi->hd_regs) in vc5_hdmi_init_resources()
3217 vc4_hdmi->cec_regs = devm_ioremap(dev, res->start, resource_size(res)); in vc5_hdmi_init_resources()
3218 if (!vc4_hdmi->cec_regs) in vc5_hdmi_init_resources()
3225 vc4_hdmi->csc_regs = devm_ioremap(dev, res->start, resource_size(res)); in vc5_hdmi_init_resources()
3226 if (!vc4_hdmi->csc_regs) in vc5_hdmi_init_resources()
3233 vc4_hdmi->dvp_regs = devm_ioremap(dev, res->start, resource_size(res)); in vc5_hdmi_init_resources()
3234 if (!vc4_hdmi->dvp_regs) in vc5_hdmi_init_resources()
3241 vc4_hdmi->phy_regs = devm_ioremap(dev, res->start, resource_size(res)); in vc5_hdmi_init_resources()
3242 if (!vc4_hdmi->phy_regs) in vc5_hdmi_init_resources()
3249 vc4_hdmi->ram_regs = devm_ioremap(dev, res->start, resource_size(res)); in vc5_hdmi_init_resources()
3250 if (!vc4_hdmi->ram_regs) in vc5_hdmi_init_resources()
3257 vc4_hdmi->rm_regs = devm_ioremap(dev, res->start, resource_size(res)); in vc5_hdmi_init_resources()
3258 if (!vc4_hdmi->rm_regs) in vc5_hdmi_init_resources()
3261 vc4_hdmi->hsm_clock = devm_clk_get(dev, "hdmi"); in vc5_hdmi_init_resources()
3262 if (IS_ERR(vc4_hdmi->hsm_clock)) { in vc5_hdmi_init_resources()
3264 return PTR_ERR(vc4_hdmi->hsm_clock); in vc5_hdmi_init_resources()
3267 vc4_hdmi->hsm_rpm_clock = devm_clk_get(dev, "hdmi"); in vc5_hdmi_init_resources()
3268 if (IS_ERR(vc4_hdmi->hsm_rpm_clock)) { in vc5_hdmi_init_resources()
3270 return PTR_ERR(vc4_hdmi->hsm_rpm_clock); in vc5_hdmi_init_resources()
3273 vc4_hdmi->pixel_bvb_clock = devm_clk_get(dev, "bvb"); in vc5_hdmi_init_resources()
3274 if (IS_ERR(vc4_hdmi->pixel_bvb_clock)) { in vc5_hdmi_init_resources()
3276 return PTR_ERR(vc4_hdmi->pixel_bvb_clock); in vc5_hdmi_init_resources()
3279 vc4_hdmi->audio_clock = devm_clk_get(dev, "audio"); in vc5_hdmi_init_resources()
3280 if (IS_ERR(vc4_hdmi->audio_clock)) { in vc5_hdmi_init_resources()
3282 return PTR_ERR(vc4_hdmi->audio_clock); in vc5_hdmi_init_resources()
3285 vc4_hdmi->cec_clock = devm_clk_get(dev, "cec"); in vc5_hdmi_init_resources()
3286 if (IS_ERR(vc4_hdmi->cec_clock)) { in vc5_hdmi_init_resources()
3288 return PTR_ERR(vc4_hdmi->cec_clock); in vc5_hdmi_init_resources()
3291 vc4_hdmi->reset = devm_reset_control_get(dev, NULL); in vc5_hdmi_init_resources()
3292 if (IS_ERR(vc4_hdmi->reset)) { in vc5_hdmi_init_resources()
3294 return PTR_ERR(vc4_hdmi->reset); in vc5_hdmi_init_resources()
3297 ret = vc4_hdmi_build_regset(drm, vc4_hdmi, &vc4_hdmi->hdmi_regset, VC4_HDMI); in vc5_hdmi_init_resources()
3301 ret = vc4_hdmi_build_regset(drm, vc4_hdmi, &vc4_hdmi->hd_regset, VC4_HD); in vc5_hdmi_init_resources()
3305 ret = vc4_hdmi_build_regset(drm, vc4_hdmi, &vc4_hdmi->cec_regset, VC5_CEC); in vc5_hdmi_init_resources()
3309 ret = vc4_hdmi_build_regset(drm, vc4_hdmi, &vc4_hdmi->csc_regset, VC5_CSC); in vc5_hdmi_init_resources()
3313 ret = vc4_hdmi_build_regset(drm, vc4_hdmi, &vc4_hdmi->dvp_regset, VC5_DVP); in vc5_hdmi_init_resources()
3317 ret = vc4_hdmi_build_regset(drm, vc4_hdmi, &vc4_hdmi->phy_regset, VC5_PHY); in vc5_hdmi_init_resources()
3321 ret = vc4_hdmi_build_regset(drm, vc4_hdmi, &vc4_hdmi->ram_regset, VC5_RAM); in vc5_hdmi_init_resources()
3325 ret = vc4_hdmi_build_regset(drm, vc4_hdmi, &vc4_hdmi->rm_regset, VC5_RM); in vc5_hdmi_init_resources()
3334 struct vc4_hdmi *vc4_hdmi = dev_get_drvdata(dev); in vc4_hdmi_runtime_suspend() local
3336 clk_disable_unprepare(vc4_hdmi->hsm_rpm_clock); in vc4_hdmi_runtime_suspend()
3343 struct vc4_hdmi *vc4_hdmi = dev_get_drvdata(dev); in vc4_hdmi_runtime_resume() local
3354 ret = clk_set_min_rate(vc4_hdmi->hsm_rpm_clock, HSM_MIN_CLOCK_FREQ); in vc4_hdmi_runtime_resume()
3358 ret = clk_prepare_enable(vc4_hdmi->hsm_rpm_clock); in vc4_hdmi_runtime_resume()
3371 rate = clk_get_rate(vc4_hdmi->hsm_rpm_clock); in vc4_hdmi_runtime_resume()
3377 if (vc4_hdmi->variant->reset) in vc4_hdmi_runtime_resume()
3378 vc4_hdmi->variant->reset(vc4_hdmi); in vc4_hdmi_runtime_resume()
3381 spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_runtime_resume()
3386 spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_runtime_resume()
3388 vc4_hdmi_cec_update_clk_div(vc4_hdmi); in vc4_hdmi_runtime_resume()
3390 if (!vc4_hdmi->variant->external_irq_controller) { in vc4_hdmi_runtime_resume()
3391 spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_runtime_resume()
3393 spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_runtime_resume()
3400 clk_disable_unprepare(vc4_hdmi->hsm_clock); in vc4_hdmi_runtime_resume()
3406 struct vc4_hdmi *vc4_hdmi = ptr; in vc4_hdmi_put_ddc_device() local
3408 put_device(&vc4_hdmi->ddc->dev); in vc4_hdmi_put_ddc_device()
3416 struct vc4_hdmi *vc4_hdmi; in vc4_hdmi_bind() local
3421 vc4_hdmi = drmm_kzalloc(drm, sizeof(*vc4_hdmi), GFP_KERNEL); in vc4_hdmi_bind()
3422 if (!vc4_hdmi) in vc4_hdmi_bind()
3425 ret = drmm_mutex_init(drm, &vc4_hdmi->mutex); in vc4_hdmi_bind()
3429 spin_lock_init(&vc4_hdmi->hw_lock); in vc4_hdmi_bind()
3430 INIT_DELAYED_WORK(&vc4_hdmi->scrambling_work, vc4_hdmi_scrambling_wq); in vc4_hdmi_bind()
3432 dev_set_drvdata(dev, vc4_hdmi); in vc4_hdmi_bind()
3433 encoder = &vc4_hdmi->encoder.base; in vc4_hdmi_bind()
3434 vc4_hdmi->encoder.type = variant->encoder_type; in vc4_hdmi_bind()
3435 vc4_hdmi->encoder.pre_crtc_configure = vc4_hdmi_encoder_pre_crtc_configure; in vc4_hdmi_bind()
3436 vc4_hdmi->encoder.pre_crtc_enable = vc4_hdmi_encoder_pre_crtc_enable; in vc4_hdmi_bind()
3437 vc4_hdmi->encoder.post_crtc_enable = vc4_hdmi_encoder_post_crtc_enable; in vc4_hdmi_bind()
3438 vc4_hdmi->encoder.post_crtc_disable = vc4_hdmi_encoder_post_crtc_disable; in vc4_hdmi_bind()
3439 vc4_hdmi->encoder.post_crtc_powerdown = vc4_hdmi_encoder_post_crtc_powerdown; in vc4_hdmi_bind()
3440 vc4_hdmi->pdev = pdev; in vc4_hdmi_bind()
3441 vc4_hdmi->variant = variant; in vc4_hdmi_bind()
3450 vc4_hdmi->scdc_enabled = true; in vc4_hdmi_bind()
3452 ret = variant->init_resources(drm, vc4_hdmi); in vc4_hdmi_bind()
3462 vc4_hdmi->ddc = of_find_i2c_adapter_by_node(ddc_node); in vc4_hdmi_bind()
3464 if (!vc4_hdmi->ddc) { in vc4_hdmi_bind()
3469 ret = devm_add_action_or_reset(dev, vc4_hdmi_put_ddc_device, vc4_hdmi); in vc4_hdmi_bind()
3476 vc4_hdmi->hpd_gpio = devm_gpiod_get_optional(dev, "hpd", GPIOD_IN); in vc4_hdmi_bind()
3477 if (IS_ERR(vc4_hdmi->hpd_gpio)) { in vc4_hdmi_bind()
3478 return PTR_ERR(vc4_hdmi->hpd_gpio); in vc4_hdmi_bind()
3481 vc4_hdmi->disable_wifi_frequencies = in vc4_hdmi_bind()
3489 vc4_hdmi->disable_4kp60 = true; in vc4_hdmi_bind()
3507 clk_prepare_enable(vc4_hdmi->pixel_clock); in vc4_hdmi_bind()
3508 clk_prepare_enable(vc4_hdmi->hsm_clock); in vc4_hdmi_bind()
3509 clk_prepare_enable(vc4_hdmi->pixel_bvb_clock); in vc4_hdmi_bind()
3521 ret = vc4_hdmi_connector_init(drm, vc4_hdmi); in vc4_hdmi_bind()
3525 ret = vc4_hdmi_hotplug_init(vc4_hdmi); in vc4_hdmi_bind()
3529 ret = vc4_hdmi_cec_init(vc4_hdmi); in vc4_hdmi_bind()
3533 ret = vc4_hdmi_audio_init(vc4_hdmi); in vc4_hdmi_bind()