diff options
Diffstat (limited to 'recipes/linux/linux-omap-pm/dss2/0027-DSS2-VRFB-rotation-and-mirroring-implemented.patch')
-rw-r--r-- | recipes/linux/linux-omap-pm/dss2/0027-DSS2-VRFB-rotation-and-mirroring-implemented.patch | 324 |
1 files changed, 0 insertions, 324 deletions
diff --git a/recipes/linux/linux-omap-pm/dss2/0027-DSS2-VRFB-rotation-and-mirroring-implemented.patch b/recipes/linux/linux-omap-pm/dss2/0027-DSS2-VRFB-rotation-and-mirroring-implemented.patch deleted file mode 100644 index 5265ae6b0a..0000000000 --- a/recipes/linux/linux-omap-pm/dss2/0027-DSS2-VRFB-rotation-and-mirroring-implemented.patch +++ /dev/null @@ -1,324 +0,0 @@ -From 77e848eeba461e9b55b09d39fd0d640caea13e19 Mon Sep 17 00:00:00 2001 -From: Hardik Shah <hardik.shah@ti.com> -Date: Thu, 9 Apr 2009 12:09:44 +0530 -Subject: [PATCH 27/69] DSS2: VRFB rotation and mirroring implemented. - -DSS2 modified to accept the rotation_type input -to get the dma or VRFB rotation. - -DSS2: VRFB: Changed to pass DSS mode to vrfb_setup instead of Bpp. - -VRFB size registers requires the width to be halved when the -mode is YUV or UYVY. So modifed to pass the mode to omap_vrfb_setup -function. - -Code added by Tim Yamin for few bug fixes - -Signed-off-by: Tim Yamin <plasm@roo.me.uk> -Signed-off-by: Hardik Shah <hardik.shah@ti.com> ---- - arch/arm/plat-omap/include/mach/display.h | 6 ++ - arch/arm/plat-omap/include/mach/vrfb.h | 3 +- - arch/arm/plat-omap/vrfb.c | 36 +++++++++- - drivers/video/omap2/dss/dispc.c | 109 +++++++++++++++++++++++++++-- - drivers/video/omap2/dss/dss.h | 1 + - drivers/video/omap2/dss/manager.c | 1 + - 6 files changed, 144 insertions(+), 12 deletions(-) - -diff --git a/arch/arm/plat-omap/include/mach/display.h b/arch/arm/plat-omap/include/mach/display.h -index 6b702c7..b0a6272 100644 ---- a/arch/arm/plat-omap/include/mach/display.h -+++ b/arch/arm/plat-omap/include/mach/display.h -@@ -341,6 +341,11 @@ enum omap_dss_overlay_managers { - - struct omap_overlay_manager; - -+enum omap_dss_rotation_type { -+ OMAP_DSS_ROT_DMA = 0, -+ OMAP_DSS_ROT_VRFB = 1, -+}; -+ - struct omap_overlay_info { - bool enabled; - -@@ -351,6 +356,7 @@ struct omap_overlay_info { - u16 height; - enum omap_color_mode color_mode; - u8 rotation; -+ enum omap_dss_rotation_type rotation_type; - bool mirror; - - u16 pos_x; -diff --git a/arch/arm/plat-omap/include/mach/vrfb.h b/arch/arm/plat-omap/include/mach/vrfb.h -index 2047862..12c7fab 100644 ---- a/arch/arm/plat-omap/include/mach/vrfb.h -+++ b/arch/arm/plat-omap/include/mach/vrfb.h -@@ -24,6 +24,7 @@ - #ifndef __VRFB_H - #define __VRFB_H - -+#include <mach/display.h> - #define OMAP_VRFB_LINE_LEN 2048 - - struct vrfb -@@ -42,6 +43,6 @@ extern void omap_vrfb_adjust_size(u16 *width, u16 *height, - u8 bytespp); - extern void omap_vrfb_setup(struct vrfb *vrfb, unsigned long paddr, - u16 width, u16 height, -- u8 bytespp); -+ enum omap_color_mode color_mode); - - #endif /* __VRFB_H */ -diff --git a/arch/arm/plat-omap/vrfb.c b/arch/arm/plat-omap/vrfb.c -index d68065f..2f08f6d 100644 ---- a/arch/arm/plat-omap/vrfb.c -+++ b/arch/arm/plat-omap/vrfb.c -@@ -5,7 +5,6 @@ - - #include <mach/io.h> - #include <mach/vrfb.h> -- - /*#define DEBUG*/ - - #ifdef DEBUG -@@ -50,19 +49,48 @@ EXPORT_SYMBOL(omap_vrfb_adjust_size); - - void omap_vrfb_setup(struct vrfb *vrfb, unsigned long paddr, - u16 width, u16 height, -- u8 bytespp) -+ enum omap_color_mode color_mode) - { - unsigned pixel_size_exp; - u16 vrfb_width; - u16 vrfb_height; - u8 ctx = vrfb->context; -+ u8 bytespp; - - DBG("omapfb_set_vrfb(%d, %lx, %dx%d, %d)\n", ctx, paddr, - width, height, bytespp); - -- if (bytespp == 4) -+ switch (color_mode) { -+ case OMAP_DSS_COLOR_RGB16: -+ case OMAP_DSS_COLOR_ARGB16: -+ bytespp = 2; -+ break; -+ -+ case OMAP_DSS_COLOR_RGB24P: -+ bytespp = 3; -+ break; -+ -+ case OMAP_DSS_COLOR_RGB24U: -+ case OMAP_DSS_COLOR_ARGB32: -+ case OMAP_DSS_COLOR_RGBA32: -+ case OMAP_DSS_COLOR_RGBX32: -+ case OMAP_DSS_COLOR_YUV2: -+ case OMAP_DSS_COLOR_UYVY: -+ bytespp = 4; -+ break; -+ -+ default: -+ BUG(); -+ return; -+ } -+ -+ if (color_mode == OMAP_DSS_COLOR_YUV2 || -+ color_mode == OMAP_DSS_COLOR_UYVY) -+ width >>= 1; -+ -+ if (bytespp == 4) { - pixel_size_exp = 2; -- else if (bytespp == 2) -+ } else if (bytespp == 2) - pixel_size_exp = 1; - else - BUG(); -diff --git a/drivers/video/omap2/dss/dispc.c b/drivers/video/omap2/dss/dispc.c -index 16c68b8..23a8155 100644 ---- a/drivers/video/omap2/dss/dispc.c -+++ b/drivers/video/omap2/dss/dispc.c -@@ -1106,7 +1106,7 @@ static void _dispc_set_rotation_attrs(enum omap_plane plane, u8 rotation, - case 0: vidrot = 0; break; - case 1: vidrot = 1; break; - case 2: vidrot = 2; break; -- case 3: vidrot = 1; break; -+ case 3: vidrot = 3; break; - } - } - -@@ -1134,7 +1134,92 @@ static s32 pixinc(int pixels, u8 ps) - BUG(); - } - --static void calc_rotation_offset(u8 rotation, bool mirror, -+static void calc_vrfb_rotation_offset(u8 rotation, bool mirror, -+ u16 screen_width, -+ u16 width, u16 height, -+ enum omap_color_mode color_mode, bool fieldmode, -+ unsigned *offset0, unsigned *offset1, -+ s32 *row_inc, s32 *pix_inc) -+{ -+ u8 ps; -+ -+ switch (color_mode) { -+ case OMAP_DSS_COLOR_RGB16: -+ case OMAP_DSS_COLOR_ARGB16: -+ ps = 2; -+ break; -+ -+ case OMAP_DSS_COLOR_RGB24P: -+ ps = 3; -+ break; -+ -+ case OMAP_DSS_COLOR_RGB24U: -+ case OMAP_DSS_COLOR_ARGB32: -+ case OMAP_DSS_COLOR_RGBA32: -+ case OMAP_DSS_COLOR_RGBX32: -+ case OMAP_DSS_COLOR_YUV2: -+ case OMAP_DSS_COLOR_UYVY: -+ ps = 4; -+ break; -+ -+ default: -+ BUG(); -+ return; -+ } -+ -+ DSSDBG("calc_rot(%d): scrw %d, %dx%d\n", rotation, screen_width, -+ width, height); -+ switch (rotation + mirror * 4) { -+ case 0: -+ case 2: -+ /* -+ * If the pixel format is YUV or UYVY divide the width -+ * of the image by 2 for 0 and 180 degree rotation. -+ */ -+ if (color_mode == OMAP_DSS_COLOR_YUV2 || -+ color_mode == OMAP_DSS_COLOR_UYVY) -+ width = width >> 1; -+ case 1: -+ case 3: -+ *offset0 = 0; -+ if (fieldmode) -+ *offset1 = screen_width * ps; -+ else -+ *offset1 = 0; -+ -+ *row_inc = pixinc(1 + (screen_width - width) + -+ (fieldmode ? screen_width : 0), -+ ps); -+ *pix_inc = pixinc(1, ps); -+ break; -+ -+ case 4: -+ case 6: -+ /* If the pixel format is YUV or UYVY divide the width -+ * of the image by 2 for 0 degree and 180 degree -+ */ -+ if (color_mode == OMAP_DSS_COLOR_YUV2 || -+ color_mode == OMAP_DSS_COLOR_UYVY) -+ width = width >> 1; -+ case 5: -+ case 7: -+ *offset0 = 0; -+ if (fieldmode) -+ *offset1 = screen_width * ps; -+ else -+ *offset1 = 0; -+ *row_inc = pixinc(1 - (screen_width + width) - -+ (fieldmode ? screen_width : 0), -+ ps); -+ *pix_inc = pixinc(1, ps); -+ break; -+ -+ default: -+ BUG(); -+ } -+} -+ -+static void calc_dma_rotation_offset(u8 rotation, bool mirror, - u16 screen_width, - u16 width, u16 height, - enum omap_color_mode color_mode, bool fieldmode, -@@ -1357,6 +1442,7 @@ static int _dispc_setup_plane(enum omap_plane plane, - u16 out_width, u16 out_height, - enum omap_color_mode color_mode, - bool ilace, -+ enum omap_dss_rotation_type rotation_type, - u8 rotation, int mirror) - { - const int maxdownscale = cpu_is_omap34xx() ? 4 : 2; -@@ -1463,10 +1549,16 @@ static int _dispc_setup_plane(enum omap_plane plane, - return -EINVAL; - } - -- calc_rotation_offset(rotation, mirror, -- screen_width, width, frame_height, color_mode, -- fieldmode, -- &offset0, &offset1, &row_inc, &pix_inc); -+ if (rotation_type == OMAP_DSS_ROT_DMA) -+ calc_dma_rotation_offset(rotation, mirror, -+ screen_width, width, frame_height, color_mode, -+ fieldmode, -+ &offset0, &offset1, &row_inc, &pix_inc); -+ else -+ calc_vrfb_rotation_offset(rotation, mirror, -+ screen_width, width, frame_height, color_mode, -+ fieldmode, -+ &offset0, &offset1, &row_inc, &pix_inc); - - DSSDBG("offset0 %u, offset1 %u, row_inc %d, pix_inc %d\n", - offset0, offset1, row_inc, pix_inc); -@@ -2889,6 +2981,7 @@ int dispc_setup_plane(enum omap_plane plane, enum omap_channel channel_out, - u16 out_width, u16 out_height, - enum omap_color_mode color_mode, - bool ilace, -+ enum omap_dss_rotation_type rotation_type, - u8 rotation, bool mirror) - { - int r = 0; -@@ -2909,6 +3002,7 @@ int dispc_setup_plane(enum omap_plane plane, enum omap_channel channel_out, - width, height, - out_width, out_height, - color_mode, ilace, -+ rotation_type, - rotation, mirror); - - enable_clocks(0); -@@ -3122,7 +3216,8 @@ void dispc_setup_partial_planes(struct omap_display *display, - pw, ph, - pow, poh, - pi->color_mode, 0, -- pi->rotation, // XXX rotation probably wrong -+ pi->rotation_type, -+ pi->rotation, - pi->mirror); - - dispc_enable_plane(ovl->id, 1); -diff --git a/drivers/video/omap2/dss/dss.h b/drivers/video/omap2/dss/dss.h -index d0917a8..584dce6 100644 ---- a/drivers/video/omap2/dss/dss.h -+++ b/drivers/video/omap2/dss/dss.h -@@ -272,6 +272,7 @@ int dispc_setup_plane(enum omap_plane plane, enum omap_channel channel_out, - u16 out_width, u16 out_height, - enum omap_color_mode color_mode, - bool ilace, -+ enum omap_dss_rotation_type rotation_type, - u8 rotation, bool mirror); - - void dispc_go(enum omap_channel channel); -diff --git a/drivers/video/omap2/dss/manager.c b/drivers/video/omap2/dss/manager.c -index b0fee80..8ca0bbb 100644 ---- a/drivers/video/omap2/dss/manager.c -+++ b/drivers/video/omap2/dss/manager.c -@@ -395,6 +395,7 @@ static int omap_dss_mgr_apply(struct omap_overlay_manager *mgr) - outh, - ovl->info.color_mode, - ilace, -+ ovl->info.rotation_type, - ovl->info.rotation, - ovl->info.mirror); - --- -1.6.2.4 - |