• Pierre-Louis Bossart's avatar
    ASoC: rt711-sdca-sdw: fix race condition on system suspend · d2bf75f4
    Pierre-Louis Bossart authored
    In the initial driver we cancelled deferred work, but there is still a
    window of time where a new interrupt could result in new deferred work
    executed after the link is disabled, leading to an IO error. While we
    did not see this IO error on RT711-sdca-based platforms, the code pattern
    is similar to the RT700 case where the IO error was noted, so the fix
    is added for consistency.
    
    This patch uses an 'disable_irq_lock' mutex to prevent new interrupts
    from happening after the start of the system suspend. The choice of a
    mutex v. a spinlock is mainly due to the time required to clear
    interrupts, which requires a command to be transmitted by the
    SoundWire host IP and acknowledged with an interrupt. The
    'interrupt_callback' routine is also not meant to be called from an
    interrupt context.
    
    An additional 'disable_irq' flag prevents race conditions where the
    status changes before the interrupts are disabled, but the workqueue
    handling status changes is scheduled after the completion of the
    system suspend. On resume the interrupts are re-enabled already by the
    io_init routine so we only clear the flag.
    
    The code is slightly different from the other codecs since the
    interrupt callback deals with the SDCA interrupts, leading to a much
    larger section that's protected by the mutex. The SoundWire interrupt
    scheme requires a read after clearing a status, it's not clear from
    the specifications what would happen if SDCA interrupts are disabled
    in the middle of the sequence, so the entire interrupt status
    read/write is kept as is, even if in the end we discard the
    information.
    
    BugLink: https://github.com/thesofproject/linux/issues/2943
    Fixes: 7ad4d237 ('ASoC: rt711-sdca: Add RT711 SDCA vendor-specific driver')
    Signed-off-by: default avatarPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
    Reviewed-by: default avatarBard Liao <bard.liao@intel.com>
    Reviewed-by: default avatarPéter Ujfalusi <peter.ujfalusi@linux.intel.com>
    Link: https://lore.kernel.org/r/20210614180815.153711-6-pierre-louis.bossart@linux.intel.comSigned-off-by: default avatarMark Brown <broonie@kernel.org>
    d2bf75f4
rt711-sdca.c 43.8 KB