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