diff options
Diffstat (limited to 'drivers/video/atmel_lcdfb.c')
-rw-r--r-- | drivers/video/atmel_lcdfb.c | 31 |
1 files changed, 30 insertions, 1 deletions
diff --git a/drivers/video/atmel_lcdfb.c b/drivers/video/atmel_lcdfb.c index 4b4e8dadd6b2..ccecf9974587 100644 --- a/drivers/video/atmel_lcdfb.c +++ b/drivers/video/atmel_lcdfb.c | |||
@@ -68,7 +68,7 @@ static void atmel_lcdfb_update_dma2d(struct atmel_lcdfb_info *sinfo, | |||
68 | } | 68 | } |
69 | #endif | 69 | #endif |
70 | 70 | ||
71 | static const u32 contrast_ctr = ATMEL_LCDC_PS_DIV8 | 71 | static u32 contrast_ctr = ATMEL_LCDC_PS_DIV8 |
72 | | ATMEL_LCDC_POL_POSITIVE | 72 | | ATMEL_LCDC_POL_POSITIVE |
73 | | ATMEL_LCDC_ENA_PWMENABLE; | 73 | | ATMEL_LCDC_ENA_PWMENABLE; |
74 | 74 | ||
@@ -164,6 +164,10 @@ static void exit_backlight(struct atmel_lcdfb_info *sinfo) | |||
164 | 164 | ||
165 | static void init_contrast(struct atmel_lcdfb_info *sinfo) | 165 | static void init_contrast(struct atmel_lcdfb_info *sinfo) |
166 | { | 166 | { |
167 | /* contrast pwm can be 'inverted' */ | ||
168 | if (sinfo->lcdcon_pol_negative) | ||
169 | contrast_ctr &= ~(ATMEL_LCDC_POL_POSITIVE); | ||
170 | |||
167 | /* have some default contrast/backlight settings */ | 171 | /* have some default contrast/backlight settings */ |
168 | lcdc_writel(sinfo, ATMEL_LCDC_CONTRAST_CTR, contrast_ctr); | 172 | lcdc_writel(sinfo, ATMEL_LCDC_CONTRAST_CTR, contrast_ctr); |
169 | lcdc_writel(sinfo, ATMEL_LCDC_CONTRAST_VAL, ATMEL_LCDC_CVAL_DEFAULT); | 173 | lcdc_writel(sinfo, ATMEL_LCDC_CONTRAST_VAL, ATMEL_LCDC_CVAL_DEFAULT); |
@@ -711,11 +715,35 @@ static int atmel_lcdfb_pan_display(struct fb_var_screeninfo *var, | |||
711 | return 0; | 715 | return 0; |
712 | } | 716 | } |
713 | 717 | ||
718 | static int atmel_lcdfb_blank(int blank_mode, struct fb_info *info) | ||
719 | { | ||
720 | struct atmel_lcdfb_info *sinfo = info->par; | ||
721 | |||
722 | switch (blank_mode) { | ||
723 | case FB_BLANK_UNBLANK: | ||
724 | case FB_BLANK_NORMAL: | ||
725 | atmel_lcdfb_start(sinfo); | ||
726 | break; | ||
727 | case FB_BLANK_VSYNC_SUSPEND: | ||
728 | case FB_BLANK_HSYNC_SUSPEND: | ||
729 | break; | ||
730 | case FB_BLANK_POWERDOWN: | ||
731 | atmel_lcdfb_stop(sinfo); | ||
732 | break; | ||
733 | default: | ||
734 | return -EINVAL; | ||
735 | } | ||
736 | |||
737 | /* let fbcon do a soft blank for us */ | ||
738 | return ((blank_mode == FB_BLANK_NORMAL) ? 1 : 0); | ||
739 | } | ||
740 | |||
714 | static struct fb_ops atmel_lcdfb_ops = { | 741 | static struct fb_ops atmel_lcdfb_ops = { |
715 | .owner = THIS_MODULE, | 742 | .owner = THIS_MODULE, |
716 | .fb_check_var = atmel_lcdfb_check_var, | 743 | .fb_check_var = atmel_lcdfb_check_var, |
717 | .fb_set_par = atmel_lcdfb_set_par, | 744 | .fb_set_par = atmel_lcdfb_set_par, |
718 | .fb_setcolreg = atmel_lcdfb_setcolreg, | 745 | .fb_setcolreg = atmel_lcdfb_setcolreg, |
746 | .fb_blank = atmel_lcdfb_blank, | ||
719 | .fb_pan_display = atmel_lcdfb_pan_display, | 747 | .fb_pan_display = atmel_lcdfb_pan_display, |
720 | .fb_fillrect = cfb_fillrect, | 748 | .fb_fillrect = cfb_fillrect, |
721 | .fb_copyarea = cfb_copyarea, | 749 | .fb_copyarea = cfb_copyarea, |
@@ -817,6 +845,7 @@ static int __init atmel_lcdfb_probe(struct platform_device *pdev) | |||
817 | sinfo->guard_time = pdata_sinfo->guard_time; | 845 | sinfo->guard_time = pdata_sinfo->guard_time; |
818 | sinfo->smem_len = pdata_sinfo->smem_len; | 846 | sinfo->smem_len = pdata_sinfo->smem_len; |
819 | sinfo->lcdcon_is_backlight = pdata_sinfo->lcdcon_is_backlight; | 847 | sinfo->lcdcon_is_backlight = pdata_sinfo->lcdcon_is_backlight; |
848 | sinfo->lcdcon_pol_negative = pdata_sinfo->lcdcon_pol_negative; | ||
820 | sinfo->lcd_wiring_mode = pdata_sinfo->lcd_wiring_mode; | 849 | sinfo->lcd_wiring_mode = pdata_sinfo->lcd_wiring_mode; |
821 | } else { | 850 | } else { |
822 | dev_err(dev, "cannot get default configuration\n"); | 851 | dev_err(dev, "cannot get default configuration\n"); |