linux-omap 2.6.29: sync with dss2 tree for YUV rotation
authorKoen Kooi <koen@openembedded.org>
Thu, 16 Apr 2009 15:29:14 +0000 (17:29 +0200)
committerKoen Kooi <koen@openembedded.org>
Thu, 16 Apr 2009 15:29:14 +0000 (17:29 +0200)
conf/machine/include/omap3.inc
recipes/linux/linux-omap-2.6.29/dss2/0026-DSS2-DSI-sidlemode-to-noidle-while-sending-frame.patch [new file with mode: 0644]
recipes/linux/linux-omap-2.6.29/dss2/0027-DSS2-VRFB-rotation-and-mirroring-implemented.patch [new file with mode: 0644]
recipes/linux/linux-omap-2.6.29/dss2/0028-DSS2-OMAPFB-Added-support-for-the-YUV-VRFB-rotatio.patch [new file with mode: 0644]
recipes/linux/linux-omap-2.6.29/dss2/0029-DSS2-OMAPFB-Set-line_length-correctly-for-YUV-with.patch [new file with mode: 0644]
recipes/linux/linux-omap-2.6.29/dss2/0030-DSS2-dispc_get_trans_key-was-returning-wrong-key-ty.patch [new file with mode: 0644]
recipes/linux/linux-omap_2.6.29.bb

index fdf4daf..f4c0d37 100644 (file)
@@ -1,7 +1,7 @@
 require conf/machine/include/tune-cortexa8.inc
 PREFERRED_PROVIDER_virtual/kernel = "linux-omap"
 # Increase this everytime you change something in the kernel
-MACHINE_KERNEL_PR = "r26
+MACHINE_KERNEL_PR = "r27
 
 KERNEL_IMAGETYPE = "uImage"
 
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 (file)
index 0000000..6ee3908
--- /dev/null
@@ -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 (file)
index 0000000..b56e32a
--- /dev/null
@@ -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 (file)
index 0000000..6400da3
--- /dev/null
@@ -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 (file)
index 0000000..0729786
--- /dev/null
@@ -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 (file)
index 0000000..7e2bb48
--- /dev/null
@@ -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
+
index a580a43..f70fc9b 100644 (file)
@@ -46,6 +46,11 @@ SRC_URI_append = " \
            file://dss2/0023-DSS2-pass-the-default-FB-color-format-through-board.patch;patch=1 \
            file://dss2/0024-DSS2-Beagle-Use-gpio_set_value.patch;patch=1 \
            file://dss2/0025-DSS2-VRFB-Macro-for-calculating-base-address-of-th.patch;patch=1 \
+           file://dss2/0026-DSS2-DSI-sidlemode-to-noidle-while-sending-frame.patch;patch=1 \
+           file://dss2/0027-DSS2-VRFB-rotation-and-mirroring-implemented.patch;patch=1 \
+           file://dss2/0028-DSS2-OMAPFB-Added-support-for-the-YUV-VRFB-rotatio.patch;patch=1 \
+           file://dss2/0029-DSS2-OMAPFB-Set-line_length-correctly-for-YUV-with.patch;patch=1 \
+           file://dss2/0030-DSS2-dispc_get_trans_key-was-returning-wrong-key-ty.patch;patch=1 \
            file://0001-board-ldp-add-regulator-info-to-get-the-microSD-slo.patch;patch=1 \
            file://fix-unaligned-access.diff;patch=1 \
            file://make-alignment-visible.diff;patch=1 \