mfd: fsl-imx25: Fix an error handling path in mx25_tsadc_setup_irq()
authorChristophe JAILLET <christophe.jaillet@wanadoo.fr>
Sun, 31 Jul 2022 12:06:23 +0000 (14:06 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 26 Oct 2022 10:35:17 +0000 (12:35 +0200)
[ Upstream commit 3fa9e4cfb55da512ebfd57336fde468830719298 ]

If devm_of_platform_populate() fails, some resources need to be
released.

Introduce a mx25_tsadc_unset_irq() function that undoes
mx25_tsadc_setup_irq() and call it both from the new error handling path
of the probe and in the remove function.

Fixes: a55196eff6d6 ("mfd: fsl-imx25: Use devm_of_platform_populate()")
Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
Signed-off-by: Lee Jones <lee@kernel.org>
Link: https://lore.kernel.org/r/d404e04828fc06bcfddf81f9f3e9b4babbe35415.1659269156.git.christophe.jaillet@wanadoo.fr
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/mfd/fsl-imx25-tsadc.c

index 37e5e02..85f7982 100644 (file)
@@ -84,6 +84,19 @@ static int mx25_tsadc_setup_irq(struct platform_device *pdev,
        return 0;
 }
 
+static int mx25_tsadc_unset_irq(struct platform_device *pdev)
+{
+       struct mx25_tsadc *tsadc = platform_get_drvdata(pdev);
+       int irq = platform_get_irq(pdev, 0);
+
+       if (irq) {
+               irq_set_chained_handler_and_data(irq, NULL, NULL);
+               irq_domain_remove(tsadc->domain);
+       }
+
+       return 0;
+}
+
 static void mx25_tsadc_setup_clk(struct platform_device *pdev,
                                 struct mx25_tsadc *tsadc)
 {
@@ -171,18 +184,21 @@ static int mx25_tsadc_probe(struct platform_device *pdev)
 
        platform_set_drvdata(pdev, tsadc);
 
-       return devm_of_platform_populate(dev);
+       ret = devm_of_platform_populate(dev);
+       if (ret)
+               goto err_irq;
+
+       return 0;
+
+err_irq:
+       mx25_tsadc_unset_irq(pdev);
+
+       return ret;
 }
 
 static int mx25_tsadc_remove(struct platform_device *pdev)
 {
-       struct mx25_tsadc *tsadc = platform_get_drvdata(pdev);
-       int irq = platform_get_irq(pdev, 0);
-
-       if (irq) {
-               irq_set_chained_handler_and_data(irq, NULL, NULL);
-               irq_domain_remove(tsadc->domain);
-       }
+       mx25_tsadc_unset_irq(pdev);
 
        return 0;
 }