]> code.ossystems Code Review - openembedded-core.git/blob
6ee3908d1012bf1249ad527f6e8b7d9a1cf6afaa
[openembedded-core.git] /
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
5
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
9 interface.
10
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.
13 ---
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(-)
18
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();
25  }
26  
27 +void dispc_enable_sidle(void)
28 +{
29 +       REG_FLD_MOD(DISPC_SYSCONFIG, 2, 4, 3);  /* SIDLEMODE: smart idle */
30 +}
31 +
32 +void dispc_disable_sidle(void)
33 +{
34 +       REG_FLD_MOD(DISPC_SYSCONFIG, 1, 4, 3);  /* SIDLEMODE: no idle */
35 +}
36 +
37  static void _omap_dispc_initial_config(void)
38  {
39         u32 l;
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);
47  
48 +       dispc_disable_sidle();
49 +
50         dispc_enable_lcd_out(1);
51  
52         if (dsi.use_te)
53 @@ -2678,6 +2680,8 @@ static void framedone_callback(void *data, u32 mask)
54                 return;
55         }
56  
57 +       dispc_enable_sidle();
58 +
59         dsi.framedone_scheduled = 1;
60  
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);
69  
70 +void dispc_enable_sidle(void);
71 +void dispc_disable_sidle(void);
72 +
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);
76 -- 
77 1.5.6.5
78