|
@@ -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 %d 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;
|
|
|
}
|
|
|
}
|
|
|
|