On Tue, Jun 05, 2012 at 02:24:47PM -0600, Stephen Warren wrote:
Initially, I thought that snd_soc_dapm_new_dai_widgets() could just return if the DAI already had widgets, but that doesn't work, since the widgets were created for the wrong DAPM context - the I2S1 DAP DAI's rather than the I2S CODEC's.
Perhaps instead of blindly probing the CPU DAI, soc_probe_dai_link() should check whether that DAI is part of a CODEC, and instead of calling try_module_get() and snd_soc_dapm_new_dai_widgets(), it should just call soc_probe_codec() on the parent CODEC (guarded by whether the CODEC was already probed). Does that sound right? I'm attempting to make that work now, in case it's right.
No, we should just probe CODECs sensibly before we do any of the DAIs instead of trying to guess what we're doing in the middle of handling the DAI links. Your changes will be making the logic even more complicated here, it should be getting simpler - the reason this blew up for you is that the probe logic is already far too baroque. Given the data we have it'll boil down to similar checks bit it'll be in a clear, comprehensible CODEC probe step rather than intertwined with other stuff. This will also mean that aux_devs make more sense.