mirror of
https://git.proxmox.com/git/mirror_ubuntu-kernels.git
synced 2025-12-15 17:33:06 +00:00
irq_remove_generic_chip() calculates the Linux interrupt number for removing the
handler and interrupt chip based on gc::irq_base as a linear function of
the bit positions of set bits in the @msk argument.
When the generic chip is present in an irq domain, i.e. created with a call
to irq_alloc_domain_generic_chips(), gc::irq_base contains not the base
Linux interrupt number. It contains the base hardware interrupt for this
chip. It is set to 0 for the first chip in the domain, 0 + N for the next
chip, where $N is the number of hardware interrupts per chip.
That means the Linux interrupt number cannot be calculated based on
gc::irq_base for irqdomain based chips without a domain map lookup, which
is currently missing.
Rework the code to take the irqdomain case into account and calculate the
Linux interrupt number by a irqdomain lookup of the domain specific
hardware interrupt number.
[ tglx: Massage changelog. Reshuffle the logic and add a proper comment. ]
Fixes:
|
||
|---|---|---|
| .. | ||
| affinity.c | ||
| autoprobe.c | ||
| chip.c | ||
| cpuhotplug.c | ||
| debug.h | ||
| debugfs.c | ||
| devres.c | ||
| dummychip.c | ||
| generic-chip.c | ||
| handle.c | ||
| internals.h | ||
| ipi-mux.c | ||
| ipi.c | ||
| irq_sim.c | ||
| irqdesc.c | ||
| irqdomain.c | ||
| Kconfig | ||
| Makefile | ||
| manage.c | ||
| matrix.c | ||
| migration.c | ||
| msi.c | ||
| pm.c | ||
| proc.c | ||
| resend.c | ||
| settings.h | ||
| spurious.c | ||
| timings.c | ||