79 lines
2.4 KiB
Diff
79 lines
2.4 KiB
Diff
From a1e8018c0806a1a0579eda4b93b7d6764a2ff643 Mon Sep 17 00:00:00 2001
|
|
From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
|
|
Date: Wed, 15 Apr 2009 14:06:54 +0300
|
|
Subject: [PATCH] DSS2: DSI: sidlemode to noidle while sending frame
|
|
|
|
DISPC interrupts are not wake-up capable. Smart-idle in DISPC_SIDLEMODE
|
|
causes DSS interface to go to idle at the end of the frame, and the
|
|
FRAMEDONE interrupt is then delayed until something wakes up the DSS
|
|
interface.
|
|
|
|
So we set SIDLEMODE to no-idle when we start sending the frame, and
|
|
set it back to smart-idle after receiving FRAMEDONE.
|
|
---
|
|
drivers/video/omap2/dss/dispc.c | 10 ++++++++++
|
|
drivers/video/omap2/dss/dsi.c | 4 ++++
|
|
drivers/video/omap2/dss/dss.h | 3 +++
|
|
3 files changed, 17 insertions(+), 0 deletions(-)
|
|
|
|
diff --git a/drivers/video/omap2/dss/dispc.c b/drivers/video/omap2/dss/dispc.c
|
|
index ae7be3d..16c68b8 100644
|
|
--- a/drivers/video/omap2/dss/dispc.c
|
|
+++ b/drivers/video/omap2/dss/dispc.c
|
|
@@ -2791,6 +2791,16 @@ static void _omap_dispc_initialize_irq(void)
|
|
omap_dispc_set_irqs();
|
|
}
|
|
|
|
+void dispc_enable_sidle(void)
|
|
+{
|
|
+ REG_FLD_MOD(DISPC_SYSCONFIG, 2, 4, 3); /* SIDLEMODE: smart idle */
|
|
+}
|
|
+
|
|
+void dispc_disable_sidle(void)
|
|
+{
|
|
+ REG_FLD_MOD(DISPC_SYSCONFIG, 1, 4, 3); /* SIDLEMODE: no idle */
|
|
+}
|
|
+
|
|
static void _omap_dispc_initial_config(void)
|
|
{
|
|
u32 l;
|
|
diff --git a/drivers/video/omap2/dss/dsi.c b/drivers/video/omap2/dss/dsi.c
|
|
index 66ac6ea..50af925 100644
|
|
--- a/drivers/video/omap2/dss/dsi.c
|
|
+++ b/drivers/video/omap2/dss/dsi.c
|
|
@@ -2665,6 +2665,8 @@ static void dsi_update_screen_dispc(struct omap_display *display,
|
|
l = FLD_MOD(l, 1, 31, 31); /* TE_START */
|
|
dsi_write_reg(DSI_VC_TE(1), l);
|
|
|
|
+ dispc_disable_sidle();
|
|
+
|
|
dispc_enable_lcd_out(1);
|
|
|
|
if (dsi.use_te)
|
|
@@ -2678,6 +2680,8 @@ static void framedone_callback(void *data, u32 mask)
|
|
return;
|
|
}
|
|
|
|
+ dispc_enable_sidle();
|
|
+
|
|
dsi.framedone_scheduled = 1;
|
|
|
|
/* We get FRAMEDONE when DISPC has finished sending pixels and turns
|
|
diff --git a/drivers/video/omap2/dss/dss.h b/drivers/video/omap2/dss/dss.h
|
|
index 0be42b6..d0917a8 100644
|
|
--- a/drivers/video/omap2/dss/dss.h
|
|
+++ b/drivers/video/omap2/dss/dss.h
|
|
@@ -244,6 +244,9 @@ void dispc_fake_vsync_irq(void);
|
|
void dispc_save_context(void);
|
|
void dispc_restore_context(void);
|
|
|
|
+void dispc_enable_sidle(void);
|
|
+void dispc_disable_sidle(void);
|
|
+
|
|
void dispc_lcd_enable_signal_polarity(bool act_high);
|
|
void dispc_lcd_enable_signal(bool enable);
|
|
void dispc_pck_free_enable(bool enable);
|
|
--
|
|
1.5.6.5
|
|
|