summaryrefslogtreecommitdiff
path: root/arch/arm/plat-omap/include/syslink/iobject.h
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/plat-omap/include/syslink/iobject.h')
-rw-r--r--arch/arm/plat-omap/include/syslink/iobject.h176
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_ */