On Tue, 2015-10-13 at 16:42 +0200, Lars-Peter Clausen wrote:
On 10/13/2015 04:18 PM, Koro Chen wrote:
On Tue, 2015-10-13 at 15:44 +0200, Lars-Peter Clausen wrote:
On 10/13/2015 03:37 PM, Koro Chen wrote:
The patch "ASoC: Prevent components from being bound to multiple cards" adds check to prevent multiple cards from using the same component. However, snd_soc_register_platform() or snd_soc_register_codec() will also create components, and sharing the same platform by multiple cards is then refused. This happens with a platform having multiple independent DAIs that share the same DMA controller.
Relax the condition by checking component->registered_as_component, which is only true in case of snd_soc_register_component() and will be false for components created by snd_soc_register_platform() or snd_soc_register_codec().
Binding a component to multiple cards results in internal data structure corruption, regardless of whether it is a raw component, CODEC or platform, which is why the check was added. So the proposed change wont work.
Thanks for your comment. Is it possible to share an example of how the data structure will be corrupted? So I can study into this further.
Just look at soc_probe_component() and think about what happens if that runs twice for two different cards. Multiple calls to list_add() on the same list, controls are added multiple times, DAPM widgets are created multiple times, the card field will only point to the last card.
When multiple binding happens, soc_probe_component() just returns zero without doing anything after this patch (actually it also returned zero before the patch "ASoC: Prevent components from being bound to multiple cards"). So the component still binds to the first card. For this case I think it should be fine?
Linux-mediatek mailing list Linux-mediatek@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-mediatek