[alsa-devel] [PATCH] ASoC: hda: increment codec device refcount when it is added to the card
Ranjani Sridharan
ranjani.sridharan at linux.intel.com
Fri May 31 17:43:53 CEST 2019
> > Hi Takashi,
> >
> > No, this actually comes at the second step in the case of SOF (ie
> > after
> > the machine driver is unregistered).
> >
> > Actually, I just found out what's causing the issue. It is the call
> > to
> > snd_hda_codec_dev_free() which calls put_device() when
> > snd_card_free()
> > is invoked. So, adding a get_device() in snd_hda_codec_device_new()
> > would make the refcount balanced.
> >
> > On the other hand, removing the put_device() in
> > snd_hda_codec_dev_free() would also address the problem. I'm not
> > sure
> > which would be the preferred route.
>
> The latter one, I'd say.
>
> Actually the difference between ASoC and the legacy HDA bus is who
> releases the device object. For HDA legacy bus, it's supposed to be
> done via snd_device_free() chain, while ASoC bus releases explicitly
> as shown in my previous post.
>
> So, if any, I'd paper over it like below.
OK, makes sense. Let me send a V2 with the change.
Also, should I also look into adding the change to make hdac_hdmi codec
card managed as well?
Thanks,
Ranjani
>
>
> thanks,
>
> Takashi
>
> --- a/sound/pci/hda/hda_codec.c
> +++ b/sound/pci/hda/hda_codec.c
> @@ -840,7 +840,12 @@ static int snd_hda_codec_dev_free(struct
> snd_device *device)
> if (codec->core.type == HDA_DEV_LEGACY)
> snd_hdac_device_unregister(&codec->core);
> codec_display_power(codec, false);
> - put_device(hda_codec_dev(codec));
> + /*
> + * again, ASoC HD-audio bus manages differently; it's released
> in
> + * snd_hdac_ext_bus_device_remove() explicitly
> + */
> + if (codec->core.type == HDA_DEV_LEGACY)
> + put_device(hda_codec_dev(codec));
> return 0;
> }
>
More information about the Alsa-devel
mailing list