it6505_poweroff() returns early when regulator_disable() fails,
leaving it6505->powered set with the IRQ already disabled. The next
it6505_poweron() then takes its early return and never re-enables the
IRQ, leaving the bridge deaf to hotplug and link training interrupts.
The regulator core keeps the consumer's enable count on a failed
disable either way, so bailing out only adds a wedged bridge on top of
the leaked reference. Log the error and complete the power-off state
transition instead.
Fixes: b5c84a9edcd4 ("drm/bridge: add it6505 driver")
Signed-off-by: Daniel Golle <daniel@makrotopia.org>
---
v6: note that the regulator reference is leaked either way
v5: new patch
drivers/gpu/drm/bridge/ite-it6505.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/bridge/ite-it6505.c b/drivers/gpu/drm/bridge/ite-it6505.c
index c10cc6a786b5..fb6030a2c18c 100644
--- a/drivers/gpu/drm/bridge/ite-it6505.c
+++ b/drivers/gpu/drm/bridge/ite-it6505.c
@@ -2811,13 +2811,15 @@ static int it6505_poweroff(struct it6505 *it6505)
if (pdata->pwr18) {
err = regulator_disable(pdata->pwr18);
if (err)
- return err;
+ dev_err(dev, "cannot disable pwr18 regulator: %d",
+ err);
}
if (pdata->ovdd) {
err = regulator_disable(pdata->ovdd);
if (err)
- return err;
+ dev_err(dev, "cannot disable ovdd regulator: %d",
+ err);
}
it6505->powered = false;--
2.55.0