On Fri, Oct 07, 2011 at 02:12:43PM +0300, Péter Ujfalusi wrote:
On Friday 07 October 2011 11:48:01 Mark Brown wrote:
This might be true for machines, which adds jack functionality. We are now calling snd_soc_dapm_new_widgets before adding jack pins. Also machines passing their DAPM widgets/routes via snd_soc_card are safe from this issue.
No, it should never be needed by anything.
Could be, but day before yesterday the sdp4430 was fine. I've pulled yesterday morning, and welcomed me with a kernel crash at boot time.
You're missing the point here. A crash has been introduced but doing the syncs during startup should have been and should continue to be a waste of time with no useful impact on the behaviour of the system.
in soc-core.c: soc_post_component_init() the dai->init called, but there's no additional snd_soc_dapm_new_widgets call to make sure that the new widgets added by the machine driver are instantiated.
We could either go round every single machine driver in the kernel modifying them or we could make sure it's handled in the core - I know which of those seems better to me!
For sure fixing this in core is the best place. Try to boot smartq_wm8987, s3c24xx_simtec_tlv320aic23, s3c24xx_simtec_hermes, jive_wm8750, h1940_uda1380, etc. Lots of the machine drivers are calling soc_dapm_sync after adding widgets. They will crash. If we want to fix this in core we need to remove the soc_dapm_sync from _init calls, and add the snd_soc_dapm_new_widgets post dai_link->init call in soc_post_component_init of soc-core.c.
Removing the calls is a totally sensible thing to do, like I say they should at best be a waste of time. The problem with your patch was that weren't just removing them, you were replacing them with calls to new_widgets() which should be equally pointless. If we have to do that we're clearly failing at something.