OSDN Git Service

ASoC: wm_adsp: Only use __be32 for big-endian data
authorRichard Fitzgerald <rf@opensource.cirrus.com>
Wed, 30 Dec 2020 17:24:26 +0000 (17:24 +0000)
committerMark Brown <broonie@kernel.org>
Thu, 31 Dec 2020 13:26:23 +0000 (13:26 +0000)
This fixes some minor cases where u32 or unsigned int types were used
to store big-endian data, and __be32 types used to store both big-endian
and cpu-endian data. This was producing sparse warnings.

Most cases resulted from using the same variable to hold the big-endian
value and its converted cpu-endian value. These can be simply fixed by
introducing another local variable, or avoiding storing the intermediate
value back into the original variable.

One special case is the raw_buf used in the compressed streams to transfer
data from DSP to user-side. The endian conversion happens in-place (as
there's no point introducing another buffer) so a cast to (__be32 *) is
added when passing it to wm_adsp_read_raw_data_block().

Signed-off-by: Richard Fitzgerald <rf@opensource.cirrus.com>
Link: https://lore.kernel.org/r/20201230172427.13865-1-rf@opensource.cirrus.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/codecs/wm_adsp.c

index 5b7d81a..8cfa8ac 100644 (file)
@@ -980,7 +980,7 @@ static int wm_coeff_write_acked_control(struct wm_coeff_ctl *ctl,
                                        unsigned int event_id)
 {
        struct wm_adsp *dsp = ctl->dsp;
-       u32 val = cpu_to_be32(event_id);
+       __be32 val = cpu_to_be32(event_id);
        unsigned int reg;
        int i, ret;
 
@@ -3704,6 +3704,7 @@ static int wm_adsp_write_data_word(struct wm_adsp *dsp, int mem_type,
                                   unsigned int mem_addr, u32 data)
 {
        struct wm_adsp_region const *mem = wm_adsp_find_region(dsp, mem_type);
+       __be32 val = cpu_to_be32(data & 0x00ffffffu);
        unsigned int reg;
 
        if (!mem)
@@ -3711,9 +3712,7 @@ static int wm_adsp_write_data_word(struct wm_adsp *dsp, int mem_type,
 
        reg = dsp->ops->region_to_reg(mem, mem_addr);
 
-       data = cpu_to_be32(data & 0x00ffffffu);
-
-       return regmap_raw_write(dsp->regmap, reg, &data, sizeof(data));
+       return regmap_raw_write(dsp->regmap, reg, &val, sizeof(val));
 }
 
 static inline int wm_adsp_buffer_read(struct wm_adsp_compr_buf *buf,
@@ -3870,7 +3869,8 @@ static int wm_adsp_buffer_parse_coeff(struct wm_coeff_ctl *ctl)
 {
        struct wm_adsp_host_buf_coeff_v1 coeff_v1;
        struct wm_adsp_compr_buf *buf;
-       unsigned int val, reg;
+       unsigned int reg, version;
+       __be32 bufp;
        int ret, i;
 
        ret = wm_coeff_base_reg(ctl, &reg);
@@ -3878,17 +3878,17 @@ static int wm_adsp_buffer_parse_coeff(struct wm_coeff_ctl *ctl)
                return ret;
 
        for (i = 0; i < 5; ++i) {
-               ret = regmap_raw_read(ctl->dsp->regmap, reg, &val, sizeof(val));
+               ret = regmap_raw_read(ctl->dsp->regmap, reg, &bufp, sizeof(bufp));
                if (ret < 0)
                        return ret;
 
-               if (val)
+               if (bufp)
                        break;
 
                usleep_range(1000, 2000);
        }
 
-       if (!val) {
+       if (!bufp) {
                adsp_err(ctl->dsp, "Failed to acquire host buffer\n");
                return -EIO;
        }
@@ -3898,7 +3898,7 @@ static int wm_adsp_buffer_parse_coeff(struct wm_coeff_ctl *ctl)
                return -ENOMEM;
 
        buf->host_buf_mem_type = ctl->alg_region.type;
-       buf->host_buf_ptr = be32_to_cpu(val);
+       buf->host_buf_ptr = be32_to_cpu(bufp);
 
        ret = wm_adsp_buffer_populate(buf);
        if (ret < 0)
@@ -3918,14 +3918,13 @@ static int wm_adsp_buffer_parse_coeff(struct wm_coeff_ctl *ctl)
        if (ret < 0)
                return ret;
 
-       coeff_v1.versions = be32_to_cpu(coeff_v1.versions);
-       val = coeff_v1.versions & HOST_BUF_COEFF_COMPAT_VER_MASK;
-       val >>= HOST_BUF_COEFF_COMPAT_VER_SHIFT;
+       version = be32_to_cpu(coeff_v1.versions) & HOST_BUF_COEFF_COMPAT_VER_MASK;
+       version >>= HOST_BUF_COEFF_COMPAT_VER_SHIFT;
 
-       if (val > HOST_BUF_COEFF_SUPPORTED_COMPAT_VER) {
+       if (version > HOST_BUF_COEFF_SUPPORTED_COMPAT_VER) {
                adsp_err(ctl->dsp,
                         "Host buffer coeff ver %u > supported version %u\n",
-                        val, HOST_BUF_COEFF_SUPPORTED_COMPAT_VER);
+                        version, HOST_BUF_COEFF_SUPPORTED_COMPAT_VER);
                return -EINVAL;
        }
 
@@ -3935,9 +3934,9 @@ static int wm_adsp_buffer_parse_coeff(struct wm_coeff_ctl *ctl)
                              (char *)&coeff_v1.name);
 
        compr_dbg(buf, "host_buf_ptr=%x coeff version %u\n",
-                 buf->host_buf_ptr, val);
+                 buf->host_buf_ptr, version);
 
-       return val;
+       return version;
 }
 
 static int wm_adsp_buffer_init(struct wm_adsp *dsp)
@@ -4269,7 +4268,7 @@ static int wm_adsp_buffer_capture_block(struct wm_adsp_compr *compr, int target)
 
        /* Read data from DSP */
        ret = wm_adsp_read_raw_data_block(buf->dsp, mem_type, adsp_addr,
-                                         nwords, compr->raw_buf);
+                                         nwords, (__be32 *)compr->raw_buf);
        if (ret < 0)
                return ret;