linux omap git: add patch that implements downscaling for the overlay
authorKoen Kooi <koen@openembedded.org>
Fri, 31 Oct 2008 15:07:36 +0000 (16:07 +0100)
committerKoen Kooi <koen@openembedded.org>
Fri, 31 Oct 2008 15:07:36 +0000 (16:07 +0100)
* this fixes: http://www.flickr.com/photos/koenkooi/2946825478/

packages/linux/linux-omap/0001-Implement-downsampling-with-debugs.patch [new file with mode: 0644]
packages/linux/linux-omap_git.bb

diff --git a/packages/linux/linux-omap/0001-Implement-downsampling-with-debugs.patch b/packages/linux/linux-omap/0001-Implement-downsampling-with-debugs.patch
new file mode 100644 (file)
index 0000000..d3608df
--- /dev/null
@@ -0,0 +1,138 @@
+From 1ef94095e9399a9a387b7b457b48f6c5de7013d8 Mon Sep 17 00:00:00 2001
+From: Tuomas Kulve <tuomas.kulve@movial.com>
+Date: Fri, 31 Oct 2008 14:23:57 +0200
+Subject: [PATCH] Implement downsampling (with debugs).
+
+---
+ drivers/video/omap/dispc.c |   75 +++++++++++++++++++++++++++++++++++++-------
+ 1 files changed, 63 insertions(+), 12 deletions(-)
+
+diff --git a/drivers/video/omap/dispc.c b/drivers/video/omap/dispc.c
+index 68bc887..3640dbe 100644
+--- a/drivers/video/omap/dispc.c
++++ b/drivers/video/omap/dispc.c
+@@ -18,6 +18,8 @@
+  * with this program; if not, write to the Free Software Foundation, Inc.,
+  * 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+  */
++#define DEBUG
++#define VERBOSE_DEBUG
+ #include <linux/kernel.h>
+ #include <linux/dma-mapping.h>
+ #include <linux/mm.h>
+@@ -545,6 +547,17 @@ static void write_firhv_reg(int plane, int reg, u32 value)
+       dispc_write_reg(base + reg * 8, value);
+ }
++static void write_firv_reg(int plane, int reg, u32 value)
++{
++      u32 base;
++
++      if (plane == 1)
++              base = 0x1E0;
++      else
++              base = 0x1E0 + 0x20;
++      dispc_write_reg(base + reg * 4, value);
++}
++
+ static void set_upsampling_coef_table(int plane)
+ {
+       const u32 coef[][2] = {
+@@ -565,6 +578,27 @@ static void set_upsampling_coef_table(int plane)
+       }
+ }
++static void set_downsampling_coef_table(int plane)
++{
++      const u32 coef[][3] = {
++                { 0x24382400, 0x24382400, 0x00000000 },
++                { 0x28371FFE, 0x28391F04, 0x000004FE },
++                { 0x2C361BFB, 0x2D381B08, 0x000008FB },
++                { 0x303516F9, 0x3237170C, 0x00000CF9 },
++                { 0x11343311, 0x123737F7, 0x0000F711 },
++                { 0x1635300C, 0x173732F9, 0x0000F90C },
++                { 0x1B362C08, 0x1B382DFB, 0x0000FB08 },
++                { 0x1F372804, 0x1F3928FE, 0x0000FE04 },
++      };
++      int i;
++
++      for (i = 0; i < 8; i++) {
++              write_firh_reg(plane, i, coef[i][0]);
++              write_firhv_reg(plane, i, coef[i][1]);
++              write_firv_reg(plane, i, coef[i][2]);
++      }
++}
++
+ static int omap_dispc_set_scale(int plane,
+                               int orig_width, int orig_height,
+                               int out_width, int out_height)
+@@ -592,25 +626,47 @@ static int omap_dispc_set_scale(int plane,
+               if (orig_height > out_height ||
+                   orig_width * 8 < out_width ||
+                   orig_height * 8 < out_height) {
++                        dev_dbg(dispc.fbdev->dev, 
++                                "Max upsampling is 8x, "
++                                "tried: %dx%d -> %dx%d\n",
++                                orig_width, orig_height,
++                                out_width, out_height);
+                       enable_lcd_clocks(0);
+                       return -EINVAL;
+               }
+               set_upsampling_coef_table(plane);
+       } else if (orig_width > out_width) {
+-              /* Downsampling not yet supported
+-              */
+-
+-              enable_lcd_clocks(0);
+-              return -EINVAL;
++              /*
++               * Downsampling.
++               * Currently you can only scale both dimensions in one way.
++               */
++              if (orig_height < out_height ||
++                  orig_width > out_width * 4||
++                  orig_height > out_height * 4) {
++                        dev_dbg(dispc.fbdev->dev, 
++                                "Max downsampling is 4x, "
++                                "tried: %dx%d -> %dx%d\n",
++                                orig_width, orig_height,
++                                out_width, out_height);
++                      enable_lcd_clocks(0);
++                      return -EINVAL;
++              }
++              set_downsampling_coef_table(plane);
+       }
+       if (!orig_width || orig_width == out_width)
+               fir_hinc = 0;
+       else
+-              fir_hinc = 1024 * orig_width / out_width;
++              fir_hinc = 1024 * (orig_width -1)/ (out_width -1);
+       if (!orig_height || orig_height == out_height)
+               fir_vinc = 0;
+       else
+-              fir_vinc = 1024 * orig_height / out_height;
++              fir_vinc = 1024 * (orig_height-1) / (out_height -1 );
++
++      dev_dbg(dispc.fbdev->dev, "out_width %d out_height %d orig_width %d "
++              "orig_height %d fir_hinc  %d fir_vinc %d\n",
++              out_width, out_height, orig_width, orig_height,
++              fir_hinc, fir_vinc);
++
+       dispc.fir_hinc[plane] = fir_hinc;
+       dispc.fir_vinc[plane] = fir_vinc;
+@@ -619,11 +675,6 @@ static int omap_dispc_set_scale(int plane,
+                   ((fir_vinc & 4095) << 16) |
+                   (fir_hinc & 4095));
+-      dev_dbg(dispc.fbdev->dev, "out_width %d out_height %d orig_width %d "
+-              "orig_height %d fir_hinc  %d fir_vinc %d\n",
+-              out_width, out_height, orig_width, orig_height,
+-              fir_hinc, fir_vinc);
+-
+       MOD_REG_FLD(vs_reg[plane],
+                   FLD_MASK(16, 11) | FLD_MASK(0, 11),
+                   ((out_height - 1) << 16) | (out_width - 1));
+-- 
+1.5.6.5
+
index ec1a071..6512e10 100644 (file)
@@ -10,7 +10,7 @@ SRCREV = "2a3408be17f287fdb5809c9b6c68e7ad96d25b74"
 
 #PV = "2.6.26+2.6.27-rc7+${PR}+gitr${SRCREV}"
 PV = "2.6.27+${PR}+gitr${SRCREV}"
-PR = "r3"
+PR = "r4"
 
 SRC_URI = "git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap-2.6.git;protocol=git \
           file://defconfig"
@@ -35,6 +35,7 @@ SRC_URI_append = " \
            file://musb-fix-endpoints.diff;patch=1 \
            file://dvb-fix-dma.diff;patch=1 \
            file://0001-Removed-resolution-check-that-prevents-scaling-when.patch;patch=1 \
+           file://0001-Implement-downsampling-with-debugs.patch;patch=1 \
 "