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 | } |
