]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - sound/soc/codecs/wm_adsp.c
ASoC: Blackfin: ADAU1X81 eval board support
[karo-tx-linux.git] / sound / soc / codecs / wm_adsp.c
index 444626fcab40d42aed3b6df03e9cf86f43dd3423..bb5f7b4e3ebbfe016146343c9c1178f568c93517 100644 (file)
@@ -684,24 +684,38 @@ static int wm_adsp_load(struct wm_adsp *dsp)
                }
 
                if (reg) {
-                       buf = wm_adsp_buf_alloc(region->data,
-                                               le32_to_cpu(region->len),
-                                               &buf_list);
-                       if (!buf) {
-                               adsp_err(dsp, "Out of memory\n");
-                               ret = -ENOMEM;
-                               goto out_fw;
-                       }
+                       size_t to_write = PAGE_SIZE;
+                       size_t remain = le32_to_cpu(region->len);
+                       const u8 *data = region->data;
+
+                       while (remain > 0) {
+                               if (remain < PAGE_SIZE)
+                                       to_write = remain;
+
+                               buf = wm_adsp_buf_alloc(data,
+                                                       to_write,
+                                                       &buf_list);
+                               if (!buf) {
+                                       adsp_err(dsp, "Out of memory\n");
+                                       ret = -ENOMEM;
+                                       goto out_fw;
+                               }
 
-                       ret = regmap_raw_write_async(regmap, reg, buf->buf,
-                                                    le32_to_cpu(region->len));
-                       if (ret != 0) {
-                               adsp_err(dsp,
-                                       "%s.%d: Failed to write %d bytes at %d in %s: %d\n",
-                                       file, regions,
-                                       le32_to_cpu(region->len), offset,
-                                       region_name, ret);
-                               goto out_fw;
+                               ret = regmap_raw_write_async(regmap, reg,
+                                                            buf->buf,
+                                                            to_write);
+                               if (ret != 0) {
+                                       adsp_err(dsp,
+                                               "%s.%d: Failed to write %zd bytes at %d in %s: %d\n",
+                                               file, regions,
+                                               to_write, offset,
+                                               region_name, ret);
+                                       goto out_fw;
+                               }
+
+                               data += to_write;
+                               reg += to_write / 2;
+                               remain -= to_write;
                        }
                }
 
@@ -1679,6 +1693,8 @@ int wm_adsp2_event(struct snd_soc_dapm_widget *w,
                        list_del(&alg_region->list);
                        kfree(alg_region);
                }
+
+               adsp_dbg(dsp, "Shutdown complete\n");
                break;
 
        default: