diff options
-rw-r--r-- | drivers/video/s3c2410fb.c | 49 |
1 files changed, 29 insertions, 20 deletions
diff --git a/drivers/video/s3c2410fb.c b/drivers/video/s3c2410fb.c index 13b38cbbe4cf..2219ae56a0e6 100644 --- a/drivers/video/s3c2410fb.c +++ b/drivers/video/s3c2410fb.c | |||
@@ -580,6 +580,27 @@ static int s3c2410fb_setcolreg(unsigned regno, | |||
580 | return 0; | 580 | return 0; |
581 | } | 581 | } |
582 | 582 | ||
583 | /* s3c2410fb_lcd_enable | ||
584 | * | ||
585 | * shutdown the lcd controller | ||
586 | */ | ||
587 | static void s3c2410fb_lcd_enable(struct s3c2410fb_info *fbi, int enable) | ||
588 | { | ||
589 | unsigned long flags; | ||
590 | |||
591 | local_irq_save(flags); | ||
592 | |||
593 | if (enable) | ||
594 | fbi->regs.lcdcon1 |= S3C2410_LCDCON1_ENVID; | ||
595 | else | ||
596 | fbi->regs.lcdcon1 &= ~S3C2410_LCDCON1_ENVID; | ||
597 | |||
598 | writel(fbi->regs.lcdcon1, fbi->io + S3C2410_LCDCON1); | ||
599 | |||
600 | local_irq_restore(flags); | ||
601 | } | ||
602 | |||
603 | |||
583 | /* | 604 | /* |
584 | * s3c2410fb_blank | 605 | * s3c2410fb_blank |
585 | * @blank_mode: the blank mode we want. | 606 | * @blank_mode: the blank mode we want. |
@@ -589,9 +610,6 @@ static int s3c2410fb_setcolreg(unsigned regno, | |||
589 | * blanking succeeded, != 0 if un-/blanking failed due to e.g. a | 610 | * blanking succeeded, != 0 if un-/blanking failed due to e.g. a |
590 | * video mode which doesn't support it. Implements VESA suspend | 611 | * video mode which doesn't support it. Implements VESA suspend |
591 | * and powerdown modes on hardware that supports disabling hsync/vsync: | 612 | * and powerdown modes on hardware that supports disabling hsync/vsync: |
592 | * blank_mode == 2: suspend vsync | ||
593 | * blank_mode == 3: suspend hsync | ||
594 | * blank_mode == 4: powerdown | ||
595 | * | 613 | * |
596 | * Returns negative errno on error, or zero on success. | 614 | * Returns negative errno on error, or zero on success. |
597 | * | 615 | * |
@@ -605,6 +623,12 @@ static int s3c2410fb_blank(int blank_mode, struct fb_info *info) | |||
605 | 623 | ||
606 | tpal_reg += is_s3c2412(fbi) ? S3C2412_TPAL : S3C2410_TPAL; | 624 | tpal_reg += is_s3c2412(fbi) ? S3C2412_TPAL : S3C2410_TPAL; |
607 | 625 | ||
626 | if (blank_mode == FB_BLANK_POWERDOWN) { | ||
627 | s3c2410fb_lcd_enable(fbi, 0); | ||
628 | } else { | ||
629 | s3c2410fb_lcd_enable(fbi, 1); | ||
630 | } | ||
631 | |||
608 | if (blank_mode == FB_BLANK_UNBLANK) | 632 | if (blank_mode == FB_BLANK_UNBLANK) |
609 | writel(0x0, tpal_reg); | 633 | writel(0x0, tpal_reg); |
610 | else { | 634 | else { |
@@ -983,21 +1007,6 @@ static int __init s3c2412fb_probe(struct platform_device *pdev) | |||
983 | return s3c24xxfb_probe(pdev, DRV_S3C2412); | 1007 | return s3c24xxfb_probe(pdev, DRV_S3C2412); |
984 | } | 1008 | } |
985 | 1009 | ||
986 | /* s3c2410fb_stop_lcd | ||
987 | * | ||
988 | * shutdown the lcd controller | ||
989 | */ | ||
990 | static void s3c2410fb_stop_lcd(struct s3c2410fb_info *fbi) | ||
991 | { | ||
992 | unsigned long flags; | ||
993 | |||
994 | local_irq_save(flags); | ||
995 | |||
996 | fbi->regs.lcdcon1 &= ~S3C2410_LCDCON1_ENVID; | ||
997 | writel(fbi->regs.lcdcon1, fbi->io + S3C2410_LCDCON1); | ||
998 | |||
999 | local_irq_restore(flags); | ||
1000 | } | ||
1001 | 1010 | ||
1002 | /* | 1011 | /* |
1003 | * Cleanup | 1012 | * Cleanup |
@@ -1010,7 +1019,7 @@ static int s3c2410fb_remove(struct platform_device *pdev) | |||
1010 | 1019 | ||
1011 | unregister_framebuffer(fbinfo); | 1020 | unregister_framebuffer(fbinfo); |
1012 | 1021 | ||
1013 | s3c2410fb_stop_lcd(info); | 1022 | s3c2410fb_lcd_enable(info, 0); |
1014 | msleep(1); | 1023 | msleep(1); |
1015 | 1024 | ||
1016 | s3c2410fb_unmap_video_memory(fbinfo); | 1025 | s3c2410fb_unmap_video_memory(fbinfo); |
@@ -1043,7 +1052,7 @@ static int s3c2410fb_suspend(struct platform_device *dev, pm_message_t state) | |||
1043 | struct fb_info *fbinfo = platform_get_drvdata(dev); | 1052 | struct fb_info *fbinfo = platform_get_drvdata(dev); |
1044 | struct s3c2410fb_info *info = fbinfo->par; | 1053 | struct s3c2410fb_info *info = fbinfo->par; |
1045 | 1054 | ||
1046 | s3c2410fb_stop_lcd(info); | 1055 | s3c2410fb_lcd_enable(info, 0); |
1047 | 1056 | ||
1048 | /* sleep before disabling the clock, we need to ensure | 1057 | /* sleep before disabling the clock, we need to ensure |
1049 | * the LCD DMA engine is not going to get back on the bus | 1058 | * the LCD DMA engine is not going to get back on the bus |