summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorDanny Nold <dannynold@freescale.com>2011-05-31 12:45:12 -0500
committerDanny Nold <dannynold@freescale.com>2011-06-09 10:04:07 -0500
commite3018c551a5ac1c2356c5c8b2c7a187a014336dc (patch)
treeefc8eb1ee0e65268e1998869b0c7759418aa8080 /drivers
parent1aac0082fbaee9f90619c60894a17665f76d8596 (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>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/video/mxc/mxc_epdc_fb.c9
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 */