diff options
author | Koen Kooi <koen@openembedded.org> | 2009-04-16 17:29:14 +0200 |
---|---|---|
committer | Koen Kooi <koen@openembedded.org> | 2009-04-16 17:29:14 +0200 |
commit | e9c95296cbcdca6a5531fca7b7a1b21ef2173a6d (patch) | |
tree | 5e807044dddba20f60b841a02e978ff7d3150f64 /recipes/linux/linux-omap-2.6.29/dss2 | |
parent | f9a6f7e2fb04f0ae4ce64769833e2464565cf530 (diff) |
linux-omap 2.6.29: sync with dss2 tree for YUV rotation
Diffstat (limited to 'recipes/linux/linux-omap-2.6.29/dss2')
5 files changed, 728 insertions, 0 deletions
diff --git a/recipes/linux/linux-omap-2.6.29/dss2/0026-DSS2-DSI-sidlemode-to-noidle-while-sending-frame.patch b/recipes/linux/linux-omap-2.6.29/dss2/0026-DSS2-DSI-sidlemode-to-noidle-while-sending-frame.patch new file mode 100644 index 0000000000..6ee3908d10 --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/dss2/0026-DSS2-DSI-sidlemode-to-noidle-while-sending-frame.patch @@ -0,0 +1,78 @@ +From a1e8018c0806a1a0579eda4b93b7d6764a2ff643 Mon Sep 17 00:00:00 2001 +From: Tomi Valkeinen <tomi.valkeinen@nokia.com> +Date: Wed, 15 Apr 2009 14:06:54 +0300 +Subject: [PATCH] DSS2: DSI: sidlemode to noidle while sending frame + +DISPC interrupts are not wake-up capable. Smart-idle in DISPC_SIDLEMODE +causes DSS interface to go to idle at the end of the frame, and the +FRAMEDONE interrupt is then delayed until something wakes up the DSS +interface. + +So we set SIDLEMODE to no-idle when we start sending the frame, and +set it back to smart-idle after receiving FRAMEDONE. +--- + drivers/video/omap2/dss/dispc.c | 10 ++++++++++ + drivers/video/omap2/dss/dsi.c | 4 ++++ + drivers/video/omap2/dss/dss.h | 3 +++ + 3 files changed, 17 insertions(+), 0 deletions(-) + +diff --git a/drivers/video/omap2/dss/dispc.c b/drivers/video/omap2/dss/dispc.c +index ae7be3d..16c68b8 100644 +--- a/drivers/video/omap2/dss/dispc.c ++++ b/drivers/video/omap2/dss/dispc.c +@@ -2791,6 +2791,16 @@ static void _omap_dispc_initialize_irq(void) + omap_dispc_set_irqs(); + } + ++void dispc_enable_sidle(void) ++{ ++ REG_FLD_MOD(DISPC_SYSCONFIG, 2, 4, 3); /* SIDLEMODE: smart idle */ ++} ++ ++void dispc_disable_sidle(void) ++{ ++ REG_FLD_MOD(DISPC_SYSCONFIG, 1, 4, 3); /* SIDLEMODE: no idle */ ++} ++ + static void _omap_dispc_initial_config(void) + { + u32 l; +diff --git a/drivers/video/omap2/dss/dsi.c b/drivers/video/omap2/dss/dsi.c +index 66ac6ea..50af925 100644 +--- a/drivers/video/omap2/dss/dsi.c ++++ b/drivers/video/omap2/dss/dsi.c +@@ -2665,6 +2665,8 @@ static void dsi_update_screen_dispc(struct omap_display *display, + l = FLD_MOD(l, 1, 31, 31); /* TE_START */ + dsi_write_reg(DSI_VC_TE(1), l); + ++ dispc_disable_sidle(); ++ + dispc_enable_lcd_out(1); + + if (dsi.use_te) +@@ -2678,6 +2680,8 @@ static void framedone_callback(void *data, u32 mask) + return; + } + ++ dispc_enable_sidle(); ++ + dsi.framedone_scheduled = 1; + + /* We get FRAMEDONE when DISPC has finished sending pixels and turns +diff --git a/drivers/video/omap2/dss/dss.h b/drivers/video/omap2/dss/dss.h +index 0be42b6..d0917a8 100644 +--- a/drivers/video/omap2/dss/dss.h ++++ b/drivers/video/omap2/dss/dss.h +@@ -244,6 +244,9 @@ void dispc_fake_vsync_irq(void); + void dispc_save_context(void); + void dispc_restore_context(void); + ++void dispc_enable_sidle(void); ++void dispc_disable_sidle(void); ++ + void dispc_lcd_enable_signal_polarity(bool act_high); + void dispc_lcd_enable_signal(bool enable); + void dispc_pck_free_enable(bool enable); +-- +1.5.6.5 + diff --git a/recipes/linux/linux-omap-2.6.29/dss2/0027-DSS2-VRFB-rotation-and-mirroring-implemented.patch b/recipes/linux/linux-omap-2.6.29/dss2/0027-DSS2-VRFB-rotation-and-mirroring-implemented.patch new file mode 100644 index 0000000000..b56e32a11c --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/dss2/0027-DSS2-VRFB-rotation-and-mirroring-implemented.patch @@ -0,0 +1,324 @@ +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] 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.5.6.5 + diff --git a/recipes/linux/linux-omap-2.6.29/dss2/0028-DSS2-OMAPFB-Added-support-for-the-YUV-VRFB-rotatio.patch b/recipes/linux/linux-omap-2.6.29/dss2/0028-DSS2-OMAPFB-Added-support-for-the-YUV-VRFB-rotatio.patch new file mode 100644 index 0000000000..6400da3c24 --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/dss2/0028-DSS2-OMAPFB-Added-support-for-the-YUV-VRFB-rotatio.patch @@ -0,0 +1,236 @@ +From c09f1a0642fd58a1b081594ea36dfd1bf71aec52 Mon Sep 17 00:00:00 2001 +From: Hardik Shah <hardik.shah@ti.com> +Date: Thu, 9 Apr 2009 12:13:07 +0530 +Subject: [PATCH] DSS2: OMAPFB: Added support for the YUV VRFB rotation and mirroring. + +DSS2 now requires roatation_type to be specified by driver. +Added support for that. +DSS2 OMAPFB: Modified to pass the dss mode to omap_vrfb_setup function. + +VRFB size register requires the width to be halved when the +mode is YUV or UYVY. So VRFB is modifed to pass the mode to omap_vrfb_setup +function. + +Few changes done by Tim Yamin +Signed-off-by: Tim Yamin <plasm@roo.me.uk> +Signed-off-by: Hardik Shah <hardik.shah@ti.com> +--- + arch/arm/plat-omap/vrfb.c | 4 +- + drivers/video/omap2/omapfb/omapfb-main.c | 59 ++++++++++++++---------------- + drivers/video/omap2/omapfb/omapfb.h | 7 +--- + 3 files changed, 30 insertions(+), 40 deletions(-) + +diff --git a/arch/arm/plat-omap/vrfb.c b/arch/arm/plat-omap/vrfb.c +index 2f08f6d..2ae0d68 100644 +--- a/arch/arm/plat-omap/vrfb.c ++++ b/arch/arm/plat-omap/vrfb.c +@@ -88,9 +88,9 @@ void omap_vrfb_setup(struct vrfb *vrfb, unsigned long paddr, + color_mode == OMAP_DSS_COLOR_UYVY) + width >>= 1; + +- if (bytespp == 4) { ++ 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/omapfb/omapfb-main.c b/drivers/video/omap2/omapfb/omapfb-main.c +index 67c67c2..57f5900 100644 +--- a/drivers/video/omap2/omapfb/omapfb-main.c ++++ b/drivers/video/omap2/omapfb/omapfb-main.c +@@ -176,15 +176,9 @@ static unsigned omapfb_get_vrfb_offset(struct omapfb_info *ofbi, int rot) + + static u32 omapfb_get_region_rot_paddr(struct omapfb_info *ofbi) + { +- if (ofbi->rotation_type == OMAPFB_ROT_VRFB) { +- unsigned offset; +- int rot; +- +- rot = ofbi->rotation; +- +- offset = omapfb_get_vrfb_offset(ofbi, rot); +- +- return ofbi->region.vrfb.paddr[rot] + offset; ++ if (ofbi->rotation_type == OMAP_DSS_ROT_VRFB) { ++ return ofbi->region.vrfb.paddr[ofbi->rotation] ++ + omapfb_get_vrfb_offset(ofbi, ofbi->rotation); + } else { + return ofbi->region.paddr; + } +@@ -192,7 +186,7 @@ static u32 omapfb_get_region_rot_paddr(struct omapfb_info *ofbi) + + u32 omapfb_get_region_paddr(struct omapfb_info *ofbi) + { +- if (ofbi->rotation_type == OMAPFB_ROT_VRFB) ++ if (ofbi->rotation_type == OMAP_DSS_ROT_VRFB) + return ofbi->region.vrfb.paddr[0]; + else + return ofbi->region.paddr; +@@ -200,7 +194,7 @@ u32 omapfb_get_region_paddr(struct omapfb_info *ofbi) + + void __iomem *omapfb_get_region_vaddr(struct omapfb_info *ofbi) + { +- if (ofbi->rotation_type == OMAPFB_ROT_VRFB) ++ if (ofbi->rotation_type == OMAP_DSS_ROT_VRFB) + return ofbi->region.vrfb.vaddr[0]; + else + return ofbi->region.vaddr; +@@ -398,7 +392,7 @@ void set_fb_fix(struct fb_info *fbi) + fbi->screen_base = (char __iomem *)omapfb_get_region_vaddr(ofbi); + + /* used by mmap in fbmem.c */ +- if (ofbi->rotation_type == OMAPFB_ROT_VRFB) ++ if (ofbi->rotation_type == OMAP_DSS_ROT_VRFB) + fix->line_length = + (OMAP_VRFB_LINE_LEN * var->bits_per_pixel) >> 3; + else +@@ -434,11 +428,14 @@ void set_fb_fix(struct fb_info *fbi) + fix->xpanstep = 1; + fix->ypanstep = 1; + +- if (rg->size) { +- if (ofbi->rotation_type == OMAPFB_ROT_VRFB) +- omap_vrfb_setup(&rg->vrfb, rg->paddr, +- var->xres_virtual, var->yres_virtual, +- var->bits_per_pixel >> 3); ++ if (rg->size && ofbi->rotation_type == OMAP_DSS_ROT_VRFB) { ++ enum omap_color_mode mode = 0; ++ mode = fb_mode_to_dss_mode(var); ++ ++ omap_vrfb_setup(&rg->vrfb, rg->paddr, ++ var->xres_virtual, ++ var->yres_virtual, ++ mode); + } + } + +@@ -527,7 +524,7 @@ int check_fb_var(struct fb_info *fbi, struct fb_var_screeninfo *var) + if (var->yres > var->yres_virtual) + var->yres = var->yres_virtual; + +- if (ofbi->rotation_type == OMAPFB_ROT_VRFB) ++ if (ofbi->rotation_type == OMAP_DSS_ROT_VRFB) + line_size = OMAP_VRFB_LINE_LEN * bytespp; + else + line_size = var->xres_virtual * bytespp; +@@ -549,7 +546,7 @@ int check_fb_var(struct fb_info *fbi, struct fb_var_screeninfo *var) + + if (line_size * var->yres_virtual > max_frame_size) { + DBG("can't fit FB into memory, reducing x\n"); +- if (ofbi->rotation_type == OMAPFB_ROT_VRFB) ++ if (ofbi->rotation_type == OMAP_DSS_ROT_VRFB) + return -EINVAL; + + var->xres_virtual = max_frame_size / var->yres_virtual / +@@ -672,7 +669,7 @@ static int omapfb_setup_overlay(struct fb_info *fbi, struct omap_overlay *ovl, + struct omap_overlay_info info; + int xres, yres; + int screen_width; +- int rot, mirror; ++ int mirror; + + DBG("setup_overlay %d, posx %d, posy %d, outw %d, outh %d\n", ofbi->id, + posx, posy, outw, outh); +@@ -688,7 +685,7 @@ static int omapfb_setup_overlay(struct fb_info *fbi, struct omap_overlay *ovl, + offset = ((var->yoffset * var->xres_virtual + + var->xoffset) * var->bits_per_pixel) >> 3; + +- if (ofbi->rotation_type == OMAPFB_ROT_VRFB) { ++ if (ofbi->rotation_type == OMAP_DSS_ROT_VRFB) { + data_start_p = omapfb_get_region_rot_paddr(ofbi); + data_start_v = NULL; + } else { +@@ -711,13 +708,10 @@ static int omapfb_setup_overlay(struct fb_info *fbi, struct omap_overlay *ovl, + + ovl->get_overlay_info(ovl, &info); + +- if (ofbi->rotation_type == OMAPFB_ROT_VRFB) { +- rot = 0; ++ if (ofbi->rotation_type == OMAP_DSS_ROT_VRFB) + mirror = 0; +- } else { +- rot = ofbi->rotation; ++ else + mirror = ofbi->mirror; +- } + + info.paddr = data_start_p; + info.vaddr = data_start_v; +@@ -725,7 +719,8 @@ static int omapfb_setup_overlay(struct fb_info *fbi, struct omap_overlay *ovl, + info.width = xres; + info.height = yres; + info.color_mode = mode; +- info.rotation = rot; ++ info.rotation_type = ofbi->rotation_type; ++ info.rotation = ofbi->rotation; + info.mirror = mirror; + + info.pos_x = posx; +@@ -1121,7 +1116,7 @@ static void omapfb_free_fbmem(struct fb_info *fbi) + if (rg->vaddr) + iounmap(rg->vaddr); + +- if (ofbi->rotation_type == OMAPFB_ROT_VRFB) { ++ if (ofbi->rotation_type == OMAP_DSS_ROT_VRFB) { + /* unmap the 0 angle rotation */ + if (rg->vrfb.vaddr[0]) { + iounmap(rg->vrfb.vaddr[0]); +@@ -1181,7 +1176,7 @@ static int omapfb_alloc_fbmem(struct fb_info *fbi, unsigned long size, + return -ENOMEM; + } + +- if (ofbi->rotation_type != OMAPFB_ROT_VRFB) { ++ if (ofbi->rotation_type != OMAP_DSS_ROT_VRFB) { + vaddr = ioremap_wc(paddr, size); + + if (!vaddr) { +@@ -1260,7 +1255,7 @@ static int omapfb_alloc_fbmem_display(struct fb_info *fbi, unsigned long size, + + display->get_resolution(display, &w, &h); + +- if (ofbi->rotation_type == OMAPFB_ROT_VRFB) { ++ if (ofbi->rotation_type == OMAP_DSS_ROT_VRFB) { + #ifdef DEBUG + int oldw = w, oldh = h; + #endif +@@ -1701,8 +1696,8 @@ static int omapfb_create_framebuffers(struct omapfb2_device *fbdev) + ofbi->id = i; + + /* assign these early, so that fb alloc can use them */ +- ofbi->rotation_type = def_vrfb ? OMAPFB_ROT_VRFB : +- OMAPFB_ROT_DMA; ++ ofbi->rotation_type = def_vrfb ? OMAP_DSS_ROT_VRFB : ++ OMAP_DSS_ROT_DMA; + ofbi->rotation = def_rotate; + ofbi->mirror = def_mirror; + +diff --git a/drivers/video/omap2/omapfb/omapfb.h b/drivers/video/omap2/omapfb/omapfb.h +index 2607def..43f6922 100644 +--- a/drivers/video/omap2/omapfb/omapfb.h ++++ b/drivers/video/omap2/omapfb/omapfb.h +@@ -53,11 +53,6 @@ struct omapfb2_mem_region { + bool map; /* kernel mapped by the driver */ + }; + +-enum omapfb_rotation_type { +- OMAPFB_ROT_DMA = 0, +- OMAPFB_ROT_VRFB = 1, +-}; +- + /* appended to fb_info */ + struct omapfb_info { + int id; +@@ -66,7 +61,7 @@ struct omapfb_info { + int num_overlays; + struct omap_overlay *overlays[OMAPFB_MAX_OVL_PER_FB]; + struct omapfb2_device *fbdev; +- enum omapfb_rotation_type rotation_type; ++ enum omap_dss_rotation_type rotation_type; + u8 rotation; + bool mirror; + }; +-- +1.5.6.5 + diff --git a/recipes/linux/linux-omap-2.6.29/dss2/0029-DSS2-OMAPFB-Set-line_length-correctly-for-YUV-with.patch b/recipes/linux/linux-omap-2.6.29/dss2/0029-DSS2-OMAPFB-Set-line_length-correctly-for-YUV-with.patch new file mode 100644 index 0000000000..072978670b --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/dss2/0029-DSS2-OMAPFB-Set-line_length-correctly-for-YUV-with.patch @@ -0,0 +1,61 @@ +From a8a37babe4856170f4cba86c425a8f21975d9e9e Mon Sep 17 00:00:00 2001 +From: Tim Yamin <plasm@roo.me.uk> +Date: Mon, 13 Apr 2009 13:57:42 -0700 +Subject: [PATCH] DSS2: OMAPFB: Set line_length correctly for YUV with VRFB. + +Signed-off-by: Tim Yamin <plasm@roo.me.uk> +--- + drivers/video/omap2/omapfb/omapfb-main.c | 30 +++++++++++++++++++++++++----- + 1 files changed, 25 insertions(+), 5 deletions(-) + +diff --git a/drivers/video/omap2/omapfb/omapfb-main.c b/drivers/video/omap2/omapfb/omapfb-main.c +index 57f5900..cd63740 100644 +--- a/drivers/video/omap2/omapfb/omapfb-main.c ++++ b/drivers/video/omap2/omapfb/omapfb-main.c +@@ -392,10 +392,19 @@ void set_fb_fix(struct fb_info *fbi) + fbi->screen_base = (char __iomem *)omapfb_get_region_vaddr(ofbi); + + /* used by mmap in fbmem.c */ +- if (ofbi->rotation_type == OMAP_DSS_ROT_VRFB) +- fix->line_length = +- (OMAP_VRFB_LINE_LEN * var->bits_per_pixel) >> 3; +- else ++ if (ofbi->rotation_type == OMAP_DSS_ROT_VRFB) { ++ switch (var->nonstd) { ++ case OMAPFB_COLOR_YUV422: ++ case OMAPFB_COLOR_YUY422: ++ fix->line_length = ++ (OMAP_VRFB_LINE_LEN * var->bits_per_pixel) >> 2; ++ break; ++ default: ++ fix->line_length = ++ (OMAP_VRFB_LINE_LEN * var->bits_per_pixel) >> 3; ++ break; ++ } ++ } else + fix->line_length = + (var->xres_virtual * var->bits_per_pixel) >> 3; + fix->smem_start = omapfb_get_region_paddr(ofbi); +@@ -704,7 +713,18 @@ static int omapfb_setup_overlay(struct fb_info *fbi, struct omap_overlay *ovl, + goto err; + } + +- screen_width = fix->line_length / (var->bits_per_pixel >> 3); ++ switch (var->nonstd) { ++ case OMAPFB_COLOR_YUV422: ++ case OMAPFB_COLOR_YUY422: ++ if (ofbi->rotation_type == OMAP_DSS_ROT_VRFB) { ++ screen_width = fix->line_length ++ / (var->bits_per_pixel >> 2); ++ break; ++ } ++ default: ++ screen_width = fix->line_length / (var->bits_per_pixel >> 3); ++ break; ++ } + + ovl->get_overlay_info(ovl, &info); + +-- +1.5.6.5 + diff --git a/recipes/linux/linux-omap-2.6.29/dss2/0030-DSS2-dispc_get_trans_key-was-returning-wrong-key-ty.patch b/recipes/linux/linux-omap-2.6.29/dss2/0030-DSS2-dispc_get_trans_key-was-returning-wrong-key-ty.patch new file mode 100644 index 0000000000..7e2bb48938 --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/dss2/0030-DSS2-dispc_get_trans_key-was-returning-wrong-key-ty.patch @@ -0,0 +1,29 @@ +From bda19b9359d9dc60f8b0beb5685e173e236ee30f Mon Sep 17 00:00:00 2001 +From: Hardik Shah <hardik.shah@ti.com> +Date: Wed, 15 Apr 2009 17:05:18 +0530 +Subject: [PATCH] DSS2: dispc_get_trans_key was returning wrong key type + +Signed-off-by: Hardik Shah <hardik.shah@ti.com> +--- + drivers/video/omap2/dss/dispc.c | 4 ++-- + 1 files changed, 2 insertions(+), 2 deletions(-) + +diff --git a/drivers/video/omap2/dss/dispc.c b/drivers/video/omap2/dss/dispc.c +index 23a8155..076d3d4 100644 +--- a/drivers/video/omap2/dss/dispc.c ++++ b/drivers/video/omap2/dss/dispc.c +@@ -1826,9 +1826,9 @@ void dispc_get_trans_key(enum omap_channel ch, + enable_clocks(1); + if (type) { + if (ch == OMAP_DSS_CHANNEL_LCD) +- *type = REG_GET(DISPC_CONFIG, 11, 11) >> 11; ++ *type = REG_GET(DISPC_CONFIG, 11, 11); + else if (ch == OMAP_DSS_CHANNEL_DIGIT) +- *type = REG_GET(DISPC_CONFIG, 13, 13) >> 13; ++ *type = REG_GET(DISPC_CONFIG, 13, 13); + else + BUG(); + } +-- +1.5.6.5 + |