aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorTomi Valkeinen <tomi.valkeinen@ti.com>2015-06-04 07:44:49 -0400
committerTomi Valkeinen <tomi.valkeinen@ti.com>2015-06-17 06:44:57 -0400
commitad4eaef7bacb034b92273806bbca2e525fb94deb (patch)
treece7784a17caff0191b4ecda6b29c478826f02b27 /drivers
parent736e60ddc215b85e73bbf7da26e1cde84cc9500f (diff)
OMAPDSS: simplify submodule reg/unreg code
Now that we are using components in omapdss, there's no need for separate handling of dss and dispc driver init. Thus we can move the dss and dispc init and unit func pointers to the lists we use for the other dss submodules. We can now also handle errors returned by the registration functions properly: if registering a driver fails, we can stop processing and return the error. Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com> Acked-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/video/fbdev/omap2/dss/core.c46
1 files changed, 15 insertions, 31 deletions
diff --git a/drivers/video/fbdev/omap2/dss/core.c b/drivers/video/fbdev/omap2/dss/core.c
index 5c64515de818..54eeb507f9b3 100644
--- a/drivers/video/fbdev/omap2/dss/core.c
+++ b/drivers/video/fbdev/omap2/dss/core.c
@@ -245,6 +245,8 @@ static struct platform_driver omap_dss_driver = {
245 245
246/* INIT */ 246/* INIT */
247static int (*dss_output_drv_reg_funcs[])(void) __initdata = { 247static int (*dss_output_drv_reg_funcs[])(void) __initdata = {
248 dss_init_platform_driver,
249 dispc_init_platform_driver,
248#ifdef CONFIG_OMAP2_DSS_DSI 250#ifdef CONFIG_OMAP2_DSS_DSI
249 dsi_init_platform_driver, 251 dsi_init_platform_driver,
250#endif 252#endif
@@ -268,7 +270,7 @@ static int (*dss_output_drv_reg_funcs[])(void) __initdata = {
268#endif 270#endif
269}; 271};
270 272
271static void (*dss_output_drv_unreg_funcs[])(void) __exitdata = { 273static void (*dss_output_drv_unreg_funcs[])(void) = {
272#ifdef CONFIG_OMAP5_DSS_HDMI 274#ifdef CONFIG_OMAP5_DSS_HDMI
273 hdmi5_uninit_platform_driver, 275 hdmi5_uninit_platform_driver,
274#endif 276#endif
@@ -290,10 +292,10 @@ static void (*dss_output_drv_unreg_funcs[])(void) __exitdata = {
290#ifdef CONFIG_OMAP2_DSS_DSI 292#ifdef CONFIG_OMAP2_DSS_DSI
291 dsi_uninit_platform_driver, 293 dsi_uninit_platform_driver,
292#endif 294#endif
295 dispc_uninit_platform_driver,
296 dss_uninit_platform_driver,
293}; 297};
294 298
295static bool dss_output_drv_loaded[ARRAY_SIZE(dss_output_drv_reg_funcs)];
296
297static int __init omap_dss_init(void) 299static int __init omap_dss_init(void)
298{ 300{
299 int r; 301 int r;
@@ -303,33 +305,20 @@ static int __init omap_dss_init(void)
303 if (r) 305 if (r)
304 return r; 306 return r;
305 307
306 r = dss_init_platform_driver();
307 if (r) {
308 DSSERR("Failed to initialize DSS platform driver\n");
309 goto err_dss;
310 }
311
312 r = dispc_init_platform_driver();
313 if (r) {
314 DSSERR("Failed to initialize dispc platform driver\n");
315 goto err_dispc;
316 }
317
318 /*
319 * It's ok if the output-driver register fails. It happens, for example,
320 * when there is no output-device (e.g. SDI for OMAP4).
321 */
322 for (i = 0; i < ARRAY_SIZE(dss_output_drv_reg_funcs); ++i) { 308 for (i = 0; i < ARRAY_SIZE(dss_output_drv_reg_funcs); ++i) {
323 r = dss_output_drv_reg_funcs[i](); 309 r = dss_output_drv_reg_funcs[i]();
324 if (r == 0) 310 if (r)
325 dss_output_drv_loaded[i] = true; 311 goto err_reg;
326 } 312 }
327 313
328 return 0; 314 return 0;
329 315
330err_dispc: 316err_reg:
331 dss_uninit_platform_driver(); 317 for (i = ARRAY_SIZE(dss_output_drv_reg_funcs) - i;
332err_dss: 318 i < ARRAY_SIZE(dss_output_drv_reg_funcs);
319 ++i)
320 dss_output_drv_unreg_funcs[i]();
321
333 platform_driver_unregister(&omap_dss_driver); 322 platform_driver_unregister(&omap_dss_driver);
334 323
335 return r; 324 return r;
@@ -339,13 +328,8 @@ static void __exit omap_dss_exit(void)
339{ 328{
340 int i; 329 int i;
341 330
342 for (i = 0; i < ARRAY_SIZE(dss_output_drv_unreg_funcs); ++i) { 331 for (i = 0; i < ARRAY_SIZE(dss_output_drv_unreg_funcs); ++i)
343 if (dss_output_drv_loaded[i]) 332 dss_output_drv_unreg_funcs[i]();
344 dss_output_drv_unreg_funcs[i]();
345 }
346
347 dispc_uninit_platform_driver();
348 dss_uninit_platform_driver();
349 333
350 platform_driver_unregister(&omap_dss_driver); 334 platform_driver_unregister(&omap_dss_driver);
351} 335}