1
0
mirror of git://projects.qi-hardware.com/openwrt-xburst.git synced 2024-11-25 06:36:15 +02:00

Fix some problems in the framebuffer driver.

This commit is contained in:
Lars-Peter Clausen 2009-08-24 18:19:40 +02:00 committed by Xiangfu Liu
parent ebc8c5a149
commit 35fedaa9e4

View File

@ -140,15 +140,26 @@ int jzfb_setcolreg(unsigned regno, unsigned red, unsigned green, unsigned blue,
return 0; return 0;
} }
static int jzfb_get_controller_bpp(struct jzfb *jzfb)
{
switch(jzfb->pdata->bpp) {
case 18:
case 24:
return 32;
break;
default:
return jzfb->pdata->bpp;
}
}
static int jzfb_check_var(struct fb_var_screeninfo *var, struct fb_info *fb) static int jzfb_check_var(struct fb_var_screeninfo *var, struct fb_info *fb)
{ {
struct jzfb* jzfb = fb->par; struct jzfb* jzfb = fb->par;
struct fb_videomode *mode = jzfb->pdata->modes; struct fb_videomode *mode = jzfb->pdata->modes;
int i; int i;
if (fb->var.bits_per_pixel != jzfb->pdata->bpp && if (fb->var.bits_per_pixel != jzfb_get_controller_bpp(jzfb) &&
!(var->bits_per_pixel == 32 && fb->var.bits_per_pixel != jzfb->pdata->bpp)
(jzfb->pdata->bpp == 18 || jzfb->pdata->bpp == 24)))
return -EINVAL; return -EINVAL;
for (i = 0; i < jzfb->pdata->num_modes; ++i, ++mode) { for (i = 0; i < jzfb->pdata->num_modes; ++i, ++mode) {
@ -267,6 +278,7 @@ static int jzfb_set_par(struct fb_info *info)
return 0; return 0;
} }
static int jzfb_alloc_vidmem(struct jzfb *jzfb) static int jzfb_alloc_vidmem(struct jzfb *jzfb)
{ {
size_t devmem_size; size_t devmem_size;
@ -281,7 +293,7 @@ static int jzfb_alloc_vidmem(struct jzfb *jzfb)
max_videosize = mode->xres * mode->yres; max_videosize = mode->xres * mode->yres;
} }
max_videosize *= jzfb->pdata->bpp >> 3; max_videosize *= jzfb_get_controller_bpp(jzfb) >> 3;
devmem_size = max_videosize + sizeof(struct jzfb_framedesc); devmem_size = max_videosize + sizeof(struct jzfb_framedesc);
@ -302,16 +314,16 @@ static int jzfb_alloc_vidmem(struct jzfb *jzfb)
framedesc = jzfb->devmem; framedesc = jzfb->devmem;
jzfb->vidmem = jzfb->devmem + sizeof(struct jzfb_framedesc);
framedesc->next = jzfb->devmem_phys; framedesc->next = jzfb->devmem_phys;
framedesc->addr = jzfb->devmem_phys + sizeof(struct jzfb_framedesc); framedesc->addr = jzfb->devmem_phys + sizeof(struct jzfb_framedesc);
framedesc->id = 0x0; framedesc->id = 0;
framedesc->cmd = 0; framedesc->cmd = 0;
framedesc->cmd |= max_videosize / 4; framedesc->cmd |= max_videosize / 4;
jzfb->framedesc = framedesc; jzfb->framedesc = framedesc;
jzfb->vidmem = jzfb->devmem + sizeof(struct jzfb_framedesc);
return 0; return 0;
} }
@ -392,6 +404,7 @@ static int __devinit jzfb_probe(struct platform_device *pdev)
fb->mode = pdata->modes; fb->mode = pdata->modes;
fb_videomode_to_var(&fb->var, fb->mode); fb_videomode_to_var(&fb->var, fb->mode);
fb->var.bits_per_pixel = pdata->bpp;
jzfb_check_var(&fb->var, fb); jzfb_check_var(&fb->var, fb);
ret = jzfb_alloc_vidmem(jzfb); ret = jzfb_alloc_vidmem(jzfb);