Hi Takashi-san
I think this is a good direction to at least start to mitigate these problems (which we really should be doing) and hopefully make it easier to do further improvements in future. There's obviously more places where we should be checking the flag (controls for example) but they can be added later. One thing I would like to see is instead of setting the flag directly when we see a problem call a function to do it. That way if we want to improve things in the future we can do that without having to update the callers again.
BTW, ALSA core has snd_card_disconnect() that does this kind of shut-up from user-space. It was introduced for hot-unplug, but basically unbinding is the software hot-unplug. So, if ASoC won't rebind a once-unbound component, you can simply call snd_card_disconnect() at the component unbinding time to assure that no further user actions can be done.
Thanks. I checked about snd_card_disconnect(), and it will be called from snd_card_free(). And it will be called from snd_soc_unregister_card() So, we can call snd_soc_unregister_card() whenever CPU/Codec/Platform were unregsiterd.
This method also solve random unbind/bind Oops too. Here, random unbind/bind example is that expected correct operation is unbind all CPU/Codec/Platfrom/Card, and then, bind all CPU/Codec/Platfrom/Card again. (here unbind order can be random) But this case, we will get Oops if unbind Codec -> bind Codec -> unbind Card. Using snd_soc_unregister_card() can solve this issue too.
Best regards --- Kuninori Morimoto