From: Archit Taneja Date: Sun, 1 Jun 2014 07:17:44 +0000 (+0530) Subject: OMAPDSS: DPI: Allocate driver data X-Git-Url: https://git.stricted.de/?a=commitdiff_plain;h=2ac6a1aae8f038662b09f2755827dfbe9456894d;p=GitHub%2FLineageOS%2FG12%2Fandroid_kernel_amlogic_linux-4.9.git OMAPDSS: DPI: Allocate driver data Allocate driver data(dpi_data) for each DPI instance. It's allocated in omap_dpi_probe() when DT isn't used, and in dpi_init_port() when DT is used. The dpi_data struct instance is no longer global. In the case of DPI ops, it's retrieved from dpi_get_data_from_dssdev(). 'dssdev' passed by the connected encoder/panel driver is a pointer to the 'output' member in dpi_data, and thus can be used to get the DPI instance's driver data. In the case of probe/ini_port functions, it's set as DPI/DSS device's private data embedded in the platform_device struct. Having dpi_data as private data of the platform device will not work for multiple DPI instances in the DT case. This is because there is no corresponding platform_device for DPI or SDI, they exist only as ports under the parent DSS platform_device in the DT case. The DPI port's private data('data' member in device_node struct) will later be used to store dpi_data. Signed-off-by: Archit Taneja Signed-off-by: Tomi Valkeinen --- diff --git a/drivers/video/fbdev/omap2/dss/dpi.c b/drivers/video/fbdev/omap2/dss/dpi.c index 35285d8395b5..c9face608b2a 100644 --- a/drivers/video/fbdev/omap2/dss/dpi.c +++ b/drivers/video/fbdev/omap2/dss/dpi.c @@ -54,7 +54,15 @@ struct dpi_data { bool port_initialized; }; -static struct dpi_data dpi_data; +static struct dpi_data *dpi_get_data_from_dssdev(struct omap_dss_device *dssdev) +{ + return container_of(dssdev, struct dpi_data, output); +} + +static struct dpi_data *dpi_get_data_from_pdev(struct platform_device *pdev) +{ + return dev_get_drvdata(&pdev->dev); +} static struct platform_device *dpi_get_dsidev(enum omap_channel channel) { @@ -359,7 +367,7 @@ static void dpi_config_lcd_manager(struct dpi_data *dpi) static int dpi_display_enable(struct omap_dss_device *dssdev) { - struct dpi_data *dpi = &dpi_data; + struct dpi_data *dpi = dpi_get_data_from_dssdev(dssdev); struct omap_dss_device *out = &dpi->output; int r; @@ -439,7 +447,7 @@ err_no_reg: static void dpi_display_disable(struct omap_dss_device *dssdev) { - struct dpi_data *dpi = &dpi_data; + struct dpi_data *dpi = dpi_get_data_from_dssdev(dssdev); struct omap_overlay_manager *mgr = dpi->output.manager; mutex_lock(&dpi->lock); @@ -463,7 +471,7 @@ static void dpi_display_disable(struct omap_dss_device *dssdev) static void dpi_set_timings(struct omap_dss_device *dssdev, struct omap_video_timings *timings) { - struct dpi_data *dpi = &dpi_data; + struct dpi_data *dpi = dpi_get_data_from_dssdev(dssdev); DSSDBG("dpi_set_timings\n"); @@ -477,7 +485,7 @@ static void dpi_set_timings(struct omap_dss_device *dssdev, static void dpi_get_timings(struct omap_dss_device *dssdev, struct omap_video_timings *timings) { - struct dpi_data *dpi = &dpi_data; + struct dpi_data *dpi = dpi_get_data_from_dssdev(dssdev); mutex_lock(&dpi->lock); @@ -489,7 +497,7 @@ static void dpi_get_timings(struct omap_dss_device *dssdev, static int dpi_check_timings(struct omap_dss_device *dssdev, struct omap_video_timings *timings) { - struct dpi_data *dpi = &dpi_data; + struct dpi_data *dpi = dpi_get_data_from_dssdev(dssdev); struct omap_overlay_manager *mgr = dpi->output.manager; int lck_div, pck_div; unsigned long fck; @@ -529,7 +537,7 @@ static int dpi_check_timings(struct omap_dss_device *dssdev, static void dpi_set_data_lines(struct omap_dss_device *dssdev, int data_lines) { - struct dpi_data *dpi = &dpi_data; + struct dpi_data *dpi = dpi_get_data_from_dssdev(dssdev); mutex_lock(&dpi->lock); @@ -635,7 +643,7 @@ static enum omap_channel dpi_get_channel(void) static int dpi_connect(struct omap_dss_device *dssdev, struct omap_dss_device *dst) { - struct dpi_data *dpi = &dpi_data; + struct dpi_data *dpi = dpi_get_data_from_dssdev(dssdev); struct omap_overlay_manager *mgr; int r; @@ -694,7 +702,7 @@ static const struct omapdss_dpi_ops dpi_ops = { static void dpi_init_output(struct platform_device *pdev) { - struct dpi_data *dpi = &dpi_data; + struct dpi_data *dpi = dpi_get_data_from_pdev(pdev); struct omap_dss_device *out = &dpi->output; out->dev = &pdev->dev; @@ -710,7 +718,7 @@ static void dpi_init_output(struct platform_device *pdev) static void __exit dpi_uninit_output(struct platform_device *pdev) { - struct dpi_data *dpi = &dpi_data; + struct dpi_data *dpi = dpi_get_data_from_pdev(pdev); struct omap_dss_device *out = &dpi->output; omapdss_unregister_output(out); @@ -718,7 +726,11 @@ static void __exit dpi_uninit_output(struct platform_device *pdev) static int omap_dpi_probe(struct platform_device *pdev) { - struct dpi_data *dpi = &dpi_data; + struct dpi_data *dpi; + + dpi = devm_kzalloc(&pdev->dev, sizeof(*dpi), GFP_KERNEL); + if (!dpi) + return -ENOMEM; dpi->pdev = pdev; @@ -760,11 +772,15 @@ void __exit dpi_uninit_platform_driver(void) int __init dpi_init_port(struct platform_device *pdev, struct device_node *port) { - struct dpi_data *dpi = &dpi_data; + struct dpi_data *dpi; struct device_node *ep; u32 datalines; int r; + dpi = devm_kzalloc(&pdev->dev, sizeof(*dpi), GFP_KERNEL); + if (!dpi) + return -ENOMEM; + ep = omapdss_of_get_next_endpoint(port, NULL); if (!ep) return 0; @@ -787,6 +803,8 @@ int __init dpi_init_port(struct platform_device *pdev, struct device_node *port) dpi->port_initialized = true; + dev_set_drvdata(&pdev->dev, dpi); + return 0; err_datalines: @@ -795,9 +813,9 @@ err_datalines: return r; } -void __exit dpi_uninit_port(void) +void __exit dpi_uninit_port(struct platform_device *pdev) { - struct dpi_data *dpi = &dpi_data; + struct dpi_data *dpi = dpi_get_data_from_pdev(pdev); if (!dpi->port_initialized) return; diff --git a/drivers/video/fbdev/omap2/dss/dss.c b/drivers/video/fbdev/omap2/dss/dss.c index 14bcd6c43f72..8a4a6d2d1edf 100644 --- a/drivers/video/fbdev/omap2/dss/dss.c +++ b/drivers/video/fbdev/omap2/dss/dss.c @@ -820,10 +820,10 @@ static int __init dss_init_ports(struct platform_device *pdev) return 0; } -static void __exit dss_uninit_ports(void) +static void __exit dss_uninit_ports(struct platform_device *pdev) { #ifdef CONFIG_OMAP2_DSS_DPI - dpi_uninit_port(); + dpi_uninit_port(pdev); #endif #ifdef CONFIG_OMAP2_DSS_SDI @@ -910,7 +910,7 @@ err_setup_clocks: static int __exit omap_dsshw_remove(struct platform_device *pdev) { - dss_uninit_ports(); + dss_uninit_ports(pdev); pm_runtime_disable(&pdev->dev); diff --git a/drivers/video/fbdev/omap2/dss/dss.h b/drivers/video/fbdev/omap2/dss/dss.h index 8ff22c134c62..da7f5f9bc270 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(void) __exit; +void dpi_uninit_port(struct platform_device *pdev) __exit; /* DISPC */ int dispc_init_platform_driver(void) __init;