| From a1068045883ed4a18363a4ebad0c3d55e473b716 Mon Sep 17 00:00:00 2001 |
| From: Vinod Koul <vinod.koul@intel.com> |
| Date: Thu, 7 Jan 2016 21:48:14 +0530 |
| Subject: ASoC: compress: Fix compress device direction check |
| |
| From: Vinod Koul <vinod.koul@intel.com> |
| |
| commit a1068045883ed4a18363a4ebad0c3d55e473b716 upstream. |
| |
| The detection of direction for compress was only taking into account codec |
| capabilities and not CPU ones. Fix this by checking the CPU side capabilities |
| as well |
| |
| Tested-by: Ashish Panwar <ashish.panwar@intel.com> |
| Signed-off-by: Vinod Koul <vinod.koul@intel.com> |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| sound/soc/soc-compress.c | 23 ++++++++++++++++++++--- |
| 1 file changed, 20 insertions(+), 3 deletions(-) |
| |
| --- a/sound/soc/soc-compress.c |
| +++ b/sound/soc/soc-compress.c |
| @@ -623,6 +623,7 @@ int soc_new_compress(struct snd_soc_pcm_ |
| 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"); |
| @@ -634,11 +635,27 @@ int soc_new_compress(struct snd_soc_pcm_ |
| 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) { |