Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a76fefab authored by Mark Brown's avatar Mark Brown
Browse files

ASoC: wm_adsp: Ensure that block writes are from DMA aligned addresses



Otherwise we won't run correctly on systems that require this for larger
data transfers.

Signed-off-by: default avatarMark Brown <broonie@opensource.wolfsonmicro.com>
parent d1c3ed66
Loading
Loading
Loading
Loading
+22 −1
Original line number Diff line number Diff line
@@ -169,6 +169,7 @@ static int wm_adsp_load(struct wm_adsp *dsp)
	const struct wm_adsp_region *mem;
	const char *region_name;
	char *file, *text;
	void *buf;
	unsigned int reg;
	int regions = 0;
	int ret, offset, type, sizes;
@@ -322,8 +323,18 @@ static int wm_adsp_load(struct wm_adsp *dsp)
		}

		if (reg) {
			ret = regmap_raw_write(regmap, reg, region->data,
			buf = kmemdup(region->data, le32_to_cpu(region->len),
				      GFP_KERNEL);
			if (!buf) {
				adsp_err(dsp, "Out of memory\n");
				return -ENOMEM;
			}

			ret = regmap_raw_write(regmap, reg, buf,
					       le32_to_cpu(region->len));

			kfree(buf);

			if (ret != 0) {
				adsp_err(dsp,
					"%s.%d: Failed to write %d bytes at %d in %s: %d\n",
@@ -359,6 +370,7 @@ static int wm_adsp_load_coeff(struct wm_adsp *dsp)
	const char *region_name;
	int ret, pos, blocks, type, offset, reg;
	char *file;
	void *buf;

	file = kzalloc(PAGE_SIZE, GFP_KERNEL);
	if (file == NULL)
@@ -426,6 +438,13 @@ static int wm_adsp_load_coeff(struct wm_adsp *dsp)
		}

		if (reg) {
			buf = kmemdup(blk->data, le32_to_cpu(blk->len),
				      GFP_KERNEL);
			if (!buf) {
				adsp_err(dsp, "Out of memory\n");
				return -ENOMEM;
			}

			ret = regmap_raw_write(regmap, reg, blk->data,
					       le32_to_cpu(blk->len));
			if (ret != 0) {
@@ -433,6 +452,8 @@ static int wm_adsp_load_coeff(struct wm_adsp *dsp)
					"%s.%d: Failed to write to %x in %s\n",
					file, blocks, reg, region_name);
			}

			kfree(buf);
		}

		pos += le32_to_cpu(blk->len) + sizeof(*blk);