ASoC: wm_adsp: Handle old .bin files
authorMark Brown <broonie@opensource.wolfsonmicro.com>
Tue, 5 Mar 2013 14:39:54 +0000 (22:39 +0800)
committerMark Brown <broonie@opensource.wolfsonmicro.com>
Wed, 13 Mar 2013 12:40:37 +0000 (12:40 +0000)
Older .bin files report the global coefficients as absolute address writes
to zero; maintain compatibility with them.

Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
sound/soc/codecs/wm_adsp.c
sound/soc/codecs/wm_adsp.h

index f3f7e75f86280ef5160facc2a7f3cfa7972c6b91..febb4c76535e090ea98145c8dbf816ccc40acb9e 100644 (file)
@@ -549,8 +549,9 @@ static int wm_adsp_setup_algs(struct wm_adsp *dsp)
                buf_size = sizeof(adsp1_id);
 
                algs = be32_to_cpu(adsp1_id.algs);
+               dsp->fw_id = be32_to_cpu(adsp1_id.fw.id);
                adsp_info(dsp, "Firmware: %x v%d.%d.%d, %zu algorithms\n",
-                         be32_to_cpu(adsp1_id.fw.id),
+                         dsp->fw_id,
                          (be32_to_cpu(adsp1_id.fw.ver) & 0xff0000) >> 16,
                          (be32_to_cpu(adsp1_id.fw.ver) & 0xff00) >> 8,
                          be32_to_cpu(adsp1_id.fw.ver) & 0xff,
@@ -573,8 +574,9 @@ static int wm_adsp_setup_algs(struct wm_adsp *dsp)
                buf_size = sizeof(adsp2_id);
 
                algs = be32_to_cpu(adsp2_id.algs);
+               dsp->fw_id = be32_to_cpu(adsp2_id.fw.id);
                adsp_info(dsp, "Firmware: %x v%d.%d.%d, %zu algorithms\n",
-                         be32_to_cpu(adsp2_id.fw.id),
+                         dsp->fw_id,
                          (be32_to_cpu(adsp2_id.fw.ver) & 0xff0000) >> 16,
                          (be32_to_cpu(adsp2_id.fw.ver) & 0xff00) >> 8,
                          be32_to_cpu(adsp2_id.fw.ver) & 0xff,
@@ -781,8 +783,24 @@ static int wm_adsp_load_coeff(struct wm_adsp *dsp)
                case (WMFW_INFO_TEXT << 8):
                        break;
                case (WMFW_ABSOLUTE << 8):
-                       region_name = "register";
-                       reg = offset;
+                       /*
+                        * Old files may use this for global
+                        * coefficients.
+                        */
+                       if (le32_to_cpu(blk->id) == dsp->fw_id &&
+                           offset == 0) {
+                               region_name = "global coefficients";
+                               mem = wm_adsp_find_region(dsp, type);
+                               if (!mem) {
+                                       adsp_err(dsp, "No ZM\n");
+                                       break;
+                               }
+                               reg = wm_adsp_region_to_reg(mem, 0);
+
+                       } else {
+                               region_name = "register";
+                               reg = offset;
+                       }
                        break;
 
                case WMFW_ADSP1_DM:
index cb8871a3ec0015854c6d13bebb1055661b7cf4be..d6fd8af53b5d81db5b35b7d17e2bde1b29c22be8 100644 (file)
@@ -46,6 +46,8 @@ struct wm_adsp {
 
        struct list_head alg_regions;
 
+       int fw_id;
+
        const struct wm_adsp_region *mem;
        int num_mems;