mfd: qcom-pm8008: Fix swapped mask/unmask in irq chip
authorAidan MacDonald <aidanmacdonald.0x0@gmail.com>
Thu, 16 Feb 2023 22:22:11 +0000 (22:22 +0000)
committerLee Jones <lee@kernel.org>
Wed, 26 Apr 2023 10:40:27 +0000 (11:40 +0100)
commit172a293707a55ba62e55a386eb601c8ef4824c85
tree0566a2f5eb0d038d2d46b056059a279a1528d704
parentc301311a523bcc48d6d626cbd4654463a105e089
mfd: qcom-pm8008: Fix swapped mask/unmask in irq chip

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 e8ffb12e7f06 ("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: Aidan MacDonald <aidanmacdonald.0x0@gmail.com>
Signed-off-by: Lee Jones <lee@kernel.org>
Link: https://lore.kernel.org/r/20230216222214.138671-2-aidanmacdonald.0x0@gmail.com
drivers/mfd/qcom-pm8008.c