MLK-22168: fsl_easrc:Add error handle for format check
authorShengjiu Wang <shengjiu.wang@nxp.com>
Thu, 4 Jul 2019 07:29:57 +0000 (15:29 +0800)
committerShengjiu Wang <shengjiu.wang@nxp.com>
Fri, 19 Jul 2019 10:25:29 +0000 (18:25 +0800)
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 <shengjiu.wang@nxp.com>
Reviewed-by: Viorel Suman <viorel.suman@nxp.com>
sound/soc/fsl/fsl_easrc.c
sound/soc/fsl/fsl_easrc_m2m.c

index 8598275..49b7fc7 100644 (file)
@@ -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),
index 6acbb3b..4a44df1 100644 (file)
@@ -480,10 +480,19 @@ static long fsl_easrc_ioctl_config_context(struct fsl_easrc_m2m *m2m,
                return ret;
        }
 
-       fsl_easrc_process_format(easrc, &ctx->in_params.fmt,
+       ret = fsl_easrc_process_format(easrc, &ctx->in_params.fmt,
                                 config.input_format);
-       fsl_easrc_process_format(easrc, &ctx->out_params.fmt,
+       if (ret) {
+               dev_err(dev, "input format error %d\n", ret);
+               return ret;
+       }
+
+       ret = fsl_easrc_process_format(easrc, &ctx->out_params.fmt,
                                 config.output_format);
+       if (ret) {
+               dev_err(dev, "output format error %d\n", ret);
+               return ret;
+       }
 
        /* FIXME - fix sample position?
         * if the input sample is 16-bits wide and left-justified on a