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

Commit 4a194a45 authored by Deepak Katragadda's avatar Deepak Katragadda
Browse files

qcom: ssr: Free interrupts during subsys_unregister



When a subsystem driver calls subsys_unregister on a subsystem,
the SSR framework removes all instances of the subsystem.
Free the interrupts registered during subsys_register as well
during this time so that the call to request for these IRQs the
next time the subsystem is registered does not fail.

Change-Id: I8163415459c62f4f96ed7c89de9645f9e002c280
Signed-off-by: default avatarDeepak Katragadda <dkatraga@codeaurora.org>
parent 04ca8dc0
Loading
Loading
Loading
Loading
+17 −1
Original line number Diff line number Diff line
@@ -1378,6 +1378,20 @@ static int subsys_setup_irqs(struct subsys_device *subsys)
	return 0;
}

static void subsys_free_irqs(struct subsys_device *subsys)
{
	struct subsys_desc *desc = subsys->desc;

	if (desc->err_fatal_irq && desc->err_fatal_handler)
		devm_free_irq(desc->dev, desc->err_fatal_irq, desc);
	if (desc->stop_ack_irq && desc->stop_ack_handler)
		devm_free_irq(desc->dev, desc->stop_ack_irq, desc);
	if (desc->wdog_bite_irq && desc->wdog_bite_handler)
		devm_free_irq(desc->dev, desc->wdog_bite_irq, desc);
	if (desc->err_ready_irq)
		devm_free_irq(desc->dev, desc->err_ready_irq, subsys);
}

struct subsys_device *subsys_register(struct subsys_desc *desc)
{
	struct subsys_device *subsys;
@@ -1479,8 +1493,10 @@ void subsys_unregister(struct subsys_device *subsys)
				list_del(&subsys->list);
		mutex_unlock(&subsys_list_lock);

		if (device)
		if (device) {
			subsys_free_irqs(subsys);
			subsys_remove_restart_order(device);
		}
		mutex_lock(&subsys->track.lock);
		WARN_ON(subsys->count);
		device_unregister(&subsys->dev);