Commit 3f3f2f4d authored by Ricardo Ribalda Delgado's avatar Ricardo Ribalda Delgado Committed by Greg Kroah-Hartman

mtd: physmap_of: Release resources on error

[ Upstream commit ef0de747 ]

During probe, if there was an error the memory region and the memory
map were not properly released.This can lead a system unusable if
deferred probe is in use.

Replace mem_request and map with devm_ioremap_resource
Signed-off-by: default avatarRicardo Ribalda Delgado <ricardo.ribalda@gmail.com>
Signed-off-by: default avatarBoris Brezillon <boris.brezillon@bootlin.com>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent f62845f5
...@@ -29,7 +29,6 @@ ...@@ -29,7 +29,6 @@
struct of_flash_list { struct of_flash_list {
struct mtd_info *mtd; struct mtd_info *mtd;
struct map_info map; struct map_info map;
struct resource *res;
}; };
struct of_flash { struct of_flash {
...@@ -54,18 +53,10 @@ static int of_flash_remove(struct platform_device *dev) ...@@ -54,18 +53,10 @@ static int of_flash_remove(struct platform_device *dev)
mtd_concat_destroy(info->cmtd); mtd_concat_destroy(info->cmtd);
} }
for (i = 0; i < info->list_size; i++) { for (i = 0; i < info->list_size; i++)
if (info->list[i].mtd) if (info->list[i].mtd)
map_destroy(info->list[i].mtd); map_destroy(info->list[i].mtd);
if (info->list[i].map.virt)
iounmap(info->list[i].map.virt);
if (info->list[i].res) {
release_resource(info->list[i].res);
kfree(info->list[i].res);
}
}
return 0; return 0;
} }
...@@ -223,10 +214,11 @@ static int of_flash_probe(struct platform_device *dev) ...@@ -223,10 +214,11 @@ static int of_flash_probe(struct platform_device *dev)
err = -EBUSY; err = -EBUSY;
res_size = resource_size(&res); res_size = resource_size(&res);
info->list[i].res = request_mem_region(res.start, res_size, info->list[i].map.virt = devm_ioremap_resource(&dev->dev, &res);
dev_name(&dev->dev)); if (IS_ERR(info->list[i].map.virt)) {
if (!info->list[i].res) err = PTR_ERR(info->list[i].map.virt);
goto err_out; goto err_out;
}
err = -ENXIO; err = -ENXIO;
width = of_get_property(dp, "bank-width", NULL); width = of_get_property(dp, "bank-width", NULL);
...@@ -247,15 +239,6 @@ static int of_flash_probe(struct platform_device *dev) ...@@ -247,15 +239,6 @@ static int of_flash_probe(struct platform_device *dev)
return err; return err;
} }
err = -ENOMEM;
info->list[i].map.virt = ioremap(info->list[i].map.phys,
info->list[i].map.size);
if (!info->list[i].map.virt) {
dev_err(&dev->dev, "Failed to ioremap() flash"
" region\n");
goto err_out;
}
simple_map_init(&info->list[i].map); simple_map_init(&info->list[i].map);
/* /*
......
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