video: fbdev: au1200fb: Fix error handling path

Rewrite the exit path based on 'au1200fb_drv_remove()'.
We can safely iterate for all already handled planes. Even if not
completely initialized, the functions that are called will silently accept
the 'fb_info' structure that is passed.

As soon as we find a NULL in the '_au1200fb_infos' array, we know that we
have released all what we needed to release. So we can 'break'.

Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
Cc: Tejun Heo <tj@kernel.org>
Signed-off-by: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
This commit is contained in:
Christophe JAILLET 2017-11-09 18:09:29 +01:00 committed by Bartlomiej Zolnierkiewicz
parent 703a4af427
commit 6bbbb6805a
1 changed files with 10 additions and 2 deletions

View File

@ -1760,11 +1760,19 @@ static int au1200fb_drv_probe(struct platform_device *dev)
return 0;
failed:
/* NOTE: This only does the current plane/window that failed; others are still active */
if (fbi) {
for (plane = 0; plane < device_count; ++plane) {
fbi = _au1200fb_infos[plane];
if (!fbi)
break;
/* Clean up all probe data */
unregister_framebuffer(fbi);
if (fbi->cmap.len != 0)
fb_dealloc_cmap(&fbi->cmap);
kfree(fbi->pseudo_palette);
framebuffer_release(fbi);
_au1200fb_infos[plane] = NULL;
}
return ret;
}