Lines Matching refs:vc4_hdmi

131 static bool vc4_hdmi_supports_scrambling(struct vc4_hdmi *vc4_hdmi)  in vc4_hdmi_supports_scrambling()  argument
133 struct drm_display_info *display = &vc4_hdmi->connector.display_info; in vc4_hdmi_supports_scrambling()
135 lockdep_assert_held(&vc4_hdmi->mutex); in vc4_hdmi_supports_scrambling()
156 static bool vc4_hdmi_is_full_range_rgb(struct vc4_hdmi *vc4_hdmi, in vc4_hdmi_is_full_range_rgb() argument
159 struct drm_display_info *display = &vc4_hdmi->connector.display_info; in vc4_hdmi_is_full_range_rgb()
168 struct vc4_hdmi *vc4_hdmi = entry->file.data; in vc4_hdmi_debugfs_regs() local
169 struct drm_device *drm = vc4_hdmi->connector.dev; in vc4_hdmi_debugfs_regs()
176 drm_print_regset32(&p, &vc4_hdmi->hdmi_regset); in vc4_hdmi_debugfs_regs()
177 drm_print_regset32(&p, &vc4_hdmi->hd_regset); in vc4_hdmi_debugfs_regs()
178 drm_print_regset32(&p, &vc4_hdmi->cec_regset); in vc4_hdmi_debugfs_regs()
179 drm_print_regset32(&p, &vc4_hdmi->csc_regset); in vc4_hdmi_debugfs_regs()
180 drm_print_regset32(&p, &vc4_hdmi->dvp_regset); in vc4_hdmi_debugfs_regs()
181 drm_print_regset32(&p, &vc4_hdmi->phy_regset); in vc4_hdmi_debugfs_regs()
182 drm_print_regset32(&p, &vc4_hdmi->ram_regset); in vc4_hdmi_debugfs_regs()
183 drm_print_regset32(&p, &vc4_hdmi->rm_regset); in vc4_hdmi_debugfs_regs()
190 static void vc4_hdmi_reset(struct vc4_hdmi *vc4_hdmi) in vc4_hdmi_reset() argument
192 struct drm_device *drm = vc4_hdmi->connector.dev; in vc4_hdmi_reset()
203 spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_reset()
217 spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_reset()
223 static void vc5_hdmi_reset(struct vc4_hdmi *vc4_hdmi) in vc5_hdmi_reset() argument
225 struct drm_device *drm = vc4_hdmi->connector.dev; in vc5_hdmi_reset()
236 reset_control_reset(vc4_hdmi->reset); in vc5_hdmi_reset()
238 spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); in vc5_hdmi_reset()
245 spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags); in vc5_hdmi_reset()
252 static void vc4_hdmi_cec_update_clk_div(struct vc4_hdmi *vc4_hdmi) in vc4_hdmi_cec_update_clk_div() argument
254 struct drm_device *drm = vc4_hdmi->connector.dev; in vc4_hdmi_cec_update_clk_div()
270 cec_rate = clk_get_rate(vc4_hdmi->cec_clock); in vc4_hdmi_cec_update_clk_div()
272 spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_cec_update_clk_div()
285 spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_cec_update_clk_div()
291 static void vc4_hdmi_cec_update_clk_div(struct vc4_hdmi *vc4_hdmi) {} in vc4_hdmi_cec_update_clk_div() argument
326 struct vc4_hdmi *vc4_hdmi; in vc4_hdmi_reset_link() local
355 vc4_hdmi = connector_to_vc4_hdmi(connector); in vc4_hdmi_reset_link()
356 mutex_lock(&vc4_hdmi->mutex); in vc4_hdmi_reset_link()
358 if (!vc4_hdmi_supports_scrambling(vc4_hdmi)) { in vc4_hdmi_reset_link()
359 mutex_unlock(&vc4_hdmi->mutex); in vc4_hdmi_reset_link()
363 scrambling_needed = vc4_hdmi_mode_needs_scrambling(&vc4_hdmi->saved_adjusted_mode, in vc4_hdmi_reset_link()
364 vc4_hdmi->output_bpc, in vc4_hdmi_reset_link()
365 vc4_hdmi->output_format); in vc4_hdmi_reset_link()
367 mutex_unlock(&vc4_hdmi->mutex); in vc4_hdmi_reset_link()
373 mutex_unlock(&vc4_hdmi->mutex); in vc4_hdmi_reset_link()
380 mutex_unlock(&vc4_hdmi->mutex); in vc4_hdmi_reset_link()
385 mutex_unlock(&vc4_hdmi->mutex); in vc4_hdmi_reset_link()
389 mutex_unlock(&vc4_hdmi->mutex); in vc4_hdmi_reset_link()
403 static void vc4_hdmi_handle_hotplug(struct vc4_hdmi *vc4_hdmi, in vc4_hdmi_handle_hotplug() argument
407 struct drm_connector *connector = &vc4_hdmi->connector; in vc4_hdmi_handle_hotplug()
427 cec_phys_addr_invalidate(vc4_hdmi->cec_adap); in vc4_hdmi_handle_hotplug()
431 edid = drm_get_edid(connector, vc4_hdmi->ddc); in vc4_hdmi_handle_hotplug()
435 cec_s_phys_addr_from_edid(vc4_hdmi->cec_adap, edid); in vc4_hdmi_handle_hotplug()
453 struct vc4_hdmi *vc4_hdmi = connector_to_vc4_hdmi(connector); in vc4_hdmi_connector_detect_ctx() local
467 WARN_ON(pm_runtime_resume_and_get(&vc4_hdmi->pdev->dev)); in vc4_hdmi_connector_detect_ctx()
469 if (vc4_hdmi->hpd_gpio) { in vc4_hdmi_connector_detect_ctx()
470 if (gpiod_get_value_cansleep(vc4_hdmi->hpd_gpio)) in vc4_hdmi_connector_detect_ctx()
473 if (vc4_hdmi->variant->hp_detect && in vc4_hdmi_connector_detect_ctx()
474 vc4_hdmi->variant->hp_detect(vc4_hdmi)) in vc4_hdmi_connector_detect_ctx()
478 vc4_hdmi_handle_hotplug(vc4_hdmi, ctx, status); in vc4_hdmi_connector_detect_ctx()
479 pm_runtime_put(&vc4_hdmi->pdev->dev); in vc4_hdmi_connector_detect_ctx()
486 struct vc4_hdmi *vc4_hdmi = connector_to_vc4_hdmi(connector); in vc4_hdmi_connector_get_modes() local
502 edid = drm_get_edid(connector, vc4_hdmi->ddc); in vc4_hdmi_connector_get_modes()
503 cec_s_phys_addr_from_edid(vc4_hdmi->cec_adap, edid); in vc4_hdmi_connector_get_modes()
607 struct vc4_hdmi *vc4_hdmi) in vc4_hdmi_connector_init() argument
609 struct drm_connector *connector = &vc4_hdmi->connector; in vc4_hdmi_connector_init()
610 struct drm_encoder *encoder = &vc4_hdmi->encoder.base; in vc4_hdmi_connector_init()
616 vc4_hdmi->ddc); in vc4_hdmi_connector_init()
649 if (vc4_hdmi->variant->supports_hdr) in vc4_hdmi_connector_init()
661 struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder); in vc4_hdmi_stop_packet() local
662 struct drm_device *drm = vc4_hdmi->connector.dev; in vc4_hdmi_stop_packet()
671 spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_stop_packet()
674 spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_stop_packet()
688 struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder); in vc4_hdmi_write_infoframe() local
689 struct drm_device *drm = vc4_hdmi->connector.dev; in vc4_hdmi_write_infoframe()
692 &vc4_hdmi->variant->registers[HDMI_RAM_PACKET_START]; in vc4_hdmi_write_infoframe()
696 void __iomem *base = __vc4_hdmi_get_field_base(vc4_hdmi, in vc4_hdmi_write_infoframe()
721 spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_write_infoframe()
748 spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_write_infoframe()
786 struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder); in vc4_hdmi_set_avi_infoframe() local
787 struct drm_connector *connector = &vc4_hdmi->connector; in vc4_hdmi_set_avi_infoframe()
791 const struct drm_display_mode *mode = &vc4_hdmi->saved_adjusted_mode; in vc4_hdmi_set_avi_infoframe()
795 lockdep_assert_held(&vc4_hdmi->mutex); in vc4_hdmi_set_avi_infoframe()
806 vc4_hdmi_is_full_range_rgb(vc4_hdmi, mode) ? in vc4_hdmi_set_avi_infoframe()
834 struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder); in vc4_hdmi_set_audio_infoframe() local
835 struct hdmi_audio_infoframe *audio = &vc4_hdmi->audio.infoframe; in vc4_hdmi_set_audio_infoframe()
840 if (vc4_hdmi->packet_ram_enabled) in vc4_hdmi_set_audio_infoframe()
846 struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder); in vc4_hdmi_set_hdr_infoframe() local
847 struct drm_connector *connector = &vc4_hdmi->connector; in vc4_hdmi_set_hdr_infoframe()
851 lockdep_assert_held(&vc4_hdmi->mutex); in vc4_hdmi_set_hdr_infoframe()
853 if (!vc4_hdmi->variant->supports_hdr) in vc4_hdmi_set_hdr_infoframe()
867 struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder); in vc4_hdmi_set_infoframes() local
869 lockdep_assert_held(&vc4_hdmi->mutex); in vc4_hdmi_set_infoframes()
877 if (vc4_hdmi->audio.streaming) in vc4_hdmi_set_infoframes()
887 struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder); in vc4_hdmi_enable_scrambling() local
888 struct drm_device *drm = vc4_hdmi->connector.dev; in vc4_hdmi_enable_scrambling()
889 const struct drm_display_mode *mode = &vc4_hdmi->saved_adjusted_mode; in vc4_hdmi_enable_scrambling()
893 lockdep_assert_held(&vc4_hdmi->mutex); in vc4_hdmi_enable_scrambling()
895 if (!vc4_hdmi_supports_scrambling(vc4_hdmi)) in vc4_hdmi_enable_scrambling()
899 vc4_hdmi->output_bpc, in vc4_hdmi_enable_scrambling()
900 vc4_hdmi->output_format)) in vc4_hdmi_enable_scrambling()
906 drm_scdc_set_high_tmds_clock_ratio(vc4_hdmi->ddc, true); in vc4_hdmi_enable_scrambling()
907 drm_scdc_set_scrambling(vc4_hdmi->ddc, true); in vc4_hdmi_enable_scrambling()
909 spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_enable_scrambling()
912 spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_enable_scrambling()
916 vc4_hdmi->scdc_enabled = true; in vc4_hdmi_enable_scrambling()
918 queue_delayed_work(system_wq, &vc4_hdmi->scrambling_work, in vc4_hdmi_enable_scrambling()
924 struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder); in vc4_hdmi_disable_scrambling() local
925 struct drm_device *drm = vc4_hdmi->connector.dev; in vc4_hdmi_disable_scrambling()
929 lockdep_assert_held(&vc4_hdmi->mutex); in vc4_hdmi_disable_scrambling()
931 if (!vc4_hdmi->scdc_enabled) in vc4_hdmi_disable_scrambling()
934 vc4_hdmi->scdc_enabled = false; in vc4_hdmi_disable_scrambling()
936 if (delayed_work_pending(&vc4_hdmi->scrambling_work)) in vc4_hdmi_disable_scrambling()
937 cancel_delayed_work_sync(&vc4_hdmi->scrambling_work); in vc4_hdmi_disable_scrambling()
942 spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_disable_scrambling()
945 spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_disable_scrambling()
947 drm_scdc_set_scrambling(vc4_hdmi->ddc, false); in vc4_hdmi_disable_scrambling()
948 drm_scdc_set_high_tmds_clock_ratio(vc4_hdmi->ddc, false); in vc4_hdmi_disable_scrambling()
955 struct vc4_hdmi *vc4_hdmi = container_of(to_delayed_work(work), in vc4_hdmi_scrambling_wq() local
956 struct vc4_hdmi, in vc4_hdmi_scrambling_wq()
959 if (drm_scdc_get_scrambling_status(vc4_hdmi->ddc)) in vc4_hdmi_scrambling_wq()
962 drm_scdc_set_high_tmds_clock_ratio(vc4_hdmi->ddc, true); in vc4_hdmi_scrambling_wq()
963 drm_scdc_set_scrambling(vc4_hdmi->ddc, true); in vc4_hdmi_scrambling_wq()
965 queue_delayed_work(system_wq, &vc4_hdmi->scrambling_work, in vc4_hdmi_scrambling_wq()
972 struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder); in vc4_hdmi_encoder_post_crtc_disable() local
973 struct drm_device *drm = vc4_hdmi->connector.dev; in vc4_hdmi_encoder_post_crtc_disable()
977 mutex_lock(&vc4_hdmi->mutex); in vc4_hdmi_encoder_post_crtc_disable()
979 vc4_hdmi->packet_ram_enabled = false; in vc4_hdmi_encoder_post_crtc_disable()
984 spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_encoder_post_crtc_disable()
990 spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_encoder_post_crtc_disable()
994 spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_encoder_post_crtc_disable()
997 spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_encoder_post_crtc_disable()
1004 mutex_unlock(&vc4_hdmi->mutex); in vc4_hdmi_encoder_post_crtc_disable()
1010 struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder); in vc4_hdmi_encoder_post_crtc_powerdown() local
1011 struct drm_device *drm = vc4_hdmi->connector.dev; in vc4_hdmi_encoder_post_crtc_powerdown()
1016 mutex_lock(&vc4_hdmi->mutex); in vc4_hdmi_encoder_post_crtc_powerdown()
1021 spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_encoder_post_crtc_powerdown()
1024 spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_encoder_post_crtc_powerdown()
1026 if (vc4_hdmi->variant->phy_disable) in vc4_hdmi_encoder_post_crtc_powerdown()
1027 vc4_hdmi->variant->phy_disable(vc4_hdmi); in vc4_hdmi_encoder_post_crtc_powerdown()
1029 clk_disable_unprepare(vc4_hdmi->pixel_bvb_clock); in vc4_hdmi_encoder_post_crtc_powerdown()
1030 clk_disable_unprepare(vc4_hdmi->pixel_clock); in vc4_hdmi_encoder_post_crtc_powerdown()
1032 ret = pm_runtime_put(&vc4_hdmi->pdev->dev); in vc4_hdmi_encoder_post_crtc_powerdown()
1039 mutex_unlock(&vc4_hdmi->mutex); in vc4_hdmi_encoder_post_crtc_powerdown()
1042 static void vc4_hdmi_csc_setup(struct vc4_hdmi *vc4_hdmi, in vc4_hdmi_csc_setup() argument
1046 struct drm_device *drm = vc4_hdmi->connector.dev; in vc4_hdmi_csc_setup()
1054 spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_csc_setup()
1059 if (!vc4_hdmi_is_full_range_rgb(vc4_hdmi, mode)) { in vc4_hdmi_csc_setup()
1086 spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_csc_setup()
1156 static void vc5_hdmi_set_csc_coeffs(struct vc4_hdmi *vc4_hdmi, in vc5_hdmi_set_csc_coeffs() argument
1159 lockdep_assert_held(&vc4_hdmi->hw_lock); in vc5_hdmi_set_csc_coeffs()
1169 static void vc5_hdmi_csc_setup(struct vc4_hdmi *vc4_hdmi, in vc5_hdmi_csc_setup() argument
1173 struct drm_device *drm = vc4_hdmi->connector.dev; in vc5_hdmi_csc_setup()
1187 spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); in vc5_hdmi_csc_setup()
1191 vc5_hdmi_set_csc_coeffs(vc4_hdmi, vc5_hdmi_csc_full_rgb_to_limited_yuv444_bt709); in vc5_hdmi_csc_setup()
1206 vc5_hdmi_set_csc_coeffs(vc4_hdmi, vc5_hdmi_csc_full_rgb_to_limited_yuv422_bt709); in vc5_hdmi_csc_setup()
1212 if (!vc4_hdmi_is_full_range_rgb(vc4_hdmi, mode)) in vc5_hdmi_csc_setup()
1213 vc5_hdmi_set_csc_coeffs(vc4_hdmi, vc5_hdmi_csc_full_rgb_to_limited_rgb); in vc5_hdmi_csc_setup()
1215 vc5_hdmi_set_csc_coeffs(vc4_hdmi, vc5_hdmi_csc_full_rgb_unity); in vc5_hdmi_csc_setup()
1227 spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags); in vc5_hdmi_csc_setup()
1232 static void vc4_hdmi_set_timings(struct vc4_hdmi *vc4_hdmi, in vc4_hdmi_set_timings() argument
1236 struct drm_device *drm = vc4_hdmi->connector.dev; in vc4_hdmi_set_timings()
1261 spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_set_timings()
1291 spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_set_timings()
1296 static void vc5_hdmi_set_timings(struct vc4_hdmi *vc4_hdmi, in vc5_hdmi_set_timings() argument
1300 struct drm_device *drm = vc4_hdmi->connector.dev; in vc5_hdmi_set_timings()
1329 spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); in vc5_hdmi_set_timings()
1400 spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags); in vc5_hdmi_set_timings()
1405 static void vc4_hdmi_recenter_fifo(struct vc4_hdmi *vc4_hdmi) in vc4_hdmi_recenter_fifo() argument
1407 struct drm_device *drm = vc4_hdmi->connector.dev; in vc4_hdmi_recenter_fifo()
1416 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()
1430 spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_recenter_fifo()
1437 spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_recenter_fifo()
1450 struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder); in vc4_hdmi_encoder_pre_crtc_configure() local
1451 struct drm_device *drm = vc4_hdmi->connector.dev; in vc4_hdmi_encoder_pre_crtc_configure()
1452 struct drm_connector *connector = &vc4_hdmi->connector; in vc4_hdmi_encoder_pre_crtc_configure()
1457 const struct drm_display_mode *mode = &vc4_hdmi->saved_adjusted_mode; in vc4_hdmi_encoder_pre_crtc_configure()
1464 mutex_lock(&vc4_hdmi->mutex); in vc4_hdmi_encoder_pre_crtc_configure()
1486 ret = clk_set_min_rate(vc4_hdmi->hsm_clock, hsm_rate); in vc4_hdmi_encoder_pre_crtc_configure()
1492 ret = pm_runtime_resume_and_get(&vc4_hdmi->pdev->dev); in vc4_hdmi_encoder_pre_crtc_configure()
1498 ret = clk_set_rate(vc4_hdmi->pixel_clock, tmds_char_rate); in vc4_hdmi_encoder_pre_crtc_configure()
1504 ret = clk_prepare_enable(vc4_hdmi->pixel_clock); in vc4_hdmi_encoder_pre_crtc_configure()
1511 vc4_hdmi_cec_update_clk_div(vc4_hdmi); in vc4_hdmi_encoder_pre_crtc_configure()
1520 ret = clk_set_min_rate(vc4_hdmi->pixel_bvb_clock, bvb_rate); in vc4_hdmi_encoder_pre_crtc_configure()
1526 ret = clk_prepare_enable(vc4_hdmi->pixel_bvb_clock); in vc4_hdmi_encoder_pre_crtc_configure()
1532 if (vc4_hdmi->variant->phy_init) in vc4_hdmi_encoder_pre_crtc_configure()
1533 vc4_hdmi->variant->phy_init(vc4_hdmi, vc4_conn_state); in vc4_hdmi_encoder_pre_crtc_configure()
1535 spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_encoder_pre_crtc_configure()
1542 spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_encoder_pre_crtc_configure()
1544 if (vc4_hdmi->variant->set_timings) in vc4_hdmi_encoder_pre_crtc_configure()
1545 vc4_hdmi->variant->set_timings(vc4_hdmi, conn_state, mode); in vc4_hdmi_encoder_pre_crtc_configure()
1549 mutex_unlock(&vc4_hdmi->mutex); in vc4_hdmi_encoder_pre_crtc_configure()
1554 clk_disable_unprepare(vc4_hdmi->pixel_clock); in vc4_hdmi_encoder_pre_crtc_configure()
1556 pm_runtime_put(&vc4_hdmi->pdev->dev); in vc4_hdmi_encoder_pre_crtc_configure()
1560 mutex_unlock(&vc4_hdmi->mutex); in vc4_hdmi_encoder_pre_crtc_configure()
1567 struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder); in vc4_hdmi_encoder_pre_crtc_enable() local
1568 struct drm_device *drm = vc4_hdmi->connector.dev; in vc4_hdmi_encoder_pre_crtc_enable()
1569 struct drm_connector *connector = &vc4_hdmi->connector; in vc4_hdmi_encoder_pre_crtc_enable()
1570 const struct drm_display_mode *mode = &vc4_hdmi->saved_adjusted_mode; in vc4_hdmi_encoder_pre_crtc_enable()
1576 mutex_lock(&vc4_hdmi->mutex); in vc4_hdmi_encoder_pre_crtc_enable()
1581 if (vc4_hdmi->variant->csc_setup) in vc4_hdmi_encoder_pre_crtc_enable()
1582 vc4_hdmi->variant->csc_setup(vc4_hdmi, conn_state, mode); in vc4_hdmi_encoder_pre_crtc_enable()
1584 spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_encoder_pre_crtc_enable()
1586 spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_encoder_pre_crtc_enable()
1591 mutex_unlock(&vc4_hdmi->mutex); in vc4_hdmi_encoder_pre_crtc_enable()
1597 struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder); in vc4_hdmi_encoder_post_crtc_enable() local
1598 struct drm_device *drm = vc4_hdmi->connector.dev; in vc4_hdmi_encoder_post_crtc_enable()
1599 const struct drm_display_mode *mode = &vc4_hdmi->saved_adjusted_mode; in vc4_hdmi_encoder_post_crtc_enable()
1600 struct drm_display_info *display = &vc4_hdmi->connector.display_info; in vc4_hdmi_encoder_post_crtc_enable()
1607 mutex_lock(&vc4_hdmi->mutex); in vc4_hdmi_encoder_post_crtc_enable()
1612 spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_encoder_post_crtc_enable()
1630 spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_encoder_post_crtc_enable()
1644 spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_encoder_post_crtc_enable()
1653 spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_encoder_post_crtc_enable()
1661 spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_encoder_post_crtc_enable()
1662 vc4_hdmi->packet_ram_enabled = true; in vc4_hdmi_encoder_post_crtc_enable()
1667 vc4_hdmi_recenter_fifo(vc4_hdmi); in vc4_hdmi_encoder_post_crtc_enable()
1673 mutex_unlock(&vc4_hdmi->mutex); in vc4_hdmi_encoder_post_crtc_enable()
1680 struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder); in vc4_hdmi_encoder_atomic_mode_set() local
1684 mutex_lock(&vc4_hdmi->mutex); in vc4_hdmi_encoder_atomic_mode_set()
1685 drm_mode_copy(&vc4_hdmi->saved_adjusted_mode, in vc4_hdmi_encoder_atomic_mode_set()
1687 vc4_hdmi->output_bpc = vc4_state->output_bpc; in vc4_hdmi_encoder_atomic_mode_set()
1688 vc4_hdmi->output_format = vc4_state->output_format; in vc4_hdmi_encoder_atomic_mode_set()
1689 mutex_unlock(&vc4_hdmi->mutex); in vc4_hdmi_encoder_atomic_mode_set()
1693 vc4_hdmi_sink_supports_format_bpc(const struct vc4_hdmi *vc4_hdmi, in vc4_hdmi_sink_supports_format_bpc() argument
1698 struct drm_device *dev = vc4_hdmi->connector.dev; in vc4_hdmi_sink_supports_format_bpc()
1777 vc4_hdmi_encoder_clock_valid(const struct vc4_hdmi *vc4_hdmi, in vc4_hdmi_encoder_clock_valid() argument
1781 const struct drm_connector *connector = &vc4_hdmi->connector; in vc4_hdmi_encoder_clock_valid()
1785 if (clock > vc4_hdmi->variant->max_pixel_clock) in vc4_hdmi_encoder_clock_valid()
1823 vc4_hdmi_encoder_compute_clock(const struct vc4_hdmi *vc4_hdmi, in vc4_hdmi_encoder_compute_clock() argument
1831 if (vc4_hdmi_encoder_clock_valid(vc4_hdmi, mode, clock) != MODE_OK) in vc4_hdmi_encoder_compute_clock()
1840 vc4_hdmi_encoder_compute_format(const struct vc4_hdmi *vc4_hdmi, in vc4_hdmi_encoder_compute_format() argument
1845 struct drm_device *dev = vc4_hdmi->connector.dev; in vc4_hdmi_encoder_compute_format()
1846 const struct drm_connector *connector = &vc4_hdmi->connector; in vc4_hdmi_encoder_compute_format()
1853 if (vc4_hdmi_sink_supports_format_bpc(vc4_hdmi, info, mode, format, bpc)) { in vc4_hdmi_encoder_compute_format()
1856 ret = vc4_hdmi_encoder_compute_clock(vc4_hdmi, vc4_state, in vc4_hdmi_encoder_compute_format()
1867 if (vc4_hdmi_sink_supports_format_bpc(vc4_hdmi, info, mode, format, bpc)) { in vc4_hdmi_encoder_compute_format()
1870 ret = vc4_hdmi_encoder_compute_clock(vc4_hdmi, vc4_state, in vc4_hdmi_encoder_compute_format()
1884 vc4_hdmi_encoder_compute_config(const struct vc4_hdmi *vc4_hdmi, in vc4_hdmi_encoder_compute_config() argument
1888 struct drm_device *dev = vc4_hdmi->connector.dev; in vc4_hdmi_encoder_compute_config()
1897 ret = vc4_hdmi_encoder_compute_format(vc4_hdmi, vc4_state, in vc4_hdmi_encoder_compute_config()
1924 struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder); in vc4_hdmi_encoder_atomic_check() local
1925 struct drm_connector *connector = &vc4_hdmi->connector; in vc4_hdmi_encoder_atomic_check()
1936 if (vc4_hdmi->variant->unsupported_odd_h_timings) { in vc4_hdmi_encoder_atomic_check()
1963 if (vc4_hdmi->disable_wifi_frequencies && in vc4_hdmi_encoder_atomic_check()
1970 ret = vc4_hdmi_encoder_compute_config(vc4_hdmi, vc4_state, mode); in vc4_hdmi_encoder_atomic_check()
1986 struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder); in vc4_hdmi_encoder_mode_valid() local
1988 if (vc4_hdmi->variant->unsupported_odd_h_timings && in vc4_hdmi_encoder_mode_valid()
1994 return vc4_hdmi_encoder_clock_valid(vc4_hdmi, mode, mode->clock * 1000); in vc4_hdmi_encoder_mode_valid()
2006 struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder); in vc4_hdmi_late_register() local
2007 const struct vc4_hdmi_variant *variant = vc4_hdmi->variant; in vc4_hdmi_late_register()
2010 vc4_hdmi_debugfs_regs, vc4_hdmi); in vc4_hdmi_late_register()
2019 static u32 vc4_hdmi_channel_map(struct vc4_hdmi *vc4_hdmi, u32 channel_mask) in vc4_hdmi_channel_map() argument
2031 static u32 vc5_hdmi_channel_map(struct vc4_hdmi *vc4_hdmi, u32 channel_mask) in vc5_hdmi_channel_map() argument
2043 static bool vc5_hdmi_hp_detect(struct vc4_hdmi *vc4_hdmi) in vc5_hdmi_hp_detect() argument
2045 struct drm_device *drm = vc4_hdmi->connector.dev; in vc5_hdmi_hp_detect()
2053 spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); in vc5_hdmi_hp_detect()
2055 spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags); in vc5_hdmi_hp_detect()
2063 static void vc4_hdmi_audio_set_mai_clock(struct vc4_hdmi *vc4_hdmi, in vc4_hdmi_audio_set_mai_clock() argument
2066 struct drm_device *drm = vc4_hdmi->connector.dev; in vc4_hdmi_audio_set_mai_clock()
2075 hsm_clock = clk_get_rate(vc4_hdmi->audio_clock); in vc4_hdmi_audio_set_mai_clock()
2083 spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_audio_set_mai_clock()
2087 spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_audio_set_mai_clock()
2092 static void vc4_hdmi_set_n_cts(struct vc4_hdmi *vc4_hdmi, unsigned int samplerate) in vc4_hdmi_set_n_cts() argument
2094 const struct drm_display_mode *mode = &vc4_hdmi->saved_adjusted_mode; in vc4_hdmi_set_n_cts()
2098 lockdep_assert_held(&vc4_hdmi->mutex); in vc4_hdmi_set_n_cts()
2099 lockdep_assert_held(&vc4_hdmi->hw_lock); in vc4_hdmi_set_n_cts()
2119 static inline struct vc4_hdmi *dai_to_hdmi(struct snd_soc_dai *dai) in dai_to_hdmi()
2126 static bool vc4_hdmi_audio_can_stream(struct vc4_hdmi *vc4_hdmi) in vc4_hdmi_audio_can_stream() argument
2128 struct drm_display_info *display = &vc4_hdmi->connector.display_info; in vc4_hdmi_audio_can_stream()
2130 lockdep_assert_held(&vc4_hdmi->mutex); in vc4_hdmi_audio_can_stream()
2144 struct vc4_hdmi *vc4_hdmi = dev_get_drvdata(dev); in vc4_hdmi_audio_startup() local
2145 struct drm_device *drm = vc4_hdmi->connector.dev; in vc4_hdmi_audio_startup()
2150 mutex_lock(&vc4_hdmi->mutex); in vc4_hdmi_audio_startup()
2157 if (!vc4_hdmi_audio_can_stream(vc4_hdmi)) { in vc4_hdmi_audio_startup()
2162 vc4_hdmi->audio.streaming = true; in vc4_hdmi_audio_startup()
2164 spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_audio_startup()
2171 spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_audio_startup()
2173 if (vc4_hdmi->variant->phy_rng_enable) in vc4_hdmi_audio_startup()
2174 vc4_hdmi->variant->phy_rng_enable(vc4_hdmi); in vc4_hdmi_audio_startup()
2179 mutex_unlock(&vc4_hdmi->mutex); in vc4_hdmi_audio_startup()
2184 static void vc4_hdmi_audio_reset(struct vc4_hdmi *vc4_hdmi) in vc4_hdmi_audio_reset() argument
2186 struct drm_encoder *encoder = &vc4_hdmi->encoder.base; in vc4_hdmi_audio_reset()
2187 struct device *dev = &vc4_hdmi->pdev->dev; in vc4_hdmi_audio_reset()
2191 lockdep_assert_held(&vc4_hdmi->mutex); in vc4_hdmi_audio_reset()
2193 vc4_hdmi->audio.streaming = false; in vc4_hdmi_audio_reset()
2198 spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_audio_reset()
2204 spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_audio_reset()
2209 struct vc4_hdmi *vc4_hdmi = dev_get_drvdata(dev); in vc4_hdmi_audio_shutdown() local
2210 struct drm_device *drm = vc4_hdmi->connector.dev; in vc4_hdmi_audio_shutdown()
2214 mutex_lock(&vc4_hdmi->mutex); in vc4_hdmi_audio_shutdown()
2219 spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_audio_shutdown()
2226 spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_audio_shutdown()
2228 if (vc4_hdmi->variant->phy_rng_disable) in vc4_hdmi_audio_shutdown()
2229 vc4_hdmi->variant->phy_rng_disable(vc4_hdmi); in vc4_hdmi_audio_shutdown()
2231 vc4_hdmi->audio.streaming = false; in vc4_hdmi_audio_shutdown()
2232 vc4_hdmi_audio_reset(vc4_hdmi); in vc4_hdmi_audio_shutdown()
2237 mutex_unlock(&vc4_hdmi->mutex); in vc4_hdmi_audio_shutdown()
2283 struct vc4_hdmi *vc4_hdmi = dev_get_drvdata(dev); in vc4_hdmi_audio_prepare() local
2284 struct drm_device *drm = vc4_hdmi->connector.dev; in vc4_hdmi_audio_prepare()
2285 struct drm_encoder *encoder = &vc4_hdmi->encoder.base; in vc4_hdmi_audio_prepare()
2299 mutex_lock(&vc4_hdmi->mutex); in vc4_hdmi_audio_prepare()
2306 if (!vc4_hdmi_audio_can_stream(vc4_hdmi)) { in vc4_hdmi_audio_prepare()
2311 vc4_hdmi_audio_set_mai_clock(vc4_hdmi, sample_rate); in vc4_hdmi_audio_prepare()
2313 spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_audio_prepare()
2354 channel_map = vc4_hdmi->variant->channel_map(vc4_hdmi, channel_mask); in vc4_hdmi_audio_prepare()
2358 vc4_hdmi_set_n_cts(vc4_hdmi, sample_rate); in vc4_hdmi_audio_prepare()
2360 spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_audio_prepare()
2362 memcpy(&vc4_hdmi->audio.infoframe, &params->cea, sizeof(params->cea)); in vc4_hdmi_audio_prepare()
2368 mutex_unlock(&vc4_hdmi->mutex); in vc4_hdmi_audio_prepare()
2380 struct vc4_hdmi *vc4_hdmi = dai_to_hdmi(dai); in vc4_hdmi_audio_cpu_dai_probe() local
2382 snd_soc_dai_init_dma_data(dai, &vc4_hdmi->audio.dma_data, NULL); in vc4_hdmi_audio_cpu_dai_probe()
2410 struct vc4_hdmi *vc4_hdmi = dev_get_drvdata(dev); in vc4_hdmi_audio_get_eld() local
2411 struct drm_connector *connector = &vc4_hdmi->connector; in vc4_hdmi_audio_get_eld()
2413 mutex_lock(&vc4_hdmi->mutex); in vc4_hdmi_audio_get_eld()
2415 mutex_unlock(&vc4_hdmi->mutex); in vc4_hdmi_audio_get_eld()
2435 struct vc4_hdmi *vc4_hdmi = ptr; in vc4_hdmi_audio_codec_release() local
2437 platform_device_unregister(vc4_hdmi->audio.codec_pdev); in vc4_hdmi_audio_codec_release()
2438 vc4_hdmi->audio.codec_pdev = NULL; in vc4_hdmi_audio_codec_release()
2441 static int vc4_hdmi_audio_init(struct vc4_hdmi *vc4_hdmi) in vc4_hdmi_audio_init() argument
2444 &vc4_hdmi->variant->registers[HDMI_MAI_DATA]; in vc4_hdmi_audio_init()
2445 struct snd_soc_dai_link *dai_link = &vc4_hdmi->audio.link; in vc4_hdmi_audio_init()
2446 struct snd_soc_card *card = &vc4_hdmi->audio.card; in vc4_hdmi_audio_init()
2447 struct device *dev = &vc4_hdmi->pdev->dev; in vc4_hdmi_audio_init()
2471 BUILD_BUG_ON(offsetof(struct vc4_hdmi, audio) != 0); in vc4_hdmi_audio_init()
2498 vc4_hdmi->audio.dma_data.addr = be32_to_cpup(addr) + mai_data->offset; in vc4_hdmi_audio_init()
2499 vc4_hdmi->audio.dma_data.addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; in vc4_hdmi_audio_init()
2500 vc4_hdmi->audio.dma_data.maxburst = 2; in vc4_hdmi_audio_init()
2547 vc4_hdmi->audio.codec_pdev = codec_pdev; in vc4_hdmi_audio_init()
2549 ret = devm_add_action_or_reset(dev, vc4_hdmi_audio_codec_release, vc4_hdmi); in vc4_hdmi_audio_init()
2553 dai_link->cpus = &vc4_hdmi->audio.cpu; in vc4_hdmi_audio_init()
2554 dai_link->codecs = &vc4_hdmi->audio.codec; in vc4_hdmi_audio_init()
2555 dai_link->platforms = &vc4_hdmi->audio.platform; in vc4_hdmi_audio_init()
2570 card->name = vc4_hdmi->variant->card_name; in vc4_hdmi_audio_init()
2582 snd_soc_card_set_drvdata(card, vc4_hdmi); in vc4_hdmi_audio_init()
2593 struct vc4_hdmi *vc4_hdmi = priv; in vc4_hdmi_hpd_irq_thread() local
2594 struct drm_connector *connector = &vc4_hdmi->connector; in vc4_hdmi_hpd_irq_thread()
2603 static int vc4_hdmi_hotplug_init(struct vc4_hdmi *vc4_hdmi) in vc4_hdmi_hotplug_init() argument
2605 struct drm_connector *connector = &vc4_hdmi->connector; in vc4_hdmi_hotplug_init()
2606 struct platform_device *pdev = vc4_hdmi->pdev; in vc4_hdmi_hotplug_init()
2609 if (vc4_hdmi->variant->external_irq_controller) { in vc4_hdmi_hotplug_init()
2616 "vc4 hdmi hpd connected", vc4_hdmi); in vc4_hdmi_hotplug_init()
2623 "vc4 hdmi hpd disconnected", vc4_hdmi); in vc4_hdmi_hotplug_init()
2636 struct vc4_hdmi *vc4_hdmi = priv; in vc4_cec_irq_handler_rx_thread() local
2638 if (vc4_hdmi->cec_rx_msg.len) in vc4_cec_irq_handler_rx_thread()
2639 cec_received_msg(vc4_hdmi->cec_adap, in vc4_cec_irq_handler_rx_thread()
2640 &vc4_hdmi->cec_rx_msg); in vc4_cec_irq_handler_rx_thread()
2647 struct vc4_hdmi *vc4_hdmi = priv; in vc4_cec_irq_handler_tx_thread() local
2649 if (vc4_hdmi->cec_tx_ok) { in vc4_cec_irq_handler_tx_thread()
2650 cec_transmit_done(vc4_hdmi->cec_adap, CEC_TX_STATUS_OK, in vc4_cec_irq_handler_tx_thread()
2657 cec_transmit_done(vc4_hdmi->cec_adap, CEC_TX_STATUS_NACK, in vc4_cec_irq_handler_tx_thread()
2665 struct vc4_hdmi *vc4_hdmi = priv; in vc4_cec_irq_handler_thread() local
2668 if (vc4_hdmi->cec_irq_was_rx) in vc4_cec_irq_handler_thread()
2676 static void vc4_cec_read_msg(struct vc4_hdmi *vc4_hdmi, u32 cntrl1) in vc4_cec_read_msg() argument
2678 struct drm_device *dev = vc4_hdmi->connector.dev; in vc4_cec_read_msg()
2679 struct cec_msg *msg = &vc4_hdmi->cec_rx_msg; in vc4_cec_read_msg()
2682 lockdep_assert_held(&vc4_hdmi->hw_lock); in vc4_cec_read_msg()
2702 static irqreturn_t vc4_cec_irq_handler_tx_bare_locked(struct vc4_hdmi *vc4_hdmi) in vc4_cec_irq_handler_tx_bare_locked() argument
2717 lockdep_assert_held(&vc4_hdmi->hw_lock); in vc4_cec_irq_handler_tx_bare_locked()
2720 vc4_hdmi->cec_tx_ok = cntrl1 & VC4_HDMI_CEC_TX_STATUS_GOOD; in vc4_cec_irq_handler_tx_bare_locked()
2729 struct vc4_hdmi *vc4_hdmi = priv; in vc4_cec_irq_handler_tx_bare() local
2732 spin_lock(&vc4_hdmi->hw_lock); in vc4_cec_irq_handler_tx_bare()
2733 ret = vc4_cec_irq_handler_tx_bare_locked(vc4_hdmi); in vc4_cec_irq_handler_tx_bare()
2734 spin_unlock(&vc4_hdmi->hw_lock); in vc4_cec_irq_handler_tx_bare()
2739 static irqreturn_t vc4_cec_irq_handler_rx_bare_locked(struct vc4_hdmi *vc4_hdmi) in vc4_cec_irq_handler_rx_bare_locked() argument
2743 lockdep_assert_held(&vc4_hdmi->hw_lock); in vc4_cec_irq_handler_rx_bare_locked()
2756 vc4_hdmi->cec_rx_msg.len = 0; in vc4_cec_irq_handler_rx_bare_locked()
2758 vc4_cec_read_msg(vc4_hdmi, cntrl1); in vc4_cec_irq_handler_rx_bare_locked()
2770 struct vc4_hdmi *vc4_hdmi = priv; in vc4_cec_irq_handler_rx_bare() local
2773 spin_lock(&vc4_hdmi->hw_lock); in vc4_cec_irq_handler_rx_bare()
2774 ret = vc4_cec_irq_handler_rx_bare_locked(vc4_hdmi); in vc4_cec_irq_handler_rx_bare()
2775 spin_unlock(&vc4_hdmi->hw_lock); in vc4_cec_irq_handler_rx_bare()
2782 struct vc4_hdmi *vc4_hdmi = priv; in vc4_cec_irq_handler() local
2801 spin_lock(&vc4_hdmi->hw_lock); in vc4_cec_irq_handler()
2803 vc4_hdmi->cec_irq_was_rx = cntrl5 & VC4_HDMI_CEC_RX_CEC_INT; in vc4_cec_irq_handler()
2804 if (vc4_hdmi->cec_irq_was_rx) in vc4_cec_irq_handler()
2805 ret = vc4_cec_irq_handler_rx_bare_locked(vc4_hdmi); in vc4_cec_irq_handler()
2807 ret = vc4_cec_irq_handler_tx_bare_locked(vc4_hdmi); in vc4_cec_irq_handler()
2810 spin_unlock(&vc4_hdmi->hw_lock); in vc4_cec_irq_handler()
2817 struct vc4_hdmi *vc4_hdmi = cec_get_drvdata(adap); in vc4_hdmi_cec_enable() local
2818 struct drm_device *drm = vc4_hdmi->connector.dev; in vc4_hdmi_cec_enable()
2834 ret = pm_runtime_resume_and_get(&vc4_hdmi->pdev->dev); in vc4_hdmi_cec_enable()
2840 mutex_lock(&vc4_hdmi->mutex); in vc4_hdmi_cec_enable()
2842 spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_cec_enable()
2871 if (!vc4_hdmi->variant->external_irq_controller) in vc4_hdmi_cec_enable()
2874 spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_cec_enable()
2876 mutex_unlock(&vc4_hdmi->mutex); in vc4_hdmi_cec_enable()
2884 struct vc4_hdmi *vc4_hdmi = cec_get_drvdata(adap); in vc4_hdmi_cec_disable() local
2885 struct drm_device *drm = vc4_hdmi->connector.dev; in vc4_hdmi_cec_disable()
2897 mutex_lock(&vc4_hdmi->mutex); in vc4_hdmi_cec_disable()
2899 spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_cec_disable()
2901 if (!vc4_hdmi->variant->external_irq_controller) in vc4_hdmi_cec_disable()
2907 spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_cec_disable()
2909 mutex_unlock(&vc4_hdmi->mutex); in vc4_hdmi_cec_disable()
2911 pm_runtime_put(&vc4_hdmi->pdev->dev); in vc4_hdmi_cec_disable()
2928 struct vc4_hdmi *vc4_hdmi = cec_get_drvdata(adap); in vc4_hdmi_cec_adap_log_addr() local
2929 struct drm_device *drm = vc4_hdmi->connector.dev; in vc4_hdmi_cec_adap_log_addr()
2941 mutex_lock(&vc4_hdmi->mutex); in vc4_hdmi_cec_adap_log_addr()
2942 spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_cec_adap_log_addr()
2946 spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_cec_adap_log_addr()
2947 mutex_unlock(&vc4_hdmi->mutex); in vc4_hdmi_cec_adap_log_addr()
2957 struct vc4_hdmi *vc4_hdmi = cec_get_drvdata(adap); in vc4_hdmi_cec_adap_transmit() local
2958 struct drm_device *dev = vc4_hdmi->connector.dev; in vc4_hdmi_cec_adap_transmit()
2973 mutex_lock(&vc4_hdmi->mutex); in vc4_hdmi_cec_adap_transmit()
2975 spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_cec_adap_transmit()
2993 spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_cec_adap_transmit()
2994 mutex_unlock(&vc4_hdmi->mutex); in vc4_hdmi_cec_adap_transmit()
3008 struct vc4_hdmi *vc4_hdmi = ptr; in vc4_hdmi_cec_release() local
3010 cec_unregister_adapter(vc4_hdmi->cec_adap); in vc4_hdmi_cec_release()
3011 vc4_hdmi->cec_adap = NULL; in vc4_hdmi_cec_release()
3014 static int vc4_hdmi_cec_init(struct vc4_hdmi *vc4_hdmi) in vc4_hdmi_cec_init() argument
3017 struct platform_device *pdev = vc4_hdmi->pdev; in vc4_hdmi_cec_init()
3026 vc4_hdmi->cec_adap = cec_allocate_adapter(&vc4_hdmi_cec_adap_ops, in vc4_hdmi_cec_init()
3027 vc4_hdmi, in vc4_hdmi_cec_init()
3028 vc4_hdmi->variant->card_name, in vc4_hdmi_cec_init()
3031 ret = PTR_ERR_OR_ZERO(vc4_hdmi->cec_adap); in vc4_hdmi_cec_init()
3035 cec_fill_conn_info_from_drm(&conn_info, &vc4_hdmi->connector); in vc4_hdmi_cec_init()
3036 cec_s_conn_info(vc4_hdmi->cec_adap, &conn_info); in vc4_hdmi_cec_init()
3038 if (vc4_hdmi->variant->external_irq_controller) { in vc4_hdmi_cec_init()
3042 "vc4 hdmi cec rx", vc4_hdmi); in vc4_hdmi_cec_init()
3049 "vc4 hdmi cec tx", vc4_hdmi); in vc4_hdmi_cec_init()
3056 "vc4 hdmi cec", vc4_hdmi); in vc4_hdmi_cec_init()
3061 ret = cec_register_adapter(vc4_hdmi->cec_adap, &pdev->dev); in vc4_hdmi_cec_init()
3088 ret = devm_add_action_or_reset(dev, vc4_hdmi_cec_release, vc4_hdmi); in vc4_hdmi_cec_init()
3095 cec_delete_adapter(vc4_hdmi->cec_adap); in vc4_hdmi_cec_init()
3100 static int vc4_hdmi_cec_init(struct vc4_hdmi *vc4_hdmi) in vc4_hdmi_cec_init() argument
3114 struct vc4_hdmi *vc4_hdmi, in vc4_hdmi_build_regset() argument
3118 const struct vc4_hdmi_variant *variant = vc4_hdmi->variant; in vc4_hdmi_build_regset()
3144 regset->base = __vc4_hdmi_get_field_base(vc4_hdmi, reg); in vc4_hdmi_build_regset()
3156 struct vc4_hdmi *vc4_hdmi) in vc4_hdmi_init_resources() argument
3158 struct platform_device *pdev = vc4_hdmi->pdev; in vc4_hdmi_init_resources()
3162 vc4_hdmi->hdmicore_regs = vc4_ioremap_regs(pdev, 0); in vc4_hdmi_init_resources()
3163 if (IS_ERR(vc4_hdmi->hdmicore_regs)) in vc4_hdmi_init_resources()
3164 return PTR_ERR(vc4_hdmi->hdmicore_regs); in vc4_hdmi_init_resources()
3166 vc4_hdmi->hd_regs = vc4_ioremap_regs(pdev, 1); in vc4_hdmi_init_resources()
3167 if (IS_ERR(vc4_hdmi->hd_regs)) in vc4_hdmi_init_resources()
3168 return PTR_ERR(vc4_hdmi->hd_regs); in vc4_hdmi_init_resources()
3170 ret = vc4_hdmi_build_regset(drm, vc4_hdmi, &vc4_hdmi->hd_regset, VC4_HD); in vc4_hdmi_init_resources()
3174 ret = vc4_hdmi_build_regset(drm, vc4_hdmi, &vc4_hdmi->hdmi_regset, VC4_HDMI); in vc4_hdmi_init_resources()
3178 vc4_hdmi->pixel_clock = devm_clk_get(dev, "pixel"); in vc4_hdmi_init_resources()
3179 if (IS_ERR(vc4_hdmi->pixel_clock)) { in vc4_hdmi_init_resources()
3180 ret = PTR_ERR(vc4_hdmi->pixel_clock); in vc4_hdmi_init_resources()
3186 vc4_hdmi->hsm_clock = devm_clk_get(dev, "hdmi"); in vc4_hdmi_init_resources()
3187 if (IS_ERR(vc4_hdmi->hsm_clock)) { in vc4_hdmi_init_resources()
3189 return PTR_ERR(vc4_hdmi->hsm_clock); in vc4_hdmi_init_resources()
3192 vc4_hdmi->audio_clock = vc4_hdmi->hsm_clock; in vc4_hdmi_init_resources()
3193 vc4_hdmi->cec_clock = vc4_hdmi->hsm_clock; in vc4_hdmi_init_resources()
3195 vc4_hdmi->hsm_rpm_clock = devm_clk_get(dev, "hdmi"); in vc4_hdmi_init_resources()
3196 if (IS_ERR(vc4_hdmi->hsm_rpm_clock)) { in vc4_hdmi_init_resources()
3198 return PTR_ERR(vc4_hdmi->hsm_rpm_clock); in vc4_hdmi_init_resources()
3205 struct vc4_hdmi *vc4_hdmi) in vc5_hdmi_init_resources() argument
3207 struct platform_device *pdev = vc4_hdmi->pdev; in vc5_hdmi_init_resources()
3216 vc4_hdmi->hdmicore_regs = devm_ioremap(dev, res->start, in vc5_hdmi_init_resources()
3218 if (!vc4_hdmi->hdmicore_regs) in vc5_hdmi_init_resources()
3225 vc4_hdmi->hd_regs = devm_ioremap(dev, res->start, resource_size(res)); in vc5_hdmi_init_resources()
3226 if (!vc4_hdmi->hd_regs) in vc5_hdmi_init_resources()
3233 vc4_hdmi->cec_regs = devm_ioremap(dev, res->start, resource_size(res)); in vc5_hdmi_init_resources()
3234 if (!vc4_hdmi->cec_regs) in vc5_hdmi_init_resources()
3241 vc4_hdmi->csc_regs = devm_ioremap(dev, res->start, resource_size(res)); in vc5_hdmi_init_resources()
3242 if (!vc4_hdmi->csc_regs) in vc5_hdmi_init_resources()
3249 vc4_hdmi->dvp_regs = devm_ioremap(dev, res->start, resource_size(res)); in vc5_hdmi_init_resources()
3250 if (!vc4_hdmi->dvp_regs) in vc5_hdmi_init_resources()
3257 vc4_hdmi->phy_regs = devm_ioremap(dev, res->start, resource_size(res)); in vc5_hdmi_init_resources()
3258 if (!vc4_hdmi->phy_regs) in vc5_hdmi_init_resources()
3265 vc4_hdmi->ram_regs = devm_ioremap(dev, res->start, resource_size(res)); in vc5_hdmi_init_resources()
3266 if (!vc4_hdmi->ram_regs) in vc5_hdmi_init_resources()
3273 vc4_hdmi->rm_regs = devm_ioremap(dev, res->start, resource_size(res)); in vc5_hdmi_init_resources()
3274 if (!vc4_hdmi->rm_regs) in vc5_hdmi_init_resources()
3277 vc4_hdmi->hsm_clock = devm_clk_get(dev, "hdmi"); in vc5_hdmi_init_resources()
3278 if (IS_ERR(vc4_hdmi->hsm_clock)) { in vc5_hdmi_init_resources()
3280 return PTR_ERR(vc4_hdmi->hsm_clock); in vc5_hdmi_init_resources()
3283 vc4_hdmi->hsm_rpm_clock = devm_clk_get(dev, "hdmi"); in vc5_hdmi_init_resources()
3284 if (IS_ERR(vc4_hdmi->hsm_rpm_clock)) { in vc5_hdmi_init_resources()
3286 return PTR_ERR(vc4_hdmi->hsm_rpm_clock); in vc5_hdmi_init_resources()
3289 vc4_hdmi->pixel_bvb_clock = devm_clk_get(dev, "bvb"); in vc5_hdmi_init_resources()
3290 if (IS_ERR(vc4_hdmi->pixel_bvb_clock)) { in vc5_hdmi_init_resources()
3292 return PTR_ERR(vc4_hdmi->pixel_bvb_clock); in vc5_hdmi_init_resources()
3295 vc4_hdmi->audio_clock = devm_clk_get(dev, "audio"); in vc5_hdmi_init_resources()
3296 if (IS_ERR(vc4_hdmi->audio_clock)) { in vc5_hdmi_init_resources()
3298 return PTR_ERR(vc4_hdmi->audio_clock); in vc5_hdmi_init_resources()
3301 vc4_hdmi->cec_clock = devm_clk_get(dev, "cec"); in vc5_hdmi_init_resources()
3302 if (IS_ERR(vc4_hdmi->cec_clock)) { in vc5_hdmi_init_resources()
3304 return PTR_ERR(vc4_hdmi->cec_clock); in vc5_hdmi_init_resources()
3307 vc4_hdmi->reset = devm_reset_control_get(dev, NULL); in vc5_hdmi_init_resources()
3308 if (IS_ERR(vc4_hdmi->reset)) { in vc5_hdmi_init_resources()
3310 return PTR_ERR(vc4_hdmi->reset); in vc5_hdmi_init_resources()
3313 ret = vc4_hdmi_build_regset(drm, vc4_hdmi, &vc4_hdmi->hdmi_regset, VC4_HDMI); in vc5_hdmi_init_resources()
3317 ret = vc4_hdmi_build_regset(drm, vc4_hdmi, &vc4_hdmi->hd_regset, VC4_HD); in vc5_hdmi_init_resources()
3321 ret = vc4_hdmi_build_regset(drm, vc4_hdmi, &vc4_hdmi->cec_regset, VC5_CEC); in vc5_hdmi_init_resources()
3325 ret = vc4_hdmi_build_regset(drm, vc4_hdmi, &vc4_hdmi->csc_regset, VC5_CSC); in vc5_hdmi_init_resources()
3329 ret = vc4_hdmi_build_regset(drm, vc4_hdmi, &vc4_hdmi->dvp_regset, VC5_DVP); in vc5_hdmi_init_resources()
3333 ret = vc4_hdmi_build_regset(drm, vc4_hdmi, &vc4_hdmi->phy_regset, VC5_PHY); in vc5_hdmi_init_resources()
3337 ret = vc4_hdmi_build_regset(drm, vc4_hdmi, &vc4_hdmi->ram_regset, VC5_RAM); in vc5_hdmi_init_resources()
3341 ret = vc4_hdmi_build_regset(drm, vc4_hdmi, &vc4_hdmi->rm_regset, VC5_RM); in vc5_hdmi_init_resources()
3350 struct vc4_hdmi *vc4_hdmi = dev_get_drvdata(dev); in vc4_hdmi_runtime_suspend() local
3352 clk_disable_unprepare(vc4_hdmi->hsm_rpm_clock); in vc4_hdmi_runtime_suspend()
3359 struct vc4_hdmi *vc4_hdmi = dev_get_drvdata(dev); in vc4_hdmi_runtime_resume() local
3370 ret = clk_set_min_rate(vc4_hdmi->hsm_rpm_clock, HSM_MIN_CLOCK_FREQ); in vc4_hdmi_runtime_resume()
3374 ret = clk_prepare_enable(vc4_hdmi->hsm_rpm_clock); in vc4_hdmi_runtime_resume()
3387 rate = clk_get_rate(vc4_hdmi->hsm_rpm_clock); in vc4_hdmi_runtime_resume()
3393 if (vc4_hdmi->variant->reset) in vc4_hdmi_runtime_resume()
3394 vc4_hdmi->variant->reset(vc4_hdmi); in vc4_hdmi_runtime_resume()
3397 spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_runtime_resume()
3402 spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_runtime_resume()
3404 vc4_hdmi_cec_update_clk_div(vc4_hdmi); in vc4_hdmi_runtime_resume()
3406 if (!vc4_hdmi->variant->external_irq_controller) { in vc4_hdmi_runtime_resume()
3407 spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_runtime_resume()
3409 spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags); in vc4_hdmi_runtime_resume()
3416 clk_disable_unprepare(vc4_hdmi->hsm_clock); in vc4_hdmi_runtime_resume()
3422 struct vc4_hdmi *vc4_hdmi = ptr; in vc4_hdmi_put_ddc_device() local
3424 put_device(&vc4_hdmi->ddc->dev); in vc4_hdmi_put_ddc_device()
3432 struct vc4_hdmi *vc4_hdmi; in vc4_hdmi_bind() local
3437 vc4_hdmi = drmm_kzalloc(drm, sizeof(*vc4_hdmi), GFP_KERNEL); in vc4_hdmi_bind()
3438 if (!vc4_hdmi) in vc4_hdmi_bind()
3441 ret = drmm_mutex_init(drm, &vc4_hdmi->mutex); in vc4_hdmi_bind()
3445 spin_lock_init(&vc4_hdmi->hw_lock); in vc4_hdmi_bind()
3446 INIT_DELAYED_WORK(&vc4_hdmi->scrambling_work, vc4_hdmi_scrambling_wq); in vc4_hdmi_bind()
3448 dev_set_drvdata(dev, vc4_hdmi); in vc4_hdmi_bind()
3449 encoder = &vc4_hdmi->encoder.base; in vc4_hdmi_bind()
3450 vc4_hdmi->encoder.type = variant->encoder_type; in vc4_hdmi_bind()
3451 vc4_hdmi->encoder.pre_crtc_configure = vc4_hdmi_encoder_pre_crtc_configure; in vc4_hdmi_bind()
3452 vc4_hdmi->encoder.pre_crtc_enable = vc4_hdmi_encoder_pre_crtc_enable; in vc4_hdmi_bind()
3453 vc4_hdmi->encoder.post_crtc_enable = vc4_hdmi_encoder_post_crtc_enable; in vc4_hdmi_bind()
3454 vc4_hdmi->encoder.post_crtc_disable = vc4_hdmi_encoder_post_crtc_disable; in vc4_hdmi_bind()
3455 vc4_hdmi->encoder.post_crtc_powerdown = vc4_hdmi_encoder_post_crtc_powerdown; in vc4_hdmi_bind()
3456 vc4_hdmi->pdev = pdev; in vc4_hdmi_bind()
3457 vc4_hdmi->variant = variant; in vc4_hdmi_bind()
3466 vc4_hdmi->scdc_enabled = true; in vc4_hdmi_bind()
3468 ret = variant->init_resources(drm, vc4_hdmi); in vc4_hdmi_bind()
3478 vc4_hdmi->ddc = of_find_i2c_adapter_by_node(ddc_node); in vc4_hdmi_bind()
3480 if (!vc4_hdmi->ddc) { in vc4_hdmi_bind()
3485 ret = devm_add_action_or_reset(dev, vc4_hdmi_put_ddc_device, vc4_hdmi); in vc4_hdmi_bind()
3492 vc4_hdmi->hpd_gpio = devm_gpiod_get_optional(dev, "hpd", GPIOD_IN); in vc4_hdmi_bind()
3493 if (IS_ERR(vc4_hdmi->hpd_gpio)) { in vc4_hdmi_bind()
3494 return PTR_ERR(vc4_hdmi->hpd_gpio); in vc4_hdmi_bind()
3497 vc4_hdmi->disable_wifi_frequencies = in vc4_hdmi_bind()
3515 clk_prepare_enable(vc4_hdmi->pixel_clock); in vc4_hdmi_bind()
3516 clk_prepare_enable(vc4_hdmi->hsm_clock); in vc4_hdmi_bind()
3517 clk_prepare_enable(vc4_hdmi->pixel_bvb_clock); in vc4_hdmi_bind()
3529 ret = vc4_hdmi_connector_init(drm, vc4_hdmi); in vc4_hdmi_bind()
3533 ret = vc4_hdmi_hotplug_init(vc4_hdmi); in vc4_hdmi_bind()
3537 ret = vc4_hdmi_cec_init(vc4_hdmi); in vc4_hdmi_bind()
3541 ret = vc4_hdmi_audio_init(vc4_hdmi); in vc4_hdmi_bind()