Unverified Commit f7c41911 authored by Seppo Ingalsuo's avatar Seppo Ingalsuo Committed by Mark Brown
Browse files

ASoC: SOF: ipc4-topology: Add support for float sample type



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: default avatarSeppo Ingalsuo <seppo.ingalsuo@linux.intel.com>
Reviewed-by: default avatarPéter Ujfalusi <peter.ujfalusi@linux.intel.com>
Reviewed-by: default avatarBard Liao <yung-chuan.liao@linux.intel.com>
Reviewed-by: default avatarLiam Girdwood <liam.r.girdwood@intel.com>
Signed-off-by: default avatarPeter Ujfalusi <peter.ujfalusi@linux.intel.com>
Message-ID: <20250829105305.31818-4-peter.ujfalusi@linux.intel.com>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent c04c2e82
Loading
Loading
Loading
Loading
+15 −1
Original line number Diff line number Diff line
@@ -1345,8 +1345,18 @@ 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:
			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);
			return -EINVAL;
@@ -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;