ASoC: imx-pcm-rpmsg: Set PCM hardware parameters separately
authorChancel Liu <chancel.liu@nxp.com>
Sun, 25 Jun 2023 06:54:12 +0000 (14:54 +0800)
committerMark Brown <broonie@kernel.org>
Sun, 9 Jul 2023 21:50:57 +0000 (22:50 +0100)
Different PCM devices may have different PCM hardware parameters. It
requires PCM hardware parameters set separately if there is more than
one rpmsg sound card.

Signed-off-by: Chancel Liu <chancel.liu@nxp.com>
Acked-by: Shengjiu Wang <shengjiu.wang@gmail.com>
Link: https://lore.kernel.org/r/20230625065412.651870-1-chancel.liu@nxp.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/fsl/imx-pcm-rpmsg.c

index 765dad6..d63782b 100644 (file)
@@ -228,6 +228,10 @@ static int imx_rpmsg_pcm_open(struct snd_soc_component *component,
                              struct snd_pcm_substream *substream)
 {
        struct rpmsg_info *info = dev_get_drvdata(component->dev);
+       struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
+       struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0);
+       struct fsl_rpmsg *rpmsg = dev_get_drvdata(cpu_dai->dev);
+       struct snd_pcm_hardware pcm_hardware;
        struct rpmsg_msg *msg;
        int ret = 0;
        int cmd;
@@ -255,10 +259,11 @@ static int imx_rpmsg_pcm_open(struct snd_soc_component *component,
 
        info->send_message(msg, info);
 
-       imx_rpmsg_pcm_hardware.period_bytes_max =
-                       imx_rpmsg_pcm_hardware.buffer_bytes_max / 2;
+       pcm_hardware = imx_rpmsg_pcm_hardware;
+       pcm_hardware.buffer_bytes_max = rpmsg->buffer_size;
+       pcm_hardware.period_bytes_max = pcm_hardware.buffer_bytes_max / 2;
 
-       snd_soc_set_runtime_hwparams(substream, &imx_rpmsg_pcm_hardware);
+       snd_soc_set_runtime_hwparams(substream, &pcm_hardware);
 
        ret = snd_pcm_hw_constraint_integer(substream->runtime,
                                            SNDRV_PCM_HW_PARAM_PERIODS);
@@ -597,7 +602,6 @@ static int imx_rpmsg_pcm_new(struct snd_soc_component *component,
        if (ret)
                return ret;
 
-       imx_rpmsg_pcm_hardware.buffer_bytes_max = rpmsg->buffer_size;
        return snd_pcm_set_fixed_buffer_all(pcm, SNDRV_DMA_TYPE_DEV_WC,
                                            pcm->card->dev, rpmsg->buffer_size);
 }