From: Patil, Rachna Date: Fri, 9 Mar 2012 12:45:37 +0000 (+0530) Subject: video: da8xx-fb: correct suspend/resume sequence X-Git-Url: https://git.ti.com/gitweb?p=sitara-epos%2Fsitara-epos-kernel.git;a=commitdiff_plain;h=08657ec35fa3bcb30392a1b284e577ae77a311c8;hp=c853ee2925ccae9ec482acd1d181b8f620e8d6e9 video: da8xx-fb: correct suspend/resume sequence 1. correct suspend/resume sequence for LCD. 2. add msleep in suspend/resume, to allow LCD to finish transmitting all the frames. 3. remove enabling/disabling of clocks in interrupt handler. This sequence was wrong. Trying to disable clocks and write to a register was wrong. 4. correct LCD context save sequence Signed-off-by: Patil, Rachna --- diff --git a/drivers/video/da8xx-fb.c b/drivers/video/da8xx-fb.c index c5ee62113323..5736a3ec107e 100644 --- a/drivers/video/da8xx-fb.c +++ b/drivers/video/da8xx-fb.c @@ -322,10 +322,6 @@ static inline void lcd_disable_raster(bool wait_for_frame_done) printk(KERN_ERR "LCD Controller timed out\n"); return; } - - if (lcd_revision == LCD_VERSION_2) - /* Write 1 to reset LCDC */ - lcdc_write(LCD_CLK_MAIN_RESET, LCD_CLK_RESET_REG); } static void lcd_blit(int load_mode, struct da8xx_fb_par *par) @@ -805,10 +801,8 @@ static irqreturn_t lcdc_irq_handler_rev02(int irq, void *arg) if ((stat & LCD_SYNC_LOST) && (stat & LCD_FIFO_UNDERFLOW)) { printk(KERN_ERR "LCDC sync lost or underflow error occured\n"); lcd_disable_raster(NO_WAIT_FOR_FRAME_DONE); - pm_runtime_put_sync(dev); lcdc_write(stat, LCD_MASKED_STAT_REG); lcd_enable_raster(); - pm_runtime_get_sync(dev); } else if (stat & LCD_PL_LOAD_DONE) { /* * Must disable raster before changing state of any control bit. @@ -1517,7 +1511,8 @@ static void lcd_context_save(void) lcdc_read(LCD_DMA_FRM_BUF_BASE_ADDR_1_REG); reg_context.dma_frm_buf_ceiling_addr_1 = lcdc_read(LCD_DMA_FRM_BUF_CEILING_ADDR_1_REG); - reg_context.raster_ctrl = lcdc_read(LCD_RASTER_CTRL_REG); + reg_context.raster_ctrl = lcdc_read(LCD_RASTER_CTRL_REG) & + ~LCD_RASTER_ENABLE; return; } @@ -1552,10 +1547,11 @@ static int fb_suspend(struct platform_device *dev, pm_message_t state) par->panel_power_ctrl(0); fb_set_suspend(info, 1); - lcd_disable_raster(WAIT_FOR_FRAME_DONE); lcd_context_save(); + lcd_disable_raster(WAIT_FOR_FRAME_DONE); + msleep(10); - pm_runtime_put_sync(&dev->dev); + pm_runtime_put(&dev->dev); console_unlock(); return 0; @@ -1566,11 +1562,15 @@ static int fb_resume(struct platform_device *dev) struct da8xx_fb_par *par = info->par; console_lock(); - if (par->panel_power_ctrl) - par->panel_power_ctrl(1); pm_runtime_get_sync(&dev->dev); + msleep(1); + lcdc_write(LCD_CLK_MAIN_RESET, LCD_CLK_RESET_REG); + msleep(10); + lcdc_write(0, LCD_CLK_RESET_REG); + msleep(1); + lcd_context_restore(); lcd_enable_raster();