0001
0002
0003
0004
0005
0006
0007
0008
0009 #include <linux/clk.h>
0010 #include <linux/component.h>
0011 #include <linux/err.h>
0012 #include <linux/gpio/consumer.h>
0013 #include <linux/interrupt.h>
0014 #include <linux/io.h>
0015 #include <linux/iopoll.h>
0016 #include <linux/module.h>
0017 #include <linux/of.h>
0018 #include <linux/phy/phy.h>
0019 #include <linux/platform_device.h>
0020
0021 #include <drm/bridge/analogix_dp.h>
0022 #include <drm/drm_atomic.h>
0023 #include <drm/drm_atomic_helper.h>
0024 #include <drm/drm_bridge.h>
0025 #include <drm/drm_crtc.h>
0026 #include <drm/drm_device.h>
0027 #include <drm/drm_edid.h>
0028 #include <drm/drm_panel.h>
0029 #include <drm/drm_print.h>
0030 #include <drm/drm_probe_helper.h>
0031
0032 #include "analogix_dp_core.h"
0033 #include "analogix_dp_reg.h"
0034
0035 #define to_dp(nm) container_of(nm, struct analogix_dp_device, nm)
0036
0037 static const bool verify_fast_training;
0038
0039 struct bridge_init {
0040 struct i2c_client *client;
0041 struct device_node *node;
0042 };
0043
0044 static int analogix_dp_init_dp(struct analogix_dp_device *dp)
0045 {
0046 int ret;
0047
0048 analogix_dp_reset(dp);
0049
0050 analogix_dp_swreset(dp);
0051
0052 analogix_dp_init_analog_param(dp);
0053 analogix_dp_init_interrupt(dp);
0054
0055
0056 analogix_dp_enable_sw_function(dp);
0057
0058 analogix_dp_config_interrupt(dp);
0059 ret = analogix_dp_init_analog_func(dp);
0060 if (ret)
0061 return ret;
0062
0063 analogix_dp_init_hpd(dp);
0064 analogix_dp_init_aux(dp);
0065 return 0;
0066 }
0067
0068 static int analogix_dp_detect_hpd(struct analogix_dp_device *dp)
0069 {
0070 int timeout_loop = 0;
0071
0072 while (timeout_loop < DP_TIMEOUT_LOOP_COUNT) {
0073 if (analogix_dp_get_plug_in_status(dp) == 0)
0074 return 0;
0075
0076 timeout_loop++;
0077 usleep_range(1000, 1100);
0078 }
0079
0080
0081
0082
0083
0084
0085 if (!dp->force_hpd)
0086 return -ETIMEDOUT;
0087
0088
0089
0090
0091
0092
0093 dev_dbg(dp->dev, "failed to get hpd plug status, try to force hpd\n");
0094
0095 analogix_dp_force_hpd(dp);
0096
0097 if (analogix_dp_get_plug_in_status(dp) != 0) {
0098 dev_err(dp->dev, "failed to get hpd plug in status\n");
0099 return -EINVAL;
0100 }
0101
0102 dev_dbg(dp->dev, "success to get plug in status after force hpd\n");
0103
0104 return 0;
0105 }
0106
0107 static bool analogix_dp_detect_sink_psr(struct analogix_dp_device *dp)
0108 {
0109 unsigned char psr_version;
0110 int ret;
0111
0112 ret = drm_dp_dpcd_readb(&dp->aux, DP_PSR_SUPPORT, &psr_version);
0113 if (ret != 1) {
0114 dev_err(dp->dev, "failed to get PSR version, disable it\n");
0115 return false;
0116 }
0117
0118 dev_dbg(dp->dev, "Panel PSR version : %x\n", psr_version);
0119 return psr_version & DP_PSR_IS_SUPPORTED;
0120 }
0121
0122 static int analogix_dp_enable_sink_psr(struct analogix_dp_device *dp)
0123 {
0124 unsigned char psr_en;
0125 int ret;
0126
0127
0128 ret = drm_dp_dpcd_readb(&dp->aux, DP_PSR_EN_CFG, &psr_en);
0129 if (ret != 1) {
0130 dev_err(dp->dev, "failed to get psr config\n");
0131 goto end;
0132 }
0133
0134 psr_en &= ~DP_PSR_ENABLE;
0135 ret = drm_dp_dpcd_writeb(&dp->aux, DP_PSR_EN_CFG, psr_en);
0136 if (ret != 1) {
0137 dev_err(dp->dev, "failed to disable panel psr\n");
0138 goto end;
0139 }
0140
0141
0142 psr_en = DP_PSR_CRC_VERIFICATION;
0143 ret = drm_dp_dpcd_writeb(&dp->aux, DP_PSR_EN_CFG, psr_en);
0144 if (ret != 1) {
0145 dev_err(dp->dev, "failed to set panel psr\n");
0146 goto end;
0147 }
0148
0149
0150 psr_en = DP_PSR_ENABLE | DP_PSR_CRC_VERIFICATION;
0151 ret = drm_dp_dpcd_writeb(&dp->aux, DP_PSR_EN_CFG, psr_en);
0152 if (ret != 1) {
0153 dev_err(dp->dev, "failed to set panel psr\n");
0154 goto end;
0155 }
0156
0157 analogix_dp_enable_psr_crc(dp);
0158
0159 dp->psr_supported = true;
0160
0161 return 0;
0162 end:
0163 dev_err(dp->dev, "enable psr fail, force to disable psr\n");
0164
0165 return ret;
0166 }
0167
0168 static int
0169 analogix_dp_enable_rx_to_enhanced_mode(struct analogix_dp_device *dp,
0170 bool enable)
0171 {
0172 u8 data;
0173 int ret;
0174
0175 ret = drm_dp_dpcd_readb(&dp->aux, DP_LANE_COUNT_SET, &data);
0176 if (ret != 1)
0177 return ret;
0178
0179 if (enable)
0180 ret = drm_dp_dpcd_writeb(&dp->aux, DP_LANE_COUNT_SET,
0181 DP_LANE_COUNT_ENHANCED_FRAME_EN |
0182 DPCD_LANE_COUNT_SET(data));
0183 else
0184 ret = drm_dp_dpcd_writeb(&dp->aux, DP_LANE_COUNT_SET,
0185 DPCD_LANE_COUNT_SET(data));
0186
0187 return ret < 0 ? ret : 0;
0188 }
0189
0190 static int analogix_dp_is_enhanced_mode_available(struct analogix_dp_device *dp,
0191 u8 *enhanced_mode_support)
0192 {
0193 u8 data;
0194 int ret;
0195
0196 ret = drm_dp_dpcd_readb(&dp->aux, DP_MAX_LANE_COUNT, &data);
0197 if (ret != 1) {
0198 *enhanced_mode_support = 0;
0199 return ret;
0200 }
0201
0202 *enhanced_mode_support = DPCD_ENHANCED_FRAME_CAP(data);
0203
0204 return 0;
0205 }
0206
0207 static int analogix_dp_set_enhanced_mode(struct analogix_dp_device *dp)
0208 {
0209 u8 data;
0210 int ret;
0211
0212 ret = analogix_dp_is_enhanced_mode_available(dp, &data);
0213 if (ret < 0)
0214 return ret;
0215
0216 ret = analogix_dp_enable_rx_to_enhanced_mode(dp, data);
0217 if (ret < 0)
0218 return ret;
0219
0220 analogix_dp_enable_enhanced_mode(dp, data);
0221
0222 return 0;
0223 }
0224
0225 static int analogix_dp_training_pattern_dis(struct analogix_dp_device *dp)
0226 {
0227 int ret;
0228
0229 analogix_dp_set_training_pattern(dp, DP_NONE);
0230
0231 ret = drm_dp_dpcd_writeb(&dp->aux, DP_TRAINING_PATTERN_SET,
0232 DP_TRAINING_PATTERN_DISABLE);
0233
0234 return ret < 0 ? ret : 0;
0235 }
0236
0237 static void
0238 analogix_dp_set_lane_lane_pre_emphasis(struct analogix_dp_device *dp,
0239 int pre_emphasis, int lane)
0240 {
0241 switch (lane) {
0242 case 0:
0243 analogix_dp_set_lane0_pre_emphasis(dp, pre_emphasis);
0244 break;
0245 case 1:
0246 analogix_dp_set_lane1_pre_emphasis(dp, pre_emphasis);
0247 break;
0248
0249 case 2:
0250 analogix_dp_set_lane2_pre_emphasis(dp, pre_emphasis);
0251 break;
0252
0253 case 3:
0254 analogix_dp_set_lane3_pre_emphasis(dp, pre_emphasis);
0255 break;
0256 }
0257 }
0258
0259 static int analogix_dp_link_start(struct analogix_dp_device *dp)
0260 {
0261 u8 buf[4];
0262 int lane, lane_count, pll_tries, retval;
0263
0264 lane_count = dp->link_train.lane_count;
0265
0266 dp->link_train.lt_state = CLOCK_RECOVERY;
0267 dp->link_train.eq_loop = 0;
0268
0269 for (lane = 0; lane < lane_count; lane++)
0270 dp->link_train.cr_loop[lane] = 0;
0271
0272
0273 analogix_dp_set_link_bandwidth(dp, dp->link_train.link_rate);
0274 analogix_dp_set_lane_count(dp, dp->link_train.lane_count);
0275
0276
0277 buf[0] = dp->link_train.link_rate;
0278 buf[1] = dp->link_train.lane_count;
0279 retval = drm_dp_dpcd_write(&dp->aux, DP_LINK_BW_SET, buf, 2);
0280 if (retval < 0)
0281 return retval;
0282
0283 retval = analogix_dp_set_enhanced_mode(dp);
0284 if (retval < 0) {
0285 dev_err(dp->dev, "failed to set enhance mode\n");
0286 return retval;
0287 }
0288
0289
0290 for (lane = 0; lane < lane_count; lane++)
0291 analogix_dp_set_lane_lane_pre_emphasis(dp,
0292 PRE_EMPHASIS_LEVEL_0, lane);
0293
0294
0295 pll_tries = 0;
0296 while (analogix_dp_get_pll_lock_status(dp) == PLL_UNLOCKED) {
0297 if (pll_tries == DP_TIMEOUT_LOOP_COUNT) {
0298 dev_err(dp->dev, "Wait for PLL lock timed out\n");
0299 return -ETIMEDOUT;
0300 }
0301
0302 pll_tries++;
0303 usleep_range(90, 120);
0304 }
0305
0306
0307 analogix_dp_set_training_pattern(dp, TRAINING_PTN1);
0308
0309
0310 retval = drm_dp_dpcd_writeb(&dp->aux, DP_TRAINING_PATTERN_SET,
0311 DP_LINK_SCRAMBLING_DISABLE |
0312 DP_TRAINING_PATTERN_1);
0313 if (retval < 0)
0314 return retval;
0315
0316 for (lane = 0; lane < lane_count; lane++)
0317 buf[lane] = DP_TRAIN_PRE_EMPH_LEVEL_0 |
0318 DP_TRAIN_VOLTAGE_SWING_LEVEL_0;
0319
0320 retval = drm_dp_dpcd_write(&dp->aux, DP_TRAINING_LANE0_SET, buf,
0321 lane_count);
0322 if (retval < 0)
0323 return retval;
0324
0325 return 0;
0326 }
0327
0328 static unsigned char analogix_dp_get_lane_status(u8 link_status[2], int lane)
0329 {
0330 int shift = (lane & 1) * 4;
0331 u8 link_value = link_status[lane >> 1];
0332
0333 return (link_value >> shift) & 0xf;
0334 }
0335
0336 static int analogix_dp_clock_recovery_ok(u8 link_status[2], int lane_count)
0337 {
0338 int lane;
0339 u8 lane_status;
0340
0341 for (lane = 0; lane < lane_count; lane++) {
0342 lane_status = analogix_dp_get_lane_status(link_status, lane);
0343 if ((lane_status & DP_LANE_CR_DONE) == 0)
0344 return -EINVAL;
0345 }
0346 return 0;
0347 }
0348
0349 static int analogix_dp_channel_eq_ok(u8 link_status[2], u8 link_align,
0350 int lane_count)
0351 {
0352 int lane;
0353 u8 lane_status;
0354
0355 if ((link_align & DP_INTERLANE_ALIGN_DONE) == 0)
0356 return -EINVAL;
0357
0358 for (lane = 0; lane < lane_count; lane++) {
0359 lane_status = analogix_dp_get_lane_status(link_status, lane);
0360 lane_status &= DP_CHANNEL_EQ_BITS;
0361 if (lane_status != DP_CHANNEL_EQ_BITS)
0362 return -EINVAL;
0363 }
0364
0365 return 0;
0366 }
0367
0368 static unsigned char
0369 analogix_dp_get_adjust_request_voltage(u8 adjust_request[2], int lane)
0370 {
0371 int shift = (lane & 1) * 4;
0372 u8 link_value = adjust_request[lane >> 1];
0373
0374 return (link_value >> shift) & 0x3;
0375 }
0376
0377 static unsigned char analogix_dp_get_adjust_request_pre_emphasis(
0378 u8 adjust_request[2],
0379 int lane)
0380 {
0381 int shift = (lane & 1) * 4;
0382 u8 link_value = adjust_request[lane >> 1];
0383
0384 return ((link_value >> shift) & 0xc) >> 2;
0385 }
0386
0387 static void analogix_dp_set_lane_link_training(struct analogix_dp_device *dp,
0388 u8 training_lane_set, int lane)
0389 {
0390 switch (lane) {
0391 case 0:
0392 analogix_dp_set_lane0_link_training(dp, training_lane_set);
0393 break;
0394 case 1:
0395 analogix_dp_set_lane1_link_training(dp, training_lane_set);
0396 break;
0397
0398 case 2:
0399 analogix_dp_set_lane2_link_training(dp, training_lane_set);
0400 break;
0401
0402 case 3:
0403 analogix_dp_set_lane3_link_training(dp, training_lane_set);
0404 break;
0405 }
0406 }
0407
0408 static unsigned int
0409 analogix_dp_get_lane_link_training(struct analogix_dp_device *dp,
0410 int lane)
0411 {
0412 u32 reg;
0413
0414 switch (lane) {
0415 case 0:
0416 reg = analogix_dp_get_lane0_link_training(dp);
0417 break;
0418 case 1:
0419 reg = analogix_dp_get_lane1_link_training(dp);
0420 break;
0421 case 2:
0422 reg = analogix_dp_get_lane2_link_training(dp);
0423 break;
0424 case 3:
0425 reg = analogix_dp_get_lane3_link_training(dp);
0426 break;
0427 default:
0428 WARN_ON(1);
0429 return 0;
0430 }
0431
0432 return reg;
0433 }
0434
0435 static void analogix_dp_reduce_link_rate(struct analogix_dp_device *dp)
0436 {
0437 analogix_dp_training_pattern_dis(dp);
0438 analogix_dp_set_enhanced_mode(dp);
0439
0440 dp->link_train.lt_state = FAILED;
0441 }
0442
0443 static void analogix_dp_get_adjust_training_lane(struct analogix_dp_device *dp,
0444 u8 adjust_request[2])
0445 {
0446 int lane, lane_count;
0447 u8 voltage_swing, pre_emphasis, training_lane;
0448
0449 lane_count = dp->link_train.lane_count;
0450 for (lane = 0; lane < lane_count; lane++) {
0451 voltage_swing = analogix_dp_get_adjust_request_voltage(
0452 adjust_request, lane);
0453 pre_emphasis = analogix_dp_get_adjust_request_pre_emphasis(
0454 adjust_request, lane);
0455 training_lane = DPCD_VOLTAGE_SWING_SET(voltage_swing) |
0456 DPCD_PRE_EMPHASIS_SET(pre_emphasis);
0457
0458 if (voltage_swing == VOLTAGE_LEVEL_3)
0459 training_lane |= DP_TRAIN_MAX_SWING_REACHED;
0460 if (pre_emphasis == PRE_EMPHASIS_LEVEL_3)
0461 training_lane |= DP_TRAIN_MAX_PRE_EMPHASIS_REACHED;
0462
0463 dp->link_train.training_lane[lane] = training_lane;
0464 }
0465 }
0466
0467 static int analogix_dp_process_clock_recovery(struct analogix_dp_device *dp)
0468 {
0469 int lane, lane_count, retval;
0470 u8 voltage_swing, pre_emphasis, training_lane;
0471 u8 link_status[2], adjust_request[2];
0472
0473 usleep_range(100, 101);
0474
0475 lane_count = dp->link_train.lane_count;
0476
0477 retval = drm_dp_dpcd_read(&dp->aux, DP_LANE0_1_STATUS, link_status, 2);
0478 if (retval < 0)
0479 return retval;
0480
0481 retval = drm_dp_dpcd_read(&dp->aux, DP_ADJUST_REQUEST_LANE0_1,
0482 adjust_request, 2);
0483 if (retval < 0)
0484 return retval;
0485
0486 if (analogix_dp_clock_recovery_ok(link_status, lane_count) == 0) {
0487
0488 analogix_dp_set_training_pattern(dp, TRAINING_PTN2);
0489
0490 retval = drm_dp_dpcd_writeb(&dp->aux, DP_TRAINING_PATTERN_SET,
0491 DP_LINK_SCRAMBLING_DISABLE |
0492 DP_TRAINING_PATTERN_2);
0493 if (retval < 0)
0494 return retval;
0495
0496 dev_dbg(dp->dev, "Link Training Clock Recovery success\n");
0497 dp->link_train.lt_state = EQUALIZER_TRAINING;
0498 } else {
0499 for (lane = 0; lane < lane_count; lane++) {
0500 training_lane = analogix_dp_get_lane_link_training(
0501 dp, lane);
0502 voltage_swing = analogix_dp_get_adjust_request_voltage(
0503 adjust_request, lane);
0504 pre_emphasis = analogix_dp_get_adjust_request_pre_emphasis(
0505 adjust_request, lane);
0506
0507 if (DPCD_VOLTAGE_SWING_GET(training_lane) ==
0508 voltage_swing &&
0509 DPCD_PRE_EMPHASIS_GET(training_lane) ==
0510 pre_emphasis)
0511 dp->link_train.cr_loop[lane]++;
0512
0513 if (dp->link_train.cr_loop[lane] == MAX_CR_LOOP ||
0514 voltage_swing == VOLTAGE_LEVEL_3 ||
0515 pre_emphasis == PRE_EMPHASIS_LEVEL_3) {
0516 dev_err(dp->dev, "CR Max reached (%d,%d,%d)\n",
0517 dp->link_train.cr_loop[lane],
0518 voltage_swing, pre_emphasis);
0519 analogix_dp_reduce_link_rate(dp);
0520 return -EIO;
0521 }
0522 }
0523 }
0524
0525 analogix_dp_get_adjust_training_lane(dp, adjust_request);
0526
0527 for (lane = 0; lane < lane_count; lane++)
0528 analogix_dp_set_lane_link_training(dp,
0529 dp->link_train.training_lane[lane], lane);
0530
0531 retval = drm_dp_dpcd_write(&dp->aux, DP_TRAINING_LANE0_SET,
0532 dp->link_train.training_lane, lane_count);
0533 if (retval < 0)
0534 return retval;
0535
0536 return 0;
0537 }
0538
0539 static int analogix_dp_process_equalizer_training(struct analogix_dp_device *dp)
0540 {
0541 int lane, lane_count, retval;
0542 u32 reg;
0543 u8 link_align, link_status[2], adjust_request[2];
0544
0545 usleep_range(400, 401);
0546
0547 lane_count = dp->link_train.lane_count;
0548
0549 retval = drm_dp_dpcd_read(&dp->aux, DP_LANE0_1_STATUS, link_status, 2);
0550 if (retval < 0)
0551 return retval;
0552
0553 if (analogix_dp_clock_recovery_ok(link_status, lane_count)) {
0554 analogix_dp_reduce_link_rate(dp);
0555 return -EIO;
0556 }
0557
0558 retval = drm_dp_dpcd_read(&dp->aux, DP_ADJUST_REQUEST_LANE0_1,
0559 adjust_request, 2);
0560 if (retval < 0)
0561 return retval;
0562
0563 retval = drm_dp_dpcd_readb(&dp->aux, DP_LANE_ALIGN_STATUS_UPDATED,
0564 &link_align);
0565 if (retval < 0)
0566 return retval;
0567
0568 analogix_dp_get_adjust_training_lane(dp, adjust_request);
0569
0570 if (!analogix_dp_channel_eq_ok(link_status, link_align, lane_count)) {
0571
0572 retval = analogix_dp_training_pattern_dis(dp);
0573 if (retval < 0)
0574 return retval;
0575
0576 dev_dbg(dp->dev, "Link Training success!\n");
0577 analogix_dp_get_link_bandwidth(dp, ®);
0578 dp->link_train.link_rate = reg;
0579 dev_dbg(dp->dev, "final bandwidth = %.2x\n",
0580 dp->link_train.link_rate);
0581
0582 analogix_dp_get_lane_count(dp, ®);
0583 dp->link_train.lane_count = reg;
0584 dev_dbg(dp->dev, "final lane count = %.2x\n",
0585 dp->link_train.lane_count);
0586
0587 dp->link_train.lt_state = FINISHED;
0588
0589 return 0;
0590 }
0591
0592
0593 dp->link_train.eq_loop++;
0594
0595 if (dp->link_train.eq_loop > MAX_EQ_LOOP) {
0596 dev_err(dp->dev, "EQ Max loop\n");
0597 analogix_dp_reduce_link_rate(dp);
0598 return -EIO;
0599 }
0600
0601 for (lane = 0; lane < lane_count; lane++)
0602 analogix_dp_set_lane_link_training(dp,
0603 dp->link_train.training_lane[lane], lane);
0604
0605 retval = drm_dp_dpcd_write(&dp->aux, DP_TRAINING_LANE0_SET,
0606 dp->link_train.training_lane, lane_count);
0607 if (retval < 0)
0608 return retval;
0609
0610 return 0;
0611 }
0612
0613 static void analogix_dp_get_max_rx_bandwidth(struct analogix_dp_device *dp,
0614 u8 *bandwidth)
0615 {
0616 u8 data;
0617
0618
0619
0620
0621
0622
0623
0624 drm_dp_dpcd_readb(&dp->aux, DP_MAX_LINK_RATE, &data);
0625 *bandwidth = data;
0626 }
0627
0628 static void analogix_dp_get_max_rx_lane_count(struct analogix_dp_device *dp,
0629 u8 *lane_count)
0630 {
0631 u8 data;
0632
0633
0634
0635
0636
0637 drm_dp_dpcd_readb(&dp->aux, DP_MAX_LANE_COUNT, &data);
0638 *lane_count = DPCD_MAX_LANE_COUNT(data);
0639 }
0640
0641 static int analogix_dp_full_link_train(struct analogix_dp_device *dp,
0642 u32 max_lanes, u32 max_rate)
0643 {
0644 int retval = 0;
0645 bool training_finished = false;
0646
0647
0648
0649
0650
0651 analogix_dp_reset_macro(dp);
0652
0653
0654 analogix_dp_get_max_rx_bandwidth(dp, &dp->link_train.link_rate);
0655 analogix_dp_get_max_rx_lane_count(dp, &dp->link_train.lane_count);
0656
0657 if ((dp->link_train.link_rate != DP_LINK_BW_1_62) &&
0658 (dp->link_train.link_rate != DP_LINK_BW_2_7) &&
0659 (dp->link_train.link_rate != DP_LINK_BW_5_4)) {
0660 dev_err(dp->dev, "Rx Max Link Rate is abnormal :%x !\n",
0661 dp->link_train.link_rate);
0662 dp->link_train.link_rate = DP_LINK_BW_1_62;
0663 }
0664
0665 if (dp->link_train.lane_count == 0) {
0666 dev_err(dp->dev, "Rx Max Lane count is abnormal :%x !\n",
0667 dp->link_train.lane_count);
0668 dp->link_train.lane_count = (u8)LANE_COUNT1;
0669 }
0670
0671
0672 if (dp->link_train.lane_count > max_lanes)
0673 dp->link_train.lane_count = max_lanes;
0674 if (dp->link_train.link_rate > max_rate)
0675 dp->link_train.link_rate = max_rate;
0676
0677
0678 analogix_dp_set_analog_power_down(dp, POWER_ALL, 0);
0679
0680 dp->link_train.lt_state = START;
0681
0682
0683 while (!retval && !training_finished) {
0684 switch (dp->link_train.lt_state) {
0685 case START:
0686 retval = analogix_dp_link_start(dp);
0687 if (retval)
0688 dev_err(dp->dev, "LT link start failed!\n");
0689 break;
0690 case CLOCK_RECOVERY:
0691 retval = analogix_dp_process_clock_recovery(dp);
0692 if (retval)
0693 dev_err(dp->dev, "LT CR failed!\n");
0694 break;
0695 case EQUALIZER_TRAINING:
0696 retval = analogix_dp_process_equalizer_training(dp);
0697 if (retval)
0698 dev_err(dp->dev, "LT EQ failed!\n");
0699 break;
0700 case FINISHED:
0701 training_finished = 1;
0702 break;
0703 case FAILED:
0704 return -EREMOTEIO;
0705 }
0706 }
0707 if (retval)
0708 dev_err(dp->dev, "eDP link training failed (%d)\n", retval);
0709
0710 return retval;
0711 }
0712
0713 static int analogix_dp_fast_link_train(struct analogix_dp_device *dp)
0714 {
0715 int i, ret;
0716 u8 link_align, link_status[2];
0717 enum pll_status status;
0718
0719 analogix_dp_reset_macro(dp);
0720
0721 analogix_dp_set_link_bandwidth(dp, dp->link_train.link_rate);
0722 analogix_dp_set_lane_count(dp, dp->link_train.lane_count);
0723
0724 for (i = 0; i < dp->link_train.lane_count; i++) {
0725 analogix_dp_set_lane_link_training(dp,
0726 dp->link_train.training_lane[i], i);
0727 }
0728
0729 ret = readx_poll_timeout(analogix_dp_get_pll_lock_status, dp, status,
0730 status != PLL_UNLOCKED, 120,
0731 120 * DP_TIMEOUT_LOOP_COUNT);
0732 if (ret) {
0733 DRM_DEV_ERROR(dp->dev, "Wait for pll lock failed %d\n", ret);
0734 return ret;
0735 }
0736
0737
0738 analogix_dp_set_training_pattern(dp, TRAINING_PTN1);
0739
0740 usleep_range(500, 600);
0741
0742 analogix_dp_set_training_pattern(dp, TRAINING_PTN2);
0743
0744 usleep_range(500, 600);
0745
0746
0747 analogix_dp_set_training_pattern(dp, DP_NONE);
0748
0749
0750
0751
0752
0753 if (verify_fast_training) {
0754 ret = drm_dp_dpcd_readb(&dp->aux, DP_LANE_ALIGN_STATUS_UPDATED,
0755 &link_align);
0756 if (ret < 0) {
0757 DRM_DEV_ERROR(dp->dev, "Read align status failed %d\n",
0758 ret);
0759 return ret;
0760 }
0761
0762 ret = drm_dp_dpcd_read(&dp->aux, DP_LANE0_1_STATUS, link_status,
0763 2);
0764 if (ret < 0) {
0765 DRM_DEV_ERROR(dp->dev, "Read link status failed %d\n",
0766 ret);
0767 return ret;
0768 }
0769
0770 if (analogix_dp_clock_recovery_ok(link_status,
0771 dp->link_train.lane_count)) {
0772 DRM_DEV_ERROR(dp->dev, "Clock recovery failed\n");
0773 analogix_dp_reduce_link_rate(dp);
0774 return -EIO;
0775 }
0776
0777 if (analogix_dp_channel_eq_ok(link_status, link_align,
0778 dp->link_train.lane_count)) {
0779 DRM_DEV_ERROR(dp->dev, "Channel EQ failed\n");
0780 analogix_dp_reduce_link_rate(dp);
0781 return -EIO;
0782 }
0783 }
0784
0785 return 0;
0786 }
0787
0788 static int analogix_dp_train_link(struct analogix_dp_device *dp)
0789 {
0790 if (dp->fast_train_enable)
0791 return analogix_dp_fast_link_train(dp);
0792
0793 return analogix_dp_full_link_train(dp, dp->video_info.max_lane_count,
0794 dp->video_info.max_link_rate);
0795 }
0796
0797 static int analogix_dp_config_video(struct analogix_dp_device *dp)
0798 {
0799 int timeout_loop = 0;
0800 int done_count = 0;
0801
0802 analogix_dp_config_video_slave_mode(dp);
0803
0804 analogix_dp_set_video_color_format(dp);
0805
0806 if (analogix_dp_get_pll_lock_status(dp) == PLL_UNLOCKED) {
0807 dev_err(dp->dev, "PLL is not locked yet.\n");
0808 return -EINVAL;
0809 }
0810
0811 for (;;) {
0812 timeout_loop++;
0813 if (analogix_dp_is_slave_video_stream_clock_on(dp) == 0)
0814 break;
0815 if (timeout_loop > DP_TIMEOUT_LOOP_COUNT) {
0816 dev_err(dp->dev, "Timeout of slave video streamclk ok\n");
0817 return -ETIMEDOUT;
0818 }
0819 usleep_range(1000, 1001);
0820 }
0821
0822
0823 analogix_dp_set_video_cr_mn(dp, CALCULATED_M, 0, 0);
0824
0825
0826 analogix_dp_set_video_timing_mode(dp, VIDEO_TIMING_FROM_CAPTURE);
0827
0828
0829 analogix_dp_enable_video_mute(dp, 0);
0830
0831
0832 analogix_dp_enable_video_master(dp, 0);
0833
0834
0835 analogix_dp_start_video(dp);
0836
0837 timeout_loop = 0;
0838
0839 for (;;) {
0840 timeout_loop++;
0841 if (analogix_dp_is_video_stream_on(dp) == 0) {
0842 done_count++;
0843 if (done_count > 10)
0844 break;
0845 } else if (done_count) {
0846 done_count = 0;
0847 }
0848 if (timeout_loop > DP_TIMEOUT_LOOP_COUNT) {
0849 dev_warn(dp->dev,
0850 "Ignoring timeout of video streamclk ok\n");
0851 break;
0852 }
0853
0854 usleep_range(1000, 1001);
0855 }
0856
0857 return 0;
0858 }
0859
0860 static int analogix_dp_enable_scramble(struct analogix_dp_device *dp,
0861 bool enable)
0862 {
0863 u8 data;
0864 int ret;
0865
0866 if (enable) {
0867 analogix_dp_enable_scrambling(dp);
0868
0869 ret = drm_dp_dpcd_readb(&dp->aux, DP_TRAINING_PATTERN_SET,
0870 &data);
0871 if (ret != 1)
0872 return ret;
0873 ret = drm_dp_dpcd_writeb(&dp->aux, DP_TRAINING_PATTERN_SET,
0874 (u8)(data & ~DP_LINK_SCRAMBLING_DISABLE));
0875 } else {
0876 analogix_dp_disable_scrambling(dp);
0877
0878 ret = drm_dp_dpcd_readb(&dp->aux, DP_TRAINING_PATTERN_SET,
0879 &data);
0880 if (ret != 1)
0881 return ret;
0882 ret = drm_dp_dpcd_writeb(&dp->aux, DP_TRAINING_PATTERN_SET,
0883 (u8)(data | DP_LINK_SCRAMBLING_DISABLE));
0884 }
0885 return ret < 0 ? ret : 0;
0886 }
0887
0888 static irqreturn_t analogix_dp_hardirq(int irq, void *arg)
0889 {
0890 struct analogix_dp_device *dp = arg;
0891 irqreturn_t ret = IRQ_NONE;
0892 enum dp_irq_type irq_type;
0893
0894 irq_type = analogix_dp_get_irq_type(dp);
0895 if (irq_type != DP_IRQ_TYPE_UNKNOWN) {
0896 analogix_dp_mute_hpd_interrupt(dp);
0897 ret = IRQ_WAKE_THREAD;
0898 }
0899
0900 return ret;
0901 }
0902
0903 static irqreturn_t analogix_dp_irq_thread(int irq, void *arg)
0904 {
0905 struct analogix_dp_device *dp = arg;
0906 enum dp_irq_type irq_type;
0907
0908 irq_type = analogix_dp_get_irq_type(dp);
0909 if (irq_type & DP_IRQ_TYPE_HP_CABLE_IN ||
0910 irq_type & DP_IRQ_TYPE_HP_CABLE_OUT) {
0911 dev_dbg(dp->dev, "Detected cable status changed!\n");
0912 if (dp->drm_dev)
0913 drm_helper_hpd_irq_event(dp->drm_dev);
0914 }
0915
0916 if (irq_type != DP_IRQ_TYPE_UNKNOWN) {
0917 analogix_dp_clear_hotplug_interrupts(dp);
0918 analogix_dp_unmute_hpd_interrupt(dp);
0919 }
0920
0921 return IRQ_HANDLED;
0922 }
0923
0924 static int analogix_dp_fast_link_train_detection(struct analogix_dp_device *dp)
0925 {
0926 int ret;
0927 u8 spread;
0928
0929 ret = drm_dp_dpcd_readb(&dp->aux, DP_MAX_DOWNSPREAD, &spread);
0930 if (ret != 1) {
0931 dev_err(dp->dev, "failed to read downspread %d\n", ret);
0932 return ret;
0933 }
0934 dp->fast_train_enable = !!(spread & DP_NO_AUX_HANDSHAKE_LINK_TRAINING);
0935 dev_dbg(dp->dev, "fast link training %s\n",
0936 dp->fast_train_enable ? "supported" : "unsupported");
0937 return 0;
0938 }
0939
0940 static int analogix_dp_commit(struct analogix_dp_device *dp)
0941 {
0942 int ret;
0943
0944
0945 if (dp->plat_data->panel) {
0946 if (drm_panel_disable(dp->plat_data->panel))
0947 DRM_ERROR("failed to disable the panel\n");
0948 }
0949
0950 ret = analogix_dp_train_link(dp);
0951 if (ret) {
0952 dev_err(dp->dev, "unable to do link train, ret=%d\n", ret);
0953 return ret;
0954 }
0955
0956 ret = analogix_dp_enable_scramble(dp, 1);
0957 if (ret < 0) {
0958 dev_err(dp->dev, "can not enable scramble\n");
0959 return ret;
0960 }
0961
0962 analogix_dp_init_video(dp);
0963 ret = analogix_dp_config_video(dp);
0964 if (ret) {
0965 dev_err(dp->dev, "unable to config video\n");
0966 return ret;
0967 }
0968
0969
0970 if (dp->plat_data->panel) {
0971 ret = drm_panel_enable(dp->plat_data->panel);
0972 if (ret) {
0973 DRM_ERROR("failed to enable the panel\n");
0974 return ret;
0975 }
0976 }
0977
0978
0979 ret = analogix_dp_fast_link_train_detection(dp);
0980 if (ret)
0981 return ret;
0982
0983 if (analogix_dp_detect_sink_psr(dp)) {
0984 ret = analogix_dp_enable_sink_psr(dp);
0985 if (ret)
0986 return ret;
0987 }
0988
0989 return ret;
0990 }
0991
0992 static int analogix_dp_enable_psr(struct analogix_dp_device *dp)
0993 {
0994 struct dp_sdp psr_vsc;
0995 int ret;
0996 u8 sink;
0997
0998 ret = drm_dp_dpcd_readb(&dp->aux, DP_PSR_STATUS, &sink);
0999 if (ret != 1)
1000 DRM_DEV_ERROR(dp->dev, "Failed to read psr status %d\n", ret);
1001 else if (sink == DP_PSR_SINK_ACTIVE_RFB)
1002 return 0;
1003
1004
1005 memset(&psr_vsc, 0, sizeof(psr_vsc));
1006 psr_vsc.sdp_header.HB0 = 0;
1007 psr_vsc.sdp_header.HB1 = 0x7;
1008 psr_vsc.sdp_header.HB2 = 0x2;
1009 psr_vsc.sdp_header.HB3 = 0x8;
1010 psr_vsc.db[0] = 0;
1011 psr_vsc.db[1] = EDP_VSC_PSR_STATE_ACTIVE | EDP_VSC_PSR_CRC_VALUES_VALID;
1012
1013 ret = analogix_dp_send_psr_spd(dp, &psr_vsc, true);
1014 if (!ret)
1015 analogix_dp_set_analog_power_down(dp, POWER_ALL, true);
1016
1017 return ret;
1018 }
1019
1020 static int analogix_dp_disable_psr(struct analogix_dp_device *dp)
1021 {
1022 struct dp_sdp psr_vsc;
1023 int ret;
1024 u8 sink;
1025
1026 analogix_dp_set_analog_power_down(dp, POWER_ALL, false);
1027
1028 ret = drm_dp_dpcd_writeb(&dp->aux, DP_SET_POWER, DP_SET_POWER_D0);
1029 if (ret != 1) {
1030 DRM_DEV_ERROR(dp->dev, "Failed to set DP Power0 %d\n", ret);
1031 return ret;
1032 }
1033
1034 ret = drm_dp_dpcd_readb(&dp->aux, DP_PSR_STATUS, &sink);
1035 if (ret != 1) {
1036 DRM_DEV_ERROR(dp->dev, "Failed to read psr status %d\n", ret);
1037 return ret;
1038 } else if (sink == DP_PSR_SINK_INACTIVE) {
1039 DRM_DEV_ERROR(dp->dev, "sink inactive, skip disable psr");
1040 return 0;
1041 }
1042
1043 ret = analogix_dp_train_link(dp);
1044 if (ret) {
1045 DRM_DEV_ERROR(dp->dev, "Failed to train the link %d\n", ret);
1046 return ret;
1047 }
1048
1049
1050 memset(&psr_vsc, 0, sizeof(psr_vsc));
1051 psr_vsc.sdp_header.HB0 = 0;
1052 psr_vsc.sdp_header.HB1 = 0x7;
1053 psr_vsc.sdp_header.HB2 = 0x2;
1054 psr_vsc.sdp_header.HB3 = 0x8;
1055
1056 psr_vsc.db[0] = 0;
1057 psr_vsc.db[1] = 0;
1058
1059 return analogix_dp_send_psr_spd(dp, &psr_vsc, true);
1060 }
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075 static int analogix_dp_prepare_panel(struct analogix_dp_device *dp,
1076 bool prepare, bool is_modeset_prepare)
1077 {
1078 int ret = 0;
1079
1080 if (!dp->plat_data->panel)
1081 return 0;
1082
1083 mutex_lock(&dp->panel_lock);
1084
1085
1086
1087
1088
1089 if (dp->panel_is_modeset && !is_modeset_prepare)
1090 goto out;
1091
1092 if (prepare)
1093 ret = drm_panel_prepare(dp->plat_data->panel);
1094 else
1095 ret = drm_panel_unprepare(dp->plat_data->panel);
1096
1097 if (ret)
1098 goto out;
1099
1100 if (is_modeset_prepare)
1101 dp->panel_is_modeset = prepare;
1102
1103 out:
1104 mutex_unlock(&dp->panel_lock);
1105 return ret;
1106 }
1107
1108 static int analogix_dp_get_modes(struct drm_connector *connector)
1109 {
1110 struct analogix_dp_device *dp = to_dp(connector);
1111 struct edid *edid;
1112 int ret, num_modes = 0;
1113
1114 if (dp->plat_data->panel) {
1115 num_modes += drm_panel_get_modes(dp->plat_data->panel, connector);
1116 } else {
1117 ret = analogix_dp_prepare_panel(dp, true, false);
1118 if (ret) {
1119 DRM_ERROR("Failed to prepare panel (%d)\n", ret);
1120 return 0;
1121 }
1122
1123 edid = drm_get_edid(connector, &dp->aux.ddc);
1124 if (edid) {
1125 drm_connector_update_edid_property(&dp->connector,
1126 edid);
1127 num_modes += drm_add_edid_modes(&dp->connector, edid);
1128 kfree(edid);
1129 }
1130
1131 ret = analogix_dp_prepare_panel(dp, false, false);
1132 if (ret)
1133 DRM_ERROR("Failed to unprepare panel (%d)\n", ret);
1134 }
1135
1136 if (dp->plat_data->get_modes)
1137 num_modes += dp->plat_data->get_modes(dp->plat_data, connector);
1138
1139 return num_modes;
1140 }
1141
1142 static struct drm_encoder *
1143 analogix_dp_best_encoder(struct drm_connector *connector)
1144 {
1145 struct analogix_dp_device *dp = to_dp(connector);
1146
1147 return dp->encoder;
1148 }
1149
1150
1151 static int analogix_dp_atomic_check(struct drm_connector *connector,
1152 struct drm_atomic_state *state)
1153 {
1154 struct analogix_dp_device *dp = to_dp(connector);
1155 struct drm_connector_state *conn_state;
1156 struct drm_crtc_state *crtc_state;
1157
1158 conn_state = drm_atomic_get_new_connector_state(state, connector);
1159 if (WARN_ON(!conn_state))
1160 return -ENODEV;
1161
1162 conn_state->self_refresh_aware = true;
1163
1164 if (!conn_state->crtc)
1165 return 0;
1166
1167 crtc_state = drm_atomic_get_new_crtc_state(state, conn_state->crtc);
1168 if (!crtc_state)
1169 return 0;
1170
1171 if (crtc_state->self_refresh_active && !dp->psr_supported)
1172 return -EINVAL;
1173
1174 return 0;
1175 }
1176
1177 static const struct drm_connector_helper_funcs analogix_dp_connector_helper_funcs = {
1178 .get_modes = analogix_dp_get_modes,
1179 .best_encoder = analogix_dp_best_encoder,
1180 .atomic_check = analogix_dp_atomic_check,
1181 };
1182
1183 static enum drm_connector_status
1184 analogix_dp_detect(struct drm_connector *connector, bool force)
1185 {
1186 struct analogix_dp_device *dp = to_dp(connector);
1187 enum drm_connector_status status = connector_status_disconnected;
1188 int ret;
1189
1190 if (dp->plat_data->panel)
1191 return connector_status_connected;
1192
1193 ret = analogix_dp_prepare_panel(dp, true, false);
1194 if (ret) {
1195 DRM_ERROR("Failed to prepare panel (%d)\n", ret);
1196 return connector_status_disconnected;
1197 }
1198
1199 if (!analogix_dp_detect_hpd(dp))
1200 status = connector_status_connected;
1201
1202 ret = analogix_dp_prepare_panel(dp, false, false);
1203 if (ret)
1204 DRM_ERROR("Failed to unprepare panel (%d)\n", ret);
1205
1206 return status;
1207 }
1208
1209 static const struct drm_connector_funcs analogix_dp_connector_funcs = {
1210 .fill_modes = drm_helper_probe_single_connector_modes,
1211 .detect = analogix_dp_detect,
1212 .destroy = drm_connector_cleanup,
1213 .reset = drm_atomic_helper_connector_reset,
1214 .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
1215 .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
1216 };
1217
1218 static int analogix_dp_bridge_attach(struct drm_bridge *bridge,
1219 enum drm_bridge_attach_flags flags)
1220 {
1221 struct analogix_dp_device *dp = bridge->driver_private;
1222 struct drm_encoder *encoder = dp->encoder;
1223 struct drm_connector *connector = NULL;
1224 int ret = 0;
1225
1226 if (flags & DRM_BRIDGE_ATTACH_NO_CONNECTOR) {
1227 DRM_ERROR("Fix bridge driver to make connector optional!");
1228 return -EINVAL;
1229 }
1230
1231 if (!bridge->encoder) {
1232 DRM_ERROR("Parent encoder object not found");
1233 return -ENODEV;
1234 }
1235
1236 if (!dp->plat_data->skip_connector) {
1237 connector = &dp->connector;
1238 connector->polled = DRM_CONNECTOR_POLL_HPD;
1239
1240 ret = drm_connector_init(dp->drm_dev, connector,
1241 &analogix_dp_connector_funcs,
1242 DRM_MODE_CONNECTOR_eDP);
1243 if (ret) {
1244 DRM_ERROR("Failed to initialize connector with drm\n");
1245 return ret;
1246 }
1247
1248 drm_connector_helper_add(connector,
1249 &analogix_dp_connector_helper_funcs);
1250 drm_connector_attach_encoder(connector, encoder);
1251 }
1252
1253
1254
1255
1256
1257
1258
1259 if (dp->plat_data->attach) {
1260 ret = dp->plat_data->attach(dp->plat_data, bridge, connector);
1261 if (ret) {
1262 DRM_ERROR("Failed at platform attach func\n");
1263 return ret;
1264 }
1265 }
1266
1267 return 0;
1268 }
1269
1270 static
1271 struct drm_crtc *analogix_dp_get_old_crtc(struct analogix_dp_device *dp,
1272 struct drm_atomic_state *state)
1273 {
1274 struct drm_encoder *encoder = dp->encoder;
1275 struct drm_connector *connector;
1276 struct drm_connector_state *conn_state;
1277
1278 connector = drm_atomic_get_old_connector_for_encoder(state, encoder);
1279 if (!connector)
1280 return NULL;
1281
1282 conn_state = drm_atomic_get_old_connector_state(state, connector);
1283 if (!conn_state)
1284 return NULL;
1285
1286 return conn_state->crtc;
1287 }
1288
1289 static
1290 struct drm_crtc *analogix_dp_get_new_crtc(struct analogix_dp_device *dp,
1291 struct drm_atomic_state *state)
1292 {
1293 struct drm_encoder *encoder = dp->encoder;
1294 struct drm_connector *connector;
1295 struct drm_connector_state *conn_state;
1296
1297 connector = drm_atomic_get_new_connector_for_encoder(state, encoder);
1298 if (!connector)
1299 return NULL;
1300
1301 conn_state = drm_atomic_get_new_connector_state(state, connector);
1302 if (!conn_state)
1303 return NULL;
1304
1305 return conn_state->crtc;
1306 }
1307
1308 static void
1309 analogix_dp_bridge_atomic_pre_enable(struct drm_bridge *bridge,
1310 struct drm_bridge_state *old_bridge_state)
1311 {
1312 struct drm_atomic_state *old_state = old_bridge_state->base.state;
1313 struct analogix_dp_device *dp = bridge->driver_private;
1314 struct drm_crtc *crtc;
1315 struct drm_crtc_state *old_crtc_state;
1316 int ret;
1317
1318 crtc = analogix_dp_get_new_crtc(dp, old_state);
1319 if (!crtc)
1320 return;
1321
1322 old_crtc_state = drm_atomic_get_old_crtc_state(old_state, crtc);
1323
1324 if (old_crtc_state && old_crtc_state->self_refresh_active)
1325 return;
1326
1327 ret = analogix_dp_prepare_panel(dp, true, true);
1328 if (ret)
1329 DRM_ERROR("failed to setup the panel ret = %d\n", ret);
1330 }
1331
1332 static int analogix_dp_set_bridge(struct analogix_dp_device *dp)
1333 {
1334 int ret;
1335
1336 pm_runtime_get_sync(dp->dev);
1337
1338 ret = clk_prepare_enable(dp->clock);
1339 if (ret < 0) {
1340 DRM_ERROR("Failed to prepare_enable the clock clk [%d]\n", ret);
1341 goto out_dp_clk_pre;
1342 }
1343
1344 if (dp->plat_data->power_on_start)
1345 dp->plat_data->power_on_start(dp->plat_data);
1346
1347 phy_power_on(dp->phy);
1348
1349 ret = analogix_dp_init_dp(dp);
1350 if (ret)
1351 goto out_dp_init;
1352
1353
1354
1355
1356
1357
1358 ret = analogix_dp_detect_hpd(dp);
1359 if (ret) {
1360 DRM_ERROR("failed to get hpd single ret = %d\n", ret);
1361 goto out_dp_init;
1362 }
1363
1364 ret = analogix_dp_commit(dp);
1365 if (ret) {
1366 DRM_ERROR("dp commit error, ret = %d\n", ret);
1367 goto out_dp_init;
1368 }
1369
1370 if (dp->plat_data->power_on_end)
1371 dp->plat_data->power_on_end(dp->plat_data);
1372
1373 enable_irq(dp->irq);
1374 return 0;
1375
1376 out_dp_init:
1377 phy_power_off(dp->phy);
1378 if (dp->plat_data->power_off)
1379 dp->plat_data->power_off(dp->plat_data);
1380 clk_disable_unprepare(dp->clock);
1381 out_dp_clk_pre:
1382 pm_runtime_put_sync(dp->dev);
1383
1384 return ret;
1385 }
1386
1387 static void
1388 analogix_dp_bridge_atomic_enable(struct drm_bridge *bridge,
1389 struct drm_bridge_state *old_bridge_state)
1390 {
1391 struct drm_atomic_state *old_state = old_bridge_state->base.state;
1392 struct analogix_dp_device *dp = bridge->driver_private;
1393 struct drm_crtc *crtc;
1394 struct drm_crtc_state *old_crtc_state;
1395 int timeout_loop = 0;
1396 int ret;
1397
1398 crtc = analogix_dp_get_new_crtc(dp, old_state);
1399 if (!crtc)
1400 return;
1401
1402 old_crtc_state = drm_atomic_get_old_crtc_state(old_state, crtc);
1403
1404 if (old_crtc_state && old_crtc_state->self_refresh_active) {
1405 ret = analogix_dp_disable_psr(dp);
1406 if (ret)
1407 DRM_ERROR("Failed to disable psr %d\n", ret);
1408 return;
1409 }
1410
1411 if (dp->dpms_mode == DRM_MODE_DPMS_ON)
1412 return;
1413
1414 while (timeout_loop < MAX_PLL_LOCK_LOOP) {
1415 if (analogix_dp_set_bridge(dp) == 0) {
1416 dp->dpms_mode = DRM_MODE_DPMS_ON;
1417 return;
1418 }
1419 dev_err(dp->dev, "failed to set bridge, retry: %d\n",
1420 timeout_loop);
1421 timeout_loop++;
1422 usleep_range(10, 11);
1423 }
1424 dev_err(dp->dev, "too many times retry set bridge, give it up\n");
1425 }
1426
1427 static void analogix_dp_bridge_disable(struct drm_bridge *bridge)
1428 {
1429 struct analogix_dp_device *dp = bridge->driver_private;
1430 int ret;
1431
1432 if (dp->dpms_mode != DRM_MODE_DPMS_ON)
1433 return;
1434
1435 if (dp->plat_data->panel) {
1436 if (drm_panel_disable(dp->plat_data->panel)) {
1437 DRM_ERROR("failed to disable the panel\n");
1438 return;
1439 }
1440 }
1441
1442 disable_irq(dp->irq);
1443
1444 if (dp->plat_data->power_off)
1445 dp->plat_data->power_off(dp->plat_data);
1446
1447 analogix_dp_set_analog_power_down(dp, POWER_ALL, 1);
1448 phy_power_off(dp->phy);
1449
1450 clk_disable_unprepare(dp->clock);
1451
1452 pm_runtime_put_sync(dp->dev);
1453
1454 ret = analogix_dp_prepare_panel(dp, false, true);
1455 if (ret)
1456 DRM_ERROR("failed to setup the panel ret = %d\n", ret);
1457
1458 dp->fast_train_enable = false;
1459 dp->psr_supported = false;
1460 dp->dpms_mode = DRM_MODE_DPMS_OFF;
1461 }
1462
1463 static void
1464 analogix_dp_bridge_atomic_disable(struct drm_bridge *bridge,
1465 struct drm_bridge_state *old_bridge_state)
1466 {
1467 struct drm_atomic_state *old_state = old_bridge_state->base.state;
1468 struct analogix_dp_device *dp = bridge->driver_private;
1469 struct drm_crtc *old_crtc, *new_crtc;
1470 struct drm_crtc_state *old_crtc_state = NULL;
1471 struct drm_crtc_state *new_crtc_state = NULL;
1472 int ret;
1473
1474 new_crtc = analogix_dp_get_new_crtc(dp, old_state);
1475 if (!new_crtc)
1476 goto out;
1477
1478 new_crtc_state = drm_atomic_get_new_crtc_state(old_state, new_crtc);
1479 if (!new_crtc_state)
1480 goto out;
1481
1482
1483 if (new_crtc_state->self_refresh_active)
1484 return;
1485
1486 out:
1487 old_crtc = analogix_dp_get_old_crtc(dp, old_state);
1488 if (old_crtc) {
1489 old_crtc_state = drm_atomic_get_old_crtc_state(old_state,
1490 old_crtc);
1491
1492
1493 if (old_crtc_state && old_crtc_state->self_refresh_active) {
1494 ret = analogix_dp_disable_psr(dp);
1495 if (ret)
1496 DRM_ERROR("Failed to disable psr (%d)\n", ret);
1497 }
1498 }
1499
1500 analogix_dp_bridge_disable(bridge);
1501 }
1502
1503 static void
1504 analogix_dp_bridge_atomic_post_disable(struct drm_bridge *bridge,
1505 struct drm_bridge_state *old_bridge_state)
1506 {
1507 struct drm_atomic_state *old_state = old_bridge_state->base.state;
1508 struct analogix_dp_device *dp = bridge->driver_private;
1509 struct drm_crtc *crtc;
1510 struct drm_crtc_state *new_crtc_state;
1511 int ret;
1512
1513 crtc = analogix_dp_get_new_crtc(dp, old_state);
1514 if (!crtc)
1515 return;
1516
1517 new_crtc_state = drm_atomic_get_new_crtc_state(old_state, crtc);
1518 if (!new_crtc_state || !new_crtc_state->self_refresh_active)
1519 return;
1520
1521 ret = analogix_dp_enable_psr(dp);
1522 if (ret)
1523 DRM_ERROR("Failed to enable psr (%d)\n", ret);
1524 }
1525
1526 static void analogix_dp_bridge_mode_set(struct drm_bridge *bridge,
1527 const struct drm_display_mode *orig_mode,
1528 const struct drm_display_mode *mode)
1529 {
1530 struct analogix_dp_device *dp = bridge->driver_private;
1531 struct drm_display_info *display_info = &dp->connector.display_info;
1532 struct video_info *video = &dp->video_info;
1533 struct device_node *dp_node = dp->dev->of_node;
1534 int vic;
1535
1536
1537 video->interlaced = !!(mode->flags & DRM_MODE_FLAG_INTERLACE);
1538 video->v_sync_polarity = !!(mode->flags & DRM_MODE_FLAG_NVSYNC);
1539 video->h_sync_polarity = !!(mode->flags & DRM_MODE_FLAG_NHSYNC);
1540
1541
1542 vic = drm_match_cea_mode(mode);
1543 if ((vic == 6) || (vic == 7) || (vic == 21) || (vic == 22) ||
1544 (vic == 2) || (vic == 3) || (vic == 17) || (vic == 18)) {
1545 video->dynamic_range = CEA;
1546 video->ycbcr_coeff = COLOR_YCBCR601;
1547 } else if (vic) {
1548 video->dynamic_range = CEA;
1549 video->ycbcr_coeff = COLOR_YCBCR709;
1550 } else {
1551 video->dynamic_range = VESA;
1552 video->ycbcr_coeff = COLOR_YCBCR709;
1553 }
1554
1555
1556 switch (display_info->bpc) {
1557 case 12:
1558 video->color_depth = COLOR_12;
1559 break;
1560 case 10:
1561 video->color_depth = COLOR_10;
1562 break;
1563 case 8:
1564 video->color_depth = COLOR_8;
1565 break;
1566 case 6:
1567 video->color_depth = COLOR_6;
1568 break;
1569 default:
1570 video->color_depth = COLOR_8;
1571 break;
1572 }
1573 if (display_info->color_formats & DRM_COLOR_FORMAT_YCBCR444)
1574 video->color_space = COLOR_YCBCR444;
1575 else if (display_info->color_formats & DRM_COLOR_FORMAT_YCBCR422)
1576 video->color_space = COLOR_YCBCR422;
1577 else
1578 video->color_space = COLOR_RGB;
1579
1580
1581
1582
1583
1584
1585
1586
1587 of_property_read_u32(dp_node, "samsung,color-space",
1588 &video->color_space);
1589 of_property_read_u32(dp_node, "samsung,dynamic-range",
1590 &video->dynamic_range);
1591 of_property_read_u32(dp_node, "samsung,ycbcr-coeff",
1592 &video->ycbcr_coeff);
1593 of_property_read_u32(dp_node, "samsung,color-depth",
1594 &video->color_depth);
1595 if (of_property_read_bool(dp_node, "hsync-active-high"))
1596 video->h_sync_polarity = true;
1597 if (of_property_read_bool(dp_node, "vsync-active-high"))
1598 video->v_sync_polarity = true;
1599 if (of_property_read_bool(dp_node, "interlaced"))
1600 video->interlaced = true;
1601 }
1602
1603 static const struct drm_bridge_funcs analogix_dp_bridge_funcs = {
1604 .atomic_duplicate_state = drm_atomic_helper_bridge_duplicate_state,
1605 .atomic_destroy_state = drm_atomic_helper_bridge_destroy_state,
1606 .atomic_reset = drm_atomic_helper_bridge_reset,
1607 .atomic_pre_enable = analogix_dp_bridge_atomic_pre_enable,
1608 .atomic_enable = analogix_dp_bridge_atomic_enable,
1609 .atomic_disable = analogix_dp_bridge_atomic_disable,
1610 .atomic_post_disable = analogix_dp_bridge_atomic_post_disable,
1611 .mode_set = analogix_dp_bridge_mode_set,
1612 .attach = analogix_dp_bridge_attach,
1613 };
1614
1615 static int analogix_dp_create_bridge(struct drm_device *drm_dev,
1616 struct analogix_dp_device *dp)
1617 {
1618 struct drm_bridge *bridge;
1619
1620 bridge = devm_kzalloc(drm_dev->dev, sizeof(*bridge), GFP_KERNEL);
1621 if (!bridge) {
1622 DRM_ERROR("failed to allocate for drm bridge\n");
1623 return -ENOMEM;
1624 }
1625
1626 dp->bridge = bridge;
1627
1628 bridge->driver_private = dp;
1629 bridge->funcs = &analogix_dp_bridge_funcs;
1630
1631 return drm_bridge_attach(dp->encoder, bridge, NULL, 0);
1632 }
1633
1634 static int analogix_dp_dt_parse_pdata(struct analogix_dp_device *dp)
1635 {
1636 struct device_node *dp_node = dp->dev->of_node;
1637 struct video_info *video_info = &dp->video_info;
1638
1639 switch (dp->plat_data->dev_type) {
1640 case RK3288_DP:
1641 case RK3399_EDP:
1642
1643
1644
1645
1646 video_info->max_link_rate = 0x0A;
1647 video_info->max_lane_count = 0x04;
1648 break;
1649 case EXYNOS_DP:
1650
1651
1652
1653
1654 of_property_read_u32(dp_node, "samsung,link-rate",
1655 &video_info->max_link_rate);
1656 of_property_read_u32(dp_node, "samsung,lane-count",
1657 &video_info->max_lane_count);
1658 break;
1659 }
1660
1661 return 0;
1662 }
1663
1664 static ssize_t analogix_dpaux_transfer(struct drm_dp_aux *aux,
1665 struct drm_dp_aux_msg *msg)
1666 {
1667 struct analogix_dp_device *dp = to_dp(aux);
1668 int ret;
1669
1670 pm_runtime_get_sync(dp->dev);
1671
1672 ret = analogix_dp_detect_hpd(dp);
1673 if (ret)
1674 goto out;
1675
1676 ret = analogix_dp_transfer(dp, msg);
1677 out:
1678 pm_runtime_mark_last_busy(dp->dev);
1679 pm_runtime_put_autosuspend(dp->dev);
1680
1681 return ret;
1682 }
1683
1684 struct analogix_dp_device *
1685 analogix_dp_probe(struct device *dev, struct analogix_dp_plat_data *plat_data)
1686 {
1687 struct platform_device *pdev = to_platform_device(dev);
1688 struct analogix_dp_device *dp;
1689 struct resource *res;
1690 unsigned int irq_flags;
1691 int ret;
1692
1693 if (!plat_data) {
1694 dev_err(dev, "Invalided input plat_data\n");
1695 return ERR_PTR(-EINVAL);
1696 }
1697
1698 dp = devm_kzalloc(dev, sizeof(struct analogix_dp_device), GFP_KERNEL);
1699 if (!dp)
1700 return ERR_PTR(-ENOMEM);
1701
1702 dp->dev = &pdev->dev;
1703 dp->dpms_mode = DRM_MODE_DPMS_OFF;
1704
1705 mutex_init(&dp->panel_lock);
1706 dp->panel_is_modeset = false;
1707
1708
1709
1710
1711
1712
1713 dp->plat_data = plat_data;
1714
1715 ret = analogix_dp_dt_parse_pdata(dp);
1716 if (ret)
1717 return ERR_PTR(ret);
1718
1719 dp->phy = devm_phy_get(dp->dev, "dp");
1720 if (IS_ERR(dp->phy)) {
1721 dev_err(dp->dev, "no DP phy configured\n");
1722 ret = PTR_ERR(dp->phy);
1723 if (ret) {
1724
1725
1726
1727
1728 if (ret == -ENOSYS || ret == -ENODEV)
1729 dp->phy = NULL;
1730 else
1731 return ERR_PTR(ret);
1732 }
1733 }
1734
1735 dp->clock = devm_clk_get(&pdev->dev, "dp");
1736 if (IS_ERR(dp->clock)) {
1737 dev_err(&pdev->dev, "failed to get clock\n");
1738 return ERR_CAST(dp->clock);
1739 }
1740
1741 clk_prepare_enable(dp->clock);
1742
1743 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1744
1745 dp->reg_base = devm_ioremap_resource(&pdev->dev, res);
1746 if (IS_ERR(dp->reg_base)) {
1747 ret = PTR_ERR(dp->reg_base);
1748 goto err_disable_clk;
1749 }
1750
1751 dp->force_hpd = of_property_read_bool(dev->of_node, "force-hpd");
1752
1753
1754 dp->hpd_gpiod = devm_gpiod_get_optional(dev, "hpd", GPIOD_IN);
1755 if (!dp->hpd_gpiod)
1756 dp->hpd_gpiod = devm_gpiod_get_optional(dev, "samsung,hpd",
1757 GPIOD_IN);
1758 if (IS_ERR(dp->hpd_gpiod)) {
1759 dev_err(dev, "error getting HDP GPIO: %ld\n",
1760 PTR_ERR(dp->hpd_gpiod));
1761 ret = PTR_ERR(dp->hpd_gpiod);
1762 goto err_disable_clk;
1763 }
1764
1765 if (dp->hpd_gpiod) {
1766
1767
1768
1769
1770
1771
1772
1773 dp->irq = gpiod_to_irq(dp->hpd_gpiod);
1774 irq_flags = IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING;
1775 } else {
1776 dp->irq = platform_get_irq(pdev, 0);
1777 irq_flags = 0;
1778 }
1779
1780 if (dp->irq == -ENXIO) {
1781 dev_err(&pdev->dev, "failed to get irq\n");
1782 ret = -ENODEV;
1783 goto err_disable_clk;
1784 }
1785
1786 ret = devm_request_threaded_irq(&pdev->dev, dp->irq,
1787 analogix_dp_hardirq,
1788 analogix_dp_irq_thread,
1789 irq_flags, "analogix-dp", dp);
1790 if (ret) {
1791 dev_err(&pdev->dev, "failed to request irq\n");
1792 goto err_disable_clk;
1793 }
1794 disable_irq(dp->irq);
1795
1796 return dp;
1797
1798 err_disable_clk:
1799 clk_disable_unprepare(dp->clock);
1800 return ERR_PTR(ret);
1801 }
1802 EXPORT_SYMBOL_GPL(analogix_dp_probe);
1803
1804 int analogix_dp_bind(struct analogix_dp_device *dp, struct drm_device *drm_dev)
1805 {
1806 int ret;
1807
1808 dp->drm_dev = drm_dev;
1809 dp->encoder = dp->plat_data->encoder;
1810
1811 dp->aux.name = "DP-AUX";
1812 dp->aux.transfer = analogix_dpaux_transfer;
1813 dp->aux.dev = dp->dev;
1814 dp->aux.drm_dev = drm_dev;
1815
1816 ret = drm_dp_aux_register(&dp->aux);
1817 if (ret)
1818 return ret;
1819
1820 pm_runtime_use_autosuspend(dp->dev);
1821 pm_runtime_set_autosuspend_delay(dp->dev, 100);
1822 pm_runtime_enable(dp->dev);
1823
1824 ret = analogix_dp_create_bridge(drm_dev, dp);
1825 if (ret) {
1826 DRM_ERROR("failed to create bridge (%d)\n", ret);
1827 goto err_disable_pm_runtime;
1828 }
1829
1830 return 0;
1831
1832 err_disable_pm_runtime:
1833 pm_runtime_dont_use_autosuspend(dp->dev);
1834 pm_runtime_disable(dp->dev);
1835 drm_dp_aux_unregister(&dp->aux);
1836
1837 return ret;
1838 }
1839 EXPORT_SYMBOL_GPL(analogix_dp_bind);
1840
1841 void analogix_dp_unbind(struct analogix_dp_device *dp)
1842 {
1843 analogix_dp_bridge_disable(dp->bridge);
1844 dp->connector.funcs->destroy(&dp->connector);
1845
1846 if (dp->plat_data->panel) {
1847 if (drm_panel_unprepare(dp->plat_data->panel))
1848 DRM_ERROR("failed to turnoff the panel\n");
1849 }
1850
1851 drm_dp_aux_unregister(&dp->aux);
1852 pm_runtime_dont_use_autosuspend(dp->dev);
1853 pm_runtime_disable(dp->dev);
1854 }
1855 EXPORT_SYMBOL_GPL(analogix_dp_unbind);
1856
1857 void analogix_dp_remove(struct analogix_dp_device *dp)
1858 {
1859 clk_disable_unprepare(dp->clock);
1860 }
1861 EXPORT_SYMBOL_GPL(analogix_dp_remove);
1862
1863 #ifdef CONFIG_PM
1864 int analogix_dp_suspend(struct analogix_dp_device *dp)
1865 {
1866 clk_disable_unprepare(dp->clock);
1867 return 0;
1868 }
1869 EXPORT_SYMBOL_GPL(analogix_dp_suspend);
1870
1871 int analogix_dp_resume(struct analogix_dp_device *dp)
1872 {
1873 int ret;
1874
1875 ret = clk_prepare_enable(dp->clock);
1876 if (ret < 0) {
1877 DRM_ERROR("Failed to prepare_enable the clock clk [%d]\n", ret);
1878 return ret;
1879 }
1880
1881 return 0;
1882 }
1883 EXPORT_SYMBOL_GPL(analogix_dp_resume);
1884 #endif
1885
1886 int analogix_dp_start_crc(struct drm_connector *connector)
1887 {
1888 struct analogix_dp_device *dp = to_dp(connector);
1889
1890 if (!connector->state->crtc) {
1891 DRM_ERROR("Connector %s doesn't currently have a CRTC.\n",
1892 connector->name);
1893 return -EINVAL;
1894 }
1895
1896 return drm_dp_start_crc(&dp->aux, connector->state->crtc);
1897 }
1898 EXPORT_SYMBOL_GPL(analogix_dp_start_crc);
1899
1900 int analogix_dp_stop_crc(struct drm_connector *connector)
1901 {
1902 struct analogix_dp_device *dp = to_dp(connector);
1903
1904 return drm_dp_stop_crc(&dp->aux);
1905 }
1906 EXPORT_SYMBOL_GPL(analogix_dp_stop_crc);
1907
1908 MODULE_AUTHOR("Jingoo Han <jg1.han@samsung.com>");
1909 MODULE_DESCRIPTION("Analogix DP Core Driver");
1910 MODULE_LICENSE("GPL v2");