--- /dev/null
+From 18f77393796848e68909e65d692c1d1436f06e06 Mon Sep 17 00:00:00 2001
+From: Martin Kaiser <martin@kaiser.cx>
+Date: Tue, 17 Oct 2017 22:53:08 +0200
+Subject: mfd: fsl-imx25: Clean up irq settings during removal
+
+From: Martin Kaiser <martin@kaiser.cx>
+
+commit 18f77393796848e68909e65d692c1d1436f06e06 upstream.
+
+When fsl-imx25-tsadc is compiled as a module, loading, unloading and
+reloading the module will lead to a crash.
+
+Unable to handle kernel paging request at virtual address bf005430
+[<c004df6c>] (irq_find_matching_fwspec)
+ from [<c028d5ec>] (of_irq_get+0x58/0x74)
+[<c028d594>] (of_irq_get)
+ from [<c01ff970>] (platform_get_irq+0x48/0xc8)
+[<c01ff928>] (platform_get_irq)
+ from [<bf00e33c>] (mx25_tsadc_probe+0x220/0x2f4 [fsl_imx25_tsadc])
+
+irq_find_matching_fwspec() loops over all registered irq domains. The
+irq domain is still registered from last time the module was loaded but
+the pointer to its operations is invalid after the module was unloaded.
+
+Add a removal function which clears the irq handler and removes the irq
+domain. With this cleanup in place, it's possible to unload and reload
+the module.
+
+Signed-off-by: Martin Kaiser <martin@kaiser.cx>
+Reviewed-by: Lucas Stach <l.stach@pengutronix.de>
+Signed-off-by: Lee Jones <lee.jones@linaro.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/mfd/fsl-imx25-tsadc.c | 14 ++++++++++++++
+ 1 file changed, 14 insertions(+)
+
+--- a/drivers/mfd/fsl-imx25-tsadc.c
++++ b/drivers/mfd/fsl-imx25-tsadc.c
+@@ -180,6 +180,19 @@ static int mx25_tsadc_probe(struct platf
+ return devm_of_platform_populate(dev);
+ }
+
++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);
++ }
++
++ return 0;
++}
++
+ static const struct of_device_id mx25_tsadc_ids[] = {
+ { .compatible = "fsl,imx25-tsadc" },
+ { /* Sentinel */ }
+@@ -192,6 +205,7 @@ static struct platform_driver mx25_tsadc
+ .of_match_table = of_match_ptr(mx25_tsadc_ids),
+ },
+ .probe = mx25_tsadc_probe,
++ .remove = mx25_tsadc_remove,
+ };
+ module_platform_driver(mx25_tsadc_driver);
+