1 From a1e8018c0806a1a0579eda4b93b7d6764a2ff643 Mon Sep 17 00:00:00 2001
2 From: Tomi Valkeinen <tomi.valkeinen@nokia.com>
3 Date: Wed, 15 Apr 2009 14:06:54 +0300
4 Subject: [PATCH] DSS2: DSI: sidlemode to noidle while sending frame
6 DISPC interrupts are not wake-up capable. Smart-idle in DISPC_SIDLEMODE
7 causes DSS interface to go to idle at the end of the frame, and the
8 FRAMEDONE interrupt is then delayed until something wakes up the DSS
11 So we set SIDLEMODE to no-idle when we start sending the frame, and
12 set it back to smart-idle after receiving FRAMEDONE.
14 drivers/video/omap2/dss/dispc.c | 10 ++++++++++
15 drivers/video/omap2/dss/dsi.c | 4 ++++
16 drivers/video/omap2/dss/dss.h | 3 +++
17 3 files changed, 17 insertions(+), 0 deletions(-)
19 diff --git a/drivers/video/omap2/dss/dispc.c b/drivers/video/omap2/dss/dispc.c
20 index ae7be3d..16c68b8 100644
21 --- a/drivers/video/omap2/dss/dispc.c
22 +++ b/drivers/video/omap2/dss/dispc.c
23 @@ -2791,6 +2791,16 @@ static void _omap_dispc_initialize_irq(void)
24 omap_dispc_set_irqs();
27 +void dispc_enable_sidle(void)
29 + REG_FLD_MOD(DISPC_SYSCONFIG, 2, 4, 3); /* SIDLEMODE: smart idle */
32 +void dispc_disable_sidle(void)
34 + REG_FLD_MOD(DISPC_SYSCONFIG, 1, 4, 3); /* SIDLEMODE: no idle */
37 static void _omap_dispc_initial_config(void)
40 diff --git a/drivers/video/omap2/dss/dsi.c b/drivers/video/omap2/dss/dsi.c
41 index 66ac6ea..50af925 100644
42 --- a/drivers/video/omap2/dss/dsi.c
43 +++ b/drivers/video/omap2/dss/dsi.c
44 @@ -2665,6 +2665,8 @@ static void dsi_update_screen_dispc(struct omap_display *display,
45 l = FLD_MOD(l, 1, 31, 31); /* TE_START */
46 dsi_write_reg(DSI_VC_TE(1), l);
48 + dispc_disable_sidle();
50 dispc_enable_lcd_out(1);
53 @@ -2678,6 +2680,8 @@ static void framedone_callback(void *data, u32 mask)
57 + dispc_enable_sidle();
59 dsi.framedone_scheduled = 1;
61 /* We get FRAMEDONE when DISPC has finished sending pixels and turns
62 diff --git a/drivers/video/omap2/dss/dss.h b/drivers/video/omap2/dss/dss.h
63 index 0be42b6..d0917a8 100644
64 --- a/drivers/video/omap2/dss/dss.h
65 +++ b/drivers/video/omap2/dss/dss.h
66 @@ -244,6 +244,9 @@ void dispc_fake_vsync_irq(void);
67 void dispc_save_context(void);
68 void dispc_restore_context(void);
70 +void dispc_enable_sidle(void);
71 +void dispc_disable_sidle(void);
73 void dispc_lcd_enable_signal_polarity(bool act_high);
74 void dispc_lcd_enable_signal(bool enable);
75 void dispc_pck_free_enable(bool enable);