* codec drivers using hdac_ext_bus_ops ops.
  */
 
+#include <linux/firmware.h>
 #include <linux/init.h>
 #include <linux/delay.h>
 #include <linux/module.h>
                                 SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 |\
                                 SNDRV_PCM_RATE_192000)
 
+#ifdef CONFIG_SND_HDA_PATCH_LOADER
+static char *loadable_patch[SNDRV_CARDS];
+
+module_param_array_named(patch, loadable_patch, charp, NULL, 0444);
+MODULE_PARM_DESC(patch, "Patch file for Intel HD audio interface.");
+#endif
+
 static int hdac_hda_dai_open(struct snd_pcm_substream *substream,
                             struct snd_soc_dai *dai);
 static void hdac_hda_dai_close(struct snd_pcm_substream *substream,
                dev_err(&hdev->dev, "failed to create hda codec %d\n", ret);
                goto error_no_pm;
        }
+
+#ifdef CONFIG_SND_HDA_PATCH_LOADER
+       if (loadable_patch[hda_pvt->dev_index] && *loadable_patch[hda_pvt->dev_index]) {
+               dev_info(&hdev->dev, "Applying patch firmware '%s'\n",
+                        loadable_patch[hda_pvt->dev_index]);
+               ret = request_firmware(&hda_pvt->fw, loadable_patch[hda_pvt->dev_index],
+                                      &hdev->dev);
+               if (ret < 0)
+                       goto error_no_pm;
+               if (hda_pvt->fw) {
+                       ret = snd_hda_load_patch(hcodec->bus, hda_pvt->fw->size, hda_pvt->fw->data);
+                       if (ret < 0) {
+                               dev_err(&hdev->dev, "failed to load hda patch %d\n", ret);
+                               goto error_no_pm;
+                       }
+                       release_firmware(hda_pvt->fw);
+                       hda_pvt->fw = NULL;
+               }
+       }
+#endif
        /*
         * Overwrite type to HDA_DEV_ASOC since it is a ASoC driver
         * hda_codec.c will check this flag to determine if unregister