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