• Aidan MacDonald's avatar
    mfd: qcom-pm8008: Fix swapped mask/unmask in irq chip · 172a2937
    Aidan MacDonald authored
    The usual behavior of mask registers is writing a '1' bit to
    disable (mask) an interrupt; similarly, writing a '1' bit to
    an unmask register enables (unmasks) an interrupt.
    
    Due to a longstanding issue in regmap-irq, mask and unmask
    registers were inverted when both kinds of registers were
    present on the same chip, ie. regmap-irq actually wrote '1's
    to the mask register to enable an IRQ and '1's to the unmask
    register to disable an IRQ.
    
    This was fixed by commit e8ffb12e ("regmap-irq: Fix
    inverted handling of unmask registers") but the fix is opt-in
    via mask_unmask_non_inverted = true because it requires manual
    changes for each affected driver. The new behavior will become
    the default once all drivers have been updated.
    
    The PM8008 appears to rely on the inverted behavior. It has
    separate set & clear registers for a register called INT_EN,
    which presumably enables interrupts by writing '1's. Opt in
    to the new non-inverted behavior & swap mask_base/unmask_base.
    Signed-off-by: default avatarAidan MacDonald <aidanmacdonald.0x0@gmail.com>
    Signed-off-by: default avatarLee Jones <lee@kernel.org>
    Link: https://lore.kernel.org/r/20230216222214.138671-2-aidanmacdonald.0x0@gmail.com
    172a2937
qcom-pm8008.c 6.85 KB