]> www.infradead.org Git - users/hch/misc.git/commitdiff
ASoC: SOF: ipc4-topology: Add support for float sample type
authorSeppo Ingalsuo <seppo.ingalsuo@linux.intel.com>
Fri, 29 Aug 2025 10:53:05 +0000 (13:53 +0300)
committerMark Brown <broonie@kernel.org>
Fri, 29 Aug 2025 11:34:07 +0000 (13:34 +0200)
This patch adds support for FLOAT_LE ALSA type for playback and
capture for IPC4 systems. Functions sof_ipc4_update_hw_params(),
sof_ipc4_get_valid_bits() and sof_ipc4_get_sample_type()
are updated to handle SOF_IPC4_TYPE_FLOAT and
SNDRV_PCM_FORMAT_FLOAT_LE.

Signed-off-by: Seppo Ingalsuo <seppo.ingalsuo@linux.intel.com>
Reviewed-by: Péter Ujfalusi <peter.ujfalusi@linux.intel.com>
Reviewed-by: Bard Liao <yung-chuan.liao@linux.intel.com>
Reviewed-by: Liam Girdwood <liam.r.girdwood@intel.com>
Signed-off-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
Message-ID: <20250829105305.31818-4-peter.ujfalusi@linux.intel.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/sof/ipc4-topology.c

index 47cc76328c23ba2902ac173a194bd6945b14bebf..d934165fda114bcc093905313643763f3563d071 100644 (file)
@@ -1345,7 +1345,17 @@ static int sof_ipc4_update_hw_params(struct snd_sof_dev *sdev, struct snd_pcm_hw
                        snd_fmt = SNDRV_PCM_FORMAT_S24_LE;
                        break;
                case 32:
-                       snd_fmt = SNDRV_PCM_FORMAT_S32_LE;
+                       switch (type) {
+                       case SOF_IPC4_TYPE_LSB_INTEGER:
+                               snd_fmt = SNDRV_PCM_FORMAT_S32_LE;
+                               break;
+                       case SOF_IPC4_TYPE_FLOAT:
+                               snd_fmt = SNDRV_PCM_FORMAT_FLOAT_LE;
+                               break;
+                       default:
+                               dev_err(sdev->dev, "Unsupported PCM 32-bit IPC4 type %d\n", type);
+                               return -EINVAL;
+                       }
                        break;
                default:
                        dev_err(sdev->dev, "invalid PCM valid_bits %d\n", valid_bits);
@@ -1473,6 +1483,8 @@ static int sof_ipc4_get_valid_bits(struct snd_sof_dev *sdev, struct snd_pcm_hw_p
                return 24;
        case SNDRV_PCM_FORMAT_S32_LE:
                return 32;
+       case SNDRV_PCM_FORMAT_FLOAT_LE:
+               return 32;
        default:
                dev_err(sdev->dev, "invalid pcm frame format %d\n", params_format(params));
                return -EINVAL;
@@ -1493,6 +1505,8 @@ static int sof_ipc4_get_sample_type(struct snd_sof_dev *sdev, struct snd_pcm_hw_
        case SNDRV_PCM_FORMAT_S32_LE:
        case SNDRV_PCM_FORMAT_IEC958_SUBFRAME_LE:
                return SOF_IPC4_TYPE_LSB_INTEGER;
+       case SNDRV_PCM_FORMAT_FLOAT_LE:
+               return SOF_IPC4_TYPE_FLOAT;
        default:
                dev_err(sdev->dev, "invalid pcm sample type %d\n", params_format(params));
                return -EINVAL;