Commit ddc518d9 authored by Krzysztof Helt's avatar Krzysztof Helt Committed by Linus Torvalds

s3c-fb: fix resource releasing on error during probing

All resources are released in s3c_fb_win_release so remove other places of
resources releasing.  Add releasing of an allocated fb_info structure as
well.
Signed-off-by: default avatarKrzysztof Helt <krzysztof.h1@wp.pl>
Cc: Kyungmin Park <kyungmin.park@samsung.com>
Cc: Marek Szyprowski <m.szyprowski@samsung.com>
Cc: Ben Dooks <ben-linux@fluff.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 493f139e
...@@ -725,9 +725,12 @@ static void s3c_fb_free_memory(struct s3c_fb *sfb, struct s3c_fb_win *win) ...@@ -725,9 +725,12 @@ static void s3c_fb_free_memory(struct s3c_fb *sfb, struct s3c_fb_win *win)
*/ */
static void s3c_fb_release_win(struct s3c_fb *sfb, struct s3c_fb_win *win) static void s3c_fb_release_win(struct s3c_fb *sfb, struct s3c_fb_win *win)
{ {
fb_dealloc_cmap(&win->fbinfo->cmap); if (win->fbinfo) {
unregister_framebuffer(win->fbinfo); unregister_framebuffer(win->fbinfo);
fb_dealloc_cmap(&win->fbinfo->cmap);
s3c_fb_free_memory(sfb, win); s3c_fb_free_memory(sfb, win);
framebuffer_release(win->fbinfo);
}
} }
/** /**
...@@ -778,7 +781,7 @@ static int __devinit s3c_fb_probe_win(struct s3c_fb *sfb, unsigned int win_no, ...@@ -778,7 +781,7 @@ static int __devinit s3c_fb_probe_win(struct s3c_fb *sfb, unsigned int win_no,
ret = s3c_fb_alloc_memory(sfb, win); ret = s3c_fb_alloc_memory(sfb, win);
if (ret) { if (ret) {
dev_err(sfb->dev, "failed to allocate display memory\n"); dev_err(sfb->dev, "failed to allocate display memory\n");
goto err_framebuffer; return ret;
} }
/* setup the r/b/g positions for the window's palette */ /* setup the r/b/g positions for the window's palette */
...@@ -801,7 +804,7 @@ static int __devinit s3c_fb_probe_win(struct s3c_fb *sfb, unsigned int win_no, ...@@ -801,7 +804,7 @@ static int __devinit s3c_fb_probe_win(struct s3c_fb *sfb, unsigned int win_no,
ret = s3c_fb_check_var(&fbinfo->var, fbinfo); ret = s3c_fb_check_var(&fbinfo->var, fbinfo);
if (ret < 0) { if (ret < 0) {
dev_err(sfb->dev, "check_var failed on initial video params\n"); dev_err(sfb->dev, "check_var failed on initial video params\n");
goto err_alloc_mem; return ret;
} }
/* create initial colour map */ /* create initial colour map */
...@@ -821,20 +824,13 @@ static int __devinit s3c_fb_probe_win(struct s3c_fb *sfb, unsigned int win_no, ...@@ -821,20 +824,13 @@ static int __devinit s3c_fb_probe_win(struct s3c_fb *sfb, unsigned int win_no,
ret = register_framebuffer(fbinfo); ret = register_framebuffer(fbinfo);
if (ret < 0) { if (ret < 0) {
dev_err(sfb->dev, "failed to register framebuffer\n"); dev_err(sfb->dev, "failed to register framebuffer\n");
goto err_alloc_mem; return ret;
} }
*res = win; *res = win;
dev_info(sfb->dev, "window %d: fb %s\n", win_no, fbinfo->fix.id); dev_info(sfb->dev, "window %d: fb %s\n", win_no, fbinfo->fix.id);
return 0; return 0;
err_alloc_mem:
s3c_fb_free_memory(sfb, win);
err_framebuffer:
unregister_framebuffer(fbinfo);
return ret;
} }
/** /**
......
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