summaryrefslogtreecommitdiffstats
path: root/cpukit/libdrvmgr/drvmgr_func.c
blob: e02a4446cbea23442e11d2c79f257e2d6b79cb65 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
/* Driver Manager optional dynamic function interface
 *
 * COPYRIGHT (c) 2011.
 * Cobham Gaisler AB.
 *
 * The license and distribution terms for this file may be
 * found in the file LICENSE in this distribution or at
 * http://www.rtems.com/license/LICENSE.
 */

#include <drvmgr/drvmgr.h>

/* Get Function from Function ID */
int drvmgr_func_get(void *obj, int funcid, void **func)
{
	int objtype;
	struct drvmgr_func *f;

	if (!obj)
		return DRVMGR_FAIL;
	objtype = *(int *)obj;

	if (objtype == DRVMGR_OBJ_BUS)
		f = ((struct drvmgr_bus *)obj)->funcs;
	else if (objtype == DRVMGR_OBJ_DRV)
		f = ((struct drvmgr_drv *)obj)->funcs;
	else
		return DRVMGR_FAIL;

	if (f == NULL)
		return DRVMGR_FAIL;

	while (f->funcid != DRVMGR_FUNCID_NONE) {
		if (f->funcid == funcid) {
			*func = f->func;
			return DRVMGR_OK;
		}
		f++;
	}

	return DRVMGR_FAIL;
}