Merge branch 'master' into for_paulus
[linux-drm-fsl-dcu.git] / drivers / video / au1100fb.c
index a92a91fef16fc303d0aa393c4af607a063e305a2..80a81eccad363aeaf25d21fb805f4972c8bb5fdd 100644 (file)
@@ -8,6 +8,7 @@
  *     <c.pellegrin@exadron.com>
  *
  * PM support added by Rodolfo Giometti <giometti@linux.it>
+ * Cursor enable/disable by Rodolfo Giometti <giometti@linux.it>
  *
  * Copyright 2002 MontaVista Software
  * Author: MontaVista Software, Inc.
@@ -110,6 +111,10 @@ static struct fb_var_screeninfo au1100fb_var __initdata = {
 
 static struct au1100fb_drv_info drv_info;
 
+static int nocursor = 0;
+module_param(nocursor, int, 0644);
+MODULE_PARM_DESC(nocursor, "cursor enable/disable");
+
 /*
  * Set hardware with var settings. This will enable the controller with a specific
  * mode, normally validated with the fb_check_var method
@@ -156,7 +161,7 @@ int au1100fb_setmode(struct au1100fb_device *fbdev)
 
                        info->fix.visual = FB_VISUAL_TRUECOLOR;
                        info->fix.line_length = info->var.xres_virtual << 1; /* depth=16 */
-       }
+               }
        } else {
                /* mono */
                info->fix.visual = FB_VISUAL_MONO10;
@@ -164,20 +169,16 @@ int au1100fb_setmode(struct au1100fb_device *fbdev)
        }
 
        info->screen_size = info->fix.line_length * info->var.yres_virtual;
+       info->var.rotate = ((fbdev->panel->control_base&LCD_CONTROL_SM_MASK) \
+                               >> LCD_CONTROL_SM_BIT) * 90;
 
        /* Determine BPP mode and format */
-       fbdev->regs->lcd_control = fbdev->panel->control_base |
-                           ((info->var.rotate/90) << LCD_CONTROL_SM_BIT);
-
-       fbdev->regs->lcd_intenable = 0;
-       fbdev->regs->lcd_intstatus = 0;
-
+       fbdev->regs->lcd_control = fbdev->panel->control_base;
        fbdev->regs->lcd_horztiming = fbdev->panel->horztiming;
-
        fbdev->regs->lcd_verttiming = fbdev->panel->verttiming;
-
        fbdev->regs->lcd_clkcontrol = fbdev->panel->clkcontrol_base;
-
+       fbdev->regs->lcd_intenable = 0;
+       fbdev->regs->lcd_intstatus = 0;
        fbdev->regs->lcd_dmaaddr0 = LCD_DMA_SA_N(fbdev->fb_phys);
 
        if (panel_is_dual(fbdev->panel)) {
@@ -206,6 +207,8 @@ int au1100fb_setmode(struct au1100fb_device *fbdev)
 
        /* Resume controller */
        fbdev->regs->lcd_control |= LCD_CONTROL_GO;
+       mdelay(10);
+       au1100fb_fb_blank(VESA_NO_BLANKING, info);
 
        return 0;
 }
@@ -424,6 +427,17 @@ int au1100fb_fb_mmap(struct fb_info *fbi, struct vm_area_struct *vma)
        return 0;
 }
 
+/* fb_cursor
+ * Used to disable cursor drawing...
+ */
+int au1100fb_fb_cursor(struct fb_info *info, struct fb_cursor *cursor)
+{
+       if (nocursor)
+               return 0;
+       else
+               return -EINVAL; /* just to force soft_cursor() call */
+}
+
 static struct fb_ops au1100fb_ops =
 {
        .owner                  = THIS_MODULE,
@@ -435,6 +449,7 @@ static struct fb_ops au1100fb_ops =
        .fb_imageblit           = cfb_imageblit,
        .fb_rotate              = au1100fb_fb_rotate,
        .fb_mmap                = au1100fb_fb_mmap,
+       .fb_cursor              = au1100fb_fb_cursor,
 };
 
 
@@ -453,11 +468,10 @@ int au1100fb_drv_probe(struct device *dev)
                        return -EINVAL;
 
        /* Allocate new device private */
-       if (!(fbdev = kmalloc(sizeof(struct au1100fb_device), GFP_KERNEL))) {
+       if (!(fbdev = kzalloc(sizeof(struct au1100fb_device), GFP_KERNEL))) {
                print_err("fail to allocate device private record");
                return -ENOMEM;
        }
-       memset((void*)fbdev, 0, sizeof(struct au1100fb_device));
 
        fbdev->panel = &known_lcd_panels[drv_info.panel_idx];
 
@@ -534,10 +548,9 @@ int au1100fb_drv_probe(struct device *dev)
        fbdev->info.fbops = &au1100fb_ops;
        fbdev->info.fix = au1100fb_fix;
 
-       if (!(fbdev->info.pseudo_palette = kmalloc(sizeof(u32) * 16, GFP_KERNEL))) {
+       if (!(fbdev->info.pseudo_palette = kzalloc(sizeof(u32) * 16, GFP_KERNEL))) {
                return -ENOMEM;
        }
-       memset(fbdev->info.pseudo_palette, 0, sizeof(u32) * 16);
 
        if (fb_alloc_cmap(&fbdev->info.cmap, AU1100_LCD_NBR_PALETTE_ENTRIES, 0) < 0) {
                print_err("Fail to allocate colormap (%d entries)",
@@ -679,7 +692,7 @@ int au1100fb_setup(char *options)
        if (options) {
                while ((this_opt = strsep(&options,",")) != NULL) {
                        /* Panel option */
-               if (!strncmp(this_opt, "panel:", 6)) {
+                       if (!strncmp(this_opt, "panel:", 6)) {
                                int i;
                                this_opt += 6;
                                for (i = 0; i < num_panels; i++) {
@@ -687,13 +700,18 @@ int au1100fb_setup(char *options)
                                                     known_lcd_panels[i].name,
                                                        strlen(this_opt))) {
                                                panel_idx = i;
-                                       break;
+                                               break;
+                                       }
                                }
-                       }
                                if (i >= num_panels) {
                                        print_warn("Panel %s not supported!", this_opt);
                                }
                        }
+                       if (!strncmp(this_opt, "nocursor", 8)) {
+                               this_opt += 8;
+                               nocursor = 1;
+                               print_info("Cursor disabled");
+                       }
                        /* Mode option (only option that start with digit) */
                        else if (isdigit(this_opt[0])) {
                                mode = kmalloc(strlen(this_opt) + 1, GFP_KERNEL);
@@ -702,7 +720,7 @@ int au1100fb_setup(char *options)
                        /* Unsupported option */
                        else {
                                print_warn("Unsupported option \"%s\"", this_opt);
-               }
+                       }
                }
        }