Skip to content

Commit 40a027d

Browse files
committed
ASoC: wm_adsp: Associate adsp buffer regions with dsp type rather than firmware
Change-Id: I55675a1a3ccebdffd2be3ea36b158e41b86dabd7 Signed-off-by: Andrew Ford <[email protected]>
1 parent d5de750 commit 40a027d

File tree

1 file changed

+46
-16
lines changed

1 file changed

+46
-16
lines changed

sound/soc/codecs/wm_adsp.c

Lines changed: 46 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -581,6 +581,8 @@ struct wm_adsp_compr_buf {
581581
int read_index;
582582
int avail;
583583
int host_buf_mem_type;
584+
int num_regions;
585+
const struct wm_adsp_buffer_region_def *region_def;
584586
};
585587

586588
struct wm_adsp_compr {
@@ -649,11 +651,27 @@ static const struct wm_adsp_buffer_region_def default_regions[] = {
649651
},
650652
};
651653

654+
static const struct wm_adsp_buffer_region_def vpu_regions[] = {
655+
{
656+
.mem_type = WMFW_VPU_DM,
657+
.base_offset = HOST_BUFFER_FIELD(buf1_base),
658+
.size_offset = HOST_BUFFER_FIELD(buf1_size),
659+
},
660+
{
661+
.mem_type = WMFW_VPU_DM,
662+
.base_offset = HOST_BUFFER_FIELD(buf2_base),
663+
.size_offset = HOST_BUFFER_FIELD(buf1_buf2_size),
664+
},
665+
{
666+
.mem_type = WMFW_VPU_DM,
667+
.base_offset = HOST_BUFFER_FIELD(buf3_base),
668+
.size_offset = HOST_BUFFER_FIELD(buf_total_size),
669+
},
670+
};
671+
652672
struct wm_adsp_fw_caps {
653673
u32 id;
654674
struct snd_codec_desc desc;
655-
int num_regions;
656-
const struct wm_adsp_buffer_region_def *region_defs;
657675
};
658676

659677
static const struct wm_adsp_fw_caps ctrl_caps[] = {
@@ -665,8 +683,6 @@ static const struct wm_adsp_fw_caps ctrl_caps[] = {
665683
.num_sample_rates = 1,
666684
.formats = SNDRV_PCM_FMTBIT_S16_LE,
667685
},
668-
.num_regions = ARRAY_SIZE(default_regions),
669-
.region_defs = default_regions,
670686
},
671687
};
672688

@@ -683,8 +699,6 @@ static const struct wm_adsp_fw_caps trace_caps[] = {
683699
.num_sample_rates = 15,
684700
.formats = SNDRV_PCM_FMTBIT_S16_LE,
685701
},
686-
.num_regions = ARRAY_SIZE(default_regions),
687-
.region_defs = default_regions,
688702
},
689703
};
690704

@@ -4351,23 +4365,22 @@ static int wm_adsp_buffer_locate(struct wm_adsp_compr_buf *buf)
43514365

43524366
static int wm_adsp_buffer_populate(struct wm_adsp_compr_buf *buf)
43534367
{
4354-
const struct wm_adsp_fw_caps *caps = wm_adsp_fw[buf->dsp->fw].caps;
43554368
struct wm_adsp_buffer_region *region;
43564369
u32 offset = 0;
43574370
int i, ret;
43584371

4359-
for (i = 0; i < caps->num_regions; ++i) {
4372+
for (i = 0; i < buf->num_regions; ++i) {
43604373
region = &buf->regions[i];
43614374

43624375
region->offset = offset;
4363-
region->mem_type = caps->region_defs[i].mem_type;
4376+
region->mem_type = buf->region_def[i].mem_type;
43644377

4365-
ret = wm_adsp_buffer_read(buf, caps->region_defs[i].base_offset,
4378+
ret = wm_adsp_buffer_read(buf, buf->region_def[i].base_offset,
43664379
&region->base_addr);
43674380
if (ret < 0)
43684381
return ret;
43694382

4370-
ret = wm_adsp_buffer_read(buf, caps->region_defs[i].size_offset,
4383+
ret = wm_adsp_buffer_read(buf, buf->region_def[i].size_offset,
43714384
&offset);
43724385
if (ret < 0)
43734386
return ret;
@@ -4403,14 +4416,31 @@ static int wm_adsp_buffer_init(struct wm_adsp *dsp)
44034416

44044417
wm_adsp_buffer_clear(buf);
44054418

4419+
switch (dsp->type) {
4420+
case WMFW_ADSP1:
4421+
case WMFW_ADSP2:
4422+
case WMFW_HALO:
4423+
buf->num_regions = ARRAY_SIZE(default_regions);
4424+
buf->region_def = default_regions;
4425+
break;
4426+
case WMFW_VPU:
4427+
buf->num_regions = ARRAY_SIZE(vpu_regions);
4428+
buf->region_def = vpu_regions;
4429+
break;
4430+
default:
4431+
adsp_err(dsp, "Unknown DSP type:%d\n", dsp->type);
4432+
ret = -EINVAL;
4433+
goto err_buffer;
4434+
}
4435+
44064436
ret = wm_adsp_buffer_locate(buf);
44074437
if (ret < 0) {
44084438
adsp_err(dsp, "Failed to acquire host buffer: %d\n", ret);
44094439
goto err_buffer;
44104440
}
44114441

4412-
buf->regions = kcalloc(wm_adsp_fw[dsp->fw].caps->num_regions,
4413-
sizeof(*buf->regions), GFP_KERNEL);
4442+
buf->regions = kcalloc(buf->num_regions, sizeof(*buf->regions),
4443+
GFP_KERNEL);
44144444
if (!buf->regions) {
44154445
ret = -ENOMEM;
44164446
goto err_buffer;
@@ -4495,7 +4525,7 @@ EXPORT_SYMBOL_GPL(wm_adsp_compr_trigger);
44954525

44964526
static inline int wm_adsp_buffer_size(struct wm_adsp_compr_buf *buf)
44974527
{
4498-
int last_region = wm_adsp_fw[buf->dsp->fw].caps->num_regions - 1;
4528+
int last_region = buf->num_regions - 1;
44994529

45004530
return buf->regions[last_region].cumulative_size;
45014531
}
@@ -4695,11 +4725,11 @@ static int wm_adsp_buffer_capture_block(struct wm_adsp_compr *compr, int target)
46954725
int data_word_size = buf->dsp->data_word_size;
46964726

46974727
/* Calculate read parameters */
4698-
for (i = 0; i < wm_adsp_fw[buf->dsp->fw].caps->num_regions; ++i)
4728+
for (i = 0; i < buf->num_regions; ++i)
46994729
if (buf->read_index < buf->regions[i].cumulative_size)
47004730
break;
47014731

4702-
if (i == wm_adsp_fw[buf->dsp->fw].caps->num_regions)
4732+
if (i == buf->num_regions)
47034733
return -EINVAL;
47044734

47054735
mem_type = buf->regions[i].mem_type;

0 commit comments

Comments
 (0)