From 2ca6909313e86735557e53f086499eed8038b517 Mon Sep 17 00:00:00 2001 From: Shengjiu Wang Date: Thu, 4 Jul 2019 15:29:57 +0800 Subject: =?UTF-8?q?MLK-22168:=20fsl=5Feasrc=EF=BC=9AAdd=20error=20handle?= =?UTF-8?q?=20for=20format=20check?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add error handler for format check, if the format is not supported should return error, otherwise it cause "input DMA task timeout" Signed-off-by: Shengjiu Wang Reviewed-by: Viorel Suman --- sound/soc/fsl/fsl_easrc.c | 36 ++++++++++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 8 deletions(-) (limited to 'sound/soc/fsl/fsl_easrc.c') diff --git a/sound/soc/fsl/fsl_easrc.c b/sound/soc/fsl/fsl_easrc.c index 859827517797..49b7fc7e083b 100644 --- a/sound/soc/fsl/fsl_easrc.c +++ b/sound/soc/fsl/fsl_easrc.c @@ -1154,12 +1154,14 @@ int fsl_easrc_config_context(struct fsl_easrc *easrc, unsigned int ctx_id) return ret; } -void fsl_easrc_process_format(struct fsl_easrc *easrc, +static int fsl_easrc_process_format(struct fsl_easrc *easrc, struct fsl_easrc_data_fmt *fmt, snd_pcm_format_t raw_fmt) { + int ret; + if (!fmt) - return; + return -EINVAL; /* Context Input Floating Point Format * 0 - Integer Format @@ -1183,6 +1185,8 @@ void fsl_easrc_process_format(struct fsl_easrc *easrc, case 32: fmt->width = EASRC_WIDTH_32_BIT; break; + default: + return -EINVAL; } switch (raw_fmt) { @@ -1205,12 +1209,22 @@ void fsl_easrc_process_format(struct fsl_easrc *easrc, * 0 - Little-Endian * 1 - Big-Endian */ - fmt->endianness = snd_pcm_format_big_endian(raw_fmt); + ret = snd_pcm_format_big_endian(raw_fmt); + if (ret < 0) + return ret; + + fmt->endianness = ret; /* Input Data sign * 0b - Signed Format * 1b - Unsigned Format */ - fmt->unsign = snd_pcm_format_unsigned(raw_fmt) > 0 ? 1 : 0; + ret = snd_pcm_format_unsigned(raw_fmt) > 0 ? 1 : 0; + if (ret < 0) + return ret; + + fmt->unsign = ret; + + return 0; } int fsl_easrc_set_ctx_format(struct fsl_easrc_context *ctx, @@ -1223,8 +1237,11 @@ int fsl_easrc_set_ctx_format(struct fsl_easrc_context *ctx, int ret; /* get the bitfield values for input data format */ - if (in_raw_format && out_raw_format) - fsl_easrc_process_format(easrc, in_fmt, *in_raw_format); + if (in_raw_format && out_raw_format) { + ret = fsl_easrc_process_format(easrc, in_fmt, *in_raw_format); + if (ret) + return ret; + } ret = regmap_update_bits(easrc->regmap, REG_EASRC_CC(ctx->index), @@ -1261,8 +1278,11 @@ int fsl_easrc_set_ctx_format(struct fsl_easrc_context *ctx, return ret; /* get the bitfield values for input data format */ - if (in_raw_format && out_raw_format) - fsl_easrc_process_format(easrc, out_fmt, *out_raw_format); + if (in_raw_format && out_raw_format) { + ret = fsl_easrc_process_format(easrc, out_fmt, *out_raw_format); + if (ret) + return ret; + } ret = regmap_update_bits(easrc->regmap, REG_EASRC_COC(ctx->index), -- cgit v1.2.3