• Richard Fitzgerald's avatar
    ASoC: cs35l56: Fix to ensure ASP1 registers match cache · 72a77d76
    Richard Fitzgerald authored
    Add a dummy SUPPLY widget connected to the ASP that forces the
    chip registers to match the regmap cache when the ASP is
    powered-up.
    
    On a SoundWire system the ASP is free for use as a chip-to-chip
    interconnect. This can be either for the firmware on multiple
    CS35L56 to share reference audio; or as a bridge to another
    device. If it is a firmware interconnect it is owned by the
    firmware and the Linux driver should avoid writing the registers.
    However. If it is a bridge then Linux may take over and handle
    it as a normal codec-to-codec link.
    
    CS35L56 is designed for SDCA and a generic SDCA driver would
    know nothing about these chip-specific registers. So if the
    ASP is being used on a SoundWire system the firmware sets up the
    ASP registers. This means that we can't assume the default
    state of the ASP registers. But we don't know the initial state
    that the firmware set them to until after the firmware has been
    downloaded and booted, which can take several seconds when
    downloading multiple amps.
    
    To avoid blocking probe() for several seconds waiting for the
    firmware, the silicon defaults are assumed. This allows the machine
    driver to setup the ASP configuration during probe() without being
    blocked. If the ASP is hooked up and used, the SUPPLY widget
    ensures that the chip registers match what was configured in the
    regmap cache.
    
    If the machine driver does not hook up the ASP, it is assumed that
    it won't call any functions to configure the ASP DAI. Therefore
    the regmap cache will be clean for these registers so a
    regcache_sync() will not overwrite the chip registers. If the
    DAI is not hooked up, the dummy SUPPLY widget will not be
    invoked so it will never force-overwrite the chip registers.
    
    Backport note:
    This won't apply cleanly to kernels older than v6.6.
    Signed-off-by: default avatarRichard Fitzgerald <rf@opensource.cirrus.com>
    Fixes: e4961125 ("ASoC: cs35l56: Add driver for Cirrus Logic CS35L56")
    Link: https://msgid.link/r/20240129162737.497-8-rf@opensource.cirrus.comSigned-off-by: default avatarMark Brown <broonie@kernel.org>
    72a77d76
cs35l56.h 10.3 KB