diff mbox series

[2/2] thermal/drivers/mediatek: unmap foreign MMIO after probing

Message ID 20230529162056.3786301-3-uwu@icenowy.me (mailing list archive)
State New, archived
Headers show
Series thermal/drivers/mediatek: fix a regression affecting other subsystems | expand

Commit Message

Icenowy Zheng May 29, 2023, 4:20 p.m. UTC
The MMIO space from auxadc and apmixedsys devices are only needed when
initializing the thermal sensors, so these memory regions could be
safely unmapped after the probing process to prevent resource leak.

Unmap them at the end of the probe method, and route the unmap codepath
to early exits of the probe method for preventing leak when error
handling.

Signed-off-by: Icenowy Zheng <uwu@icenowy.me>
---
 drivers/thermal/mediatek/auxadc_thermal.c | 32 ++++++++++++++++-------
 1 file changed, 22 insertions(+), 10 deletions(-)
diff mbox series

Patch

diff --git a/drivers/thermal/mediatek/auxadc_thermal.c b/drivers/thermal/mediatek/auxadc_thermal.c
index f59d36de20a0..c010a96f9aca 100644
--- a/drivers/thermal/mediatek/auxadc_thermal.c
+++ b/drivers/thermal/mediatek/auxadc_thermal.c
@@ -1229,13 +1229,15 @@  static int mtk_thermal_probe(struct platform_device *pdev)
 
 	if (auxadc_phys_base == OF_BAD_ADDR) {
 		dev_err(&pdev->dev, "Can't get auxadc phys address\n");
-		return -EINVAL;
+		ret = -EINVAL;
+		goto out_unmap_auxadc;
 	}
 
 	apmixedsys = of_parse_phandle(np, "mediatek,apmixedsys", 0);
 	if (!apmixedsys) {
 		dev_err(&pdev->dev, "missing apmixedsys node\n");
-		return -ENODEV;
+		ret = -ENODEV;
+		goto out_unmap_auxadc;
 	}
 
 	apmixed_base = of_iomap(apmixedsys, 0);
@@ -1245,25 +1247,26 @@  static int mtk_thermal_probe(struct platform_device *pdev)
 
 	if (apmixed_phys_base == OF_BAD_ADDR) {
 		dev_err(&pdev->dev, "Can't get auxadc phys address\n");
-		return -EINVAL;
+		ret = -EINVAL;
+		goto out_unmap_apmixed;
 	}
 
 	ret = device_reset_optional(&pdev->dev);
 	if (ret)
-		return ret;
+		goto out_unmap_apmixed;
 
 	mt->clk_auxadc = devm_clk_get_enabled(&pdev->dev, "auxadc");
 	if (IS_ERR(mt->clk_auxadc)) {
 		ret = PTR_ERR(mt->clk_auxadc);
 		dev_err(&pdev->dev, "Can't enable auxadc clk: %d\n", ret);
-		return ret;
+		goto out_unmap_apmixed;
 	}
 
 	mt->clk_peri_therm = devm_clk_get_enabled(&pdev->dev, "therm");
 	if (IS_ERR(mt->clk_peri_therm)) {
 		ret = PTR_ERR(mt->clk_peri_therm);
 		dev_err(&pdev->dev, "Can't enable peri clk: %d\n", ret);
-		return ret;
+		goto out_unmap_apmixed;
 	}
 
 	mtk_thermal_turn_on_buffer(mt, apmixed_base);
@@ -1287,14 +1290,23 @@  static int mtk_thermal_probe(struct platform_device *pdev)
 
 	tzdev = devm_thermal_of_zone_register(&pdev->dev, 0, mt,
 					      &mtk_thermal_ops);
-	if (IS_ERR(tzdev))
-		return PTR_ERR(tzdev);
+	if (IS_ERR(tzdev)) {
+		ret = PTR_ERR(tzdev);
+		goto out_unmap_apmixed;
+	}
 
 	ret = devm_thermal_add_hwmon_sysfs(&pdev->dev, tzdev);
-	if (ret)
+	if (ret) {
 		dev_warn(&pdev->dev, "error in thermal_add_hwmon_sysfs");
+		ret = 0;
+	}
 
-	return 0;
+out_unmap_apmixed:
+	iounmap(apmixed_base);
+out_unmap_auxadc:
+	iounmap(auxadc_base);
+
+	return ret;
 }
 
 static struct platform_driver mtk_thermal_driver = {