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;
        }
                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;
                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;
        }
 
        return 0;
+
+put_i2c:
+       if (output->ddc)
+               i2c_put_adapter(output->ddc);
+
+       return err;
 }
 
 void tegra_output_remove(struct tegra_output *output)