diff options
Diffstat (limited to 'drivers/video/fbdev/omap2')
-rw-r--r-- | drivers/video/fbdev/omap2/dss/dpi.c | 36 | ||||
-rw-r--r-- | drivers/video/fbdev/omap2/dss/dss.c | 12 | ||||
-rw-r--r-- | drivers/video/fbdev/omap2/dss/dss.h | 2 |
3 files changed, 42 insertions, 8 deletions
diff --git a/drivers/video/fbdev/omap2/dss/dpi.c b/drivers/video/fbdev/omap2/dss/dpi.c index c9face608b2a..224d7885eeeb 100644 --- a/drivers/video/fbdev/omap2/dss/dpi.c +++ b/drivers/video/fbdev/omap2/dss/dpi.c @@ -59,6 +59,7 @@ static struct dpi_data *dpi_get_data_from_dssdev(struct omap_dss_device *dssdev) return container_of(dssdev, struct dpi_data, output); } +/* only used in non-DT mode */ static struct dpi_data *dpi_get_data_from_pdev(struct platform_device *pdev) { return dev_get_drvdata(&pdev->dev); @@ -724,6 +725,30 @@ static void __exit dpi_uninit_output(struct platform_device *pdev) omapdss_unregister_output(out); } +static void dpi_init_output_port(struct platform_device *pdev, + struct device_node *port) +{ + struct dpi_data *dpi = port->data; + struct omap_dss_device *out = &dpi->output; + + out->dev = &pdev->dev; + out->id = OMAP_DSS_OUTPUT_DPI; + out->output_type = OMAP_DISPLAY_TYPE_DPI; + out->dispc_channel = dpi_get_channel(); + out->ops.dpi = &dpi_ops; + out->owner = THIS_MODULE; + + omapdss_register_output(out); +} + +static void __exit dpi_uninit_output_port(struct device_node *port) +{ + struct dpi_data *dpi = port->data; + struct omap_dss_device *out = &dpi->output; + + omapdss_unregister_output(out); +} + static int omap_dpi_probe(struct platform_device *pdev) { struct dpi_data *dpi; @@ -796,15 +821,14 @@ int __init dpi_init_port(struct platform_device *pdev, struct device_node *port) of_node_put(ep); dpi->pdev = pdev; + port->data = dpi; mutex_init(&dpi->lock); - dpi_init_output(pdev); + dpi_init_output_port(pdev, port); dpi->port_initialized = true; - dev_set_drvdata(&pdev->dev, dpi); - return 0; err_datalines: @@ -813,12 +837,12 @@ err_datalines: return r; } -void __exit dpi_uninit_port(struct platform_device *pdev) +void __exit dpi_uninit_port(struct device_node *port) { - struct dpi_data *dpi = dpi_get_data_from_pdev(pdev); + struct dpi_data *dpi = port->data; if (!dpi->port_initialized) return; - dpi_uninit_output(dpi->pdev); + dpi_uninit_output_port(port); } diff --git a/drivers/video/fbdev/omap2/dss/dss.c b/drivers/video/fbdev/omap2/dss/dss.c index 8a4a6d2d1edf..391a6da55e8d 100644 --- a/drivers/video/fbdev/omap2/dss/dss.c +++ b/drivers/video/fbdev/omap2/dss/dss.c @@ -822,8 +822,18 @@ static int __init dss_init_ports(struct platform_device *pdev) static void __exit dss_uninit_ports(struct platform_device *pdev) { + struct device_node *parent = pdev->dev.of_node; + struct device_node *port; + + if (parent == NULL) + return; + + port = omapdss_of_get_next_port(parent, NULL); + if (!port) + return; + #ifdef CONFIG_OMAP2_DSS_DPI - dpi_uninit_port(pdev); + dpi_uninit_port(port); #endif #ifdef CONFIG_OMAP2_DSS_SDI diff --git a/drivers/video/fbdev/omap2/dss/dss.h b/drivers/video/fbdev/omap2/dss/dss.h index da7f5f9bc270..5b9db95533bd 100644 --- a/drivers/video/fbdev/omap2/dss/dss.h +++ b/drivers/video/fbdev/omap2/dss/dss.h @@ -359,7 +359,7 @@ int dpi_init_platform_driver(void) __init; void dpi_uninit_platform_driver(void) __exit; int dpi_init_port(struct platform_device *pdev, struct device_node *port) __init; -void dpi_uninit_port(struct platform_device *pdev) __exit; +void dpi_uninit_port(struct device_node *port) __exit; /* DISPC */ int dispc_init_platform_driver(void) __init; |