From: Li Youhong <[email protected]>

When the Exynos DSI driver was generalized into samsung-dsim, the TE
GPIO acquisition was switched from gpiod_get_optional() to
devm_gpiod_get_optional() while keeping the matching gpiod_put() calls.
That combination is wrong for a managed descriptor.

However, dropping the puts and keeping the managed get is also wrong:
samsung_dsim_register_te_irq() runs from the DSI host attach callback,
and host detach/reattach can happen without destroying the device that
owns the managed action. A second attach would then request the GPIO
again without having released it.

Switch back to a non-managed gpiod_get_optional() and keep the explicit
gpiod_put() on the request_irq() error path and in
samsung_dsim_unregister_te_irq().

Fixes: e7447128ca4a ("drm: bridge: Generalize Exynos-DSI driver into a Samsung 
DSIM bridge")
Suggested-by: Luca Ceresoli <[email protected]>
Signed-off-by: Li Youhong <[email protected]>
---
v2:
- Prefer non-devm gpiod_get_optional() and keep gpiod_put(), because TE
  GPIO is acquired in host attach and must be released on host detach

 drivers/gpu/drm/bridge/samsung-dsim.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

--- a/drivers/gpu/drm/bridge/samsung-dsim.c
+++ b/drivers/gpu/drm/bridge/samsung-dsim.c
@@ -1862,7 +1862,8 @@ static int samsung_dsim_register_te_irq(struct 
samsung_dsim *dsi, struct device
        int te_gpio_irq;
        int ret;
 
-       dsi->te_gpio = devm_gpiod_get_optional(dev, "te", GPIOD_IN);
+       /* Released on host detach; do not use the managed get. */
+       dsi->te_gpio = gpiod_get_optional(dev, "te", GPIOD_IN);
        if (!dsi->te_gpio)
                return 0;
        else if (IS_ERR(dsi->te_gpio))
-- 
2.25.1

Reply via email to