Hi,
I have 4 dai_link instances as below. (the codec_name and platform_name are the same for all the 4 instances)
struct snd_soc_dai_link mfld_msic_dailink[] = { { .name = "Intel MSIC Headset", .stream_name = "Codec", .cpu_dai_name = "Headset-cpu-dai", .codec_dai_name = "Intel MSIC Headset", .codec_name = "mid-msic-codec", .platform_name = "mid-audio-platform", .init = msic_init, }, { .name = "Intel MSIC Speaker", .stream_name = "Speaker", .cpu_dai_name = "Speaker-cpu-dai", .codec_dai_name = "Intel MSIC Speaker", .codec_name = "mid-msic-codec", .platform_name = "mid-audio-platform", .init = NULL, }, { .name = "Intel MSIC Vibra", .stream_name = "Vibra1", .cpu_dai_name = "Vibra 1-cpu-dai", .codec_dai_name = "Intel MSIC Vibra", .codec_name = "mid-msic-codec", .platform_name = "mid-audio-platform", .init = NULL, }, { .name = "Intel MSIC Haptic", .stream_name = "Vibra2", .cpu_dai_name = "Vibra 2-cpu-dai", .codec_dai_name = "Intel MSIC Haptic", .codec_name = "mid-msic-codec", .platform_name = "mid-audio-platform", .init = NULL, }, };
When the soc_bind_dai_link is called For every dai_link instance, reference to codec, platform and cpu_dai are taken
When soc_remove_dai_link is called, the reference is released as follows For cpu_dai after checking if cpu_dai->probed is 1
For codec and platform, it checks for codec->probed and platform->probed So for the first instance of dai_link, the reference of codec and platform are removed correctly but for the other instances, it finds that codec->probed and platform->probed are 0 and does not remove the reference. As a result, the reference count of codec and platform drivers remain as 3 and the rmmod on those driver modules fail.
Is there anything that I am doing wrong here or missing out?
Thanks, Harsha