Lines Matching full:dp

32 MODULE_PARM_DESC(psr_enabled, "enable PSR for eDP and DP displays");
175 { .compatible = "qcom,sc7180-dp", .data = &sc7180_dp_descs },
176 { .compatible = "qcom,sc7280-dp", .data = &sc7280_dp_descs },
178 { .compatible = "qcom,sc8180x-dp", .data = &sc8180x_dp_descs },
180 { .compatible = "qcom,sc8280xp-dp", .data = &sc8280xp_dp_descs },
182 { .compatible = "qcom,sdm845-dp", .data = &sc7180_dp_descs },
183 { .compatible = "qcom,sm8350-dp", .data = &sm8350_dp_descs },
189 struct msm_dp *dp = dev_get_drvdata(dev); in dev_get_dp_display_private() local
191 return container_of(dp, struct dp_display_private, dp_display); in dev_get_dp_display_private()
250 struct dp_display_private *dp; in dp_display_signal_audio_start() local
252 dp = container_of(dp_display, struct dp_display_private, dp_display); in dp_display_signal_audio_start()
254 reinit_completion(&dp->audio_comp); in dp_display_signal_audio_start()
259 struct dp_display_private *dp; in dp_display_signal_audio_complete() local
261 dp = container_of(dp_display, struct dp_display_private, dp_display); in dp_display_signal_audio_complete()
263 complete_all(&dp->audio_comp); in dp_display_signal_audio_complete()
272 struct dp_display_private *dp = dev_get_dp_display_private(dev); in dp_display_bind() local
276 dp->dp_display.drm_dev = drm; in dp_display_bind()
277 priv->dp[dp->id] = &dp->dp_display; in dp_display_bind()
279 rc = dp->parser->parse(dp->parser); in dp_display_bind()
286 dp->drm_dev = drm; in dp_display_bind()
287 dp->aux->drm_dev = drm; in dp_display_bind()
288 rc = dp_aux_register(dp->aux); in dp_display_bind()
290 DRM_ERROR("DRM DP AUX register failed\n"); in dp_display_bind()
294 rc = dp_power_client_init(dp->power); in dp_display_bind()
300 rc = dp_register_audio_driver(dev, dp->audio); in dp_display_bind()
302 DRM_ERROR("Audio registration Dp failed\n"); in dp_display_bind()
306 rc = dp_hpd_event_thread_start(dp); in dp_display_bind()
320 struct dp_display_private *dp = dev_get_dp_display_private(dev); in dp_display_unbind() local
324 if (dp->core_initialized) in dp_display_unbind()
325 dp_catalog_hpd_config_intr(dp->catalog, DP_DP_HPD_INT_MASK, false); in dp_display_unbind()
327 kthread_stop(dp->ev_tsk); in dp_display_unbind()
329 of_dp_aux_depopulate_bus(dp->aux); in dp_display_unbind()
331 dp_power_client_deinit(dp->power); in dp_display_unbind()
332 dp_unregister_audio_driver(dev, dp->audio); in dp_display_unbind()
333 dp_aux_unregister(dp->aux); in dp_display_unbind()
334 dp->drm_dev = NULL; in dp_display_unbind()
335 dp->aux->drm_dev = NULL; in dp_display_unbind()
336 priv->dp[dp->id] = NULL; in dp_display_unbind()
350 static bool dp_display_is_sink_count_zero(struct dp_display_private *dp) in dp_display_is_sink_count_zero() argument
352 drm_dbg_dp(dp->drm_dev, "present=%#x sink_count=%d\n", in dp_display_is_sink_count_zero()
353 dp->panel->dpcd[DP_DOWNSTREAMPORT_PRESENT], in dp_display_is_sink_count_zero()
354 dp->link->sink_count); in dp_display_is_sink_count_zero()
355 return dp_display_is_ds_bridge(dp->panel) && in dp_display_is_sink_count_zero()
356 (dp->link->sink_count == 0); in dp_display_is_sink_count_zero()
361 struct dp_display_private *dp; in dp_display_send_hpd_event() local
364 dp = container_of(dp_display, struct dp_display_private, dp_display); in dp_display_send_hpd_event()
366 connector = dp->dp_display.connector; in dp_display_send_hpd_event()
371 static int dp_display_send_hpd_notification(struct dp_display_private *dp, in dp_display_send_hpd_notification() argument
374 if ((hpd && dp->dp_display.is_connected) || in dp_display_send_hpd_notification()
375 (!hpd && !dp->dp_display.is_connected)) { in dp_display_send_hpd_notification()
376 drm_dbg_dp(dp->drm_dev, "HPD already %s\n", in dp_display_send_hpd_notification()
383 dp->panel->video_test = false; in dp_display_send_hpd_notification()
385 dp->dp_display.is_connected = hpd; in dp_display_send_hpd_notification()
387 drm_dbg_dp(dp->drm_dev, "type=%d hpd=%d\n", in dp_display_send_hpd_notification()
388 dp->dp_display.connector_type, hpd); in dp_display_send_hpd_notification()
389 dp_display_send_hpd_event(&dp->dp_display); in dp_display_send_hpd_notification()
394 static int dp_display_process_hpd_high(struct dp_display_private *dp) in dp_display_process_hpd_high() argument
399 dp->panel->max_dp_lanes = dp->parser->max_dp_lanes; in dp_display_process_hpd_high()
400 dp->panel->max_dp_link_rate = dp->parser->max_dp_link_rate; in dp_display_process_hpd_high()
402 drm_dbg_dp(dp->drm_dev, "max_lanes=%d max_link_rate=%d\n", in dp_display_process_hpd_high()
403 dp->panel->max_dp_lanes, dp->panel->max_dp_link_rate); in dp_display_process_hpd_high()
405 rc = dp_panel_read_sink_caps(dp->panel, dp->dp_display.connector); in dp_display_process_hpd_high()
409 dp_link_process_request(dp->link); in dp_display_process_hpd_high()
411 edid = dp->panel->edid; in dp_display_process_hpd_high()
413 dp->dp_display.psr_supported = dp->panel->psr_cap.version && psr_enabled; in dp_display_process_hpd_high()
415 dp->audio_supported = drm_detect_monitor_audio(edid); in dp_display_process_hpd_high()
416 dp_panel_handle_sink_request(dp->panel); in dp_display_process_hpd_high()
418 dp->dp_display.max_dp_lanes = dp->parser->max_dp_lanes; in dp_display_process_hpd_high()
424 dp_link_psm_config(dp->link, &dp->panel->link_info, false); in dp_display_process_hpd_high()
426 dp_link_reset_phy_params_vx_px(dp->link); in dp_display_process_hpd_high()
427 rc = dp_ctrl_on_link(dp->ctrl); in dp_display_process_hpd_high()
429 DRM_ERROR("failed to complete DP link training\n"); in dp_display_process_hpd_high()
433 dp_add_event(dp, EV_USER_NOTIFICATION, true, 0); in dp_display_process_hpd_high()
439 static void dp_display_host_phy_init(struct dp_display_private *dp) in dp_display_host_phy_init() argument
441 drm_dbg_dp(dp->drm_dev, "type=%d core_init=%d phy_init=%d\n", in dp_display_host_phy_init()
442 dp->dp_display.connector_type, dp->core_initialized, in dp_display_host_phy_init()
443 dp->phy_initialized); in dp_display_host_phy_init()
445 if (!dp->phy_initialized) { in dp_display_host_phy_init()
446 dp_ctrl_phy_init(dp->ctrl); in dp_display_host_phy_init()
447 dp->phy_initialized = true; in dp_display_host_phy_init()
451 static void dp_display_host_phy_exit(struct dp_display_private *dp) in dp_display_host_phy_exit() argument
453 drm_dbg_dp(dp->drm_dev, "type=%d core_init=%d phy_init=%d\n", in dp_display_host_phy_exit()
454 dp->dp_display.connector_type, dp->core_initialized, in dp_display_host_phy_exit()
455 dp->phy_initialized); in dp_display_host_phy_exit()
457 if (dp->phy_initialized) { in dp_display_host_phy_exit()
458 dp_ctrl_phy_exit(dp->ctrl); in dp_display_host_phy_exit()
459 dp->phy_initialized = false; in dp_display_host_phy_exit()
463 static void dp_display_host_init(struct dp_display_private *dp) in dp_display_host_init() argument
465 drm_dbg_dp(dp->drm_dev, "type=%d core_init=%d phy_init=%d\n", in dp_display_host_init()
466 dp->dp_display.connector_type, dp->core_initialized, in dp_display_host_init()
467 dp->phy_initialized); in dp_display_host_init()
469 dp_power_init(dp->power); in dp_display_host_init()
470 dp_ctrl_reset_irq_ctrl(dp->ctrl, true); in dp_display_host_init()
471 dp_aux_init(dp->aux); in dp_display_host_init()
472 dp->core_initialized = true; in dp_display_host_init()
475 static void dp_display_host_deinit(struct dp_display_private *dp) in dp_display_host_deinit() argument
477 drm_dbg_dp(dp->drm_dev, "type=%d core_init=%d phy_init=%d\n", in dp_display_host_deinit()
478 dp->dp_display.connector_type, dp->core_initialized, in dp_display_host_deinit()
479 dp->phy_initialized); in dp_display_host_deinit()
481 dp_ctrl_reset_irq_ctrl(dp->ctrl, false); in dp_display_host_deinit()
482 dp_aux_deinit(dp->aux); in dp_display_host_deinit()
483 dp_power_deinit(dp->power); in dp_display_host_deinit()
484 dp->core_initialized = false; in dp_display_host_deinit()
489 struct dp_display_private *dp = dev_get_dp_display_private(dev); in dp_display_usbpd_configure_cb() local
491 dp_display_host_phy_init(dp); in dp_display_usbpd_configure_cb()
493 return dp_display_process_hpd_high(dp); in dp_display_usbpd_configure_cb()
498 struct dp_display_private *dp = dev_get_dp_display_private(dev); in dp_display_notify_disconnect() local
500 dp_add_event(dp, EV_USER_NOTIFICATION, false, 0); in dp_display_notify_disconnect()
505 static void dp_display_handle_video_request(struct dp_display_private *dp) in dp_display_handle_video_request() argument
507 if (dp->link->sink_request & DP_TEST_LINK_VIDEO_PATTERN) { in dp_display_handle_video_request()
508 dp->panel->video_test = true; in dp_display_handle_video_request()
509 dp_link_send_test_response(dp->link); in dp_display_handle_video_request()
513 static int dp_display_handle_port_ststus_changed(struct dp_display_private *dp) in dp_display_handle_port_ststus_changed() argument
517 if (dp_display_is_sink_count_zero(dp)) { in dp_display_handle_port_ststus_changed()
518 drm_dbg_dp(dp->drm_dev, "sink count is zero, nothing to do\n"); in dp_display_handle_port_ststus_changed()
519 if (dp->hpd_state != ST_DISCONNECTED) { in dp_display_handle_port_ststus_changed()
520 dp->hpd_state = ST_DISCONNECT_PENDING; in dp_display_handle_port_ststus_changed()
521 dp_add_event(dp, EV_USER_NOTIFICATION, false, 0); in dp_display_handle_port_ststus_changed()
524 if (dp->hpd_state == ST_DISCONNECTED) { in dp_display_handle_port_ststus_changed()
525 dp->hpd_state = ST_MAINLINK_READY; in dp_display_handle_port_ststus_changed()
526 rc = dp_display_process_hpd_high(dp); in dp_display_handle_port_ststus_changed()
528 dp->hpd_state = ST_DISCONNECTED; in dp_display_handle_port_ststus_changed()
535 static int dp_display_handle_irq_hpd(struct dp_display_private *dp) in dp_display_handle_irq_hpd() argument
537 u32 sink_request = dp->link->sink_request; in dp_display_handle_irq_hpd()
539 drm_dbg_dp(dp->drm_dev, "%d\n", sink_request); in dp_display_handle_irq_hpd()
540 if (dp->hpd_state == ST_DISCONNECTED) { in dp_display_handle_irq_hpd()
542 drm_dbg_dp(dp->drm_dev, "Disconnected sink_request: %d\n", in dp_display_handle_irq_hpd()
549 dp_ctrl_handle_sink_request(dp->ctrl); in dp_display_handle_irq_hpd()
552 dp_display_handle_video_request(dp); in dp_display_handle_irq_hpd()
561 struct dp_display_private *dp = dev_get_dp_display_private(dev); in dp_display_usbpd_attention_cb() local
564 rc = dp_link_process_request(dp->link); in dp_display_usbpd_attention_cb()
566 sink_request = dp->link->sink_request; in dp_display_usbpd_attention_cb()
567 drm_dbg_dp(dp->drm_dev, "hpd_state=%d sink_request=%d\n", in dp_display_usbpd_attention_cb()
568 dp->hpd_state, sink_request); in dp_display_usbpd_attention_cb()
570 rc = dp_display_handle_port_ststus_changed(dp); in dp_display_usbpd_attention_cb()
572 rc = dp_display_handle_irq_hpd(dp); in dp_display_usbpd_attention_cb()
578 static int dp_hpd_plug_handle(struct dp_display_private *dp, u32 data) in dp_hpd_plug_handle() argument
583 mutex_lock(&dp->event_mutex); in dp_hpd_plug_handle()
585 state = dp->hpd_state; in dp_hpd_plug_handle()
586 drm_dbg_dp(dp->drm_dev, "Before, type=%d hpd_state=%d\n", in dp_hpd_plug_handle()
587 dp->dp_display.connector_type, state); in dp_hpd_plug_handle()
590 mutex_unlock(&dp->event_mutex); in dp_hpd_plug_handle()
595 mutex_unlock(&dp->event_mutex); in dp_hpd_plug_handle()
601 dp_add_event(dp, EV_HPD_PLUG_INT, 0, 1); /* delay = 1 */ in dp_hpd_plug_handle()
602 mutex_unlock(&dp->event_mutex); in dp_hpd_plug_handle()
606 ret = dp_display_usbpd_configure_cb(&dp->pdev->dev); in dp_hpd_plug_handle()
608 dp->hpd_state = ST_DISCONNECTED; in dp_hpd_plug_handle()
610 dp->hpd_state = ST_MAINLINK_READY; in dp_hpd_plug_handle()
613 drm_dbg_dp(dp->drm_dev, "After, type=%d hpd_state=%d\n", in dp_hpd_plug_handle()
614 dp->dp_display.connector_type, state); in dp_hpd_plug_handle()
615 mutex_unlock(&dp->event_mutex); in dp_hpd_plug_handle()
624 struct dp_display_private *dp; in dp_display_handle_plugged_change() local
626 dp = container_of(dp_display, in dp_display_handle_plugged_change()
631 dp->audio_supported) in dp_display_handle_plugged_change()
635 static int dp_hpd_unplug_handle(struct dp_display_private *dp, u32 data) in dp_hpd_unplug_handle() argument
639 mutex_lock(&dp->event_mutex); in dp_hpd_unplug_handle()
641 state = dp->hpd_state; in dp_hpd_unplug_handle()
643 drm_dbg_dp(dp->drm_dev, "Before, type=%d hpd_state=%d\n", in dp_hpd_unplug_handle()
644 dp->dp_display.connector_type, state); in dp_hpd_unplug_handle()
647 dp_del_event(dp, EV_IRQ_HPD_INT); in dp_hpd_unplug_handle()
651 if (dp->link->sink_count == 0) { in dp_hpd_unplug_handle()
652 dp_display_host_phy_exit(dp); in dp_hpd_unplug_handle()
654 dp_display_notify_disconnect(&dp->pdev->dev); in dp_hpd_unplug_handle()
655 mutex_unlock(&dp->event_mutex); in dp_hpd_unplug_handle()
658 mutex_unlock(&dp->event_mutex); in dp_hpd_unplug_handle()
661 dp_ctrl_off_link(dp->ctrl); in dp_hpd_unplug_handle()
662 dp_display_host_phy_exit(dp); in dp_hpd_unplug_handle()
663 dp->hpd_state = ST_DISCONNECTED; in dp_hpd_unplug_handle()
664 dp_display_notify_disconnect(&dp->pdev->dev); in dp_hpd_unplug_handle()
665 mutex_unlock(&dp->event_mutex); in dp_hpd_unplug_handle()
673 dp_display_notify_disconnect(&dp->pdev->dev); in dp_hpd_unplug_handle()
676 dp->hpd_state = ST_DISCONNECTED; in dp_hpd_unplug_handle()
678 dp->hpd_state = ST_DISCONNECT_PENDING; in dp_hpd_unplug_handle()
682 dp_display_handle_plugged_change(&dp->dp_display, false); in dp_hpd_unplug_handle()
684 drm_dbg_dp(dp->drm_dev, "After, type=%d hpd_state=%d\n", in dp_hpd_unplug_handle()
685 dp->dp_display.connector_type, state); in dp_hpd_unplug_handle()
688 mutex_unlock(&dp->event_mutex); in dp_hpd_unplug_handle()
692 static int dp_irq_hpd_handle(struct dp_display_private *dp, u32 data) in dp_irq_hpd_handle() argument
696 mutex_lock(&dp->event_mutex); in dp_irq_hpd_handle()
699 state = dp->hpd_state; in dp_irq_hpd_handle()
700 drm_dbg_dp(dp->drm_dev, "Before, type=%d hpd_state=%d\n", in dp_irq_hpd_handle()
701 dp->dp_display.connector_type, state); in dp_irq_hpd_handle()
704 mutex_unlock(&dp->event_mutex); in dp_irq_hpd_handle()
710 dp_add_event(dp, EV_IRQ_HPD_INT, 0, 1); /* delay = 1 */ in dp_irq_hpd_handle()
711 mutex_unlock(&dp->event_mutex); in dp_irq_hpd_handle()
715 dp_display_usbpd_attention_cb(&dp->pdev->dev); in dp_irq_hpd_handle()
717 drm_dbg_dp(dp->drm_dev, "After, type=%d hpd_state=%d\n", in dp_irq_hpd_handle()
718 dp->dp_display.connector_type, state); in dp_irq_hpd_handle()
720 mutex_unlock(&dp->event_mutex); in dp_irq_hpd_handle()
725 static void dp_display_deinit_sub_modules(struct dp_display_private *dp) in dp_display_deinit_sub_modules() argument
727 dp_debug_put(dp->debug); in dp_display_deinit_sub_modules()
728 dp_audio_put(dp->audio); in dp_display_deinit_sub_modules()
729 dp_panel_put(dp->panel); in dp_display_deinit_sub_modules()
730 dp_aux_put(dp->aux); in dp_display_deinit_sub_modules()
733 static int dp_init_sub_modules(struct dp_display_private *dp) in dp_init_sub_modules() argument
736 struct device *dev = &dp->pdev->dev; in dp_init_sub_modules()
741 dp->parser = dp_parser_get(dp->pdev); in dp_init_sub_modules()
742 if (IS_ERR(dp->parser)) { in dp_init_sub_modules()
743 rc = PTR_ERR(dp->parser); in dp_init_sub_modules()
745 dp->parser = NULL; in dp_init_sub_modules()
749 dp->catalog = dp_catalog_get(dev, &dp->parser->io); in dp_init_sub_modules()
750 if (IS_ERR(dp->catalog)) { in dp_init_sub_modules()
751 rc = PTR_ERR(dp->catalog); in dp_init_sub_modules()
753 dp->catalog = NULL; in dp_init_sub_modules()
757 dp->power = dp_power_get(dev, dp->parser); in dp_init_sub_modules()
758 if (IS_ERR(dp->power)) { in dp_init_sub_modules()
759 rc = PTR_ERR(dp->power); in dp_init_sub_modules()
761 dp->power = NULL; in dp_init_sub_modules()
765 dp->aux = dp_aux_get(dev, dp->catalog, dp->dp_display.is_edp); in dp_init_sub_modules()
766 if (IS_ERR(dp->aux)) { in dp_init_sub_modules()
767 rc = PTR_ERR(dp->aux); in dp_init_sub_modules()
769 dp->aux = NULL; in dp_init_sub_modules()
773 dp->link = dp_link_get(dev, dp->aux); in dp_init_sub_modules()
774 if (IS_ERR(dp->link)) { in dp_init_sub_modules()
775 rc = PTR_ERR(dp->link); in dp_init_sub_modules()
777 dp->link = NULL; in dp_init_sub_modules()
781 panel_in.aux = dp->aux; in dp_init_sub_modules()
782 panel_in.catalog = dp->catalog; in dp_init_sub_modules()
783 panel_in.link = dp->link; in dp_init_sub_modules()
785 dp->panel = dp_panel_get(&panel_in); in dp_init_sub_modules()
786 if (IS_ERR(dp->panel)) { in dp_init_sub_modules()
787 rc = PTR_ERR(dp->panel); in dp_init_sub_modules()
789 dp->panel = NULL; in dp_init_sub_modules()
793 dp->ctrl = dp_ctrl_get(dev, dp->link, dp->panel, dp->aux, in dp_init_sub_modules()
794 dp->power, dp->catalog, dp->parser); in dp_init_sub_modules()
795 if (IS_ERR(dp->ctrl)) { in dp_init_sub_modules()
796 rc = PTR_ERR(dp->ctrl); in dp_init_sub_modules()
798 dp->ctrl = NULL; in dp_init_sub_modules()
802 dp->audio = dp_audio_get(dp->pdev, dp->panel, dp->catalog); in dp_init_sub_modules()
803 if (IS_ERR(dp->audio)) { in dp_init_sub_modules()
804 rc = PTR_ERR(dp->audio); in dp_init_sub_modules()
806 dp->audio = NULL; in dp_init_sub_modules()
811 dp->ctrl->wide_bus_en = dp->wide_bus_en; in dp_init_sub_modules()
812 dp->catalog->wide_bus_en = dp->wide_bus_en; in dp_init_sub_modules()
817 dp_panel_put(dp->panel); in dp_init_sub_modules()
819 dp_aux_put(dp->aux); in dp_init_sub_modules()
827 struct dp_display_private *dp; in dp_display_set_mode() local
829 dp = container_of(dp_display, struct dp_display_private, dp_display); in dp_display_set_mode()
831 drm_mode_copy(&dp->panel->dp_mode.drm_mode, &mode->drm_mode); in dp_display_set_mode()
832 dp->panel->dp_mode.bpp = mode->bpp; in dp_display_set_mode()
833 dp->panel->dp_mode.capabilities = mode->capabilities; in dp_display_set_mode()
834 dp_panel_init_panel_info(dp->panel); in dp_display_set_mode()
838 static int dp_display_enable(struct dp_display_private *dp, bool force_link_train) in dp_display_enable() argument
841 struct msm_dp *dp_display = &dp->dp_display; in dp_display_enable()
843 drm_dbg_dp(dp->drm_dev, "sink_count=%d\n", dp->link->sink_count); in dp_display_enable()
845 drm_dbg_dp(dp->drm_dev, "Link already setup, return\n"); in dp_display_enable()
849 rc = dp_ctrl_on_stream(dp->ctrl, force_link_train); in dp_display_enable()
858 struct dp_display_private *dp; in dp_display_post_enable() local
861 dp = container_of(dp_display, struct dp_display_private, dp_display); in dp_display_post_enable()
863 rate = dp->link->link_params.rate; in dp_display_post_enable()
865 if (dp->audio_supported) { in dp_display_post_enable()
866 dp->audio->bw_code = drm_dp_link_rate_to_bw_code(rate); in dp_display_post_enable()
867 dp->audio->lane_count = dp->link->link_params.num_lanes; in dp_display_post_enable()
874 dp_ctrl_config_psr(dp->ctrl); in dp_display_post_enable()
879 static int dp_display_disable(struct dp_display_private *dp) in dp_display_disable() argument
881 struct msm_dp *dp_display = &dp->dp_display; in dp_display_disable()
890 if (!wait_for_completion_timeout(&dp->audio_comp, in dp_display_disable()
897 if (dp->link->sink_count == 0) { in dp_display_disable()
902 dp_ctrl_off_link_stream(dp->ctrl); in dp_display_disable()
908 dp_ctrl_off(dp->ctrl); in dp_display_disable()
909 dp_display_host_phy_exit(dp); in dp_display_disable()
914 drm_dbg_dp(dp->drm_dev, "sink count: %d\n", dp->link->sink_count); in dp_display_disable()
946 struct msm_dp *dp; in dp_bridge_mode_valid() local
949 dp = to_dp_bridge(bridge)->dp_display; in dp_bridge_mode_valid()
951 if (!dp || !mode_pclk_khz || !dp->connector) { in dp_bridge_mode_valid()
959 dp_display = container_of(dp, struct dp_display_private, dp_display); in dp_bridge_mode_valid()
962 mode_bpp = dp->connector->display_info.bpc * num_components; in dp_bridge_mode_valid()
978 int dp_display_get_modes(struct msm_dp *dp) in dp_display_get_modes() argument
982 if (!dp) { in dp_display_get_modes()
987 dp_display = container_of(dp, struct dp_display_private, dp_display); in dp_display_get_modes()
990 dp->connector); in dp_display_get_modes()
993 bool dp_display_check_video_test(struct msm_dp *dp) in dp_display_check_video_test() argument
997 dp_display = container_of(dp, struct dp_display_private, dp_display); in dp_display_check_video_test()
1002 int dp_display_get_test_bpp(struct msm_dp *dp) in dp_display_get_test_bpp() argument
1006 if (!dp) { in dp_display_get_test_bpp()
1011 dp_display = container_of(dp, struct dp_display_private, dp_display); in dp_display_get_test_bpp()
1017 void msm_dp_snapshot(struct msm_disp_state *disp_state, struct msm_dp *dp) in msm_dp_snapshot() argument
1021 dp_display = container_of(dp, struct dp_display_private, dp_display); in msm_dp_snapshot()
1025 * however till DP cable is connected this will not happen as we in msm_dp_snapshot()
1027 * power_on status before dumping DP registers to avoid crash due in msm_dp_snapshot()
1032 if (!dp->power_on) { in msm_dp_snapshot()
1044 struct dp_display_private *dp; in dp_display_set_psr() local
1051 dp = container_of(dp_display, struct dp_display_private, dp_display); in dp_display_set_psr()
1052 dp_ctrl_set_psr(dp->ctrl, enter); in dp_display_set_psr()
1154 struct dp_display_private *dp = dev_id; in dp_display_irq_handler() local
1158 if (!dp) { in dp_display_irq_handler()
1163 hpd_isr_status = dp_catalog_hpd_get_intr_status(dp->catalog); in dp_display_irq_handler()
1166 drm_dbg_dp(dp->drm_dev, "type=%d isr=0x%x\n", in dp_display_irq_handler()
1167 dp->dp_display.connector_type, hpd_isr_status); in dp_display_irq_handler()
1170 dp_add_event(dp, EV_HPD_PLUG_INT, 0, 0); in dp_display_irq_handler()
1173 dp_add_event(dp, EV_IRQ_HPD_INT, 0, 0); in dp_display_irq_handler()
1177 dp_add_event(dp, EV_HPD_UNPLUG_INT, 0, 0); in dp_display_irq_handler()
1178 dp_add_event(dp, EV_HPD_PLUG_INT, 0, 3); in dp_display_irq_handler()
1182 dp_add_event(dp, EV_HPD_UNPLUG_INT, 0, 0); in dp_display_irq_handler()
1187 /* DP controller isr */ in dp_display_irq_handler()
1188 ret |= dp_ctrl_isr(dp->ctrl); in dp_display_irq_handler()
1190 /* DP aux isr */ in dp_display_irq_handler()
1191 ret |= dp_aux_isr(dp->aux); in dp_display_irq_handler()
1199 struct dp_display_private *dp; in dp_display_request_irq() local
1206 dp = container_of(dp_display, struct dp_display_private, dp_display); in dp_display_request_irq()
1208 dp->irq = irq_of_parse_and_map(dp->pdev->dev.of_node, 0); in dp_display_request_irq()
1209 if (!dp->irq) { in dp_display_request_irq()
1214 rc = devm_request_irq(dp_display->drm_dev->dev, dp->irq, in dp_display_request_irq()
1216 IRQF_TRIGGER_HIGH, "dp_display_isr", dp); in dp_display_request_irq()
1219 dp->irq, rc); in dp_display_request_irq()
1248 struct dp_display_private *dp; in dp_display_probe() local
1256 dp = devm_kzalloc(&pdev->dev, sizeof(*dp), GFP_KERNEL); in dp_display_probe()
1257 if (!dp) in dp_display_probe()
1264 dp->pdev = pdev; in dp_display_probe()
1265 dp->name = "drm_dp"; in dp_display_probe()
1266 dp->id = desc->id; in dp_display_probe()
1267 dp->dp_display.connector_type = desc->connector_type; in dp_display_probe()
1268 dp->wide_bus_en = desc->wide_bus_en; in dp_display_probe()
1269 dp->dp_display.is_edp = in dp_display_probe()
1270 (dp->dp_display.connector_type == DRM_MODE_CONNECTOR_eDP); in dp_display_probe()
1272 rc = dp_init_sub_modules(dp); in dp_display_probe()
1279 mutex_init(&dp->event_mutex); in dp_display_probe()
1280 init_waitqueue_head(&dp->event_q); in dp_display_probe()
1281 spin_lock_init(&dp->event_lock); in dp_display_probe()
1283 /* Store DP audio handle inside DP display */ in dp_display_probe()
1284 dp->dp_display.dp_audio = dp->audio; in dp_display_probe()
1286 init_completion(&dp->audio_comp); in dp_display_probe()
1288 platform_set_drvdata(pdev, &dp->dp_display); in dp_display_probe()
1293 dp_display_deinit_sub_modules(dp); in dp_display_probe()
1301 struct dp_display_private *dp = dev_get_dp_display_private(&pdev->dev); in dp_display_remove() local
1304 dp_display_deinit_sub_modules(dp); in dp_display_remove()
1315 struct dp_display_private *dp; in dp_pm_resume() local
1318 dp = container_of(dp_display, struct dp_display_private, dp_display); in dp_pm_resume()
1320 mutex_lock(&dp->event_mutex); in dp_pm_resume()
1322 drm_dbg_dp(dp->drm_dev, in dp_pm_resume()
1324 dp->dp_display.connector_type, dp->core_initialized, in dp_pm_resume()
1325 dp->phy_initialized, dp_display->power_on); in dp_pm_resume()
1328 dp->hpd_state = ST_DISCONNECTED; in dp_pm_resume()
1330 /* turn on dp ctrl/phy */ in dp_pm_resume()
1331 dp_display_host_init(dp); in dp_pm_resume()
1334 dp_catalog_ctrl_hpd_enable(dp->catalog); in dp_pm_resume()
1336 if (dp_catalog_link_is_connected(dp->catalog)) { in dp_pm_resume()
1341 dp_display_host_phy_init(dp); in dp_pm_resume()
1342 dp_link_psm_config(dp->link, &dp->panel->link_info, false); in dp_pm_resume()
1343 sink_count = drm_dp_read_sink_count(dp->aux); in dp_pm_resume()
1347 dp_display_host_phy_exit(dp); in dp_pm_resume()
1350 dp->link->sink_count = sink_count; in dp_pm_resume()
1357 if (dp->link->sink_count) { in dp_pm_resume()
1358 dp->dp_display.is_connected = true; in dp_pm_resume()
1360 dp->dp_display.is_connected = false; in dp_pm_resume()
1364 drm_dbg_dp(dp->drm_dev, in dp_pm_resume()
1366 dp->dp_display.connector_type, dp->link->sink_count, in dp_pm_resume()
1367 dp->dp_display.is_connected, dp->core_initialized, in dp_pm_resume()
1368 dp->phy_initialized, dp_display->power_on); in dp_pm_resume()
1370 mutex_unlock(&dp->event_mutex); in dp_pm_resume()
1379 struct dp_display_private *dp; in dp_pm_suspend() local
1381 dp = container_of(dp_display, struct dp_display_private, dp_display); in dp_pm_suspend()
1383 mutex_lock(&dp->event_mutex); in dp_pm_suspend()
1385 drm_dbg_dp(dp->drm_dev, in dp_pm_suspend()
1387 dp->dp_display.connector_type, dp->core_initialized, in dp_pm_suspend()
1388 dp->phy_initialized, dp_display->power_on); in dp_pm_suspend()
1391 if (dp_power_clk_status(dp->power, DP_CTRL_PM)) in dp_pm_suspend()
1392 dp_ctrl_off_link_stream(dp->ctrl); in dp_pm_suspend()
1394 dp_display_host_phy_exit(dp); in dp_pm_suspend()
1397 dp_display_host_deinit(dp); in dp_pm_suspend()
1399 dp->hpd_state = ST_SUSPENDED; in dp_pm_suspend()
1401 drm_dbg_dp(dp->drm_dev, in dp_pm_suspend()
1403 dp->dp_display.connector_type, dp->core_initialized, in dp_pm_suspend()
1404 dp->phy_initialized, dp_display->power_on); in dp_pm_suspend()
1406 mutex_unlock(&dp->event_mutex); in dp_pm_suspend()
1420 .name = "msm-dp-display",
1433 DRM_ERROR("Dp display driver register failed"); in msm_dp_register()
1445 struct dp_display_private *dp; in msm_dp_irq_postinstall() local
1450 dp = container_of(dp_display, struct dp_display_private, dp_display); in msm_dp_irq_postinstall()
1453 dp_add_event(dp, EV_HPD_INIT_SETUP, 0, 0); in msm_dp_irq_postinstall()
1458 struct dp_display_private *dp; in msm_dp_wide_bus_available() local
1460 dp = container_of(dp_display, struct dp_display_private, dp_display); in msm_dp_wide_bus_available()
1462 return dp->wide_bus_en; in msm_dp_wide_bus_available()
1467 struct dp_display_private *dp; in msm_dp_debugfs_init() local
1471 dp = container_of(dp_display, struct dp_display_private, dp_display); in msm_dp_debugfs_init()
1472 dev = &dp->pdev->dev; in msm_dp_debugfs_init()
1474 dp->debug = dp_debug_get(dev, dp->panel, in msm_dp_debugfs_init()
1475 dp->link, dp->dp_display.connector, in msm_dp_debugfs_init()
1477 if (IS_ERR(dp->debug)) { in msm_dp_debugfs_init()
1478 rc = PTR_ERR(dp->debug); in msm_dp_debugfs_init()
1480 dp->debug = NULL; in msm_dp_debugfs_init()
1484 static int dp_display_get_next_bridge(struct msm_dp *dp) in dp_display_get_next_bridge() argument
1491 dp_priv = container_of(dp, struct dp_display_private, dp_display); in dp_display_get_next_bridge()
1495 if (aux_bus && dp->is_edp) { in dp_display_get_next_bridge()
1511 } else if (dp->is_edp) { in dp_display_get_next_bridge()
1523 rc = devm_dp_parser_find_next_bridge(dp->drm_dev->dev, dp_priv->parser); in dp_display_get_next_bridge()
1524 if (!dp->is_edp && rc == -ENODEV) in dp_display_get_next_bridge()
1528 dp->next_bridge = dp_priv->parser->next_bridge; in dp_display_get_next_bridge()
1533 if (dp->is_edp) { in dp_display_get_next_bridge()
1566 "failed to create dp bridge: %d\n", ret); in msm_dp_modeset_init()
1577 "failed to create dp connector: %d\n", ret); in msm_dp_modeset_init()
1591 struct msm_dp *dp = dp_bridge->dp_display; in dp_bridge_atomic_enable() local
1597 dp_display = container_of(dp, struct dp_display_private, dp_display); in dp_bridge_atomic_enable()
1603 if (dp->is_edp) in dp_bridge_atomic_enable()
1614 rc = dp_display_set_mode(dp, &dp_display->dp_mode); in dp_bridge_atomic_enable()
1630 rc = dp_display_post_enable(dp); in dp_bridge_atomic_enable()
1632 DRM_ERROR("DP display post enable failed, rc=%d\n", rc); in dp_bridge_atomic_enable()
1639 drm_dbg_dp(dp->drm_dev, "type=%d Done\n", dp->connector_type); in dp_bridge_atomic_enable()
1647 struct msm_dp *dp = dp_bridge->dp_display; in dp_bridge_atomic_disable() local
1650 dp_display = container_of(dp, struct dp_display_private, dp_display); in dp_bridge_atomic_disable()
1659 struct msm_dp *dp = dp_bridge->dp_display; in dp_bridge_atomic_post_disable() local
1663 dp_display = container_of(dp, struct dp_display_private, dp_display); in dp_bridge_atomic_post_disable()
1665 if (dp->is_edp) in dp_bridge_atomic_post_disable()
1686 drm_dbg_dp(dp->drm_dev, "type=%d Done\n", dp->connector_type); in dp_bridge_atomic_post_disable()
1695 struct msm_dp *dp = dp_bridge->dp_display; in dp_bridge_mode_set() local
1698 dp_display = container_of(dp, struct dp_display_private, dp_display); in dp_bridge_mode_set()
1702 if (dp_display_check_video_test(dp)) in dp_bridge_mode_set()
1703 dp_display->dp_mode.bpp = dp_display_get_test_bpp(dp); in dp_bridge_mode_set()
1705 dp_display->dp_mode.bpp = dp->connector->display_info.bpc * 3; in dp_bridge_mode_set()
1723 struct dp_display_private *dp = container_of(dp_display, struct dp_display_private, dp_display); in dp_bridge_hpd_enable() local
1725 mutex_lock(&dp->event_mutex); in dp_bridge_hpd_enable()
1726 dp_catalog_ctrl_hpd_enable(dp->catalog); in dp_bridge_hpd_enable()
1729 dp_catalog_hpd_config_intr(dp->catalog, DP_DP_HPD_INT_MASK, true); in dp_bridge_hpd_enable()
1732 mutex_unlock(&dp->event_mutex); in dp_bridge_hpd_enable()
1739 struct dp_display_private *dp = container_of(dp_display, struct dp_display_private, dp_display); in dp_bridge_hpd_disable() local
1741 mutex_lock(&dp->event_mutex); in dp_bridge_hpd_disable()
1743 dp_catalog_hpd_config_intr(dp->catalog, DP_DP_HPD_INT_MASK, false); in dp_bridge_hpd_disable()
1744 dp_catalog_ctrl_hpd_disable(dp->catalog); in dp_bridge_hpd_disable()
1747 mutex_unlock(&dp->event_mutex); in dp_bridge_hpd_disable()
1755 struct dp_display_private *dp = container_of(dp_display, struct dp_display_private, dp_display); in dp_bridge_hpd_notify() local
1757 /* Without next_bridge interrupts are handled by the DP core directly */ in dp_bridge_hpd_notify()
1761 if (!dp->core_initialized) { in dp_bridge_hpd_notify()
1762 drm_dbg_dp(dp->drm_dev, "not initialized\n"); in dp_bridge_hpd_notify()
1767 dp_add_event(dp, EV_HPD_PLUG_INT, 0, 0); in dp_bridge_hpd_notify()
1769 dp_add_event(dp, EV_HPD_UNPLUG_INT, 0, 0); in dp_bridge_hpd_notify()