aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/video
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/video')
-rw-r--r--drivers/video/omap2/displays/panel-taal.c2
-rw-r--r--drivers/video/omap2/dss/dsi.c6
-rw-r--r--drivers/video/omap2/dss/dss.h3
-rw-r--r--drivers/video/omap2/dss/manager.c69
-rw-r--r--drivers/video/omap2/dss/rfbi.c2
5 files changed, 48 insertions, 34 deletions
diff --git a/drivers/video/omap2/displays/panel-taal.c b/drivers/video/omap2/displays/panel-taal.c
index 2a91d5662c07..6848e3633ed9 100644
--- a/drivers/video/omap2/displays/panel-taal.c
+++ b/drivers/video/omap2/displays/panel-taal.c
@@ -1135,7 +1135,7 @@ static int taal_update(struct omap_dss_device *dssdev,
1135 goto err; 1135 goto err;
1136 } 1136 }
1137 1137
1138 r = omap_dsi_prepare_update(dssdev, &x, &y, &w, &h); 1138 r = omap_dsi_prepare_update(dssdev, &x, &y, &w, &h, true);
1139 if (r) 1139 if (r)
1140 goto err; 1140 goto err;
1141 1141
diff --git a/drivers/video/omap2/dss/dsi.c b/drivers/video/omap2/dss/dsi.c
index 32297b4f7abb..d0881e948bcf 100644
--- a/drivers/video/omap2/dss/dsi.c
+++ b/drivers/video/omap2/dss/dsi.c
@@ -2860,7 +2860,8 @@ static void dsi_framedone_irq_callback(void *data, u32 mask)
2860} 2860}
2861 2861
2862int omap_dsi_prepare_update(struct omap_dss_device *dssdev, 2862int omap_dsi_prepare_update(struct omap_dss_device *dssdev,
2863 u16 *x, u16 *y, u16 *w, u16 *h) 2863 u16 *x, u16 *y, u16 *w, u16 *h,
2864 bool enlarge_update_area)
2864{ 2865{
2865 u16 dw, dh; 2866 u16 dw, dh;
2866 2867
@@ -2884,7 +2885,8 @@ int omap_dsi_prepare_update(struct omap_dss_device *dssdev,
2884 dsi_perf_mark_setup(); 2885 dsi_perf_mark_setup();
2885 2886
2886 if (dssdev->manager->caps & OMAP_DSS_OVL_MGR_CAP_DISPC) { 2887 if (dssdev->manager->caps & OMAP_DSS_OVL_MGR_CAP_DISPC) {
2887 dss_setup_partial_planes(dssdev, x, y, w, h); 2888 dss_setup_partial_planes(dssdev, x, y, w, h,
2889 enlarge_update_area);
2888 dispc_set_lcd_size(*w, *h); 2890 dispc_set_lcd_size(*w, *h);
2889 } 2891 }
2890 2892
diff --git a/drivers/video/omap2/dss/dss.h b/drivers/video/omap2/dss/dss.h
index 66e8e97d06a7..5c7940d5f282 100644
--- a/drivers/video/omap2/dss/dss.h
+++ b/drivers/video/omap2/dss/dss.h
@@ -199,7 +199,8 @@ int dss_init_overlay_managers(struct platform_device *pdev);
199void dss_uninit_overlay_managers(struct platform_device *pdev); 199void dss_uninit_overlay_managers(struct platform_device *pdev);
200int dss_mgr_wait_for_go_ovl(struct omap_overlay *ovl); 200int dss_mgr_wait_for_go_ovl(struct omap_overlay *ovl);
201void dss_setup_partial_planes(struct omap_dss_device *dssdev, 201void dss_setup_partial_planes(struct omap_dss_device *dssdev,
202 u16 *x, u16 *y, u16 *w, u16 *h); 202 u16 *x, u16 *y, u16 *w, u16 *h,
203 bool enlarge_update_area);
203void dss_start_update(struct omap_dss_device *dssdev); 204void dss_start_update(struct omap_dss_device *dssdev);
204 205
205/* overlay */ 206/* overlay */
diff --git a/drivers/video/omap2/dss/manager.c b/drivers/video/omap2/dss/manager.c
index a1d84ef65904..4b09fcb432b3 100644
--- a/drivers/video/omap2/dss/manager.c
+++ b/drivers/video/omap2/dss/manager.c
@@ -440,6 +440,10 @@ struct manager_cache_data {
440 440
441 /* manual update region */ 441 /* manual update region */
442 u16 x, y, w, h; 442 u16 x, y, w, h;
443
444 /* enlarge the update area if the update area contains scaled
445 * overlays */
446 bool enlarge_update_area;
443}; 447};
444 448
445static struct { 449static struct {
@@ -721,6 +725,7 @@ static int configure_overlay(enum omap_plane plane)
721 u16 x, y, w, h; 725 u16 x, y, w, h;
722 u32 paddr; 726 u32 paddr;
723 int r; 727 int r;
728 u16 orig_w, orig_h, orig_outw, orig_outh;
724 729
725 DSSDBGF("%d", plane); 730 DSSDBGF("%d", plane);
726 731
@@ -741,8 +746,16 @@ static int configure_overlay(enum omap_plane plane)
741 outh = c->out_height == 0 ? c->height : c->out_height; 746 outh = c->out_height == 0 ? c->height : c->out_height;
742 paddr = c->paddr; 747 paddr = c->paddr;
743 748
749 orig_w = w;
750 orig_h = h;
751 orig_outw = outw;
752 orig_outh = outh;
753
744 if (c->manual_update && mc->do_manual_update) { 754 if (c->manual_update && mc->do_manual_update) {
745 unsigned bpp; 755 unsigned bpp;
756 unsigned scale_x_m = w, scale_x_d = outw;
757 unsigned scale_y_m = h, scale_y_d = outh;
758
746 /* If the overlay is outside the update region, disable it */ 759 /* If the overlay is outside the update region, disable it */
747 if (!rectangle_intersects(mc->x, mc->y, mc->w, mc->h, 760 if (!rectangle_intersects(mc->x, mc->y, mc->w, mc->h,
748 x, y, outw, outh)) { 761 x, y, outw, outh)) {
@@ -773,39 +786,33 @@ static int configure_overlay(enum omap_plane plane)
773 BUG(); 786 BUG();
774 } 787 }
775 788
776 if (dispc_is_overlay_scaled(c)) { 789 if (mc->x > c->pos_x) {
777 /* If the overlay is scaled, the update area has 790 x = 0;
778 * already been enlarged to cover the whole overlay. We 791 outw -= (mc->x - c->pos_x);
779 * only need to adjust x/y here */ 792 paddr += (mc->x - c->pos_x) *
780 x = c->pos_x - mc->x; 793 scale_x_m / scale_x_d * bpp / 8;
781 y = c->pos_y - mc->y;
782 } else { 794 } else {
783 if (mc->x > c->pos_x) { 795 x = c->pos_x - mc->x;
784 x = 0; 796 }
785 w -= (mc->x - c->pos_x);
786 paddr += (mc->x - c->pos_x) * bpp / 8;
787 } else {
788 x = c->pos_x - mc->x;
789 }
790 797
791 if (mc->y > c->pos_y) { 798 if (mc->y > c->pos_y) {
792 y = 0; 799 y = 0;
793 h -= (mc->y - c->pos_y); 800 outh -= (mc->y - c->pos_y);
794 paddr += (mc->y - c->pos_y) * c->screen_width * 801 paddr += (mc->y - c->pos_y) *
795 bpp / 8; 802 scale_y_m / scale_y_d *
796 } else { 803 c->screen_width * bpp / 8;
797 y = c->pos_y - mc->y; 804 } else {
798 } 805 y = c->pos_y - mc->y;
806 }
799 807
800 if (mc->w < (x+w)) 808 if (mc->w < (x + outw))
801 w -= (x+w) - (mc->w); 809 outw -= (x + outw) - (mc->w);
802 810
803 if (mc->h < (y+h)) 811 if (mc->h < (y + outh))
804 h -= (y+h) - (mc->h); 812 outh -= (y + outh) - (mc->h);
805 813
806 outw = w; 814 w = w * outw / orig_outw;
807 outh = h; 815 h = h * outh / orig_outh;
808 }
809 } 816 }
810 817
811 r = dispc_setup_plane(plane, 818 r = dispc_setup_plane(plane,
@@ -963,7 +970,7 @@ static void make_even(u16 *x, u16 *w)
963/* Configure dispc for partial update. Return possibly modified update 970/* Configure dispc for partial update. Return possibly modified update
964 * area */ 971 * area */
965void dss_setup_partial_planes(struct omap_dss_device *dssdev, 972void dss_setup_partial_planes(struct omap_dss_device *dssdev,
966 u16 *xi, u16 *yi, u16 *wi, u16 *hi) 973 u16 *xi, u16 *yi, u16 *wi, u16 *hi, bool enlarge_update_area)
967{ 974{
968 struct overlay_cache_data *oc; 975 struct overlay_cache_data *oc;
969 struct manager_cache_data *mc; 976 struct manager_cache_data *mc;
@@ -1015,6 +1022,9 @@ void dss_setup_partial_planes(struct omap_dss_device *dssdev,
1015 1022
1016 oc->dirty = true; 1023 oc->dirty = true;
1017 1024
1025 if (!enlarge_update_area)
1026 continue;
1027
1018 if (!oc->enabled) 1028 if (!oc->enabled)
1019 continue; 1029 continue;
1020 1030
@@ -1074,6 +1084,7 @@ void dss_setup_partial_planes(struct omap_dss_device *dssdev,
1074 1084
1075 mc = &dss_cache.manager_cache[mgr->id]; 1085 mc = &dss_cache.manager_cache[mgr->id];
1076 mc->do_manual_update = true; 1086 mc->do_manual_update = true;
1087 mc->enlarge_update_area = enlarge_update_area;
1077 mc->x = x; 1088 mc->x = x;
1078 mc->y = y; 1089 mc->y = y;
1079 mc->w = w; 1090 mc->w = w;
diff --git a/drivers/video/omap2/dss/rfbi.c b/drivers/video/omap2/dss/rfbi.c
index cc23f53cc62d..bbe62464e92d 100644
--- a/drivers/video/omap2/dss/rfbi.c
+++ b/drivers/video/omap2/dss/rfbi.c
@@ -886,7 +886,7 @@ int omap_rfbi_prepare_update(struct omap_dss_device *dssdev,
886 return -EINVAL; 886 return -EINVAL;
887 887
888 if (dssdev->manager->caps & OMAP_DSS_OVL_MGR_CAP_DISPC) { 888 if (dssdev->manager->caps & OMAP_DSS_OVL_MGR_CAP_DISPC) {
889 dss_setup_partial_planes(dssdev, x, y, w, h); 889 dss_setup_partial_planes(dssdev, x, y, w, h, true);
890 dispc_set_lcd_size(*w, *h); 890 dispc_set_lcd_size(*w, *h);
891 } 891 }
892 892