ASoC: au1x: fix dma data provisioning
PATCH 1/1 ASoC: au1x: fix dma data provisioning
Provide data in the dai probe callback, which is early enough for the dma components. Makes audio playback and recording work again.
Signed-off-by Manuel Lauss <[email protected]>
---
without this patch, the dma components will report ENODEV in the
pcm_open() callbacks since dma data hasn't been provided at call time.
sound/soc/au1x/ac97c.c | 30 +++++++++++++----------------- sound/soc/au1x/dbdma2.c | 10 +++++----- sound/soc/au1x/dma.c | 8 ++++---- sound/soc/au1x/i2sc.c | 10 +++++----- sound/soc/au1x/psc-ac97.c | 12 +++--------- sound/soc/au1x/psc-i2s.c | 10 +++++----- 6 files changed, 35 insertions(+), 45 deletions(-)
sound/soc/au1x/ac97c.c +13 -17
@@ -187,20 +187,15 @@ static struct snd_ac97_bus_ops ac97c_bus_ops = { .warm_reset = au1xac97c_ac97_warm_reset, }; -static int alchemy_ac97c_startup (struct snd_pcm_substream *substream, -struct snd_soc_dai *dai) -{ -struct au1xpsc_audio_data *ctx =snd_soc_dai_get_drvdata (dai); -snd_soc_dai_set_dma_data (dai, substream, &ctx->dmaids[0 ]); -return 0 ; -} -static const struct snd_soc_dai_ops alchemy_ac97c_ops = { - .startup = alchemy_ac97c_startup, +/* no ops necessary */ };static int au1xac97c_dai_probe (struct snd_soc_dai *dai) { +struct au1xpsc_audio_data *wd =snd_soc_dai_get_drvdata (dai); + +snd_soc_dai_init_dma_data (dai, &(wd->dmaids[0 ]), &(wd->dmaids[1 ]));return ac97c_workdata ?0 : -ENODEV ; }
@@ -271,29 +266,30 @@ static int au1xac97c_drvprobe(struct platform_device *pdev)WR (ctx,AC97_CONFIG , ctx->cfg);platform_set_drvdata (pdev, ctx); - + ac97c_workdata = ctx; ret =snd_soc_set_ac97_ops (&ac97c_bus_ops);if (ret)return ret; ret =snd_soc_register_component (&pdev->dev, &au1xac97c_component, &au1xac97c_dai_driver,1 ); -if (ret) -return ret; +if (!ret) +return 0 ; - ac97c_workdata = ctx; -return 0 ; +snd_soc_set_ac97_ops (NULL ); + ac97c_workdata =NULL ; + +return ret; }static void au1xac97c_drvremove (struct platform_device *pdev) {struct au1xpsc_audio_data *ctx =platform_get_drvdata (pdev); +snd_soc_set_ac97_ops (NULL );snd_soc_unregister_component (&pdev->dev); -WR (ctx,AC97_ENABLE ,EN_D );/* clock off, disable */ - - ac97c_workdata =NULL ;/* MDEV */ + ac97c_workdata =NULL ; }#ifdef CONFIG_PM
sound/soc/au1x/dbdma2.c +5 -5
@@ -279,13 +279,13 @@ static int au1xpsc_pcm_open(struct snd_soc_component *component, {struct au1xpsc_audio_dmadata *pcd =to_dmadata (substream, component);struct snd_soc_pcm_runtime *rtd =asoc_substream_to_rtd (substream); -int stype = substream->stream, *dmaids; +int *dmaid; - dmaids =snd_soc_dai_get_dma_data (asoc_rtd_to_cpu (rtd,0 ), substream); -if (!dmaids) -return -ENODEV ;/* whoa, has ordering changed? */ + dmaid =snd_soc_dai_get_dma_data (asoc_rtd_to_cpu (rtd,0 ), substream); +if (!dmaid) +return -ENODEV ; - pcd->ddma_id = dmaids[stype]; + pcd->ddma_id = *dmaid;snd_soc_set_runtime_hwparams (substream, &au1xpsc_pcm_hardware);return 0 ;
sound/soc/au1x/dma.c +4 -4
@@ -192,16 +192,16 @@ static int alchemy_pcm_open(struct snd_soc_component *component, {struct alchemy_pcm_ctx *ctx =ss_to_ctx (substream, component);struct snd_soc_pcm_runtime *rtd =asoc_substream_to_rtd (substream); -int *dmaids, s = substream->stream; +int *dmaid, s = substream->stream;char *name; - dmaids =snd_soc_dai_get_dma_data (asoc_rtd_to_cpu (rtd,0 ), substream); -if (!dmaids) + dmaid =snd_soc_dai_get_dma_data (asoc_rtd_to_cpu (rtd,0 ), substream); +if (!dmaid)return -ENODEV ;/* whoa, has ordering changed? */ /* DMA setup */ name = (s ==SNDRV_PCM_STREAM_PLAYBACK ) ?"audio-tx" :"audio-rx" ; - ctx->stream[s].dma =request_au1000_dma (dmaids[s], name, + ctx->stream[s].dma =request_au1000_dma (*dmaid, name, au1000_dma_interrupt,0 , &ctx->stream[s]); set_dma_mode(ctx->stream[s].dma,
sound/soc/au1x/i2sc.c +5 -5
@@ -194,22 +194,22 @@ static int au1xi2s_hw_params(struct snd_pcm_substream *substream,return 0 ; } -static int au1xi2s_startup (struct snd_pcm_substream *substream, -struct snd_soc_dai *dai) +static int au1xi2s_dai_probe (struct snd_soc_dai *dai) { -struct au1xpsc_audio_data *ctx =snd_soc_dai_get_drvdata (dai); -snd_soc_dai_set_dma_data (dai, substream, &ctx->dmaids[0 ]); +struct au1xpsc_audio_data *wd =snd_soc_dai_get_drvdata (dai); + +snd_soc_dai_init_dma_data (dai, &(wd->dmadata[0 ]), &(wd->dmadata[1 ]));return 0 ; }static const struct snd_soc_dai_ops au1xi2s_dai_ops = { - .startup = au1xi2s_startup, .trigger = au1xi2s_trigger, .hw_params = au1xi2s_hw_params, .set_fmt = au1xi2s_set_fmt, };static struct snd_soc_dai_driver au1xi2s_dai_driver = { + .probe = au1xi2s_dai_probe, .symmetric_rate =1 , .playback = { .rates =AU1XI2SC_RATES ,
sound/soc/au1x/psc-ac97.c +3 -9
@@ -319,21 +319,15 @@ static int au1xpsc_ac97_trigger(struct snd_pcm_substream *substream,return ret; } -static int au1xpsc_ac97_startup (struct snd_pcm_substream *substream, -struct snd_soc_dai *dai) -{ -struct au1xpsc_audio_data *pscdata =snd_soc_dai_get_drvdata (dai); -snd_soc_dai_set_dma_data (dai, substream, &pscdata->dmaids[0 ]); -return 0 ; -} -static int au1xpsc_ac97_probe (struct snd_soc_dai *dai) { +struct au1xpsc_audio_data *wd =snd_soc_dai_get_drvdata (dai); + +snd_soc_dai_init_dma_data (dai, &(wd->dmaids[0 ]), &(wd->dmaids[1 ]));return au1xpsc_ac97_workdata ?0 : -ENODEV ; }static const struct snd_soc_dai_ops au1xpsc_ac97_dai_ops = { - .startup = au1xpsc_ac97_startup, .trigger = au1xpsc_ac97_trigger, .hw_params = au1xpsc_ac97_hw_params, };
sound/soc/au1x/psc-i2s.c +5 -5
@@ -254,22 +254,22 @@ static int au1xpsc_i2s_trigger(struct snd_pcm_substream *substream, int cmd,return ret; } -static int au1xpsc_i2s_startup (struct snd_pcm_substream *substream, -struct snd_soc_dai *dai) +static int au1xpsci2s_dai_probe (struct snd_soc_dai *dai) { -struct au1xpsc_audio_data *pscdata =snd_soc_dai_get_drvdata (dai); -snd_soc_dai_set_dma_data (dai, substream, &pscdata->dmaids[0 ]); +struct au1xpsc_audio_data *wd =snd_soc_dai_get_drvdata (dai); + +snd_soc_dai_init_dma_data (dai, &(wd->dmaids[0 ]), &(wd->dmaids[1 ]));return 0 ; }static const struct snd_soc_dai_ops au1xpsc_i2s_dai_ops = { - .startup = au1xpsc_i2s_startup, .trigger = au1xpsc_i2s_trigger, .hw_params = au1xpsc_i2s_hw_params, .set_fmt = au1xpsc_i2s_set_fmt, };static const struct snd_soc_dai_driver au1xpsc_i2s_dai_template = { + .probe = au1xpsci2s_dai_probe, .playback = { .rates =AU1XPSC_I2S_RATES , .formats =AU1XPSC_I2S_FMTS ,
Signature · 1 line
2.40.1