linux-mainline 3.2: fix build of external SGX modules
authorKoen Kooi <koen@dominion.thruhere.net>
Tue, 1 May 2012 19:06:50 +0000 (21:06 +0200)
committerDenys Dmytriyenko <denys@ti.com>
Thu, 3 May 2012 23:09:17 +0000 (19:09 -0400)
Patch downloaded from https://github.com/RobertCNelson/stable-kernel/tree/master/patches/sgx

Signed-off-by: Koen Kooi <koen@dominion.thruhere.net>
Signed-off-by: Denys Dmytriyenko <denys@ti.com>
recipes-kernel/linux/linux-mainline-3.2/sgx/0001-Revert-OMAP-DSS2-remove-update_mode-from-omapdss-v3.2.patch [new file with mode: 0644]
recipes-kernel/linux/linux-mainline_3.2.bb

diff --git a/recipes-kernel/linux/linux-mainline-3.2/sgx/0001-Revert-OMAP-DSS2-remove-update_mode-from-omapdss-v3.2.patch b/recipes-kernel/linux/linux-mainline-3.2/sgx/0001-Revert-OMAP-DSS2-remove-update_mode-from-omapdss-v3.2.patch
new file mode 100644 (file)
index 0000000..9f24df0
--- /dev/null
@@ -0,0 +1,321 @@
+From 4fbd1a6149222f1a075182e4d41cf1e2f72345d2 Mon Sep 17 00:00:00 2001
+From: Robert Nelson <robertcnelson@gmail.com>
+Date: Wed, 3 Aug 2011 11:08:04 -0500
+Subject: [PATCH] Revert "OMAP: DSS2: remove update_mode from omapdss"
+
+This reverts commit 8cff88c5da2197aa601409d4a7ce8f83f8de8190.
+---
+ drivers/video/omap2/displays/panel-taal.c |   17 ++++++++
+ drivers/video/omap2/dss/display.c         |   45 ++++++++++++++++++++++
+ drivers/video/omap2/dss/manager.c         |   59 ++++++++++++++++++++++-------
+ drivers/video/omap2/dss/venc.c            |   17 ++++++++
+ include/video/omapdss.h                   |   11 +++++
+ 5 files changed, 135 insertions(+), 14 deletions(-)
+
+diff --git a/drivers/video/omap2/displays/panel-taal.c b/drivers/video/omap2/displays/panel-taal.c
+index 80c3f6a..a2a7380 100644
+--- a/drivers/video/omap2/displays/panel-taal.c
++++ b/drivers/video/omap2/displays/panel-taal.c
+@@ -1874,6 +1874,20 @@ err:
+       mutex_unlock(&td->lock);
+ }
++static int taal_set_update_mode(struct omap_dss_device *dssdev,
++              enum omap_dss_update_mode mode)
++{
++      if (mode != OMAP_DSS_UPDATE_MANUAL)
++              return -EINVAL;
++      return 0;
++}
++
++static enum omap_dss_update_mode taal_get_update_mode(
++              struct omap_dss_device *dssdev)
++{
++      return OMAP_DSS_UPDATE_MANUAL;
++}
++
+ static struct omap_dss_driver taal_driver = {
+       .probe          = taal_probe,
+       .remove         = __exit_p(taal_remove),
+@@ -1883,6 +1897,9 @@ static struct omap_dss_driver taal_driver = {
+       .suspend        = taal_suspend,
+       .resume         = taal_resume,
++      .set_update_mode = taal_set_update_mode,
++      .get_update_mode = taal_get_update_mode,
++
+       .update         = taal_update,
+       .sync           = taal_sync,
+diff --git a/drivers/video/omap2/dss/display.c b/drivers/video/omap2/dss/display.c
+index be331dc..6fa445c 100644
+--- a/drivers/video/omap2/dss/display.c
++++ b/drivers/video/omap2/dss/display.c
+@@ -65,6 +65,48 @@ static ssize_t display_enabled_store(struct device *dev,
+       return size;
+ }
++static ssize_t display_upd_mode_show(struct device *dev,
++              struct device_attribute *attr, char *buf)
++{
++      struct omap_dss_device *dssdev = to_dss_device(dev);
++      enum omap_dss_update_mode mode = OMAP_DSS_UPDATE_AUTO;
++      if (dssdev->driver->get_update_mode)
++              mode = dssdev->driver->get_update_mode(dssdev);
++      return snprintf(buf, PAGE_SIZE, "%d\n", mode);
++}
++
++static ssize_t display_upd_mode_store(struct device *dev,
++              struct device_attribute *attr,
++              const char *buf, size_t size)
++{
++      struct omap_dss_device *dssdev = to_dss_device(dev);
++      int val, r;
++      enum omap_dss_update_mode mode;
++
++      if (!dssdev->driver->set_update_mode)
++              return -EINVAL;
++
++      r = kstrtoint(buf, 0, &val);
++      if (r)
++              return r;
++
++      switch (val) {
++      case OMAP_DSS_UPDATE_DISABLED:
++      case OMAP_DSS_UPDATE_AUTO:
++      case OMAP_DSS_UPDATE_MANUAL:
++              mode = (enum omap_dss_update_mode)val;
++              break;
++      default:
++              return -EINVAL;
++      }
++
++      r = dssdev->driver->set_update_mode(dssdev, mode);
++      if (r)
++              return r;
++
++      return size;
++}
++
+ static ssize_t display_tear_show(struct device *dev,
+               struct device_attribute *attr, char *buf)
+ {
+@@ -250,6 +292,8 @@ static ssize_t display_wss_store(struct device *dev,
+ static DEVICE_ATTR(enabled, S_IRUGO|S_IWUSR,
+               display_enabled_show, display_enabled_store);
++static DEVICE_ATTR(update_mode, S_IRUGO|S_IWUSR,
++              display_upd_mode_show, display_upd_mode_store);
+ static DEVICE_ATTR(tear_elim, S_IRUGO|S_IWUSR,
+               display_tear_show, display_tear_store);
+ static DEVICE_ATTR(timings, S_IRUGO|S_IWUSR,
+@@ -263,6 +307,7 @@ static DEVICE_ATTR(wss, S_IRUGO|S_IWUSR,
+ static struct device_attribute *display_sysfs_attrs[] = {
+       &dev_attr_enabled,
++      &dev_attr_update_mode,
+       &dev_attr_tear_elim,
+       &dev_attr_timings,
+       &dev_attr_rotate,
+diff --git a/drivers/video/omap2/dss/manager.c b/drivers/video/omap2/dss/manager.c
+index 6e63845..e5684a9 100644
+--- a/drivers/video/omap2/dss/manager.c
++++ b/drivers/video/omap2/dss/manager.c
+@@ -515,6 +515,8 @@ struct overlay_cache_data {
+       u32 fifo_low;
+       u32 fifo_high;
++
++      bool manual_update;
+ };
+ struct manager_cache_data {
+@@ -528,6 +530,7 @@ struct manager_cache_data {
+       struct omap_overlay_manager_info info;
++      bool manual_upd_display;
+       bool manual_update;
+       bool do_manual_update;
+@@ -636,15 +639,24 @@ static int dss_mgr_wait_for_go(struct omap_overlay_manager *mgr)
+       if (!dssdev || dssdev->state != OMAP_DSS_DISPLAY_ACTIVE)
+               return 0;
+-      if (dssdev->caps & OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE)
+-              return 0;
+-
+       if (dssdev->type == OMAP_DISPLAY_TYPE_VENC
+                       || dssdev->type == OMAP_DISPLAY_TYPE_HDMI) {
+               irq = DISPC_IRQ_EVSYNC_ODD | DISPC_IRQ_EVSYNC_EVEN;
+       } else {
+-              irq = (dssdev->manager->id == OMAP_DSS_CHANNEL_LCD) ?
+-                      DISPC_IRQ_VSYNC : DISPC_IRQ_VSYNC2;
++              if (dssdev->caps & OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE) {
++                      enum omap_dss_update_mode mode;
++                      mode = dssdev->driver->get_update_mode(dssdev);
++                      if (mode != OMAP_DSS_UPDATE_AUTO)
++                              return 0;
++
++                      irq = (dssdev->manager->id == OMAP_DSS_CHANNEL_LCD) ?
++                              DISPC_IRQ_FRAMEDONE
++                              : DISPC_IRQ_FRAMEDONE2;
++              } else {
++                      irq = (dssdev->manager->id == OMAP_DSS_CHANNEL_LCD) ?
++                              DISPC_IRQ_VSYNC
++                              : DISPC_IRQ_VSYNC2;
++              }
+       }
+       mc = &dss_cache.manager_cache[mgr->id];
+@@ -705,15 +717,24 @@ int dss_mgr_wait_for_go_ovl(struct omap_overlay *ovl)
+       if (!dssdev || dssdev->state != OMAP_DSS_DISPLAY_ACTIVE)
+               return 0;
+-      if (dssdev->caps & OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE)
+-              return 0;
+-
+       if (dssdev->type == OMAP_DISPLAY_TYPE_VENC
+                       || dssdev->type == OMAP_DISPLAY_TYPE_HDMI) {
+               irq = DISPC_IRQ_EVSYNC_ODD | DISPC_IRQ_EVSYNC_EVEN;
+       } else {
+-              irq = (dssdev->manager->id == OMAP_DSS_CHANNEL_LCD) ?
+-                      DISPC_IRQ_VSYNC : DISPC_IRQ_VSYNC2;
++              if (dssdev->caps & OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE) {
++                      enum omap_dss_update_mode mode;
++                      mode = dssdev->driver->get_update_mode(dssdev);
++                      if (mode != OMAP_DSS_UPDATE_AUTO)
++                              return 0;
++
++                      irq = (dssdev->manager->id == OMAP_DSS_CHANNEL_LCD) ?
++                              DISPC_IRQ_FRAMEDONE
++                              : DISPC_IRQ_FRAMEDONE2;
++              } else {
++                      irq = (dssdev->manager->id == OMAP_DSS_CHANNEL_LCD) ?
++                              DISPC_IRQ_VSYNC
++                              : DISPC_IRQ_VSYNC2;
++              }
+       }
+       oc = &dss_cache.overlay_cache[ovl->id];
+@@ -848,7 +869,7 @@ static int configure_overlay(enum omap_plane plane)
+       orig_outw = outw;
+       orig_outh = outh;
+-      if (mc->manual_update && mc->do_manual_update) {
++      if (c->manual_update && mc->do_manual_update) {
+               unsigned bpp;
+               unsigned scale_x_m = w, scale_x_d = outw;
+               unsigned scale_y_m = h, scale_y_d = outh;
+@@ -1010,7 +1031,7 @@ static int configure_dispc(void)
+               if (!oc->dirty)
+                       continue;
+-              if (mc->manual_update && !mc->do_manual_update)
++              if (oc->manual_update && !mc->do_manual_update)
+                       continue;
+               if (mgr_busy[oc->channel]) {
+@@ -1058,7 +1079,7 @@ static int configure_dispc(void)
+               /* We don't need GO with manual update display. LCD iface will
+                * always be turned off after frame, and new settings will be
+                * taken in to use at next update */
+-              if (!mc->manual_update)
++              if (!mc->manual_upd_display)
+                       dispc_mgr_go(i);
+       }
+@@ -1376,6 +1397,11 @@ static int omap_dss_mgr_apply(struct omap_overlay_manager *mgr)
+               oc->enabled = true;
++              oc->manual_update =
++                      dssdev->caps & OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE &&
++                      dssdev->driver->get_update_mode(dssdev) !=
++                              OMAP_DSS_UPDATE_AUTO;
++
+               ++num_planes_enabled;
+       }
+@@ -1402,8 +1428,13 @@ static int omap_dss_mgr_apply(struct omap_overlay_manager *mgr)
+               mc->dirty = true;
+               mc->info = mgr->info;
+-              mc->manual_update =
++              mc->manual_upd_display =
+                       dssdev->caps & OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE;
++
++              mc->manual_update =
++                      dssdev->caps & OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE &&
++                      dssdev->driver->get_update_mode(dssdev) !=
++                              OMAP_DSS_UPDATE_AUTO;
+       }
+       /* XXX TODO: Try to get fifomerge working. The problem is that it
+diff --git a/drivers/video/omap2/dss/venc.c b/drivers/video/omap2/dss/venc.c
+index b404095..a8b03c1 100644
+--- a/drivers/video/omap2/dss/venc.c
++++ b/drivers/video/omap2/dss/venc.c
+@@ -579,6 +579,20 @@ static int venc_panel_resume(struct omap_dss_device *dssdev)
+       return venc_panel_enable(dssdev);
+ }
++static enum omap_dss_update_mode venc_get_update_mode(
++              struct omap_dss_device *dssdev)
++{
++      return OMAP_DSS_UPDATE_AUTO;
++}
++
++static int venc_set_update_mode(struct omap_dss_device *dssdev,
++              enum omap_dss_update_mode mode)
++{
++      if (mode != OMAP_DSS_UPDATE_AUTO)
++              return -EINVAL;
++      return 0;
++}
++
+ static void venc_get_timings(struct omap_dss_device *dssdev,
+                       struct omap_video_timings *timings)
+ {
+@@ -663,6 +677,9 @@ static struct omap_dss_driver venc_driver = {
+       .get_resolution = omapdss_default_get_resolution,
+       .get_recommended_bpp = omapdss_default_get_recommended_bpp,
++      .set_update_mode = venc_set_update_mode,
++      .get_update_mode = venc_get_update_mode,
++
+       .get_timings    = venc_get_timings,
+       .set_timings    = venc_set_timings,
+       .check_timings  = venc_check_timings,
+diff --git a/include/video/omapdss.h b/include/video/omapdss.h
+index 378c7ed..540d61e 100644
+--- a/include/video/omapdss.h
++++ b/include/video/omapdss.h
+@@ -152,6 +152,12 @@ enum omap_display_caps {
+       OMAP_DSS_DISPLAY_CAP_TEAR_ELIM          = 1 << 1,
+ };
++enum omap_dss_update_mode {
++      OMAP_DSS_UPDATE_DISABLED = 0,
++      OMAP_DSS_UPDATE_AUTO,
++      OMAP_DSS_UPDATE_MANUAL,
++};
++
+ enum omap_dss_display_state {
+       OMAP_DSS_DISPLAY_DISABLED = 0,
+       OMAP_DSS_DISPLAY_ACTIVE,
+@@ -587,6 +593,11 @@ struct omap_dss_driver {
+       int (*resume)(struct omap_dss_device *display);
+       int (*run_test)(struct omap_dss_device *display, int test);
++      int (*set_update_mode)(struct omap_dss_device *dssdev,
++                      enum omap_dss_update_mode);
++      enum omap_dss_update_mode (*get_update_mode)(
++                      struct omap_dss_device *dssdev);
++
+       int (*update)(struct omap_dss_device *dssdev,
+                              u16 x, u16 y, u16 w, u16 h);
+       int (*sync)(struct omap_dss_device *dssdev);
+-- 
+1.7.7.3
+
index efad8d013c618281917c300d9c54fea1c2afb65d..dd86bbf7a53f244fc37581bf83ee13bbbd88c18b 100644 (file)
@@ -69,6 +69,7 @@ SRC_URI += "git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.gi
             file://omap_fixes/0004-ARM-OMAP4-clock-Add-CPU-local-timer-clock-node.patch \
             file://omap_fixes/0005-ARM-OMAP3-hwmod-data-disable-multiblock-reads-on-MMC.patch \
             file://omap_fixes/0006-OMAP-HWMOD-add-es3plus-to-am36xx-am35xx.patch \
+            file://sgx/0001-Revert-OMAP-DSS2-remove-update_mode-from-omapdss-v3.2.patch \
             \
             file://defconfig"