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.barysh...@linaro.org>
Reviewed-by: Abhinav Kumar <quic_abhin...@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);

Reply via email to