mirror of
https://git.yoctoproject.org/meta-ti
synced 2026-07-17 06:48:07 +00:00
368d7772dc
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>
322 lines
9.6 KiB
Diff
322 lines
9.6 KiB
Diff
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
|
|
|