1 /*
2 * msg.c
3 *
4 * DSP-BIOS Bridge driver support functions for TI OMAP processors.
5 *
6 * DSP/BIOS Bridge msg_ctrl Module.
7 *
8 * Copyright (C) 2005-2006 Texas Instruments, Inc.
9 *
10 * This package is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License version 2 as
12 * published by the Free Software Foundation.
13 *
14 * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
15 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
16 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
17 */
18 #include <linux/types.h>
19
20 /* ----------------------------------- Host OS */
21 #include <dspbridge/host_os.h>
22
23 /* ----------------------------------- DSP/BIOS Bridge */
24 #include <dspbridge/dbdefs.h>
25
26 /* ----------------------------------- Trace & Debug */
27 #include <dspbridge/dbc.h>
28
29 /* ----------------------------------- Bridge Driver */
30 #include <dspbridge/dspdefs.h>
31
32 /* ----------------------------------- Platform Manager */
33 #include <dspbridge/dev.h>
34
35 /* ----------------------------------- This */
36 #include <msgobj.h>
37 #include <dspbridge/msg.h>
38
39 /* ----------------------------------- Globals */
40 static u32 refs; /* module reference count */
41
42 /*
43 * ======== msg_create ========
44 * Purpose:
45 * Create an object to manage message queues. Only one of these objects
46 * can exist per device object.
47 */
msg_create(struct msg_mgr ** msg_man,struct dev_object * hdev_obj,msg_onexit msg_callback)48 int msg_create(struct msg_mgr **msg_man,
49 struct dev_object *hdev_obj, msg_onexit msg_callback)
50 {
51 struct bridge_drv_interface *intf_fxns;
52 struct msg_mgr_ *msg_mgr_obj;
53 struct msg_mgr *hmsg_mgr;
54 int status = 0;
55
56 DBC_REQUIRE(refs > 0);
57 DBC_REQUIRE(msg_man != NULL);
58 DBC_REQUIRE(msg_callback != NULL);
59 DBC_REQUIRE(hdev_obj != NULL);
60
61 *msg_man = NULL;
62
63 dev_get_intf_fxns(hdev_obj, &intf_fxns);
64
65 /* Let Bridge message module finish the create: */
66 status =
67 (*intf_fxns->msg_create) (&hmsg_mgr, hdev_obj, msg_callback);
68
69 if (!status) {
70 /* Fill in DSP API message module's fields of the msg_mgr
71 * structure */
72 msg_mgr_obj = (struct msg_mgr_ *)hmsg_mgr;
73 msg_mgr_obj->intf_fxns = intf_fxns;
74
75 /* Finally, return the new message manager handle: */
76 *msg_man = hmsg_mgr;
77 } else {
78 status = -EPERM;
79 }
80 return status;
81 }
82
83 /*
84 * ======== msg_delete ========
85 * Purpose:
86 * Delete a msg_ctrl manager allocated in msg_create().
87 */
msg_delete(struct msg_mgr * hmsg_mgr)88 void msg_delete(struct msg_mgr *hmsg_mgr)
89 {
90 struct msg_mgr_ *msg_mgr_obj = (struct msg_mgr_ *)hmsg_mgr;
91 struct bridge_drv_interface *intf_fxns;
92
93 DBC_REQUIRE(refs > 0);
94
95 if (msg_mgr_obj) {
96 intf_fxns = msg_mgr_obj->intf_fxns;
97
98 /* Let Bridge message module destroy the msg_mgr: */
99 (*intf_fxns->msg_delete) (hmsg_mgr);
100 } else {
101 dev_dbg(bridge, "%s: Error hmsg_mgr handle: %p\n",
102 __func__, hmsg_mgr);
103 }
104 }
105
106 /*
107 * ======== msg_exit ========
108 */
msg_exit(void)109 void msg_exit(void)
110 {
111 DBC_REQUIRE(refs > 0);
112 refs--;
113
114 DBC_ENSURE(refs >= 0);
115 }
116
117 /*
118 * ======== msg_mod_init ========
119 */
msg_mod_init(void)120 bool msg_mod_init(void)
121 {
122 DBC_REQUIRE(refs >= 0);
123
124 refs++;
125
126 DBC_ENSURE(refs >= 0);
127
128 return true;
129 }
130