summaryrefslogtreecommitdiff
path: root/drivers/gpu/drm/msm/dsi/dsi_manager.c
diff options
context:
space:
mode:
authorDmitry Baryshkov <dmitry.baryshkov@linaro.org>2023-01-24 22:36:00 +0200
committerDmitry Baryshkov <dmitry.baryshkov@linaro.org>2023-01-26 20:51:32 +0200
commit2ec56b232b9775b4814c207ed6da9f065b29711c (patch)
tree9486c9badeb66fb609c8bfe2ffbf7d6070b9c038 /drivers/gpu/drm/msm/dsi/dsi_manager.c
parenta7efe60e36b9c0e966d7f82ac90a89b591d984e9 (diff)
drm/msm/dsi: properly handle the case of empty OPP table in dsi_mgr_bridge_mode_valid
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@linaro.org> Reviewed-by: Abhinav Kumar <quic_abhinavk@quicinc.com> Patchwork: https://patchwork.freedesktop.org/patch/520076/ Link: https://lore.kernel.org/r/20230124203600.3488766-1-dmitry.baryshkov@linaro.org Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Diffstat (limited to 'drivers/gpu/drm/msm/dsi/dsi_manager.c')
-rw-r--r--drivers/gpu/drm/msm/dsi/dsi_manager.c19
1 files 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);