diff options
Diffstat (limited to 'recipes/linux/linux-omap-2.6.29/dss2')
13 files changed, 991 insertions, 0 deletions
diff --git a/recipes/linux/linux-omap-2.6.29/dss2/0041-DSS2-Disable-vertical-offset-with-fieldmode.patch b/recipes/linux/linux-omap-2.6.29/dss2/0041-DSS2-Disable-vertical-offset-with-fieldmode.patch new file mode 100644 index 0000000000..6785ade279 --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/dss2/0041-DSS2-Disable-vertical-offset-with-fieldmode.patch @@ -0,0 +1,71 @@ +From 9bcac9b9e678f476c83b5679b1215b6bc946130a Mon Sep 17 00:00:00 2001 +From: =?utf-8?q?Ville=20Syrj=C3=A4l=C3=A4?= <ville.syrjala@nokia.com> +Date: Mon, 20 Apr 2009 16:26:18 +0200 +Subject: [PATCH] DSS2: Disable vertical offset with fieldmode +MIME-Version: 1.0 +Content-Type: text/plain; charset=utf-8 +Content-Transfer-Encoding: 8bit + +When using fieldmode each field is basically a separate picture so the +vertical filter should start at phase 0 for both fields. + +Signed-off-by: Ville Syrjälä <ville.syrjala@nokia.com> +--- + drivers/video/omap2/dss/dispc.c | 23 +++++++++-------------- + 1 files changed, 9 insertions(+), 14 deletions(-) + +diff --git a/drivers/video/omap2/dss/dispc.c b/drivers/video/omap2/dss/dispc.c +index 7e551c2..f15614b 100644 +--- a/drivers/video/omap2/dss/dispc.c ++++ b/drivers/video/omap2/dss/dispc.c +@@ -1029,12 +1029,12 @@ static void _dispc_set_vid_accu1(enum omap_plane plane, int haccu, int vaccu) + static void _dispc_set_scaling(enum omap_plane plane, + u16 orig_width, u16 orig_height, + u16 out_width, u16 out_height, +- bool ilace, bool five_taps) ++ bool ilace, bool five_taps, ++ bool fieldmode) + { + int fir_hinc; + int fir_vinc; + int hscaleup, vscaleup; +- int fieldmode = 0; + int accu0 = 0; + int accu1 = 0; + u32 l; +@@ -1072,17 +1072,12 @@ static void _dispc_set_scaling(enum omap_plane plane, + + dispc_write_reg(dispc_reg_att[plane], l); + +- if (ilace) { +- if (fieldmode) { +- accu0 = fir_vinc / 2; +- accu1 = 0; +- } else { +- accu0 = 0; +- accu1 = fir_vinc / 2; +- if (accu1 >= 1024/2) { +- accu0 = 1024/2; +- accu1 -= accu0; +- } ++ if (ilace && !fieldmode) { ++ accu0 = 0; ++ accu1 = fir_vinc / 2; ++ if (accu1 >= 1024/2) { ++ accu0 = 1024/2; ++ accu1 -= accu0; + } + } + +@@ -1582,7 +1577,7 @@ static int _dispc_setup_plane(enum omap_plane plane, + if (plane != OMAP_DSS_GFX) { + _dispc_set_scaling(plane, width, height, + out_width, out_height, +- ilace, five_taps); ++ ilace, five_taps, fieldmode); + _dispc_set_vid_size(plane, out_width, out_height); + _dispc_set_vid_color_conv(plane, cconv); + } +-- +1.5.6.5 + diff --git a/recipes/linux/linux-omap-2.6.29/dss2/0042-DSS2-Don-t-enable-fieldmode-automatically.patch b/recipes/linux/linux-omap-2.6.29/dss2/0042-DSS2-Don-t-enable-fieldmode-automatically.patch new file mode 100644 index 0000000000..5264911b41 --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/dss2/0042-DSS2-Don-t-enable-fieldmode-automatically.patch @@ -0,0 +1,34 @@ +From 9c6de0fed6e8a598d026d348533fdf731b737d55 Mon Sep 17 00:00:00 2001 +From: =?utf-8?q?Ville=20Syrj=C3=A4l=C3=A4?= <ville.syrjala@nokia.com> +Date: Mon, 20 Apr 2009 16:26:19 +0200 +Subject: [PATCH] DSS2: Don't enable fieldmode automatically +MIME-Version: 1.0 +Content-Type: text/plain; charset=utf-8 +Content-Transfer-Encoding: 8bit + +The only case where enabling fieldmode automatically seems reasonable +is when source and destination heights are equal. Some kind of user +controllable knob should be added so the user could enable field mode +when the source is interlaced. + +Signed-off-by: Ville Syrjälä <ville.syrjala@nokia.com> +--- + drivers/video/omap2/dss/dispc.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +diff --git a/drivers/video/omap2/dss/dispc.c b/drivers/video/omap2/dss/dispc.c +index f15614b..1c036c1 100644 +--- a/drivers/video/omap2/dss/dispc.c ++++ b/drivers/video/omap2/dss/dispc.c +@@ -1450,7 +1450,7 @@ static int _dispc_setup_plane(enum omap_plane plane, + if (paddr == 0) + return -EINVAL; + +- if (ilace && height >= out_height) ++ if (ilace && height == out_height) + fieldmode = 1; + + if (ilace) { +-- +1.5.6.5 + diff --git a/recipes/linux/linux-omap-2.6.29/dss2/0043-DSS2-Swap-field-0-and-field-1-registers.patch b/recipes/linux/linux-omap-2.6.29/dss2/0043-DSS2-Swap-field-0-and-field-1-registers.patch new file mode 100644 index 0000000000..76e37817c4 --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/dss2/0043-DSS2-Swap-field-0-and-field-1-registers.patch @@ -0,0 +1,170 @@ +From 35e88797e93b107ba602dee1e2ac8ea761dccd4b Mon Sep 17 00:00:00 2001 +From: =?utf-8?q?Ville=20Syrj=C3=A4l=C3=A4?= <ville.syrjala@nokia.com> +Date: Mon, 20 Apr 2009 16:26:20 +0200 +Subject: [PATCH] DSS2: Swap field 0 and field 1 registers +MIME-Version: 1.0 +Content-Type: text/plain; charset=utf-8 +Content-Transfer-Encoding: 8bit + +The values for the registers which have alternate values for each field +were reveresed to what the hardware expects. For the hardware field 0 +is the even field or the bottom field, field 1 is the odd field or the +top field. So simply swap the register values. + +Signed-off-by: Ville Syrjälä <ville.syrjala@nokia.com> +--- + drivers/video/omap2/dss/dispc.c | 66 ++++++++++++++++++++++----------------- + 1 files changed, 37 insertions(+), 29 deletions(-) + +diff --git a/drivers/video/omap2/dss/dispc.c b/drivers/video/omap2/dss/dispc.c +index 1c036c1..9bab6cf 100644 +--- a/drivers/video/omap2/dss/dispc.c ++++ b/drivers/video/omap2/dss/dispc.c +@@ -1072,12 +1072,16 @@ static void _dispc_set_scaling(enum omap_plane plane, + + dispc_write_reg(dispc_reg_att[plane], l); + ++ /* ++ * field 0 = even field = bottom field ++ * field 1 = odd field = top field ++ */ + if (ilace && !fieldmode) { +- accu0 = 0; +- accu1 = fir_vinc / 2; +- if (accu1 >= 1024/2) { +- accu0 = 1024/2; +- accu1 -= accu0; ++ accu1 = 0; ++ accu0 = fir_vinc / 2; ++ if (accu0 >= 1024/2) { ++ accu1 = 1024/2; ++ accu0 -= accu1; + } + } + +@@ -1266,34 +1270,38 @@ static void calc_dma_rotation_offset(u8 rotation, bool mirror, + fbh = width; + } + ++ /* ++ * field 0 = even field = bottom field ++ * field 1 = odd field = top field ++ */ + switch (rotation + mirror * 4) { + case 0: +- *offset0 = 0; ++ *offset1 = 0; + if (fieldmode) +- *offset1 = screen_width * ps; ++ *offset0 = screen_width * ps; + else +- *offset1 = 0; ++ *offset0 = 0; + *row_inc = pixinc(1 + (screen_width - fbw) + + (fieldmode ? screen_width : 0), + ps); + *pix_inc = pixinc(1, ps); + break; + case 1: +- *offset0 = screen_width * (fbh - 1) * ps; ++ *offset1 = screen_width * (fbh - 1) * ps; + if (fieldmode) +- *offset1 = *offset0 + ps; ++ *offset0 = *offset1 + ps; + else +- *offset1 = *offset0; ++ *offset0 = *offset1; + *row_inc = pixinc(screen_width * (fbh - 1) + 1 + + (fieldmode ? 1 : 0), ps); + *pix_inc = pixinc(-screen_width, ps); + break; + case 2: +- *offset0 = (screen_width * (fbh - 1) + fbw - 1) * ps; ++ *offset1 = (screen_width * (fbh - 1) + fbw - 1) * ps; + if (fieldmode) +- *offset1 = *offset0 - screen_width * ps; ++ *offset0 = *offset1 - screen_width * ps; + else +- *offset1 = *offset0; ++ *offset0 = *offset1; + *row_inc = pixinc(-1 - + (screen_width - fbw) - + (fieldmode ? screen_width : 0), +@@ -1301,11 +1309,11 @@ static void calc_dma_rotation_offset(u8 rotation, bool mirror, + *pix_inc = pixinc(-1, ps); + break; + case 3: +- *offset0 = (fbw - 1) * ps; ++ *offset1 = (fbw - 1) * ps; + if (fieldmode) +- *offset1 = *offset0 - ps; ++ *offset0 = *offset1 - ps; + else +- *offset1 = *offset0; ++ *offset0 = *offset1; + *row_inc = pixinc(-screen_width * (fbh - 1) - 1 - + (fieldmode ? 1 : 0), ps); + *pix_inc = pixinc(screen_width, ps); +@@ -1313,11 +1321,11 @@ static void calc_dma_rotation_offset(u8 rotation, bool mirror, + + /* mirroring */ + case 0 + 4: +- *offset0 = (fbw - 1) * ps; ++ *offset1 = (fbw - 1) * ps; + if (fieldmode) +- *offset1 = *offset0 + screen_width * ps; ++ *offset0 = *offset1 + screen_width * ps; + else +- *offset1 = *offset0; ++ *offset0 = *offset1; + *row_inc = pixinc(screen_width * 2 - 1 + + (fieldmode ? screen_width : 0), + ps); +@@ -1325,11 +1333,11 @@ static void calc_dma_rotation_offset(u8 rotation, bool mirror, + break; + + case 1 + 4: +- *offset0 = 0; ++ *offset1 = 0; + if (fieldmode) +- *offset1 = *offset0 + screen_width * ps; ++ *offset0 = *offset1 + screen_width * ps; + else +- *offset1 = *offset0; ++ *offset0 = *offset1; + *row_inc = pixinc(-screen_width * (fbh - 1) + 1 + + (fieldmode ? 1 : 0), + ps); +@@ -1337,11 +1345,11 @@ static void calc_dma_rotation_offset(u8 rotation, bool mirror, + break; + + case 2 + 4: +- *offset0 = screen_width * (fbh - 1) * ps; ++ *offset1 = screen_width * (fbh - 1) * ps; + if (fieldmode) +- *offset1 = *offset0 + screen_width * ps; ++ *offset0 = *offset1 + screen_width * ps; + else +- *offset1 = *offset0; ++ *offset0 = *offset1; + *row_inc = pixinc(1 - screen_width * 2 - + (fieldmode ? screen_width : 0), + ps); +@@ -1349,11 +1357,11 @@ static void calc_dma_rotation_offset(u8 rotation, bool mirror, + break; + + case 3 + 4: +- *offset0 = (screen_width * (fbh - 1) + fbw - 1) * ps; ++ *offset1 = (screen_width * (fbh - 1) + fbw - 1) * ps; + if (fieldmode) +- *offset1 = *offset0 + screen_width * ps; ++ *offset0 = *offset1 + screen_width * ps; + else +- *offset1 = *offset0; ++ *offset0 = *offset1; + *row_inc = pixinc(screen_width * (fbh - 1) - 1 - + (fieldmode ? 1 : 0), + ps); +-- +1.5.6.5 + diff --git a/recipes/linux/linux-omap-2.6.29/dss2/0044-DSS2-add-sysfs-entry-for-seting-the-rotate-type.patch b/recipes/linux/linux-omap-2.6.29/dss2/0044-DSS2-add-sysfs-entry-for-seting-the-rotate-type.patch new file mode 100644 index 0000000000..32def9e8d5 --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/dss2/0044-DSS2-add-sysfs-entry-for-seting-the-rotate-type.patch @@ -0,0 +1,76 @@ +From a9b3500bd14609750a2337e866e1df62627c1bac Mon Sep 17 00:00:00 2001 +From: Imre Deak <imre.deak@nokia.com> +Date: Mon, 20 Apr 2009 14:55:33 +0200 +Subject: [PATCH] DSS2: add sysfs entry for seting the rotate type + +This can help in utilizing VRAM memory better. Since with VRFB rotation +we waste a lot of physical memory due to the VRFB HW design, provide the +possibility to turn it off and free the extra memory for the use by other +planes for example. +--- + drivers/video/omap2/omapfb/omapfb-sysfs.c | 42 ++++++++++++++++++++++++++++- + 1 files changed, 41 insertions(+), 1 deletions(-) + +diff --git a/drivers/video/omap2/omapfb/omapfb-sysfs.c b/drivers/video/omap2/omapfb/omapfb-sysfs.c +index 2c88718..4e3da42 100644 +--- a/drivers/video/omap2/omapfb/omapfb-sysfs.c ++++ b/drivers/video/omap2/omapfb/omapfb-sysfs.c +@@ -43,6 +43,46 @@ static ssize_t show_rotate_type(struct device *dev, + return snprintf(buf, PAGE_SIZE, "%d\n", ofbi->rotation_type); + } + ++static ssize_t store_rotate_type(struct device *dev, ++ struct device_attribute *attr, ++ const char *buf, size_t count) ++{ ++ struct fb_info *fbi = dev_get_drvdata(dev); ++ struct omapfb_info *ofbi = FB2OFB(fbi); ++ struct omapfb2_device *fbdev = ofbi->fbdev; ++ enum omap_dss_rotation_type rot_type; ++ int r; ++ ++ rot_type = simple_strtoul(buf, NULL, 0); ++ ++ if (rot_type != OMAP_DSS_ROT_DMA && rot_type != OMAP_DSS_ROT_VRFB) ++ return -EINVAL; ++ ++ omapfb_lock(fbdev); ++ ++ r = 0; ++ if (rot_type == ofbi->rotation_type) ++ goto out; ++ ++ r = -EBUSY; ++ if (ofbi->region.size) ++ goto out; ++ ++ ofbi->rotation_type = rot_type; ++ ++ /* ++ * Since the VRAM for this FB is not allocated at the moment we don't need to ++ * do any further parameter checking at this point. ++ */ ++ ++ r = count; ++out: ++ omapfb_unlock(fbdev); ++ ++ return r; ++} ++ ++ + static ssize_t show_mirror(struct device *dev, + struct device_attribute *attr, char *buf) + { +@@ -327,7 +367,7 @@ static ssize_t show_virt(struct device *dev, + } + + static struct device_attribute omapfb_attrs[] = { +- __ATTR(rotate_type, S_IRUGO, show_rotate_type, NULL), ++ __ATTR(rotate_type, S_IRUGO | S_IWUSR, show_rotate_type, store_rotate_type), + __ATTR(mirror, S_IRUGO | S_IWUSR, show_mirror, store_mirror), + __ATTR(size, S_IRUGO | S_IWUSR, show_size, store_size), + __ATTR(overlays, S_IRUGO | S_IWUSR, show_overlays, store_overlays), +-- +1.5.6.5 + diff --git a/recipes/linux/linux-omap-2.6.29/dss2/0045-DSS2-Fixed-line-endings-from-to.patch b/recipes/linux/linux-omap-2.6.29/dss2/0045-DSS2-Fixed-line-endings-from-to.patch new file mode 100644 index 0000000000..9382469850 --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/dss2/0045-DSS2-Fixed-line-endings-from-to.patch @@ -0,0 +1,48 @@ +From b0e081456a9b094109c04467d041ff693843ca47 Mon Sep 17 00:00:00 2001 +From: Tomi Valkeinen <tomi.valkeinen@nokia.com> +Date: Tue, 21 Apr 2009 09:25:16 +0300 +Subject: [PATCH] DSS2: Fixed line endings from , to ; + +--- + drivers/video/omap2/dss/manager.c | 18 +++++++++--------- + 1 files changed, 9 insertions(+), 9 deletions(-) + +diff --git a/drivers/video/omap2/dss/manager.c b/drivers/video/omap2/dss/manager.c +index 108489c..bf059e0 100644 +--- a/drivers/video/omap2/dss/manager.c ++++ b/drivers/video/omap2/dss/manager.c +@@ -599,22 +599,22 @@ int dss_init_overlay_managers(struct platform_device *pdev) + break; + } + +- mgr->set_display = &omap_dss_set_display, +- mgr->unset_display = &omap_dss_unset_display, +- mgr->apply = &omap_dss_mgr_apply, +- mgr->set_default_color = &omap_dss_mgr_set_def_color, ++ mgr->set_display = &omap_dss_set_display; ++ mgr->unset_display = &omap_dss_unset_display; ++ mgr->apply = &omap_dss_mgr_apply; ++ mgr->set_default_color = &omap_dss_mgr_set_def_color; + mgr->set_trans_key_type_and_value = +- &omap_dss_mgr_set_trans_key_type_and_value, ++ &omap_dss_mgr_set_trans_key_type_and_value; + mgr->get_trans_key_type_and_value = +- &omap_dss_mgr_get_trans_key_type_and_value, +- mgr->enable_trans_key = &omap_dss_mgr_enable_trans_key, +- mgr->get_trans_key_status = &omap_dss_mgr_get_trans_key_status, ++ &omap_dss_mgr_get_trans_key_type_and_value; ++ mgr->enable_trans_key = &omap_dss_mgr_enable_trans_key; ++ mgr->get_trans_key_status = &omap_dss_mgr_get_trans_key_status; + mgr->enable_alpha_blending = + &omap_dss_mgr_enable_alpha_blending; + mgr->get_alpha_blending_status = + omap_dss_mgr_get_alpha_blending_status; + mgr->get_default_color = &omap_dss_mgr_get_default_color; +- mgr->caps = OMAP_DSS_OVL_MGR_CAP_DISPC, ++ mgr->caps = OMAP_DSS_OVL_MGR_CAP_DISPC; + + dss_overlay_setup_dispc_manager(mgr); + +-- +1.5.6.5 + diff --git a/recipes/linux/linux-omap-2.6.29/dss2/0046-DSS2-DSI-decrease-sync-timeout-from-60s-to-2s.patch b/recipes/linux/linux-omap-2.6.29/dss2/0046-DSS2-DSI-decrease-sync-timeout-from-60s-to-2s.patch new file mode 100644 index 0000000000..4ae5fbdd9a --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/dss2/0046-DSS2-DSI-decrease-sync-timeout-from-60s-to-2s.patch @@ -0,0 +1,26 @@ +From 0f88992b2681aed4f31dc7dd3926b357bbc95154 Mon Sep 17 00:00:00 2001 +From: Tomi Valkeinen <tomi.valkeinen@nokia.com> +Date: Tue, 21 Apr 2009 10:11:55 +0300 +Subject: [PATCH] DSS2: DSI: decrease sync timeout from 60s to 2s + +The framedone-problem should be ok now, so we shouldn't get long waits. +--- + drivers/video/omap2/dss/dsi.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +diff --git a/drivers/video/omap2/dss/dsi.c b/drivers/video/omap2/dss/dsi.c +index 50af925..d59ad38 100644 +--- a/drivers/video/omap2/dss/dsi.c ++++ b/drivers/video/omap2/dss/dsi.c +@@ -3216,7 +3216,7 @@ static void dsi_push_set_mirror(struct omap_display *display, int mirror) + + static int dsi_wait_sync(struct omap_display *display) + { +- long wait = msecs_to_jiffies(60000); ++ long wait = msecs_to_jiffies(2000); + struct completion compl; + + DSSDBGF(""); +-- +1.5.6.5 + diff --git a/recipes/linux/linux-omap-2.6.29/dss2/0047-DSS2-fix-return-value-for-rotate_type-sysfs-functio.patch b/recipes/linux/linux-omap-2.6.29/dss2/0047-DSS2-fix-return-value-for-rotate_type-sysfs-functio.patch new file mode 100644 index 0000000000..0b0f104b30 --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/dss2/0047-DSS2-fix-return-value-for-rotate_type-sysfs-functio.patch @@ -0,0 +1,44 @@ +From 7ddd5eaa7bc345c3719d613a46a95b7e8052ad2c Mon Sep 17 00:00:00 2001 +From: Imre Deak <imre.deak@nokia.com> +Date: Tue, 21 Apr 2009 15:18:36 +0200 +Subject: [PATCH] DSS2: fix return value for rotate_type sysfs function + +Signed-off-by: Imre Deak <imre.deak@nokia.com> +--- + drivers/video/omap2/omapfb/omapfb-sysfs.c | 9 ++++----- + 1 files changed, 4 insertions(+), 5 deletions(-) + +diff --git a/drivers/video/omap2/omapfb/omapfb-sysfs.c b/drivers/video/omap2/omapfb/omapfb-sysfs.c +index 4e3da42..13028ae 100644 +--- a/drivers/video/omap2/omapfb/omapfb-sysfs.c ++++ b/drivers/video/omap2/omapfb/omapfb-sysfs.c +@@ -64,9 +64,10 @@ static ssize_t store_rotate_type(struct device *dev, + if (rot_type == ofbi->rotation_type) + goto out; + +- r = -EBUSY; +- if (ofbi->region.size) ++ if (ofbi->region.size) { ++ r = -EBUSY; + goto out; ++ } + + ofbi->rotation_type = rot_type; + +@@ -74,12 +75,10 @@ static ssize_t store_rotate_type(struct device *dev, + * Since the VRAM for this FB is not allocated at the moment we don't need to + * do any further parameter checking at this point. + */ +- +- r = count; + out: + omapfb_unlock(fbdev); + +- return r; ++ return r ? r : count; + } + + +-- +1.5.6.5 + diff --git a/recipes/linux/linux-omap-2.6.29/dss2/0048-OMAP2-3-DMA-implement-trans-copy-and-const-fill.patch b/recipes/linux/linux-omap-2.6.29/dss2/0048-OMAP2-3-DMA-implement-trans-copy-and-const-fill.patch new file mode 100644 index 0000000000..cc6663fa21 --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/dss2/0048-OMAP2-3-DMA-implement-trans-copy-and-const-fill.patch @@ -0,0 +1,123 @@ +From e34564db95627ad20e918b240c45e2bd5555f7e8 Mon Sep 17 00:00:00 2001 +From: Tomi Valkeinen <tomi.valkeinen@nokia.com> +Date: Wed, 22 Apr 2009 10:06:08 +0300 +Subject: [PATCH] OMAP2/3: DMA: implement trans copy and const fill + +Implement transparent copy and constant fill features for OMAP2/3. + +Signed-off-by: Tomi Valkeinen <tomi.valkeinen@nokia.com> +--- + arch/arm/plat-omap/dma.c | 81 +++++++++++++++++++++------------ + arch/arm/plat-omap/include/mach/dma.h | 1 + + 2 files changed, 52 insertions(+), 30 deletions(-) + +diff --git a/arch/arm/plat-omap/dma.c b/arch/arm/plat-omap/dma.c +index 3fd0e77..060ac71 100755 +--- a/arch/arm/plat-omap/dma.c ++++ b/arch/arm/plat-omap/dma.c +@@ -310,41 +310,62 @@ EXPORT_SYMBOL(omap_set_dma_transfer_params); + + void omap_set_dma_color_mode(int lch, enum omap_dma_color_mode mode, u32 color) + { +- u16 w; +- + BUG_ON(omap_dma_in_1510_mode()); + +- if (cpu_class_is_omap2()) { +- REVISIT_24XX(); +- return; +- } ++ if (cpu_class_is_omap1()) { ++ u16 w; + +- w = dma_read(CCR2(lch)); +- w &= ~0x03; ++ w = dma_read(CCR2(lch)); ++ w &= ~0x03; + +- switch (mode) { +- case OMAP_DMA_CONSTANT_FILL: +- w |= 0x01; +- break; +- case OMAP_DMA_TRANSPARENT_COPY: +- w |= 0x02; +- break; +- case OMAP_DMA_COLOR_DIS: +- break; +- default: +- BUG(); ++ switch (mode) { ++ case OMAP_DMA_CONSTANT_FILL: ++ w |= 0x01; ++ break; ++ case OMAP_DMA_TRANSPARENT_COPY: ++ w |= 0x02; ++ break; ++ case OMAP_DMA_COLOR_DIS: ++ break; ++ default: ++ BUG(); ++ } ++ dma_write(w, CCR2(lch)); ++ ++ w = dma_read(LCH_CTRL(lch)); ++ w &= ~0x0f; ++ /* Default is channel type 2D */ ++ if (mode) { ++ dma_write((u16)color, COLOR_L(lch)); ++ dma_write((u16)(color >> 16), COLOR_U(lch)); ++ w |= 1; /* Channel type G */ ++ } ++ dma_write(w, LCH_CTRL(lch)); + } +- dma_write(w, CCR2(lch)); + +- w = dma_read(LCH_CTRL(lch)); +- w &= ~0x0f; +- /* Default is channel type 2D */ +- if (mode) { +- dma_write((u16)color, COLOR_L(lch)); +- dma_write((u16)(color >> 16), COLOR_U(lch)); +- w |= 1; /* Channel type G */ ++ if (cpu_class_is_omap2()) { ++ u32 val; ++ ++ val = dma_read(CCR(lch)); ++ val &= ~((1 << 17) | (1 << 16)); ++ ++ switch (mode) { ++ case OMAP_DMA_CONSTANT_FILL: ++ val |= 1 << 16; ++ break; ++ case OMAP_DMA_TRANSPARENT_COPY: ++ val |= 1 << 17; ++ break; ++ case OMAP_DMA_COLOR_DIS: ++ break; ++ default: ++ BUG(); ++ } ++ dma_write(val, CCR(lch)); ++ ++ color &= 0xffffff; ++ dma_write(color, COLOR(lch)); + } +- dma_write(w, LCH_CTRL(lch)); + } + EXPORT_SYMBOL(omap_set_dma_color_mode); + +diff --git a/arch/arm/plat-omap/include/mach/dma.h b/arch/arm/plat-omap/include/mach/dma.h +index 224b077..4e34f47 100644 +--- a/arch/arm/plat-omap/include/mach/dma.h ++++ b/arch/arm/plat-omap/include/mach/dma.h +@@ -144,6 +144,7 @@ + #define OMAP_DMA4_CSSA_U(n) 0 + #define OMAP_DMA4_CDSA_L(n) 0 + #define OMAP_DMA4_CDSA_U(n) 0 ++#define OMAP1_DMA_COLOR(n) 0 + + /*----------------------------------------------------------------------------*/ + +-- +1.5.6.5 + diff --git a/recipes/linux/linux-omap-2.6.29/dss2/0049-DSS2-VRAM-clear-allocated-area-with-DMA.patch b/recipes/linux/linux-omap-2.6.29/dss2/0049-DSS2-VRAM-clear-allocated-area-with-DMA.patch new file mode 100644 index 0000000000..e9fc76ce15 --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/dss2/0049-DSS2-VRAM-clear-allocated-area-with-DMA.patch @@ -0,0 +1,101 @@ +From 02034cc79f69512a6037f03ad1243c28f59fdd8a Mon Sep 17 00:00:00 2001 +From: Tomi Valkeinen <tomi.valkeinen@nokia.com> +Date: Wed, 22 Apr 2009 10:25:20 +0300 +Subject: [PATCH] DSS2: VRAM: clear allocated area with DMA + +Use DMA constant fill feature to clear VRAM area when +someone allocates it. +--- + arch/arm/plat-omap/vram.c | 57 +++++++++++++++++++++++++++++++++++++++++++++ + 1 files changed, 57 insertions(+), 0 deletions(-) + +diff --git a/arch/arm/plat-omap/vram.c b/arch/arm/plat-omap/vram.c +index 8e9fe77..90276ac 100644 +--- a/arch/arm/plat-omap/vram.c ++++ b/arch/arm/plat-omap/vram.c +@@ -31,11 +31,13 @@ + #include <linux/seq_file.h> + #include <linux/bootmem.h> + #include <linux/omapfb.h> ++#include <linux/completion.h> + + #include <asm/setup.h> + + #include <mach/sram.h> + #include <mach/vram.h> ++#include <mach/dma.h> + + #ifdef DEBUG + #define DBG(format, ...) printk(KERN_DEBUG "VRAM: " format, ## __VA_ARGS__) +@@ -276,6 +278,59 @@ int omap_vram_reserve(unsigned long paddr, size_t size) + } + EXPORT_SYMBOL(omap_vram_reserve); + ++static void _omap_vram_dma_cb(int lch, u16 ch_status, void *data) ++{ ++ struct completion *compl = data; ++ complete(compl); ++} ++ ++static int _omap_vram_clear(u32 paddr, unsigned pages) ++{ ++ struct completion compl; ++ unsigned elem_count; ++ unsigned frame_count; ++ int r; ++ int lch; ++ ++ init_completion(&compl); ++ ++ r = omap_request_dma(OMAP_DMA_NO_DEVICE, "VRAM DMA", ++ _omap_vram_dma_cb, ++ &compl, &lch); ++ if (r) { ++ pr_err("VRAM: request_dma failed for memory clear\n"); ++ return -EBUSY; ++ } ++ ++ elem_count = pages * PAGE_SIZE / 4; ++ frame_count = 1; ++ ++ omap_set_dma_transfer_params(lch, OMAP_DMA_DATA_TYPE_S32, ++ elem_count, frame_count, ++ OMAP_DMA_SYNC_ELEMENT, ++ 0, 0); ++ ++ omap_set_dma_dest_params(lch, 0, OMAP_DMA_AMODE_POST_INC, ++ paddr, 0, 0); ++ ++ omap_set_dma_color_mode(lch, OMAP_DMA_CONSTANT_FILL, 0x000000); ++ ++ omap_start_dma(lch); ++ ++ if (wait_for_completion_timeout(&compl, msecs_to_jiffies(1000)) == 0) { ++ omap_stop_dma(lch); ++ pr_err("VRAM: dma timeout while clearing memory\n"); ++ r = -EIO; ++ goto err; ++ } ++ ++ r = 0; ++err: ++ omap_free_dma(lch); ++ ++ return r; ++} ++ + static int _omap_vram_alloc(int mtype, unsigned pages, unsigned long *paddr) + { + struct vram_region *rm; +@@ -313,6 +368,8 @@ found: + + *paddr = start; + ++ _omap_vram_clear(start, pages); ++ + return 0; + } + +-- +1.5.6.5 + diff --git a/recipes/linux/linux-omap-2.6.29/dss2/0050-DSS2-OMAPFB-remove-fb-clearing-code.patch b/recipes/linux/linux-omap-2.6.29/dss2/0050-DSS2-OMAPFB-remove-fb-clearing-code.patch new file mode 100644 index 0000000000..8c5edd0c3d --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/dss2/0050-DSS2-OMAPFB-remove-fb-clearing-code.patch @@ -0,0 +1,53 @@ +From 07482193cccdfe9ede1f47d72790dfbe54343505 Mon Sep 17 00:00:00 2001 +From: Tomi Valkeinen <tomi.valkeinen@nokia.com> +Date: Wed, 22 Apr 2009 10:26:06 +0300 +Subject: [PATCH] DSS2: OMAPFB: remove fb clearing code + +VRAM manager does the clearing now when the area is allocated. +--- + drivers/video/omap2/omapfb/omapfb-main.c | 8 -------- + 1 files changed, 0 insertions(+), 8 deletions(-) + +diff --git a/drivers/video/omap2/omapfb/omapfb-main.c b/drivers/video/omap2/omapfb/omapfb-main.c +index cd63740..76e7c6c 100644 +--- a/drivers/video/omap2/omapfb/omapfb-main.c ++++ b/drivers/video/omap2/omapfb/omapfb-main.c +@@ -1174,7 +1174,6 @@ static int omapfb_alloc_fbmem(struct fb_info *fbi, unsigned long size, + struct omapfb2_mem_region *rg; + void __iomem *vaddr; + int r; +- int clear = 0; + + rg = &ofbi->region; + memset(rg, 0, sizeof(*rg)); +@@ -1184,7 +1183,6 @@ static int omapfb_alloc_fbmem(struct fb_info *fbi, unsigned long size, + if (!paddr) { + DBG("allocating %lu bytes for fb %d\n", size, ofbi->id); + r = omap_vram_alloc(OMAPFB_MEMTYPE_SDRAM, size, &paddr); +- clear = 1; + } else { + DBG("reserving %lu bytes at %lx for fb %d\n", size, paddr, + ofbi->id); +@@ -1206,9 +1204,6 @@ static int omapfb_alloc_fbmem(struct fb_info *fbi, unsigned long size, + } + + DBG("allocated VRAM paddr %lx, vaddr %p\n", paddr, vaddr); +- +- if (clear) +- memset_io(vaddr, 0, size); + } else { + void __iomem *va; + +@@ -1232,9 +1227,6 @@ static int omapfb_alloc_fbmem(struct fb_info *fbi, unsigned long size, + rg->vrfb.vaddr[0] = va; + + vaddr = NULL; +- +- if (clear) +- memset_io(va, 0, size); + } + + rg->paddr = paddr; +-- +1.5.6.5 + diff --git a/recipes/linux/linux-omap-2.6.29/dss2/0051-DSS2-VRAM-use-debugfs-not-procfs.patch b/recipes/linux/linux-omap-2.6.29/dss2/0051-DSS2-VRAM-use-debugfs-not-procfs.patch new file mode 100644 index 0000000000..93ff3205d3 --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/dss2/0051-DSS2-VRAM-use-debugfs-not-procfs.patch @@ -0,0 +1,170 @@ +From b47aef28536f3c276d232c41cd3084c69389dca4 Mon Sep 17 00:00:00 2001 +From: Tomi Valkeinen <tomi.valkeinen@nokia.com> +Date: Wed, 22 Apr 2009 14:11:52 +0300 +Subject: [PATCH] DSS2: VRAM: use debugfs, not procfs + +--- + arch/arm/plat-omap/vram.c | 103 +++++++++++++++------------------------------ + 1 files changed, 34 insertions(+), 69 deletions(-) + +diff --git a/arch/arm/plat-omap/vram.c b/arch/arm/plat-omap/vram.c +index 90276ac..e847579 100644 +--- a/arch/arm/plat-omap/vram.c ++++ b/arch/arm/plat-omap/vram.c +@@ -27,11 +27,11 @@ + #include <linux/mm.h> + #include <linux/list.h> + #include <linux/dma-mapping.h> +-#include <linux/proc_fs.h> + #include <linux/seq_file.h> + #include <linux/bootmem.h> + #include <linux/omapfb.h> + #include <linux/completion.h> ++#include <linux/debugfs.h> + + #include <asm/setup.h> + +@@ -398,88 +398,54 @@ int omap_vram_alloc(int mtype, size_t size, unsigned long *paddr) + } + EXPORT_SYMBOL(omap_vram_alloc); + +-#ifdef CONFIG_PROC_FS +-static void *r_next(struct seq_file *m, void *v, loff_t *pos) +-{ +- struct list_head *l = v; +- +- (*pos)++; +- +- if (list_is_last(l, ®ion_list)) +- return NULL; +- +- return l->next; +-} +- +-static void *r_start(struct seq_file *m, loff_t *pos) +-{ +- loff_t p = *pos; +- struct list_head *l = ®ion_list; +- +- mutex_lock(®ion_mutex); +- +- do { +- l = l->next; +- if (l == ®ion_list) +- return NULL; +- } while (p--); +- +- return l; +-} +- +-static void r_stop(struct seq_file *m, void *v) +-{ +- mutex_unlock(®ion_mutex); +-} +- +-static int r_show(struct seq_file *m, void *v) ++#if defined(CONFIG_DEBUG_FS) ++static int vram_debug_show(struct seq_file *s, void *unused) + { + struct vram_region *vr; + struct vram_alloc *va; + unsigned size; + +- vr = list_entry(v, struct vram_region, list); +- +- size = vr->pages << PAGE_SHIFT; +- +- seq_printf(m, "%08lx-%08lx (%d bytes)\n", +- vr->paddr, vr->paddr + size - 1, +- size); ++ mutex_lock(®ion_mutex); + +- list_for_each_entry(va, &vr->alloc_list, list) { +- size = va->pages << PAGE_SHIFT; +- seq_printf(m, " %08lx-%08lx (%d bytes)\n", +- va->paddr, va->paddr + size - 1, ++ list_for_each_entry(vr, ®ion_list, list) { ++ size = vr->pages << PAGE_SHIFT; ++ seq_printf(s, "%08lx-%08lx (%d bytes)\n", ++ vr->paddr, vr->paddr + size - 1, + size); +- } + ++ list_for_each_entry(va, &vr->alloc_list, list) { ++ size = va->pages << PAGE_SHIFT; ++ seq_printf(s, " %08lx-%08lx (%d bytes)\n", ++ va->paddr, va->paddr + size - 1, ++ size); ++ } ++ } + ++ mutex_unlock(®ion_mutex); + + return 0; + } + +-static const struct seq_operations resource_op = { +- .start = r_start, +- .next = r_next, +- .stop = r_stop, +- .show = r_show, +-}; +- +-static int vram_open(struct inode *inode, struct file *file) ++static int vram_debug_open(struct inode *inode, struct file *file) + { +- return seq_open(file, &resource_op); ++ return single_open(file, vram_debug_show, inode->i_private); + } + +-static const struct file_operations proc_vram_operations = { +- .open = vram_open, +- .read = seq_read, +- .llseek = seq_lseek, +- .release = seq_release, ++static const struct file_operations vram_debug_fops = { ++ .open = vram_debug_open, ++ .read = seq_read, ++ .llseek = seq_lseek, ++ .release = single_release, + }; + +-static int __init omap_vram_create_proc(void) ++static int __init omap_vram_create_debugfs(void) + { +- proc_create("omap-vram", 0, NULL, &proc_vram_operations); ++ struct dentry *d; ++ ++ d = debugfs_create_file("vram", S_IRUGO, NULL, ++ NULL, &vram_debug_fops); ++ if (IS_ERR(d)) ++ return PTR_ERR(d); + + return 0; + } +@@ -487,7 +453,7 @@ static int __init omap_vram_create_proc(void) + + static __init int omap_vram_init(void) + { +- int i, r; ++ int i; + + vram_initialized = 1; + +@@ -495,10 +461,9 @@ static __init int omap_vram_init(void) + omap_vram_add_region(postponed_regions[i].paddr, + postponed_regions[i].size); + +-#ifdef CONFIG_PROC_FS +- r = omap_vram_create_proc(); +- if (r) +- return -ENOMEM; ++#ifdef CONFIG_DEBUG_FS ++ if (omap_vram_create_debugfs()) ++ pr_err("VRAM: Failed to create debugfs file\n"); + #endif + + return 0; +-- +1.5.6.5 + diff --git a/recipes/linux/linux-omap-2.6.29/dss2/0052-DSS2-VRAM-fix-section-mismatch-warning.patch b/recipes/linux/linux-omap-2.6.29/dss2/0052-DSS2-VRAM-fix-section-mismatch-warning.patch new file mode 100644 index 0000000000..b8f89b6239 --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/dss2/0052-DSS2-VRAM-fix-section-mismatch-warning.patch @@ -0,0 +1,34 @@ +From 635fa66abe6e502c9b78b1dc66757bf67fd163e1 Mon Sep 17 00:00:00 2001 +From: Imre Deak <imre.deak@nokia.com> +Date: Wed, 22 Apr 2009 14:40:48 +0200 +Subject: [PATCH] DSS2: VRAM: fix section mismatch warning + +postponed_regions are accessed from the non __init +omap_vram_add_region(). + +Signed-off-by: Imre Deak <imre.deak@nokia.com> +--- + arch/arm/plat-omap/vram.c | 4 ++-- + 1 files changed, 2 insertions(+), 2 deletions(-) + +diff --git a/arch/arm/plat-omap/vram.c b/arch/arm/plat-omap/vram.c +index e847579..b126a64 100644 +--- a/arch/arm/plat-omap/vram.c ++++ b/arch/arm/plat-omap/vram.c +@@ -63,11 +63,11 @@ + #define MAX_POSTPONED_REGIONS 10 + + static bool vram_initialized; +-static int postponed_cnt __initdata; ++static int postponed_cnt; + static struct { + unsigned long paddr; + size_t size; +-} postponed_regions[MAX_POSTPONED_REGIONS] __initdata; ++} postponed_regions[MAX_POSTPONED_REGIONS]; + + struct vram_alloc { + struct list_head list; +-- +1.5.6.5 + diff --git a/recipes/linux/linux-omap-2.6.29/dss2/0053-DSS2-disable-LCD-DIGIT-before-resetting-DSS.patch b/recipes/linux/linux-omap-2.6.29/dss2/0053-DSS2-disable-LCD-DIGIT-before-resetting-DSS.patch new file mode 100644 index 0000000000..f591fb700a --- /dev/null +++ b/recipes/linux/linux-omap-2.6.29/dss2/0053-DSS2-disable-LCD-DIGIT-before-resetting-DSS.patch @@ -0,0 +1,41 @@ +From c7ce3c5e9f7e28900b8ea9c3e1afe41dcdc0863d Mon Sep 17 00:00:00 2001 +From: Tomi Valkeinen <tomi.valkeinen@nokia.com> +Date: Thu, 23 Apr 2009 10:46:53 +0300 +Subject: [PATCH] DSS2: disable LCD & DIGIT before resetting DSS + +This seems to fix the synclost problem that we get, if the bootloader +starts the DSS and the kernel resets it. +--- + drivers/video/omap2/dss/dss.c | 8 +++++--- + 1 files changed, 5 insertions(+), 3 deletions(-) + +diff --git a/drivers/video/omap2/dss/dss.c b/drivers/video/omap2/dss/dss.c +index adc1f34..aab9758 100644 +--- a/drivers/video/omap2/dss/dss.c ++++ b/drivers/video/omap2/dss/dss.c +@@ -285,6 +285,11 @@ int dss_init(bool skip_init) + } + + if (!skip_init) { ++ /* disable LCD and DIGIT output. This seems to fix the synclost ++ * problem that we get, if the bootloader starts the DSS and ++ * the kernel resets it */ ++ omap_writel(omap_readl(0x48050440) & ~0x3, 0x48050440); ++ + /* We need to wait here a bit, otherwise we sometimes start to + * get synclost errors, and after that only power cycle will + * restore DSS functionality. I have no idea why this happens. +@@ -294,10 +299,7 @@ int dss_init(bool skip_init) + msleep(50); + + _omap_dss_reset(); +- + } +- else +- printk("DSS SKIP RESET\n"); + + /* autoidle */ + REG_FLD_MOD(DSS_SYSCONFIG, 1, 0, 0); +-- +1.5.6.5 + |