]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
4.9-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 18 Dec 2017 09:39:12 +0000 (10:39 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 18 Dec 2017 09:39:12 +0000 (10:39 +0100)
added patches:
mfd-fsl-imx25-clean-up-irq-settings-during-removal.patch

queue-4.9/mfd-fsl-imx25-clean-up-irq-settings-during-removal.patch [new file with mode: 0644]

diff --git a/queue-4.9/mfd-fsl-imx25-clean-up-irq-settings-during-removal.patch b/queue-4.9/mfd-fsl-imx25-clean-up-irq-settings-during-removal.patch
new file mode 100644 (file)
index 0000000..239ce3a
--- /dev/null
@@ -0,0 +1,67 @@
+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
+@@ -183,6 +183,19 @@ static int mx25_tsadc_probe(struct platf
+       return 0;
+ }
++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 */ }
+@@ -194,6 +207,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);