• Herve Codina's avatar
    genirq/generic_chip: Make irq_remove_generic_chip() irqdomain aware · 5e7afb2e
    Herve Codina authored
    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: cfefd21e ("genirq: Add chip suspend and resume callbacks")
    Signed-off-by: default avatarHerve Codina <herve.codina@bootlin.com>
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Cc: stable@vger.kernel.org
    Link: https://lore.kernel.org/r/20231024150335.322282-1-herve.codina@bootlin.com
    5e7afb2e
generic-chip.c 16.8 KB