soundwire: bus: don't clear SDCA_CASCADE bit
authorPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Tue, 26 Mar 2024 06:00:21 +0000 (06:00 +0000)
committerVinod Koul <vkoul@kernel.org>
Thu, 28 Mar 2024 18:14:04 +0000 (23:44 +0530)
The SDCA_CASCADE bit is a SoundWire 1.2 addition. It is technically in
the DP0_INT register, but SDCA interrupts shall not be handled as part
of the DP0 interrupt processing.

The existing code has clear comments that we don't want to touch the
SDCA_CASCADE bit, but it's actually cleared due to faulty logic dating
from SoundWire 1.0

In theory clearing this bit should have no effect: a cascade bit
remains set while all ORed status are set, but better safe than sorry.

Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Reviewed-by: Chao Song <chao.song@linux.intel.com>
Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com>
Link: https://lore.kernel.org/r/20240326060021.973501-1-yung-chuan.liao@linux.intel.com
Signed-off-by: Vinod Koul <vkoul@kernel.org>
drivers/soundwire/bus.c

index f3fec15c311229f7a1da48bfb3de416ed52a95d6..05b2db00d9cd27be7521f9cac9bb30d158b09ebd 100644 (file)
@@ -1474,7 +1474,7 @@ static int sdw_handle_dp0_interrupt(struct sdw_slave *slave, u8 *slave_status)
        }
 
        do {
-               clear = status & ~SDW_DP0_INTERRUPTS;
+               clear = status & ~(SDW_DP0_INTERRUPTS | SDW_DP0_SDCA_CASCADE);
 
                if (status & SDW_DP0_INT_TEST_FAIL) {
                        dev_err(&slave->dev, "Test fail for port 0\n");