Commit 2604f6da authored by Linus Torvalds's avatar Linus Torvalds

Automatic merge of master.kernel.org:/home/rmk/linux-2.6-rmk.git

parents 18c8baff 0f7ad450
...@@ -125,11 +125,11 @@ clcdfb_set_bitfields(struct clcd_fb *fb, struct fb_var_screeninfo *var) ...@@ -125,11 +125,11 @@ clcdfb_set_bitfields(struct clcd_fb *fb, struct fb_var_screeninfo *var)
case 2: case 2:
case 4: case 4:
case 8: case 8:
var->red.length = 8; var->red.length = var->bits_per_pixel;
var->red.offset = 0; var->red.offset = 0;
var->green.length = 8; var->green.length = var->bits_per_pixel;
var->green.offset = 0; var->green.offset = 0;
var->blue.length = 8; var->blue.length = var->bits_per_pixel;
var->blue.offset = 0; var->blue.offset = 0;
break; break;
case 16: case 16:
...@@ -146,7 +146,7 @@ clcdfb_set_bitfields(struct clcd_fb *fb, struct fb_var_screeninfo *var) ...@@ -146,7 +146,7 @@ clcdfb_set_bitfields(struct clcd_fb *fb, struct fb_var_screeninfo *var)
var->blue.offset = 10; var->blue.offset = 10;
} }
break; break;
case 24: case 32:
if (fb->panel->cntl & CNTL_LCDTFT) { if (fb->panel->cntl & CNTL_LCDTFT) {
var->red.length = 8; var->red.length = 8;
var->green.length = 8; var->green.length = 8;
...@@ -178,6 +178,12 @@ static int clcdfb_check_var(struct fb_var_screeninfo *var, struct fb_info *info) ...@@ -178,6 +178,12 @@ static int clcdfb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
if (fb->board->check) if (fb->board->check)
ret = fb->board->check(fb, var); 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) if (ret == 0)
ret = clcdfb_set_bitfields(fb, var); ret = clcdfb_set_bitfields(fb, var);
......
...@@ -153,7 +153,7 @@ struct clcd_fb { ...@@ -153,7 +153,7 @@ struct clcd_fb {
static inline void clcdfb_decode(struct clcd_fb *fb, struct clcd_regs *regs) 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 * 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) ...@@ -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; val |= (fb->fb.var.left_margin - 1) << 24;
regs->tim0 = val; 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.vsync_len - 1) << 10;
val |= fb->fb.var.lower_margin << 16; val |= fb->fb.var.lower_margin << 16;
val |= fb->fb.var.upper_margin << 24; val |= fb->fb.var.upper_margin << 24;
...@@ -174,13 +177,17 @@ static inline void clcdfb_decode(struct clcd_fb *fb, struct clcd_regs *regs) ...@@ -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_HOR_HIGH_ACT ? 0 : TIM2_IHS;
val |= fb->fb.var.sync & FB_SYNC_VERT_HIGH_ACT ? 0 : TIM2_IVS; val |= fb->fb.var.sync & FB_SYNC_VERT_HIGH_ACT ? 0 : TIM2_IVS;
if (fb->panel->cntl & CNTL_LCDTFT) cpl = fb->fb.var.xres_virtual;
val |= (fb->fb.var.xres_virtual - 1) << 16; if (fb->panel->cntl & CNTL_LCDTFT) /* TFT */
else if (fb->panel->cntl & CNTL_LCDBW) /* / 1 */;
printk("what value for CPL for stnmono panels?"); else if (!fb->fb.var.grayscale) /* STN color */
else cpl = cpl * 8 / 3;
val |= ((fb->fb.var.xres_virtual * 8 / 3) - 1) << 16; else if (fb->panel->cntl & CNTL_LCDMONO8) /* STN monochrome, 8bit */
regs->tim2 = val; cpl /= 8;
else /* STN monochrome, 4bit */
cpl /= 4;
regs->tim2 = val | ((cpl - 1) << 16);
regs->tim3 = fb->panel->tim3; regs->tim3 = fb->panel->tim3;
...@@ -204,7 +211,7 @@ static inline void clcdfb_decode(struct clcd_fb *fb, struct clcd_regs *regs) ...@@ -204,7 +211,7 @@ static inline void clcdfb_decode(struct clcd_fb *fb, struct clcd_regs *regs)
case 16: case 16:
val |= CNTL_LCDBPP16; val |= CNTL_LCDBPP16;
break; break;
case 24: case 32:
val |= CNTL_LCDBPP24; val |= CNTL_LCDBPP24;
break; break;
} }
...@@ -215,8 +222,8 @@ static inline void clcdfb_decode(struct clcd_fb *fb, struct clcd_regs *regs) ...@@ -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) static inline int clcdfb_check(struct clcd_fb *fb, struct fb_var_screeninfo *var)
{ {
var->xres_virtual = var->xres = (var->xres + 7) & ~7; var->xres_virtual = var->xres = (var->xres + 15) & ~15;
var->yres_virtual = var->yres; var->yres_virtual = var->yres = (var->yres + 1) & ~1;
#define CHECK(e,l,h) (var->e < l || var->e > h) #define CHECK(e,l,h) (var->e < l || var->e > h)
if (CHECK(right_margin, (5+1), 256) || /* back porch */ if (CHECK(right_margin, (5+1), 256) || /* back porch */
......
...@@ -26,10 +26,13 @@ struct clk; ...@@ -26,10 +26,13 @@ struct clk;
/** /**
* clk_get - lookup and obtain a reference to a clock producer. * clk_get - lookup and obtain a reference to a clock producer.
* @dev: device for clock "consumer" * @dev: device for clock "consumer"
* @id: device ID * @id: clock comsumer ID
* *
* Returns a struct clk corresponding to the clock producer, or * 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); struct clk *clk_get(struct device *dev, const char *id);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment