• Charles Keepax's avatar
    ASoC: dapm: Fix handling of custom_stop_condition on DAPM graph walks · 8dd26dff
    Charles Keepax authored
    DPCM uses snd_soc_dapm_dai_get_connected_widgets to build a
    list of the widgets connected to a specific front end DAI so it
    can search through this list for available back end DAIs. The
    custom_stop_condition was added to is_connected_ep to facilitate this
    list not containing more widgets than is necessary. Doing so both
    speeds up the DPCM handling as less widgets need to be searched and
    avoids issues with CODEC to CODEC links as these would be confused
    with back end DAIs if they appeared in the list of available widgets.
    
    custom_stop_condition was implemented by aborting the graph walk
    when the condition is triggered, however there is an issue with this
    approach. Whilst walking the graph is_connected_ep should update the
    endpoints cache on each widget, if the walk is aborted the number
    of attached end points is unknown for that sub-graph. When the stop
    condition triggered, the original patch ignored the triggering widget
    and returned zero connected end points; a later patch updated this
    to set the triggering widget's cache to 1 and return that. Both of
    these approaches result in inaccurate values being stored in various
    end point caches as the values propagate back through the graph,
    which can result in later issues with widgets powering/not powering
    unexpectedly.
    
    As the original goal was to reduce the size of the widget list passed
    to the DPCM code, the simplest solution is to limit the functionality
    of the custom_stop_condition to the widget list. This means the rest
    of the graph will still be processed resulting in correct end point
    caches, but only widgets up to the stop condition will be added to the
    returned widget list.
    
    Fixes: 6742064a ("ASoC: dapm: support user-defined stop condition in dai_get_connected_widgets")
    Fixes: 5fdd022c ("ASoC: dpcm: play nice with CODEC<->CODEC links")
    Fixes: 09464974 ("ASoC: dapm: Fix to return correct path list in is_connected_ep.")
    Signed-off-by: default avatarCharles Keepax <ckeepax@opensource.cirrus.com>
    Link: https://lore.kernel.org/r/20190718084333.15598-1-ckeepax@opensource.cirrus.comSigned-off-by: default avatarMark Brown <broonie@kernel.org>
    8dd26dff
soc-dapm.c 118 KB