]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ASoC: pcm6240: Use flexible array for config blocks
authorRosen Penev <rosenp@gmail.com>
Mon, 11 May 2026 23:13:13 +0000 (16:13 -0700)
committerMark Brown <broonie@kernel.org>
Sat, 16 May 2026 02:29:30 +0000 (11:29 +0900)
Store the per-config block pointer table in the config allocation
instead of allocating it separately.

This ties the table to the config object lifetime and removes the
extra allocation and free path.

Assisted-by: Codex:GPT-5.5
Signed-off-by: Rosen Penev <rosenp@gmail.com>
Link: https://patch.msgid.link/20260511231313.31929-1-rosenp@gmail.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/codecs/pcm6240.c
sound/soc/codecs/pcm6240.h

index 78b21fbfad50e03ce04dab8201752024fcad3c1e..667596fc1781b6e40f62fe707d21850c388978ee 100644 (file)
@@ -1230,15 +1230,11 @@ static struct pcmdevice_config_info *pcmdevice_add_config(void *ctxt,
        int *status)
 {
        struct pcmdevice_priv *pcm_dev = (struct pcmdevice_priv *)ctxt;
-       struct pcmdevice_config_info *cfg_info;
+       struct pcmdevice_config_info *cfg_info = NULL;
        struct pcmdevice_block_data **bk_da;
+       char cfg_name[64] = {};
        unsigned int config_offset = 0, i;
-
-       cfg_info = kzalloc_obj(struct pcmdevice_config_info);
-       if (!cfg_info) {
-               *status = -ENOMEM;
-               goto out;
-       }
+       unsigned int nblocks;
 
        if (pcm_dev->regbin.fw_hdr.binary_version_num >= 0x105) {
                if (config_offset + 64 > (int)config_size) {
@@ -1247,7 +1243,7 @@ static struct pcmdevice_config_info *pcmdevice_add_config(void *ctxt,
                                "%s: cfg_name out of boundary\n", __func__);
                        goto out;
                }
-               memcpy(cfg_info->cfg_name, &config_data[config_offset], 64);
+               memcpy(cfg_name, &config_data[config_offset], 64);
                config_offset += 64;
        }
 
@@ -1257,16 +1253,17 @@ static struct pcmdevice_config_info *pcmdevice_add_config(void *ctxt,
                        __func__);
                goto out;
        }
-       cfg_info->nblocks =
-               get_unaligned_be32(&config_data[config_offset]);
+       nblocks = get_unaligned_be32(&config_data[config_offset]);
        config_offset += 4;
 
-       bk_da = cfg_info->blk_data = kzalloc_objs(struct pcmdevice_block_data *,
-                                                 cfg_info->nblocks);
-       if (!bk_da) {
+       cfg_info = kzalloc_flex(*cfg_info, blk_data, nblocks);
+       if (!cfg_info) {
                *status = -ENOMEM;
                goto out;
        }
+       cfg_info->nblocks = nblocks;
+       memcpy(cfg_info->cfg_name, cfg_name, sizeof(cfg_info->cfg_name));
+       bk_da = cfg_info->blk_data;
        cfg_info->real_nblocks = 0;
        for (i = 0; i < cfg_info->nblocks; i++) {
                if (config_offset + 12 > config_size) {
@@ -1449,14 +1446,11 @@ static void pcmdevice_config_info_remove(void *ctxt)
        for (i = 0; i < regbin->ncfgs; i++) {
                if (!cfg_info[i])
                        continue;
-               if (cfg_info[i]->blk_data) {
-                       for (j = 0; j < (int)cfg_info[i]->real_nblocks; j++) {
-                               if (!cfg_info[i]->blk_data[j])
-                                       continue;
-                               kfree(cfg_info[i]->blk_data[j]->regdata);
-                               kfree(cfg_info[i]->blk_data[j]);
-                       }
-                       kfree(cfg_info[i]->blk_data);
+               for (j = 0; j < (int)cfg_info[i]->real_nblocks; j++) {
+                       if (!cfg_info[i]->blk_data[j])
+                               continue;
+                       kfree(cfg_info[i]->blk_data[j]->regdata);
+                       kfree(cfg_info[i]->blk_data[j]);
                }
                kfree(cfg_info[i]);
        }
index 2d8f9e798139ac7df30606c0e5381a7b24d84728..e27afd33910c4b6d7df59f9be5b0d8543d28ea6a 100644 (file)
@@ -199,7 +199,7 @@ struct pcmdevice_config_info {
        unsigned int nblocks;
        unsigned int real_nblocks;
        unsigned char active_dev;
-       struct pcmdevice_block_data **blk_data;
+       struct pcmdevice_block_data *blk_data[] __counted_by(nblocks);
 };
 
 struct pcmdevice_regbin {