diff options
Diffstat (limited to 'drivers/video/atmel_lcdfb.c')
-rw-r--r-- | drivers/video/atmel_lcdfb.c | 32 |
1 files changed, 31 insertions, 1 deletions
diff --git a/drivers/video/atmel_lcdfb.c b/drivers/video/atmel_lcdfb.c index bac163450216..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 | ||
@@ -127,6 +127,7 @@ static void init_backlight(struct atmel_lcdfb_info *sinfo) | |||
127 | return; | 127 | return; |
128 | 128 | ||
129 | memset(&props, 0, sizeof(struct backlight_properties)); | 129 | memset(&props, 0, sizeof(struct backlight_properties)); |
130 | props.type = BACKLIGHT_RAW; | ||
130 | props.max_brightness = 0xff; | 131 | props.max_brightness = 0xff; |
131 | bl = backlight_device_register("backlight", &sinfo->pdev->dev, sinfo, | 132 | bl = backlight_device_register("backlight", &sinfo->pdev->dev, sinfo, |
132 | &atmel_lcdc_bl_ops, &props); | 133 | &atmel_lcdc_bl_ops, &props); |
@@ -163,6 +164,10 @@ static void exit_backlight(struct atmel_lcdfb_info *sinfo) | |||
163 | 164 | ||
164 | static void init_contrast(struct atmel_lcdfb_info *sinfo) | 165 | static void init_contrast(struct atmel_lcdfb_info *sinfo) |
165 | { | 166 | { |
167 | /* contrast pwm can be 'inverted' */ | ||
168 | if (sinfo->lcdcon_pol_negative) | ||
169 | contrast_ctr &= ~(ATMEL_LCDC_POL_POSITIVE); | ||
170 | |||
166 | /* have some default contrast/backlight settings */ | 171 | /* have some default contrast/backlight settings */ |
167 | lcdc_writel(sinfo, ATMEL_LCDC_CONTRAST_CTR, contrast_ctr); | 172 | lcdc_writel(sinfo, ATMEL_LCDC_CONTRAST_CTR, contrast_ctr); |
168 | lcdc_writel(sinfo, ATMEL_LCDC_CONTRAST_VAL, ATMEL_LCDC_CVAL_DEFAULT); | 173 | lcdc_writel(sinfo, ATMEL_LCDC_CONTRAST_VAL, ATMEL_LCDC_CVAL_DEFAULT); |
@@ -710,11 +715,35 @@ static int atmel_lcdfb_pan_display(struct fb_var_screeninfo *var, | |||
710 | return 0; | 715 | return 0; |
711 | } | 716 | } |
712 | 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 | |||
713 | static struct fb_ops atmel_lcdfb_ops = { | 741 | static struct fb_ops atmel_lcdfb_ops = { |
714 | .owner = THIS_MODULE, | 742 | .owner = THIS_MODULE, |
715 | .fb_check_var = atmel_lcdfb_check_var, | 743 | .fb_check_var = atmel_lcdfb_check_var, |
716 | .fb_set_par = atmel_lcdfb_set_par, | 744 | .fb_set_par = atmel_lcdfb_set_par, |
717 | .fb_setcolreg = atmel_lcdfb_setcolreg, | 745 | .fb_setcolreg = atmel_lcdfb_setcolreg, |
746 | .fb_blank = atmel_lcdfb_blank, | ||
718 | .fb_pan_display = atmel_lcdfb_pan_display, | 747 | .fb_pan_display = atmel_lcdfb_pan_display, |
719 | .fb_fillrect = cfb_fillrect, | 748 | .fb_fillrect = cfb_fillrect, |
720 | .fb_copyarea = cfb_copyarea, | 749 | .fb_copyarea = cfb_copyarea, |
@@ -816,6 +845,7 @@ static int __init atmel_lcdfb_probe(struct platform_device *pdev) | |||
816 | sinfo->guard_time = pdata_sinfo->guard_time; | 845 | sinfo->guard_time = pdata_sinfo->guard_time; |
817 | sinfo->smem_len = pdata_sinfo->smem_len; | 846 | sinfo->smem_len = pdata_sinfo->smem_len; |
818 | 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; | ||
819 | sinfo->lcd_wiring_mode = pdata_sinfo->lcd_wiring_mode; | 849 | sinfo->lcd_wiring_mode = pdata_sinfo->lcd_wiring_mode; |
820 | } else { | 850 | } else { |
821 | dev_err(dev, "cannot get default configuration\n"); | 851 | dev_err(dev, "cannot get default configuration\n"); |