|
@@ -630,6 +630,7 @@ int snd_soc_new_compress(struct snd_soc_pcm_runtime *rtd, int num)
|
|
|
struct snd_pcm *be_pcm;
|
|
|
char new_name[64];
|
|
|
int ret = 0, direction = 0;
|
|
|
+ int playback = 0, capture = 0;
|
|
|
|
|
|
if (rtd->num_codecs > 1) {
|
|
|
dev_err(rtd->card->dev, "Multicodec not supported for compressed stream\n");
|
|
@@ -641,11 +642,27 @@ int snd_soc_new_compress(struct snd_soc_pcm_runtime *rtd, int num)
|
|
|
rtd->dai_link->stream_name, codec_dai->name, num);
|
|
|
|
|
|
if (codec_dai->driver->playback.channels_min)
|
|
|
+ playback = 1;
|
|
|
+ if (codec_dai->driver->capture.channels_min)
|
|
|
+ capture = 1;
|
|
|
+
|
|
|
+ capture = capture && cpu_dai->driver->capture.channels_min;
|
|
|
+ playback = playback && cpu_dai->driver->playback.channels_min;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Compress devices are unidirectional so only one of the directions
|
|
|
+ * should be set, check for that (xor)
|
|
|
+ */
|
|
|
+ if (playback + capture != 1) {
|
|
|
+ dev_err(rtd->card->dev, "Invalid direction for compress P %d, C %d\n",
|
|
|
+ playback, capture);
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(playback)
|
|
|
direction = SND_COMPRESS_PLAYBACK;
|
|
|
- else if (codec_dai->driver->capture.channels_min)
|
|
|
- direction = SND_COMPRESS_CAPTURE;
|
|
|
else
|
|
|
- return -EINVAL;
|
|
|
+ direction = SND_COMPRESS_CAPTURE;
|
|
|
|
|
|
compr = kzalloc(sizeof(*compr), GFP_KERNEL);
|
|
|
if (compr == NULL) {
|