#include <sound/pcm_params.h>
 #include <sound/hdaudio_ext.h>
+#include <sound/intel-nhlt.h>
 #include <sound/sof/ipc4/header.h>
 #include <uapi/sound/sof/header.h>
 #include "../ipc4-priv.h"
 #include "../sof-audio.h"
 #include "hda.h"
 
+/*
+ * The default method is to fetch NHLT from BIOS. With this parameter set
+ * it is possible to override that with NHLT in the SOF topology manifest.
+ */
+static bool hda_use_tplg_nhlt;
+module_param_named(sof_use_tplg_nhlt, hda_use_tplg_nhlt, bool, 0444);
+MODULE_PARM_DESC(sof_use_tplg_nhlt, "SOF topology nhlt override");
+
 #if IS_ENABLED(CONFIG_SND_SOC_SOF_HDA)
 
 struct hda_pipe_params {
                }
                break;
        case SOF_INTEL_IPC4:
+       {
+               struct sof_ipc4_fw_data *ipc4_data = sdev->private;
+
                for (i = 0; i < ops->num_drv; i++) {
                        if (strstr(ops->drv[i].name, "DMIC")) {
                                ops->drv[i].ops = &ipc4_dmic_dai_ops;
                                ops->drv[i].ops = &ipc4_hda_dai_ops;
 #endif
                }
+
+               if (!hda_use_tplg_nhlt)
+                       ipc4_data->nhlt = intel_nhlt_init(sdev->dev);
+
                break;
+       }
        default:
                break;
        }
 }
 
+void hda_ops_free(struct snd_sof_dev *sdev)
+{
+       if (sdev->pdata->ipc_type == SOF_INTEL_IPC4) {
+               struct sof_ipc4_fw_data *ipc4_data = sdev->private;
+
+               if (!hda_use_tplg_nhlt)
+                       intel_nhlt_free(ipc4_data->nhlt);
+       }
+}
+EXPORT_SYMBOL_NS(hda_ops_free, SND_SOC_SOF_INTEL_HDA_COMMON);
+
 /*
  * common dai driver for skl+ platforms.
  * some products who use this DAI array only physically have a subset of
 
  * @manifest_fw_hdr_offset: FW header offset in the manifest
  * @num_fw_modules : Number of modules in base FW
  * @fw_modules: Array of base FW modules
+ * @nhlt: NHLT table either from the BIOS or the topology manifest
  */
 struct sof_ipc4_fw_data {
        u32 manifest_fw_hdr_offset;
        int num_fw_modules;
        void *fw_modules;
+       void *nhlt;
 };
 
 /**