mirror of https://gitee.com/openkylin/linux.git
valkyriefb: check fb_alloc_cmap return value and handle failure properly
Signed-off-by: Andres Salomon <dilinger@debian.org> Acked-by: Krzysztof Helt <krzysztof.h1@wp.pl> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
175b39fb7e
commit
ccb121e695
|
@ -119,7 +119,7 @@ static void set_valkyrie_clock(unsigned char *params);
|
||||||
static int valkyrie_var_to_par(struct fb_var_screeninfo *var,
|
static int valkyrie_var_to_par(struct fb_var_screeninfo *var,
|
||||||
struct fb_par_valkyrie *par, const struct fb_info *fb_info);
|
struct fb_par_valkyrie *par, const struct fb_info *fb_info);
|
||||||
|
|
||||||
static void valkyrie_init_info(struct fb_info *info, struct fb_info_valkyrie *p);
|
static int valkyrie_init_info(struct fb_info *info, struct fb_info_valkyrie *p);
|
||||||
static void valkyrie_par_to_fix(struct fb_par_valkyrie *par, struct fb_fix_screeninfo *fix);
|
static void valkyrie_par_to_fix(struct fb_par_valkyrie *par, struct fb_fix_screeninfo *fix);
|
||||||
static void valkyrie_init_fix(struct fb_fix_screeninfo *fix, struct fb_info_valkyrie *p);
|
static void valkyrie_init_fix(struct fb_fix_screeninfo *fix, struct fb_info_valkyrie *p);
|
||||||
|
|
||||||
|
@ -381,18 +381,22 @@ int __init valkyriefb_init(void)
|
||||||
|
|
||||||
valkyrie_choose_mode(p);
|
valkyrie_choose_mode(p);
|
||||||
mac_vmode_to_var(default_vmode, default_cmode, &p->info.var);
|
mac_vmode_to_var(default_vmode, default_cmode, &p->info.var);
|
||||||
valkyrie_init_info(&p->info, p);
|
err = valkyrie_init_info(&p->info, p);
|
||||||
|
if (err < 0)
|
||||||
|
goto out_free;
|
||||||
valkyrie_init_fix(&p->info.fix, p);
|
valkyrie_init_fix(&p->info.fix, p);
|
||||||
if (valkyriefb_set_par(&p->info))
|
if (valkyriefb_set_par(&p->info))
|
||||||
/* "can't happen" */
|
/* "can't happen" */
|
||||||
printk(KERN_ERR "valkyriefb: can't set default video mode\n");
|
printk(KERN_ERR "valkyriefb: can't set default video mode\n");
|
||||||
|
|
||||||
if ((err = register_framebuffer(&p->info)) != 0)
|
if ((err = register_framebuffer(&p->info)) != 0)
|
||||||
goto out_free;
|
goto out_cmap_free;
|
||||||
|
|
||||||
printk(KERN_INFO "fb%d: valkyrie frame buffer device\n", p->info.node);
|
printk(KERN_INFO "fb%d: valkyrie frame buffer device\n", p->info.node);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
out_cmap_free:
|
||||||
|
fb_dealloc_cmap(&p->info.cmap);
|
||||||
out_free:
|
out_free:
|
||||||
if (p->frame_buffer)
|
if (p->frame_buffer)
|
||||||
iounmap(p->frame_buffer);
|
iounmap(p->frame_buffer);
|
||||||
|
@ -538,14 +542,15 @@ static void valkyrie_par_to_fix(struct fb_par_valkyrie *par,
|
||||||
/* ywrapstep, xpanstep, ypanstep */
|
/* ywrapstep, xpanstep, ypanstep */
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __init valkyrie_init_info(struct fb_info *info, struct fb_info_valkyrie *p)
|
static int __init valkyrie_init_info(struct fb_info *info,
|
||||||
|
struct fb_info_valkyrie *p)
|
||||||
{
|
{
|
||||||
info->fbops = &valkyriefb_ops;
|
info->fbops = &valkyriefb_ops;
|
||||||
info->screen_base = p->frame_buffer + 0x1000;
|
info->screen_base = p->frame_buffer + 0x1000;
|
||||||
info->flags = FBINFO_DEFAULT;
|
info->flags = FBINFO_DEFAULT;
|
||||||
info->pseudo_palette = p->pseudo_palette;
|
info->pseudo_palette = p->pseudo_palette;
|
||||||
fb_alloc_cmap(&info->cmap, 256, 0);
|
|
||||||
info->par = &p->par;
|
info->par = &p->par;
|
||||||
|
return fb_alloc_cmap(&info->cmap, 256, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue