]> git.baikalelectronics.ru Git - kernel.git/commit
ASoC: core: Remove only the registered component in devm functions
authorMaxime Ripard <maxime@cerno.tech>
Tue, 7 Jul 2020 07:42:37 +0000 (09:42 +0200)
committerMark Brown <broonie@kernel.org>
Tue, 7 Jul 2020 10:55:46 +0000 (11:55 +0100)
commit8dc452d22531af8560b42f18000b166efe5aa53e
treea0214a054e227bdbbe13092f8e015335264defd1
parentd9ffa3e97d07fad52e03b1d29f340ff05a0a0979
ASoC: core: Remove only the registered component in devm functions

The ASoC devm_ functions that register a component
(devm_snd_soc_register_component and devm_snd_dmaengine_pcm_register) will
clean their component by running snd_soc_unregister_component.

snd_soc_unregister_component will then remove all the components for the
device that was used to register the component in the first place.

However, some drivers register several components (such as a DAI and a
dmaengine PCM) on the same device, and if the dmaengine PCM is registered
first, then the DAI will be cleaned up first and
snd_dmaengine_pcm_unregister will be called next.

snd_dmaengine_pcm_unregister will then lookup the dmaengine PCM component
on the device, and if there's one unregister that component and release its
dmaengine channels. That doesn't happen in practice though since the first
call to snd_soc_unregister_component removed all the components, so we
never get the chance to release the dmaengine channels.

In order to fix this, instead of removing all the components for a given
device, we can simply remove the component that was registered in the first
place. We should have the same number of component registration than we
have components, so it should work just fine.

Signed-off-by: Maxime Ripard <maxime@cerno.tech>
Link: https://lore.kernel.org/r/20200707074237.287171-1-maxime@cerno.tech
Signed-off-by: Mark Brown <broonie@kernel.org>
include/sound/soc.h
sound/soc/soc-core.c
sound/soc/soc-devres.c
sound/soc/soc-generic-dmaengine-pcm.c