diff options
author | Takashi Iwai <tiwai@suse.de> | 2015-02-27 17:43:19 +0100 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2015-03-03 11:26:24 +0100 |
commit | bbbc7e8502c95237dbd86cc4d0a12ca9a6b18c8f (patch) | |
tree | 71d5973b321c194ca5b9fd76592844eb37c4c9ed /sound/pci/hda/patch_si3054.c | |
parent | f4de8fe6cffb449a779dff61f071bd1af9e18e0f (diff) | |
download | op-kernel-dev-bbbc7e8502c95237dbd86cc4d0a12ca9a6b18c8f.zip op-kernel-dev-bbbc7e8502c95237dbd86cc4d0a12ca9a6b18c8f.tar.gz |
ALSA: hda - Allocate hda_pcm objects dynamically
So far, the hda_codec object kept the hda_pcm list in an array, and
the codec driver was expected to assign the array. However, this
makes the object life cycle management harder, because the assigned
array is freed at the codec driver detach while it might be still
accessed by the opened streams.
In this patch, we allocate each hda_pcm object dynamically and manage
it as a linked list. Each object has a kref refcount, and both the
codec driver binder and the PCM open/close touches it, so that the
object won't be freed while in use.
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/pci/hda/patch_si3054.c')
-rw-r--r-- | sound/pci/hda/patch_si3054.c | 11 |
1 files changed, 5 insertions, 6 deletions
diff --git a/sound/pci/hda/patch_si3054.c b/sound/pci/hda/patch_si3054.c index 38a4773..df24313 100644 --- a/sound/pci/hda/patch_si3054.c +++ b/sound/pci/hda/patch_si3054.c @@ -83,7 +83,6 @@ struct si3054_spec { unsigned international; - struct hda_pcm pcm; }; @@ -199,11 +198,11 @@ static const struct hda_pcm_stream si3054_pcm = { static int si3054_build_pcms(struct hda_codec *codec) { - struct si3054_spec *spec = codec->spec; - struct hda_pcm *info = &spec->pcm; - codec->num_pcms = 1; - codec->pcm_info = info; - info->name = "Si3054 Modem"; + struct hda_pcm *info; + + info = snd_hda_codec_pcm_new(codec, "Si3054 Modem"); + if (!info) + return -ENOMEM; info->stream[SNDRV_PCM_STREAM_PLAYBACK] = si3054_pcm; info->stream[SNDRV_PCM_STREAM_CAPTURE] = si3054_pcm; info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = codec->mfg; |