From ea662c15729c1fb25be4ab1ea9010020aa2df34e Mon Sep 17 00:00:00 2001 From: Koen Kooi Date: Fri, 31 Oct 2008 16:07:36 +0100 Subject: linux omap git: add patch that implements downscaling for the overlay * this fixes: http://www.flickr.com/photos/koenkooi/2946825478/ --- .../0001-Implement-downsampling-with-debugs.patch | 138 +++++++++++++++++++++ packages/linux/linux-omap_git.bb | 3 +- 2 files changed, 140 insertions(+), 1 deletion(-) create mode 100644 packages/linux/linux-omap/0001-Implement-downsampling-with-debugs.patch 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 index 0000000000..d3608df9cb --- /dev/null +++ b/packages/linux/linux-omap/0001-Implement-downsampling-with-debugs.patch @@ -0,0 +1,138 @@ +From 1ef94095e9399a9a387b7b457b48f6c5de7013d8 Mon Sep 17 00:00:00 2001 +From: Tuomas Kulve +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 + #include + #include +@@ -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 + diff --git a/packages/linux/linux-omap_git.bb b/packages/linux/linux-omap_git.bb index ec1a071773..6512e101da 100644 --- a/packages/linux/linux-omap_git.bb +++ b/packages/linux/linux-omap_git.bb @@ -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 \ " -- cgit v1.2.3