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