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) 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); 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); 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 dp_display_handle_plugged_change(g_dp_display, false); 655 reinit_completion(&dp->audio_comp); 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 ret = dp_display_usbpd_attention_cb(&dp->pdev->dev); 697 if (ret == -ECONNRESET) { /* cable unplugged */ 698 dp->core_initialized = false; 699 } 700 701 mutex_unlock(&dp->event_mutex); 702 703 return 0; 704 } 705 706 static void dp_display_deinit_sub_modules(struct dp_display_private *dp) 707 { 708 dp_debug_put(dp->debug); 709 dp_ctrl_put(dp->ctrl); 710 dp_panel_put(dp->panel); 711 dp_aux_put(dp->aux); 712 dp_audio_put(dp->audio); 713 } 714 715 static int dp_init_sub_modules(struct dp_display_private *dp) 716 { 717 int rc = 0; 718 struct device *dev = &dp->pdev->dev; 719 struct dp_usbpd_cb *cb = &dp->usbpd_cb; 720 struct dp_panel_in panel_in = { 721 .dev = dev, 722 }; 723 724 /* Callback APIs used for cable status change event */ 725 cb->configure = dp_display_usbpd_configure_cb; 726 cb->disconnect = dp_display_usbpd_disconnect_cb; 727 cb->attention = dp_display_usbpd_attention_cb; 728 729 dp->usbpd = dp_hpd_get(dev, cb); 730 if (IS_ERR(dp->usbpd)) { 731 rc = PTR_ERR(dp->usbpd); 732 DRM_ERROR("failed to initialize hpd, rc = %d\n", rc); 733 dp->usbpd = NULL; 734 goto error; 735 } 736 737 dp->parser = dp_parser_get(dp->pdev); 738 if (IS_ERR(dp->parser)) { 739 rc = PTR_ERR(dp->parser); 740 DRM_ERROR("failed to initialize parser, rc = %d\n", rc); 741 dp->parser = NULL; 742 goto error; 743 } 744 745 dp->catalog = dp_catalog_get(dev, &dp->parser->io); 746 if (IS_ERR(dp->catalog)) { 747 rc = PTR_ERR(dp->catalog); 748 DRM_ERROR("failed to initialize catalog, rc = %d\n", rc); 749 dp->catalog = NULL; 750 goto error; 751 } 752 753 dp->power = dp_power_get(dev, dp->parser); 754 if (IS_ERR(dp->power)) { 755 rc = PTR_ERR(dp->power); 756 DRM_ERROR("failed to initialize power, rc = %d\n", rc); 757 dp->power = NULL; 758 goto error; 759 } 760 761 dp->aux = dp_aux_get(dev, dp->catalog); 762 if (IS_ERR(dp->aux)) { 763 rc = PTR_ERR(dp->aux); 764 DRM_ERROR("failed to initialize aux, rc = %d\n", rc); 765 dp->aux = NULL; 766 goto error; 767 } 768 769 dp->link = dp_link_get(dev, dp->aux); 770 if (IS_ERR(dp->link)) { 771 rc = PTR_ERR(dp->link); 772 DRM_ERROR("failed to initialize link, rc = %d\n", rc); 773 dp->link = NULL; 774 goto error_link; 775 } 776 777 panel_in.aux = dp->aux; 778 panel_in.catalog = dp->catalog; 779 panel_in.link = dp->link; 780 781 dp->panel = dp_panel_get(&panel_in); 782 if (IS_ERR(dp->panel)) { 783 rc = PTR_ERR(dp->panel); 784 DRM_ERROR("failed to initialize panel, rc = %d\n", rc); 785 dp->panel = NULL; 786 goto error_link; 787 } 788 789 dp->ctrl = dp_ctrl_get(dev, dp->link, dp->panel, dp->aux, 790 dp->power, dp->catalog, dp->parser); 791 if (IS_ERR(dp->ctrl)) { 792 rc = PTR_ERR(dp->ctrl); 793 DRM_ERROR("failed to initialize ctrl, rc = %d\n", rc); 794 dp->ctrl = NULL; 795 goto error_ctrl; 796 } 797 798 dp->audio = dp_audio_get(dp->pdev, dp->panel, dp->catalog); 799 if (IS_ERR(dp->audio)) { 800 rc = PTR_ERR(dp->audio); 801 pr_err("failed to initialize audio, rc = %d\n", rc); 802 dp->audio = NULL; 803 goto error_audio; 804 } 805 806 return rc; 807 808 error_audio: 809 dp_ctrl_put(dp->ctrl); 810 error_ctrl: 811 dp_panel_put(dp->panel); 812 error_link: 813 dp_aux_put(dp->aux); 814 error: 815 return rc; 816 } 817 818 static int dp_display_set_mode(struct msm_dp *dp_display, 819 struct dp_display_mode *mode) 820 { 821 struct dp_display_private *dp; 822 823 dp = container_of(dp_display, struct dp_display_private, dp_display); 824 825 dp->panel->dp_mode.drm_mode = mode->drm_mode; 826 dp->panel->dp_mode.bpp = mode->bpp; 827 dp->panel->dp_mode.capabilities = mode->capabilities; 828 dp_panel_init_panel_info(dp->panel); 829 return 0; 830 } 831 832 static int dp_display_prepare(struct msm_dp *dp) 833 { 834 return 0; 835 } 836 837 static int dp_display_enable(struct dp_display_private *dp, u32 data) 838 { 839 int rc = 0; 840 struct msm_dp *dp_display; 841 842 dp_display = g_dp_display; 843 844 if (dp_display->power_on) { 845 DRM_DEBUG_DP("Link already setup, return\n"); 846 return 0; 847 } 848 849 rc = dp_ctrl_on_stream(dp->ctrl); 850 if (!rc) 851 dp_display->power_on = true; 852 853 return rc; 854 } 855 856 static int dp_display_post_enable(struct msm_dp *dp_display) 857 { 858 struct dp_display_private *dp; 859 u32 rate; 860 861 dp = container_of(dp_display, struct dp_display_private, dp_display); 862 863 rate = dp->link->link_params.rate; 864 865 if (dp->audio_supported) { 866 dp->audio->bw_code = drm_dp_link_rate_to_bw_code(rate); 867 dp->audio->lane_count = dp->link->link_params.num_lanes; 868 } 869 870 /* signal the connect event late to synchronize video and display */ 871 dp_display_handle_plugged_change(dp_display, true); 872 return 0; 873 } 874 875 static int dp_display_disable(struct dp_display_private *dp, u32 data) 876 { 877 struct msm_dp *dp_display; 878 879 dp_display = g_dp_display; 880 881 if (!dp_display->power_on) 882 return 0; 883 884 /* wait only if audio was enabled */ 885 if (dp_display->audio_enabled) { 886 if (!wait_for_completion_timeout(&dp->audio_comp, 887 HZ * 5)) 888 DRM_ERROR("audio comp timeout\n"); 889 } 890 891 dp_display->audio_enabled = false; 892 893 dp_ctrl_off(dp->ctrl); 894 895 dp->core_initialized = false; 896 897 dp_display->power_on = false; 898 899 return 0; 900 } 901 902 static int dp_display_unprepare(struct msm_dp *dp) 903 { 904 return 0; 905 } 906 907 int dp_display_set_plugged_cb(struct msm_dp *dp_display, 908 hdmi_codec_plugged_cb fn, struct device *codec_dev) 909 { 910 bool plugged; 911 912 dp_display->plugged_cb = fn; 913 dp_display->codec_dev = codec_dev; 914 plugged = dp_display->is_connected; 915 dp_display_handle_plugged_change(dp_display, plugged); 916 917 return 0; 918 } 919 920 int dp_display_validate_mode(struct msm_dp *dp, u32 mode_pclk_khz) 921 { 922 const u32 num_components = 3, default_bpp = 24; 923 struct dp_display_private *dp_display; 924 struct dp_link_info *link_info; 925 u32 mode_rate_khz = 0, supported_rate_khz = 0, mode_bpp = 0; 926 927 if (!dp || !mode_pclk_khz || !dp->connector) { 928 DRM_ERROR("invalid params\n"); 929 return -EINVAL; 930 } 931 932 dp_display = container_of(dp, struct dp_display_private, dp_display); 933 link_info = &dp_display->panel->link_info; 934 935 mode_bpp = dp->connector->display_info.bpc * num_components; 936 if (!mode_bpp) 937 mode_bpp = default_bpp; 938 939 mode_bpp = dp_panel_get_mode_bpp(dp_display->panel, 940 mode_bpp, mode_pclk_khz); 941 942 mode_rate_khz = mode_pclk_khz * mode_bpp; 943 supported_rate_khz = link_info->num_lanes * link_info->rate * 8; 944 945 if (mode_rate_khz > supported_rate_khz) 946 return MODE_BAD; 947 948 return MODE_OK; 949 } 950 951 int dp_display_get_modes(struct msm_dp *dp, 952 struct dp_display_mode *dp_mode) 953 { 954 struct dp_display_private *dp_display; 955 int ret = 0; 956 957 if (!dp) { 958 DRM_ERROR("invalid params\n"); 959 return 0; 960 } 961 962 dp_display = container_of(dp, struct dp_display_private, dp_display); 963 964 ret = dp_panel_get_modes(dp_display->panel, 965 dp->connector, dp_mode); 966 if (dp_mode->drm_mode.clock) 967 dp->max_pclk_khz = dp_mode->drm_mode.clock; 968 return ret; 969 } 970 971 bool dp_display_check_video_test(struct msm_dp *dp) 972 { 973 struct dp_display_private *dp_display; 974 975 dp_display = container_of(dp, struct dp_display_private, dp_display); 976 977 return dp_display->panel->video_test; 978 } 979 980 int dp_display_get_test_bpp(struct msm_dp *dp) 981 { 982 struct dp_display_private *dp_display; 983 984 if (!dp) { 985 DRM_ERROR("invalid params\n"); 986 return 0; 987 } 988 989 dp_display = container_of(dp, struct dp_display_private, dp_display); 990 991 return dp_link_bit_depth_to_bpp( 992 dp_display->link->test_video.test_bit_depth); 993 } 994 995 static void dp_display_config_hpd(struct dp_display_private *dp) 996 { 997 998 dp_display_host_init(dp); 999 dp_catalog_ctrl_hpd_config(dp->catalog); 1000 1001 /* Enable interrupt first time 1002 * we are leaving dp clocks on during disconnect 1003 * and never disable interrupt 1004 */ 1005 enable_irq(dp->irq); 1006 } 1007 1008 static int hpd_event_thread(void *data) 1009 { 1010 struct dp_display_private *dp_priv; 1011 unsigned long flag; 1012 struct dp_event *todo; 1013 int timeout_mode = 0; 1014 1015 dp_priv = (struct dp_display_private *)data; 1016 1017 while (1) { 1018 if (timeout_mode) { 1019 wait_event_timeout(dp_priv->event_q, 1020 (dp_priv->event_pndx == dp_priv->event_gndx), 1021 EVENT_TIMEOUT); 1022 } else { 1023 wait_event_interruptible(dp_priv->event_q, 1024 (dp_priv->event_pndx != dp_priv->event_gndx)); 1025 } 1026 spin_lock_irqsave(&dp_priv->event_lock, flag); 1027 todo = &dp_priv->event_list[dp_priv->event_gndx]; 1028 if (todo->delay) { 1029 struct dp_event *todo_next; 1030 1031 dp_priv->event_gndx++; 1032 dp_priv->event_gndx %= DP_EVENT_Q_MAX; 1033 1034 /* re enter delay event into q */ 1035 todo_next = &dp_priv->event_list[dp_priv->event_pndx++]; 1036 dp_priv->event_pndx %= DP_EVENT_Q_MAX; 1037 todo_next->event_id = todo->event_id; 1038 todo_next->data = todo->data; 1039 todo_next->delay = todo->delay - 1; 1040 1041 /* clean up older event */ 1042 todo->event_id = EV_NO_EVENT; 1043 todo->delay = 0; 1044 1045 /* switch to timeout mode */ 1046 timeout_mode = 1; 1047 spin_unlock_irqrestore(&dp_priv->event_lock, flag); 1048 continue; 1049 } 1050 1051 /* timeout with no events in q */ 1052 if (dp_priv->event_pndx == dp_priv->event_gndx) { 1053 spin_unlock_irqrestore(&dp_priv->event_lock, flag); 1054 continue; 1055 } 1056 1057 dp_priv->event_gndx++; 1058 dp_priv->event_gndx %= DP_EVENT_Q_MAX; 1059 timeout_mode = 0; 1060 spin_unlock_irqrestore(&dp_priv->event_lock, flag); 1061 1062 switch (todo->event_id) { 1063 case EV_HPD_INIT_SETUP: 1064 dp_display_config_hpd(dp_priv); 1065 break; 1066 case EV_HPD_PLUG_INT: 1067 dp_hpd_plug_handle(dp_priv, todo->data); 1068 break; 1069 case EV_HPD_UNPLUG_INT: 1070 dp_hpd_unplug_handle(dp_priv, todo->data); 1071 break; 1072 case EV_IRQ_HPD_INT: 1073 dp_irq_hpd_handle(dp_priv, todo->data); 1074 break; 1075 case EV_HPD_REPLUG_INT: 1076 /* do nothing */ 1077 break; 1078 case EV_USER_NOTIFICATION: 1079 dp_display_send_hpd_notification(dp_priv, 1080 todo->data); 1081 break; 1082 case EV_CONNECT_PENDING_TIMEOUT: 1083 dp_connect_pending_timeout(dp_priv, 1084 todo->data); 1085 break; 1086 case EV_DISCONNECT_PENDING_TIMEOUT: 1087 dp_disconnect_pending_timeout(dp_priv, 1088 todo->data); 1089 break; 1090 default: 1091 break; 1092 } 1093 } 1094 1095 return 0; 1096 } 1097 1098 static void dp_hpd_event_setup(struct dp_display_private *dp_priv) 1099 { 1100 init_waitqueue_head(&dp_priv->event_q); 1101 spin_lock_init(&dp_priv->event_lock); 1102 1103 kthread_run(hpd_event_thread, dp_priv, "dp_hpd_handler"); 1104 } 1105 1106 static irqreturn_t dp_display_irq_handler(int irq, void *dev_id) 1107 { 1108 struct dp_display_private *dp = dev_id; 1109 irqreturn_t ret = IRQ_HANDLED; 1110 u32 hpd_isr_status; 1111 1112 if (!dp) { 1113 DRM_ERROR("invalid data\n"); 1114 return IRQ_NONE; 1115 } 1116 1117 hpd_isr_status = dp_catalog_hpd_get_intr_status(dp->catalog); 1118 1119 if (hpd_isr_status & 0x0F) { 1120 /* hpd related interrupts */ 1121 if (hpd_isr_status & DP_DP_HPD_PLUG_INT_MASK || 1122 hpd_isr_status & DP_DP_HPD_REPLUG_INT_MASK) { 1123 dp_add_event(dp, EV_HPD_PLUG_INT, 0, 0); 1124 } 1125 1126 if (hpd_isr_status & DP_DP_IRQ_HPD_INT_MASK) { 1127 /* stop sentinel connect pending checking */ 1128 dp_del_event(dp, EV_CONNECT_PENDING_TIMEOUT); 1129 dp_add_event(dp, EV_IRQ_HPD_INT, 0, 0); 1130 } 1131 1132 if (hpd_isr_status & DP_DP_HPD_REPLUG_INT_MASK) 1133 dp_add_event(dp, EV_HPD_REPLUG_INT, 0, 0); 1134 1135 if (hpd_isr_status & DP_DP_HPD_UNPLUG_INT_MASK) 1136 dp_add_event(dp, EV_HPD_UNPLUG_INT, 0, 0); 1137 } 1138 1139 /* DP controller isr */ 1140 dp_ctrl_isr(dp->ctrl); 1141 1142 /* DP aux isr */ 1143 dp_aux_isr(dp->aux); 1144 1145 return ret; 1146 } 1147 1148 int dp_display_request_irq(struct msm_dp *dp_display) 1149 { 1150 int rc = 0; 1151 struct dp_display_private *dp; 1152 1153 if (!dp_display) { 1154 DRM_ERROR("invalid input\n"); 1155 return -EINVAL; 1156 } 1157 1158 dp = container_of(dp_display, struct dp_display_private, dp_display); 1159 1160 dp->irq = irq_of_parse_and_map(dp->pdev->dev.of_node, 0); 1161 if (dp->irq < 0) { 1162 rc = dp->irq; 1163 DRM_ERROR("failed to get irq: %d\n", rc); 1164 return rc; 1165 } 1166 1167 rc = devm_request_irq(&dp->pdev->dev, dp->irq, 1168 dp_display_irq_handler, 1169 IRQF_TRIGGER_HIGH, "dp_display_isr", dp); 1170 if (rc < 0) { 1171 DRM_ERROR("failed to request IRQ%u: %d\n", 1172 dp->irq, rc); 1173 return rc; 1174 } 1175 disable_irq(dp->irq); 1176 1177 return 0; 1178 } 1179 1180 static int dp_display_probe(struct platform_device *pdev) 1181 { 1182 int rc = 0; 1183 struct dp_display_private *dp; 1184 1185 if (!pdev || !pdev->dev.of_node) { 1186 DRM_ERROR("pdev not found\n"); 1187 return -ENODEV; 1188 } 1189 1190 dp = devm_kzalloc(&pdev->dev, sizeof(*dp), GFP_KERNEL); 1191 if (!dp) 1192 return -ENOMEM; 1193 1194 dp->pdev = pdev; 1195 dp->name = "drm_dp"; 1196 1197 rc = dp_init_sub_modules(dp); 1198 if (rc) { 1199 DRM_ERROR("init sub module failed\n"); 1200 return -EPROBE_DEFER; 1201 } 1202 1203 mutex_init(&dp->event_mutex); 1204 g_dp_display = &dp->dp_display; 1205 1206 /* Store DP audio handle inside DP display */ 1207 g_dp_display->dp_audio = dp->audio; 1208 1209 init_completion(&dp->audio_comp); 1210 1211 platform_set_drvdata(pdev, g_dp_display); 1212 1213 rc = component_add(&pdev->dev, &dp_display_comp_ops); 1214 if (rc) { 1215 DRM_ERROR("component add failed, rc=%d\n", rc); 1216 dp_display_deinit_sub_modules(dp); 1217 } 1218 1219 return rc; 1220 } 1221 1222 static int dp_display_remove(struct platform_device *pdev) 1223 { 1224 struct dp_display_private *dp; 1225 1226 dp = container_of(g_dp_display, 1227 struct dp_display_private, dp_display); 1228 1229 dp_display_deinit_sub_modules(dp); 1230 1231 component_del(&pdev->dev, &dp_display_comp_ops); 1232 platform_set_drvdata(pdev, NULL); 1233 1234 return 0; 1235 } 1236 1237 static int dp_pm_resume(struct device *dev) 1238 { 1239 struct platform_device *pdev = to_platform_device(dev); 1240 struct msm_dp *dp_display = platform_get_drvdata(pdev); 1241 struct dp_display_private *dp; 1242 u32 status; 1243 1244 dp = container_of(dp_display, struct dp_display_private, dp_display); 1245 1246 mutex_lock(&dp->event_mutex); 1247 1248 /* start from disconnected state */ 1249 dp->hpd_state = ST_DISCONNECTED; 1250 1251 /* turn on dp ctrl/phy */ 1252 dp_display_host_init(dp); 1253 1254 dp_catalog_ctrl_hpd_config(dp->catalog); 1255 1256 status = dp_catalog_link_is_connected(dp->catalog); 1257 1258 if (status) 1259 dp->dp_display.is_connected = true; 1260 else 1261 dp->dp_display.is_connected = false; 1262 1263 mutex_unlock(&dp->event_mutex); 1264 1265 return 0; 1266 } 1267 1268 static int dp_pm_suspend(struct device *dev) 1269 { 1270 struct platform_device *pdev = to_platform_device(dev); 1271 struct msm_dp *dp_display = platform_get_drvdata(pdev); 1272 struct dp_display_private *dp; 1273 1274 dp = container_of(dp_display, struct dp_display_private, dp_display); 1275 1276 mutex_lock(&dp->event_mutex); 1277 1278 if (dp->core_initialized == true) 1279 dp_display_host_deinit(dp); 1280 1281 dp->hpd_state = ST_SUSPENDED; 1282 1283 /* host_init will be called at pm_resume */ 1284 dp->core_initialized = false; 1285 1286 mutex_unlock(&dp->event_mutex); 1287 1288 return 0; 1289 } 1290 1291 static int dp_pm_prepare(struct device *dev) 1292 { 1293 return 0; 1294 } 1295 1296 static void dp_pm_complete(struct device *dev) 1297 { 1298 1299 } 1300 1301 static const struct dev_pm_ops dp_pm_ops = { 1302 .suspend = dp_pm_suspend, 1303 .resume = dp_pm_resume, 1304 .prepare = dp_pm_prepare, 1305 .complete = dp_pm_complete, 1306 }; 1307 1308 static struct platform_driver dp_display_driver = { 1309 .probe = dp_display_probe, 1310 .remove = dp_display_remove, 1311 .driver = { 1312 .name = "msm-dp-display", 1313 .of_match_table = dp_dt_match, 1314 .suppress_bind_attrs = true, 1315 .pm = &dp_pm_ops, 1316 }, 1317 }; 1318 1319 int __init msm_dp_register(void) 1320 { 1321 int ret; 1322 1323 ret = platform_driver_register(&dp_display_driver); 1324 if (ret) 1325 DRM_ERROR("Dp display driver register failed"); 1326 1327 return ret; 1328 } 1329 1330 void __exit msm_dp_unregister(void) 1331 { 1332 platform_driver_unregister(&dp_display_driver); 1333 } 1334 1335 void msm_dp_irq_postinstall(struct msm_dp *dp_display) 1336 { 1337 struct dp_display_private *dp; 1338 1339 if (!dp_display) 1340 return; 1341 1342 dp = container_of(dp_display, struct dp_display_private, dp_display); 1343 1344 dp_hpd_event_setup(dp); 1345 1346 dp_add_event(dp, EV_HPD_INIT_SETUP, 0, 100); 1347 } 1348 1349 void msm_dp_debugfs_init(struct msm_dp *dp_display, struct drm_minor *minor) 1350 { 1351 struct dp_display_private *dp; 1352 struct device *dev; 1353 int rc; 1354 1355 dp = container_of(dp_display, struct dp_display_private, dp_display); 1356 dev = &dp->pdev->dev; 1357 1358 dp->debug = dp_debug_get(dev, dp->panel, dp->usbpd, 1359 dp->link, &dp->dp_display.connector, 1360 minor); 1361 if (IS_ERR(dp->debug)) { 1362 rc = PTR_ERR(dp->debug); 1363 DRM_ERROR("failed to initialize debug, rc = %d\n", rc); 1364 dp->debug = NULL; 1365 } 1366 } 1367 1368 int msm_dp_modeset_init(struct msm_dp *dp_display, struct drm_device *dev, 1369 struct drm_encoder *encoder) 1370 { 1371 struct msm_drm_private *priv; 1372 int ret; 1373 1374 if (WARN_ON(!encoder) || WARN_ON(!dp_display) || WARN_ON(!dev)) 1375 return -EINVAL; 1376 1377 priv = dev->dev_private; 1378 dp_display->drm_dev = dev; 1379 1380 ret = dp_display_request_irq(dp_display); 1381 if (ret) { 1382 DRM_ERROR("request_irq failed, ret=%d\n", ret); 1383 return ret; 1384 } 1385 1386 dp_display->encoder = encoder; 1387 1388 dp_display->connector = dp_drm_connector_init(dp_display); 1389 if (IS_ERR(dp_display->connector)) { 1390 ret = PTR_ERR(dp_display->connector); 1391 DRM_DEV_ERROR(dev->dev, 1392 "failed to create dp connector: %d\n", ret); 1393 dp_display->connector = NULL; 1394 return ret; 1395 } 1396 1397 priv->connectors[priv->num_connectors++] = dp_display->connector; 1398 return 0; 1399 } 1400 1401 int msm_dp_display_enable(struct msm_dp *dp, struct drm_encoder *encoder) 1402 { 1403 int rc = 0; 1404 struct dp_display_private *dp_display; 1405 u32 state; 1406 1407 dp_display = container_of(dp, struct dp_display_private, dp_display); 1408 if (!dp_display->dp_mode.drm_mode.clock) { 1409 DRM_ERROR("invalid params\n"); 1410 return -EINVAL; 1411 } 1412 1413 mutex_lock(&dp_display->event_mutex); 1414 1415 /* stop sentinel checking */ 1416 dp_del_event(dp_display, EV_CONNECT_PENDING_TIMEOUT); 1417 1418 rc = dp_display_set_mode(dp, &dp_display->dp_mode); 1419 if (rc) { 1420 DRM_ERROR("Failed to perform a mode set, rc=%d\n", rc); 1421 mutex_unlock(&dp_display->event_mutex); 1422 return rc; 1423 } 1424 1425 rc = dp_display_prepare(dp); 1426 if (rc) { 1427 DRM_ERROR("DP display prepare failed, rc=%d\n", rc); 1428 mutex_unlock(&dp_display->event_mutex); 1429 return rc; 1430 } 1431 1432 state = dp_display->hpd_state; 1433 1434 if (state == ST_DISPLAY_OFF) 1435 dp_display_host_init(dp_display); 1436 1437 dp_display_enable(dp_display, 0); 1438 1439 rc = dp_display_post_enable(dp); 1440 if (rc) { 1441 DRM_ERROR("DP display post enable failed, rc=%d\n", rc); 1442 dp_display_disable(dp_display, 0); 1443 dp_display_unprepare(dp); 1444 } 1445 1446 /* manual kick off plug event to train link */ 1447 if (state == ST_DISPLAY_OFF) 1448 dp_add_event(dp_display, EV_IRQ_HPD_INT, 0, 0); 1449 1450 /* completed connection */ 1451 dp_display->hpd_state = ST_CONNECTED; 1452 1453 mutex_unlock(&dp_display->event_mutex); 1454 1455 return rc; 1456 } 1457 1458 int msm_dp_display_pre_disable(struct msm_dp *dp, struct drm_encoder *encoder) 1459 { 1460 struct dp_display_private *dp_display; 1461 1462 dp_display = container_of(dp, struct dp_display_private, dp_display); 1463 1464 dp_ctrl_push_idle(dp_display->ctrl); 1465 1466 return 0; 1467 } 1468 1469 int msm_dp_display_disable(struct msm_dp *dp, struct drm_encoder *encoder) 1470 { 1471 int rc = 0; 1472 u32 state; 1473 struct dp_display_private *dp_display; 1474 1475 dp_display = container_of(dp, struct dp_display_private, dp_display); 1476 1477 mutex_lock(&dp_display->event_mutex); 1478 1479 /* stop sentinel checking */ 1480 dp_del_event(dp_display, EV_DISCONNECT_PENDING_TIMEOUT); 1481 1482 dp_display_disable(dp_display, 0); 1483 1484 rc = dp_display_unprepare(dp); 1485 if (rc) 1486 DRM_ERROR("DP display unprepare failed, rc=%d\n", rc); 1487 1488 state = dp_display->hpd_state; 1489 if (state == ST_DISCONNECT_PENDING) { 1490 /* completed disconnection */ 1491 dp_display->hpd_state = ST_DISCONNECTED; 1492 } else { 1493 dp_display->hpd_state = ST_DISPLAY_OFF; 1494 } 1495 1496 mutex_unlock(&dp_display->event_mutex); 1497 return rc; 1498 } 1499 1500 void msm_dp_display_mode_set(struct msm_dp *dp, struct drm_encoder *encoder, 1501 struct drm_display_mode *mode, 1502 struct drm_display_mode *adjusted_mode) 1503 { 1504 struct dp_display_private *dp_display; 1505 1506 dp_display = container_of(dp, struct dp_display_private, dp_display); 1507 1508 memset(&dp_display->dp_mode, 0x0, sizeof(struct dp_display_mode)); 1509 1510 if (dp_display_check_video_test(dp)) 1511 dp_display->dp_mode.bpp = dp_display_get_test_bpp(dp); 1512 else /* Default num_components per pixel = 3 */ 1513 dp_display->dp_mode.bpp = dp->connector->display_info.bpc * 3; 1514 1515 if (!dp_display->dp_mode.bpp) 1516 dp_display->dp_mode.bpp = 24; /* Default bpp */ 1517 1518 drm_mode_copy(&dp_display->dp_mode.drm_mode, adjusted_mode); 1519 1520 dp_display->dp_mode.v_active_low = 1521 !!(dp_display->dp_mode.drm_mode.flags & DRM_MODE_FLAG_NVSYNC); 1522 1523 dp_display->dp_mode.h_active_low = 1524 !!(dp_display->dp_mode.drm_mode.flags & DRM_MODE_FLAG_NHSYNC); 1525 } 1526