@@ -636,27 +636,28 @@ static void zynqmp_dp_adjust_train(struct zynqmp_dp *dp,
636636/**
637637 * zynqmp_dp_update_vs_emph - Update the training values
638638 * @dp: DisplayPort IP core structure
639+ * @train_set: A set of training values
639640 *
640641 * Update the training values based on the request from sink. The mapped values
641642 * are predefined, and values(vs, pe, pc) are from the device manual.
642643 *
643644 * Return: 0 if vs and emph are updated successfully, or the error code returned
644645 * by drm_dp_dpcd_write().
645646 */
646- static int zynqmp_dp_update_vs_emph (struct zynqmp_dp * dp )
647+ static int zynqmp_dp_update_vs_emph (struct zynqmp_dp * dp , u8 * train_set )
647648{
648649 unsigned int i ;
649650 int ret ;
650651
651- ret = drm_dp_dpcd_write (& dp -> aux , DP_TRAINING_LANE0_SET , dp -> train_set ,
652+ ret = drm_dp_dpcd_write (& dp -> aux , DP_TRAINING_LANE0_SET , train_set ,
652653 dp -> mode .lane_cnt );
653654 if (ret < 0 )
654655 return ret ;
655656
656657 for (i = 0 ; i < dp -> mode .lane_cnt ; i ++ ) {
657658 u32 reg = ZYNQMP_DP_SUB_TX_PHY_PRECURSOR_LANE_0 + i * 4 ;
658659 union phy_configure_opts opts = { 0 };
659- u8 train = dp -> train_set [i ];
660+ u8 train = train_set [i ];
660661
661662 opts .dp .voltage [0 ] = (train & DP_TRAIN_VOLTAGE_SWING_MASK )
662663 >> DP_TRAIN_VOLTAGE_SWING_SHIFT ;
@@ -700,7 +701,7 @@ static int zynqmp_dp_link_train_cr(struct zynqmp_dp *dp)
700701 * So, This loop should exit before 512 iterations
701702 */
702703 for (max_tries = 0 ; max_tries < 512 ; max_tries ++ ) {
703- ret = zynqmp_dp_update_vs_emph (dp );
704+ ret = zynqmp_dp_update_vs_emph (dp , dp -> train_set );
704705 if (ret )
705706 return ret ;
706707
@@ -765,7 +766,7 @@ static int zynqmp_dp_link_train_ce(struct zynqmp_dp *dp)
765766 return ret ;
766767
767768 for (tries = 0 ; tries < DP_MAX_TRAINING_TRIES ; tries ++ ) {
768- ret = zynqmp_dp_update_vs_emph (dp );
769+ ret = zynqmp_dp_update_vs_emph (dp , dp -> train_set );
769770 if (ret )
770771 return ret ;
771772
@@ -788,28 +789,29 @@ static int zynqmp_dp_link_train_ce(struct zynqmp_dp *dp)
788789}
789790
790791/**
791- * zynqmp_dp_train - Train the link
792+ * zynqmp_dp_setup() - Set up major link parameters
792793 * @dp: DisplayPort IP core structure
794+ * @bw_code: The link bandwidth as a multiple of 270 MHz
795+ * @lane_cnt: The number of lanes to use
796+ * @enhanced: Use enhanced framing
797+ * @downspread: Enable spread-spectrum clocking
793798 *
794- * Return: 0 if all trains are done successfully , or corresponding error code.
799+ * Return: 0 on success , or -errno on failure
795800 */
796- static int zynqmp_dp_train (struct zynqmp_dp * dp )
801+ static int zynqmp_dp_setup (struct zynqmp_dp * dp , u8 bw_code , u8 lane_cnt ,
802+ bool enhanced , bool downspread )
797803{
798804 u32 reg ;
799- u8 bw_code = dp -> mode .bw_code ;
800- u8 lane_cnt = dp -> mode .lane_cnt ;
801805 u8 aux_lane_cnt = lane_cnt ;
802- bool enhanced ;
803806 int ret ;
804807
805808 zynqmp_dp_write (dp , ZYNQMP_DP_LANE_COUNT_SET , lane_cnt );
806- enhanced = drm_dp_enhanced_frame_cap (dp -> dpcd );
807809 if (enhanced ) {
808810 zynqmp_dp_write (dp , ZYNQMP_DP_ENHANCED_FRAME_EN , 1 );
809811 aux_lane_cnt |= DP_LANE_COUNT_ENHANCED_FRAME_EN ;
810812 }
811813
812- if (dp -> dpcd [ 3 ] & 0x1 ) {
814+ if (downspread ) {
813815 zynqmp_dp_write (dp , ZYNQMP_DP_DOWNSPREAD_CTL , 1 );
814816 drm_dp_dpcd_writeb (& dp -> aux , DP_DOWNSPREAD_CTRL ,
815817 DP_SPREAD_AMP_0_5 );
@@ -852,8 +854,24 @@ static int zynqmp_dp_train(struct zynqmp_dp *dp)
852854 }
853855
854856 zynqmp_dp_write (dp , ZYNQMP_DP_PHY_CLOCK_SELECT , reg );
855- ret = zynqmp_dp_phy_ready (dp );
856- if (ret < 0 )
857+ return zynqmp_dp_phy_ready (dp );
858+ }
859+
860+ /**
861+ * zynqmp_dp_train - Train the link
862+ * @dp: DisplayPort IP core structure
863+ *
864+ * Return: 0 if all trains are done successfully, or corresponding error code.
865+ */
866+ static int zynqmp_dp_train (struct zynqmp_dp * dp )
867+ {
868+ int ret ;
869+
870+ ret = zynqmp_dp_setup (dp , dp -> mode .bw_code , dp -> mode .lane_cnt ,
871+ drm_dp_enhanced_frame_cap (dp -> dpcd ),
872+ dp -> dpcd [DP_MAX_DOWNSPREAD ] &
873+ DP_MAX_DOWNSPREAD_0_5 );
874+ if (ret )
857875 return ret ;
858876
859877 zynqmp_dp_write (dp , ZYNQMP_DP_SCRAMBLING_DISABLE , 1 );
0 commit comments