video: s3c-fb: add shadow register protect
authorJingoo Han <jg1.han@samsung.com>
Thu, 8 Dec 2011 09:08:00 +0000 (18:08 +0900)
committerFlorian Tobias Schandinat <FlorianSchandinat@gmx.de>
Mon, 19 Dec 2011 20:06:24 +0000 (20:06 +0000)
Shadow registers should be protectd whenever the registers are
updated. Shadow registers are updated after SHADOWCON shadow
register is cleared.

Signed-off-by: Jingoo Han <jg1.han@samsung.com>
Signed-off-by: Florian Tobias Schandinat <FlorianSchandinat@gmx.de>
drivers/video/s3c-fb.c

index 25a5c7665855dd15c0e44df3a7dda016cca9fc41..a0b3fd670f7133fa48ad0ff60660e198b4b28b72 100644 (file)
@@ -812,12 +812,16 @@ static int s3c_fb_blank(int blank_mode, struct fb_info *info)
 
        case FB_BLANK_NORMAL:
                /* disable the DMA and display 0x0 (black) */
+               shadow_protect_win(win, 1);
                writel(WINxMAP_MAP | WINxMAP_MAP_COLOUR(0x0),
                       sfb->regs + sfb->variant.winmap + (index * 4));
+               shadow_protect_win(win, 0);
                break;
 
        case FB_BLANK_UNBLANK:
+               shadow_protect_win(win, 1);
                writel(0x0, sfb->regs + sfb->variant.winmap + (index * 4));
+               shadow_protect_win(win, 0);
                wincon |= WINCONx_ENWIN;
                sfb->enabled |= (1 << index);
                break;
@@ -828,7 +832,9 @@ static int s3c_fb_blank(int blank_mode, struct fb_info *info)
                return 1;
        }
 
+       shadow_protect_win(win, 1);
        writel(wincon, sfb->regs + sfb->variant.wincon + (index * 4));
+       shadow_protect_win(win, 0);
 
        /* Check the enabled state to see if we need to be running the
         * main LCD interface, as if there are no active windows then
@@ -847,8 +853,11 @@ static int s3c_fb_blank(int blank_mode, struct fb_info *info)
        /* we're stuck with this until we can do something about overriding
         * the power control using the blanking event for a single fb.
         */
-       if (index == sfb->pdata->default_win)
+       if (index == sfb->pdata->default_win) {
+               shadow_protect_win(win, 1);
                s3c_fb_enable(sfb, blank_mode != FB_BLANK_POWERDOWN ? 1 : 0);
+               shadow_protect_win(win, 0);
+       }
 
        return 0;
 }
@@ -1551,10 +1560,15 @@ static int s3c_fb_resume(struct device *dev)
 
        for (win_no = 0; win_no < sfb->variant.nr_windows - 1; win_no++) {
                void __iomem *regs = sfb->regs + sfb->variant.keycon;
+               win = sfb->windows[win_no];
+               if (!win)
+                       continue;
 
+               shadow_protect_win(win, 1);
                regs += (win_no * 8);
                writel(0xffffff, regs + WKEYCON0);
                writel(0xffffff, regs + WKEYCON1);
+               shadow_protect_win(win, 0);
        }
 
        /* restore framebuffers */