void tegra_output_remove(struct tegra_output *output)
{
- int connector_type = output->connector.connector_type;
-
if (output->hpd_gpio)
free_irq(output->hpd_irq, output);
- if (connector_type != DRM_MODE_CONNECTOR_eDP &&
- connector_type != DRM_MODE_CONNECTOR_DisplayPort && output->ddc)
+ if (output->ddc)
i2c_put_adapter(output->ddc);
}
if (!sor->aux)
return -EPROBE_DEFER;
- if (get_device(sor->aux->dev)) {
- if (try_module_get(sor->aux->dev->driver->owner))
- sor->output.ddc = &sor->aux->ddc;
- else
- put_device(sor->aux->dev);
- }
+ if (get_device(sor->aux->dev))
+ sor->output.ddc = &sor->aux->ddc;
}
if (!sor->aux) {
err = tegra_sor_parse_dt(sor);
if (err < 0)
- return err;
+ goto put_aux;
err = tegra_output_probe(&sor->output);
- if (err < 0)
- return dev_err_probe(&pdev->dev, err,
- "failed to probe output\n");
+ if (err < 0) {
+ dev_err_probe(&pdev->dev, err, "failed to probe output\n");
+ goto put_aux;
+ }
if (sor->ops && sor->ops->probe) {
err = sor->ops->probe(sor);
host1x_client_exit(&sor->client);
pm_runtime_disable(&pdev->dev);
remove:
+ if (sor->aux)
+ sor->output.ddc = NULL;
+
tegra_output_remove(&sor->output);
+put_aux:
+ if (sor->aux)
+ put_device(sor->aux->dev);
+
return err;
}
pm_runtime_disable(&pdev->dev);
+ if (sor->aux) {
+ put_device(sor->aux->dev);
+ sor->output.ddc = NULL;
+ }
+
tegra_output_remove(&sor->output);
return 0;