• Richard Fitzgerald's avatar
    ASoC: cs35l56: Fix for initializing ASP1 mixer registers · 07f7d6e7
    Richard Fitzgerald authored
    Defer initializing the state of the ASP1 mixer registers until
    the firmware has been downloaded and rebooted.
    
    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. Even if the ASP is used
    as a firmware-firmware interconnect it is useful to have
    ALSA controls for the ASP mixer. They are at least useful for
    debugging.
    
    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 mixer registers. This means that we can't assume the default
    state of these 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.
    
    DAPM normally reads the initial state of mux registers during
    probe() but this would mean blocking probe() for several seconds
    until the firmware has initialized them. To avoid this, the
    mixer muxes are set SND_SOC_NOPM to prevent DAPM trying to read
    the register state. Custom get/set callbacks are implemented for
    ALSA control access, and these can safely block waiting for the
    firmware download.
    
    After the firmware download has completed, the state of the
    mux registers is known so a work job is queued to call
    snd_soc_dapm_mux_update_power() on each of the mux widgets.
    
    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-11-rf@opensource.cirrus.comSigned-off-by: default avatarMark Brown <broonie@kernel.org>
    07f7d6e7
cs35l56.c 41.6 KB