diff options
Diffstat (limited to 'arch/arm/plat-omap/include/syslink/iobject.h')
-rw-r--r-- | arch/arm/plat-omap/include/syslink/iobject.h | 176 |
1 files changed, 176 insertions, 0 deletions
diff --git a/arch/arm/plat-omap/include/syslink/iobject.h b/arch/arm/plat-omap/include/syslink/iobject.h new file mode 100644 index 00000000000..4d0c1e6c7e0 --- /dev/null +++ b/arch/arm/plat-omap/include/syslink/iobject.h @@ -0,0 +1,176 @@ +/* + * iobject.h + * + * Interface to provide object creation facilities. + * + * Copyright (C) 2008-2009 Texas Instruments, Inc. + * + * This package is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR + * PURPOSE. + */ + + +#ifndef _IOBJECT_H_ +#define _IOBJECT_H_ + +/* ObjType */ +enum ipc_obj_type { + IPC_OBJTYPE_CREATESTATIC = 0x1, + IPC_OBJTYPE_CREATESTATIC_REGION = 0x2, + IPC_OBJTYPE_CREATEDYNAMIC = 0x4, + IPC_OBJTYPE_CREATEDYNAMIC_REGION = 0x8, + IPC_OBJTYPE_OPENDYNAMIC = 0x10, + IPC_OBJTYPE_LOCAL = 0x20 +}; + + +/* Object embedded in other module's object */ +#define IOBJECT_SUPEROBJECT \ + void *next; \ + int status; + +/* Generic macro to define a create/delete function for a module */ +#define IOBJECT_CREATE0(MNAME) \ +static struct MNAME##_object *MNAME##_first_object;\ +\ +\ +void *MNAME##_create(const struct MNAME##_params *params)\ +{ \ + int *key;\ + struct MNAME##_object *obj = (struct MNAME##_object *)\ + kmalloc(sizeof(struct MNAME##_object),\ + GFP_KERNEL);\ + if (!obj)\ + return NULL;\ + memset(obj, 0, sizeof(struct MNAME##_object));\ + obj->status = MNAME##_instance_init(obj, params);\ + if (obj->status == 0) { \ + key = gate_enter_system();\ + if (MNAME##_first_object == NULL) { \ + MNAME##_first_object = obj;\ + obj->next = NULL;\ + } else { \ + obj->next = MNAME##_first_object;\ + MNAME##_first_object = obj;\ + } \ + gate_leave_system(key);\ + } else { \ + kfree(obj);\ + obj = NULL;\ + } \ + return obj;\ +} \ +\ +\ +int MNAME##_delete(void **handle)\ +{ \ + int *key;\ + struct MNAME##_object *temp;\ + struct MNAME##_object *obj;\ + \ + if (handle == NULL) \ + return -EINVAL;\ + if (*handle == NULL) \ + return -EINVAL;\ + obj = (struct MNAME##_object *)(*handle);\ + key = gate_enter_system();\ + if (obj == MNAME##_first_object) \ + MNAME##_first_object = obj->next;\ + else { \ + temp = MNAME##_first_object;\ + while (temp) { \ + if (temp->next == obj) { \ + temp->next = obj->next;\ + break;\ + } else { \ + temp = temp->next;\ + } \ + } \ + if (temp == NULL) { \ + gate_leave_system(key);\ + return -EINVAL;\ + } \ + } \ + gate_leave_system(key);\ + MNAME##_instance_finalize(obj, obj->status);\ + kfree(obj);\ + *handle = NULL;\ + return 0;\ +} + +#define IOBJECT_CREATE1(MNAME, ARG) \ +static struct MNAME##_object *MNAME##_first_object;\ +\ +\ +void *MNAME##_create(ARG arg, const struct MNAME##_params *params)\ +{ \ + int *key;\ + struct MNAME##_object *obj = (struct MNAME##_object *) \ + kmalloc(sizeof(struct MNAME##_object),\ + GFP_KERNEL);\ + if (!obj) \ + return NULL;\ + memset(obj, 0, sizeof(struct MNAME##_object));\ + obj->status = MNAME##_instance_init(obj, arg, params);\ + if (obj->status == 0) { \ + key = gate_enter_system();\ + if (MNAME##_first_object == NULL) { \ + MNAME##_first_object = obj;\ + obj->next = NULL;\ + } else { \ + obj->next = MNAME##_first_object;\ + MNAME##_first_object = obj;\ + } \ + gate_leave_system(key);\ + } else { \ + kfree(obj);\ + obj = NULL;\ + } \ + return obj;\ +} \ +\ +\ +int MNAME##_delete(void **handle)\ +{ \ + int *key;\ + struct MNAME##_object *temp;\ + struct MNAME##_object *obj;\ + \ + if (handle == NULL) \ + return -EINVAL;\ + if (*handle == NULL) \ + return -EINVAL;\ + obj = (struct MNAME##_object *)(*handle);\ + key = gate_enter_system();\ + if (obj == MNAME##_first_object) \ + MNAME##_first_object = obj->next;\ + else { \ + temp = MNAME##_first_object;\ + while (temp) { \ + if (temp->next == obj) { \ + temp->next = obj->next;\ + break;\ + } else { \ + temp = temp->next;\ + } \ + } \ + if (temp == NULL) { \ + gate_leave_system(key);\ + return -EINVAL;\ + } \ + } \ + gate_leave_system(key);\ + MNAME##_instance_finalize(obj, obj->status);\ + kfree(obj);\ + *handle = NULL;\ + return 0;\ +} + + +#endif /* ifndef _IOBJECT_H_ */ |