• Aidan MacDonald's avatar
    regmap-irq: Fix inverted handling of unmask registers · e8ffb12e
    Aidan MacDonald authored
    To me "unmask" suggests that we write 1s to the register when
    an interrupt is enabled. This also makes sense because it's the
    opposite of what the "mask" register does (write 1s to disable
    an interrupt).
    
    But regmap-irq does the opposite: for a disabled interrupt, it
    writes 1s to "unmask" and 0s to "mask". This is surprising and
    deviates from the usual way mask registers are handled.
    
    Additionally, mask_invert didn't interact with unmask registers
    properly -- it caused them to be ignored entirely.
    
    Fix this by making mask and unmask registers orthogonal, using
    the following behavior:
    
    * Mask registers are written with 1s for disabled interrupts.
    * Unmask registers are written with 1s for enabled interrupts.
    
    This behavior supports both normal or inverted mask registers
    and separate set/clear registers via different combinations of
    mask_base/unmask_base.
    
    The old unmask register behavior is deprecated. Drivers need to
    opt-in to the new behavior by setting mask_unmask_non_inverted.
    Warnings are issued if the driver relies on deprecated behavior.
    Chips that only set one of mask_base/unmask_base don't have to
    use the mask_unmask_non_inverted flag because that use case was
    previously not supported.
    
    The mask_invert flag is also deprecated in favor of describing
    inverted mask registers as unmask registers.
    Signed-off-by: default avatarAidan MacDonald <aidanmacdonald.0x0@gmail.com>
    Link: https://lore.kernel.org/r/20220623211420.918875-11-aidanmacdonald.0x0@gmail.comSigned-off-by: default avatarMark Brown <broonie@kernel.org>
    e8ffb12e
regmap-irq.c 32.7 KB