1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * generic arrays 4 */ 5 6 #include <linux/slab.h> 7 #include <sound/core.h> 8 #include <sound/hdaudio.h> 9 10 /** 11 * snd_array_new - get a new element from the given array 12 * @array: the array object 13 * 14 * Get a new element from the given array. If it exceeds the 15 * pre-allocated array size, re-allocate the array. 16 * 17 * Returns NULL if allocation failed. 18 */ snd_array_new(struct snd_array * array)19void *snd_array_new(struct snd_array *array) 20 { 21 if (snd_BUG_ON(!array->elem_size)) 22 return NULL; 23 if (array->used >= array->alloced) { 24 int num = array->alloced + array->alloc_align; 25 int oldsize = array->alloced * array->elem_size; 26 int size = (num + 1) * array->elem_size; 27 void *nlist; 28 if (snd_BUG_ON(num >= 4096)) 29 return NULL; 30 nlist = krealloc(array->list, size, GFP_KERNEL); 31 if (!nlist) 32 return NULL; 33 memset(nlist + oldsize, 0, size - oldsize); 34 array->list = nlist; 35 array->alloced = num; 36 } 37 return snd_array_elem(array, array->used++); 38 } 39 EXPORT_SYMBOL_GPL(snd_array_new); 40 41 /** 42 * snd_array_free - free the given array elements 43 * @array: the array object 44 */ snd_array_free(struct snd_array * array)45void snd_array_free(struct snd_array *array) 46 { 47 kfree(array->list); 48 array->used = 0; 49 array->alloced = 0; 50 array->list = NULL; 51 } 52 EXPORT_SYMBOL_GPL(snd_array_free); 53