• Ranjani Sridharan's avatar
    soundwire: intel: improve suspend flows · 8ddeafb9
    Ranjani Sridharan authored
    This patch provides both a simplification of the suspend flows and a
    better balanced operation during suspend/resume transition, as part of
    the transition of Sound Open Firmware (SOF) to dynamic pipelines: the
    DSP resources are only enabled when required instead of enabled on
    startup.
    
    The exiting code relies on a convoluted way of dealing with suspend
    signals. Since there is no .suspend DAI callback, we used the
    component .suspend and marked all the component DAI dmas as
    'suspended'. The information was used in the .prepare stage to
    differentiate resume operations from xrun handling, and only
    reinitialize SHIM registers and DMA in the former case.
    
    While this solution has been working reliably for about 2 years, there
    is a much better solution consisting in trapping the TRIGGER_SUSPEND
    in the .trigger DAI ops. The DMA is still marked in the same way for
    the .prepare op to run, but in addition the callbacks sent to DSP
    firmware are now balanced.
    
    Normal operation:
    hw_params -> intel_params_stream
    hw_free   -> intel_free_stream
    
    suspend    -> intel_free_stream
    prepare    -> intel_params_stream
    
    This balanced operation was not required with existing SOF firmware
    relying on static pipelines instantiated at every boot. With the
    on-going transition to dynamic pipelines, it's however a requirement
    to keep the use count for the DAI widget balanced across all
    transitions.
    
    The component suspend is not removed but instead modified to deal with
    a corner case: when a substream is PAUSED, the ALSA core does not
    throw the TRIGGER_SUSPEND. This is problematic since the refcount for
    all pipelines and widgets is not balanced, leading to issues on
    resume. The trigger callback keeps track of the 'paused' state with a
    new flag, which is tested during the component suspend called later to
    release the remaining DSP resources. These resources will be
    re-enabled in the .prepare step.
    
    The IPC used in the TRIGGER_SUSPEND to release DSP resources is not a
    problem since the BE dailink is already marked as non-atomic.
    Co-developed-by: default avatarPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
    Signed-off-by: default avatarPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
    Signed-off-by: default avatarRanjani Sridharan <ranjani.sridharan@linux.intel.com>
    Signed-off-by: default avatarBard Liao <yung-chuan.liao@linux.intel.com>
    Acked-By: default avatarVinod Koul <vkoul@kernel.org>
    Link: https://lore.kernel.org/r/20211224021034.26635-4-yung-chuan.liao@linux.intel.comSigned-off-by: default avatarMark Brown <broonie@kernel.org>
    8ddeafb9
intel.c 52.4 KB