| From a077a0afd59d6be721ab7a9e44abe5fdcab718d3 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Thu, 4 Oct 2018 15:34:45 +0200 |
| Subject: mtd: physmap_of: Release resources on error |
| |
| From: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com> |
| |
| [ Upstream commit ef0de747f7ad179c7698a5b0e28db05f18ecbf57 ] |
| |
| 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: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com> |
| Signed-off-by: Boris Brezillon <boris.brezillon@bootlin.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/mtd/maps/physmap_of_core.c | 27 +++++---------------------- |
| 1 file changed, 5 insertions(+), 22 deletions(-) |
| |
| diff --git a/drivers/mtd/maps/physmap_of_core.c b/drivers/mtd/maps/physmap_of_core.c |
| index b1bd4faecfb25..5d8399742c754 100644 |
| --- a/drivers/mtd/maps/physmap_of_core.c |
| +++ b/drivers/mtd/maps/physmap_of_core.c |
| @@ -30,7 +30,6 @@ |
| struct of_flash_list { |
| struct mtd_info *mtd; |
| struct map_info map; |
| - struct resource *res; |
| }; |
| |
| struct of_flash { |
| @@ -55,18 +54,10 @@ static int of_flash_remove(struct platform_device *dev) |
| 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) |
| 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; |
| } |
| |
| @@ -214,10 +205,11 @@ static int of_flash_probe(struct platform_device *dev) |
| |
| err = -EBUSY; |
| res_size = resource_size(&res); |
| - info->list[i].res = request_mem_region(res.start, res_size, |
| - dev_name(&dev->dev)); |
| - if (!info->list[i].res) |
| + info->list[i].map.virt = devm_ioremap_resource(&dev->dev, &res); |
| + if (IS_ERR(info->list[i].map.virt)) { |
| + err = PTR_ERR(info->list[i].map.virt); |
| goto err_out; |
| + } |
| |
| err = -ENXIO; |
| width = of_get_property(dp, "bank-width", NULL); |
| @@ -240,15 +232,6 @@ static int of_flash_probe(struct platform_device *dev) |
| if (err) |
| goto err_out; |
| |
| - 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); |
| |
| /* |
| -- |
| 2.20.1 |
| |