]> git.baikalelectronics.ru Git - kernel.git/commit
PCI: rockchip: Register IRQ handlers after device and data are ready
authorJavier Martinez Canillas <javierm@redhat.com>
Tue, 8 Jun 2021 08:04:09 +0000 (10:04 +0200)
committerBjorn Helgaas <bhelgaas@google.com>
Thu, 1 Jul 2021 13:46:52 +0000 (08:46 -0500)
commitd16d5ef8183742ea86c2e5438f18f161d82fc3cc
treefd7376c87dc9fe7b0913db91fa750f52d5a2338e
parent78f0a5f86683713bf30eae653c023ab078a37264
PCI: rockchip: Register IRQ handlers after device and data are ready

An IRQ handler may be called at any time after it is registered, so
anything it relies on must be ready before registration.

rockchip_pcie_subsys_irq_handler() and rockchip_pcie_client_irq_handler()
read registers in the PCIe controller, but we registered them before
turning on clocks to the controller.  If either is called before the clocks
are turned on, the register reads fail and the machine hangs.

Similarly, rockchip_pcie_legacy_int_handler() uses rockchip->irq_domain,
but we installed it before initializing irq_domain.

Register IRQ handlers after their data structures are initialized and
clocks are enabled.

Found by enabling CONFIG_DEBUG_SHIRQ, which calls the IRQ handler when it
is being unregistered.  An error during the probe path might cause this
unregistration and IRQ handler execution before the device or data
structure init has finished.

[bhelgaas: commit log]
Link: https://lore.kernel.org/r/20210608080409.1729276-1-javierm@redhat.com
Reported-by: Peter Robinson <pbrobinson@gmail.com>
Tested-by: Peter Robinson <pbrobinson@gmail.com>
Signed-off-by: Javier Martinez Canillas <javierm@redhat.com>
Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Acked-by: Shawn Lin <shawn.lin@rock-chips.com>
drivers/pci/controller/pcie-rockchip-host.c