From 368d7772dcde0a42e9952ca6b2762495d0f49602 Mon Sep 17 00:00:00 2001 From: Koen Kooi Date: Tue, 1 May 2012 21:06:50 +0200 Subject: [PATCH] linux-mainline 3.2: fix build of external SGX modules Patch downloaded from https://github.com/RobertCNelson/stable-kernel/tree/master/patches/sgx Signed-off-by: Koen Kooi Signed-off-by: Denys Dmytriyenko --- ...remove-update_mode-from-omapdss-v3.2.patch | 321 ++++++++++++++++++ recipes-kernel/linux/linux-mainline_3.2.bb | 1 + 2 files changed, 322 insertions(+) create mode 100644 recipes-kernel/linux/linux-mainline-3.2/sgx/0001-Revert-OMAP-DSS2-remove-update_mode-from-omapdss-v3.2.patch 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 index 00000000..9f24df03 --- /dev/null +++ b/recipes-kernel/linux/linux-mainline-3.2/sgx/0001-Revert-OMAP-DSS2-remove-update_mode-from-omapdss-v3.2.patch @@ -0,0 +1,321 @@ +From 4fbd1a6149222f1a075182e4d41cf1e2f72345d2 Mon Sep 17 00:00:00 2001 +From: Robert Nelson +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 + diff --git a/recipes-kernel/linux/linux-mainline_3.2.bb b/recipes-kernel/linux/linux-mainline_3.2.bb index efad8d01..dd86bbf7 100644 --- a/recipes-kernel/linux/linux-mainline_3.2.bb +++ b/recipes-kernel/linux/linux-mainline_3.2.bb @@ -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"