xref: /OK3568_Linux_fs/kernel/sound/hda/array.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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*4882a593Smuzhiyun void *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*4882a593Smuzhiyun void 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