From: Pierre-Louis Bossart <[email protected]>

The interrupt handling in SoundWire requires software to re-read the
interrupt status after clearing an interrupt. In case the interrupt is
still outstanding, the code in bus.c will loop a number of times,
however that loop is limited to the interrupts detected in the first
read. This strategy helps meet SoundWire requirements without
remaining forever in an interrupt handler.

Add a couple of comments to document this design.

Signed-off-by: Pierre-Louis Bossart <[email protected]>
Reviewed-by: Guennadi Liakhovetski <[email protected]>
Signed-off-by: Bard Liao <[email protected]>
---
 drivers/soundwire/bus.c | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/drivers/soundwire/bus.c b/drivers/soundwire/bus.c
index ffe4600fd95b..45131b9f5080 100644
--- a/drivers/soundwire/bus.c
+++ b/drivers/soundwire/bus.c
@@ -1334,6 +1334,7 @@ static int sdw_handle_dp0_interrupt(struct sdw_slave 
*slave, u8 *slave_status)
                                "SDW_DP0_INT read failed:%d\n", status2);
                        return status2;
                }
+               /* filter to limit loop to interrupts identified in the first 
status read */
                status &= status2;
 
                count++;
@@ -1404,6 +1405,7 @@ static int sdw_handle_port_interrupt(struct sdw_slave 
*slave,
                                "SDW_DPN_INT read failed:%d\n", status2);
                        return status2;
                }
+               /* filter to limit loop to interrupts identified in the first 
status read */
                status &= status2;
 
                count++;
@@ -1589,7 +1591,10 @@ static int sdw_handle_slave_alerts(struct sdw_slave 
*slave)
                        sdca_cascade = ret & SDW_DP0_SDCA_CASCADE;
                }
 
-               /* Make sure no interrupts are pending */
+               /*
+                * Make sure no interrupts are pending, but filter to limit loop
+                * to interrupts identified in the first status read
+                */
                buf &= _buf;
                buf2[0] &= _buf2[0];
                buf2[1] &= _buf2[1];
-- 
2.17.1

Reply via email to