diff options
author | Danny Nold <dannynold@freescale.com> | 2011-05-31 12:45:12 -0500 |
---|---|---|
committer | Jason Liu <r64343@freescale.com> | 2012-01-09 20:08:44 +0800 |
commit | 17f29784979654a7af0f3f193b3f4fadfc88c9a8 (patch) | |
tree | 68fd03277d0d1eeec527dca2dfadfd3d04a2f643 | |
parent | a60958ebc568b1abee2ec15ed72f4b305d400fe6 (diff) |
ENGR00142098 - EPDC fb: Fix slow mode transitions when powerdown delay disabled
- When the powerdown delay is set to FB_POWERDOWN_DISABLE, the
mxc_epdc_fb_flush_updates() function does not execute correctly, always
resulting in a time out while waiting to receive a completion that signals
that all updates have completed. This causes long delays when changing the FB
mode, since a mode change will always result in a call to
mxc_epdc_fb_flush_updates().
Fixed this bug by creating a new mxc_epdc_fb_data variable to track whether
all active updates have completed. mxc_epdc_fb_flush_updates() now
keys off of this variable to determine whether to wait for all
active updates to complete.
Signed-off-by: Danny Nold <dannynold@freescale.com>
-rw-r--r-- | drivers/video/mxc/mxc_epdc_fb.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/drivers/video/mxc/mxc_epdc_fb.c b/drivers/video/mxc/mxc_epdc_fb.c index 5866ef866b05..39e442d9c8b3 100644 --- a/drivers/video/mxc/mxc_epdc_fb.c +++ b/drivers/video/mxc/mxc_epdc_fb.c @@ -178,6 +178,7 @@ struct mxc_epdc_fb_data { int eof_sync_period; struct mutex power_mutex; bool powering_down; + bool updates_active; int pwrdown_delay; unsigned long tce_prevent; @@ -861,6 +862,8 @@ static void epdc_powerup(struct mxc_epdc_fb_data *fb_data) dev_dbg(fb_data->dev, "EPDC Powerup\n"); + fb_data->updates_active = true; + /* Enable pins used by EPDC */ if (fb_data->pdata->enable_pins) fb_data->pdata->enable_pins(); @@ -2694,8 +2697,7 @@ void mxc_epdc_fb_flush_updates(struct mxc_epdc_fb_data *fb_data) */ if (!list_empty(&fb_data->upd_pending_list) || !is_free_list_full(fb_data) || - ((fb_data->power_state == POWER_STATE_ON) && - !fb_data->powering_down)) { + (fb_data->updates_active == true)) { /* Initialize event signalling updates are done */ init_completion(&fb_data->updates_done); fb_data->waiting_for_idle = true; @@ -2985,6 +2987,8 @@ static irqreturn_t mxc_epdc_irq_handler(int irq, void *dev_id) (fb_data->cur_update == NULL) && !epdc_luts_active) { + fb_data->updates_active = false; + if (fb_data->pwrdown_delay != FB_POWERDOWN_DISABLE) { /* * Set variable to prevent overlapping @@ -3949,6 +3953,7 @@ int __devinit mxc_epdc_fb_probe(struct platform_device *pdev) fb_data->power_state = POWER_STATE_OFF; fb_data->powering_down = false; fb_data->wait_for_powerdown = false; + fb_data->updates_active = false; fb_data->pwrdown_delay = 0; /* Register FB */ |