soundwire: cadence_master: filter out bad interrupts
authorPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Fri, 10 Jan 2020 21:57:26 +0000 (15:57 -0600)
committerVinod Koul <vkoul@kernel.org>
Tue, 14 Jan 2020 06:23:12 +0000 (11:53 +0530)
If somehow we read the interrupt status while the IP is not powered
the result is probably undefined or 0xffffffff. We do know that some
of the bits are reserved and read as zero, so use as a filter to
discard invalid configurations.

Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Link: https://lore.kernel.org/r/20200110215731.30747-2-pierre-louis.bossart@linux.intel.com
Signed-off-by: Vinod Koul <vkoul@kernel.org>
drivers/soundwire/cadence_master.c

index fed21e2..a0ec21b 100644 (file)
@@ -74,6 +74,7 @@ MODULE_PARM_DESC(cdns_mcp_int_mask, "Cadence MCP IntMask");
 #define CDNS_MCP_INTMASK                       0x48
 
 #define CDNS_MCP_INT_IRQ                       BIT(31)
+#define CDNS_MCP_INT_RESERVED1                 GENMASK(30, 17)
 #define CDNS_MCP_INT_WAKEUP                    BIT(16)
 #define CDNS_MCP_INT_SLAVE_RSVD                        BIT(15)
 #define CDNS_MCP_INT_SLAVE_ALERT               BIT(14)
@@ -85,10 +86,12 @@ MODULE_PARM_DESC(cdns_mcp_int_mask, "Cadence MCP IntMask");
 #define CDNS_MCP_INT_DATA_CLASH                        BIT(9)
 #define CDNS_MCP_INT_PARITY                    BIT(8)
 #define CDNS_MCP_INT_CMD_ERR                   BIT(7)
+#define CDNS_MCP_INT_RESERVED2                 GENMASK(6, 4)
 #define CDNS_MCP_INT_RX_NE                     BIT(3)
 #define CDNS_MCP_INT_RX_WL                     BIT(2)
 #define CDNS_MCP_INT_TXE                       BIT(1)
 #define CDNS_MCP_INT_TXF                       BIT(0)
+#define CDNS_MCP_INT_RESERVED (CDNS_MCP_INT_RESERVED1 | CDNS_MCP_INT_RESERVED2)
 
 #define CDNS_MCP_INTSET                                0x4C
 
@@ -705,6 +708,10 @@ irqreturn_t sdw_cdns_irq(int irq, void *dev_id)
 
        int_status = cdns_readl(cdns, CDNS_MCP_INTSTAT);
 
+       /* check for reserved values read as zero */
+       if (int_status & CDNS_MCP_INT_RESERVED)
+               return IRQ_NONE;
+
        if (!(int_status & CDNS_MCP_INT_IRQ))
                return IRQ_NONE;