Automatic merge of master.kernel.org:/home/rmk/linux-2.6-rmk.git
authorLinus Torvalds <torvalds@ppc970.osdl.org>
Thu, 28 Apr 2005 23:09:57 +0000 (16:09 -0700)
committerLinus Torvalds <torvalds@ppc970.osdl.org>
Thu, 28 Apr 2005 23:09:57 +0000 (16:09 -0700)
drivers/video/amba-clcd.c
include/asm-arm/hardware/amba_clcd.h
include/asm-arm/hardware/clock.h

index acdba0c67fb8c6102bb613b400ae9822964ca2df..3e386fd4c5c6e627699ccd04117b712030f0f3f4 100644 (file)
@@ -125,11 +125,11 @@ clcdfb_set_bitfields(struct clcd_fb *fb, struct fb_var_screeninfo *var)
        case 2:
        case 4:
        case 8:
-               var->red.length         = 8;
+               var->red.length         = var->bits_per_pixel;
                var->red.offset         = 0;
-               var->green.length       = 8;
+               var->green.length       = var->bits_per_pixel;
                var->green.offset       = 0;
-               var->blue.length        = 8;
+               var->blue.length        = var->bits_per_pixel;
                var->blue.offset        = 0;
                break;
        case 16:
@@ -146,7 +146,7 @@ clcdfb_set_bitfields(struct clcd_fb *fb, struct fb_var_screeninfo *var)
                        var->blue.offset        = 10;
                }
                break;
-       case 24:
+       case 32:
                if (fb->panel->cntl & CNTL_LCDTFT) {
                        var->red.length         = 8;
                        var->green.length       = 8;
@@ -178,6 +178,12 @@ static int clcdfb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
 
        if (fb->board->check)
                ret = fb->board->check(fb, var);
+
+       if (ret == 0 &&
+           var->xres_virtual * var->bits_per_pixel / 8 *
+           var->yres_virtual > fb->fb.fix.smem_len)
+               ret = -EINVAL;
+
        if (ret == 0)
                ret = clcdfb_set_bitfields(fb, var);
 
index 2149be7c7023702e7b0dca0bf19b30ed1081ec34..ce4cf5c1c05d7affced4678fea31b1fcdf68822d 100644 (file)
@@ -153,7 +153,7 @@ struct clcd_fb {
 
 static inline void clcdfb_decode(struct clcd_fb *fb, struct clcd_regs *regs)
 {
-       u32 val;
+       u32 val, cpl;
 
        /*
         * Program the CLCD controller registers and start the CLCD
@@ -164,7 +164,10 @@ static inline void clcdfb_decode(struct clcd_fb *fb, struct clcd_regs *regs)
        val |= (fb->fb.var.left_margin - 1) << 24;
        regs->tim0 = val;
 
-       val = fb->fb.var.yres - 1;
+       val = fb->fb.var.yres;
+       if (fb->panel->cntl & CNTL_LCDDUAL)
+               val /= 2;
+       val -= 1;
        val |= (fb->fb.var.vsync_len - 1) << 10;
        val |= fb->fb.var.lower_margin << 16;
        val |= fb->fb.var.upper_margin << 24;
@@ -174,13 +177,17 @@ static inline void clcdfb_decode(struct clcd_fb *fb, struct clcd_regs *regs)
        val |= fb->fb.var.sync & FB_SYNC_HOR_HIGH_ACT  ? 0 : TIM2_IHS;
        val |= fb->fb.var.sync & FB_SYNC_VERT_HIGH_ACT ? 0 : TIM2_IVS;
 
-       if (fb->panel->cntl & CNTL_LCDTFT)
-               val |= (fb->fb.var.xres_virtual - 1) << 16;
-       else if (fb->panel->cntl & CNTL_LCDBW)
-               printk("what value for CPL for stnmono panels?");
-       else
-               val |= ((fb->fb.var.xres_virtual * 8 / 3) - 1) << 16;
-       regs->tim2 = val;
+       cpl = fb->fb.var.xres_virtual;
+       if (fb->panel->cntl & CNTL_LCDTFT)        /* TFT */
+               /* / 1 */;
+       else if (!fb->fb.var.grayscale)           /* STN color */
+               cpl = cpl * 8 / 3;
+       else if (fb->panel->cntl & CNTL_LCDMONO8) /* STN monochrome, 8bit */
+               cpl /= 8;
+       else                                      /* STN monochrome, 4bit */
+               cpl /= 4;
+
+       regs->tim2 = val | ((cpl - 1) << 16);
 
        regs->tim3 = fb->panel->tim3;
 
@@ -204,7 +211,7 @@ static inline void clcdfb_decode(struct clcd_fb *fb, struct clcd_regs *regs)
        case 16:
                val |= CNTL_LCDBPP16;
                break;
-       case 24:
+       case 32:
                val |= CNTL_LCDBPP24;
                break;
        }
@@ -215,8 +222,8 @@ static inline void clcdfb_decode(struct clcd_fb *fb, struct clcd_regs *regs)
 
 static inline int clcdfb_check(struct clcd_fb *fb, struct fb_var_screeninfo *var)
 {
-       var->xres_virtual = var->xres = (var->xres + 7) & ~7;
-       var->yres_virtual = var->yres;
+       var->xres_virtual = var->xres = (var->xres + 15) & ~15;
+       var->yres_virtual = var->yres = (var->yres + 1) & ~1;
 
 #define CHECK(e,l,h) (var->e < l || var->e > h)
        if (CHECK(right_margin, (5+1), 256) ||  /* back porch */
index 4983449ff2c7fdf98708ea101fb26441f6393982..19da861e523d8dbbfe327e4b07d166c61544a623 100644 (file)
@@ -26,10 +26,13 @@ struct clk;
 /**
  * clk_get - lookup and obtain a reference to a clock producer.
  * @dev: device for clock "consumer"
- * @id: device ID
+ * @id: clock comsumer ID
  *
  * Returns a struct clk corresponding to the clock producer, or
- * valid IS_ERR() condition containing errno.
+ * valid IS_ERR() condition containing errno.  The implementation
+ * uses @dev and @id to determine the clock consumer, and thereby
+ * the clock producer.  (IOW, @id may be identical strings, but
+ * clk_get may return different clock producers depending on @dev.)
  */
 struct clk *clk_get(struct device *dev, const char *id);