linux/drivers/staging/tidspbridge/pmgr/msg.c
<<
>>
Prefs
   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