gh.c revision 4f551c8f6b89902a83328fbf50585ec7ee03ed5a
17227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna/*
27227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna * gh.c
37227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna *
47227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna * DSP-BIOS Bridge driver support functions for TI OMAP processors.
57227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna *
67227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna * Copyright (C) 2005-2006 Texas Instruments, Inc.
77227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna *
87227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna * This package is free software; you can redistribute it and/or modify
97227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna * it under the terms of the GNU General Public License version 2 as
107227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna * published by the Free Software Foundation.
117227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna *
127227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
137227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
147227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
157227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna */
167227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna
177227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna#include <dspbridge/std.h>
187227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna
197227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna#include <dspbridge/host_os.h>
207227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna
217227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna#include <dspbridge/gs.h>
227227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna
237227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna#include <dspbridge/gh.h>
247227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna
257227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Lunastruct element {
267227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna	struct element *next;
277227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna	u8 data[1];
287227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna};
297227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna
307227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Lunastruct gh_t_hash_tab {
317227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna	u16 max_bucket;
327227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna	u16 val_size;
337227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna	struct element **buckets;
347227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna	 u16(*hash) (void *, u16);
357227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna	 bool(*match) (void *, void *);
367227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna	void (*delete) (void *);
377227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna};
387227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna
397227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Lunastatic void noop(void *p);
407227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Lunastatic s32 cur_init;
417227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Lunastatic void myfree(void *ptr, s32 size);
427227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna
437227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna/*
447227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna *  ======== gh_create ========
457227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna */
467227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna
477227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Lunastruct gh_t_hash_tab *gh_create(u16 max_bucket, u16 val_size,
487227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna				u16(*hash) (void *, u16), bool(*match) (void *,
497227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna									void *),
507227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna				void (*delete) (void *))
517227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna{
527227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna	struct gh_t_hash_tab *hash_tab;
537227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna	u16 i;
547227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna	hash_tab =
557227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna	    (struct gh_t_hash_tab *)gs_alloc(sizeof(struct gh_t_hash_tab));
567227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna	if (hash_tab == NULL)
577227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna		return NULL;
587227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna	hash_tab->max_bucket = max_bucket;
597227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna	hash_tab->val_size = val_size;
607227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna	hash_tab->hash = hash;
617227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna	hash_tab->match = match;
627227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna	hash_tab->delete = delete == NULL ? noop : delete;
637227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna
647227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna	hash_tab->buckets = (struct element **)
657227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna	    gs_alloc(sizeof(struct element *) * max_bucket);
667227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna	if (hash_tab->buckets == NULL) {
677227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna		gh_delete(hash_tab);
687227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna		return NULL;
697227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna	}
707227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna
717227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna	for (i = 0; i < max_bucket; i++)
727227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna		hash_tab->buckets[i] = NULL;
737227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna
747227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna	return hash_tab;
757227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna}
767227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna
777227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna/*
787227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna *  ======== gh_delete ========
797227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna */
807227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Lunavoid gh_delete(struct gh_t_hash_tab *hash_tab)
817227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna{
827227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna	struct element *elem, *next;
837227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna	u16 i;
847227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna
857227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna	if (hash_tab != NULL) {
867227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna		if (hash_tab->buckets != NULL) {
877227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna			for (i = 0; i < hash_tab->max_bucket; i++) {
887227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna				for (elem = hash_tab->buckets[i]; elem != NULL;
897227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna				     elem = next) {
907227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna					next = elem->next;
917227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna					(*hash_tab->delete) (elem->data);
927227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna					myfree(elem,
937227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna					       sizeof(struct element) - 1 +
947227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna					       hash_tab->val_size);
957227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna				}
967227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna			}
977227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna
987227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna			myfree(hash_tab->buckets, sizeof(struct element *)
997227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna			       * hash_tab->max_bucket);
1007227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna		}
1017227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna
1027227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna		myfree(hash_tab, sizeof(struct gh_t_hash_tab));
1037227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna	}
1047227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna}
1057227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna
1067227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna/*
1077227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna *  ======== gh_exit ========
1087227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna */
1097227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna
1107227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Lunavoid gh_exit(void)
1117227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna{
1127227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna	if (cur_init-- == 1)
1137227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna		gs_exit();
1147227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna
1157227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna}
1167227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna
1177227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna/*
1187227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna *  ======== gh_find ========
1197227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna */
1207227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna
1217227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Lunavoid *gh_find(struct gh_t_hash_tab *hash_tab, void *key)
1227227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna{
1237227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna	struct element *elem;
1247227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna
1257227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna	elem = hash_tab->buckets[(*hash_tab->hash) (key, hash_tab->max_bucket)];
1267227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna
1277227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna	for (; elem; elem = elem->next) {
1287227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna		if ((*hash_tab->match) (key, elem->data))
1297227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna			return elem->data;
1307227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna	}
1317227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna
1327227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna	return NULL;
1337227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna}
1347227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna
1357227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna/*
1367227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna *  ======== gh_init ========
1377227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna */
1387227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna
1397227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Lunavoid gh_init(void)
1407227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna{
1417227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna	if (cur_init++ == 0)
1427227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna		gs_init();
1437227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna}
1447227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna
1457227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna/*
1467227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna *  ======== gh_insert ========
1477227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna */
1487227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna
1497227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Lunavoid *gh_insert(struct gh_t_hash_tab *hash_tab, void *key, void *value)
1507227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna{
1517227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna	struct element *elem;
1527227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna	u16 i;
1537227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna	char *src, *dst;
1547227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna
1557227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna	elem = (struct element *)gs_alloc(sizeof(struct element) - 1 +
1567227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna					  hash_tab->val_size);
1577227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna	if (elem != NULL) {
1587227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna
1597227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna		dst = (char *)elem->data;
1607227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna		src = (char *)value;
1617227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna		for (i = 0; i < hash_tab->val_size; i++)
1627227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna			*dst++ = *src++;
1637227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna
1647227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna		i = (*hash_tab->hash) (key, hash_tab->max_bucket);
1657227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna		elem->next = hash_tab->buckets[i];
1667227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna		hash_tab->buckets[i] = elem;
1677227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna
1687227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna		return elem->data;
1697227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna	}
1707227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna
1717227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna	return NULL;
1727227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna}
1737227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna
1747227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna/*
1757227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna *  ======== noop ========
1767227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna */
1777227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna/* ARGSUSED */
1787227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Lunastatic void noop(void *p)
1797227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna{
1807227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna	p = p;			/* stifle compiler warning */
1817227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna}
1827227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna
1837227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna/*
1847227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna *  ======== myfree ========
1857227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna */
1867227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Lunastatic void myfree(void *ptr, s32 size)
1877227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna{
1887227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna	gs_free(ptr);
1897227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna}
1907227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna
1914f551c8f6b89902a83328fbf50585ec7ee03ed5aFelipe Contreras#ifdef CONFIG_TIDSPBRIDGE_BACKTRACE
1927227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna/**
1937227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna * gh_iterate() - This function goes through all the elements in the hash table
1947227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna *		looking for the dsp symbols.
1957227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna * @hash_tab:	Hash table
1967227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna * @callback:	pointer to callback function
1977227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna * @user_data:	User data, contains the find_symbol_context pointer
1987227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna *
1997227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna */
2007227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Lunavoid gh_iterate(struct gh_t_hash_tab *hash_tab,
2017227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna		void (*callback)(void *, void *), void *user_data)
2027227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna{
2037227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna	struct element *elem;
2047227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna	u32 i;
2057227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna
2067227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna	if (hash_tab && hash_tab->buckets)
2077227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna		for (i = 0; i < hash_tab->max_bucket; i++) {
2087227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna			elem = hash_tab->buckets[i];
2097227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna			while (elem) {
2107227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna				callback(&elem->data, user_data);
2117227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna				elem = elem->next;
2127227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna			}
2137227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna		}
2147227b671f7dd2f0d0c7cc700b184f0cdf5d6ee65Omar Ramirez Luna}
2154f551c8f6b89902a83328fbf50585ec7ee03ed5aFelipe Contreras#endif
216