diff options
author | Koen Kooi <koen@openembedded.org> | 2009-09-13 16:30:10 +0200 |
---|---|---|
committer | Koen Kooi <koen@openembedded.org> | 2009-09-15 19:26:15 +0200 |
commit | d861047e32eacf91974108a5eeba1f847bad5b9f (patch) | |
tree | ac07eaf5fe935b4f58aae20528f3cf101b712549 /recipes/linux/linux-omap-2.6.29/omap3-touchbook/dss2-fix-XY-coordinates-when-rotating.patch | |
parent | 72c1fd8a2b6ab59a28467c033ec7fa18cfb67225 (diff) |
linux-omap 2.6.29: add support for the omap3-touchbook
Diffstat (limited to 'recipes/linux/linux-omap-2.6.29/omap3-touchbook/dss2-fix-XY-coordinates-when-rotating.patch')
-rw-r--r-- | recipes/linux/linux-omap-2.6.29/omap3-touchbook/dss2-fix-XY-coordinates-when-rotating.patch | 177 |
1 files changed, 177 insertions, 0 deletions
diff --git a/recipes/linux/linux-omap-2.6.29/omap3-touchbook/dss2-fix-XY-coordinates-when-rotating.patch b/recipes/linux/linux-omap-2.6.29/omap3-touchbook/dss2-fix-XY-coordinates-when-rotating.patch new file mode 100644 index 0000000000..98a82c8a35 --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/omap3-touchbook/dss2-fix-XY-coordinates-when-rotating.patch @@ -0,0 +1,177 @@ +From a9cc890ffea21fa492678b1755a263120cbddf0e Mon Sep 17 00:00:00 2001 +From: Tim Yamin <plasm@roo.me.uk> +Date: Mon, 20 Apr 2009 20:29:11 -0700 +Subject: [PATCH] DSS2: OMAPFB: Translate X/Y coordinates for the video planes when rotating. + +When rotating the video planes, translate the X/Y coordinates such that +a [0,0] from userspace always maps to the correct upper left corner of +the display. This patch assumes that you rotate plane 0 before rotating +plane 1. Patch also corrects the scaling parameters so that the video is +displayed in the correct orientation (vertically, instead of horizontally) +when rotating by 90 / 270 degrees. + +Signed-off-by: Tim Yamin <plasm@roo.me.uk> +--- + drivers/video/omap2/dss/dispc.c | 16 ++++++++++++---- + drivers/video/omap2/dss/overlay.c | 6 ++++++ + drivers/video/omap2/omapfb/omapfb-ioctl.c | 28 ++++++++++++++++++++++++++++ + 3 files changed, 46 insertions(+), 4 deletions(-) + +diff --git a/drivers/video/omap2/dss/dispc.c b/drivers/video/omap2/dss/dispc.c +index 7e551c2..bece91d 100644 +--- a/drivers/video/omap2/dss/dispc.c ++++ b/drivers/video/omap2/dss/dispc.c +@@ -1580,10 +1580,18 @@ static int _dispc_setup_plane(enum omap_plane plane, + _dispc_set_pic_size(plane, width, height); + + if (plane != OMAP_DSS_GFX) { +- _dispc_set_scaling(plane, width, height, +- out_width, out_height, +- ilace, five_taps, fieldmode); +- _dispc_set_vid_size(plane, out_width, out_height); ++ if (rotation == 1 || rotation == 3) { ++ _dispc_set_scaling(plane, width, height, ++ out_height, out_width, ++ ilace, five_taps, fieldmode); ++ _dispc_set_vid_size(plane, out_height, out_width); ++ } else { ++ _dispc_set_scaling(plane, width, height, ++ out_width, out_height, ++ ilace, five_taps, fieldmode); ++ _dispc_set_vid_size(plane, out_width, out_height); ++ } ++ + _dispc_set_vid_color_conv(plane, cconv); + } + +diff --git a/drivers/video/omap2/dss/overlay.c b/drivers/video/omap2/dss/overlay.c +index c047206..a1a02b5 100644 +--- a/drivers/video/omap2/dss/overlay.c ++++ b/drivers/video/omap2/dss/overlay.c +@@ -344,6 +344,20 @@ + outh = info->out_height; + } + ++ if ((ovl->supported_modes & info->color_mode) == 0) { ++ DSSERR("overlay doesn't support mode %d\n", info->color_mode); ++ return -EINVAL; ++ } ++ ++ if (ovl->id != OMAP_DSS_GFX && (info->rotation == 1 || ++ info->rotation == 3)) { ++ if(outw > dh || outh > dw) ++ return -EINVAL; ++ ++ /* If coordinates are invalid, they will be clipped later... */ ++ return 0; ++ } ++ + if (dw < info->pos_x + outw) { + DSSDBG("check_overlay failed 1: %d < %d + %d\n", + dw, info->pos_x, outw); +@@ -356,11 +370,6 @@ + return -EINVAL; + } + +- if ((ovl->supported_modes & info->color_mode) == 0) { +- DSSERR("overlay doesn't support mode %d\n", info->color_mode); +- return -EINVAL; +- } +- + return 0; + } + +diff --git a/drivers/video/omap2/dss/manager.c b/drivers/video/omap2/dss/manager.c +index 79d8916..b548f62 100644 +--- a/drivers/video/omap2/dss/manager.c ++++ b/drivers/video/omap2/dss/manager.c +@@ -400,7 +400,7 @@ + struct omap_overlay *ovl; + bool ilace = 0; + int outw, outh; +- int r; ++ int r, pos_x = 0, pos_y = 0; + int num_planes_enabled = 0; + + DSSDBG("omap_dss_mgr_apply(%s)\n", mgr->name); +@@ -451,11 +451,51 @@ + else + outh = ovl->info.out_height; + ++ if (ovl->id != OMAP_DSS_GFX && ovl->info.rotation != 0) { ++ /* We need to rotate pos_x and pos_y with respect ++ to OMAP_DSS_GFX */ ++ ++ u16 dw, dh; ++ display->get_resolution(display, &dw, &dh); ++ ++ DSSDBG("plane pos was: (%d, %d), %dx%d, scr: %dx%d \n", ovl->info.pos_x, ++ ovl->info.pos_y, outw, outh, dw, dh); ++ ++ switch (ovl->info.rotation) { ++ case 1: ++ pos_y = ovl->info.pos_x; ++ pos_x = dw - ovl->info.pos_y - outh; ++ break; ++ case 2: ++ pos_x = dw - ovl->info.pos_x - outw; ++ pos_y = dh - ovl->info.pos_y - outh; ++ break; ++ case 3: ++ pos_x = ovl->info.pos_y; ++ pos_y = dh - ovl->info.pos_x - outw; ++ break; ++ } ++ ++ /* Check sanity */ ++ if (ovl->info.rotation != 2) { ++ if (dw < pos_x + outh) ++ pos_x = pos_y = 0; ++ else if (dh < pos_y + outw) ++ pos_x = pos_y = 0; ++ } else if ( (dw < ovl->info.pos_x + outw) || (dh < ovl->info.pos_y + outh) ) ++ pos_x = pos_y = 0; ++ ++ DSSDBG("pos_x is %d, pos_y is %d\n", pos_x, pos_y); ++ } else { ++ pos_x = ovl->info.pos_x; ++ pos_y = ovl->info.pos_y; ++ } ++ + r = dispc_setup_plane(ovl->id, ovl->manager->id, + ovl->info.paddr, + ovl->info.screen_width, +- ovl->info.pos_x, +- ovl->info.pos_y, ++ pos_x, ++ pos_y, + ovl->info.width, + ovl->info.height, + outw, +diff --git a/drivers/video/omap2/omapfb/omapfb-main.c b/drivers/video/omap2/omapfb/omapfb-main.c +index 79d8916..b548f62 100644 +--- a/drivers/video/omap2/omapfb/omapfb-main.c ++++ b/drivers/video/omap2/omapfb/omapfb-main.c +@@ -484,22 +484,7 @@ + + if (var->rotate != fbi->var.rotate) { + DBG("rotation changing\n"); +- + ofbi->rotation = var->rotate; +- +- if (abs(var->rotate - fbi->var.rotate) != 2) { +- int tmp; +- DBG("rotate changing 90/270 degrees. " +- "swapping x/y res\n"); +- +- tmp = var->yres; +- var->yres = var->xres; +- var->xres = tmp; +- +- tmp = var->yres_virtual; +- var->yres_virtual = var->xres_virtual; +- var->xres_virtual = tmp; +- } + } + + xres_min = OMAPFB_PLANE_XRES_MIN; |