162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * generic arrays 462306a36Sopenharmony_ci */ 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#include <linux/slab.h> 762306a36Sopenharmony_ci#include <sound/core.h> 862306a36Sopenharmony_ci#include <sound/hdaudio.h> 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci/** 1162306a36Sopenharmony_ci * snd_array_new - get a new element from the given array 1262306a36Sopenharmony_ci * @array: the array object 1362306a36Sopenharmony_ci * 1462306a36Sopenharmony_ci * Get a new element from the given array. If it exceeds the 1562306a36Sopenharmony_ci * pre-allocated array size, re-allocate the array. 1662306a36Sopenharmony_ci * 1762306a36Sopenharmony_ci * Returns NULL if allocation failed. 1862306a36Sopenharmony_ci */ 1962306a36Sopenharmony_civoid *snd_array_new(struct snd_array *array) 2062306a36Sopenharmony_ci{ 2162306a36Sopenharmony_ci if (snd_BUG_ON(!array->elem_size)) 2262306a36Sopenharmony_ci return NULL; 2362306a36Sopenharmony_ci if (array->used >= array->alloced) { 2462306a36Sopenharmony_ci int num = array->alloced + array->alloc_align; 2562306a36Sopenharmony_ci int oldsize = array->alloced * array->elem_size; 2662306a36Sopenharmony_ci int size = (num + 1) * array->elem_size; 2762306a36Sopenharmony_ci void *nlist; 2862306a36Sopenharmony_ci if (snd_BUG_ON(num >= 4096)) 2962306a36Sopenharmony_ci return NULL; 3062306a36Sopenharmony_ci nlist = krealloc(array->list, size, GFP_KERNEL); 3162306a36Sopenharmony_ci if (!nlist) 3262306a36Sopenharmony_ci return NULL; 3362306a36Sopenharmony_ci memset(nlist + oldsize, 0, size - oldsize); 3462306a36Sopenharmony_ci array->list = nlist; 3562306a36Sopenharmony_ci array->alloced = num; 3662306a36Sopenharmony_ci } 3762306a36Sopenharmony_ci return snd_array_elem(array, array->used++); 3862306a36Sopenharmony_ci} 3962306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(snd_array_new); 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci/** 4262306a36Sopenharmony_ci * snd_array_free - free the given array elements 4362306a36Sopenharmony_ci * @array: the array object 4462306a36Sopenharmony_ci */ 4562306a36Sopenharmony_civoid snd_array_free(struct snd_array *array) 4662306a36Sopenharmony_ci{ 4762306a36Sopenharmony_ci kfree(array->list); 4862306a36Sopenharmony_ci array->used = 0; 4962306a36Sopenharmony_ci array->alloced = 0; 5062306a36Sopenharmony_ci array->list = NULL; 5162306a36Sopenharmony_ci} 5262306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(snd_array_free); 53