aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/video/omap2/dss/apply.c
diff options
context:
space:
mode:
authorTomi Valkeinen <tomi.valkeinen@ti.com>2012-03-07 03:28:48 -0500
committerTomi Valkeinen <tomi.valkeinen@ti.com>2012-03-13 09:46:21 -0400
commitdf01d53068bdf31609aafd9a857901a1f16dfa52 (patch)
treeabd6e418faf42e0c83c4e95b2e40121578a6f22d /drivers/video/omap2/dss/apply.c
parent001b7f3ecd164ba748e45f698714b3a574a11438 (diff)
OMAPDSS: APPLY: fix clearing shadow dirty flag with manual update
Currently the shadow-dirty flags for manual update displays is cleared in the apply_irq_handler when an update has finished. This is not correct, as the shadow registers are taken into use (i.e. after that they are not dirty) when the update is started. Move the mgr_clear_shadow_dirty() call from apply_irq_handler to dss_mgr_start_update() to fix this. Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
Diffstat (limited to 'drivers/video/omap2/dss/apply.c')
-rw-r--r--drivers/video/omap2/dss/apply.c37
1 files changed, 18 insertions, 19 deletions
diff --git a/drivers/video/omap2/dss/apply.c b/drivers/video/omap2/dss/apply.c
index 267c3f40d6c3..b10b3bc1931e 100644
--- a/drivers/video/omap2/dss/apply.c
+++ b/drivers/video/omap2/dss/apply.c
@@ -685,6 +685,22 @@ static void dss_set_go_bits(void)
685 685
686} 686}
687 687
688static void mgr_clear_shadow_dirty(struct omap_overlay_manager *mgr)
689{
690 struct omap_overlay *ovl;
691 struct mgr_priv_data *mp;
692 struct ovl_priv_data *op;
693
694 mp = get_mgr_priv(mgr);
695 mp->shadow_info_dirty = false;
696
697 list_for_each_entry(ovl, &mgr->overlays, list) {
698 op = get_ovl_priv(ovl);
699 op->shadow_info_dirty = false;
700 op->shadow_extra_info_dirty = false;
701 }
702}
703
688void dss_mgr_start_update(struct omap_overlay_manager *mgr) 704void dss_mgr_start_update(struct omap_overlay_manager *mgr)
689{ 705{
690 struct mgr_priv_data *mp = get_mgr_priv(mgr); 706 struct mgr_priv_data *mp = get_mgr_priv(mgr);
@@ -713,6 +729,8 @@ void dss_mgr_start_update(struct omap_overlay_manager *mgr)
713 729
714 dispc_mgr_enable(mgr->id, true); 730 dispc_mgr_enable(mgr->id, true);
715 731
732 mgr_clear_shadow_dirty(mgr);
733
716 spin_unlock_irqrestore(&data_lock, flags); 734 spin_unlock_irqrestore(&data_lock, flags);
717} 735}
718 736
@@ -756,22 +774,6 @@ static void dss_unregister_vsync_isr(void)
756 dss_data.irq_enabled = false; 774 dss_data.irq_enabled = false;
757} 775}
758 776
759static void mgr_clear_shadow_dirty(struct omap_overlay_manager *mgr)
760{
761 struct omap_overlay *ovl;
762 struct mgr_priv_data *mp;
763 struct ovl_priv_data *op;
764
765 mp = get_mgr_priv(mgr);
766 mp->shadow_info_dirty = false;
767
768 list_for_each_entry(ovl, &mgr->overlays, list) {
769 op = get_ovl_priv(ovl);
770 op->shadow_info_dirty = false;
771 op->shadow_extra_info_dirty = false;
772 }
773}
774
775static void dss_apply_irq_handler(void *data, u32 mask) 777static void dss_apply_irq_handler(void *data, u32 mask)
776{ 778{
777 const int num_mgrs = dss_feat_get_num_mgrs(); 779 const int num_mgrs = dss_feat_get_num_mgrs();
@@ -801,9 +803,6 @@ static void dss_apply_irq_handler(void *data, u32 mask)
801 803
802 if (was_busy && !mp->busy) 804 if (was_busy && !mp->busy)
803 mgr_clear_shadow_dirty(mgr); 805 mgr_clear_shadow_dirty(mgr);
804 } else {
805 if (was_updating && !mp->updating)
806 mgr_clear_shadow_dirty(mgr);
807 } 806 }
808 } 807 }
809 808