sm501fb: update suspend and resume code
PATCH 24/33 sm501fb: update suspend and resume code
From: Ben Dooks <[email protected]>
The suspend and resume code is failing to restore the CRT control register, thus causing the CRT data-path to get changed if the SM501 experiences a reset over suspend.
Also move some of the debug messages to dev_dbg() level and ensure that the suspend code does not try and restore anything it did not manage to save.
Signed-off-by Ben Dooks <[email protected]>
Signed-off-by Antonino Daplas <[email protected]>
---
drivers/video/sm501fb.c | 35 +++++++++++++++++++++++++++++++---- 1 files changed, 31 insertions(+), 4 deletions(-)
drivers/video/sm501fb.c +31 -4
@@ -62,6 +62,8 @@ struct sm501fb_info {struct resource *regs_res;/* registers resource */ struct sm501_platdata_fb *pdata;/* our platform data */ +unsigned long pm_crt_ctrl;/* pm: crt ctrl save */ +int irq;int swap_endian;/* set to swap rgb=>bgr */ void __iomem *regs;/* remapped registers */
@@ -1687,9 +1689,11 @@ static int sm501fb_suspend_fb(struct sm5 goto err_nocursor; } +dev_dbg (info->dev,"suspending screen to %p\n" , par->store_fb); +dev_dbg (info->dev,"suspending cursor to %p\n" , par->store_cursor); +memcpy_fromio (par->store_fb, par->screen.k_addr, par->screen.size);memcpy_fromio (par->store_cursor, par->cursor.k_addr, par->cursor.size); -/* blank the relevant interface to ensure unit power minimised */ (par->ops.fb_blank)(FB_BLANK_POWERDOWN , fbi);
@@ -1697,9 +1701,9 @@ static int sm501fb_suspend_fb(struct sm5 err_nocursor:vfree (par->store_fb); + par->store_fb =NULL ;return -ENOMEM ; - } static void sm501fb_resume_fb(struct sm501fb_info *info,
@@ -1717,8 +1721,16 @@ static void sm501fb_resume_fb(struct sm5/* restore the data */ -memcpy_toio (par->screen.k_addr, par->store_fb, par->screen.size); -memcpy_toio (par->cursor.k_addr, par->store_cursor, par->cursor.size); +dev_dbg (info->dev,"restoring screen from %p\n" , par->store_fb); +dev_dbg (info->dev,"restoring cursor from %p\n" , par->store_cursor); + +if (par->store_fb) +memcpy_toio (par->screen.k_addr, par->store_fb, + par->screen.size); + +if (par->store_cursor) +memcpy_toio (par->cursor.k_addr, par->store_cursor, + par->cursor.size);vfree (par->store_fb);vfree (par->store_cursor);
@@ -1731,6 +1743,9 @@ static int sm501fb_suspend(struct platfo {struct sm501fb_info *info =platform_get_drvdata (pdev); +/* store crt control to resume with */ + info->pm_crt_ctrl =readl (info->regs +SM501_DC_CRT_CONTROL ); +sm501fb_suspend_fb (info,HEAD_CRT );sm501fb_suspend_fb (info,HEAD_PANEL );
@@ -1740,12 +1755,24 @@ static int sm501fb_suspend(struct platforeturn 0 ; } +#define SM501_CRT_CTRL_SAVE (SM501_DC_CRT_CONTROL_TVP | \ + SM501_DC_CRT_CONTROL_SEL) + +static int sm501fb_resume (struct platform_device *pdev) {struct sm501fb_info *info =platform_get_drvdata (pdev); +unsigned long crt_ctrl;sm501_unit_power (info->dev->parent,SM501_GATE_DISPLAY ,1 ); +/* restore the items we want to be saved for crt control */ + + crt_ctrl =readl (info->regs +SM501_DC_CRT_CONTROL ); + crt_ctrl &= ~SM501_CRT_CTRL_SAVE ; + crt_ctrl |= info->pm_crt_ctrl &SM501_CRT_CTRL_SAVE ; +writel (crt_ctrl, info->regs +SM501_DC_CRT_CONTROL ); +sm501fb_resume_fb (info,HEAD_CRT );sm501fb_resume_fb (info,HEAD_PANEL );
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop. Now Search log events and configuration files using AJAX and a browser. Download your FREE copy of Splunk now >> http://get.splunk.com/