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)
committerLee Jones <lee@kernel.org>
Wed, 28 Sep 2022 15:09:50 +0000 (16:09 +0100)
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
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;
 }