From 42ccd0e97de84afc1f00dfeec3504a9c55518798 Mon Sep 17 00:00:00 2001 From: Tomi Valkeinen 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(+) diff --git a/drivers/video/omap2/dss/dispc.c b/drivers/video/omap2/dss/dispc.c index ae7be3d680c0..16c68b82b336 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 66ac6eadeb52..50af9259ebea 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 0be42b61bde8..d0917a8833ec 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); -- 2.39.2