|
@@ -115,16 +115,25 @@ static int init_nec_8048_wvga_lcd(struct spi_device *spi)
|
|
|
static int nec_8048_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;
|
|
|
|
|
|
if (omapdss_device_is_connected(dssdev))
|
|
|
return 0;
|
|
|
|
|
|
+ in = omapdss_of_find_source_for_first_ep(dssdev->dev->of_node);
|
|
|
+ if (IS_ERR(in)) {
|
|
|
+ dev_err(dssdev->dev, "failed to find video source\n");
|
|
|
+ return PTR_ERR(in);
|
|
|
+ }
|
|
|
+
|
|
|
r = in->ops.dpi->connect(in, dssdev);
|
|
|
- if (r)
|
|
|
+ if (r) {
|
|
|
+ omap_dss_put_device(in);
|
|
|
return r;
|
|
|
+ }
|
|
|
|
|
|
+ ddata->in = in;
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -137,6 +146,9 @@ static void nec_8048_disconnect(struct omap_dss_device *dssdev)
|
|
|
return;
|
|
|
|
|
|
in->ops.dpi->disconnect(in, dssdev);
|
|
|
+
|
|
|
+ omap_dss_put_device(in);
|
|
|
+ ddata->in = NULL;
|
|
|
}
|
|
|
|
|
|
static int nec_8048_enable(struct omap_dss_device *dssdev)
|
|
@@ -226,7 +238,6 @@ static int nec_8048_probe_of(struct spi_device *spi)
|
|
|
{
|
|
|
struct device_node *node = spi->dev.of_node;
|
|
|
struct panel_drv_data *ddata = dev_get_drvdata(&spi->dev);
|
|
|
- struct omap_dss_device *in;
|
|
|
int gpio;
|
|
|
|
|
|
gpio = of_get_named_gpio(node, "reset-gpios", 0);
|
|
@@ -239,14 +250,6 @@ static int nec_8048_probe_of(struct spi_device *spi)
|
|
|
/* XXX the panel spec doesn't mention any QVGA pin?? */
|
|
|
ddata->qvga_gpio = -ENOENT;
|
|
|
|
|
|
- in = omapdss_of_find_source_for_first_ep(node);
|
|
|
- if (IS_ERR(in)) {
|
|
|
- dev_err(&spi->dev, "failed to find video source\n");
|
|
|
- return PTR_ERR(in);
|
|
|
- }
|
|
|
-
|
|
|
- ddata->in = in;
|
|
|
-
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -285,14 +288,14 @@ static int nec_8048_probe(struct spi_device *spi)
|
|
|
r = devm_gpio_request_one(&spi->dev, ddata->qvga_gpio,
|
|
|
GPIOF_OUT_INIT_HIGH, "lcd QVGA");
|
|
|
if (r)
|
|
|
- goto err_gpio;
|
|
|
+ return r;
|
|
|
}
|
|
|
|
|
|
if (gpio_is_valid(ddata->res_gpio)) {
|
|
|
r = devm_gpio_request_one(&spi->dev, ddata->res_gpio,
|
|
|
GPIOF_OUT_INIT_LOW, "lcd RES");
|
|
|
if (r)
|
|
|
- goto err_gpio;
|
|
|
+ return r;
|
|
|
}
|
|
|
|
|
|
ddata->vm = nec_8048_panel_vm;
|
|
@@ -307,22 +310,16 @@ static int nec_8048_probe(struct spi_device *spi)
|
|
|
r = omapdss_register_display(dssdev);
|
|
|
if (r) {
|
|
|
dev_err(&spi->dev, "Failed to register panel\n");
|
|
|
- goto err_reg;
|
|
|
+ return r;
|
|
|
}
|
|
|
|
|
|
return 0;
|
|
|
-
|
|
|
-err_reg:
|
|
|
-err_gpio:
|
|
|
- omap_dss_put_device(ddata->in);
|
|
|
- return r;
|
|
|
}
|
|
|
|
|
|
static int nec_8048_remove(struct spi_device *spi)
|
|
|
{
|
|
|
struct panel_drv_data *ddata = dev_get_drvdata(&spi->dev);
|
|
|
struct omap_dss_device *dssdev = &ddata->dssdev;
|
|
|
- struct omap_dss_device *in = ddata->in;
|
|
|
|
|
|
dev_dbg(&ddata->spi->dev, "%s\n", __func__);
|
|
|
|
|
@@ -331,8 +328,6 @@ static int nec_8048_remove(struct spi_device *spi)
|
|
|
nec_8048_disable(dssdev);
|
|
|
nec_8048_disconnect(dssdev);
|
|
|
|
|
|
- omap_dss_put_device(in);
|
|
|
-
|
|
|
return 0;
|
|
|
}
|
|
|
|