|
@@ -775,6 +775,9 @@ static int _snd_pcm_new(struct snd_card *card, const char *id, int device,
|
|
|
.dev_register = snd_pcm_dev_register,
|
|
|
.dev_disconnect = snd_pcm_dev_disconnect,
|
|
|
};
|
|
|
+ static struct snd_device_ops internal_ops = {
|
|
|
+ .dev_free = snd_pcm_dev_free,
|
|
|
+ };
|
|
|
|
|
|
if (snd_BUG_ON(!card))
|
|
|
return -ENXIO;
|
|
@@ -801,7 +804,8 @@ static int _snd_pcm_new(struct snd_card *card, const char *id, int device,
|
|
|
if (err < 0)
|
|
|
goto free_pcm;
|
|
|
|
|
|
- err = snd_device_new(card, SNDRV_DEV_PCM, pcm, &ops);
|
|
|
+ err = snd_device_new(card, SNDRV_DEV_PCM, pcm,
|
|
|
+ internal ? &internal_ops : &ops);
|
|
|
if (err < 0)
|
|
|
goto free_pcm;
|
|
|
|
|
@@ -1099,8 +1103,6 @@ static int snd_pcm_dev_register(struct snd_device *device)
|
|
|
if (snd_BUG_ON(!device || !device->device_data))
|
|
|
return -ENXIO;
|
|
|
pcm = device->device_data;
|
|
|
- if (pcm->internal)
|
|
|
- return 0;
|
|
|
|
|
|
mutex_lock(®ister_mutex);
|
|
|
err = snd_pcm_add(pcm);
|
|
@@ -1159,12 +1161,10 @@ static int snd_pcm_dev_disconnect(struct snd_device *device)
|
|
|
snd_pcm_stream_unlock_irq(substream);
|
|
|
}
|
|
|
}
|
|
|
- if (!pcm->internal) {
|
|
|
- pcm_call_notify(pcm, n_disconnect);
|
|
|
- }
|
|
|
+
|
|
|
+ pcm_call_notify(pcm, n_disconnect);
|
|
|
for (cidx = 0; cidx < 2; cidx++) {
|
|
|
- if (!pcm->internal)
|
|
|
- snd_unregister_device(&pcm->streams[cidx].dev);
|
|
|
+ snd_unregister_device(&pcm->streams[cidx].dev);
|
|
|
free_chmap(&pcm->streams[cidx]);
|
|
|
}
|
|
|
mutex_unlock(&pcm->open_mutex);
|