Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8b645e4a authored by Takashi Iwai's avatar Takashi Iwai
Browse files

ALSA: pcm: Don't call register and disconnect callbacks for internal PCM



The internal PCM (aka DPCM backend PCM) doesn't need any registration
procedure, thus currently we bail out immediately at dev_register
callback.  Similarly, its counterpart, dev_disconnect callback, is
superfluous for the internal PCM.  For simplifying and avoiding the
conflicting disconnect call for internal PCM objects, this patch drops
dev_register and dev_disconnect callbacks for the internal ops.

The only uncertain thing by this action is whether skipping the PCM
state change to SNDRV_PCM_STATE_DISCONNECT for the internal PCM is
mandatory.  Looking through the current implementations, this doesn't
look so, hence dropping the whole dev_disconnect would make more
sense.

Tested-by: default avatarKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent c44027c8
Loading
Loading
Loading
Loading
+8 −8
Original line number Diff line number Diff line
@@ -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(&register_mutex);
	err = snd_pcm_add(pcm);
@@ -1159,11 +1161,9 @@ 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);
	}
	for (cidx = 0; cidx < 2; cidx++) {
		if (!pcm->internal)
		snd_unregister_device(&pcm->streams[cidx].dev);
		free_chmap(&pcm->streams[cidx]);
	}