]> git.itanic.dy.fi Git - linux-stable/commitdiff
drm/tegra: output: Fix missing i2c_put_adapter() in the error handling paths of tegra...
authorChristophe JAILLET <christophe.jaillet@wanadoo.fr>
Sat, 2 Sep 2023 15:22:13 +0000 (17:22 +0200)
committerSasha Levin <sashal@kernel.org>
Tue, 26 Mar 2024 22:16:59 +0000 (18:16 -0400)
[ Upstream commit 2db4578ef6ffb2b52115ca0ebf897b60ec559556 ]

If an error occurs after a successful of_get_i2c_adapter_by_node() call, it
should be undone by a corresponding i2c_put_adapter().

Add the missing i2c_put_adapter() call.

Fixes: 9be7d864cf07 ("drm/tegra: Implement panel support")
Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
Signed-off-by: Thierry Reding <treding@nvidia.com>
Link: https://patchwork.freedesktop.org/patch/msgid/b38604178991e1f08b2cda219103be266be2d680.1693667005.git.christophe.jaillet@wanadoo.fr
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/gpu/drm/tegra/output.c

index dc2dcb5ca1c894ce384eec832c917196ba5c7aed..d7d2389ac2f5ab74a778625094a014b6d96c0f56 100644 (file)
@@ -142,8 +142,10 @@ int tegra_output_probe(struct tegra_output *output)
                                        GPIOD_IN,
                                        "HDMI hotplug detect");
        if (IS_ERR(output->hpd_gpio)) {
-               if (PTR_ERR(output->hpd_gpio) != -ENOENT)
-                       return PTR_ERR(output->hpd_gpio);
+               if (PTR_ERR(output->hpd_gpio) != -ENOENT) {
+                       err = PTR_ERR(output->hpd_gpio);
+                       goto put_i2c;
+               }
 
                output->hpd_gpio = NULL;
        }
@@ -152,7 +154,7 @@ int tegra_output_probe(struct tegra_output *output)
                err = gpiod_to_irq(output->hpd_gpio);
                if (err < 0) {
                        dev_err(output->dev, "gpiod_to_irq(): %d\n", err);
-                       return err;
+                       goto put_i2c;
                }
 
                output->hpd_irq = err;
@@ -165,7 +167,7 @@ int tegra_output_probe(struct tegra_output *output)
                if (err < 0) {
                        dev_err(output->dev, "failed to request IRQ#%u: %d\n",
                                output->hpd_irq, err);
-                       return err;
+                       goto put_i2c;
                }
 
                output->connector.polled = DRM_CONNECTOR_POLL_HPD;
@@ -179,6 +181,12 @@ int tegra_output_probe(struct tegra_output *output)
        }
 
        return 0;
+
+put_i2c:
+       if (output->ddc)
+               i2c_put_adapter(output->ddc);
+
+       return err;
 }
 
 void tegra_output_remove(struct tegra_output *output)