Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 661382fe authored by Guennadi Liakhovetski's avatar Guennadi Liakhovetski Committed by Paul Mundt
Browse files

dma: shdma: don't register the global die notifier multiple times



A recent patch has added a die notifier to the shdma driver, however,
it registers a static die-notifier object in the probe routine, i.e.,
for each device instance. This is wrong and leads to a system lockup.
This patch moves the die notifier registration to module init and
exit routines respectively.

Reported-by: default avatarMagnus Damm <damm@opensource.se>
Signed-off-by: default avatarGuennadi Liakhovetski <g.liakhovetski@gmx.de>
Signed-off-by: default avatarPaul Mundt <lethal@linux-sh.org>
parent 3c0cb7c3
Loading
Loading
Loading
Loading
+7 −9
Original line number Diff line number Diff line
@@ -1110,11 +1110,6 @@ static int __init sh_dmae_probe(struct platform_device *pdev)
	list_add_tail_rcu(&shdev->node, &sh_dmae_devices);
	spin_unlock_irqrestore(&sh_dmae_lock, flags);

	/* Wire up NMI handling before bringing the controller online */
	err = register_die_notifier(&sh_dmae_nmi_notifier);
	if (err)
		goto notifier_err;

	/* reset dma controller */
	err = sh_dmae_rst(shdev);
	if (err)
@@ -1218,8 +1213,6 @@ static int __init sh_dmae_probe(struct platform_device *pdev)
eirq_err:
#endif
rst_err:
	unregister_die_notifier(&sh_dmae_nmi_notifier);
notifier_err:
	spin_lock_irqsave(&sh_dmae_lock, flags);
	list_del_rcu(&shdev->node);
	spin_unlock_irqrestore(&sh_dmae_lock, flags);
@@ -1252,8 +1245,6 @@ static int __exit sh_dmae_remove(struct platform_device *pdev)
	if (errirq > 0)
		free_irq(errirq, shdev);

	unregister_die_notifier(&sh_dmae_nmi_notifier);

	spin_lock_irqsave(&sh_dmae_lock, flags);
	list_del_rcu(&shdev->node);
	spin_unlock_irqrestore(&sh_dmae_lock, flags);
@@ -1296,6 +1287,11 @@ static struct platform_driver sh_dmae_driver = {

static int __init sh_dmae_init(void)
{
	/* Wire up NMI handling */
	int err = register_die_notifier(&sh_dmae_nmi_notifier);
	if (err)
		return err;

	return platform_driver_probe(&sh_dmae_driver, sh_dmae_probe);
}
module_init(sh_dmae_init);
@@ -1303,6 +1299,8 @@ module_init(sh_dmae_init);
static void __exit sh_dmae_exit(void)
{
	platform_driver_unregister(&sh_dmae_driver);

	unregister_die_notifier(&sh_dmae_nmi_notifier);
}
module_exit(sh_dmae_exit);