171fc4c7eSTakashi Iwai /* 271fc4c7eSTakashi Iwai * generic arrays 371fc4c7eSTakashi Iwai */ 471fc4c7eSTakashi Iwai 571fc4c7eSTakashi Iwai #include <linux/slab.h> 671fc4c7eSTakashi Iwai #include <sound/core.h> 771fc4c7eSTakashi Iwai #include <sound/hdaudio.h> 871fc4c7eSTakashi Iwai 971fc4c7eSTakashi Iwai /** 1071fc4c7eSTakashi Iwai * snd_array_new - get a new element from the given array 1171fc4c7eSTakashi Iwai * @array: the array object 1271fc4c7eSTakashi Iwai * 1371fc4c7eSTakashi Iwai * Get a new element from the given array. If it exceeds the 1471fc4c7eSTakashi Iwai * pre-allocated array size, re-allocate the array. 1571fc4c7eSTakashi Iwai * 1671fc4c7eSTakashi Iwai * Returns NULL if allocation failed. 1771fc4c7eSTakashi Iwai */ 1871fc4c7eSTakashi Iwai void *snd_array_new(struct snd_array *array) 1971fc4c7eSTakashi Iwai { 2071fc4c7eSTakashi Iwai if (snd_BUG_ON(!array->elem_size)) 2171fc4c7eSTakashi Iwai return NULL; 2271fc4c7eSTakashi Iwai if (array->used >= array->alloced) { 2371fc4c7eSTakashi Iwai int num = array->alloced + array->alloc_align; 24*33baefe5STakashi Iwai int oldsize = array->alloced * array->elem_size; 2571fc4c7eSTakashi Iwai int size = (num + 1) * array->elem_size; 2671fc4c7eSTakashi Iwai void *nlist; 2771fc4c7eSTakashi Iwai if (snd_BUG_ON(num >= 4096)) 2871fc4c7eSTakashi Iwai return NULL; 29*33baefe5STakashi Iwai nlist = krealloc(array->list, size, GFP_KERNEL); 3071fc4c7eSTakashi Iwai if (!nlist) 3171fc4c7eSTakashi Iwai return NULL; 32*33baefe5STakashi Iwai memset(nlist + oldsize, 0, size - oldsize); 3371fc4c7eSTakashi Iwai array->list = nlist; 3471fc4c7eSTakashi Iwai array->alloced = num; 3571fc4c7eSTakashi Iwai } 3671fc4c7eSTakashi Iwai return snd_array_elem(array, array->used++); 3771fc4c7eSTakashi Iwai } 3871fc4c7eSTakashi Iwai EXPORT_SYMBOL_GPL(snd_array_new); 3971fc4c7eSTakashi Iwai 4071fc4c7eSTakashi Iwai /** 4171fc4c7eSTakashi Iwai * snd_array_free - free the given array elements 4271fc4c7eSTakashi Iwai * @array: the array object 4371fc4c7eSTakashi Iwai */ 4471fc4c7eSTakashi Iwai void snd_array_free(struct snd_array *array) 4571fc4c7eSTakashi Iwai { 4671fc4c7eSTakashi Iwai kfree(array->list); 4771fc4c7eSTakashi Iwai array->used = 0; 4871fc4c7eSTakashi Iwai array->alloced = 0; 4971fc4c7eSTakashi Iwai array->list = NULL; 5071fc4c7eSTakashi Iwai } 5171fc4c7eSTakashi Iwai EXPORT_SYMBOL_GPL(snd_array_free); 52