diff options
-rw-r--r-- | drivers/video/fbdev/omap2/dss/core.c | 46 |
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 */ |
247 | static int (*dss_output_drv_reg_funcs[])(void) __initdata = { | 247 | static 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 | ||
271 | static void (*dss_output_drv_unreg_funcs[])(void) __exitdata = { | 273 | static 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 | ||
295 | static bool dss_output_drv_loaded[ARRAY_SIZE(dss_output_drv_reg_funcs)]; | ||
296 | |||
297 | static int __init omap_dss_init(void) | 299 | static 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 | ||
330 | err_dispc: | 316 | err_reg: |
331 | dss_uninit_platform_driver(); | 317 | for (i = ARRAY_SIZE(dss_output_drv_reg_funcs) - i; |
332 | err_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 | } |