diff options
author | Tomi Valkeinen <tomi.valkeinen@ti.com> | 2012-03-02 10:37:53 -0500 |
---|---|---|
committer | Tomi Valkeinen <tomi.valkeinen@ti.com> | 2012-05-11 07:44:52 -0400 |
commit | 461395c464e559a01cbc66d97ed4b8585b437cf9 (patch) | |
tree | 5e0f97a1d61fdcb8c59c7f6f3674508c16aab767 /drivers | |
parent | 852f083843af618eaa8997f7803c9aed8293fdf9 (diff) |
OMAPDSS: handle output-driver reg/unreg more dynamically
Initialize and uninitialize the output drivers by using arrays of
pointers to the init/uninit functions. This simplifies the code
slightly.
Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/video/omap2/dss/core.c | 111 | ||||
-rw-r--r-- | drivers/video/omap2/dss/dss.h | 41 |
2 files changed, 59 insertions, 93 deletions
diff --git a/drivers/video/omap2/dss/core.c b/drivers/video/omap2/dss/core.c index 77fbd99295dc..2a0cbaeed211 100644 --- a/drivers/video/omap2/dss/core.c +++ b/drivers/video/omap2/dss/core.c | |||
@@ -515,10 +515,54 @@ static int omap_dss_bus_register(void) | |||
515 | } | 515 | } |
516 | 516 | ||
517 | /* INIT */ | 517 | /* INIT */ |
518 | static int (*dss_output_drv_reg_funcs[])(void) __initdata = { | ||
519 | #ifdef CONFIG_OMAP2_DSS_DPI | ||
520 | dpi_init_platform_driver, | ||
521 | #endif | ||
522 | #ifdef CONFIG_OMAP2_DSS_SDI | ||
523 | sdi_init_platform_driver, | ||
524 | #endif | ||
525 | #ifdef CONFIG_OMAP2_DSS_RFBI | ||
526 | rfbi_init_platform_driver, | ||
527 | #endif | ||
528 | #ifdef CONFIG_OMAP2_DSS_VENC | ||
529 | venc_init_platform_driver, | ||
530 | #endif | ||
531 | #ifdef CONFIG_OMAP2_DSS_DSI | ||
532 | dsi_init_platform_driver, | ||
533 | #endif | ||
534 | #ifdef CONFIG_OMAP4_DSS_HDMI | ||
535 | hdmi_init_platform_driver, | ||
536 | #endif | ||
537 | }; | ||
538 | |||
539 | static void (*dss_output_drv_unreg_funcs[])(void) __exitdata = { | ||
540 | #ifdef CONFIG_OMAP2_DSS_DPI | ||
541 | dpi_uninit_platform_driver, | ||
542 | #endif | ||
543 | #ifdef CONFIG_OMAP2_DSS_SDI | ||
544 | sdi_uninit_platform_driver, | ||
545 | #endif | ||
546 | #ifdef CONFIG_OMAP2_DSS_RFBI | ||
547 | rfbi_uninit_platform_driver, | ||
548 | #endif | ||
549 | #ifdef CONFIG_OMAP2_DSS_VENC | ||
550 | venc_uninit_platform_driver, | ||
551 | #endif | ||
552 | #ifdef CONFIG_OMAP2_DSS_DSI | ||
553 | dsi_uninit_platform_driver, | ||
554 | #endif | ||
555 | #ifdef CONFIG_OMAP4_DSS_HDMI | ||
556 | hdmi_uninit_platform_driver, | ||
557 | #endif | ||
558 | }; | ||
559 | |||
560 | static bool dss_output_drv_loaded[ARRAY_SIZE(dss_output_drv_reg_funcs)]; | ||
518 | 561 | ||
519 | static int __init omap_dss_register_drivers(void) | 562 | static int __init omap_dss_register_drivers(void) |
520 | { | 563 | { |
521 | int r; | 564 | int r; |
565 | int i; | ||
522 | 566 | ||
523 | r = platform_driver_probe(&omap_dss_driver, omap_dss_probe); | 567 | r = platform_driver_probe(&omap_dss_driver, omap_dss_probe); |
524 | if (r) | 568 | if (r) |
@@ -536,56 +580,18 @@ static int __init omap_dss_register_drivers(void) | |||
536 | goto err_dispc; | 580 | goto err_dispc; |
537 | } | 581 | } |
538 | 582 | ||
539 | r = dpi_init_platform_driver(); | 583 | /* |
540 | if (r) { | 584 | * It's ok if the output-driver register fails. It happens, for example, |
541 | DSSERR("Failed to initialize dpi platform driver\n"); | 585 | * when there is no output-device (e.g. SDI for OMAP4). |
542 | goto err_dpi; | 586 | */ |
543 | } | 587 | for (i = 0; i < ARRAY_SIZE(dss_output_drv_reg_funcs); ++i) { |
544 | 588 | r = dss_output_drv_reg_funcs[i](); | |
545 | r = sdi_init_platform_driver(); | 589 | if (r == 0) |
546 | if (r) { | 590 | dss_output_drv_loaded[i] = true; |
547 | DSSERR("Failed to initialize sdi platform driver\n"); | ||
548 | goto err_sdi; | ||
549 | } | ||
550 | |||
551 | r = rfbi_init_platform_driver(); | ||
552 | if (r) { | ||
553 | DSSERR("Failed to initialize rfbi platform driver\n"); | ||
554 | goto err_rfbi; | ||
555 | } | ||
556 | |||
557 | r = venc_init_platform_driver(); | ||
558 | if (r) { | ||
559 | DSSERR("Failed to initialize venc platform driver\n"); | ||
560 | goto err_venc; | ||
561 | } | ||
562 | |||
563 | r = dsi_init_platform_driver(); | ||
564 | if (r) { | ||
565 | DSSERR("Failed to initialize DSI platform driver\n"); | ||
566 | goto err_dsi; | ||
567 | } | ||
568 | |||
569 | r = hdmi_init_platform_driver(); | ||
570 | if (r) { | ||
571 | DSSERR("Failed to initialize hdmi\n"); | ||
572 | goto err_hdmi; | ||
573 | } | 591 | } |
574 | 592 | ||
575 | return 0; | 593 | return 0; |
576 | 594 | ||
577 | err_hdmi: | ||
578 | dsi_uninit_platform_driver(); | ||
579 | err_dsi: | ||
580 | venc_uninit_platform_driver(); | ||
581 | err_venc: | ||
582 | rfbi_uninit_platform_driver(); | ||
583 | err_rfbi: | ||
584 | sdi_uninit_platform_driver(); | ||
585 | err_sdi: | ||
586 | dpi_uninit_platform_driver(); | ||
587 | err_dpi: | ||
588 | dispc_uninit_platform_driver(); | ||
589 | err_dispc: | 595 | err_dispc: |
590 | dss_uninit_platform_driver(); | 596 | dss_uninit_platform_driver(); |
591 | err_dss: | 597 | err_dss: |
@@ -596,12 +602,13 @@ err_dss: | |||
596 | 602 | ||
597 | static void __exit omap_dss_unregister_drivers(void) | 603 | static void __exit omap_dss_unregister_drivers(void) |
598 | { | 604 | { |
599 | hdmi_uninit_platform_driver(); | 605 | int i; |
600 | dsi_uninit_platform_driver(); | 606 | |
601 | venc_uninit_platform_driver(); | 607 | for (i = 0; i < ARRAY_SIZE(dss_output_drv_unreg_funcs); ++i) { |
602 | rfbi_uninit_platform_driver(); | 608 | if (dss_output_drv_loaded[i]) |
603 | sdi_uninit_platform_driver(); | 609 | dss_output_drv_unreg_funcs[i](); |
604 | dpi_uninit_platform_driver(); | 610 | } |
611 | |||
605 | dispc_uninit_platform_driver(); | 612 | dispc_uninit_platform_driver(); |
606 | dss_uninit_platform_driver(); | 613 | dss_uninit_platform_driver(); |
607 | 614 | ||
diff --git a/drivers/video/omap2/dss/dss.h b/drivers/video/omap2/dss/dss.h index 28a856822a87..ce0feb17c642 100644 --- a/drivers/video/omap2/dss/dss.h +++ b/drivers/video/omap2/dss/dss.h | |||
@@ -268,14 +268,9 @@ int dss_calc_clock_div(bool is_tft, unsigned long req_pck, | |||
268 | struct dispc_clock_info *dispc_cinfo); | 268 | struct dispc_clock_info *dispc_cinfo); |
269 | 269 | ||
270 | /* SDI */ | 270 | /* SDI */ |
271 | #ifdef CONFIG_OMAP2_DSS_SDI | ||
272 | int sdi_init_platform_driver(void); | 271 | int sdi_init_platform_driver(void); |
273 | void sdi_uninit_platform_driver(void); | 272 | void sdi_uninit_platform_driver(void); |
274 | int sdi_init_display(struct omap_dss_device *display); | 273 | int sdi_init_display(struct omap_dss_device *display); |
275 | #else | ||
276 | static inline int sdi_init_platform_driver(void) { return 0; } | ||
277 | static inline void sdi_uninit_platform_driver(void) { } | ||
278 | #endif | ||
279 | 274 | ||
280 | /* DSI */ | 275 | /* DSI */ |
281 | #ifdef CONFIG_OMAP2_DSS_DSI | 276 | #ifdef CONFIG_OMAP2_DSS_DSI |
@@ -312,13 +307,6 @@ void dsi_wait_pll_hsdiv_dispc_active(struct platform_device *dsidev); | |||
312 | void dsi_wait_pll_hsdiv_dsi_active(struct platform_device *dsidev); | 307 | void dsi_wait_pll_hsdiv_dsi_active(struct platform_device *dsidev); |
313 | struct platform_device *dsi_get_dsidev_from_id(int module); | 308 | struct platform_device *dsi_get_dsidev_from_id(int module); |
314 | #else | 309 | #else |
315 | static inline int dsi_init_platform_driver(void) | ||
316 | { | ||
317 | return 0; | ||
318 | } | ||
319 | static inline void dsi_uninit_platform_driver(void) | ||
320 | { | ||
321 | } | ||
322 | static inline int dsi_runtime_get(struct platform_device *dsidev) | 310 | static inline int dsi_runtime_get(struct platform_device *dsidev) |
323 | { | 311 | { |
324 | return 0; | 312 | return 0; |
@@ -375,14 +363,9 @@ static inline struct platform_device *dsi_get_dsidev_from_id(int module) | |||
375 | #endif | 363 | #endif |
376 | 364 | ||
377 | /* DPI */ | 365 | /* DPI */ |
378 | #ifdef CONFIG_OMAP2_DSS_DPI | ||
379 | int dpi_init_platform_driver(void); | 366 | int dpi_init_platform_driver(void); |
380 | void dpi_uninit_platform_driver(void); | 367 | void dpi_uninit_platform_driver(void); |
381 | int dpi_init_display(struct omap_dss_device *dssdev); | 368 | int dpi_init_display(struct omap_dss_device *dssdev); |
382 | #else | ||
383 | static inline int dpi_init_platform_driver(void) { return 0; } | ||
384 | static inline void dpi_uninit_platform_driver(void) { } | ||
385 | #endif | ||
386 | 369 | ||
387 | /* DISPC */ | 370 | /* DISPC */ |
388 | int dispc_init_platform_driver(void); | 371 | int dispc_init_platform_driver(void); |
@@ -459,13 +442,6 @@ void venc_dump_regs(struct seq_file *s); | |||
459 | int venc_init_display(struct omap_dss_device *display); | 442 | int venc_init_display(struct omap_dss_device *display); |
460 | unsigned long venc_get_pixel_clock(void); | 443 | unsigned long venc_get_pixel_clock(void); |
461 | #else | 444 | #else |
462 | static inline int venc_init_platform_driver(void) | ||
463 | { | ||
464 | return 0; | ||
465 | } | ||
466 | static inline void venc_uninit_platform_driver(void) | ||
467 | { | ||
468 | } | ||
469 | static inline unsigned long venc_get_pixel_clock(void) | 445 | static inline unsigned long venc_get_pixel_clock(void) |
470 | { | 446 | { |
471 | WARN("%s: VENC not compiled in, returning pclk as 0\n", __func__); | 447 | WARN("%s: VENC not compiled in, returning pclk as 0\n", __func__); |
@@ -485,13 +461,6 @@ static inline int hdmi_init_display(struct omap_dss_device *dssdev) | |||
485 | { | 461 | { |
486 | return 0; | 462 | return 0; |
487 | } | 463 | } |
488 | static inline int hdmi_init_platform_driver(void) | ||
489 | { | ||
490 | return 0; | ||
491 | } | ||
492 | static inline void hdmi_uninit_platform_driver(void) | ||
493 | { | ||
494 | } | ||
495 | static inline unsigned long hdmi_get_pixel_clock(void) | 464 | static inline unsigned long hdmi_get_pixel_clock(void) |
496 | { | 465 | { |
497 | WARN("%s: HDMI not compiled in, returning pclk as 0\n", __func__); | 466 | WARN("%s: HDMI not compiled in, returning pclk as 0\n", __func__); |
@@ -509,20 +478,10 @@ int hdmi_panel_init(void); | |||
509 | void hdmi_panel_exit(void); | 478 | void hdmi_panel_exit(void); |
510 | 479 | ||
511 | /* RFBI */ | 480 | /* RFBI */ |
512 | #ifdef CONFIG_OMAP2_DSS_RFBI | ||
513 | int rfbi_init_platform_driver(void); | 481 | int rfbi_init_platform_driver(void); |
514 | void rfbi_uninit_platform_driver(void); | 482 | void rfbi_uninit_platform_driver(void); |
515 | void rfbi_dump_regs(struct seq_file *s); | 483 | void rfbi_dump_regs(struct seq_file *s); |
516 | int rfbi_init_display(struct omap_dss_device *display); | 484 | int rfbi_init_display(struct omap_dss_device *display); |
517 | #else | ||
518 | static inline int rfbi_init_platform_driver(void) | ||
519 | { | ||
520 | return 0; | ||
521 | } | ||
522 | static inline void rfbi_uninit_platform_driver(void) | ||
523 | { | ||
524 | } | ||
525 | #endif | ||
526 | 485 | ||
527 | 486 | ||
528 | #ifdef CONFIG_OMAP2_DSS_COLLECT_IRQ_STATS | 487 | #ifdef CONFIG_OMAP2_DSS_COLLECT_IRQ_STATS |