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 */ 40static 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 */ 48int 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->pfn_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 */ 88void 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->pfn_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 */ 109void 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 */ 120bool 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