OSDN Git Service

ALSA: hda - Add generic arrays
authorTakashi Iwai <tiwai@suse.de>
Wed, 30 Jul 2008 13:01:44 +0000 (15:01 +0200)
committerTakashi Iwai <tiwai@suse.de>
Mon, 13 Oct 2008 00:42:58 +0000 (02:42 +0200)
Added helper functions to handle generic arrays.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/pci/hda/hda_codec.c
sound/pci/hda/hda_codec.h

index 19b4530..e703031 100644 (file)
@@ -3196,3 +3196,37 @@ int snd_hda_codecs_inuse(struct hda_bus *bus)
 }
 #endif
 #endif
+
+/*
+ * generic arrays
+ */
+
+/* get a new element from the given array
+ * if it exceeds the pre-allocated array size, re-allocate the array
+ */
+void *snd_array_new(struct snd_array *array)
+{
+       if (array->used >= array->alloced) {
+               int num = array->alloced + array->alloc_align;
+               void *nlist = kcalloc(num + 1, array->elem_size, GFP_KERNEL);
+               if (!nlist)
+                       return NULL;
+               if (array->list) {
+                       memcpy(nlist, array->list,
+                              array->elem_size * array->alloced);
+                       kfree(array->list);
+               }
+               array->list = nlist;
+               array->alloced = num;
+       }
+       return array->list + (array->used++ * array->elem_size);
+}
+
+/* free the given array elements */
+void snd_array_free(struct snd_array *array)
+{
+       kfree(array->list);
+       array->used = 0;
+       array->alloced = 0;
+       array->list = NULL;
+}
index 70e8fa0..b9b2176 100644 (file)
@@ -520,6 +520,26 @@ enum {
 #define HDA_MAX_CODEC_ADDRESS  0x0f
 
 /*
+ * generic arrays
+ */
+struct snd_array {
+       unsigned int used;
+       unsigned int alloced;
+       unsigned int elem_size;
+       unsigned int alloc_align;
+       void *list;
+};
+
+void *snd_array_new(struct snd_array *array);
+void snd_array_free(struct snd_array *array);
+static inline void snd_array_init(struct snd_array *array, unsigned int size,
+                                 unsigned int align)
+{
+       array->elem_size = size;
+       array->alloc_align = align;
+}
+
+/*
  * Structures
  */