ASoC: wm_adsp: Add support for firmware wide coefficient blocks
authorMark Brown <broonie@opensource.wolfsonmicro.com>
Tue, 9 Apr 2013 16:08:24 +0000 (17:08 +0100)
committerMark Brown <broonie@opensource.wolfsonmicro.com>
Thu, 11 Apr 2013 17:14:47 +0000 (18:14 +0100)
Firmwares may provide some firmware wide configuration regions which can
be configured by the coefficient files using the firmware ID as the
algorithm ID, include these in the algorithm list.

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

index 68eda929fbdef7b6d6e22a5f981eb8156d4811df..a793c7d951ceeb23b5953910e5986c90c72605f2 100644 (file)
@@ -565,6 +565,22 @@ static int wm_adsp_setup_algs(struct wm_adsp *dsp)
                          be32_to_cpu(adsp1_id.fw.ver) & 0xff,
                          algs);
 
+               region = kzalloc(sizeof(*region), GFP_KERNEL);
+               if (!region)
+                       return -ENOMEM;
+               region->type = WMFW_ADSP1_ZM;
+               region->alg = be32_to_cpu(adsp1_id.fw.id);
+               region->base = be32_to_cpu(adsp1_id.zm);
+               list_add_tail(&region->list, &dsp->alg_regions);
+
+               region = kzalloc(sizeof(*region), GFP_KERNEL);
+               if (!region)
+                       return -ENOMEM;
+               region->type = WMFW_ADSP1_DM;
+               region->alg = be32_to_cpu(adsp1_id.fw.id);
+               region->base = be32_to_cpu(adsp1_id.dm);
+               list_add_tail(&region->list, &dsp->alg_regions);
+
                pos = sizeof(adsp1_id) / 2;
                term = pos + ((sizeof(*adsp1_alg) * algs) / 2);
                break;
@@ -590,6 +606,30 @@ static int wm_adsp_setup_algs(struct wm_adsp *dsp)
                          be32_to_cpu(adsp2_id.fw.ver) & 0xff,
                          algs);
 
+               region = kzalloc(sizeof(*region), GFP_KERNEL);
+               if (!region)
+                       return -ENOMEM;
+               region->type = WMFW_ADSP2_XM;
+               region->alg = be32_to_cpu(adsp2_id.fw.id);
+               region->base = be32_to_cpu(adsp2_id.xm);
+               list_add_tail(&region->list, &dsp->alg_regions);
+
+               region = kzalloc(sizeof(*region), GFP_KERNEL);
+               if (!region)
+                       return -ENOMEM;
+               region->type = WMFW_ADSP2_YM;
+               region->alg = be32_to_cpu(adsp2_id.fw.id);
+               region->base = be32_to_cpu(adsp2_id.ym);
+               list_add_tail(&region->list, &dsp->alg_regions);
+
+               region = kzalloc(sizeof(*region), GFP_KERNEL);
+               if (!region)
+                       return -ENOMEM;
+               region->type = WMFW_ADSP2_ZM;
+               region->alg = be32_to_cpu(adsp2_id.fw.id);
+               region->base = be32_to_cpu(adsp2_id.zm);
+               list_add_tail(&region->list, &dsp->alg_regions);
+
                pos = sizeof(adsp2_id) / 2;
                term = pos + ((sizeof(*adsp2_alg) * algs) / 2);
                break;