1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * Copyright (c) 2017-2020, The Linux Foundation. All rights reserved. 4 */ 5 6 #include <linux/module.h> 7 #include <linux/slab.h> 8 #include <linux/uaccess.h> 9 #include <linux/debugfs.h> 10 #include <linux/component.h> 11 #include <linux/of_irq.h> 12 #include <linux/delay.h> 13 14 #include "msm_drv.h" 15 #include "msm_kms.h" 16 #include "dp_hpd.h" 17 #include "dp_parser.h" 18 #include "dp_power.h" 19 #include "dp_catalog.h" 20 #include "dp_aux.h" 21 #include "dp_reg.h" 22 #include "dp_link.h" 23 #include "dp_panel.h" 24 #include "dp_ctrl.h" 25 #include "dp_display.h" 26 #include "dp_drm.h" 27 #include "dp_audio.h" 28 #include "dp_debug.h" 29 30 static struct msm_dp *g_dp_display; 31 #define HPD_STRING_SIZE 30 32 33 enum { 34 ISR_DISCONNECTED, 35 ISR_CONNECT_PENDING, 36 ISR_CONNECTED, 37 ISR_HPD_REPLUG_COUNT, 38 ISR_IRQ_HPD_PULSE_COUNT, 39 ISR_HPD_LO_GLITH_COUNT, 40 }; 41 42 /* event thread connection state */ 43 enum { 44 ST_DISCONNECTED, 45 ST_CONNECT_PENDING, 46 ST_CONNECTED, 47 ST_DISCONNECT_PENDING, 48 ST_DISPLAY_OFF, 49 ST_SUSPENDED, 50 }; 51 52 enum { 53 EV_NO_EVENT, 54 /* hpd events */ 55 EV_HPD_INIT_SETUP, 56 EV_HPD_PLUG_INT, 57 EV_IRQ_HPD_INT, 58 EV_HPD_REPLUG_INT, 59 EV_HPD_UNPLUG_INT, 60 EV_USER_NOTIFICATION, 61 EV_CONNECT_PENDING_TIMEOUT, 62 EV_DISCONNECT_PENDING_TIMEOUT, 63 }; 64 65 #define EVENT_TIMEOUT (HZ/10) /* 100ms */ 66 #define DP_EVENT_Q_MAX 8 67 68 #define DP_TIMEOUT_5_SECOND (5000/EVENT_TIMEOUT) 69 #define DP_TIMEOUT_NONE 0 70 71 #define WAIT_FOR_RESUME_TIMEOUT_JIFFIES (HZ / 2) 72 73 struct dp_event { 74 u32 event_id; 75 u32 data; 76 u32 delay; 77 }; 78 79 struct dp_display_private { 80 char *name; 81 int irq; 82 83 /* state variables */ 84 bool core_initialized; 85 bool hpd_irq_on; 86 bool audio_supported; 87 88 struct platform_device *pdev; 89 struct dentry *root; 90 91 struct dp_usbpd *usbpd; 92 struct dp_parser *parser; 93 struct dp_power *power; 94 struct dp_catalog *catalog; 95 struct drm_dp_aux *aux; 96 struct dp_link *link; 97 struct dp_panel *panel; 98 struct dp_ctrl *ctrl; 99 struct dp_debug *debug; 100 101 struct dp_usbpd_cb usbpd_cb; 102 struct dp_display_mode dp_mode; 103 struct msm_dp dp_display; 104 105 bool encoder_mode_set; 106 107 /* wait for audio signaling */ 108 struct completion audio_comp; 109 110 /* event related only access by event thread */ 111 struct mutex event_mutex; 112 wait_queue_head_t event_q; 113 u32 hpd_state; 114 u32 event_pndx; 115 u32 event_gndx; 116 struct dp_event event_list[DP_EVENT_Q_MAX]; 117 spinlock_t event_lock; 118 119 struct dp_audio *audio; 120 }; 121 122 static const struct of_device_id dp_dt_match[] = { 123 {.compatible = "qcom,sc7180-dp"}, 124 {} 125 }; 126 127 static int dp_add_event(struct dp_display_private *dp_priv, u32 event, 128 u32 data, u32 delay) 129 { 130 unsigned long flag; 131 struct dp_event *todo; 132 int pndx; 133 134 spin_lock_irqsave(&dp_priv->event_lock, flag); 135 pndx = dp_priv->event_pndx + 1; 136 pndx %= DP_EVENT_Q_MAX; 137 if (pndx == dp_priv->event_gndx) { 138 pr_err("event_q is full: pndx=%d gndx=%d\n", 139 dp_priv->event_pndx, dp_priv->event_gndx); 140 spin_unlock_irqrestore(&dp_priv->event_lock, flag); 141 return -EPERM; 142 } 143 todo = &dp_priv->event_list[dp_priv->event_pndx++]; 144 dp_priv->event_pndx %= DP_EVENT_Q_MAX; 145 todo->event_id = event; 146 todo->data = data; 147 todo->delay = delay; 148 wake_up(&dp_priv->event_q); 149 spin_unlock_irqrestore(&dp_priv->event_lock, flag); 150 151 return 0; 152 } 153 154 static int dp_del_event(struct dp_display_private *dp_priv, u32 event) 155 { 156 unsigned long flag; 157 struct dp_event *todo; 158 u32 gndx; 159 160 spin_lock_irqsave(&dp_priv->event_lock, flag); 161 if (dp_priv->event_pndx == dp_priv->event_gndx) { 162 spin_unlock_irqrestore(&dp_priv->event_lock, flag); 163 return -ENOENT; 164 } 165 166 gndx = dp_priv->event_gndx; 167 while (dp_priv->event_pndx != gndx) { 168 todo = &dp_priv->event_list[gndx]; 169 if (todo->event_id == event) { 170 todo->event_id = EV_NO_EVENT; /* deleted */ 171 todo->delay = 0; 172 } 173 gndx++; 174 gndx %= DP_EVENT_Q_MAX; 175 } 176 spin_unlock_irqrestore(&dp_priv->event_lock, flag); 177 178 return 0; 179 } 180 181 void dp_display_signal_audio_complete(struct msm_dp *dp_display) 182 { 183 struct dp_display_private *dp; 184 185 dp = container_of(dp_display, struct dp_display_private, dp_display); 186 187 complete_all(&dp->audio_comp); 188 } 189 190 static int dp_display_bind(struct device *dev, struct device *master, 191 void *data) 192 { 193 int rc = 0; 194 struct dp_display_private *dp; 195 struct drm_device *drm; 196 struct msm_drm_private *priv; 197 198 drm = dev_get_drvdata(master); 199 200 dp = container_of(g_dp_display, 201 struct dp_display_private, dp_display); 202 if (!dp) { 203 DRM_ERROR("DP driver bind failed. Invalid driver data\n"); 204 return -EINVAL; 205 } 206 207 dp->dp_display.drm_dev = drm; 208 priv = drm->dev_private; 209 priv->dp = &(dp->dp_display); 210 211 rc = dp->parser->parse(dp->parser); 212 if (rc) { 213 DRM_ERROR("device tree parsing failed\n"); 214 goto end; 215 } 216 217 rc = dp_aux_register(dp->aux); 218 if (rc) { 219 DRM_ERROR("DRM DP AUX register failed\n"); 220 goto end; 221 } 222 223 rc = dp_power_client_init(dp->power); 224 if (rc) { 225 DRM_ERROR("Power client create failed\n"); 226 goto end; 227 } 228 229 rc = dp_register_audio_driver(dev, dp->audio); 230 if (rc) 231 DRM_ERROR("Audio registration Dp failed\n"); 232 233 end: 234 return rc; 235 } 236 237 static void dp_display_unbind(struct device *dev, struct device *master, 238 void *data) 239 { 240 struct dp_display_private *dp; 241 struct drm_device *drm = dev_get_drvdata(master); 242 struct msm_drm_private *priv = drm->dev_private; 243 244 dp = container_of(g_dp_display, 245 struct dp_display_private, dp_display); 246 if (!dp) { 247 DRM_ERROR("Invalid DP driver data\n"); 248 return; 249 } 250 251 dp_power_client_deinit(dp->power); 252 dp_aux_unregister(dp->aux); 253 priv->dp = NULL; 254 } 255 256 static const struct component_ops dp_display_comp_ops = { 257 .bind = dp_display_bind, 258 .unbind = dp_display_unbind, 259 }; 260 261 static bool dp_display_is_ds_bridge(struct dp_panel *panel) 262 { 263 return (panel->dpcd[DP_DOWNSTREAMPORT_PRESENT] & 264 DP_DWN_STRM_PORT_PRESENT); 265 } 266 267 static bool dp_display_is_sink_count_zero(struct dp_display_private *dp) 268 { 269 return dp_display_is_ds_bridge(dp->panel) && 270 (dp->link->sink_count == 0); 271 } 272 273 static void dp_display_send_hpd_event(struct msm_dp *dp_display) 274 { 275 struct dp_display_private *dp; 276 struct drm_connector *connector; 277 278 dp = container_of(dp_display, struct dp_display_private, dp_display); 279 280 connector = dp->dp_display.connector; 281 drm_helper_hpd_irq_event(connector->dev); 282 } 283 284 285 static void dp_display_set_encoder_mode(struct dp_display_private *dp) 286 { 287 struct msm_drm_private *priv = dp->dp_display.drm_dev->dev_private; 288 struct msm_kms *kms = priv->kms; 289 290 if (!dp->encoder_mode_set && dp->dp_display.encoder && 291 kms->funcs->set_encoder_mode) { 292 kms->funcs->set_encoder_mode(kms, 293 dp->dp_display.encoder, false); 294 295 dp->encoder_mode_set = true; 296 } 297 } 298 299 static int dp_display_send_hpd_notification(struct dp_display_private *dp, 300 bool hpd) 301 { 302 if ((hpd && dp->dp_display.is_connected) || 303 (!hpd && !dp->dp_display.is_connected)) { 304 DRM_DEBUG_DP("HPD already %s\n", (hpd ? "on" : "off")); 305 return 0; 306 } 307 308 /* reset video pattern flag on disconnect */ 309 if (!hpd) 310 dp->panel->video_test = false; 311 312 dp->dp_display.is_connected = hpd; 313 314 dp_display_send_hpd_event(&dp->dp_display); 315 316 return 0; 317 } 318 319 static int dp_display_process_hpd_high(struct dp_display_private *dp) 320 { 321 int rc = 0; 322 struct edid *edid; 323 324 dp->panel->max_dp_lanes = dp->parser->max_dp_lanes; 325 326 rc = dp_panel_read_sink_caps(dp->panel, dp->dp_display.connector); 327 if (rc) 328 goto end; 329 330 dp_link_process_request(dp->link); 331 332 edid = dp->panel->edid; 333 334 dp->audio_supported = drm_detect_monitor_audio(edid); 335 dp_panel_handle_sink_request(dp->panel); 336 337 dp->dp_display.max_pclk_khz = DP_MAX_PIXEL_CLK_KHZ; 338 dp->dp_display.max_dp_lanes = dp->parser->max_dp_lanes; 339 340 dp_link_reset_phy_params_vx_px(dp->link); 341 rc = dp_ctrl_on_link(dp->ctrl); 342 if (rc) { 343 DRM_ERROR("failed to complete DP link training\n"); 344 goto end; 345 } 346 347 dp_add_event(dp, EV_USER_NOTIFICATION, true, 0); 348 349 end: 350 return rc; 351 } 352 353 static void dp_display_host_init(struct dp_display_private *dp, int reset) 354 { 355 bool flip = false; 356 357 if (dp->core_initialized) { 358 DRM_DEBUG_DP("DP core already initialized\n"); 359 return; 360 } 361 362 if (dp->usbpd->orientation == ORIENTATION_CC2) 363 flip = true; 364 365 dp_display_set_encoder_mode(dp); 366 367 dp_power_init(dp->power, flip); 368 dp_ctrl_host_init(dp->ctrl, flip, reset); 369 dp_aux_init(dp->aux); 370 dp->core_initialized = true; 371 } 372 373 static void dp_display_host_deinit(struct dp_display_private *dp) 374 { 375 if (!dp->core_initialized) { 376 DRM_DEBUG_DP("DP core not initialized\n"); 377 return; 378 } 379 380 dp_ctrl_host_deinit(dp->ctrl); 381 dp_aux_deinit(dp->aux); 382 dp_power_deinit(dp->power); 383 384 dp->core_initialized = false; 385 } 386 387 static int dp_display_usbpd_configure_cb(struct device *dev) 388 { 389 int rc = 0; 390 struct dp_display_private *dp; 391 392 if (!dev) { 393 DRM_ERROR("invalid dev\n"); 394 rc = -EINVAL; 395 goto end; 396 } 397 398 dp = container_of(g_dp_display, 399 struct dp_display_private, dp_display); 400 if (!dp) { 401 DRM_ERROR("no driver data found\n"); 402 rc = -ENODEV; 403 goto end; 404 } 405 406 dp_display_host_init(dp, false); 407 408 /* 409 * set sink to normal operation mode -- D0 410 * before dpcd read 411 */ 412 dp_link_psm_config(dp->link, &dp->panel->link_info, false); 413 rc = dp_display_process_hpd_high(dp); 414 end: 415 return rc; 416 } 417 418 static int dp_display_usbpd_disconnect_cb(struct device *dev) 419 { 420 int rc = 0; 421 struct dp_display_private *dp; 422 423 if (!dev) { 424 DRM_ERROR("invalid dev\n"); 425 rc = -EINVAL; 426 return rc; 427 } 428 429 dp = container_of(g_dp_display, 430 struct dp_display_private, dp_display); 431 if (!dp) { 432 DRM_ERROR("no driver data found\n"); 433 rc = -ENODEV; 434 return rc; 435 } 436 437 dp_add_event(dp, EV_USER_NOTIFICATION, false, 0); 438 439 return rc; 440 } 441 442 static void dp_display_handle_video_request(struct dp_display_private *dp) 443 { 444 if (dp->link->sink_request & DP_TEST_LINK_VIDEO_PATTERN) { 445 dp->panel->video_test = true; 446 dp_link_send_test_response(dp->link); 447 } 448 } 449 450 static int dp_display_handle_port_ststus_changed(struct dp_display_private *dp) 451 { 452 int rc = 0; 453 454 if (dp_display_is_sink_count_zero(dp)) { 455 DRM_DEBUG_DP("sink count is zero, nothing to do\n"); 456 if (dp->hpd_state != ST_DISCONNECTED) { 457 dp->hpd_state = ST_DISCONNECT_PENDING; 458 dp_add_event(dp, EV_USER_NOTIFICATION, false, 0); 459 } 460 } else { 461 if (dp->hpd_state == ST_DISCONNECTED) { 462 dp->hpd_state = ST_CONNECT_PENDING; 463 rc = dp_display_process_hpd_high(dp); 464 if (rc) 465 dp->hpd_state = ST_DISCONNECTED; 466 } 467 } 468 469 return rc; 470 } 471 472 static int dp_display_handle_irq_hpd(struct dp_display_private *dp) 473 { 474 u32 sink_request = dp->link->sink_request; 475 476 if (dp->hpd_state == ST_DISCONNECTED) { 477 if (sink_request & DP_LINK_STATUS_UPDATED) { 478 DRM_ERROR("Disconnected, no DP_LINK_STATUS_UPDATED\n"); 479 return -EINVAL; 480 } 481 } 482 483 dp_ctrl_handle_sink_request(dp->ctrl); 484 485 if (sink_request & DP_TEST_LINK_VIDEO_PATTERN) 486 dp_display_handle_video_request(dp); 487 488 return 0; 489 } 490 491 static int dp_display_usbpd_attention_cb(struct device *dev) 492 { 493 int rc = 0; 494 u32 sink_request; 495 struct dp_display_private *dp; 496 struct dp_usbpd *hpd; 497 498 if (!dev) { 499 DRM_ERROR("invalid dev\n"); 500 return -EINVAL; 501 } 502 503 dp = container_of(g_dp_display, 504 struct dp_display_private, dp_display); 505 if (!dp) { 506 DRM_ERROR("no driver data found\n"); 507 return -ENODEV; 508 } 509 510 hpd = dp->usbpd; 511 512 /* check for any test request issued by sink */ 513 rc = dp_link_process_request(dp->link); 514 if (!rc) { 515 sink_request = dp->link->sink_request; 516 if (sink_request & DS_PORT_STATUS_CHANGED) 517 rc = dp_display_handle_port_ststus_changed(dp); 518 else 519 rc = dp_display_handle_irq_hpd(dp); 520 } 521 522 return rc; 523 } 524 525 static int dp_hpd_plug_handle(struct dp_display_private *dp, u32 data) 526 { 527 struct dp_usbpd *hpd = dp->usbpd; 528 u32 state; 529 u32 tout = DP_TIMEOUT_5_SECOND; 530 int ret; 531 532 if (!hpd) 533 return 0; 534 535 mutex_lock(&dp->event_mutex); 536 537 state = dp->hpd_state; 538 if (state == ST_DISPLAY_OFF || state == ST_SUSPENDED) { 539 mutex_unlock(&dp->event_mutex); 540 return 0; 541 } 542 543 if (state == ST_CONNECT_PENDING || state == ST_CONNECTED) { 544 mutex_unlock(&dp->event_mutex); 545 return 0; 546 } 547 548 if (state == ST_DISCONNECT_PENDING) { 549 /* wait until ST_DISCONNECTED */ 550 dp_add_event(dp, EV_HPD_PLUG_INT, 0, 1); /* delay = 1 */ 551 mutex_unlock(&dp->event_mutex); 552 return 0; 553 } 554 555 dp->hpd_state = ST_CONNECT_PENDING; 556 557 hpd->hpd_high = 1; 558 559 ret = dp_display_usbpd_configure_cb(&dp->pdev->dev); 560 if (ret) { /* link train failed */ 561 hpd->hpd_high = 0; 562 dp->hpd_state = ST_DISCONNECTED; 563 564 if (ret == -ECONNRESET) { /* cable unplugged */ 565 dp->core_initialized = false; 566 } 567 568 } else { 569 /* start sentinel checking in case of missing uevent */ 570 dp_add_event(dp, EV_CONNECT_PENDING_TIMEOUT, 0, tout); 571 } 572 573 mutex_unlock(&dp->event_mutex); 574 575 /* uevent will complete connection part */ 576 return 0; 577 }; 578 579 static int dp_display_enable(struct dp_display_private *dp, u32 data); 580 static int dp_display_disable(struct dp_display_private *dp, u32 data); 581 582 static int dp_connect_pending_timeout(struct dp_display_private *dp, u32 data) 583 { 584 u32 state; 585 586 mutex_lock(&dp->event_mutex); 587 588 state = dp->hpd_state; 589 if (state == ST_CONNECT_PENDING) { 590 dp_display_enable(dp, 0); 591 dp->hpd_state = ST_CONNECTED; 592 } 593 594 mutex_unlock(&dp->event_mutex); 595 596 return 0; 597 } 598 599 static void dp_display_handle_plugged_change(struct msm_dp *dp_display, 600 bool plugged) 601 { 602 struct dp_display_private *dp; 603 604 dp = container_of(dp_display, 605 struct dp_display_private, dp_display); 606 607 /* notify audio subsystem only if sink supports audio */ 608 if (dp_display->plugged_cb && dp_display->codec_dev && 609 dp->audio_supported) 610 dp_display->plugged_cb(dp_display->codec_dev, plugged); 611 } 612 613 static int dp_hpd_unplug_handle(struct dp_display_private *dp, u32 data) 614 { 615 struct dp_usbpd *hpd = dp->usbpd; 616 u32 state; 617 618 if (!hpd) 619 return 0; 620 621 mutex_lock(&dp->event_mutex); 622 623 state = dp->hpd_state; 624 if (state == ST_DISCONNECT_PENDING || state == ST_DISCONNECTED) { 625 mutex_unlock(&dp->event_mutex); 626 return 0; 627 } 628 629 if (state == ST_CONNECT_PENDING) { 630 /* wait until CONNECTED */ 631 dp_add_event(dp, EV_HPD_UNPLUG_INT, 0, 1); /* delay = 1 */ 632 mutex_unlock(&dp->event_mutex); 633 return 0; 634 } 635 636 dp->hpd_state = ST_DISCONNECT_PENDING; 637 638 /* disable HPD plug interrupt until disconnect is done */ 639 dp_catalog_hpd_config_intr(dp->catalog, DP_DP_HPD_PLUG_INT_MASK 640 | DP_DP_IRQ_HPD_INT_MASK, false); 641 642 hpd->hpd_high = 0; 643 644 /* 645 * We don't need separate work for disconnect as 646 * connect/attention interrupts are disabled 647 */ 648 dp_display_usbpd_disconnect_cb(&dp->pdev->dev); 649 650 /* start sentinel checking in case of missing uevent */ 651 dp_add_event(dp, EV_DISCONNECT_PENDING_TIMEOUT, 0, DP_TIMEOUT_5_SECOND); 652 653 /* signal the disconnect event early to ensure proper teardown */ 654 reinit_completion(&dp->audio_comp); 655 dp_display_handle_plugged_change(g_dp_display, false); 656 657 dp_catalog_hpd_config_intr(dp->catalog, DP_DP_HPD_PLUG_INT_MASK | 658 DP_DP_IRQ_HPD_INT_MASK, true); 659 660 /* uevent will complete disconnection part */ 661 mutex_unlock(&dp->event_mutex); 662 return 0; 663 } 664 665 static int dp_disconnect_pending_timeout(struct dp_display_private *dp, u32 data) 666 { 667 u32 state; 668 669 mutex_lock(&dp->event_mutex); 670 671 state = dp->hpd_state; 672 if (state == ST_DISCONNECT_PENDING) { 673 dp_display_disable(dp, 0); 674 dp->hpd_state = ST_DISCONNECTED; 675 } 676 677 mutex_unlock(&dp->event_mutex); 678 679 return 0; 680 } 681 682 static int dp_irq_hpd_handle(struct dp_display_private *dp, u32 data) 683 { 684 u32 state; 685 int ret; 686 687 mutex_lock(&dp->event_mutex); 688 689 /* irq_hpd can happen at either connected or disconnected state */ 690 state = dp->hpd_state; 691 if (state == ST_DISPLAY_OFF) { 692 mutex_unlock(&dp->event_mutex); 693 return 0; 694 } 695 696 if (state == ST_CONNECT_PENDING) { 697 /* wait until ST_CONNECTED */ 698 dp_add_event(dp, EV_IRQ_HPD_INT, 0, 1); /* delay = 1 */ 699 mutex_unlock(&dp->event_mutex); 700 return 0; 701 } 702 703 if (state == ST_CONNECT_PENDING || state == ST_DISCONNECT_PENDING) { 704 /* wait until ST_CONNECTED */ 705 dp_add_event(dp, EV_IRQ_HPD_INT, 0, 1); /* delay = 1 */ 706 mutex_unlock(&dp->event_mutex); 707 return 0; 708 } 709 710 ret = dp_display_usbpd_attention_cb(&dp->pdev->dev); 711 if (ret == -ECONNRESET) { /* cable unplugged */ 712 dp->core_initialized = false; 713 } 714 715 mutex_unlock(&dp->event_mutex); 716 717 return 0; 718 } 719 720 static void dp_display_deinit_sub_modules(struct dp_display_private *dp) 721 { 722 dp_debug_put(dp->debug); 723 dp_ctrl_put(dp->ctrl); 724 dp_panel_put(dp->panel); 725 dp_aux_put(dp->aux); 726 dp_audio_put(dp->audio); 727 } 728 729 static int dp_init_sub_modules(struct dp_display_private *dp) 730 { 731 int rc = 0; 732 struct device *dev = &dp->pdev->dev; 733 struct dp_usbpd_cb *cb = &dp->usbpd_cb; 734 struct dp_panel_in panel_in = { 735 .dev = dev, 736 }; 737 738 /* Callback APIs used for cable status change event */ 739 cb->configure = dp_display_usbpd_configure_cb; 740 cb->disconnect = dp_display_usbpd_disconnect_cb; 741 cb->attention = dp_display_usbpd_attention_cb; 742 743 dp->usbpd = dp_hpd_get(dev, cb); 744 if (IS_ERR(dp->usbpd)) { 745 rc = PTR_ERR(dp->usbpd); 746 DRM_ERROR("failed to initialize hpd, rc = %d\n", rc); 747 dp->usbpd = NULL; 748 goto error; 749 } 750 751 dp->parser = dp_parser_get(dp->pdev); 752 if (IS_ERR(dp->parser)) { 753 rc = PTR_ERR(dp->parser); 754 DRM_ERROR("failed to initialize parser, rc = %d\n", rc); 755 dp->parser = NULL; 756 goto error; 757 } 758 759 dp->catalog = dp_catalog_get(dev, &dp->parser->io); 760 if (IS_ERR(dp->catalog)) { 761 rc = PTR_ERR(dp->catalog); 762 DRM_ERROR("failed to initialize catalog, rc = %d\n", rc); 763 dp->catalog = NULL; 764 goto error; 765 } 766 767 dp->power = dp_power_get(dev, dp->parser); 768 if (IS_ERR(dp->power)) { 769 rc = PTR_ERR(dp->power); 770 DRM_ERROR("failed to initialize power, rc = %d\n", rc); 771 dp->power = NULL; 772 goto error; 773 } 774 775 dp->aux = dp_aux_get(dev, dp->catalog); 776 if (IS_ERR(dp->aux)) { 777 rc = PTR_ERR(dp->aux); 778 DRM_ERROR("failed to initialize aux, rc = %d\n", rc); 779 dp->aux = NULL; 780 goto error; 781 } 782 783 dp->link = dp_link_get(dev, dp->aux); 784 if (IS_ERR(dp->link)) { 785 rc = PTR_ERR(dp->link); 786 DRM_ERROR("failed to initialize link, rc = %d\n", rc); 787 dp->link = NULL; 788 goto error_link; 789 } 790 791 panel_in.aux = dp->aux; 792 panel_in.catalog = dp->catalog; 793 panel_in.link = dp->link; 794 795 dp->panel = dp_panel_get(&panel_in); 796 if (IS_ERR(dp->panel)) { 797 rc = PTR_ERR(dp->panel); 798 DRM_ERROR("failed to initialize panel, rc = %d\n", rc); 799 dp->panel = NULL; 800 goto error_link; 801 } 802 803 dp->ctrl = dp_ctrl_get(dev, dp->link, dp->panel, dp->aux, 804 dp->power, dp->catalog, dp->parser); 805 if (IS_ERR(dp->ctrl)) { 806 rc = PTR_ERR(dp->ctrl); 807 DRM_ERROR("failed to initialize ctrl, rc = %d\n", rc); 808 dp->ctrl = NULL; 809 goto error_ctrl; 810 } 811 812 dp->audio = dp_audio_get(dp->pdev, dp->panel, dp->catalog); 813 if (IS_ERR(dp->audio)) { 814 rc = PTR_ERR(dp->audio); 815 pr_err("failed to initialize audio, rc = %d\n", rc); 816 dp->audio = NULL; 817 goto error_audio; 818 } 819 820 return rc; 821 822 error_audio: 823 dp_ctrl_put(dp->ctrl); 824 error_ctrl: 825 dp_panel_put(dp->panel); 826 error_link: 827 dp_aux_put(dp->aux); 828 error: 829 return rc; 830 } 831 832 static int dp_display_set_mode(struct msm_dp *dp_display, 833 struct dp_display_mode *mode) 834 { 835 struct dp_display_private *dp; 836 837 dp = container_of(dp_display, struct dp_display_private, dp_display); 838 839 dp->panel->dp_mode.drm_mode = mode->drm_mode; 840 dp->panel->dp_mode.bpp = mode->bpp; 841 dp->panel->dp_mode.capabilities = mode->capabilities; 842 dp_panel_init_panel_info(dp->panel); 843 return 0; 844 } 845 846 static int dp_display_prepare(struct msm_dp *dp) 847 { 848 return 0; 849 } 850 851 static int dp_display_enable(struct dp_display_private *dp, u32 data) 852 { 853 int rc = 0; 854 struct msm_dp *dp_display; 855 856 dp_display = g_dp_display; 857 858 if (dp_display->power_on) { 859 DRM_DEBUG_DP("Link already setup, return\n"); 860 return 0; 861 } 862 863 rc = dp_ctrl_on_stream(dp->ctrl); 864 if (!rc) 865 dp_display->power_on = true; 866 867 return rc; 868 } 869 870 static int dp_display_post_enable(struct msm_dp *dp_display) 871 { 872 struct dp_display_private *dp; 873 u32 rate; 874 875 dp = container_of(dp_display, struct dp_display_private, dp_display); 876 877 rate = dp->link->link_params.rate; 878 879 if (dp->audio_supported) { 880 dp->audio->bw_code = drm_dp_link_rate_to_bw_code(rate); 881 dp->audio->lane_count = dp->link->link_params.num_lanes; 882 } 883 884 /* signal the connect event late to synchronize video and display */ 885 dp_display_handle_plugged_change(dp_display, true); 886 return 0; 887 } 888 889 static int dp_display_disable(struct dp_display_private *dp, u32 data) 890 { 891 struct msm_dp *dp_display; 892 893 dp_display = g_dp_display; 894 895 if (!dp_display->power_on) 896 return 0; 897 898 /* wait only if audio was enabled */ 899 if (dp_display->audio_enabled) { 900 /* signal the disconnect event */ 901 reinit_completion(&dp->audio_comp); 902 dp_display_handle_plugged_change(dp_display, false); 903 if (!wait_for_completion_timeout(&dp->audio_comp, 904 HZ * 5)) 905 DRM_ERROR("audio comp timeout\n"); 906 } 907 908 dp_display->audio_enabled = false; 909 910 dp_ctrl_off(dp->ctrl); 911 912 dp->core_initialized = false; 913 914 dp_display->power_on = false; 915 916 return 0; 917 } 918 919 static int dp_display_unprepare(struct msm_dp *dp) 920 { 921 return 0; 922 } 923 924 int dp_display_set_plugged_cb(struct msm_dp *dp_display, 925 hdmi_codec_plugged_cb fn, struct device *codec_dev) 926 { 927 bool plugged; 928 929 dp_display->plugged_cb = fn; 930 dp_display->codec_dev = codec_dev; 931 plugged = dp_display->is_connected; 932 dp_display_handle_plugged_change(dp_display, plugged); 933 934 return 0; 935 } 936 937 int dp_display_validate_mode(struct msm_dp *dp, u32 mode_pclk_khz) 938 { 939 const u32 num_components = 3, default_bpp = 24; 940 struct dp_display_private *dp_display; 941 struct dp_link_info *link_info; 942 u32 mode_rate_khz = 0, supported_rate_khz = 0, mode_bpp = 0; 943 944 if (!dp || !mode_pclk_khz || !dp->connector) { 945 DRM_ERROR("invalid params\n"); 946 return -EINVAL; 947 } 948 949 dp_display = container_of(dp, struct dp_display_private, dp_display); 950 link_info = &dp_display->panel->link_info; 951 952 mode_bpp = dp->connector->display_info.bpc * num_components; 953 if (!mode_bpp) 954 mode_bpp = default_bpp; 955 956 mode_bpp = dp_panel_get_mode_bpp(dp_display->panel, 957 mode_bpp, mode_pclk_khz); 958 959 mode_rate_khz = mode_pclk_khz * mode_bpp; 960 supported_rate_khz = link_info->num_lanes * link_info->rate * 8; 961 962 if (mode_rate_khz > supported_rate_khz) 963 return MODE_BAD; 964 965 return MODE_OK; 966 } 967 968 int dp_display_get_modes(struct msm_dp *dp, 969 struct dp_display_mode *dp_mode) 970 { 971 struct dp_display_private *dp_display; 972 int ret = 0; 973 974 if (!dp) { 975 DRM_ERROR("invalid params\n"); 976 return 0; 977 } 978 979 dp_display = container_of(dp, struct dp_display_private, dp_display); 980 981 ret = dp_panel_get_modes(dp_display->panel, 982 dp->connector, dp_mode); 983 if (dp_mode->drm_mode.clock) 984 dp->max_pclk_khz = dp_mode->drm_mode.clock; 985 return ret; 986 } 987 988 bool dp_display_check_video_test(struct msm_dp *dp) 989 { 990 struct dp_display_private *dp_display; 991 992 dp_display = container_of(dp, struct dp_display_private, dp_display); 993 994 return dp_display->panel->video_test; 995 } 996 997 int dp_display_get_test_bpp(struct msm_dp *dp) 998 { 999 struct dp_display_private *dp_display; 1000 1001 if (!dp) { 1002 DRM_ERROR("invalid params\n"); 1003 return 0; 1004 } 1005 1006 dp_display = container_of(dp, struct dp_display_private, dp_display); 1007 1008 return dp_link_bit_depth_to_bpp( 1009 dp_display->link->test_video.test_bit_depth); 1010 } 1011 1012 static void dp_display_config_hpd(struct dp_display_private *dp) 1013 { 1014 1015 dp_display_host_init(dp, true); 1016 dp_catalog_ctrl_hpd_config(dp->catalog); 1017 1018 /* Enable interrupt first time 1019 * we are leaving dp clocks on during disconnect 1020 * and never disable interrupt 1021 */ 1022 enable_irq(dp->irq); 1023 } 1024 1025 static int hpd_event_thread(void *data) 1026 { 1027 struct dp_display_private *dp_priv; 1028 unsigned long flag; 1029 struct dp_event *todo; 1030 int timeout_mode = 0; 1031 1032 dp_priv = (struct dp_display_private *)data; 1033 1034 while (1) { 1035 if (timeout_mode) { 1036 wait_event_timeout(dp_priv->event_q, 1037 (dp_priv->event_pndx == dp_priv->event_gndx), 1038 EVENT_TIMEOUT); 1039 } else { 1040 wait_event_interruptible(dp_priv->event_q, 1041 (dp_priv->event_pndx != dp_priv->event_gndx)); 1042 } 1043 spin_lock_irqsave(&dp_priv->event_lock, flag); 1044 todo = &dp_priv->event_list[dp_priv->event_gndx]; 1045 if (todo->delay) { 1046 struct dp_event *todo_next; 1047 1048 dp_priv->event_gndx++; 1049 dp_priv->event_gndx %= DP_EVENT_Q_MAX; 1050 1051 /* re enter delay event into q */ 1052 todo_next = &dp_priv->event_list[dp_priv->event_pndx++]; 1053 dp_priv->event_pndx %= DP_EVENT_Q_MAX; 1054 todo_next->event_id = todo->event_id; 1055 todo_next->data = todo->data; 1056 todo_next->delay = todo->delay - 1; 1057 1058 /* clean up older event */ 1059 todo->event_id = EV_NO_EVENT; 1060 todo->delay = 0; 1061 1062 /* switch to timeout mode */ 1063 timeout_mode = 1; 1064 spin_unlock_irqrestore(&dp_priv->event_lock, flag); 1065 continue; 1066 } 1067 1068 /* timeout with no events in q */ 1069 if (dp_priv->event_pndx == dp_priv->event_gndx) { 1070 spin_unlock_irqrestore(&dp_priv->event_lock, flag); 1071 continue; 1072 } 1073 1074 dp_priv->event_gndx++; 1075 dp_priv->event_gndx %= DP_EVENT_Q_MAX; 1076 timeout_mode = 0; 1077 spin_unlock_irqrestore(&dp_priv->event_lock, flag); 1078 1079 switch (todo->event_id) { 1080 case EV_HPD_INIT_SETUP: 1081 dp_display_config_hpd(dp_priv); 1082 break; 1083 case EV_HPD_PLUG_INT: 1084 dp_hpd_plug_handle(dp_priv, todo->data); 1085 break; 1086 case EV_HPD_UNPLUG_INT: 1087 dp_hpd_unplug_handle(dp_priv, todo->data); 1088 break; 1089 case EV_IRQ_HPD_INT: 1090 dp_irq_hpd_handle(dp_priv, todo->data); 1091 break; 1092 case EV_HPD_REPLUG_INT: 1093 /* do nothing */ 1094 break; 1095 case EV_USER_NOTIFICATION: 1096 dp_display_send_hpd_notification(dp_priv, 1097 todo->data); 1098 break; 1099 case EV_CONNECT_PENDING_TIMEOUT: 1100 dp_connect_pending_timeout(dp_priv, 1101 todo->data); 1102 break; 1103 case EV_DISCONNECT_PENDING_TIMEOUT: 1104 dp_disconnect_pending_timeout(dp_priv, 1105 todo->data); 1106 break; 1107 default: 1108 break; 1109 } 1110 } 1111 1112 return 0; 1113 } 1114 1115 static void dp_hpd_event_setup(struct dp_display_private *dp_priv) 1116 { 1117 init_waitqueue_head(&dp_priv->event_q); 1118 spin_lock_init(&dp_priv->event_lock); 1119 1120 kthread_run(hpd_event_thread, dp_priv, "dp_hpd_handler"); 1121 } 1122 1123 static irqreturn_t dp_display_irq_handler(int irq, void *dev_id) 1124 { 1125 struct dp_display_private *dp = dev_id; 1126 irqreturn_t ret = IRQ_HANDLED; 1127 u32 hpd_isr_status; 1128 1129 if (!dp) { 1130 DRM_ERROR("invalid data\n"); 1131 return IRQ_NONE; 1132 } 1133 1134 hpd_isr_status = dp_catalog_hpd_get_intr_status(dp->catalog); 1135 1136 if (hpd_isr_status & 0x0F) { 1137 /* hpd related interrupts */ 1138 if (hpd_isr_status & DP_DP_HPD_PLUG_INT_MASK || 1139 hpd_isr_status & DP_DP_HPD_REPLUG_INT_MASK) { 1140 dp_add_event(dp, EV_HPD_PLUG_INT, 0, 0); 1141 } 1142 1143 if (hpd_isr_status & DP_DP_IRQ_HPD_INT_MASK) { 1144 /* stop sentinel connect pending checking */ 1145 dp_del_event(dp, EV_CONNECT_PENDING_TIMEOUT); 1146 dp_add_event(dp, EV_IRQ_HPD_INT, 0, 0); 1147 } 1148 1149 if (hpd_isr_status & DP_DP_HPD_REPLUG_INT_MASK) 1150 dp_add_event(dp, EV_HPD_REPLUG_INT, 0, 0); 1151 1152 if (hpd_isr_status & DP_DP_HPD_UNPLUG_INT_MASK) 1153 dp_add_event(dp, EV_HPD_UNPLUG_INT, 0, 0); 1154 } 1155 1156 /* DP controller isr */ 1157 dp_ctrl_isr(dp->ctrl); 1158 1159 /* DP aux isr */ 1160 dp_aux_isr(dp->aux); 1161 1162 return ret; 1163 } 1164 1165 int dp_display_request_irq(struct msm_dp *dp_display) 1166 { 1167 int rc = 0; 1168 struct dp_display_private *dp; 1169 1170 if (!dp_display) { 1171 DRM_ERROR("invalid input\n"); 1172 return -EINVAL; 1173 } 1174 1175 dp = container_of(dp_display, struct dp_display_private, dp_display); 1176 1177 dp->irq = irq_of_parse_and_map(dp->pdev->dev.of_node, 0); 1178 if (dp->irq < 0) { 1179 rc = dp->irq; 1180 DRM_ERROR("failed to get irq: %d\n", rc); 1181 return rc; 1182 } 1183 1184 rc = devm_request_irq(&dp->pdev->dev, dp->irq, 1185 dp_display_irq_handler, 1186 IRQF_TRIGGER_HIGH, "dp_display_isr", dp); 1187 if (rc < 0) { 1188 DRM_ERROR("failed to request IRQ%u: %d\n", 1189 dp->irq, rc); 1190 return rc; 1191 } 1192 disable_irq(dp->irq); 1193 1194 return 0; 1195 } 1196 1197 static int dp_display_probe(struct platform_device *pdev) 1198 { 1199 int rc = 0; 1200 struct dp_display_private *dp; 1201 1202 if (!pdev || !pdev->dev.of_node) { 1203 DRM_ERROR("pdev not found\n"); 1204 return -ENODEV; 1205 } 1206 1207 dp = devm_kzalloc(&pdev->dev, sizeof(*dp), GFP_KERNEL); 1208 if (!dp) 1209 return -ENOMEM; 1210 1211 dp->pdev = pdev; 1212 dp->name = "drm_dp"; 1213 1214 rc = dp_init_sub_modules(dp); 1215 if (rc) { 1216 DRM_ERROR("init sub module failed\n"); 1217 return -EPROBE_DEFER; 1218 } 1219 1220 mutex_init(&dp->event_mutex); 1221 g_dp_display = &dp->dp_display; 1222 1223 /* Store DP audio handle inside DP display */ 1224 g_dp_display->dp_audio = dp->audio; 1225 1226 init_completion(&dp->audio_comp); 1227 1228 platform_set_drvdata(pdev, g_dp_display); 1229 1230 rc = component_add(&pdev->dev, &dp_display_comp_ops); 1231 if (rc) { 1232 DRM_ERROR("component add failed, rc=%d\n", rc); 1233 dp_display_deinit_sub_modules(dp); 1234 } 1235 1236 return rc; 1237 } 1238 1239 static int dp_display_remove(struct platform_device *pdev) 1240 { 1241 struct dp_display_private *dp; 1242 1243 dp = container_of(g_dp_display, 1244 struct dp_display_private, dp_display); 1245 1246 dp_display_deinit_sub_modules(dp); 1247 1248 component_del(&pdev->dev, &dp_display_comp_ops); 1249 platform_set_drvdata(pdev, NULL); 1250 1251 return 0; 1252 } 1253 1254 static int dp_pm_resume(struct device *dev) 1255 { 1256 struct platform_device *pdev = to_platform_device(dev); 1257 struct msm_dp *dp_display = platform_get_drvdata(pdev); 1258 struct dp_display_private *dp; 1259 u32 status; 1260 1261 dp = container_of(dp_display, struct dp_display_private, dp_display); 1262 1263 mutex_lock(&dp->event_mutex); 1264 1265 /* start from disconnected state */ 1266 dp->hpd_state = ST_DISCONNECTED; 1267 1268 /* turn on dp ctrl/phy */ 1269 dp_display_host_init(dp, true); 1270 1271 dp_catalog_ctrl_hpd_config(dp->catalog); 1272 1273 status = dp_catalog_link_is_connected(dp->catalog); 1274 1275 if (status) 1276 dp->dp_display.is_connected = true; 1277 else 1278 dp->dp_display.is_connected = false; 1279 1280 mutex_unlock(&dp->event_mutex); 1281 1282 return 0; 1283 } 1284 1285 static int dp_pm_suspend(struct device *dev) 1286 { 1287 struct platform_device *pdev = to_platform_device(dev); 1288 struct msm_dp *dp_display = platform_get_drvdata(pdev); 1289 struct dp_display_private *dp; 1290 1291 dp = container_of(dp_display, struct dp_display_private, dp_display); 1292 1293 mutex_lock(&dp->event_mutex); 1294 1295 if (dp->core_initialized == true) 1296 dp_display_host_deinit(dp); 1297 1298 dp->hpd_state = ST_SUSPENDED; 1299 1300 /* host_init will be called at pm_resume */ 1301 dp->core_initialized = false; 1302 1303 mutex_unlock(&dp->event_mutex); 1304 1305 return 0; 1306 } 1307 1308 static int dp_pm_prepare(struct device *dev) 1309 { 1310 return 0; 1311 } 1312 1313 static void dp_pm_complete(struct device *dev) 1314 { 1315 1316 } 1317 1318 static const struct dev_pm_ops dp_pm_ops = { 1319 .suspend = dp_pm_suspend, 1320 .resume = dp_pm_resume, 1321 .prepare = dp_pm_prepare, 1322 .complete = dp_pm_complete, 1323 }; 1324 1325 static struct platform_driver dp_display_driver = { 1326 .probe = dp_display_probe, 1327 .remove = dp_display_remove, 1328 .driver = { 1329 .name = "msm-dp-display", 1330 .of_match_table = dp_dt_match, 1331 .suppress_bind_attrs = true, 1332 .pm = &dp_pm_ops, 1333 }, 1334 }; 1335 1336 int __init msm_dp_register(void) 1337 { 1338 int ret; 1339 1340 ret = platform_driver_register(&dp_display_driver); 1341 if (ret) 1342 DRM_ERROR("Dp display driver register failed"); 1343 1344 return ret; 1345 } 1346 1347 void __exit msm_dp_unregister(void) 1348 { 1349 platform_driver_unregister(&dp_display_driver); 1350 } 1351 1352 void msm_dp_irq_postinstall(struct msm_dp *dp_display) 1353 { 1354 struct dp_display_private *dp; 1355 1356 if (!dp_display) 1357 return; 1358 1359 dp = container_of(dp_display, struct dp_display_private, dp_display); 1360 1361 dp_hpd_event_setup(dp); 1362 1363 dp_add_event(dp, EV_HPD_INIT_SETUP, 0, 100); 1364 } 1365 1366 void msm_dp_debugfs_init(struct msm_dp *dp_display, struct drm_minor *minor) 1367 { 1368 struct dp_display_private *dp; 1369 struct device *dev; 1370 int rc; 1371 1372 dp = container_of(dp_display, struct dp_display_private, dp_display); 1373 dev = &dp->pdev->dev; 1374 1375 dp->debug = dp_debug_get(dev, dp->panel, dp->usbpd, 1376 dp->link, &dp->dp_display.connector, 1377 minor); 1378 if (IS_ERR(dp->debug)) { 1379 rc = PTR_ERR(dp->debug); 1380 DRM_ERROR("failed to initialize debug, rc = %d\n", rc); 1381 dp->debug = NULL; 1382 } 1383 } 1384 1385 int msm_dp_modeset_init(struct msm_dp *dp_display, struct drm_device *dev, 1386 struct drm_encoder *encoder) 1387 { 1388 struct msm_drm_private *priv; 1389 int ret; 1390 1391 if (WARN_ON(!encoder) || WARN_ON(!dp_display) || WARN_ON(!dev)) 1392 return -EINVAL; 1393 1394 priv = dev->dev_private; 1395 dp_display->drm_dev = dev; 1396 1397 ret = dp_display_request_irq(dp_display); 1398 if (ret) { 1399 DRM_ERROR("request_irq failed, ret=%d\n", ret); 1400 return ret; 1401 } 1402 1403 dp_display->encoder = encoder; 1404 1405 dp_display->connector = dp_drm_connector_init(dp_display); 1406 if (IS_ERR(dp_display->connector)) { 1407 ret = PTR_ERR(dp_display->connector); 1408 DRM_DEV_ERROR(dev->dev, 1409 "failed to create dp connector: %d\n", ret); 1410 dp_display->connector = NULL; 1411 return ret; 1412 } 1413 1414 priv->connectors[priv->num_connectors++] = dp_display->connector; 1415 return 0; 1416 } 1417 1418 int msm_dp_display_enable(struct msm_dp *dp, struct drm_encoder *encoder) 1419 { 1420 int rc = 0; 1421 struct dp_display_private *dp_display; 1422 u32 state; 1423 1424 dp_display = container_of(dp, struct dp_display_private, dp_display); 1425 if (!dp_display->dp_mode.drm_mode.clock) { 1426 DRM_ERROR("invalid params\n"); 1427 return -EINVAL; 1428 } 1429 1430 mutex_lock(&dp_display->event_mutex); 1431 1432 /* stop sentinel checking */ 1433 dp_del_event(dp_display, EV_CONNECT_PENDING_TIMEOUT); 1434 1435 rc = dp_display_set_mode(dp, &dp_display->dp_mode); 1436 if (rc) { 1437 DRM_ERROR("Failed to perform a mode set, rc=%d\n", rc); 1438 mutex_unlock(&dp_display->event_mutex); 1439 return rc; 1440 } 1441 1442 rc = dp_display_prepare(dp); 1443 if (rc) { 1444 DRM_ERROR("DP display prepare failed, rc=%d\n", rc); 1445 mutex_unlock(&dp_display->event_mutex); 1446 return rc; 1447 } 1448 1449 state = dp_display->hpd_state; 1450 1451 if (state == ST_DISPLAY_OFF) 1452 dp_display_host_init(dp_display, true); 1453 1454 dp_display_enable(dp_display, 0); 1455 1456 rc = dp_display_post_enable(dp); 1457 if (rc) { 1458 DRM_ERROR("DP display post enable failed, rc=%d\n", rc); 1459 dp_display_disable(dp_display, 0); 1460 dp_display_unprepare(dp); 1461 } 1462 1463 /* manual kick off plug event to train link */ 1464 if (state == ST_DISPLAY_OFF) 1465 dp_add_event(dp_display, EV_IRQ_HPD_INT, 0, 0); 1466 1467 /* completed connection */ 1468 dp_display->hpd_state = ST_CONNECTED; 1469 1470 mutex_unlock(&dp_display->event_mutex); 1471 1472 return rc; 1473 } 1474 1475 int msm_dp_display_pre_disable(struct msm_dp *dp, struct drm_encoder *encoder) 1476 { 1477 struct dp_display_private *dp_display; 1478 1479 dp_display = container_of(dp, struct dp_display_private, dp_display); 1480 1481 dp_ctrl_push_idle(dp_display->ctrl); 1482 1483 return 0; 1484 } 1485 1486 int msm_dp_display_disable(struct msm_dp *dp, struct drm_encoder *encoder) 1487 { 1488 int rc = 0; 1489 u32 state; 1490 struct dp_display_private *dp_display; 1491 1492 dp_display = container_of(dp, struct dp_display_private, dp_display); 1493 1494 mutex_lock(&dp_display->event_mutex); 1495 1496 /* stop sentinel checking */ 1497 dp_del_event(dp_display, EV_DISCONNECT_PENDING_TIMEOUT); 1498 1499 dp_display_disable(dp_display, 0); 1500 1501 rc = dp_display_unprepare(dp); 1502 if (rc) 1503 DRM_ERROR("DP display unprepare failed, rc=%d\n", rc); 1504 1505 state = dp_display->hpd_state; 1506 if (state == ST_DISCONNECT_PENDING) { 1507 /* completed disconnection */ 1508 dp_display->hpd_state = ST_DISCONNECTED; 1509 } else { 1510 dp_display->hpd_state = ST_DISPLAY_OFF; 1511 } 1512 1513 mutex_unlock(&dp_display->event_mutex); 1514 return rc; 1515 } 1516 1517 void msm_dp_display_mode_set(struct msm_dp *dp, struct drm_encoder *encoder, 1518 struct drm_display_mode *mode, 1519 struct drm_display_mode *adjusted_mode) 1520 { 1521 struct dp_display_private *dp_display; 1522 1523 dp_display = container_of(dp, struct dp_display_private, dp_display); 1524 1525 memset(&dp_display->dp_mode, 0x0, sizeof(struct dp_display_mode)); 1526 1527 if (dp_display_check_video_test(dp)) 1528 dp_display->dp_mode.bpp = dp_display_get_test_bpp(dp); 1529 else /* Default num_components per pixel = 3 */ 1530 dp_display->dp_mode.bpp = dp->connector->display_info.bpc * 3; 1531 1532 if (!dp_display->dp_mode.bpp) 1533 dp_display->dp_mode.bpp = 24; /* Default bpp */ 1534 1535 drm_mode_copy(&dp_display->dp_mode.drm_mode, adjusted_mode); 1536 1537 dp_display->dp_mode.v_active_low = 1538 !!(dp_display->dp_mode.drm_mode.flags & DRM_MODE_FLAG_NVSYNC); 1539 1540 dp_display->dp_mode.h_active_low = 1541 !!(dp_display->dp_mode.drm_mode.flags & DRM_MODE_FLAG_NHSYNC); 1542 } 1543