aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorTomi Valkeinen <tomi.valkeinen@ti.com>2012-03-02 10:37:53 -0500
committerTomi Valkeinen <tomi.valkeinen@ti.com>2012-05-11 07:44:52 -0400
commit461395c464e559a01cbc66d97ed4b8585b437cf9 (patch)
tree5e0f97a1d61fdcb8c59c7f6f3674508c16aab767 /drivers
parent852f083843af618eaa8997f7803c9aed8293fdf9 (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.c111
-rw-r--r--drivers/video/omap2/dss/dss.h41
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 */
518static 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
539static 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
560static bool dss_output_drv_loaded[ARRAY_SIZE(dss_output_drv_reg_funcs)];
518 561
519static int __init omap_dss_register_drivers(void) 562static 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
577err_hdmi:
578 dsi_uninit_platform_driver();
579err_dsi:
580 venc_uninit_platform_driver();
581err_venc:
582 rfbi_uninit_platform_driver();
583err_rfbi:
584 sdi_uninit_platform_driver();
585err_sdi:
586 dpi_uninit_platform_driver();
587err_dpi:
588 dispc_uninit_platform_driver();
589err_dispc: 595err_dispc:
590 dss_uninit_platform_driver(); 596 dss_uninit_platform_driver();
591err_dss: 597err_dss:
@@ -596,12 +602,13 @@ err_dss:
596 602
597static void __exit omap_dss_unregister_drivers(void) 603static 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
272int sdi_init_platform_driver(void); 271int sdi_init_platform_driver(void);
273void sdi_uninit_platform_driver(void); 272void sdi_uninit_platform_driver(void);
274int sdi_init_display(struct omap_dss_device *display); 273int sdi_init_display(struct omap_dss_device *display);
275#else
276static inline int sdi_init_platform_driver(void) { return 0; }
277static 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);
312void dsi_wait_pll_hsdiv_dsi_active(struct platform_device *dsidev); 307void dsi_wait_pll_hsdiv_dsi_active(struct platform_device *dsidev);
313struct platform_device *dsi_get_dsidev_from_id(int module); 308struct platform_device *dsi_get_dsidev_from_id(int module);
314#else 309#else
315static inline int dsi_init_platform_driver(void)
316{
317 return 0;
318}
319static inline void dsi_uninit_platform_driver(void)
320{
321}
322static inline int dsi_runtime_get(struct platform_device *dsidev) 310static 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
379int dpi_init_platform_driver(void); 366int dpi_init_platform_driver(void);
380void dpi_uninit_platform_driver(void); 367void dpi_uninit_platform_driver(void);
381int dpi_init_display(struct omap_dss_device *dssdev); 368int dpi_init_display(struct omap_dss_device *dssdev);
382#else
383static inline int dpi_init_platform_driver(void) { return 0; }
384static inline void dpi_uninit_platform_driver(void) { }
385#endif
386 369
387/* DISPC */ 370/* DISPC */
388int dispc_init_platform_driver(void); 371int dispc_init_platform_driver(void);
@@ -459,13 +442,6 @@ void venc_dump_regs(struct seq_file *s);
459int venc_init_display(struct omap_dss_device *display); 442int venc_init_display(struct omap_dss_device *display);
460unsigned long venc_get_pixel_clock(void); 443unsigned long venc_get_pixel_clock(void);
461#else 444#else
462static inline int venc_init_platform_driver(void)
463{
464 return 0;
465}
466static inline void venc_uninit_platform_driver(void)
467{
468}
469static inline unsigned long venc_get_pixel_clock(void) 445static 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}
488static inline int hdmi_init_platform_driver(void)
489{
490 return 0;
491}
492static inline void hdmi_uninit_platform_driver(void)
493{
494}
495static inline unsigned long hdmi_get_pixel_clock(void) 464static 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);
509void hdmi_panel_exit(void); 478void hdmi_panel_exit(void);
510 479
511/* RFBI */ 480/* RFBI */
512#ifdef CONFIG_OMAP2_DSS_RFBI
513int rfbi_init_platform_driver(void); 481int rfbi_init_platform_driver(void);
514void rfbi_uninit_platform_driver(void); 482void rfbi_uninit_platform_driver(void);
515void rfbi_dump_regs(struct seq_file *s); 483void rfbi_dump_regs(struct seq_file *s);
516int rfbi_init_display(struct omap_dss_device *display); 484int rfbi_init_display(struct omap_dss_device *display);
517#else
518static inline int rfbi_init_platform_driver(void)
519{
520 return 0;
521}
522static 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