aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorTomi Valkeinen <tomi.valkeinen@ti.com>2011-11-15 07:32:57 -0500
committerTomi Valkeinen <tomi.valkeinen@ti.com>2011-12-02 01:54:42 -0500
commite0a2aa5b3d1a26969ba906447c816d44c018969d (patch)
tree6e0044f26982c0df41e52e339c8571f39ae47232 /drivers
parent5558db3fdd52e3928d5eaabe363e1576dc5fe473 (diff)
OMAPDSS: APPLY: add missing uses of spinlock
The functions in apply.c, called mostly via function pointers in overlay and overlay_manager structs, will be divided into two groups. The other group will not sleep and can be called from interrupts, and the other group may sleep. The idea is that the non-sleeping functions may only change certain settings in overlays and managers, and those settings may only affect the particular overlay/manager. For example, set the base address of the overlay. The blocking functions, however, will handle more complex configuration changes. For example, when an overlay is enabled and fifo-merge feature is used, we need to do the enable in multiple steps, waiting in between, and the change affects multiple overlays and managers. apply.c already contains a spinlock, which has been used to protect (badly) the dss_data. This patch adds locks/unlocks of the spinlock to the missing places, and the lock should now properly protect dss_data. Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/video/omap2/dss/apply.c29
1 files changed, 29 insertions, 0 deletions
diff --git a/drivers/video/omap2/dss/apply.c b/drivers/video/omap2/dss/apply.c
index d9424bee0457..eafa80846365 100644
--- a/drivers/video/omap2/dss/apply.c
+++ b/drivers/video/omap2/dss/apply.c
@@ -405,6 +405,9 @@ void dss_mgr_start_update(struct omap_overlay_manager *mgr)
405 struct mgr_priv_data *mp = get_mgr_priv(mgr); 405 struct mgr_priv_data *mp = get_mgr_priv(mgr);
406 struct ovl_priv_data *op; 406 struct ovl_priv_data *op;
407 struct omap_overlay *ovl; 407 struct omap_overlay *ovl;
408 unsigned long flags;
409
410 spin_lock_irqsave(&data_lock, flags);
408 411
409 mp->do_manual_update = true; 412 mp->do_manual_update = true;
410 dss_write_regs(); 413 dss_write_regs();
@@ -418,6 +421,8 @@ void dss_mgr_start_update(struct omap_overlay_manager *mgr)
418 mp->shadow_dirty = false; 421 mp->shadow_dirty = false;
419 422
420 dispc_mgr_enable(mgr->id, true); 423 dispc_mgr_enable(mgr->id, true);
424
425 spin_unlock_irqrestore(&data_lock, flags);
421} 426}
422 427
423static void dss_apply_irq_handler(void *data, u32 mask); 428static void dss_apply_irq_handler(void *data, u32 mask);
@@ -662,16 +667,28 @@ void dss_mgr_disable(struct omap_overlay_manager *mgr)
662int dss_mgr_set_info(struct omap_overlay_manager *mgr, 667int dss_mgr_set_info(struct omap_overlay_manager *mgr,
663 struct omap_overlay_manager_info *info) 668 struct omap_overlay_manager_info *info)
664{ 669{
670 unsigned long flags;
671
672 spin_lock_irqsave(&data_lock, flags);
673
665 mgr->info = *info; 674 mgr->info = *info;
666 mgr->info_dirty = true; 675 mgr->info_dirty = true;
667 676
677 spin_unlock_irqrestore(&data_lock, flags);
678
668 return 0; 679 return 0;
669} 680}
670 681
671void dss_mgr_get_info(struct omap_overlay_manager *mgr, 682void dss_mgr_get_info(struct omap_overlay_manager *mgr,
672 struct omap_overlay_manager_info *info) 683 struct omap_overlay_manager_info *info)
673{ 684{
685 unsigned long flags;
686
687 spin_lock_irqsave(&data_lock, flags);
688
674 *info = mgr->info; 689 *info = mgr->info;
690
691 spin_unlock_irqrestore(&data_lock, flags);
675} 692}
676 693
677int dss_mgr_set_device(struct omap_overlay_manager *mgr, 694int dss_mgr_set_device(struct omap_overlay_manager *mgr,
@@ -745,16 +762,28 @@ err:
745int dss_ovl_set_info(struct omap_overlay *ovl, 762int dss_ovl_set_info(struct omap_overlay *ovl,
746 struct omap_overlay_info *info) 763 struct omap_overlay_info *info)
747{ 764{
765 unsigned long flags;
766
767 spin_lock_irqsave(&data_lock, flags);
768
748 ovl->info = *info; 769 ovl->info = *info;
749 ovl->info_dirty = true; 770 ovl->info_dirty = true;
750 771
772 spin_unlock_irqrestore(&data_lock, flags);
773
751 return 0; 774 return 0;
752} 775}
753 776
754void dss_ovl_get_info(struct omap_overlay *ovl, 777void dss_ovl_get_info(struct omap_overlay *ovl,
755 struct omap_overlay_info *info) 778 struct omap_overlay_info *info)
756{ 779{
780 unsigned long flags;
781
782 spin_lock_irqsave(&data_lock, flags);
783
757 *info = ovl->info; 784 *info = ovl->info;
785
786 spin_unlock_irqrestore(&data_lock, flags);
758} 787}
759 788
760int dss_ovl_set_manager(struct omap_overlay *ovl, 789int dss_ovl_set_manager(struct omap_overlay *ovl,