| From eae61d1515e2e50aeaa915e65dc191b47a25dba9 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Sun, 25 Aug 2024 20:05:24 +0200 |
| Subject: soc: versatile: realview: fix soc_dev leak during device remove |
| |
| From: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org> |
| |
| [ Upstream commit c774f2564c0086c23f5269fd4691f233756bf075 ] |
| |
| If device is unbound, the soc_dev should be unregistered to prevent |
| memory leak. |
| |
| Fixes: a2974c9c1f83 ("soc: add driver for the ARM RealView") |
| Cc: stable@vger.kernel.org |
| Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org> |
| Link: https://lore.kernel.org/20240825-soc-dev-fixes-v1-3-ff4b35abed83@linaro.org |
| Signed-off-by: Linus Walleij <linus.walleij@linaro.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/soc/versatile/soc-realview.c | 13 +++++++++++++ |
| 1 file changed, 13 insertions(+) |
| |
| diff --git a/drivers/soc/versatile/soc-realview.c b/drivers/soc/versatile/soc-realview.c |
| index 98b6c60de7f64..a9220701c190b 100644 |
| --- a/drivers/soc/versatile/soc-realview.c |
| +++ b/drivers/soc/versatile/soc-realview.c |
| @@ -8,6 +8,7 @@ |
| * published by the Free Software Foundation. |
| * |
| */ |
| +#include <linux/device.h> |
| #include <linux/init.h> |
| #include <linux/io.h> |
| #include <linux/slab.h> |
| @@ -83,6 +84,13 @@ static ssize_t realview_get_build(struct device *dev, |
| static struct device_attribute realview_build_attr = |
| __ATTR(build, S_IRUGO, realview_get_build, NULL); |
| |
| +static void realview_soc_socdev_release(void *data) |
| +{ |
| + struct soc_device *soc_dev = data; |
| + |
| + soc_device_unregister(soc_dev); |
| +} |
| + |
| static int realview_soc_probe(struct platform_device *pdev) |
| { |
| struct regmap *syscon_regmap; |
| @@ -110,6 +118,11 @@ static int realview_soc_probe(struct platform_device *pdev) |
| if (IS_ERR(soc_dev)) |
| return -ENODEV; |
| |
| + ret = devm_add_action_or_reset(&pdev->dev, realview_soc_socdev_release, |
| + soc_dev); |
| + if (ret) |
| + return ret; |
| + |
| ret = regmap_read(syscon_regmap, REALVIEW_SYS_ID_OFFSET, |
| &realview_coreid); |
| if (ret) |
| -- |
| 2.43.0 |
| |