Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

video: fbdev: imxfb: Convert request_mem_region + ioremap to devm_ioremap_resource

This has several advantages:

- No need for manual undo of the two functions in the error path and
the remove function.
- Drops error handling in .remove()
Note that returning early in .remove() yields resource leaks that
often result in access of freed memory or unmapped registers later.
- Fixes a resource leak
request_mem_region allocates memory for the returned pointer that was
never freed.

Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Signed-off-by: Helge Deller <deller@gmx.de>

authored by

Uwe Kleine-König and committed by
Helge Deller
b083c22d ded77a74

+1 -17
+1 -17
drivers/video/fbdev/imxfb.c
··· 937 937 info->fix.smem_len = max_t(size_t, info->fix.smem_len, 938 938 m->mode.xres * m->mode.yres * bytes_per_pixel); 939 939 940 - res = request_mem_region(res->start, resource_size(res), 941 - DRIVER_NAME); 942 - if (!res) { 943 - ret = -EBUSY; 944 - goto failed_req; 945 - } 946 - 947 940 fbi->clk_ipg = devm_clk_get(&pdev->dev, "ipg"); 948 941 if (IS_ERR(fbi->clk_ipg)) { 949 942 ret = PTR_ERR(fbi->clk_ipg); ··· 970 977 goto failed_getclock; 971 978 } 972 979 973 - fbi->regs = ioremap(res->start, resource_size(res)); 980 + fbi->regs = devm_ioremap_resource(&pdev->dev, res); 974 981 if (fbi->regs == NULL) { 975 982 dev_err(&pdev->dev, "Cannot map frame buffer registers\n"); 976 983 ret = -ENOMEM; ··· 1042 1049 dma_free_wc(&pdev->dev, fbi->map_size, info->screen_buffer, 1043 1050 fbi->map_dma); 1044 1051 failed_map: 1045 - iounmap(fbi->regs); 1046 1052 failed_ioremap: 1047 1053 failed_getclock: 1048 1054 release_mem_region(res->start, resource_size(res)); 1049 - failed_req: 1050 1055 failed_of_parse: 1051 1056 kfree(info->pseudo_palette); 1052 1057 failed_init: ··· 1056 1065 { 1057 1066 struct fb_info *info = platform_get_drvdata(pdev); 1058 1067 struct imxfb_info *fbi = info->par; 1059 - struct resource *res; 1060 - 1061 - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 1062 - if (!res) 1063 - return -EINVAL; 1064 1068 1065 1069 imxfb_disable_controller(fbi); 1066 1070 ··· 1063 1077 fb_dealloc_cmap(&info->cmap); 1064 1078 dma_free_wc(&pdev->dev, fbi->map_size, info->screen_buffer, 1065 1079 fbi->map_dma); 1066 - iounmap(fbi->regs); 1067 - release_mem_region(res->start, resource_size(res)); 1068 1080 kfree(info->pseudo_palette); 1069 1081 framebuffer_release(info); 1070 1082