diff options
-rw-r--r-- | drivers/gpu/drm/msm/dsi/dsi_manager.c | 19 |
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); |