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) {
"%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;
}
__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) {
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]);
}