mirror of
git://projects.qi-hardware.com/openwrt-xburst.git
synced 2024-11-28 22:12:27 +02:00
Fix some problems in the framebuffer driver.
This commit is contained in:
parent
ebc8c5a149
commit
35fedaa9e4
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user