boe_panel_prepare() enables pp3300 first, but every later failing step
(pp1800/avdd/avee enable, NOP, init) returns or jumps to a cleanup chain
that disables pp1800/avdd/avee but never pp3300, even though the matching
unprepare() disables it. The regulator is reference-counted, so on repeated
prepare failure the pp3300 enable count accumulates (leak). Add a
poweroff3v3 label that disables pp3300 and route the pp1800-enable failure
to it; the existing labels fall through.

Fixes: a869b9db7adf ("drm/panel: support for boe tv101wum-nl6 wuxga dsi video 
mode panel")
Signed-off-by: Tang Bin <[email protected]>
---
 drivers/gpu/drm/panel/panel-boe-tv101wum-nl6.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/panel/panel-boe-tv101wum-nl6.c 
b/drivers/gpu/drm/panel/panel-boe-tv101wum-nl6.c
index 150dff3ab..25cfd6e30 100644
--- a/drivers/gpu/drm/panel/panel-boe-tv101wum-nl6.c
+++ b/drivers/gpu/drm/panel/panel-boe-tv101wum-nl6.c
@@ -1371,7 +1371,7 @@ static int boe_panel_prepare(struct drm_panel *panel)
 
        ret = regulator_enable(boe->pp1800);
        if (ret < 0)
-               return ret;
+               goto poweroff3v3;
 
        usleep_range(3000, 5000);
 
@@ -1413,6 +1413,8 @@ static int boe_panel_prepare(struct drm_panel *panel)
 poweroff1v8:
        usleep_range(5000, 7000);
        regulator_disable(boe->pp1800);
+poweroff3v3:
+       regulator_disable(boe->pp3300);
 
        return ret;
 }
-- 
2.52.0.windows.1



Reply via email to