[PATCH 13/14] drm/msm/dp: move next_bridge handling to dp_display

Kuogee Hsieh quic_khsieh at quicinc.com
Fri Jan 19 21:14:18 UTC 2024


Dmitry,

I am testing this patch serial with msm-next branch.

This patch cause system crash during booting up for me.

Is this patch work for you?

On 12/29/2023 2:56 PM, Dmitry Baryshkov wrote:
> Remove two levels of indirection and fetch next bridge directly in
> dp_display_probe_tail().
>
> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov at linaro.org>
> ---
>   drivers/gpu/drm/msm/dp/dp_display.c | 42 +++++++++--------------------
>   drivers/gpu/drm/msm/dp/dp_parser.c  | 14 ----------
>   drivers/gpu/drm/msm/dp/dp_parser.h  | 14 ----------
>   3 files changed, 13 insertions(+), 57 deletions(-)
>
> diff --git a/drivers/gpu/drm/msm/dp/dp_display.c b/drivers/gpu/drm/msm/dp/dp_display.c
> index 4de0857c31ce..923df47efcc9 100644
> --- a/drivers/gpu/drm/msm/dp/dp_display.c
> +++ b/drivers/gpu/drm/msm/dp/dp_display.c
> @@ -1195,16 +1195,24 @@ static const struct msm_dp_desc *dp_display_get_desc(struct platform_device *pde
>   	return NULL;
>   }
>   
> -static int dp_display_get_next_bridge(struct msm_dp *dp);
> -
>   static int dp_display_probe_tail(struct device *dev)
>   {
>   	struct msm_dp *dp = dev_get_drvdata(dev);
>   	int ret;
>   
> -	ret = dp_display_get_next_bridge(dp);
> -	if (ret)
> -		return ret;
> +	/*
> +	 * External bridges are mandatory for eDP interfaces: one has to
> +	 * provide at least an eDP panel (which gets wrapped into panel-bridge).
> +	 *
> +	 * For DisplayPort interfaces external bridges are optional, so
> +	 * silently ignore an error if one is not present (-ENODEV).
> +	 */
> +	dp->next_bridge = devm_drm_of_get_bridge(&dp->pdev->dev, dp->pdev->dev.of_node, 1, 0);
> +	if (IS_ERR(dp->next_bridge)) {
> +		ret = PTR_ERR(dp->next_bridge);
> +		if (dp->is_edp || ret != -ENODEV)
> +			return ret;
> +	}
>   
>   	ret = component_add(dev, &dp_display_comp_ops);
>   	if (ret)
> @@ -1397,30 +1405,6 @@ void dp_display_debugfs_init(struct msm_dp *dp_display, struct dentry *root, boo
>   	}
>   }
>   
> -static int dp_display_get_next_bridge(struct msm_dp *dp)
> -{
> -	int rc;
> -	struct dp_display_private *dp_priv;
> -
> -	dp_priv = container_of(dp, struct dp_display_private, dp_display);
> -
> -	/*
> -	 * External bridges are mandatory for eDP interfaces: one has to
> -	 * provide at least an eDP panel (which gets wrapped into panel-bridge).
> -	 *
> -	 * For DisplayPort interfaces external bridges are optional, so
> -	 * silently ignore an error if one is not present (-ENODEV).
> -	 */
> -	rc = devm_dp_parser_find_next_bridge(&dp->pdev->dev, dp_priv->parser);
> -	if (!dp->is_edp && rc == -ENODEV)
> -		return 0;
> -
> -	if (!rc)
> -		dp->next_bridge = dp_priv->parser->next_bridge;
> -
> -	return rc;
> -}
> -
>   int msm_dp_modeset_init(struct msm_dp *dp_display, struct drm_device *dev,
>   			struct drm_encoder *encoder)
>   {
> diff --git a/drivers/gpu/drm/msm/dp/dp_parser.c b/drivers/gpu/drm/msm/dp/dp_parser.c
> index aa135d5cedbd..f95ab3c5c72c 100644
> --- a/drivers/gpu/drm/msm/dp/dp_parser.c
> +++ b/drivers/gpu/drm/msm/dp/dp_parser.c
> @@ -24,20 +24,6 @@ static int dp_parser_ctrl_res(struct dp_parser *parser)
>   	return 0;
>   }
>   
> -int devm_dp_parser_find_next_bridge(struct device *dev, struct dp_parser *parser)
> -{
> -	struct platform_device *pdev = parser->pdev;
> -	struct drm_bridge *bridge;
> -
> -	bridge = devm_drm_of_get_bridge(dev, pdev->dev.of_node, 1, 0);
> -	if (IS_ERR(bridge))
> -		return PTR_ERR(bridge);
> -
> -	parser->next_bridge = bridge;
> -
> -	return 0;
> -}
> -
>   static int dp_parser_parse(struct dp_parser *parser)
>   {
>   	int rc = 0;
> diff --git a/drivers/gpu/drm/msm/dp/dp_parser.h b/drivers/gpu/drm/msm/dp/dp_parser.h
> index bc56e0e8c446..2b39b1c394ae 100644
> --- a/drivers/gpu/drm/msm/dp/dp_parser.h
> +++ b/drivers/gpu/drm/msm/dp/dp_parser.h
> @@ -22,7 +22,6 @@
>   struct dp_parser {
>   	struct platform_device *pdev;
>   	struct phy *phy;
> -	struct drm_bridge *next_bridge;
>   };
>   
>   /**
> @@ -38,17 +37,4 @@ struct dp_parser {
>    */
>   struct dp_parser *dp_parser_get(struct platform_device *pdev);
>   
> -/**
> - * devm_dp_parser_find_next_bridge() - find an additional bridge to DP
> - *
> - * @dev: device to tie bridge lifetime to
> - * @parser: dp_parser data from client
> - *
> - * This function is used to find any additional bridge attached to
> - * the DP controller. The eDP interface requires a panel bridge.
> - *
> - * Return: 0 if able to get the bridge, otherwise negative errno for failure.
> - */
> -int devm_dp_parser_find_next_bridge(struct device *dev, struct dp_parser *parser);
> -
>   #endif


More information about the dri-devel mailing list