aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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}