Lines Matching refs:dp

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 },
184 { .compatible = "qcom,sm8650-dp", .data = &sm8650_dp_descs },
190 struct msm_dp *dp = dev_get_drvdata(dev);
192 return container_of(dp, struct dp_display_private, dp_display);
251 struct dp_display_private *dp;
253 dp = container_of(dp_display, struct dp_display_private, dp_display);
255 reinit_completion(&dp->audio_comp);
260 struct dp_display_private *dp;
262 dp = container_of(dp_display, struct dp_display_private, dp_display);
264 complete_all(&dp->audio_comp);
273 struct dp_display_private *dp = dev_get_dp_display_private(dev);
277 dp->dp_display.drm_dev = drm;
278 priv->dp[dp->id] = &dp->dp_display;
282 dp->drm_dev = drm;
283 dp->aux->drm_dev = drm;
284 rc = dp_aux_register(dp->aux);
291 rc = dp_register_audio_driver(dev, dp->audio);
297 rc = dp_hpd_event_thread_start(dp);
311 struct dp_display_private *dp = dev_get_dp_display_private(dev);
314 kthread_stop(dp->ev_tsk);
316 of_dp_aux_depopulate_bus(dp->aux);
318 dp_unregister_audio_driver(dev, dp->audio);
319 dp_aux_unregister(dp->aux);
320 dp->drm_dev = NULL;
321 dp->aux->drm_dev = NULL;
322 priv->dp[dp->id] = NULL;
332 struct dp_display_private *dp;
335 dp = container_of(dp_display, struct dp_display_private, dp_display);
337 connector = dp->dp_display.connector;
341 static int dp_display_send_hpd_notification(struct dp_display_private *dp,
344 if ((hpd && dp->dp_display.link_ready) ||
345 (!hpd && !dp->dp_display.link_ready)) {
346 drm_dbg_dp(dp->drm_dev, "HPD already %s\n",
353 dp->panel->video_test = false;
354 if (!dp->dp_display.is_edp)
355 drm_dp_set_subconnector_property(dp->dp_display.connector,
357 dp->panel->dpcd,
358 dp->panel->downstream_ports);
361 dp->dp_display.link_ready = hpd;
363 drm_dbg_dp(dp->drm_dev, "type=%d hpd=%d\n",
364 dp->dp_display.connector_type, hpd);
365 dp_display_send_hpd_event(&dp->dp_display);
370 static int dp_display_process_hpd_high(struct dp_display_private *dp)
375 rc = dp_panel_read_sink_caps(dp->panel, dp->dp_display.connector);
379 dp_link_process_request(dp->link);
381 if (!dp->dp_display.is_edp)
382 drm_dp_set_subconnector_property(dp->dp_display.connector,
384 dp->panel->dpcd,
385 dp->panel->downstream_ports);
387 edid = dp->panel->edid;
389 dp->dp_display.psr_supported = dp->panel->psr_cap.version && psr_enabled;
391 dp->audio_supported = drm_detect_monitor_audio(edid);
392 dp_panel_handle_sink_request(dp->panel);
398 dp_link_psm_config(dp->link, &dp->panel->link_info, false);
400 dp_link_reset_phy_params_vx_px(dp->link);
401 rc = dp_ctrl_on_link(dp->ctrl);
407 dp_add_event(dp, EV_USER_NOTIFICATION, true, 0);
413 static void dp_display_host_phy_init(struct dp_display_private *dp)
415 drm_dbg_dp(dp->drm_dev, "type=%d core_init=%d phy_init=%d\n",
416 dp->dp_display.connector_type, dp->core_initialized,
417 dp->phy_initialized);
419 if (!dp->phy_initialized) {
420 dp_ctrl_phy_init(dp->ctrl);
421 dp->phy_initialized = true;
425 static void dp_display_host_phy_exit(struct dp_display_private *dp)
427 drm_dbg_dp(dp->drm_dev, "type=%d core_init=%d phy_init=%d\n",
428 dp->dp_display.connector_type, dp->core_initialized,
429 dp->phy_initialized);
431 if (dp->phy_initialized) {
432 dp_ctrl_phy_exit(dp->ctrl);
433 dp->phy_initialized = false;
437 static void dp_display_host_init(struct dp_display_private *dp)
439 drm_dbg_dp(dp->drm_dev, "type=%d core_init=%d phy_init=%d\n",
440 dp->dp_display.connector_type, dp->core_initialized,
441 dp->phy_initialized);
443 dp_ctrl_core_clk_enable(dp->ctrl);
444 dp_ctrl_reset_irq_ctrl(dp->ctrl, true);
445 dp_aux_init(dp->aux);
446 dp->core_initialized = true;
449 static void dp_display_host_deinit(struct dp_display_private *dp)
451 drm_dbg_dp(dp->drm_dev, "type=%d core_init=%d phy_init=%d\n",
452 dp->dp_display.connector_type, dp->core_initialized,
453 dp->phy_initialized);
455 dp_ctrl_reset_irq_ctrl(dp->ctrl, false);
456 dp_aux_deinit(dp->aux);
457 dp_ctrl_core_clk_disable(dp->ctrl);
458 dp->core_initialized = false;
463 struct dp_display_private *dp = dev_get_dp_display_private(dev);
465 dp_display_host_phy_init(dp);
467 return dp_display_process_hpd_high(dp);
472 struct dp_display_private *dp = dev_get_dp_display_private(dev);
474 dp_add_event(dp, EV_USER_NOTIFICATION, false, 0);
479 static void dp_display_handle_video_request(struct dp_display_private *dp)
481 if (dp->link->sink_request & DP_TEST_LINK_VIDEO_PATTERN) {
482 dp->panel->video_test = true;
483 dp_link_send_test_response(dp->link);
487 static int dp_display_handle_port_status_changed(struct dp_display_private *dp)
491 if (drm_dp_is_branch(dp->panel->dpcd) && dp->link->sink_count == 0) {
492 drm_dbg_dp(dp->drm_dev, "sink count is zero, nothing to do\n");
493 if (dp->hpd_state != ST_DISCONNECTED) {
494 dp->hpd_state = ST_DISCONNECT_PENDING;
495 dp_add_event(dp, EV_USER_NOTIFICATION, false, 0);
498 if (dp->hpd_state == ST_DISCONNECTED) {
499 dp->hpd_state = ST_MAINLINK_READY;
500 rc = dp_display_process_hpd_high(dp);
502 dp->hpd_state = ST_DISCONNECTED;
509 static int dp_display_handle_irq_hpd(struct dp_display_private *dp)
511 u32 sink_request = dp->link->sink_request;
513 drm_dbg_dp(dp->drm_dev, "%d\n", sink_request);
514 if (dp->hpd_state == ST_DISCONNECTED) {
516 drm_dbg_dp(dp->drm_dev, "Disconnected sink_request: %d\n",
523 dp_ctrl_handle_sink_request(dp->ctrl);
526 dp_display_handle_video_request(dp);
535 struct dp_display_private *dp = dev_get_dp_display_private(dev);
538 rc = dp_link_process_request(dp->link);
540 sink_request = dp->link->sink_request;
541 drm_dbg_dp(dp->drm_dev, "hpd_state=%d sink_request=%d\n",
542 dp->hpd_state, sink_request);
544 rc = dp_display_handle_port_status_changed(dp);
546 rc = dp_display_handle_irq_hpd(dp);
552 static int dp_hpd_plug_handle(struct dp_display_private *dp, u32 data)
556 struct platform_device *pdev = dp->dp_display.pdev;
558 mutex_lock(&dp->event_mutex);
560 state = dp->hpd_state;
561 drm_dbg_dp(dp->drm_dev, "Before, type=%d hpd_state=%d\n",
562 dp->dp_display.connector_type, state);
565 mutex_unlock(&dp->event_mutex);
570 mutex_unlock(&dp->event_mutex);
576 dp_add_event(dp, EV_HPD_PLUG_INT, 0, 1); /* delay = 1 */
577 mutex_unlock(&dp->event_mutex);
584 mutex_unlock(&dp->event_mutex);
590 dp->hpd_state = ST_DISCONNECTED;
593 dp->hpd_state = ST_MAINLINK_READY;
596 drm_dbg_dp(dp->drm_dev, "After, type=%d hpd_state=%d\n",
597 dp->dp_display.connector_type, state);
598 mutex_unlock(&dp->event_mutex);
607 struct dp_display_private *dp;
609 dp = container_of(dp_display,
614 dp->audio_supported)
618 static int dp_hpd_unplug_handle(struct dp_display_private *dp, u32 data)
621 struct platform_device *pdev = dp->dp_display.pdev;
623 mutex_lock(&dp->event_mutex);
625 state = dp->hpd_state;
627 drm_dbg_dp(dp->drm_dev, "Before, type=%d hpd_state=%d\n",
628 dp->dp_display.connector_type, state);
631 dp_del_event(dp, EV_IRQ_HPD_INT);
635 if (dp->link->sink_count == 0) {
636 dp_display_host_phy_exit(dp);
638 dp_display_notify_disconnect(&dp->dp_display.pdev->dev);
639 mutex_unlock(&dp->event_mutex);
642 mutex_unlock(&dp->event_mutex);
645 dp_ctrl_off_link(dp->ctrl);
646 dp_display_host_phy_exit(dp);
647 dp->hpd_state = ST_DISCONNECTED;
648 dp_display_notify_disconnect(&dp->dp_display.pdev->dev);
650 mutex_unlock(&dp->event_mutex);
658 dp_display_notify_disconnect(&dp->dp_display.pdev->dev);
661 dp->hpd_state = ST_DISCONNECTED;
663 dp->hpd_state = ST_DISCONNECT_PENDING;
667 dp_display_handle_plugged_change(&dp->dp_display, false);
669 drm_dbg_dp(dp->drm_dev, "After, type=%d hpd_state=%d\n",
670 dp->dp_display.connector_type, state);
674 mutex_unlock(&dp->event_mutex);
678 static int dp_irq_hpd_handle(struct dp_display_private *dp, u32 data)
682 mutex_lock(&dp->event_mutex);
685 state = dp->hpd_state;
686 drm_dbg_dp(dp->drm_dev, "Before, type=%d hpd_state=%d\n",
687 dp->dp_display.connector_type, state);
690 mutex_unlock(&dp->event_mutex);
696 dp_add_event(dp, EV_IRQ_HPD_INT, 0, 1); /* delay = 1 */
697 mutex_unlock(&dp->event_mutex);
701 dp_display_usbpd_attention_cb(&dp->dp_display.pdev->dev);
703 drm_dbg_dp(dp->drm_dev, "After, type=%d hpd_state=%d\n",
704 dp->dp_display.connector_type, state);
706 mutex_unlock(&dp->event_mutex);
711 static void dp_display_deinit_sub_modules(struct dp_display_private *dp)
713 dp_audio_put(dp->audio);
714 dp_panel_put(dp->panel);
715 dp_aux_put(dp->aux);
718 static int dp_init_sub_modules(struct dp_display_private *dp)
721 struct device *dev = &dp->dp_display.pdev->dev;
727 phy = devm_phy_get(dev, "dp");
731 dp->catalog = dp_catalog_get(dev);
732 if (IS_ERR(dp->catalog)) {
733 rc = PTR_ERR(dp->catalog);
735 dp->catalog = NULL;
739 dp->aux = dp_aux_get(dev, dp->catalog,
741 dp->dp_display.is_edp);
742 if (IS_ERR(dp->aux)) {
743 rc = PTR_ERR(dp->aux);
745 dp->aux = NULL;
749 dp->link = dp_link_get(dev, dp->aux);
750 if (IS_ERR(dp->link)) {
751 rc = PTR_ERR(dp->link);
753 dp->link = NULL;
757 panel_in.aux = dp->aux;
758 panel_in.catalog = dp->catalog;
759 panel_in.link = dp->link;
761 dp->panel = dp_panel_get(&panel_in);
762 if (IS_ERR(dp->panel)) {
763 rc = PTR_ERR(dp->panel);
765 dp->panel = NULL;
769 dp->ctrl = dp_ctrl_get(dev, dp->link, dp->panel, dp->aux,
770 dp->catalog,
772 if (IS_ERR(dp->ctrl)) {
773 rc = PTR_ERR(dp->ctrl);
775 dp->ctrl = NULL;
779 dp->audio = dp_audio_get(dp->dp_display.pdev, dp->panel, dp->catalog);
780 if (IS_ERR(dp->audio)) {
781 rc = PTR_ERR(dp->audio);
783 dp->audio = NULL;
790 dp_panel_put(dp->panel);
792 dp_aux_put(dp->aux);
800 struct dp_display_private *dp;
802 dp = container_of(dp_display, struct dp_display_private, dp_display);
804 drm_mode_copy(&dp->panel->dp_mode.drm_mode, &mode->drm_mode);
805 dp->panel->dp_mode.bpp = mode->bpp;
806 dp->panel->dp_mode.capabilities = mode->capabilities;
807 dp->panel->dp_mode.out_fmt_is_yuv_420 = mode->out_fmt_is_yuv_420;
808 dp_panel_init_panel_info(dp->panel);
812 static int dp_display_enable(struct dp_display_private *dp, bool force_link_train)
815 struct msm_dp *dp_display = &dp->dp_display;
817 drm_dbg_dp(dp->drm_dev, "sink_count=%d\n", dp->link->sink_count);
819 drm_dbg_dp(dp->drm_dev, "Link already setup, return\n");
823 rc = dp_ctrl_on_stream(dp->ctrl, force_link_train);
832 struct dp_display_private *dp;
835 dp = container_of(dp_display, struct dp_display_private, dp_display);
837 rate = dp->link->link_params.rate;
839 if (dp->audio_supported) {
840 dp->audio->bw_code = drm_dp_link_rate_to_bw_code(rate);
841 dp->audio->lane_count = dp->link->link_params.num_lanes;
848 dp_ctrl_config_psr(dp->ctrl);
853 static int dp_display_disable(struct dp_display_private *dp)
855 struct msm_dp *dp_display = &dp->dp_display;
864 if (!wait_for_completion_timeout(&dp->audio_comp,
871 if (dp->link->sink_count == 0) {
876 dp_ctrl_off_link_stream(dp->ctrl);
882 dp_ctrl_off(dp->ctrl);
883 dp_display_host_phy_exit(dp);
888 drm_dbg_dp(dp->drm_dev, "sink count: %d\n", dp->link->sink_count);
920 struct msm_dp *dp;
923 dp = to_dp_bridge(bridge)->dp_display;
925 if (!dp || !mode_pclk_khz || !dp->connector) {
933 dp_display = container_of(dp, struct dp_display_private, dp_display);
936 if (drm_mode_is_420_only(&dp->connector->display_info, mode) &&
940 mode_bpp = dp->connector->display_info.bpc * num_components;
956 int dp_display_get_modes(struct msm_dp *dp)
960 if (!dp) {
965 dp_display = container_of(dp, struct dp_display_private, dp_display);
968 dp->connector);
971 bool dp_display_check_video_test(struct msm_dp *dp)
975 dp_display = container_of(dp, struct dp_display_private, dp_display);
980 int dp_display_get_test_bpp(struct msm_dp *dp)
984 if (!dp) {
989 dp_display = container_of(dp, struct dp_display_private, dp_display);
995 void msm_dp_snapshot(struct msm_disp_state *disp_state, struct msm_dp *dp)
999 dp_display = container_of(dp, struct dp_display_private, dp_display);
1010 if (!dp->power_on) {
1022 struct dp_display_private *dp;
1029 dp = container_of(dp_display, struct dp_display_private, dp_display);
1030 dp_ctrl_set_psr(dp->ctrl, enter);
1129 struct dp_display_private *dp = dev_id;
1133 if (!dp) {
1138 hpd_isr_status = dp_catalog_hpd_get_intr_status(dp->catalog);
1141 drm_dbg_dp(dp->drm_dev, "type=%d isr=0x%x\n",
1142 dp->dp_display.connector_type, hpd_isr_status);
1145 dp_add_event(dp, EV_HPD_PLUG_INT, 0, 0);
1148 dp_add_event(dp, EV_IRQ_HPD_INT, 0, 0);
1152 dp_add_event(dp, EV_HPD_UNPLUG_INT, 0, 0);
1153 dp_add_event(dp, EV_HPD_PLUG_INT, 0, 3);
1157 dp_add_event(dp, EV_HPD_UNPLUG_INT, 0, 0);
1163 ret |= dp_ctrl_isr(dp->ctrl);
1166 ret |= dp_aux_isr(dp->aux);
1171 static int dp_display_request_irq(struct dp_display_private *dp)
1174 struct platform_device *pdev = dp->dp_display.pdev;
1176 dp->irq = platform_get_irq(pdev, 0);
1177 if (dp->irq < 0) {
1179 return dp->irq;
1182 rc = devm_request_irq(&pdev->dev, dp->irq, dp_display_irq_handler,
1184 "dp_display_isr", dp);
1188 dp->irq, rc);
1216 struct msm_dp *dp = dev_get_drvdata(dev);
1226 dp->next_bridge = devm_drm_of_get_bridge(&dp->pdev->dev, dp->pdev->dev.of_node, 1, 0);
1227 if (IS_ERR(dp->next_bridge)) {
1228 ret = PTR_ERR(dp->next_bridge);
1229 dp->next_bridge = NULL;
1230 if (dp->is_edp || ret != -ENODEV)
1249 struct dp_display_private *dp;
1257 dp = devm_kzalloc(&pdev->dev, sizeof(*dp), GFP_KERNEL);
1258 if (!dp)
1265 dp->dp_display.pdev = pdev;
1266 dp->name = "drm_dp";
1267 dp->id = desc->id;
1268 dp->dp_display.connector_type = desc->connector_type;
1269 dp->wide_bus_supported = desc->wide_bus_supported;
1270 dp->dp_display.is_edp =
1271 (dp->dp_display.connector_type == DRM_MODE_CONNECTOR_eDP);
1273 rc = dp_init_sub_modules(dp);
1280 mutex_init(&dp->event_mutex);
1281 init_waitqueue_head(&dp->event_q);
1282 spin_lock_init(&dp->event_lock);
1285 dp->dp_display.dp_audio = dp->audio;
1287 init_completion(&dp->audio_comp);
1289 platform_set_drvdata(pdev, &dp->dp_display);
1295 rc = dp_display_request_irq(dp);
1299 if (dp->dp_display.is_edp) {
1300 rc = devm_of_dp_aux_populate_bus(dp->aux, dp_auxbus_done_probe);
1314 dp_display_deinit_sub_modules(dp);
1320 struct dp_display_private *dp = dev_get_dp_display_private(&pdev->dev);
1323 dp_display_deinit_sub_modules(dp);
1329 struct dp_display_private *dp = dev_get_dp_display_private(dev);
1331 disable_irq(dp->irq);
1333 if (dp->dp_display.is_edp) {
1334 dp_display_host_phy_exit(dp);
1335 dp_catalog_ctrl_hpd_disable(dp->catalog);
1337 dp_display_host_deinit(dp);
1344 struct dp_display_private *dp = dev_get_dp_display_private(dev);
1354 dp_display_host_init(dp);
1355 if (dp->dp_display.is_edp) {
1356 dp_catalog_ctrl_hpd_enable(dp->catalog);
1357 dp_display_host_phy_init(dp);
1360 enable_irq(dp->irq);
1374 .name = "msm-dp-display",
1400 struct dp_display_private *dp;
1403 dp = container_of(dp_display, struct dp_display_private, dp_display);
1406 return dp->panel->vsc_sdp_supported && drm_mode_is_420_only(info, mode);
1417 struct dp_display_private *dp;
1419 dp = container_of(dp_display, struct dp_display_private, dp_display);
1421 if (dp->dp_mode.out_fmt_is_yuv_420)
1424 return dp->wide_bus_supported;
1429 struct dp_display_private *dp;
1433 dp = container_of(dp_display, struct dp_display_private, dp_display);
1434 dev = &dp->dp_display.pdev->dev;
1436 dp->debug = dp_debug_get(dev, dp->panel,
1437 dp->link, dp->dp_display.connector,
1439 if (IS_ERR(dp->debug)) {
1440 rc = PTR_ERR(dp->debug);
1442 dp->debug = NULL;
1459 "failed to create dp bridge: %d\n", ret);
1467 "failed to create dp connector: %d\n", ret);
1481 struct msm_dp *dp = dp_bridge->dp_display;
1487 dp_display = container_of(dp, struct dp_display_private, dp_display);
1493 if (dp->is_edp)
1497 if (pm_runtime_resume_and_get(&dp->pdev->dev)) {
1509 rc = dp_display_set_mode(dp, &dp_display->dp_mode);
1525 rc = dp_display_post_enable(dp);
1534 drm_dbg_dp(dp->drm_dev, "type=%d Done\n", dp->connector_type);
1542 struct msm_dp *dp = dp_bridge->dp_display;
1545 dp_display = container_of(dp, struct dp_display_private, dp_display);
1554 struct msm_dp *dp = dp_bridge->dp_display;
1558 dp_display = container_of(dp, struct dp_display_private, dp_display);
1560 if (dp->is_edp)
1567 drm_dbg_dp(dp->drm_dev, "type=%d wrong hpd_state=%d\n",
1568 dp->connector_type, state);
1580 drm_dbg_dp(dp->drm_dev, "type=%d Done\n", dp->connector_type);
1582 pm_runtime_put_sync(&dp->pdev->dev);
1591 struct msm_dp *dp = dp_bridge->dp_display;
1595 dp_display = container_of(dp, struct dp_display_private, dp_display);
1600 if (dp_display_check_video_test(dp))
1601 dp_display->dp_mode.bpp = dp_display_get_test_bpp(dp);
1603 dp_display->dp_mode.bpp = dp->connector->display_info.bpc * 3;
1617 drm_mode_is_420_only(&dp->connector->display_info, adjusted_mode) &&
1631 struct dp_display_private *dp = container_of(dp_display, struct dp_display_private, dp_display);
1635 * step-1: dp_pm_runtime_resume() enable dp host only
1641 mutex_lock(&dp->event_mutex);
1644 mutex_unlock(&dp->event_mutex);
1648 dp_catalog_ctrl_hpd_enable(dp->catalog);
1651 dp_catalog_hpd_config_intr(dp->catalog, DP_DP_HPD_INT_MASK, true);
1654 mutex_unlock(&dp->event_mutex);
1661 struct dp_display_private *dp = container_of(dp_display, struct dp_display_private, dp_display);
1663 mutex_lock(&dp->event_mutex);
1665 dp_catalog_hpd_config_intr(dp->catalog, DP_DP_HPD_INT_MASK, false);
1666 dp_catalog_ctrl_hpd_disable(dp->catalog);
1671 mutex_unlock(&dp->event_mutex);
1679 struct dp_display_private *dp = container_of(dp_display, struct dp_display_private, dp_display);
1686 dp_add_event(dp, EV_HPD_PLUG_INT, 0, 0);
1688 dp_add_event(dp, EV_HPD_UNPLUG_INT, 0, 0);