On Tue, Jan 13, 2015 at 11:18:53AM +0000, Qais Yousef wrote: > In soc_new_compress() when rtd->dai_link->daynmic is set, we create the pcm ^^^^^^^^ typo > substreams with this call: > > ret = snd_pcm_new_internal(rtd->card->snd_card, new_name, num, > 1, 0, &be_pcm); > > which passes 0 as capture_count leading to > > be_pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream > > being NULL, hence when trying to set rtd a few lines below we get an oops. It is a good practice to add the oops here
> > Fix by using rtd->dai_link->dpcm_playback and rtd->dai_link->dpcm_capture as > playback_count and capture_count to snd_pcm_new_internal(). > > Signed-off-by: Qais Yousef <qais.you...@imgtec.com> > Cc: Vinod Koul <vinod.k...@intel.com> > Cc: Liam Girdwood <lgirdw...@gmail.com> > Cc: Mark Brown <broo...@kernel.org> > Cc: Jaroslav Kysela <pe...@perex.cz> > Cc: Takashi Iwai <ti...@suse.de> > Cc: linux-kernel@vger.kernel.org > --- > v2->v1: > - use better way to fix it than just removing the line that caused the oops > > sound/soc/soc-compress.c | 9 ++++++--- > 1 file changed, 6 insertions(+), 3 deletions(-) > > diff --git a/sound/soc/soc-compress.c b/sound/soc/soc-compress.c > index 590a82f01d0b..27a668463ad7 100644 > --- a/sound/soc/soc-compress.c > +++ b/sound/soc/soc-compress.c > @@ -659,7 +659,8 @@ int soc_new_compress(struct snd_soc_pcm_runtime *rtd, int > num) > rtd->dai_link->stream_name); > > ret = snd_pcm_new_internal(rtd->card->snd_card, new_name, num, > - 1, 0, &be_pcm); > + rtd->dai_link->dpcm_playback, > + rtd->dai_link->dpcm_capture, &be_pcm); > if (ret < 0) { > dev_err(rtd->card->dev, "ASoC: can't create compressed > for %s\n", > rtd->dai_link->name); > @@ -668,8 +669,10 @@ int soc_new_compress(struct snd_soc_pcm_runtime *rtd, > int num) > > rtd->pcm = be_pcm; > rtd->fe_compr = 1; > - > be_pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream->private_data = rtd; > - > be_pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream->private_data = rtd; > + if (rtd->dai_link->dpcm_playback) > + > be_pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream->private_data = rtd; > + if (rtd->dai_link->dpcm_capture) this should be else if, as for compressed device we can have playback or capture not both > + > be_pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream->private_data = rtd; > memcpy(compr->ops, &soc_compr_dyn_ops, > sizeof(soc_compr_dyn_ops)); > } else > memcpy(compr->ops, &soc_compr_ops, sizeof(soc_compr_ops)); > -- > 2.1.0 > -- ~Vinod -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/