lxfb: fix console blanking
authorJordan Crouse <jordan.crouse@amd.com>
Thu, 24 Jul 2008 04:31:43 +0000 (21:31 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 24 Jul 2008 17:47:40 +0000 (10:47 -0700)
Simply enabling DAC blanking without turning off the CRT seems to be resulting
in characters remaining on the screen when the monitor blanks.  This patch
turns off the CRT for all modes, and also powers down the DACs when vsync
and/or hsync are disabled.

Signed-off-by: Jordan Crouse <jordan.crouse@amd.com>
Acked-by: Andres Salomon <dilinger@debian.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
drivers/video/geode/lxfb_ops.c

index aaef9165ec9bf09f8dcb00dc71a61b29b47a647f..b1cd49c9935618a6af9db4602021f41e8aaf23d4 100644 (file)
@@ -517,25 +517,25 @@ void lx_set_palette_reg(struct fb_info *info, unsigned regno,
 int lx_blank_display(struct fb_info *info, int blank_mode)
 {
        struct lxfb_par *par = info->par;
-       u32 dcfg, fp_pm;
-       int blank, hsync, vsync, crt;
+       u32 dcfg, misc, fp_pm;
+       int blank, hsync, vsync;
 
        /* CRT power saving modes. */
        switch (blank_mode) {
        case FB_BLANK_UNBLANK:
-               blank = 0; hsync = 1; vsync = 1; crt = 1;
+               blank = 0; hsync = 1; vsync = 1;
                break;
        case FB_BLANK_NORMAL:
-               blank = 1; hsync = 1; vsync = 1; crt = 1;
+               blank = 1; hsync = 1; vsync = 1;
                break;
        case FB_BLANK_VSYNC_SUSPEND:
-               blank = 1; hsync = 1; vsync = 0; crt = 1;
+               blank = 1; hsync = 1; vsync = 0;
                break;
        case FB_BLANK_HSYNC_SUSPEND:
-               blank = 1; hsync = 0; vsync = 1; crt = 1;
+               blank = 1; hsync = 0; vsync = 1;
                break;
        case FB_BLANK_POWERDOWN:
-               blank = 1; hsync = 0; vsync = 0; crt = 0;
+               blank = 1; hsync = 0; vsync = 0;
                break;
        default:
                return -EINVAL;
@@ -545,15 +545,23 @@ int lx_blank_display(struct fb_info *info, int blank_mode)
        dcfg &= ~(VP_DCFG_DAC_BL_EN | VP_DCFG_HSYNC_EN | VP_DCFG_VSYNC_EN |
                        VP_DCFG_CRT_EN);
        if (!blank)
-               dcfg |= VP_DCFG_DAC_BL_EN;
+               dcfg |= VP_DCFG_DAC_BL_EN | VP_DCFG_CRT_EN;
        if (hsync)
                dcfg |= VP_DCFG_HSYNC_EN;
        if (vsync)
                dcfg |= VP_DCFG_VSYNC_EN;
-       if (crt)
-               dcfg |= VP_DCFG_CRT_EN;
+
        write_vp(par, VP_DCFG, dcfg);
 
+       misc = read_vp(par, VP_MISC);
+
+       if (vsync && hsync)
+               misc &= ~VP_MISC_DACPWRDN;
+       else
+               misc |= VP_MISC_DACPWRDN;
+
+       write_vp(par, VP_MISC, misc);
+
        /* Power on/off flat panel */
 
        if (par->output & OUTPUT_PANEL) {