linux-omap 2.6.29: add more dss2 patches, should solve problems when using u-boot...
authorKoen Kooi <koen@openembedded.org>
Thu, 23 Apr 2009 10:14:41 +0000 (12:14 +0200)
committerKoen Kooi <koen@openembedded.org>
Thu, 23 Apr 2009 10:14:41 +0000 (12:14 +0200)
15 files changed:
conf/machine/include/omap3.inc
recipes/linux/linux-omap-2.6.29/dss2/0041-DSS2-Disable-vertical-offset-with-fieldmode.patch [new file with mode: 0644]
recipes/linux/linux-omap-2.6.29/dss2/0042-DSS2-Don-t-enable-fieldmode-automatically.patch [new file with mode: 0644]
recipes/linux/linux-omap-2.6.29/dss2/0043-DSS2-Swap-field-0-and-field-1-registers.patch [new file with mode: 0644]
recipes/linux/linux-omap-2.6.29/dss2/0044-DSS2-add-sysfs-entry-for-seting-the-rotate-type.patch [new file with mode: 0644]
recipes/linux/linux-omap-2.6.29/dss2/0045-DSS2-Fixed-line-endings-from-to.patch [new file with mode: 0644]
recipes/linux/linux-omap-2.6.29/dss2/0046-DSS2-DSI-decrease-sync-timeout-from-60s-to-2s.patch [new file with mode: 0644]
recipes/linux/linux-omap-2.6.29/dss2/0047-DSS2-fix-return-value-for-rotate_type-sysfs-functio.patch [new file with mode: 0644]
recipes/linux/linux-omap-2.6.29/dss2/0048-OMAP2-3-DMA-implement-trans-copy-and-const-fill.patch [new file with mode: 0644]
recipes/linux/linux-omap-2.6.29/dss2/0049-DSS2-VRAM-clear-allocated-area-with-DMA.patch [new file with mode: 0644]
recipes/linux/linux-omap-2.6.29/dss2/0050-DSS2-OMAPFB-remove-fb-clearing-code.patch [new file with mode: 0644]
recipes/linux/linux-omap-2.6.29/dss2/0051-DSS2-VRAM-use-debugfs-not-procfs.patch [new file with mode: 0644]
recipes/linux/linux-omap-2.6.29/dss2/0052-DSS2-VRAM-fix-section-mismatch-warning.patch [new file with mode: 0644]
recipes/linux/linux-omap-2.6.29/dss2/0053-DSS2-disable-LCD-DIGIT-before-resetting-DSS.patch [new file with mode: 0644]
recipes/linux/linux-omap_2.6.29.bb

index fc801aa..5d6d9ff 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 = "r30
+MACHINE_KERNEL_PR = "r31
 
 KERNEL_IMAGETYPE = "uImage"
 
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 (file)
index 0000000..6785ade
--- /dev/null
@@ -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 (file)
index 0000000..5264911
--- /dev/null
@@ -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 (file)
index 0000000..76e3781
--- /dev/null
@@ -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 (file)
index 0000000..32def9e
--- /dev/null
@@ -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 (file)
index 0000000..9382469
--- /dev/null
@@ -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 (file)
index 0000000..4ae5fbd
--- /dev/null
@@ -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 (file)
index 0000000..0b0f104
--- /dev/null
@@ -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 (file)
index 0000000..cc6663f
--- /dev/null
@@ -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 (file)
index 0000000..e9fc76c
--- /dev/null
@@ -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 (file)
index 0000000..8c5edd0
--- /dev/null
@@ -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 (file)
index 0000000..93ff320
--- /dev/null
@@ -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, &region_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 = &region_list;
+-
+-      mutex_lock(&region_mutex);
+-
+-      do {
+-              l = l->next;
+-              if (l == &region_list)
+-                      return NULL;
+-      } while (p--);
+-
+-      return l;
+-}
+-
+-static void r_stop(struct seq_file *m, void *v)
+-{
+-      mutex_unlock(&region_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(&region_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, &region_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(&region_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 (file)
index 0000000..b8f89b6
--- /dev/null
@@ -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 (file)
index 0000000..f591fb7
--- /dev/null
@@ -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
+
index 36c672f..f0769f8 100644 (file)
@@ -62,6 +62,19 @@ SRC_URI_append = " \
            file://dss2/0038-DSS2-OMAPFB-Some-color-keying-pointerd-renamed-in-D.patch;patch=1 \
            file://dss2/0039-DSS2-Add-sysfs-entry-to-for-the-alpha-blending-supp.patch;patch=1 \
            file://dss2/0040-DSS2-Provided-proper-exclusion-for-destination-colo.patch;patch=1 \
+           file://dss2/0041-DSS2-Disable-vertical-offset-with-fieldmode.patch;patch=1 \
+           file://dss2/0042-DSS2-Don-t-enable-fieldmode-automatically.patch;patch=1 \
+           file://dss2/0043-DSS2-Swap-field-0-and-field-1-registers.patch;patch=1 \
+           file://dss2/0044-DSS2-add-sysfs-entry-for-seting-the-rotate-type.patch;patch=1 \
+           file://dss2/0045-DSS2-Fixed-line-endings-from-to.patch;patch=1 \
+           file://dss2/0046-DSS2-DSI-decrease-sync-timeout-from-60s-to-2s.patch;patch=1 \
+           file://dss2/0047-DSS2-fix-return-value-for-rotate_type-sysfs-functio.patch;patch=1 \
+           file://dss2/0048-OMAP2-3-DMA-implement-trans-copy-and-const-fill.patch;patch=1 \
+           file://dss2/0049-DSS2-VRAM-clear-allocated-area-with-DMA.patch;patch=1 \
+           file://dss2/0050-DSS2-OMAPFB-remove-fb-clearing-code.patch;patch=1 \
+           file://dss2/0051-DSS2-VRAM-use-debugfs-not-procfs.patch;patch=1 \
+           file://dss2/0052-DSS2-VRAM-fix-section-mismatch-warning.patch;patch=1 \
+           file://dss2/0053-DSS2-disable-LCD-DIGIT-before-resetting-DSS.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 \