FILE
analogix_dp_core.c
File preview with syntax highlighting.
linux-6.19.14/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
1// SPDX-License-Identifier: GPL-2.0-or-later 2/* 3* Analogix DP (Display Port) core interface driver. 4* 5* Copyright (C) 2012 Samsung Electronics Co., Ltd. 6* Author: Jingoo Han <jg1.han@samsung.com> 7*/ 8 9#include <linux/clk.h> 10#include <linux/component.h> 11#include <linux/err.h> 12#include <linux/export.h> 13#include <linux/gpio/consumer.h> 14#include <linux/interrupt.h> 15#include <linux/io.h> 16#include <linux/iopoll.h> 17#include <linux/module.h> 18#include <linux/of.h> 19#include <linux/phy/phy.h> 20#include <linux/platform_device.h> 21 22#include <drm/bridge/analogix_dp.h> 23#include <drm/drm_atomic.h> 24#include <drm/drm_atomic_helper.h> 25#include <drm/drm_bridge.h> 26#include <drm/drm_crtc.h> 27#include <drm/drm_device.h> 28#include <drm/drm_edid.h> 29#include <drm/drm_panel.h> 30#include <drm/drm_print.h> 31#include <drm/drm_probe_helper.h> 32 33#include "analogix_dp_core.h" 34#include "analogix_dp_reg.h" 35 36#define to_dp(nm) container_of(nm, struct analogix_dp_device, nm) 37 38static const bool verify_fast_training; 39 40static void analogix_dp_init_dp(struct analogix_dp_device *dp) 41{ 42 analogix_dp_reset(dp); 43 44 analogix_dp_swreset(dp); 45 46 analogix_dp_init_analog_param(dp); 47 analogix_dp_init_interrupt(dp); 48 49 /* SW defined function Normal operation */ 50 analogix_dp_enable_sw_function(dp); 51 52 analogix_dp_config_interrupt(dp); 53 54 analogix_dp_init_hpd(dp); 55 analogix_dp_init_aux(dp); 56} 57 58static int analogix_dp_detect_hpd(struct analogix_dp_device *dp) 59{ 60 int timeout_loop = 0; 61 62 while (timeout_loop < DP_TIMEOUT_LOOP_COUNT) { 63 if (analogix_dp_get_plug_in_status(dp) == 0) 64 return 0; 65 66 timeout_loop++; 67 usleep_range(1000, 1100); 68 } 69 70 /* 71 * Some edp screen do not have hpd signal, so we can't just 72 * return failed when hpd plug in detect failed, DT property 73 * "force-hpd" would indicate whether driver need this. 74 */ 75 if (!dp->force_hpd) 76 return -ETIMEDOUT; 77 78 /* 79 * The eDP TRM indicate that if HPD_STATUS(RO) is 0, AUX CH 80 * will not work, so we need to give a force hpd action to 81 * set HPD_STATUS manually. 82 */ 83 dev_dbg(dp->dev, "failed to get hpd plug status, try to force hpd\n"); 84 85 analogix_dp_force_hpd(dp); 86 87 if (analogix_dp_get_plug_in_status(dp) != 0) { 88 dev_err(dp->dev, "failed to get hpd plug in status\n"); 89 return -EINVAL; 90 } 91 92 dev_dbg(dp->dev, "success to get plug in status after force hpd\n"); 93 94 return 0; 95} 96 97static bool analogix_dp_detect_sink_psr(struct analogix_dp_device *dp) 98{ 99 unsigned char psr_version; 100 int ret; 101 102 ret = drm_dp_dpcd_readb(&dp->aux, DP_PSR_SUPPORT, &psr_version); 103 if (ret != 1) { 104 dev_err(dp->dev, "failed to get PSR version, disable it\n"); 105 return false; 106 } 107 108 dev_dbg(dp->dev, "Panel PSR version : %x\n", psr_version); 109 return psr_version & DP_PSR_IS_SUPPORTED; 110} 111 112static int analogix_dp_enable_sink_psr(struct analogix_dp_device *dp) 113{ 114 unsigned char psr_en; 115 int ret; 116 117 /* Disable psr function */ 118 ret = drm_dp_dpcd_readb(&dp->aux, DP_PSR_EN_CFG, &psr_en); 119 if (ret != 1) { 120 dev_err(dp->dev, "failed to get psr config\n"); 121 goto end; 122 } 123 124 psr_en &= ~DP_PSR_ENABLE; 125 ret = drm_dp_dpcd_writeb(&dp->aux, DP_PSR_EN_CFG, psr_en); 126 if (ret != 1) { 127 dev_err(dp->dev, "failed to disable panel psr\n"); 128 goto end; 129 } 130 131 /* Main-Link transmitter remains active during PSR active states */ 132 psr_en = DP_PSR_CRC_VERIFICATION; 133 ret = drm_dp_dpcd_writeb(&dp->aux, DP_PSR_EN_CFG, psr_en); 134 if (ret != 1) { 135 dev_err(dp->dev, "failed to set panel psr\n"); 136 goto end; 137 } 138 139 /* Enable psr function */ 140 psr_en = DP_PSR_ENABLE | DP_PSR_CRC_VERIFICATION; 141 ret = drm_dp_dpcd_writeb(&dp->aux, DP_PSR_EN_CFG, psr_en); 142 if (ret != 1) { 143 dev_err(dp->dev, "failed to set panel psr\n"); 144 goto end; 145 } 146 147 analogix_dp_enable_psr_crc(dp); 148 149 dp->psr_supported = true; 150 151 return 0; 152end: 153 dev_err(dp->dev, "enable psr fail, force to disable psr\n"); 154 155 return ret; 156} 157 158static int 159analogix_dp_enable_rx_to_enhanced_mode(struct analogix_dp_device *dp, 160 bool enable) 161{ 162 u8 data; 163 int ret; 164 165 ret = drm_dp_dpcd_readb(&dp->aux, DP_LANE_COUNT_SET, &data); 166 if (ret != 1) 167 return ret; 168 169 if (enable) 170 ret = drm_dp_dpcd_writeb(&dp->aux, DP_LANE_COUNT_SET, 171 DP_LANE_COUNT_ENHANCED_FRAME_EN | 172 DPCD_LANE_COUNT_SET(data)); 173 else 174 ret = drm_dp_dpcd_writeb(&dp->aux, DP_LANE_COUNT_SET, 175 DPCD_LANE_COUNT_SET(data)); 176 177 return ret < 0 ? ret : 0; 178} 179 180static int analogix_dp_is_enhanced_mode_available(struct analogix_dp_device *dp, 181 u8 *enhanced_mode_support) 182{ 183 u8 data; 184 int ret; 185 186 ret = drm_dp_dpcd_readb(&dp->aux, DP_MAX_LANE_COUNT, &data); 187 if (ret != 1) { 188 *enhanced_mode_support = 0; 189 return ret; 190 } 191 192 *enhanced_mode_support = DPCD_ENHANCED_FRAME_CAP(data); 193 194 return 0; 195} 196 197static int analogix_dp_set_enhanced_mode(struct analogix_dp_device *dp) 198{ 199 u8 data; 200 int ret; 201 202 ret = analogix_dp_is_enhanced_mode_available(dp, &data); 203 if (ret < 0) 204 return ret; 205 206 ret = analogix_dp_enable_rx_to_enhanced_mode(dp, data); 207 if (ret < 0) 208 return ret; 209 210 analogix_dp_enable_enhanced_mode(dp, data); 211 212 return 0; 213} 214 215static int analogix_dp_training_pattern_dis(struct analogix_dp_device *dp) 216{ 217 int ret; 218 219 analogix_dp_set_training_pattern(dp, DP_NONE); 220 221 ret = drm_dp_dpcd_writeb(&dp->aux, DP_TRAINING_PATTERN_SET, 222 DP_TRAINING_PATTERN_DISABLE); 223 224 return ret < 0 ? ret : 0; 225} 226 227static int analogix_dp_link_start(struct analogix_dp_device *dp) 228{ 229 u8 buf[4]; 230 int lane, lane_count, retval; 231 232 lane_count = dp->link_train.lane_count; 233 234 dp->link_train.lt_state = CLOCK_RECOVERY; 235 dp->link_train.eq_loop = 0; 236 237 for (lane = 0; lane < lane_count; lane++) 238 dp->link_train.cr_loop[lane] = 0; 239 240 /* Set link rate and count as you want to establish*/ 241 analogix_dp_set_link_bandwidth(dp, dp->link_train.link_rate); 242 retval = analogix_dp_wait_pll_locked(dp); 243 if (retval) { 244 DRM_DEV_ERROR(dp->dev, "Wait for pll lock failed %d\n", retval); 245 return retval; 246 } 247 /* 248 * MACRO_RST must be applied after the PLL_LOCK to avoid 249 * the DP inter pair skew issue for at least 10 us 250 */ 251 analogix_dp_reset_macro(dp); 252 analogix_dp_set_lane_count(dp, dp->link_train.lane_count); 253 254 /* Setup RX configuration */ 255 buf[0] = dp->link_train.link_rate; 256 buf[1] = dp->link_train.lane_count; 257 retval = drm_dp_dpcd_write(&dp->aux, DP_LINK_BW_SET, buf, 2); 258 if (retval < 0) 259 return retval; 260 /* set enhanced mode if available */ 261 retval = analogix_dp_set_enhanced_mode(dp); 262 if (retval < 0) { 263 dev_err(dp->dev, "failed to set enhance mode\n"); 264 return retval; 265 } 266 267 /* Set TX voltage-swing and pre-emphasis to minimum */ 268 for (lane = 0; lane < lane_count; lane++) 269 dp->link_train.training_lane[lane] = 270 DP_TRAIN_VOLTAGE_SWING_LEVEL_0 | 271 DP_TRAIN_PRE_EMPH_LEVEL_0; 272 analogix_dp_set_lane_link_training(dp); 273 274 /* Set training pattern 1 */ 275 analogix_dp_set_training_pattern(dp, TRAINING_PTN1); 276 277 /* Set RX training pattern */ 278 retval = drm_dp_dpcd_writeb(&dp->aux, DP_TRAINING_PATTERN_SET, 279 DP_LINK_SCRAMBLING_DISABLE | 280 DP_TRAINING_PATTERN_1); 281 if (retval < 0) 282 return retval; 283 284 for (lane = 0; lane < lane_count; lane++) 285 buf[lane] = DP_TRAIN_PRE_EMPH_LEVEL_0 | 286 DP_TRAIN_VOLTAGE_SWING_LEVEL_0; 287 288 retval = drm_dp_dpcd_write(&dp->aux, DP_TRAINING_LANE0_SET, buf, 289 lane_count); 290 if (retval < 0) 291 return retval; 292 293 return 0; 294} 295 296static unsigned char analogix_dp_get_lane_status(u8 link_status[2], int lane) 297{ 298 int shift = (lane & 1) * 4; 299 u8 link_value = link_status[lane >> 1]; 300 301 return (link_value >> shift) & 0xf; 302} 303 304static int analogix_dp_clock_recovery_ok(u8 link_status[2], int lane_count) 305{ 306 int lane; 307 u8 lane_status; 308 309 for (lane = 0; lane < lane_count; lane++) { 310 lane_status = analogix_dp_get_lane_status(link_status, lane); 311 if ((lane_status & DP_LANE_CR_DONE) == 0) 312 return -EINVAL; 313 } 314 return 0; 315} 316 317static int analogix_dp_channel_eq_ok(u8 link_status[2], u8 link_align, 318 int lane_count) 319{ 320 int lane; 321 u8 lane_status; 322 323 if ((link_align & DP_INTERLANE_ALIGN_DONE) == 0) 324 return -EINVAL; 325 326 for (lane = 0; lane < lane_count; lane++) { 327 lane_status = analogix_dp_get_lane_status(link_status, lane); 328 lane_status &= DP_CHANNEL_EQ_BITS; 329 if (lane_status != DP_CHANNEL_EQ_BITS) 330 return -EINVAL; 331 } 332 333 return 0; 334} 335 336static unsigned char 337analogix_dp_get_adjust_request_voltage(u8 adjust_request[2], int lane) 338{ 339 int shift = (lane & 1) * 4; 340 u8 link_value = adjust_request[lane >> 1]; 341 342 return (link_value >> shift) & 0x3; 343} 344 345static unsigned char analogix_dp_get_adjust_request_pre_emphasis( 346 u8 adjust_request[2], 347 int lane) 348{ 349 int shift = (lane & 1) * 4; 350 u8 link_value = adjust_request[lane >> 1]; 351 352 return ((link_value >> shift) & 0xc) >> 2; 353} 354 355static void analogix_dp_reduce_link_rate(struct analogix_dp_device *dp) 356{ 357 analogix_dp_training_pattern_dis(dp); 358 analogix_dp_set_enhanced_mode(dp); 359 360 dp->link_train.lt_state = FAILED; 361} 362 363static void analogix_dp_get_adjust_training_lane(struct analogix_dp_device *dp, 364 u8 adjust_request[2]) 365{ 366 int lane, lane_count; 367 u8 voltage_swing, pre_emphasis, training_lane; 368 369 lane_count = dp->link_train.lane_count; 370 for (lane = 0; lane < lane_count; lane++) { 371 voltage_swing = analogix_dp_get_adjust_request_voltage( 372 adjust_request, lane); 373 pre_emphasis = analogix_dp_get_adjust_request_pre_emphasis( 374 adjust_request, lane); 375 training_lane = DPCD_VOLTAGE_SWING_SET(voltage_swing) | 376 DPCD_PRE_EMPHASIS_SET(pre_emphasis); 377 378 if (voltage_swing == VOLTAGE_LEVEL_3) 379 training_lane |= DP_TRAIN_MAX_SWING_REACHED; 380 if (pre_emphasis == PRE_EMPHASIS_LEVEL_3) 381 training_lane |= DP_TRAIN_MAX_PRE_EMPHASIS_REACHED; 382 383 dp->link_train.training_lane[lane] = training_lane; 384 } 385} 386 387static int analogix_dp_process_clock_recovery(struct analogix_dp_device *dp) 388{ 389 int lane, lane_count, retval; 390 u8 voltage_swing, pre_emphasis, training_lane; 391 u8 link_status[2], adjust_request[2]; 392 393 usleep_range(100, 101); 394 395 lane_count = dp->link_train.lane_count; 396 397 retval = drm_dp_dpcd_read(&dp->aux, DP_LANE0_1_STATUS, link_status, 2); 398 if (retval < 0) 399 return retval; 400 401 if (analogix_dp_clock_recovery_ok(link_status, lane_count) == 0) { 402 /* set training pattern 2 for EQ */ 403 analogix_dp_set_training_pattern(dp, TRAINING_PTN2); 404 405 retval = drm_dp_dpcd_writeb(&dp->aux, DP_TRAINING_PATTERN_SET, 406 DP_LINK_SCRAMBLING_DISABLE | 407 DP_TRAINING_PATTERN_2); 408 if (retval < 0) 409 return retval; 410 411 dev_dbg(dp->dev, "Link Training Clock Recovery success\n"); 412 dp->link_train.lt_state = EQUALIZER_TRAINING; 413 414 return 0; 415 } 416 417 retval = drm_dp_dpcd_read(&dp->aux, DP_ADJUST_REQUEST_LANE0_1, 418 adjust_request, 2); 419 if (retval < 0) 420 return retval; 421 422 for (lane = 0; lane < lane_count; lane++) { 423 training_lane = analogix_dp_get_lane_link_training(dp, lane); 424 voltage_swing = analogix_dp_get_adjust_request_voltage(adjust_request, lane); 425 pre_emphasis = analogix_dp_get_adjust_request_pre_emphasis(adjust_request, lane); 426 427 if (DPCD_VOLTAGE_SWING_GET(training_lane) == voltage_swing && 428 DPCD_PRE_EMPHASIS_GET(training_lane) == pre_emphasis) 429 dp->link_train.cr_loop[lane]++; 430 431 if (dp->link_train.cr_loop[lane] == MAX_CR_LOOP || 432 voltage_swing == VOLTAGE_LEVEL_3 || 433 pre_emphasis == PRE_EMPHASIS_LEVEL_3) { 434 dev_err(dp->dev, "CR Max reached (%d,%d,%d)\n", 435 dp->link_train.cr_loop[lane], 436 voltage_swing, pre_emphasis); 437 analogix_dp_reduce_link_rate(dp); 438 return -EIO; 439 } 440 } 441 442 analogix_dp_get_adjust_training_lane(dp, adjust_request); 443 analogix_dp_set_lane_link_training(dp); 444 445 retval = drm_dp_dpcd_write(&dp->aux, DP_TRAINING_LANE0_SET, 446 dp->link_train.training_lane, lane_count); 447 if (retval < 0) 448 return retval; 449 450 return 0; 451} 452 453static int analogix_dp_process_equalizer_training(struct analogix_dp_device *dp) 454{ 455 int lane_count, retval; 456 u32 reg; 457 u8 link_align, link_status[2], adjust_request[2]; 458 459 usleep_range(400, 401); 460 461 lane_count = dp->link_train.lane_count; 462 463 retval = drm_dp_dpcd_read(&dp->aux, DP_LANE0_1_STATUS, link_status, 2); 464 if (retval < 0) 465 return retval; 466 467 if (analogix_dp_clock_recovery_ok(link_status, lane_count)) { 468 analogix_dp_reduce_link_rate(dp); 469 return -EIO; 470 } 471 472 retval = drm_dp_dpcd_read(&dp->aux, DP_ADJUST_REQUEST_LANE0_1, 473 adjust_request, 2); 474 if (retval < 0) 475 return retval; 476 477 retval = drm_dp_dpcd_readb(&dp->aux, DP_LANE_ALIGN_STATUS_UPDATED, 478 &link_align); 479 if (retval < 0) 480 return retval; 481 482 analogix_dp_get_adjust_training_lane(dp, adjust_request); 483 484 if (!analogix_dp_channel_eq_ok(link_status, link_align, lane_count)) { 485 /* traing pattern Set to Normal */ 486 retval = analogix_dp_training_pattern_dis(dp); 487 if (retval < 0) 488 return retval; 489 490 dev_dbg(dp->dev, "Link Training success!\n"); 491 analogix_dp_get_link_bandwidth(dp, ®); 492 dp->link_train.link_rate = reg; 493 dev_dbg(dp->dev, "final bandwidth = %.2x\n", 494 dp->link_train.link_rate); 495 496 analogix_dp_get_lane_count(dp, ®); 497 dp->link_train.lane_count = reg; 498 dev_dbg(dp->dev, "final lane count = %.2x\n", 499 dp->link_train.lane_count); 500 501 dp->link_train.lt_state = FINISHED; 502 503 return 0; 504 } 505 506 /* not all locked */ 507 dp->link_train.eq_loop++; 508 509 if (dp->link_train.eq_loop > MAX_EQ_LOOP) { 510 dev_err(dp->dev, "EQ Max loop\n"); 511 analogix_dp_reduce_link_rate(dp); 512 return -EIO; 513 } 514 515 analogix_dp_set_lane_link_training(dp); 516 517 retval = drm_dp_dpcd_write(&dp->aux, DP_TRAINING_LANE0_SET, 518 dp->link_train.training_lane, lane_count); 519 if (retval < 0) 520 return retval; 521 522 return 0; 523} 524 525static void analogix_dp_get_max_rx_bandwidth(struct analogix_dp_device *dp, 526 u8 *bandwidth) 527{ 528 u8 data; 529 530 /* 531 * For DP rev.1.1, Maximum link rate of Main Link lanes 532 * 0x06 = 1.62 Gbps, 0x0a = 2.7 Gbps 533 * For DP rev.1.2, Maximum link rate of Main Link lanes 534 * 0x06 = 1.62 Gbps, 0x0a = 2.7 Gbps, 0x14 = 5.4Gbps 535 */ 536 drm_dp_dpcd_readb(&dp->aux, DP_MAX_LINK_RATE, &data); 537 *bandwidth = data; 538} 539 540static void analogix_dp_get_max_rx_lane_count(struct analogix_dp_device *dp, 541 u8 *lane_count) 542{ 543 u8 data; 544 545 /* 546 * For DP rev.1.1, Maximum number of Main Link lanes 547 * 0x01 = 1 lane, 0x02 = 2 lanes, 0x04 = 4 lanes 548 */ 549 drm_dp_dpcd_readb(&dp->aux, DP_MAX_LANE_COUNT, &data); 550 *lane_count = DPCD_MAX_LANE_COUNT(data); 551} 552 553static int analogix_dp_full_link_train(struct analogix_dp_device *dp, 554 u32 max_lanes, u32 max_rate) 555{ 556 int retval = 0; 557 bool training_finished = false; 558 559 /* Initialize by reading RX's DPCD */ 560 analogix_dp_get_max_rx_bandwidth(dp, &dp->link_train.link_rate); 561 analogix_dp_get_max_rx_lane_count(dp, &dp->link_train.lane_count); 562 563 if ((dp->link_train.link_rate != DP_LINK_BW_1_62) && 564 (dp->link_train.link_rate != DP_LINK_BW_2_7) && 565 (dp->link_train.link_rate != DP_LINK_BW_5_4)) { 566 dev_err(dp->dev, "Rx Max Link Rate is abnormal :%x !\n", 567 dp->link_train.link_rate); 568 dp->link_train.link_rate = DP_LINK_BW_1_62; 569 } 570 571 if (dp->link_train.lane_count == 0) { 572 dev_err(dp->dev, "Rx Max Lane count is abnormal :%x !\n", 573 dp->link_train.lane_count); 574 dp->link_train.lane_count = (u8)LANE_COUNT1; 575 } 576 577 /* Setup TX lane count & rate */ 578 if (dp->link_train.lane_count > max_lanes) 579 dp->link_train.lane_count = max_lanes; 580 if (dp->link_train.link_rate > max_rate) 581 dp->link_train.link_rate = max_rate; 582 583 /* All DP analog module power up */ 584 analogix_dp_set_analog_power_down(dp, POWER_ALL, 0); 585 586 dp->link_train.lt_state = START; 587 588 /* Process here */ 589 while (!retval && !training_finished) { 590 switch (dp->link_train.lt_state) { 591 case START: 592 retval = analogix_dp_link_start(dp); 593 if (retval) 594 dev_err(dp->dev, "LT link start failed!\n"); 595 break; 596 case CLOCK_RECOVERY: 597 retval = analogix_dp_process_clock_recovery(dp); 598 if (retval) 599 dev_err(dp->dev, "LT CR failed!\n"); 600 break; 601 case EQUALIZER_TRAINING: 602 retval = analogix_dp_process_equalizer_training(dp); 603 if (retval) 604 dev_err(dp->dev, "LT EQ failed!\n"); 605 break; 606 case FINISHED: 607 training_finished = 1; 608 break; 609 case FAILED: 610 return -EREMOTEIO; 611 } 612 } 613 if (retval) 614 dev_err(dp->dev, "eDP link training failed (%d)\n", retval); 615 616 return retval; 617} 618 619static int analogix_dp_fast_link_train(struct analogix_dp_device *dp) 620{ 621 int ret; 622 u8 link_align, link_status[2]; 623 624 analogix_dp_set_link_bandwidth(dp, dp->link_train.link_rate); 625 ret = analogix_dp_wait_pll_locked(dp); 626 if (ret) { 627 DRM_DEV_ERROR(dp->dev, "Wait for pll lock failed %d\n", ret); 628 return ret; 629 } 630 631 /* 632 * MACRO_RST must be applied after the PLL_LOCK to avoid 633 * the DP inter pair skew issue for at least 10 us 634 */ 635 analogix_dp_reset_macro(dp); 636 analogix_dp_set_lane_count(dp, dp->link_train.lane_count); 637 analogix_dp_set_lane_link_training(dp); 638 639 /* source Set training pattern 1 */ 640 analogix_dp_set_training_pattern(dp, TRAINING_PTN1); 641 /* From DP spec, pattern must be on-screen for a minimum 500us */ 642 usleep_range(500, 600); 643 644 analogix_dp_set_training_pattern(dp, TRAINING_PTN2); 645 /* From DP spec, pattern must be on-screen for a minimum 500us */ 646 usleep_range(500, 600); 647 648 /* TODO: enhanced_mode?*/ 649 analogix_dp_set_training_pattern(dp, DP_NONE); 650 651 /* 652 * Useful for debugging issues with fast link training, disable for more 653 * speed 654 */ 655 if (verify_fast_training) { 656 ret = drm_dp_dpcd_readb(&dp->aux, DP_LANE_ALIGN_STATUS_UPDATED, 657 &link_align); 658 if (ret < 0) { 659 DRM_DEV_ERROR(dp->dev, "Read align status failed %d\n", 660 ret); 661 return ret; 662 } 663 664 ret = drm_dp_dpcd_read(&dp->aux, DP_LANE0_1_STATUS, link_status, 665 2); 666 if (ret < 0) { 667 DRM_DEV_ERROR(dp->dev, "Read link status failed %d\n", 668 ret); 669 return ret; 670 } 671 672 if (analogix_dp_clock_recovery_ok(link_status, 673 dp->link_train.lane_count)) { 674 DRM_DEV_ERROR(dp->dev, "Clock recovery failed\n"); 675 analogix_dp_reduce_link_rate(dp); 676 return -EIO; 677 } 678 679 if (analogix_dp_channel_eq_ok(link_status, link_align, 680 dp->link_train.lane_count)) { 681 DRM_DEV_ERROR(dp->dev, "Channel EQ failed\n"); 682 analogix_dp_reduce_link_rate(dp); 683 return -EIO; 684 } 685 } 686 687 return 0; 688} 689 690static int analogix_dp_train_link(struct analogix_dp_device *dp) 691{ 692 if (dp->fast_train_enable) 693 return analogix_dp_fast_link_train(dp); 694 695 return analogix_dp_full_link_train(dp, dp->video_info.max_lane_count, 696 dp->video_info.max_link_rate); 697} 698 699static int analogix_dp_config_video(struct analogix_dp_device *dp) 700{ 701 int timeout_loop = 0; 702 int done_count = 0; 703 704 analogix_dp_config_video_slave_mode(dp); 705 706 analogix_dp_set_video_color_format(dp); 707 708 for (;;) { 709 timeout_loop++; 710 if (analogix_dp_is_slave_video_stream_clock_on(dp) == 0) 711 break; 712 if (timeout_loop > DP_TIMEOUT_LOOP_COUNT) { 713 dev_err(dp->dev, "Timeout of slave video streamclk ok\n"); 714 return -ETIMEDOUT; 715 } 716 usleep_range(1000, 1001); 717 } 718 719 /* Set to use the register calculated M/N video */ 720 analogix_dp_set_video_cr_mn(dp, CALCULATED_M, 0, 0); 721 722 /* For video bist, Video timing must be generated by register */ 723 analogix_dp_set_video_timing_mode(dp, VIDEO_TIMING_FROM_CAPTURE); 724 725 /* Disable video mute */ 726 analogix_dp_enable_video_mute(dp, 0); 727 728 /* Configure video slave mode */ 729 analogix_dp_enable_video_master(dp, 0); 730 731 /* Enable video */ 732 analogix_dp_start_video(dp); 733 734 timeout_loop = 0; 735 736 for (;;) { 737 timeout_loop++; 738 if (analogix_dp_is_video_stream_on(dp) == 0) { 739 done_count++; 740 if (done_count > 10) 741 break; 742 } else if (done_count) { 743 done_count = 0; 744 } 745 if (timeout_loop > DP_TIMEOUT_LOOP_COUNT) { 746 dev_warn(dp->dev, 747 "Ignoring timeout of video streamclk ok\n"); 748 break; 749 } 750 751 usleep_range(1000, 1001); 752 } 753 754 return 0; 755} 756 757static int analogix_dp_enable_scramble(struct analogix_dp_device *dp, 758 bool enable) 759{ 760 u8 data; 761 int ret; 762 763 if (enable) { 764 analogix_dp_enable_scrambling(dp); 765 766 ret = drm_dp_dpcd_readb(&dp->aux, DP_TRAINING_PATTERN_SET, 767 &data); 768 if (ret != 1) 769 return ret; 770 ret = drm_dp_dpcd_writeb(&dp->aux, DP_TRAINING_PATTERN_SET, 771 (u8)(data & ~DP_LINK_SCRAMBLING_DISABLE)); 772 } else { 773 analogix_dp_disable_scrambling(dp); 774 775 ret = drm_dp_dpcd_readb(&dp->aux, DP_TRAINING_PATTERN_SET, 776 &data); 777 if (ret != 1) 778 return ret; 779 ret = drm_dp_dpcd_writeb(&dp->aux, DP_TRAINING_PATTERN_SET, 780 (u8)(data | DP_LINK_SCRAMBLING_DISABLE)); 781 } 782 return ret < 0 ? ret : 0; 783} 784 785static irqreturn_t analogix_dp_hardirq(int irq, void *arg) 786{ 787 struct analogix_dp_device *dp = arg; 788 irqreturn_t ret = IRQ_NONE; 789 enum dp_irq_type irq_type; 790 791 irq_type = analogix_dp_get_irq_type(dp); 792 if (irq_type != DP_IRQ_TYPE_UNKNOWN) { 793 analogix_dp_mute_hpd_interrupt(dp); 794 ret = IRQ_WAKE_THREAD; 795 } 796 797 return ret; 798} 799 800static irqreturn_t analogix_dp_irq_thread(int irq, void *arg) 801{ 802 struct analogix_dp_device *dp = arg; 803 enum dp_irq_type irq_type; 804 805 irq_type = analogix_dp_get_irq_type(dp); 806 if (irq_type & DP_IRQ_TYPE_HP_CABLE_IN || 807 irq_type & DP_IRQ_TYPE_HP_CABLE_OUT) { 808 dev_dbg(dp->dev, "Detected cable status changed!\n"); 809 if (dp->drm_dev) 810 drm_helper_hpd_irq_event(dp->drm_dev); 811 } 812 813 if (irq_type != DP_IRQ_TYPE_UNKNOWN) { 814 analogix_dp_clear_hotplug_interrupts(dp); 815 analogix_dp_unmute_hpd_interrupt(dp); 816 } 817 818 return IRQ_HANDLED; 819} 820 821static int analogix_dp_fast_link_train_detection(struct analogix_dp_device *dp) 822{ 823 int ret; 824 u8 spread; 825 826 ret = drm_dp_dpcd_readb(&dp->aux, DP_MAX_DOWNSPREAD, &spread); 827 if (ret != 1) { 828 dev_err(dp->dev, "failed to read downspread %d\n", ret); 829 return ret; 830 } 831 dp->fast_train_enable = !!(spread & DP_NO_AUX_HANDSHAKE_LINK_TRAINING); 832 dev_dbg(dp->dev, "fast link training %s\n", 833 dp->fast_train_enable ? "supported" : "unsupported"); 834 return 0; 835} 836 837static int analogix_dp_commit(struct analogix_dp_device *dp) 838{ 839 int ret; 840 841 /* Keep the panel disabled while we configure video */ 842 drm_panel_disable(dp->plat_data->panel); 843 844 ret = analogix_dp_train_link(dp); 845 if (ret) { 846 dev_err(dp->dev, "unable to do link train, ret=%d\n", ret); 847 return ret; 848 } 849 850 ret = analogix_dp_enable_scramble(dp, 1); 851 if (ret < 0) { 852 dev_err(dp->dev, "can not enable scramble\n"); 853 return ret; 854 } 855 856 analogix_dp_init_video(dp); 857 ret = analogix_dp_config_video(dp); 858 if (ret) { 859 dev_err(dp->dev, "unable to config video\n"); 860 return ret; 861 } 862 863 /* Safe to enable the panel now */ 864 drm_panel_enable(dp->plat_data->panel); 865 866 /* Check whether panel supports fast training */ 867 ret = analogix_dp_fast_link_train_detection(dp); 868 if (ret) 869 return ret; 870 871 if (analogix_dp_detect_sink_psr(dp)) { 872 ret = analogix_dp_enable_sink_psr(dp); 873 if (ret) 874 return ret; 875 } 876 877 return ret; 878} 879 880static int analogix_dp_enable_psr(struct analogix_dp_device *dp) 881{ 882 struct dp_sdp psr_vsc; 883 int ret; 884 u8 sink; 885 886 ret = drm_dp_dpcd_readb(&dp->aux, DP_PSR_STATUS, &sink); 887 if (ret != 1) 888 DRM_DEV_ERROR(dp->dev, "Failed to read psr status %d\n", ret); 889 else if (sink == DP_PSR_SINK_ACTIVE_RFB) 890 return 0; 891 892 /* Prepare VSC packet as per EDP 1.4 spec, Table 6.9 */ 893 memset(&psr_vsc, 0, sizeof(psr_vsc)); 894 psr_vsc.sdp_header.HB0 = 0; 895 psr_vsc.sdp_header.HB1 = 0x7; 896 psr_vsc.sdp_header.HB2 = 0x2; 897 psr_vsc.sdp_header.HB3 = 0x8; 898 psr_vsc.db[0] = 0; 899 psr_vsc.db[1] = EDP_VSC_PSR_STATE_ACTIVE | EDP_VSC_PSR_CRC_VALUES_VALID; 900 901 ret = analogix_dp_send_psr_spd(dp, &psr_vsc, true); 902 if (!ret) 903 analogix_dp_set_analog_power_down(dp, POWER_ALL, true); 904 905 return ret; 906} 907 908static int analogix_dp_disable_psr(struct analogix_dp_device *dp) 909{ 910 struct dp_sdp psr_vsc; 911 int ret; 912 u8 sink; 913 914 analogix_dp_set_analog_power_down(dp, POWER_ALL, false); 915 916 ret = drm_dp_dpcd_writeb(&dp->aux, DP_SET_POWER, DP_SET_POWER_D0); 917 if (ret != 1) { 918 DRM_DEV_ERROR(dp->dev, "Failed to set DP Power0 %d\n", ret); 919 return ret; 920 } 921 922 ret = drm_dp_dpcd_readb(&dp->aux, DP_PSR_STATUS, &sink); 923 if (ret != 1) { 924 DRM_DEV_ERROR(dp->dev, "Failed to read psr status %d\n", ret); 925 return ret; 926 } else if (sink == DP_PSR_SINK_INACTIVE) { 927 DRM_DEV_ERROR(dp->dev, "sink inactive, skip disable psr"); 928 return 0; 929 } 930 931 ret = analogix_dp_train_link(dp); 932 if (ret) { 933 DRM_DEV_ERROR(dp->dev, "Failed to train the link %d\n", ret); 934 return ret; 935 } 936 937 /* Prepare VSC packet as per EDP 1.4 spec, Table 6.9 */ 938 memset(&psr_vsc, 0, sizeof(psr_vsc)); 939 psr_vsc.sdp_header.HB0 = 0; 940 psr_vsc.sdp_header.HB1 = 0x7; 941 psr_vsc.sdp_header.HB2 = 0x2; 942 psr_vsc.sdp_header.HB3 = 0x8; 943 944 psr_vsc.db[0] = 0; 945 psr_vsc.db[1] = 0; 946 947 return analogix_dp_send_psr_spd(dp, &psr_vsc, true); 948} 949 950static int analogix_dp_get_modes(struct drm_connector *connector) 951{ 952 struct analogix_dp_device *dp = to_dp(connector); 953 const struct drm_edid *drm_edid; 954 int num_modes = 0; 955 956 if (dp->plat_data->panel) { 957 num_modes += drm_panel_get_modes(dp->plat_data->panel, connector); 958 } else { 959 drm_edid = drm_edid_read_ddc(connector, &dp->aux.ddc); 960 961 drm_edid_connector_update(&dp->connector, drm_edid); 962 963 if (drm_edid) { 964 num_modes += drm_edid_connector_add_modes(&dp->connector); 965 drm_edid_free(drm_edid); 966 } 967 } 968 969 if (dp->plat_data->get_modes) 970 num_modes += dp->plat_data->get_modes(dp->plat_data, connector); 971 972 return num_modes; 973} 974 975static struct drm_encoder * 976analogix_dp_best_encoder(struct drm_connector *connector) 977{ 978 struct analogix_dp_device *dp = to_dp(connector); 979 980 return dp->encoder; 981} 982 983 984static int analogix_dp_atomic_check(struct drm_connector *connector, 985 struct drm_atomic_state *state) 986{ 987 struct analogix_dp_device *dp = to_dp(connector); 988 struct drm_connector_state *conn_state; 989 struct drm_crtc_state *crtc_state; 990 991 conn_state = drm_atomic_get_new_connector_state(state, connector); 992 if (WARN_ON(!conn_state)) 993 return -ENODEV; 994 995 conn_state->self_refresh_aware = true; 996 997 if (!conn_state->crtc) 998 return 0; 999 1000 crtc_state = drm_atomic_get_new_crtc_state(state, conn_state->crtc); 1001 if (!crtc_state) 1002 return 0; 1003 1004 if (crtc_state->self_refresh_active && !dp->psr_supported) 1005 return -EINVAL; 1006 1007 return 0; 1008} 1009 1010static const struct drm_connector_helper_funcs analogix_dp_connector_helper_funcs = { 1011 .get_modes = analogix_dp_get_modes, 1012 .best_encoder = analogix_dp_best_encoder, 1013 .atomic_check = analogix_dp_atomic_check, 1014}; 1015 1016static enum drm_connector_status 1017analogix_dp_detect(struct drm_connector *connector, bool force) 1018{ 1019 struct analogix_dp_device *dp = to_dp(connector); 1020 enum drm_connector_status status = connector_status_disconnected; 1021 1022 if (dp->plat_data->panel) 1023 return connector_status_connected; 1024 1025 if (!analogix_dp_detect_hpd(dp)) 1026 status = connector_status_connected; 1027 1028 return status; 1029} 1030 1031static const struct drm_connector_funcs analogix_dp_connector_funcs = { 1032 .fill_modes = drm_helper_probe_single_connector_modes, 1033 .detect = analogix_dp_detect, 1034 .destroy = drm_connector_cleanup, 1035 .reset = drm_atomic_helper_connector_reset, 1036 .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state, 1037 .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, 1038}; 1039 1040static int analogix_dp_bridge_attach(struct drm_bridge *bridge, 1041 struct drm_encoder *encoder, 1042 enum drm_bridge_attach_flags flags) 1043{ 1044 struct analogix_dp_device *dp = to_dp(bridge); 1045 struct drm_connector *connector = NULL; 1046 int ret = 0; 1047 1048 if (flags & DRM_BRIDGE_ATTACH_NO_CONNECTOR) { 1049 DRM_ERROR("Fix bridge driver to make connector optional!"); 1050 return -EINVAL; 1051 } 1052 1053 if (!dp->plat_data->skip_connector) { 1054 connector = &dp->connector; 1055 connector->polled = DRM_CONNECTOR_POLL_HPD; 1056 1057 ret = drm_connector_init(dp->drm_dev, connector, 1058 &analogix_dp_connector_funcs, 1059 DRM_MODE_CONNECTOR_eDP); 1060 if (ret) { 1061 DRM_ERROR("Failed to initialize connector with drm\n"); 1062 return ret; 1063 } 1064 1065 drm_connector_helper_add(connector, 1066 &analogix_dp_connector_helper_funcs); 1067 drm_connector_attach_encoder(connector, encoder); 1068 } 1069 1070 /* 1071 * NOTE: the connector registration is implemented in analogix 1072 * platform driver, that to say connector would be exist after 1073 * plat_data->attch return, that's why we record the connector 1074 * point after plat attached. 1075 */ 1076 if (dp->plat_data->attach) { 1077 ret = dp->plat_data->attach(dp->plat_data, bridge, connector); 1078 if (ret) { 1079 DRM_ERROR("Failed at platform attach func\n"); 1080 return ret; 1081 } 1082 } 1083 1084 return 0; 1085} 1086 1087static 1088struct drm_crtc *analogix_dp_get_old_crtc(struct analogix_dp_device *dp, 1089 struct drm_atomic_state *state) 1090{ 1091 struct drm_encoder *encoder = dp->encoder; 1092 struct drm_connector *connector; 1093 struct drm_connector_state *conn_state; 1094 1095 connector = drm_atomic_get_old_connector_for_encoder(state, encoder); 1096 if (!connector) 1097 return NULL; 1098 1099 conn_state = drm_atomic_get_old_connector_state(state, connector); 1100 if (!conn_state) 1101 return NULL; 1102 1103 return conn_state->crtc; 1104} 1105 1106static 1107struct drm_crtc *analogix_dp_get_new_crtc(struct analogix_dp_device *dp, 1108 struct drm_atomic_state *state) 1109{ 1110 struct drm_encoder *encoder = dp->encoder; 1111 struct drm_connector *connector; 1112 struct drm_connector_state *conn_state; 1113 1114 connector = drm_atomic_get_new_connector_for_encoder(state, encoder); 1115 if (!connector) 1116 return NULL; 1117 1118 conn_state = drm_atomic_get_new_connector_state(state, connector); 1119 if (!conn_state) 1120 return NULL; 1121 1122 return conn_state->crtc; 1123} 1124 1125static void analogix_dp_bridge_atomic_pre_enable(struct drm_bridge *bridge, 1126 struct drm_atomic_state *old_state) 1127{ 1128 struct analogix_dp_device *dp = to_dp(bridge); 1129 struct drm_crtc *crtc; 1130 struct drm_crtc_state *old_crtc_state; 1131 1132 crtc = analogix_dp_get_new_crtc(dp, old_state); 1133 if (!crtc) 1134 return; 1135 1136 old_crtc_state = drm_atomic_get_old_crtc_state(old_state, crtc); 1137 /* Don't touch the panel if we're coming back from PSR */ 1138 if (old_crtc_state && old_crtc_state->self_refresh_active) 1139 return; 1140 1141 drm_panel_prepare(dp->plat_data->panel); 1142} 1143 1144static int analogix_dp_set_bridge(struct analogix_dp_device *dp) 1145{ 1146 int ret; 1147 1148 pm_runtime_get_sync(dp->dev); 1149 1150 ret = analogix_dp_init_analog_func(dp); 1151 if (ret) 1152 return ret; 1153 1154 /* 1155 * According to DP spec v1.3 chap 3.5.1.2 Link Training, 1156 * We should first make sure the HPD signal is asserted high by device 1157 * when we want to establish a link with it. 1158 */ 1159 ret = analogix_dp_detect_hpd(dp); 1160 if (ret) { 1161 DRM_ERROR("failed to get hpd single ret = %d\n", ret); 1162 goto out_dp_init; 1163 } 1164 1165 ret = analogix_dp_commit(dp); 1166 if (ret) { 1167 DRM_ERROR("dp commit error, ret = %d\n", ret); 1168 goto out_dp_init; 1169 } 1170 1171 enable_irq(dp->irq); 1172 return 0; 1173 1174out_dp_init: 1175 pm_runtime_put_sync(dp->dev); 1176 1177 return ret; 1178} 1179 1180static void analogix_dp_bridge_atomic_enable(struct drm_bridge *bridge, 1181 struct drm_atomic_state *old_state) 1182{ 1183 struct analogix_dp_device *dp = to_dp(bridge); 1184 struct drm_crtc *crtc; 1185 struct drm_crtc_state *old_crtc_state; 1186 int timeout_loop = 0; 1187 int ret; 1188 1189 crtc = analogix_dp_get_new_crtc(dp, old_state); 1190 if (!crtc) 1191 return; 1192 1193 old_crtc_state = drm_atomic_get_old_crtc_state(old_state, crtc); 1194 /* Not a full enable, just disable PSR and continue */ 1195 if (old_crtc_state && old_crtc_state->self_refresh_active) { 1196 ret = analogix_dp_disable_psr(dp); 1197 if (ret) 1198 DRM_ERROR("Failed to disable psr %d\n", ret); 1199 return; 1200 } 1201 1202 if (dp->dpms_mode == DRM_MODE_DPMS_ON) 1203 return; 1204 1205 while (timeout_loop < MAX_PLL_LOCK_LOOP) { 1206 if (analogix_dp_set_bridge(dp) == 0) { 1207 dp->dpms_mode = DRM_MODE_DPMS_ON; 1208 return; 1209 } 1210 dev_err(dp->dev, "failed to set bridge, retry: %d\n", 1211 timeout_loop); 1212 timeout_loop++; 1213 usleep_range(10, 11); 1214 } 1215 dev_err(dp->dev, "too many times retry set bridge, give it up\n"); 1216} 1217 1218static void analogix_dp_bridge_disable(struct drm_bridge *bridge) 1219{ 1220 struct analogix_dp_device *dp = to_dp(bridge); 1221 1222 if (dp->dpms_mode != DRM_MODE_DPMS_ON) 1223 return; 1224 1225 drm_panel_disable(dp->plat_data->panel); 1226 1227 disable_irq(dp->irq); 1228 1229 analogix_dp_set_analog_power_down(dp, POWER_ALL, 1); 1230 1231 pm_runtime_put_sync(dp->dev); 1232 1233 drm_panel_unprepare(dp->plat_data->panel); 1234 1235 dp->fast_train_enable = false; 1236 dp->psr_supported = false; 1237 dp->dpms_mode = DRM_MODE_DPMS_OFF; 1238} 1239 1240static void analogix_dp_bridge_atomic_disable(struct drm_bridge *bridge, 1241 struct drm_atomic_state *old_state) 1242{ 1243 struct analogix_dp_device *dp = to_dp(bridge); 1244 struct drm_crtc *old_crtc, *new_crtc; 1245 struct drm_crtc_state *old_crtc_state = NULL; 1246 struct drm_crtc_state *new_crtc_state = NULL; 1247 int ret; 1248 1249 new_crtc = analogix_dp_get_new_crtc(dp, old_state); 1250 if (!new_crtc) 1251 goto out; 1252 1253 new_crtc_state = drm_atomic_get_new_crtc_state(old_state, new_crtc); 1254 if (!new_crtc_state) 1255 goto out; 1256 1257 /* Don't do a full disable on PSR transitions */ 1258 if (new_crtc_state->self_refresh_active) 1259 return; 1260 1261out: 1262 old_crtc = analogix_dp_get_old_crtc(dp, old_state); 1263 if (old_crtc) { 1264 old_crtc_state = drm_atomic_get_old_crtc_state(old_state, 1265 old_crtc); 1266 1267 /* When moving from PSR to fully disabled, exit PSR first. */ 1268 if (old_crtc_state && old_crtc_state->self_refresh_active) { 1269 ret = analogix_dp_disable_psr(dp); 1270 if (ret) 1271 DRM_ERROR("Failed to disable psr (%d)\n", ret); 1272 } 1273 } 1274 1275 analogix_dp_bridge_disable(bridge); 1276} 1277 1278static void analogix_dp_bridge_atomic_post_disable(struct drm_bridge *bridge, 1279 struct drm_atomic_state *old_state) 1280{ 1281 struct analogix_dp_device *dp = to_dp(bridge); 1282 struct drm_crtc *crtc; 1283 struct drm_crtc_state *new_crtc_state; 1284 int ret; 1285 1286 crtc = analogix_dp_get_new_crtc(dp, old_state); 1287 if (!crtc) 1288 return; 1289 1290 new_crtc_state = drm_atomic_get_new_crtc_state(old_state, crtc); 1291 if (!new_crtc_state || !new_crtc_state->self_refresh_active) 1292 return; 1293 1294 ret = analogix_dp_enable_psr(dp); 1295 if (ret) 1296 DRM_ERROR("Failed to enable psr (%d)\n", ret); 1297} 1298 1299static void analogix_dp_bridge_mode_set(struct drm_bridge *bridge, 1300 const struct drm_display_mode *orig_mode, 1301 const struct drm_display_mode *mode) 1302{ 1303 struct analogix_dp_device *dp = to_dp(bridge); 1304 struct drm_display_info *display_info = &dp->connector.display_info; 1305 struct video_info *video = &dp->video_info; 1306 struct device_node *dp_node = dp->dev->of_node; 1307 int vic; 1308 1309 /* Input video interlaces & hsync pol & vsync pol */ 1310 video->interlaced = !!(mode->flags & DRM_MODE_FLAG_INTERLACE); 1311 video->v_sync_polarity = !!(mode->flags & DRM_MODE_FLAG_NVSYNC); 1312 video->h_sync_polarity = !!(mode->flags & DRM_MODE_FLAG_NHSYNC); 1313 1314 /* Input video dynamic_range & colorimetry */ 1315 vic = drm_match_cea_mode(mode); 1316 if ((vic == 6) || (vic == 7) || (vic == 21) || (vic == 22) || 1317 (vic == 2) || (vic == 3) || (vic == 17) || (vic == 18)) { 1318 video->dynamic_range = CEA; 1319 video->ycbcr_coeff = COLOR_YCBCR601; 1320 } else if (vic) { 1321 video->dynamic_range = CEA; 1322 video->ycbcr_coeff = COLOR_YCBCR709; 1323 } else { 1324 video->dynamic_range = VESA; 1325 video->ycbcr_coeff = COLOR_YCBCR709; 1326 } 1327 1328 /* Input vide bpc and color_formats */ 1329 switch (display_info->bpc) { 1330 case 12: 1331 video->color_depth = COLOR_12; 1332 break; 1333 case 10: 1334 video->color_depth = COLOR_10; 1335 break; 1336 case 8: 1337 video->color_depth = COLOR_8; 1338 break; 1339 case 6: 1340 video->color_depth = COLOR_6; 1341 break; 1342 default: 1343 video->color_depth = COLOR_8; 1344 break; 1345 } 1346 if (display_info->color_formats & DRM_COLOR_FORMAT_YCBCR444) 1347 video->color_space = COLOR_YCBCR444; 1348 else if (display_info->color_formats & DRM_COLOR_FORMAT_YCBCR422) 1349 video->color_space = COLOR_YCBCR422; 1350 else 1351 video->color_space = COLOR_RGB; 1352 1353 /* 1354 * NOTE: those property parsing code is used for providing backward 1355 * compatibility for samsung platform. 1356 * Due to we used the "of_property_read_u32" interfaces, when this 1357 * property isn't present, the "video_info" can keep the original 1358 * values and wouldn't be modified. 1359 */ 1360 of_property_read_u32(dp_node, "samsung,color-space", 1361 &video->color_space); 1362 of_property_read_u32(dp_node, "samsung,dynamic-range", 1363 &video->dynamic_range); 1364 of_property_read_u32(dp_node, "samsung,ycbcr-coeff", 1365 &video->ycbcr_coeff); 1366 of_property_read_u32(dp_node, "samsung,color-depth", 1367 &video->color_depth); 1368 if (of_property_read_bool(dp_node, "hsync-active-high")) 1369 video->h_sync_polarity = true; 1370 if (of_property_read_bool(dp_node, "vsync-active-high")) 1371 video->v_sync_polarity = true; 1372 if (of_property_read_bool(dp_node, "interlaced")) 1373 video->interlaced = true; 1374} 1375 1376static const struct drm_bridge_funcs analogix_dp_bridge_funcs = { 1377 .atomic_duplicate_state = drm_atomic_helper_bridge_duplicate_state, 1378 .atomic_destroy_state = drm_atomic_helper_bridge_destroy_state, 1379 .atomic_reset = drm_atomic_helper_bridge_reset, 1380 .atomic_pre_enable = analogix_dp_bridge_atomic_pre_enable, 1381 .atomic_enable = analogix_dp_bridge_atomic_enable, 1382 .atomic_disable = analogix_dp_bridge_atomic_disable, 1383 .atomic_post_disable = analogix_dp_bridge_atomic_post_disable, 1384 .mode_set = analogix_dp_bridge_mode_set, 1385 .attach = analogix_dp_bridge_attach, 1386}; 1387 1388static int analogix_dp_dt_parse_pdata(struct analogix_dp_device *dp) 1389{ 1390 struct device_node *dp_node = dp->dev->of_node; 1391 struct video_info *video_info = &dp->video_info; 1392 1393 switch (dp->plat_data->dev_type) { 1394 case RK3288_DP: 1395 case RK3399_EDP: 1396 /* 1397 * Like Rk3288 DisplayPort TRM indicate that "Main link 1398 * containing 4 physical lanes of 2.7/1.62 Gbps/lane". 1399 */ 1400 video_info->max_link_rate = 0x0A; 1401 video_info->max_lane_count = 0x04; 1402 break; 1403 case RK3588_EDP: 1404 video_info->max_link_rate = 0x14; 1405 video_info->max_lane_count = 0x04; 1406 break; 1407 case EXYNOS_DP: 1408 /* 1409 * NOTE: those property parseing code is used for 1410 * providing backward compatibility for samsung platform. 1411 */ 1412 of_property_read_u32(dp_node, "samsung,link-rate", 1413 &video_info->max_link_rate); 1414 of_property_read_u32(dp_node, "samsung,lane-count", 1415 &video_info->max_lane_count); 1416 break; 1417 } 1418 1419 return 0; 1420} 1421 1422static ssize_t analogix_dpaux_transfer(struct drm_dp_aux *aux, 1423 struct drm_dp_aux_msg *msg) 1424{ 1425 struct analogix_dp_device *dp = to_dp(aux); 1426 int ret; 1427 1428 pm_runtime_get_sync(dp->dev); 1429 1430 ret = analogix_dp_detect_hpd(dp); 1431 if (ret) 1432 goto out; 1433 1434 ret = analogix_dp_transfer(dp, msg); 1435out: 1436 pm_runtime_mark_last_busy(dp->dev); 1437 pm_runtime_put_autosuspend(dp->dev); 1438 1439 return ret; 1440} 1441 1442static int analogix_dpaux_wait_hpd_asserted(struct drm_dp_aux *aux, unsigned long wait_us) 1443{ 1444 struct analogix_dp_device *dp = to_dp(aux); 1445 int val; 1446 int ret; 1447 1448 if (dp->force_hpd) 1449 return 0; 1450 1451 pm_runtime_get_sync(dp->dev); 1452 1453 ret = readx_poll_timeout(analogix_dp_get_plug_in_status, dp, val, !val, 1454 wait_us / 100, wait_us); 1455 1456 pm_runtime_mark_last_busy(dp->dev); 1457 pm_runtime_put_autosuspend(dp->dev); 1458 1459 return ret; 1460} 1461 1462struct analogix_dp_device * 1463analogix_dp_probe(struct device *dev, struct analogix_dp_plat_data *plat_data) 1464{ 1465 struct platform_device *pdev = to_platform_device(dev); 1466 struct analogix_dp_device *dp; 1467 unsigned int irq_flags; 1468 int ret; 1469 1470 if (!plat_data) { 1471 dev_err(dev, "Invalided input plat_data\n"); 1472 return ERR_PTR(-EINVAL); 1473 } 1474 1475 dp = devm_drm_bridge_alloc(dev, struct analogix_dp_device, bridge, 1476 &analogix_dp_bridge_funcs); 1477 if (IS_ERR(dp)) 1478 return ERR_CAST(dp); 1479 1480 dp->dev = &pdev->dev; 1481 dp->dpms_mode = DRM_MODE_DPMS_OFF; 1482 1483 /* 1484 * platform dp driver need containor_of the plat_data to get 1485 * the driver private data, so we need to store the point of 1486 * plat_data, not the context of plat_data. 1487 */ 1488 dp->plat_data = plat_data; 1489 1490 ret = analogix_dp_dt_parse_pdata(dp); 1491 if (ret) 1492 return ERR_PTR(ret); 1493 1494 dp->phy = devm_phy_get(dp->dev, "dp"); 1495 if (IS_ERR(dp->phy)) { 1496 dev_err(dp->dev, "no DP phy configured\n"); 1497 ret = PTR_ERR(dp->phy); 1498 if (ret) { 1499 /* 1500 * phy itself is not enabled, so we can move forward 1501 * assigning NULL to phy pointer. 1502 */ 1503 if (ret == -ENOSYS || ret == -ENODEV) 1504 dp->phy = NULL; 1505 else 1506 return ERR_PTR(ret); 1507 } 1508 } 1509 1510 dp->clock = devm_clk_get(&pdev->dev, "dp"); 1511 if (IS_ERR(dp->clock)) { 1512 dev_err(&pdev->dev, "failed to get clock\n"); 1513 return ERR_CAST(dp->clock); 1514 } 1515 1516 dp->reg_base = devm_platform_ioremap_resource(pdev, 0); 1517 if (IS_ERR(dp->reg_base)) 1518 return ERR_CAST(dp->reg_base); 1519 1520 dp->force_hpd = of_property_read_bool(dev->of_node, "force-hpd"); 1521 1522 /* Try two different names */ 1523 dp->hpd_gpiod = devm_gpiod_get_optional(dev, "hpd", GPIOD_IN); 1524 if (!dp->hpd_gpiod) 1525 dp->hpd_gpiod = devm_gpiod_get_optional(dev, "samsung,hpd", 1526 GPIOD_IN); 1527 if (IS_ERR(dp->hpd_gpiod)) { 1528 dev_err(dev, "error getting HDP GPIO: %ld\n", 1529 PTR_ERR(dp->hpd_gpiod)); 1530 return ERR_CAST(dp->hpd_gpiod); 1531 } 1532 1533 if (dp->hpd_gpiod) { 1534 /* 1535 * Set up the hotplug GPIO from the device tree as an interrupt. 1536 * Simply specifying a different interrupt in the device tree 1537 * doesn't work since we handle hotplug rather differently when 1538 * using a GPIO. We also need the actual GPIO specifier so 1539 * that we can get the current state of the GPIO. 1540 */ 1541 dp->irq = gpiod_to_irq(dp->hpd_gpiod); 1542 irq_flags = IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING | IRQF_NO_AUTOEN; 1543 } else { 1544 dp->irq = platform_get_irq(pdev, 0); 1545 irq_flags = IRQF_NO_AUTOEN; 1546 } 1547 1548 if (dp->irq == -ENXIO) { 1549 dev_err(&pdev->dev, "failed to get irq\n"); 1550 return ERR_PTR(-ENODEV); 1551 } 1552 1553 ret = devm_request_threaded_irq(&pdev->dev, dp->irq, 1554 analogix_dp_hardirq, 1555 analogix_dp_irq_thread, 1556 irq_flags, "analogix-dp", dp); 1557 if (ret) { 1558 dev_err(&pdev->dev, "failed to request irq\n"); 1559 return ERR_PTR(ret); 1560 } 1561 1562 dp->aux.name = "DP-AUX"; 1563 dp->aux.transfer = analogix_dpaux_transfer; 1564 dp->aux.wait_hpd_asserted = analogix_dpaux_wait_hpd_asserted; 1565 dp->aux.dev = dp->dev; 1566 drm_dp_aux_init(&dp->aux); 1567 1568 pm_runtime_use_autosuspend(dp->dev); 1569 pm_runtime_set_autosuspend_delay(dp->dev, 100); 1570 ret = devm_pm_runtime_enable(dp->dev); 1571 if (ret) 1572 return ERR_PTR(ret); 1573 1574 return dp; 1575} 1576EXPORT_SYMBOL_GPL(analogix_dp_probe); 1577 1578int analogix_dp_suspend(struct analogix_dp_device *dp) 1579{ 1580 phy_power_off(dp->phy); 1581 1582 if (dp->plat_data->power_off) 1583 dp->plat_data->power_off(dp->plat_data); 1584 1585 clk_disable_unprepare(dp->clock); 1586 1587 return 0; 1588} 1589EXPORT_SYMBOL_GPL(analogix_dp_suspend); 1590 1591int analogix_dp_resume(struct analogix_dp_device *dp) 1592{ 1593 int ret; 1594 1595 ret = clk_prepare_enable(dp->clock); 1596 if (ret < 0) { 1597 DRM_ERROR("Failed to prepare_enable the clock clk [%d]\n", ret); 1598 return ret; 1599 } 1600 1601 if (dp->plat_data->power_on) 1602 dp->plat_data->power_on(dp->plat_data); 1603 1604 phy_set_mode(dp->phy, PHY_MODE_DP); 1605 phy_power_on(dp->phy); 1606 1607 analogix_dp_init_dp(dp); 1608 1609 return 0; 1610} 1611EXPORT_SYMBOL_GPL(analogix_dp_resume); 1612 1613int analogix_dp_bind(struct analogix_dp_device *dp, struct drm_device *drm_dev) 1614{ 1615 int ret; 1616 1617 dp->drm_dev = drm_dev; 1618 dp->encoder = dp->plat_data->encoder; 1619 1620 dp->aux.drm_dev = drm_dev; 1621 1622 ret = drm_dp_aux_register(&dp->aux); 1623 if (ret) { 1624 DRM_ERROR("failed to register AUX (%d)\n", ret); 1625 return ret; 1626 } 1627 1628 ret = drm_bridge_attach(dp->encoder, &dp->bridge, NULL, 0); 1629 if (ret) { 1630 DRM_ERROR("failed to create bridge (%d)\n", ret); 1631 goto err_unregister_aux; 1632 } 1633 1634 return 0; 1635 1636err_unregister_aux: 1637 drm_dp_aux_unregister(&dp->aux); 1638 1639 return ret; 1640} 1641EXPORT_SYMBOL_GPL(analogix_dp_bind); 1642 1643void analogix_dp_unbind(struct analogix_dp_device *dp) 1644{ 1645 analogix_dp_bridge_disable(&dp->bridge); 1646 dp->connector.funcs->destroy(&dp->connector); 1647 1648 drm_panel_unprepare(dp->plat_data->panel); 1649 1650 drm_dp_aux_unregister(&dp->aux); 1651} 1652EXPORT_SYMBOL_GPL(analogix_dp_unbind); 1653 1654int analogix_dp_start_crc(struct drm_connector *connector) 1655{ 1656 struct analogix_dp_device *dp = to_dp(connector); 1657 1658 if (!connector->state->crtc) { 1659 DRM_ERROR("Connector %s doesn't currently have a CRTC.\n", 1660 connector->name); 1661 return -EINVAL; 1662 } 1663 1664 return drm_dp_start_crc(&dp->aux, connector->state->crtc); 1665} 1666EXPORT_SYMBOL_GPL(analogix_dp_start_crc); 1667 1668int analogix_dp_stop_crc(struct drm_connector *connector) 1669{ 1670 struct analogix_dp_device *dp = to_dp(connector); 1671 1672 return drm_dp_stop_crc(&dp->aux); 1673} 1674EXPORT_SYMBOL_GPL(analogix_dp_stop_crc); 1675 1676struct analogix_dp_plat_data *analogix_dp_aux_to_plat_data(struct drm_dp_aux *aux) 1677{ 1678 struct analogix_dp_device *dp = to_dp(aux); 1679 1680 return dp->plat_data; 1681} 1682EXPORT_SYMBOL_GPL(analogix_dp_aux_to_plat_data); 1683 1684struct drm_dp_aux *analogix_dp_get_aux(struct analogix_dp_device *dp) 1685{ 1686 return &dp->aux; 1687} 1688EXPORT_SYMBOL_GPL(analogix_dp_get_aux); 1689 1690MODULE_AUTHOR("Jingoo Han <jg1.han@samsung.com>"); 1691MODULE_DESCRIPTION("Analogix DP Core Driver"); 1692MODULE_LICENSE("GPL v2");
~/
Read-only file preview.