[PATCH 2/3] drm/bridge: analogix_dp: simplify analogix_dp_{set/get}_lane_link_training helpers
Robert Foss
rfoss at kernel.org
Wed May 29 14:25:54 UTC 2024
On Mon, Mar 18, 2024 at 9:39 PM Lucas Stach <l.stach at pengutronix.de> wrote:
>
> From: Wyon Bi <bivvy.bi at rock-chips.com>
>
> There is no need for separate functions for each lane, as we can deduct the
> register offset to read/write from the lane index.
>
> Signed-off-by: Wyon Bi <bivvy.bi at rock-chips.com>
> Signed-off-by: Lucas Stach <l.stach at pengutronix.de>
> ---
> .../drm/bridge/analogix/analogix_dp_core.c | 97 ++-------------
> .../drm/bridge/analogix/analogix_dp_core.h | 22 +---
> .../gpu/drm/bridge/analogix/analogix_dp_reg.c | 114 +++---------------
> 3 files changed, 26 insertions(+), 207 deletions(-)
>
> diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
> index df9370e0ff23..300385db7502 100644
> --- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
> +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
> @@ -234,28 +234,6 @@ static int analogix_dp_training_pattern_dis(struct analogix_dp_device *dp)
> return ret < 0 ? ret : 0;
> }
>
> -static void
> -analogix_dp_set_lane_lane_pre_emphasis(struct analogix_dp_device *dp,
> - int pre_emphasis, int lane)
> -{
> - switch (lane) {
> - case 0:
> - analogix_dp_set_lane0_pre_emphasis(dp, pre_emphasis);
> - break;
> - case 1:
> - analogix_dp_set_lane1_pre_emphasis(dp, pre_emphasis);
> - break;
> -
> - case 2:
> - analogix_dp_set_lane2_pre_emphasis(dp, pre_emphasis);
> - break;
> -
> - case 3:
> - analogix_dp_set_lane3_pre_emphasis(dp, pre_emphasis);
> - break;
> - }
> -}
> -
> static int analogix_dp_link_start(struct analogix_dp_device *dp)
> {
> u8 buf[4];
> @@ -286,10 +264,12 @@ static int analogix_dp_link_start(struct analogix_dp_device *dp)
> return retval;
> }
>
> - /* Set TX pre-emphasis to minimum */
> + /* Set TX voltage-swing and pre-emphasis to minimum */
> for (lane = 0; lane < lane_count; lane++)
> - analogix_dp_set_lane_lane_pre_emphasis(dp,
> - PRE_EMPHASIS_LEVEL_0, lane);
> + dp->link_train.training_lane[lane] =
> + DP_TRAIN_VOLTAGE_SWING_LEVEL_0 |
> + DP_TRAIN_PRE_EMPH_LEVEL_0;
> + analogix_dp_set_lane_link_training(dp);
>
> /* Wait for PLL lock */
> pll_tries = 0;
> @@ -384,54 +364,6 @@ static unsigned char analogix_dp_get_adjust_request_pre_emphasis(
> return ((link_value >> shift) & 0xc) >> 2;
> }
>
> -static void analogix_dp_set_lane_link_training(struct analogix_dp_device *dp,
> - u8 training_lane_set, int lane)
> -{
> - switch (lane) {
> - case 0:
> - analogix_dp_set_lane0_link_training(dp, training_lane_set);
> - break;
> - case 1:
> - analogix_dp_set_lane1_link_training(dp, training_lane_set);
> - break;
> -
> - case 2:
> - analogix_dp_set_lane2_link_training(dp, training_lane_set);
> - break;
> -
> - case 3:
> - analogix_dp_set_lane3_link_training(dp, training_lane_set);
> - break;
> - }
> -}
> -
> -static unsigned int
> -analogix_dp_get_lane_link_training(struct analogix_dp_device *dp,
> - int lane)
> -{
> - u32 reg;
> -
> - switch (lane) {
> - case 0:
> - reg = analogix_dp_get_lane0_link_training(dp);
> - break;
> - case 1:
> - reg = analogix_dp_get_lane1_link_training(dp);
> - break;
> - case 2:
> - reg = analogix_dp_get_lane2_link_training(dp);
> - break;
> - case 3:
> - reg = analogix_dp_get_lane3_link_training(dp);
> - break;
> - default:
> - WARN_ON(1);
> - return 0;
> - }
> -
> - return reg;
> -}
> -
> static void analogix_dp_reduce_link_rate(struct analogix_dp_device *dp)
> {
> analogix_dp_training_pattern_dis(dp);
> @@ -523,10 +455,7 @@ static int analogix_dp_process_clock_recovery(struct analogix_dp_device *dp)
> }
>
> analogix_dp_get_adjust_training_lane(dp, adjust_request);
> -
> - for (lane = 0; lane < lane_count; lane++)
> - analogix_dp_set_lane_link_training(dp,
> - dp->link_train.training_lane[lane], lane);
> + analogix_dp_set_lane_link_training(dp);
>
> retval = drm_dp_dpcd_write(&dp->aux, DP_TRAINING_LANE0_SET,
> dp->link_train.training_lane, lane_count);
> @@ -538,7 +467,7 @@ static int analogix_dp_process_clock_recovery(struct analogix_dp_device *dp)
>
> static int analogix_dp_process_equalizer_training(struct analogix_dp_device *dp)
> {
> - int lane, lane_count, retval;
> + int lane_count, retval;
> u32 reg;
> u8 link_align, link_status[2], adjust_request[2];
>
> @@ -598,9 +527,7 @@ static int analogix_dp_process_equalizer_training(struct analogix_dp_device *dp)
> return -EIO;
> }
>
> - for (lane = 0; lane < lane_count; lane++)
> - analogix_dp_set_lane_link_training(dp,
> - dp->link_train.training_lane[lane], lane);
> + analogix_dp_set_lane_link_training(dp);
>
> retval = drm_dp_dpcd_write(&dp->aux, DP_TRAINING_LANE0_SET,
> dp->link_train.training_lane, lane_count);
> @@ -712,7 +639,7 @@ static int analogix_dp_full_link_train(struct analogix_dp_device *dp,
>
> static int analogix_dp_fast_link_train(struct analogix_dp_device *dp)
> {
> - int i, ret;
> + int ret;
> u8 link_align, link_status[2];
> enum pll_status status;
>
> @@ -720,11 +647,7 @@ static int analogix_dp_fast_link_train(struct analogix_dp_device *dp)
>
> analogix_dp_set_link_bandwidth(dp, dp->link_train.link_rate);
> analogix_dp_set_lane_count(dp, dp->link_train.lane_count);
> -
> - for (i = 0; i < dp->link_train.lane_count; i++) {
> - analogix_dp_set_lane_link_training(dp,
> - dp->link_train.training_lane[i], i);
> - }
> + analogix_dp_set_lane_link_training(dp);
>
> ret = readx_poll_timeout(analogix_dp_get_pll_lock_status, dp, status,
> status != PLL_UNLOCKED, 120,
> diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.h b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.h
> index 433f2d7efa0c..382b2f068ab9 100644
> --- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.h
> +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.h
> @@ -213,26 +213,8 @@ void analogix_dp_enable_enhanced_mode(struct analogix_dp_device *dp,
> bool enable);
> void analogix_dp_set_training_pattern(struct analogix_dp_device *dp,
> enum pattern_set pattern);
> -void analogix_dp_set_lane0_pre_emphasis(struct analogix_dp_device *dp,
> - u32 level);
> -void analogix_dp_set_lane1_pre_emphasis(struct analogix_dp_device *dp,
> - u32 level);
> -void analogix_dp_set_lane2_pre_emphasis(struct analogix_dp_device *dp,
> - u32 level);
> -void analogix_dp_set_lane3_pre_emphasis(struct analogix_dp_device *dp,
> - u32 level);
> -void analogix_dp_set_lane0_link_training(struct analogix_dp_device *dp,
> - u32 training_lane);
> -void analogix_dp_set_lane1_link_training(struct analogix_dp_device *dp,
> - u32 training_lane);
> -void analogix_dp_set_lane2_link_training(struct analogix_dp_device *dp,
> - u32 training_lane);
> -void analogix_dp_set_lane3_link_training(struct analogix_dp_device *dp,
> - u32 training_lane);
> -u32 analogix_dp_get_lane0_link_training(struct analogix_dp_device *dp);
> -u32 analogix_dp_get_lane1_link_training(struct analogix_dp_device *dp);
> -u32 analogix_dp_get_lane2_link_training(struct analogix_dp_device *dp);
> -u32 analogix_dp_get_lane3_link_training(struct analogix_dp_device *dp);
> +void analogix_dp_set_lane_link_training(struct analogix_dp_device *dp);
> +u32 analogix_dp_get_lane_link_training(struct analogix_dp_device *dp, u8 lane);
> void analogix_dp_reset_macro(struct analogix_dp_device *dp);
> void analogix_dp_init_video(struct analogix_dp_device *dp);
>
> diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c
> index 7b0bc9704eac..d267cf05cbca 100644
> --- a/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c
> +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c
> @@ -557,6 +557,20 @@ void analogix_dp_get_lane_count(struct analogix_dp_device *dp, u32 *count)
> *count = reg;
> }
>
> +void analogix_dp_set_lane_link_training(struct analogix_dp_device *dp)
> +{
> + u8 lane;
> +
> + for (lane = 0; lane < dp->link_train.lane_count; lane++)
> + writel(dp->link_train.training_lane[lane],
> + dp->reg_base + ANALOGIX_DP_LN0_LINK_TRAINING_CTL + 4 * lane);
> +}
> +
> +u32 analogix_dp_get_lane_link_training(struct analogix_dp_device *dp, u8 lane)
> +{
> + return readl(dp->reg_base + ANALOGIX_DP_LN0_LINK_TRAINING_CTL + 4 * lane);
> +}
> +
> void analogix_dp_enable_enhanced_mode(struct analogix_dp_device *dp,
> bool enable)
> {
> @@ -606,106 +620,6 @@ void analogix_dp_set_training_pattern(struct analogix_dp_device *dp,
> }
> }
>
> -void analogix_dp_set_lane0_pre_emphasis(struct analogix_dp_device *dp,
> - u32 level)
> -{
> - u32 reg;
> -
> - reg = readl(dp->reg_base + ANALOGIX_DP_LN0_LINK_TRAINING_CTL);
> - reg &= ~PRE_EMPHASIS_SET_MASK;
> - reg |= level << PRE_EMPHASIS_SET_SHIFT;
> - writel(reg, dp->reg_base + ANALOGIX_DP_LN0_LINK_TRAINING_CTL);
> -}
> -
> -void analogix_dp_set_lane1_pre_emphasis(struct analogix_dp_device *dp,
> - u32 level)
> -{
> - u32 reg;
> -
> - reg = readl(dp->reg_base + ANALOGIX_DP_LN1_LINK_TRAINING_CTL);
> - reg &= ~PRE_EMPHASIS_SET_MASK;
> - reg |= level << PRE_EMPHASIS_SET_SHIFT;
> - writel(reg, dp->reg_base + ANALOGIX_DP_LN1_LINK_TRAINING_CTL);
> -}
> -
> -void analogix_dp_set_lane2_pre_emphasis(struct analogix_dp_device *dp,
> - u32 level)
> -{
> - u32 reg;
> -
> - reg = readl(dp->reg_base + ANALOGIX_DP_LN2_LINK_TRAINING_CTL);
> - reg &= ~PRE_EMPHASIS_SET_MASK;
> - reg |= level << PRE_EMPHASIS_SET_SHIFT;
> - writel(reg, dp->reg_base + ANALOGIX_DP_LN2_LINK_TRAINING_CTL);
> -}
> -
> -void analogix_dp_set_lane3_pre_emphasis(struct analogix_dp_device *dp,
> - u32 level)
> -{
> - u32 reg;
> -
> - reg = readl(dp->reg_base + ANALOGIX_DP_LN3_LINK_TRAINING_CTL);
> - reg &= ~PRE_EMPHASIS_SET_MASK;
> - reg |= level << PRE_EMPHASIS_SET_SHIFT;
> - writel(reg, dp->reg_base + ANALOGIX_DP_LN3_LINK_TRAINING_CTL);
> -}
> -
> -void analogix_dp_set_lane0_link_training(struct analogix_dp_device *dp,
> - u32 training_lane)
> -{
> - u32 reg;
> -
> - reg = training_lane;
> - writel(reg, dp->reg_base + ANALOGIX_DP_LN0_LINK_TRAINING_CTL);
> -}
> -
> -void analogix_dp_set_lane1_link_training(struct analogix_dp_device *dp,
> - u32 training_lane)
> -{
> - u32 reg;
> -
> - reg = training_lane;
> - writel(reg, dp->reg_base + ANALOGIX_DP_LN1_LINK_TRAINING_CTL);
> -}
> -
> -void analogix_dp_set_lane2_link_training(struct analogix_dp_device *dp,
> - u32 training_lane)
> -{
> - u32 reg;
> -
> - reg = training_lane;
> - writel(reg, dp->reg_base + ANALOGIX_DP_LN2_LINK_TRAINING_CTL);
> -}
> -
> -void analogix_dp_set_lane3_link_training(struct analogix_dp_device *dp,
> - u32 training_lane)
> -{
> - u32 reg;
> -
> - reg = training_lane;
> - writel(reg, dp->reg_base + ANALOGIX_DP_LN3_LINK_TRAINING_CTL);
> -}
> -
> -u32 analogix_dp_get_lane0_link_training(struct analogix_dp_device *dp)
> -{
> - return readl(dp->reg_base + ANALOGIX_DP_LN0_LINK_TRAINING_CTL);
> -}
> -
> -u32 analogix_dp_get_lane1_link_training(struct analogix_dp_device *dp)
> -{
> - return readl(dp->reg_base + ANALOGIX_DP_LN1_LINK_TRAINING_CTL);
> -}
> -
> -u32 analogix_dp_get_lane2_link_training(struct analogix_dp_device *dp)
> -{
> - return readl(dp->reg_base + ANALOGIX_DP_LN2_LINK_TRAINING_CTL);
> -}
> -
> -u32 analogix_dp_get_lane3_link_training(struct analogix_dp_device *dp)
> -{
> - return readl(dp->reg_base + ANALOGIX_DP_LN3_LINK_TRAINING_CTL);
> -}
> -
> void analogix_dp_reset_macro(struct analogix_dp_device *dp)
> {
> u32 reg;
> --
> 2.39.2
>
Reviewed-by: Robert Foss <rfoss at kernel.org>
More information about the dri-devel
mailing list