Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/msm: edp: Avoid drm_dp_link helpers

During the discussion of patches that enhance the drm_dp_link helpers it
was concluded that these helpers aren't very useful to begin with. Start
pushing the equivalent code into individual drivers to ultimately remove
them.

Signed-off-by: Thierry Reding <treding@nvidia.com>
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Link: https://patchwork.freedesktop.org/patch/msgid/20191021143437.1477719-12-thierry.reding@gmail.com

+49 -21
+49 -21
drivers/gpu/drm/msm/edp/edp_ctrl.c
··· 89 89 /* edid raw data */ 90 90 struct edid *edid; 91 91 92 - struct drm_dp_link dp_link; 93 92 struct drm_dp_aux *drm_aux; 94 93 95 94 /* dpcd raw data */ ··· 402 403 u32 prate; 403 404 u32 lrate; 404 405 u32 bpp; 405 - u8 max_lane = ctrl->dp_link.num_lanes; 406 + u8 max_lane = drm_dp_max_lane_count(ctrl->dpcd); 406 407 u8 lane; 407 408 408 409 prate = ctrl->pixel_rate; ··· 412 413 * By default, use the maximum link rate and minimum lane count, 413 414 * so that we can do rate down shift during link training. 414 415 */ 415 - ctrl->link_rate = drm_dp_link_rate_to_bw_code(ctrl->dp_link.rate); 416 + ctrl->link_rate = ctrl->dpcd[DP_MAX_LINK_RATE]; 416 417 417 418 prate *= bpp; 418 419 prate /= 8; /* in kByte */ ··· 438 439 439 440 data = EDP_CONFIGURATION_CTRL_LANES(ctrl->lane_cnt - 1); 440 441 441 - if (ctrl->dp_link.capabilities & DP_LINK_CAP_ENHANCED_FRAMING) 442 + if (drm_dp_enhanced_frame_cap(ctrl->dpcd)) 442 443 data |= EDP_CONFIGURATION_CTRL_ENHANCED_FRAMING; 443 444 444 445 depth = EDP_6BIT; ··· 700 701 701 702 rate = ctrl->link_rate; 702 703 lane = ctrl->lane_cnt; 703 - max_lane = ctrl->dp_link.num_lanes; 704 + max_lane = drm_dp_max_lane_count(ctrl->dpcd); 704 705 705 706 bpp = ctrl->color_depth * 3; 706 707 prate = ctrl->pixel_rate; ··· 750 751 751 752 static int edp_do_link_train(struct edp_ctrl *ctrl) 752 753 { 754 + u8 values[2]; 753 755 int ret; 754 - struct drm_dp_link dp_link; 755 756 756 757 DBG(""); 757 758 /* 758 759 * Set the current link rate and lane cnt to panel. They may have been 759 760 * adjusted and the values are different from them in DPCD CAP 760 761 */ 761 - dp_link.num_lanes = ctrl->lane_cnt; 762 - dp_link.rate = drm_dp_bw_code_to_link_rate(ctrl->link_rate); 763 - dp_link.capabilities = ctrl->dp_link.capabilities; 764 - if (drm_dp_link_configure(ctrl->drm_aux, &dp_link) < 0) 762 + values[0] = ctrl->lane_cnt; 763 + values[1] = ctrl->link_rate; 764 + 765 + if (drm_dp_enhanced_frame_cap(ctrl->dpcd)) 766 + values[1] |= DP_LANE_COUNT_ENHANCED_FRAME_EN; 767 + 768 + if (drm_dp_dpcd_write(ctrl->drm_aux, DP_LINK_BW_SET, values, 769 + sizeof(values)) < 0) 765 770 return EDP_TRAIN_FAIL; 766 771 767 772 ctrl->v_level = 0; /* start from default level */ ··· 955 952 { 956 953 struct edp_ctrl *ctrl = container_of( 957 954 work, struct edp_ctrl, on_work); 955 + u8 value; 958 956 int ret; 959 957 960 958 mutex_lock(&ctrl->dev_mutex); ··· 969 965 edp_ctrl_link_enable(ctrl, 1); 970 966 971 967 edp_ctrl_irq_enable(ctrl, 1); 972 - ret = drm_dp_link_power_up(ctrl->drm_aux, &ctrl->dp_link); 973 - if (ret) 974 - goto fail; 968 + 969 + /* DP_SET_POWER register is only available on DPCD v1.1 and later */ 970 + if (ctrl->dpcd[DP_DPCD_REV] >= 0x11) { 971 + ret = drm_dp_dpcd_readb(ctrl->drm_aux, DP_SET_POWER, &value); 972 + if (ret < 0) 973 + goto fail; 974 + 975 + value &= ~DP_SET_POWER_MASK; 976 + value |= DP_SET_POWER_D0; 977 + 978 + ret = drm_dp_dpcd_writeb(ctrl->drm_aux, DP_SET_POWER, value); 979 + if (ret < 0) 980 + goto fail; 981 + 982 + /* 983 + * According to the DP 1.1 specification, a "Sink Device must 984 + * exit the power saving state within 1 ms" (Section 2.5.3.1, 985 + * Table 5-52, "Sink Control Field" (register 0x600). 986 + */ 987 + usleep_range(1000, 2000); 988 + } 975 989 976 990 ctrl->power_on = true; 977 991 ··· 1033 1011 1034 1012 edp_state_ctrl(ctrl, 0); 1035 1013 1036 - drm_dp_link_power_down(ctrl->drm_aux, &ctrl->dp_link); 1014 + /* DP_SET_POWER register is only available on DPCD v1.1 and later */ 1015 + if (ctrl->dpcd[DP_DPCD_REV] >= 0x11) { 1016 + u8 value; 1017 + int ret; 1018 + 1019 + ret = drm_dp_dpcd_readb(ctrl->drm_aux, DP_SET_POWER, &value); 1020 + if (ret > 0) { 1021 + value &= ~DP_SET_POWER_MASK; 1022 + value |= DP_SET_POWER_D3; 1023 + 1024 + drm_dp_dpcd_writeb(ctrl->drm_aux, DP_SET_POWER, value); 1025 + } 1026 + } 1037 1027 1038 1028 edp_ctrl_irq_enable(ctrl, 0); 1039 1029 ··· 1259 1225 edp_ctrl_irq_enable(ctrl, 1); 1260 1226 } 1261 1227 1262 - ret = drm_dp_link_probe(ctrl->drm_aux, &ctrl->dp_link); 1263 - if (ret) { 1264 - pr_err("%s: read dpcd cap failed, %d\n", __func__, ret); 1265 - goto disable_ret; 1266 - } 1267 - 1268 1228 /* Initialize link rate as panel max link rate */ 1269 - ctrl->link_rate = drm_dp_link_rate_to_bw_code(ctrl->dp_link.rate); 1229 + ctrl->link_rate = ctrl->dpcd[DP_MAX_LINK_RATE]; 1270 1230 1271 1231 ctrl->edid = drm_get_edid(connector, &ctrl->drm_aux->ddc); 1272 1232 if (!ctrl->edid) {