• Richard Fitzgerald's avatar
    ASoC: cs42l42: Avoid stale SoundWire ATTACH after hard reset · 2d066c6a
    Richard Fitzgerald authored
    In SoundWire mode leave hard RESET asserted when exiting probe,
    and wait for an UNATTACHED notification before deasserting RESET.
    
    If the boot state of the reset GPIO was deasserted it is possible
    that the SoundWire core had already enumerated the CS42L42 before
    cs42l42_sdw_probe() is called. When cs42l42_common_probe() hard
    resets the CS42L42 it triggers a race condition:
    
    1) After cs42l42_sdw_probe() returns the thread that called it
       will call cs42l42_sdw_update_status() to report the last
       status recorded by the SoundWire core.
    
    2) The SoundWire bus master will see a PING with the CS42L42
       now reporting as unenumerated and will trigger the core
       SoundWire code to start enumerating CS42L42.
    
    These two threads are racing against each other. If (1)
    happens before (2) a stale ATTACHED notification will be
    reported to the cs42l42 driver when in fact the status of
    cs42l42 is now unattached.
    
    To avoid this race condition:
    
    - Leave RESET asserted on exit from cs42l42_sdw_probe().
      This ensures that an UNATTACHED notification must be
      sent to the cs42l42 driver. If cs42l42 was already
      enumerated it will be seen to drop off the bus, causing
      an UNATTACH notification. If it was never enumerated the
      status is already UNATTACHED and this will be reported
      by thread (1).
    
    - When the UNATTACH notification is received, release RESET.
      This will cause CS42L42 to be enumerated and eventually
      report an ATTACHED notification.
    
    - The ATTACHED notification is now valid.
    Signed-off-by: default avatarRichard Fitzgerald <rf@opensource.cirrus.com>
    Signed-off-by: default avatarStefan Binding <sbinding@opensource.cirrus.com>
    Link: https://lore.kernel.org/r/20230913150012.604775-4-sbinding@opensource.cirrus.comSigned-off-by: default avatarMark Brown <broonie@kernel.org>
    2d066c6a
cs42l42-sdw.c 17.1 KB