aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/video/omap2/dss/manager.c49
-rw-r--r--include/video/omapdss.h1
2 files changed, 17 insertions, 33 deletions
diff --git a/drivers/video/omap2/dss/manager.c b/drivers/video/omap2/dss/manager.c
index 780a307c815..a08cc6e7f5c 100644
--- a/drivers/video/omap2/dss/manager.c
+++ b/drivers/video/omap2/dss/manager.c
@@ -34,7 +34,7 @@
34#include "dss_features.h" 34#include "dss_features.h"
35 35
36static int num_managers; 36static int num_managers;
37static struct list_head manager_list; 37static struct omap_overlay_manager *managers;
38 38
39static ssize_t manager_name_show(struct omap_overlay_manager *mgr, char *buf) 39static ssize_t manager_name_show(struct omap_overlay_manager *mgr, char *buf)
40{ 40{
@@ -585,25 +585,19 @@ static void omap_dss_mgr_get_info(struct omap_overlay_manager *mgr,
585 *info = mgr->info; 585 *info = mgr->info;
586} 586}
587 587
588static void omap_dss_add_overlay_manager(struct omap_overlay_manager *manager)
589{
590 ++num_managers;
591 list_add_tail(&manager->list, &manager_list);
592}
593
594int dss_init_overlay_managers(struct platform_device *pdev) 588int dss_init_overlay_managers(struct platform_device *pdev)
595{ 589{
596 int i, r; 590 int i, r;
597 591
598 INIT_LIST_HEAD(&manager_list); 592 num_managers = dss_feat_get_num_mgrs();
599 593
600 num_managers = 0; 594 managers = kzalloc(sizeof(struct omap_overlay_manager) * num_managers,
595 GFP_KERNEL);
601 596
602 for (i = 0; i < dss_feat_get_num_mgrs(); ++i) { 597 BUG_ON(managers == NULL);
603 struct omap_overlay_manager *mgr;
604 mgr = kzalloc(sizeof(*mgr), GFP_KERNEL);
605 598
606 BUG_ON(mgr == NULL); 599 for (i = 0; i < num_managers; ++i) {
600 struct omap_overlay_manager *mgr = &managers[i];
607 601
608 switch (i) { 602 switch (i) {
609 case 0: 603 case 0:
@@ -634,15 +628,11 @@ int dss_init_overlay_managers(struct platform_device *pdev)
634 628
635 dss_overlay_setup_dispc_manager(mgr); 629 dss_overlay_setup_dispc_manager(mgr);
636 630
637 omap_dss_add_overlay_manager(mgr);
638
639 r = kobject_init_and_add(&mgr->kobj, &manager_ktype, 631 r = kobject_init_and_add(&mgr->kobj, &manager_ktype,
640 &pdev->dev.kobj, "manager%d", i); 632 &pdev->dev.kobj, "manager%d", i);
641 633
642 if (r) { 634 if (r)
643 DSSERR("failed to create sysfs file\n"); 635 DSSERR("failed to create sysfs file\n");
644 continue;
645 }
646 } 636 }
647 637
648 return 0; 638 return 0;
@@ -650,17 +640,17 @@ int dss_init_overlay_managers(struct platform_device *pdev)
650 640
651void dss_uninit_overlay_managers(struct platform_device *pdev) 641void dss_uninit_overlay_managers(struct platform_device *pdev)
652{ 642{
653 struct omap_overlay_manager *mgr; 643 int i;
644
645 for (i = 0; i < num_managers; ++i) {
646 struct omap_overlay_manager *mgr = &managers[i];
654 647
655 while (!list_empty(&manager_list)) {
656 mgr = list_first_entry(&manager_list,
657 struct omap_overlay_manager, list);
658 list_del(&mgr->list);
659 kobject_del(&mgr->kobj); 648 kobject_del(&mgr->kobj);
660 kobject_put(&mgr->kobj); 649 kobject_put(&mgr->kobj);
661 kfree(mgr);
662 } 650 }
663 651
652 kfree(managers);
653 managers = NULL;
664 num_managers = 0; 654 num_managers = 0;
665} 655}
666 656
@@ -672,15 +662,10 @@ EXPORT_SYMBOL(omap_dss_get_num_overlay_managers);
672 662
673struct omap_overlay_manager *omap_dss_get_overlay_manager(int num) 663struct omap_overlay_manager *omap_dss_get_overlay_manager(int num)
674{ 664{
675 int i = 0; 665 if (num >= num_managers)
676 struct omap_overlay_manager *mgr; 666 return NULL;
677
678 list_for_each_entry(mgr, &manager_list, list) {
679 if (i++ == num)
680 return mgr;
681 }
682 667
683 return NULL; 668 return &managers[num];
684} 669}
685EXPORT_SYMBOL(omap_dss_get_overlay_manager); 670EXPORT_SYMBOL(omap_dss_get_overlay_manager);
686 671
diff --git a/include/video/omapdss.h b/include/video/omapdss.h
index d61efc3105a..fd5a96c5ecc 100644
--- a/include/video/omapdss.h
+++ b/include/video/omapdss.h
@@ -418,7 +418,6 @@ struct omap_overlay_manager_info {
418 418
419struct omap_overlay_manager { 419struct omap_overlay_manager {
420 struct kobject kobj; 420 struct kobject kobj;
421 struct list_head list;
422 421
423 /* static fields */ 422 /* static fields */
424 const char *name; 423 const char *name;