ASoC: SOF: ipc4-topology: support NHLT device type
authorBrent Lu <brent.lu@intel.com>
Mon, 27 Nov 2023 12:06:57 +0000 (14:06 +0200)
committerTakashi Iwai <tiwai@suse.de>
Fri, 22 Mar 2024 11:40:46 +0000 (12:40 +0100)
The endpoint in NHLT table for a SSP port could have the device type
NHLT_DEVICE_BT or NHLT_DEVICE_I2S. Use intel_nhlt_ssp_device_type()
function to retrieve the device type before querying the endpoint
blob to make sure we are always using correct device type parameter.

Signed-off-by: Brent Lu <brent.lu@intel.com>
Reviewed-by: Péter Ujfalusi <peter.ujfalusi@linux.intel.com>
Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Reviewed-by: Bard Liao <yung-chuan.liao@linux.intel.com>
Signed-off-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
Acked-by: Mark Brown <broonie@kernel.org>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Message-ID: <20231127120657.19764-3-peter.ujfalusi@linux.intel.com>

sound/soc/sof/ipc4-topology.c

index da4a83afb87a8a2c4163f34a8d6e9993b92bde77..f28edd9830c1b3e25961add70dff87a489cfa119 100644 (file)
@@ -1356,6 +1356,7 @@ static int snd_sof_get_nhlt_endpoint_data(struct snd_sof_dev *sdev, struct snd_s
        int sample_rate, channel_count;
        int bit_depth, ret;
        u32 nhlt_type;
+       int dev_type = 0;
 
        /* convert to NHLT type */
        switch (linktype) {
@@ -1371,18 +1372,30 @@ static int snd_sof_get_nhlt_endpoint_data(struct snd_sof_dev *sdev, struct snd_s
                                                   &bit_depth);
                if (ret < 0)
                        return ret;
+
+               /*
+                * We need to know the type of the external device attached to a SSP
+                * port to retrieve the blob from NHLT. However, device type is not
+                * specified in topology.
+                * Query the type for the port and then pass that information back
+                * to the blob lookup function.
+                */
+               dev_type = intel_nhlt_ssp_device_type(sdev->dev, ipc4_data->nhlt,
+                                                     dai_index);
+               if (dev_type < 0)
+                       return dev_type;
                break;
        default:
                return 0;
        }
 
-       dev_dbg(sdev->dev, "dai index %d nhlt type %d direction %d\n",
-               dai_index, nhlt_type, dir);
+       dev_dbg(sdev->dev, "dai index %d nhlt type %d direction %d dev type %d\n",
+               dai_index, nhlt_type, dir, dev_type);
 
        /* find NHLT blob with matching params */
        cfg = intel_nhlt_get_endpoint_blob(sdev->dev, ipc4_data->nhlt, dai_index, nhlt_type,
                                           bit_depth, bit_depth, channel_count, sample_rate,
-                                          dir, 0);
+                                          dir, dev_type);
 
        if (!cfg) {
                dev_err(sdev->dev,