[PATCH] drm/msm/dsi: properly handle the case of empty OPP table in dsi_mgr_bridge_mode_valid
Abhinav Kumar
quic_abhinavk at quicinc.com
Tue Jan 24 20:49:50 UTC 2023
On 1/24/2023 12:36 PM, Dmitry Baryshkov wrote:
> It was left unnoticed during the review that even if there is no OPP
> table in device tree, one will be created by a call to the function
> devm_pm_opp_set_clkname(). This leads to dsi_mgr_bridge_mode_valid()
> rejecting all modes if DT contains no OPP table for the DSI host.
>
> Rework dsi_mgr_bridge_mode_valid() to handle this case by actually
> checking that the table is populated with frequency entries before
> returning an error.
>
> Fixes: 8328041b8c82 ("drm/msm/dsi: implement opp table based check for dsi_mgr_bridge_mode_valid()")
> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov at linaro.org>
Reviewed-by: Abhinav Kumar <quic_abhinavk at quicinc.com>
> ---
> drivers/gpu/drm/msm/dsi/dsi_manager.c | 19 ++++++++++---------
> 1 file changed, 10 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/gpu/drm/msm/dsi/dsi_manager.c b/drivers/gpu/drm/msm/dsi/dsi_manager.c
> index b20fddb534a7..1bbac72dad35 100644
> --- a/drivers/gpu/drm/msm/dsi/dsi_manager.c
> +++ b/drivers/gpu/drm/msm/dsi/dsi_manager.c
> @@ -456,18 +456,19 @@ static enum drm_mode_status dsi_mgr_bridge_mode_valid(struct drm_bridge *bridge,
>
> byte_clk_rate = dsi_byte_clk_get_rate(host, IS_BONDED_DSI(), mode);
>
> - /*
> - * fail all errors except -ENODEV as that could mean that opp
> - * table is not yet implemented
> - */
> opp = dev_pm_opp_find_freq_ceil(&pdev->dev, &byte_clk_rate);
> - if (IS_ERR(opp)) {
> - if (PTR_ERR(opp) == -ERANGE)
> + if (!IS_ERR(opp)) {
> + dev_pm_opp_put(opp);
> + } else if (PTR_ERR(opp) == -ERANGE) {
> + /*
> + * An empty table is created by devm_pm_opp_set_clkname() even
> + * if there is none. Thus find_freq_ceil will still return
> + * -ERANGE in such case.
> + */
> + if (dev_pm_opp_get_opp_count(&pdev->dev) != 0)
> return MODE_CLOCK_RANGE;
> - else if (PTR_ERR(opp) != -ENODEV)
> - return MODE_ERROR;
> } else {
> - dev_pm_opp_put(opp);
> + return MODE_ERROR;
> }
>
> return msm_dsi_host_check_dsc(host, mode);
More information about the dri-devel
mailing list