Skip to content

Commit

Permalink
video: vt8500: fix error handling in probe()
Browse files Browse the repository at this point in the history
We shouldn't kfree(fbi) because that was allocated with devm_kzalloc().
There were several error paths which returned directly instead of
releasing resources.

Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
  • Loading branch information
Dan Carpenter authored and Tomi Valkeinen committed Dec 4, 2013
1 parent 5a0973f commit 46ac295
Showing 1 changed file with 11 additions and 14 deletions.
25 changes: 11 additions & 14 deletions drivers/video/vt8500lcdfb.c
Original file line number Diff line number Diff line change
Expand Up @@ -293,8 +293,7 @@ static int vt8500lcd_probe(struct platform_device *pdev)
+ sizeof(u32) * 16, GFP_KERNEL);
if (!fbi) {
dev_err(&pdev->dev, "Failed to initialize framebuffer device\n");
ret = -ENOMEM;
goto failed;
return -ENOMEM;
}

strcpy(fbi->fb.fix.id, "VT8500 LCD");
Expand Down Expand Up @@ -327,15 +326,13 @@ static int vt8500lcd_probe(struct platform_device *pdev)
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (res == NULL) {
dev_err(&pdev->dev, "no I/O memory resource defined\n");
ret = -ENODEV;
goto failed_fbi;
return -ENODEV;
}

res = request_mem_region(res->start, resource_size(res), "vt8500lcd");
if (res == NULL) {
dev_err(&pdev->dev, "failed to request I/O memory\n");
ret = -EBUSY;
goto failed_fbi;
return -EBUSY;
}

fbi->regbase = ioremap(res->start, resource_size(res));
Expand All @@ -346,25 +343,28 @@ static int vt8500lcd_probe(struct platform_device *pdev)
}

disp_timing = of_get_display_timings(pdev->dev.of_node);
if (!disp_timing)
return -EINVAL;
if (!disp_timing) {
ret = -EINVAL;
goto failed_free_io;
}

ret = of_get_fb_videomode(pdev->dev.of_node, &of_mode,
OF_USE_NATIVE_MODE);
if (ret)
return ret;
goto failed_free_io;

ret = of_property_read_u32(pdev->dev.of_node, "bits-per-pixel", &bpp);
if (ret)
return ret;
goto failed_free_io;

/* try allocating the framebuffer */
fb_mem_len = of_mode.xres * of_mode.yres * 2 * (bpp / 8);
fb_mem_virt = dma_alloc_coherent(&pdev->dev, fb_mem_len, &fb_mem_phys,
GFP_KERNEL);
if (!fb_mem_virt) {
pr_err("%s: Failed to allocate framebuffer\n", __func__);
return -ENOMEM;
ret = -ENOMEM;
goto failed_free_io;
}

fbi->fb.fix.smem_start = fb_mem_phys;
Expand Down Expand Up @@ -447,9 +447,6 @@ static int vt8500lcd_probe(struct platform_device *pdev)
iounmap(fbi->regbase);
failed_free_res:
release_mem_region(res->start, resource_size(res));
failed_fbi:
kfree(fbi);
failed:
return ret;
}

Expand Down

0 comments on commit 46ac295

Please sign in to comment.