summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShengjiu Wang <shengjiu.wang@nxp.com>2019-07-11 11:07:45 +0800
committerDong Aisheng <aisheng.dong@nxp.com>2019-11-25 15:48:44 +0800
commitfe546b8f9c717eeeec90c16af193497e8fc817a0 (patch)
tree2e6b4ebafef8e600236d7f4eb2841bd5dac23d33
parentf45cca37292daf0f7f91c40ae045017564c3405d (diff)
MLK-22239-2: ASoC: fsl_easrc: Support S24_3LE and S20_3LE for m2m
upport S24_3LE and S20_3LE for m2m. Signed-off-by: Shengjiu Wang <shengjiu.wang@nxp.com> Reviewed-by: Daniel Baluta <daniel.baluta@nxp.com> Reviewed-by: Viorel Suman <viorel.suman@nxp.com>
-rw-r--r--sound/soc/fsl/fsl_easrc_m2m.c20
1 files changed, 17 insertions, 3 deletions
diff --git a/sound/soc/fsl/fsl_easrc_m2m.c b/sound/soc/fsl/fsl_easrc_m2m.c
index 74fb36ccad00..257f8588d77b 100644
--- a/sound/soc/fsl/fsl_easrc_m2m.c
+++ b/sound/soc/fsl/fsl_easrc_m2m.c
@@ -232,6 +232,11 @@ static long fsl_easrc_prepare_io_buffer(struct fsl_easrc_m2m *m2m,
dev_err(dev, "failed to copy input buffer %d\n", ret);
return ret;
}
+
+ if (buf_len % (bits / 8)) {
+ dev_err(dev, "input buffer size error\n");
+ return -EINVAL;
+ }
}
*dma_len = buf_len;
@@ -309,13 +314,16 @@ static void fsl_easrc_read_last_FIFO(struct fsl_easrc_m2m *m2m)
u32 i, reg, size, t_size = 0, width;
u32 *reg32 = NULL;
u16 *reg16 = NULL;
+ u8 *reg24 = NULL;
width = snd_pcm_format_physical_width(ctx->out_params.sample_format);
if (width == 32)
reg32 = output->dma_vaddr + output->length;
- else
+ else if (width == 16)
reg16 = output->dma_vaddr + output->length;
+ else
+ reg24 = output->dma_vaddr + output->length;
retry:
size = fsl_easrc_get_output_FIFO_size(m2m);
for (i = 0; i < size * ctx->channels; i++) {
@@ -324,9 +332,13 @@ retry:
if (reg32) {
*(reg32) = reg;
reg32++;
- } else {
+ } else if (reg16) {
*(reg16) = (u16)reg;
reg16++;
+ } else {
+ *reg24++ = (u8)reg;
+ *reg24++ = (u8)(reg >> 8);
+ *reg24++ = (u8)(reg >> 16);
}
}
t_size += size;
@@ -336,8 +348,10 @@ retry:
if (reg32)
output->length += t_size * ctx->channels * 4;
- else
+ else if (reg16)
output->length += t_size * ctx->channels * 2;
+ else
+ output->length += t_size * ctx->channels * 3;
}
static long fsl_easrc_process_buffer(struct fsl_easrc_m2m *m2m,