]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/video/cg6.c
Linux 2.6.28-rc1
[linux-2.6-omap-h63xx.git] / drivers / video / cg6.c
index 2f64bb3bd2540e7f5c77c03e7d5894578ddad572..940ec04f0f1be22665c99e548eaf9392a2fa13b1 100644 (file)
@@ -34,10 +34,11 @@ static int cg6_blank(int, struct fb_info *);
 
 static void cg6_imageblit(struct fb_info *, const struct fb_image *);
 static void cg6_fillrect(struct fb_info *, const struct fb_fillrect *);
+static void cg6_copyarea(struct fb_info *info, const struct fb_copyarea *area);
 static int cg6_sync(struct fb_info *);
 static int cg6_mmap(struct fb_info *, struct vm_area_struct *);
 static int cg6_ioctl(struct fb_info *, unsigned int, unsigned long);
-static void cg6_copyarea(struct fb_info *info, const struct fb_copyarea *area);
+static int cg6_pan_display(struct fb_var_screeninfo *, struct fb_info *);
 
 /*
  *  Frame buffer operations
@@ -47,6 +48,7 @@ static struct fb_ops cg6_ops = {
        .owner                  = THIS_MODULE,
        .fb_setcolreg           = cg6_setcolreg,
        .fb_blank               = cg6_blank,
+       .fb_pan_display         = cg6_pan_display,
        .fb_fillrect            = cg6_fillrect,
        .fb_copyarea            = cg6_copyarea,
        .fb_imageblit           = cg6_imageblit,
@@ -161,6 +163,7 @@ static struct fb_ops cg6_ops = {
 #define CG6_THC_MISC_INT_ENAB          (1 << 5)
 #define CG6_THC_MISC_INT               (1 << 4)
 #define CG6_THC_MISC_INIT              0x9f
+#define CG6_THC_CURSOFF                        ((65536-32) | ((65536-32) << 16))
 
 /* The contents are unknown */
 struct cg6_tec {
@@ -280,6 +283,33 @@ static int cg6_sync(struct fb_info *info)
        return 0;
 }
 
+static void cg6_switch_from_graph(struct cg6_par *par)
+{
+       struct cg6_thc __iomem *thc = par->thc;
+       unsigned long flags;
+
+       spin_lock_irqsave(&par->lock, flags);
+
+       /* Hide the cursor. */
+       sbus_writel(CG6_THC_CURSOFF, &thc->thc_cursxy);
+
+       spin_unlock_irqrestore(&par->lock, flags);
+}
+
+static int cg6_pan_display(struct fb_var_screeninfo *var, struct fb_info *info)
+{
+       struct cg6_par *par = (struct cg6_par *)info->par;
+
+       /* We just use this to catch switches out of
+        * graphics mode.
+        */
+       cg6_switch_from_graph(par);
+
+       if (var->xoffset || var->yoffset || var->vmode)
+               return -EINVAL;
+       return 0;
+}
+
 /**
  *     cg6_fillrect -  Draws a rectangle on the screen.
  *
@@ -643,9 +673,13 @@ static void __devinit cg6_chip_init(struct fb_info *info)
        struct cg6_par *par = (struct cg6_par *)info->par;
        struct cg6_tec __iomem *tec = par->tec;
        struct cg6_fbc __iomem *fbc = par->fbc;
+       struct cg6_thc __iomem *thc = par->thc;
        u32 rev, conf, mode;
        int i;
 
+       /* Hide the cursor. */
+       sbus_writel(CG6_THC_CURSOFF, &thc->thc_cursxy);
+
        /* Turn off stuff in the Transform Engine. */
        sbus_writel(0, &tec->tec_matrix);
        sbus_writel(0, &tec->tec_clip);
@@ -814,7 +848,7 @@ static int __devexit cg6_remove(struct of_device *op)
        return 0;
 }
 
-static struct of_device_id cg6_match[] = {
+static const struct of_device_id cg6_match[] = {
        {
                .name = "cgsix",
        },