}
 
 static int wm_adsp_request_firmware_file(struct wm_adsp *dsp,
-                                        const struct firmware **firmware,
-                                        char **filename,
-                                        char *suffix)
+                                        const struct firmware **firmware, char **filename,
+                                        const char *dir, const char *system_name,
+                                        const char *asoc_component_prefix,
+                                        const char *filetype)
 {
        struct cs_dsp *cs_dsp = &dsp->cs_dsp;
+       char *s, c;
        int ret = 0;
 
-       *filename = kasprintf(GFP_KERNEL, "%s-%s-%s.%s", dsp->part, dsp->fwf_name,
-                             wm_adsp_fw[dsp->fw].file, suffix);
+       if (system_name && asoc_component_prefix)
+               *filename = kasprintf(GFP_KERNEL, "%s%s-%s-%s-%s-%s.%s", dir, dsp->part,
+                                     dsp->fwf_name, wm_adsp_fw[dsp->fw].file, system_name,
+                                     asoc_component_prefix, filetype);
+       else if (system_name)
+               *filename = kasprintf(GFP_KERNEL, "%s%s-%s-%s-%s.%s", dir, dsp->part,
+                                     dsp->fwf_name, wm_adsp_fw[dsp->fw].file, system_name,
+                                     filetype);
+       else
+               *filename = kasprintf(GFP_KERNEL, "%s%s-%s-%s.%s", dir, dsp->part, dsp->fwf_name,
+                                     wm_adsp_fw[dsp->fw].file, filetype);
+
        if (*filename == NULL)
                return -ENOMEM;
 
-       ret = request_firmware(firmware, *filename, cs_dsp->dev);
+       /*
+        * Make sure that filename is lower-case and any non alpha-numeric
+        * characters except full stop and forward slash are replaced with
+        * hyphens.
+        */
+       s = *filename;
+       while (*s) {
+               c = *s;
+               if (isalnum(c))
+                       *s = tolower(c);
+               else if ((c != '.') && (c != '/'))
+                       *s = '-';
+               s++;
+       }
+
+       ret = firmware_request_nowarn(firmware, *filename, cs_dsp->dev);
        if (ret != 0) {
-               adsp_err(dsp, "Failed to request '%s'\n", *filename);
+               adsp_dbg(dsp, "Failed to request '%s'\n", *filename);
                kfree(*filename);
                *filename = NULL;
        }
        return ret;
 }
 
+static const char *cirrus_dir = "cirrus/";
 static int wm_adsp_request_firmware_files(struct wm_adsp *dsp,
                                          const struct firmware **wmfw_firmware,
                                          char **wmfw_filename,
                                          const struct firmware **coeff_firmware,
                                          char **coeff_filename)
 {
+       const char *system_name = dsp->system_name;
+       const char *asoc_component_prefix = dsp->component->name_prefix;
        int ret = 0;
 
-       ret = wm_adsp_request_firmware_file(dsp, wmfw_firmware, wmfw_filename, "wmfw");
-       if (ret != 0)
-               return ret;
+       if (system_name && asoc_component_prefix) {
+               if (!wm_adsp_request_firmware_file(dsp, wmfw_firmware, wmfw_filename,
+                                                  cirrus_dir, system_name,
+                                                  asoc_component_prefix, "wmfw")) {
+                       adsp_dbg(dsp, "Found '%s'\n", *wmfw_filename);
+                       wm_adsp_request_firmware_file(dsp, coeff_firmware, coeff_filename,
+                                                     cirrus_dir, system_name,
+                                                     asoc_component_prefix, "bin");
+                       return 0;
+               }
+       }
 
-       wm_adsp_request_firmware_file(dsp, coeff_firmware, coeff_filename, "bin");
+       if (system_name) {
+               if (!wm_adsp_request_firmware_file(dsp, wmfw_firmware, wmfw_filename,
+                                                  cirrus_dir, system_name,
+                                                  NULL, "wmfw")) {
+                       adsp_dbg(dsp, "Found '%s'\n", *wmfw_filename);
+                       if (asoc_component_prefix)
+                               wm_adsp_request_firmware_file(dsp, coeff_firmware, coeff_filename,
+                                                             cirrus_dir, system_name,
+                                                             asoc_component_prefix, "bin");
+
+                       if (!*coeff_firmware)
+                               wm_adsp_request_firmware_file(dsp, coeff_firmware, coeff_filename,
+                                                             cirrus_dir, system_name,
+                                                             NULL, "bin");
+                       return 0;
+               }
+       }
 
-       return 0;
+       if (!wm_adsp_request_firmware_file(dsp, wmfw_firmware, wmfw_filename,
+                                          "", NULL, NULL, "wmfw")) {
+               adsp_dbg(dsp, "Found '%s'\n", *wmfw_filename);
+               wm_adsp_request_firmware_file(dsp, coeff_firmware, coeff_filename,
+                                             "", NULL, NULL, "bin");
+               return 0;
+       }
+
+       ret = wm_adsp_request_firmware_file(dsp, wmfw_firmware, wmfw_filename,
+                                           cirrus_dir, NULL, NULL, "wmfw");
+       if (!ret) {
+               adsp_dbg(dsp, "Found '%s'\n", *wmfw_filename);
+               wm_adsp_request_firmware_file(dsp, coeff_firmware, coeff_filename,
+                                             cirrus_dir, NULL, NULL, "bin");
+               return 0;
+       }
+
+       adsp_err(dsp, "Failed to request firmware <%s>%s-%s-%s<-%s<%s>>.wmfw\n",
+                cirrus_dir, dsp->part, dsp->fwf_name, wm_adsp_fw[dsp->fw].file,
+                system_name, asoc_component_prefix);
+
+       return -ENOENT;
 }
 
 static int wm_adsp_common_init(struct wm_adsp *dsp)