diff options
author | Takashi Iwai <tiwai@suse.de> | 2008-07-30 09:01:44 -0400 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2008-10-12 20:42:58 -0400 |
commit | b2e1859745b783922533d29e3b03af29378a23f0 (patch) | |
tree | f71eba89ae3a5bd3f7a6e3640f62904872f5c071 /sound/pci/hda | |
parent | 176d5335fe66f379a339b0ab99cc7566e90ff1a9 (diff) |
ALSA: hda - Add generic arrays
Added helper functions to handle generic arrays.
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/pci/hda')
-rw-r--r-- | sound/pci/hda/hda_codec.c | 34 | ||||
-rw-r--r-- | sound/pci/hda/hda_codec.h | 20 |
2 files changed, 54 insertions, 0 deletions
diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c index 19b4530e3baf..e70303183c3c 100644 --- a/sound/pci/hda/hda_codec.c +++ b/sound/pci/hda/hda_codec.c | |||
@@ -3196,3 +3196,37 @@ int snd_hda_codecs_inuse(struct hda_bus *bus) | |||
3196 | } | 3196 | } |
3197 | #endif | 3197 | #endif |
3198 | #endif | 3198 | #endif |
3199 | |||
3200 | /* | ||
3201 | * generic arrays | ||
3202 | */ | ||
3203 | |||
3204 | /* get a new element from the given array | ||
3205 | * if it exceeds the pre-allocated array size, re-allocate the array | ||
3206 | */ | ||
3207 | void *snd_array_new(struct snd_array *array) | ||
3208 | { | ||
3209 | if (array->used >= array->alloced) { | ||
3210 | int num = array->alloced + array->alloc_align; | ||
3211 | void *nlist = kcalloc(num + 1, array->elem_size, GFP_KERNEL); | ||
3212 | if (!nlist) | ||
3213 | return NULL; | ||
3214 | if (array->list) { | ||
3215 | memcpy(nlist, array->list, | ||
3216 | array->elem_size * array->alloced); | ||
3217 | kfree(array->list); | ||
3218 | } | ||
3219 | array->list = nlist; | ||
3220 | array->alloced = num; | ||
3221 | } | ||
3222 | return array->list + (array->used++ * array->elem_size); | ||
3223 | } | ||
3224 | |||
3225 | /* free the given array elements */ | ||
3226 | void snd_array_free(struct snd_array *array) | ||
3227 | { | ||
3228 | kfree(array->list); | ||
3229 | array->used = 0; | ||
3230 | array->alloced = 0; | ||
3231 | array->list = NULL; | ||
3232 | } | ||
diff --git a/sound/pci/hda/hda_codec.h b/sound/pci/hda/hda_codec.h index 70e8fa09273d..b9b21766b730 100644 --- a/sound/pci/hda/hda_codec.h +++ b/sound/pci/hda/hda_codec.h | |||
@@ -520,6 +520,26 @@ enum { | |||
520 | #define HDA_MAX_CODEC_ADDRESS 0x0f | 520 | #define HDA_MAX_CODEC_ADDRESS 0x0f |
521 | 521 | ||
522 | /* | 522 | /* |
523 | * generic arrays | ||
524 | */ | ||
525 | struct snd_array { | ||
526 | unsigned int used; | ||
527 | unsigned int alloced; | ||
528 | unsigned int elem_size; | ||
529 | unsigned int alloc_align; | ||
530 | void *list; | ||
531 | }; | ||
532 | |||
533 | void *snd_array_new(struct snd_array *array); | ||
534 | void snd_array_free(struct snd_array *array); | ||
535 | static inline void snd_array_init(struct snd_array *array, unsigned int size, | ||
536 | unsigned int align) | ||
537 | { | ||
538 | array->elem_size = size; | ||
539 | array->alloc_align = align; | ||
540 | } | ||
541 | |||
542 | /* | ||
523 | * Structures | 543 | * Structures |
524 | */ | 544 | */ |
525 | 545 | ||