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