|
@@ -55,7 +55,7 @@ struct panel_drv_data {
|
|
|
static int hdmic_connect(struct omap_dss_device *dssdev)
|
|
|
{
|
|
|
struct panel_drv_data *ddata = to_panel_data(dssdev);
|
|
|
- struct omap_dss_device *in = ddata->in;
|
|
|
+ struct omap_dss_device *in;
|
|
|
int r;
|
|
|
|
|
|
dev_dbg(ddata->dev, "connect\n");
|
|
@@ -63,10 +63,19 @@ static int hdmic_connect(struct omap_dss_device *dssdev)
|
|
|
if (omapdss_device_is_connected(dssdev))
|
|
|
return 0;
|
|
|
|
|
|
+ in = omapdss_of_find_source_for_first_ep(ddata->dev->of_node);
|
|
|
+ if (IS_ERR(in)) {
|
|
|
+ dev_err(ddata->dev, "failed to find video source\n");
|
|
|
+ return PTR_ERR(in);
|
|
|
+ }
|
|
|
+
|
|
|
r = in->ops.hdmi->connect(in, dssdev);
|
|
|
- if (r)
|
|
|
+ if (r) {
|
|
|
+ omap_dss_put_device(in);
|
|
|
return r;
|
|
|
+ }
|
|
|
|
|
|
+ ddata->in = in;
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -81,6 +90,9 @@ static void hdmic_disconnect(struct omap_dss_device *dssdev)
|
|
|
return;
|
|
|
|
|
|
in->ops.hdmi->disconnect(in, dssdev);
|
|
|
+
|
|
|
+ omap_dss_put_device(in);
|
|
|
+ ddata->in = NULL;
|
|
|
}
|
|
|
|
|
|
static int hdmic_enable(struct omap_dss_device *dssdev)
|
|
@@ -302,7 +314,6 @@ static int hdmic_probe_of(struct platform_device *pdev)
|
|
|
{
|
|
|
struct panel_drv_data *ddata = platform_get_drvdata(pdev);
|
|
|
struct device_node *node = pdev->dev.of_node;
|
|
|
- struct omap_dss_device *in;
|
|
|
int gpio;
|
|
|
|
|
|
/* HPD GPIO */
|
|
@@ -312,14 +323,6 @@ static int hdmic_probe_of(struct platform_device *pdev)
|
|
|
else
|
|
|
ddata->hpd_gpio = -ENODEV;
|
|
|
|
|
|
- in = omapdss_of_find_source_for_first_ep(node);
|
|
|
- if (IS_ERR(in)) {
|
|
|
- dev_err(&pdev->dev, "failed to find video source\n");
|
|
|
- return PTR_ERR(in);
|
|
|
- }
|
|
|
-
|
|
|
- ddata->in = in;
|
|
|
-
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -346,7 +349,7 @@ static int hdmic_probe(struct platform_device *pdev)
|
|
|
r = devm_gpio_request_one(&pdev->dev, ddata->hpd_gpio,
|
|
|
GPIOF_DIR_IN, "hdmi_hpd");
|
|
|
if (r)
|
|
|
- goto err_reg;
|
|
|
+ return r;
|
|
|
|
|
|
r = devm_request_threaded_irq(&pdev->dev,
|
|
|
gpio_to_irq(ddata->hpd_gpio),
|
|
@@ -355,7 +358,7 @@ static int hdmic_probe(struct platform_device *pdev)
|
|
|
IRQF_ONESHOT,
|
|
|
"hdmic hpd", ddata);
|
|
|
if (r)
|
|
|
- goto err_reg;
|
|
|
+ return r;
|
|
|
}
|
|
|
|
|
|
ddata->vm = hdmic_default_vm;
|
|
@@ -370,28 +373,22 @@ static int hdmic_probe(struct platform_device *pdev)
|
|
|
r = omapdss_register_display(dssdev);
|
|
|
if (r) {
|
|
|
dev_err(&pdev->dev, "Failed to register panel\n");
|
|
|
- goto err_reg;
|
|
|
+ return r;
|
|
|
}
|
|
|
|
|
|
return 0;
|
|
|
-err_reg:
|
|
|
- omap_dss_put_device(ddata->in);
|
|
|
- return r;
|
|
|
}
|
|
|
|
|
|
static int __exit hdmic_remove(struct platform_device *pdev)
|
|
|
{
|
|
|
struct panel_drv_data *ddata = platform_get_drvdata(pdev);
|
|
|
struct omap_dss_device *dssdev = &ddata->dssdev;
|
|
|
- struct omap_dss_device *in = ddata->in;
|
|
|
|
|
|
omapdss_unregister_display(&ddata->dssdev);
|
|
|
|
|
|
hdmic_disable(dssdev);
|
|
|
hdmic_disconnect(dssdev);
|
|
|
|
|
|
- omap_dss_put_device(in);
|
|
|
-
|
|
|
return 0;
|
|
|
}
|
|
|
|