621 lines
20 KiB
C
621 lines
20 KiB
C
/*
|
|
* dev.h
|
|
*
|
|
* DSP-BIOS Bridge driver support functions for TI OMAP processors.
|
|
*
|
|
* Bridge Bridge driver device operations.
|
|
*
|
|
* Copyright (C) 2005-2006 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 DEV_
|
|
#define DEV_
|
|
|
|
/* ----------------------------------- Module Dependent Headers */
|
|
#include <dspbridge/chnldefs.h>
|
|
#include <dspbridge/cmm.h>
|
|
#include <dspbridge/cod.h>
|
|
#include <dspbridge/dspdeh.h>
|
|
#include <dspbridge/nodedefs.h>
|
|
#include <dspbridge/disp.h>
|
|
#include <dspbridge/dspdefs.h>
|
|
#include <dspbridge/dmm.h>
|
|
#include <dspbridge/host_os.h>
|
|
|
|
/* ----------------------------------- This */
|
|
#include <dspbridge/devdefs.h>
|
|
|
|
/*
|
|
* ======== dev_brd_write_fxn ========
|
|
* Purpose:
|
|
* Exported function to be used as the COD write function. This function
|
|
* is passed a handle to a DEV_hObject by ZL in arb, then calls the
|
|
* device's bridge_brd_write() function.
|
|
* Parameters:
|
|
* arb: Handle to a Device Object.
|
|
* dev_ctxt: Handle to Bridge driver defined device info.
|
|
* dsp_addr: Address on DSP board (Destination).
|
|
* host_buf: Pointer to host buffer (Source).
|
|
* ul_num_bytes: Number of bytes to transfer.
|
|
* mem_type: Memory space on DSP to which to transfer.
|
|
* Returns:
|
|
* Number of bytes written. Returns 0 if the DEV_hObject passed in via
|
|
* arb is invalid.
|
|
* Requires:
|
|
* DEV Initialized.
|
|
* host_buf != NULL
|
|
* Ensures:
|
|
*/
|
|
extern u32 dev_brd_write_fxn(void *arb,
|
|
u32 dsp_add,
|
|
void *host_buf, u32 ul_num_bytes, u32 mem_space);
|
|
|
|
/*
|
|
* ======== dev_create_device ========
|
|
* Purpose:
|
|
* Called by the operating system to load the Bridge Driver for a
|
|
* 'Bridge device.
|
|
* Parameters:
|
|
* device_obj: Ptr to location to receive the device object handle.
|
|
* driver_file_name: Name of Bridge driver PE DLL file to load. If the
|
|
* absolute path is not provided, the file is loaded
|
|
* through 'Bridge's module search path.
|
|
* host_config: Host configuration information, to be passed down
|
|
* to the Bridge driver when bridge_dev_create() is called.
|
|
* pDspConfig: DSP resources, to be passed down to the Bridge driver
|
|
* when bridge_dev_create() is called.
|
|
* dev_node_obj: Platform specific device node.
|
|
* Returns:
|
|
* 0: Module is loaded, device object has been created
|
|
* -ENOMEM: Insufficient memory to create needed resources.
|
|
* -EPERM: Unable to find Bridge driver entry point function.
|
|
* -ESPIPE: Unable to load ZL DLL.
|
|
* Requires:
|
|
* DEV Initialized.
|
|
* device_obj != NULL.
|
|
* driver_file_name != NULL.
|
|
* host_config != NULL.
|
|
* pDspConfig != NULL.
|
|
* Ensures:
|
|
* 0: *device_obj will contain handle to the new device object.
|
|
* Otherwise, does not create the device object, ensures the Bridge driver
|
|
* module is unloaded, and sets *device_obj to NULL.
|
|
*/
|
|
extern int dev_create_device(struct dev_object
|
|
**device_obj,
|
|
const char *driver_file_name,
|
|
struct cfg_devnode *dev_node_obj);
|
|
|
|
/*
|
|
* ======== dev_create2 ========
|
|
* Purpose:
|
|
* After successful loading of the image from api_init_complete2
|
|
* (PROC Auto_Start) or proc_load this fxn is called. This creates
|
|
* the Node Manager and updates the DEV Object.
|
|
* Parameters:
|
|
* hdev_obj: Handle to device object created with dev_create_device().
|
|
* Returns:
|
|
* 0: Successful Creation of Node Manager
|
|
* -EPERM: Some Error Occurred.
|
|
* Requires:
|
|
* DEV Initialized
|
|
* Valid hdev_obj
|
|
* Ensures:
|
|
* 0 and hdev_obj->node_mgr != NULL
|
|
* else hdev_obj->node_mgr == NULL
|
|
*/
|
|
extern int dev_create2(struct dev_object *hdev_obj);
|
|
|
|
/*
|
|
* ======== dev_destroy2 ========
|
|
* Purpose:
|
|
* Destroys the Node manager for this device.
|
|
* Parameters:
|
|
* hdev_obj: Handle to device object created with dev_create_device().
|
|
* Returns:
|
|
* 0: Successful Creation of Node Manager
|
|
* -EPERM: Some Error Occurred.
|
|
* Requires:
|
|
* DEV Initialized
|
|
* Valid hdev_obj
|
|
* Ensures:
|
|
* 0 and hdev_obj->node_mgr == NULL
|
|
* else -EPERM.
|
|
*/
|
|
extern int dev_destroy2(struct dev_object *hdev_obj);
|
|
|
|
/*
|
|
* ======== dev_destroy_device ========
|
|
* Purpose:
|
|
* Destroys the channel manager for this device, if any, calls
|
|
* bridge_dev_destroy(), and then attempts to unload the Bridge module.
|
|
* Parameters:
|
|
* hdev_obj: Handle to device object created with
|
|
* dev_create_device().
|
|
* Returns:
|
|
* 0: Success.
|
|
* -EFAULT: Invalid hdev_obj.
|
|
* -EPERM: The Bridge driver failed it's bridge_dev_destroy() function.
|
|
* Requires:
|
|
* DEV Initialized.
|
|
* Ensures:
|
|
*/
|
|
extern int dev_destroy_device(struct dev_object
|
|
*hdev_obj);
|
|
|
|
/*
|
|
* ======== dev_get_chnl_mgr ========
|
|
* Purpose:
|
|
* Retrieve the handle to the channel manager created for this device.
|
|
* Parameters:
|
|
* hdev_obj: Handle to device object created with
|
|
* dev_create_device().
|
|
* *mgr: Ptr to location to store handle.
|
|
* Returns:
|
|
* 0: Success.
|
|
* -EFAULT: Invalid hdev_obj.
|
|
* Requires:
|
|
* mgr != NULL.
|
|
* DEV Initialized.
|
|
* Ensures:
|
|
* 0: *mgr contains a handle to a channel manager object,
|
|
* or NULL.
|
|
* else: *mgr is NULL.
|
|
*/
|
|
extern int dev_get_chnl_mgr(struct dev_object *hdev_obj,
|
|
struct chnl_mgr **mgr);
|
|
|
|
/*
|
|
* ======== dev_get_cmm_mgr ========
|
|
* Purpose:
|
|
* Retrieve the handle to the shared memory manager created for this
|
|
* device.
|
|
* Parameters:
|
|
* hdev_obj: Handle to device object created with
|
|
* dev_create_device().
|
|
* *mgr: Ptr to location to store handle.
|
|
* Returns:
|
|
* 0: Success.
|
|
* -EFAULT: Invalid hdev_obj.
|
|
* Requires:
|
|
* mgr != NULL.
|
|
* DEV Initialized.
|
|
* Ensures:
|
|
* 0: *mgr contains a handle to a channel manager object,
|
|
* or NULL.
|
|
* else: *mgr is NULL.
|
|
*/
|
|
extern int dev_get_cmm_mgr(struct dev_object *hdev_obj,
|
|
struct cmm_object **mgr);
|
|
|
|
/*
|
|
* ======== dev_get_dmm_mgr ========
|
|
* Purpose:
|
|
* Retrieve the handle to the dynamic memory manager created for this
|
|
* device.
|
|
* Parameters:
|
|
* hdev_obj: Handle to device object created with
|
|
* dev_create_device().
|
|
* *mgr: Ptr to location to store handle.
|
|
* Returns:
|
|
* 0: Success.
|
|
* -EFAULT: Invalid hdev_obj.
|
|
* Requires:
|
|
* mgr != NULL.
|
|
* DEV Initialized.
|
|
* Ensures:
|
|
* 0: *mgr contains a handle to a channel manager object,
|
|
* or NULL.
|
|
* else: *mgr is NULL.
|
|
*/
|
|
extern int dev_get_dmm_mgr(struct dev_object *hdev_obj,
|
|
struct dmm_object **mgr);
|
|
|
|
/*
|
|
* ======== dev_get_cod_mgr ========
|
|
* Purpose:
|
|
* Retrieve the COD manager create for this device.
|
|
* Parameters:
|
|
* hdev_obj: Handle to device object created with
|
|
* dev_create_device().
|
|
* *cod_mgr: Ptr to location to store handle.
|
|
* Returns:
|
|
* 0: Success.
|
|
* -EFAULT: Invalid hdev_obj.
|
|
* Requires:
|
|
* cod_mgr != NULL.
|
|
* DEV Initialized.
|
|
* Ensures:
|
|
* 0: *cod_mgr contains a handle to a COD manager object.
|
|
* else: *cod_mgr is NULL.
|
|
*/
|
|
extern int dev_get_cod_mgr(struct dev_object *hdev_obj,
|
|
struct cod_manager **cod_mgr);
|
|
|
|
/*
|
|
* ======== dev_get_deh_mgr ========
|
|
* Purpose:
|
|
* Retrieve the DEH manager created for this device.
|
|
* Parameters:
|
|
* hdev_obj: Handle to device object created with dev_create_device().
|
|
* *deh_manager: Ptr to location to store handle.
|
|
* Returns:
|
|
* 0: Success.
|
|
* -EFAULT: Invalid hdev_obj.
|
|
* Requires:
|
|
* deh_manager != NULL.
|
|
* DEH Initialized.
|
|
* Ensures:
|
|
* 0: *deh_manager contains a handle to a DEH manager object.
|
|
* else: *deh_manager is NULL.
|
|
*/
|
|
extern int dev_get_deh_mgr(struct dev_object *hdev_obj,
|
|
struct deh_mgr **deh_manager);
|
|
|
|
/*
|
|
* ======== dev_get_dev_node ========
|
|
* Purpose:
|
|
* Retrieve the platform specific device ID for this device.
|
|
* Parameters:
|
|
* hdev_obj: Handle to device object created with
|
|
* dev_create_device().
|
|
* dev_nde: Ptr to location to get the device node handle.
|
|
* Returns:
|
|
* 0: Returns a DEVNODE in *dev_node_obj.
|
|
* -EFAULT: Invalid hdev_obj.
|
|
* Requires:
|
|
* dev_nde != NULL.
|
|
* DEV Initialized.
|
|
* Ensures:
|
|
* 0: *dev_nde contains a platform specific device ID;
|
|
* else: *dev_nde is NULL.
|
|
*/
|
|
extern int dev_get_dev_node(struct dev_object *hdev_obj,
|
|
struct cfg_devnode **dev_nde);
|
|
|
|
/*
|
|
* ======== dev_get_dev_type ========
|
|
* Purpose:
|
|
* Retrieve the platform specific device ID for this device.
|
|
* Parameters:
|
|
* hdev_obj: Handle to device object created with
|
|
* dev_create_device().
|
|
* dev_nde: Ptr to location to get the device node handle.
|
|
* Returns:
|
|
* 0: Success
|
|
* -EFAULT: Invalid hdev_obj.
|
|
* Requires:
|
|
* dev_nde != NULL.
|
|
* DEV Initialized.
|
|
* Ensures:
|
|
* 0: *dev_nde contains a platform specific device ID;
|
|
* else: *dev_nde is NULL.
|
|
*/
|
|
extern int dev_get_dev_type(struct dev_object *device_obj,
|
|
u8 *dev_type);
|
|
|
|
/*
|
|
* ======== dev_get_first ========
|
|
* Purpose:
|
|
* Retrieve the first Device Object handle from an internal linked list of
|
|
* of DEV_OBJECTs maintained by DEV.
|
|
* Parameters:
|
|
* Returns:
|
|
* NULL if there are no device objects stored; else
|
|
* a valid DEV_HOBJECT.
|
|
* Requires:
|
|
* No calls to dev_create_device or dev_destroy_device (which my modify the
|
|
* internal device object list) may occur between calls to dev_get_first
|
|
* and dev_get_next.
|
|
* Ensures:
|
|
* The DEV_HOBJECT returned is valid.
|
|
* A subsequent call to dev_get_next will return the next device object in
|
|
* the list.
|
|
*/
|
|
extern struct dev_object *dev_get_first(void);
|
|
|
|
/*
|
|
* ======== dev_get_intf_fxns ========
|
|
* Purpose:
|
|
* Retrieve the Bridge driver interface function structure for the
|
|
* loaded Bridge driver.
|
|
* Parameters:
|
|
* hdev_obj: Handle to device object created with
|
|
* dev_create_device().
|
|
* *if_fxns: Ptr to location to store fxn interface.
|
|
* Returns:
|
|
* 0: Success.
|
|
* -EFAULT: Invalid hdev_obj.
|
|
* Requires:
|
|
* if_fxns != NULL.
|
|
* DEV Initialized.
|
|
* Ensures:
|
|
* 0: *if_fxns contains a pointer to the Bridge
|
|
* driver interface;
|
|
* else: *if_fxns is NULL.
|
|
*/
|
|
extern int dev_get_intf_fxns(struct dev_object *hdev_obj,
|
|
struct bridge_drv_interface **if_fxns);
|
|
|
|
/*
|
|
* ======== dev_get_io_mgr ========
|
|
* Purpose:
|
|
* Retrieve the handle to the IO manager created for this device.
|
|
* Parameters:
|
|
* hdev_obj: Handle to device object created with
|
|
* dev_create_device().
|
|
* *mgr: Ptr to location to store handle.
|
|
* Returns:
|
|
* 0: Success.
|
|
* -EFAULT: Invalid hdev_obj.
|
|
* Requires:
|
|
* mgr != NULL.
|
|
* DEV Initialized.
|
|
* Ensures:
|
|
* 0: *mgr contains a handle to an IO manager object.
|
|
* else: *mgr is NULL.
|
|
*/
|
|
extern int dev_get_io_mgr(struct dev_object *hdev_obj,
|
|
struct io_mgr **mgr);
|
|
|
|
/*
|
|
* ======== dev_get_next ========
|
|
* Purpose:
|
|
* Retrieve the next Device Object handle from an internal linked list of
|
|
* of DEV_OBJECTs maintained by DEV, after having previously called
|
|
* dev_get_first() and zero or more dev_get_next
|
|
* Parameters:
|
|
* hdev_obj: Handle to the device object returned from a previous
|
|
* call to dev_get_first() or dev_get_next().
|
|
* Returns:
|
|
* NULL if there are no further device objects on the list or hdev_obj
|
|
* was invalid;
|
|
* else the next valid DEV_HOBJECT in the list.
|
|
* Requires:
|
|
* No calls to dev_create_device or dev_destroy_device (which my modify the
|
|
* internal device object list) may occur between calls to dev_get_first
|
|
* and dev_get_next.
|
|
* Ensures:
|
|
* The DEV_HOBJECT returned is valid.
|
|
* A subsequent call to dev_get_next will return the next device object in
|
|
* the list.
|
|
*/
|
|
extern struct dev_object *dev_get_next(struct dev_object
|
|
*hdev_obj);
|
|
|
|
/*
|
|
* ========= dev_get_msg_mgr ========
|
|
* Purpose:
|
|
* Retrieve the msg_ctrl Manager Handle from the DevObject.
|
|
* Parameters:
|
|
* hdev_obj: Handle to the Dev Object
|
|
* msg_man: Location where msg_ctrl Manager handle will be returned.
|
|
* Returns:
|
|
* Requires:
|
|
* DEV Initialized.
|
|
* Valid hdev_obj.
|
|
* node_man != NULL.
|
|
* Ensures:
|
|
*/
|
|
extern void dev_get_msg_mgr(struct dev_object *hdev_obj,
|
|
struct msg_mgr **msg_man);
|
|
|
|
/*
|
|
* ========= dev_get_node_manager ========
|
|
* Purpose:
|
|
* Retrieve the Node Manager Handle from the DevObject. It is an
|
|
* accessor function
|
|
* Parameters:
|
|
* hdev_obj: Handle to the Dev Object
|
|
* node_man: Location where Handle to the Node Manager will be
|
|
* returned..
|
|
* Returns:
|
|
* 0: Success
|
|
* -EFAULT: Invalid Dev Object handle.
|
|
* Requires:
|
|
* DEV Initialized.
|
|
* node_man is not null
|
|
* Ensures:
|
|
* 0: *node_man contains a handle to a Node manager object.
|
|
* else: *node_man is NULL.
|
|
*/
|
|
extern int dev_get_node_manager(struct dev_object
|
|
*hdev_obj,
|
|
struct node_mgr **node_man);
|
|
|
|
/*
|
|
* ======== dev_get_symbol ========
|
|
* Purpose:
|
|
* Get the value of a symbol in the currently loaded program.
|
|
* Parameters:
|
|
* hdev_obj: Handle to device object created with
|
|
* dev_create_device().
|
|
* str_sym: Name of symbol to look up.
|
|
* pul_value: Ptr to symbol value.
|
|
* Returns:
|
|
* 0: Success.
|
|
* -EFAULT: Invalid hdev_obj.
|
|
* -ESPIPE: Symbols couldn not be found or have not been loaded onto
|
|
* the board.
|
|
* Requires:
|
|
* str_sym != NULL.
|
|
* pul_value != NULL.
|
|
* DEV Initialized.
|
|
* Ensures:
|
|
* 0: *pul_value contains the symbol value;
|
|
*/
|
|
extern int dev_get_symbol(struct dev_object *hdev_obj,
|
|
const char *str_sym, u32 * pul_value);
|
|
|
|
/*
|
|
* ======== dev_get_bridge_context ========
|
|
* Purpose:
|
|
* Retrieve the Bridge Context handle, as returned by the
|
|
* bridge_dev_create fxn.
|
|
* Parameters:
|
|
* hdev_obj: Handle to device object created with dev_create_device()
|
|
* *phbridge_context: Ptr to location to store context handle.
|
|
* Returns:
|
|
* 0: Success.
|
|
* -EFAULT: Invalid hdev_obj.
|
|
* Requires:
|
|
* phbridge_context != NULL.
|
|
* DEV Initialized.
|
|
* Ensures:
|
|
* 0: *phbridge_context contains context handle;
|
|
* else: *phbridge_context is NULL;
|
|
*/
|
|
extern int dev_get_bridge_context(struct dev_object *hdev_obj,
|
|
struct bridge_dev_context
|
|
**phbridge_context);
|
|
|
|
/*
|
|
* ======== dev_insert_proc_object ========
|
|
* Purpose:
|
|
* Inserts the Processor Object into the List of PROC Objects
|
|
* kept in the DEV Object
|
|
* Parameters:
|
|
* proc_obj: Handle to the Proc Object
|
|
* hdev_obj Handle to the Dev Object
|
|
* bAttachedNew Specifies if there are already processors attached
|
|
* Returns:
|
|
* 0: Successfully inserted into the list
|
|
* Requires:
|
|
* proc_obj is not NULL
|
|
* hdev_obj is a valid handle to the DEV.
|
|
* DEV Initialized.
|
|
* List(of Proc object in Dev) Exists.
|
|
* Ensures:
|
|
* 0 & the PROC Object is inserted and the list is not empty
|
|
* Details:
|
|
* If the List of Proc Object is empty bAttachedNew is TRUE, it indicated
|
|
* this is the first Processor attaching.
|
|
* If it is False, there are already processors attached.
|
|
*/
|
|
extern int dev_insert_proc_object(struct dev_object
|
|
*hdev_obj,
|
|
u32 proc_obj,
|
|
bool *already_attached);
|
|
|
|
/*
|
|
* ======== dev_remove_proc_object ========
|
|
* Purpose:
|
|
* Search for and remove a Proc object from the given list maintained
|
|
* by the DEV
|
|
* Parameters:
|
|
* p_proc_object: Ptr to ProcObject to insert.
|
|
* dev_obj: Ptr to Dev Object where the list is.
|
|
* already_attached: Ptr to return the bool
|
|
* Returns:
|
|
* 0: If successful.
|
|
* -EPERM Failure to Remove the PROC Object from the list
|
|
* Requires:
|
|
* DevObject is Valid
|
|
* proc_obj != 0
|
|
* dev_obj->proc_list != NULL
|
|
* !LST_IS_EMPTY(dev_obj->proc_list)
|
|
* already_attached !=NULL
|
|
* Ensures:
|
|
* Details:
|
|
* List will be deleted when the DEV is destroyed.
|
|
*
|
|
*/
|
|
extern int dev_remove_proc_object(struct dev_object
|
|
*hdev_obj, u32 proc_obj);
|
|
|
|
/*
|
|
* ======== dev_notify_clients ========
|
|
* Purpose:
|
|
* Notify all clients of this device of a change in device status.
|
|
* Clients may include multiple users of BRD, as well as CHNL.
|
|
* This function is asychronous, and may be called by a timer event
|
|
* set up by a watchdog timer.
|
|
* Parameters:
|
|
* hdev_obj: Handle to device object created with dev_create_device().
|
|
* ret: A status word, most likely a BRD_STATUS.
|
|
* Returns:
|
|
* 0: All registered clients were asynchronously notified.
|
|
* -EINVAL: Invalid hdev_obj.
|
|
* Requires:
|
|
* DEV Initialized.
|
|
* Ensures:
|
|
* 0: Notifications are queued by the operating system to be
|
|
* delivered to clients. This function does not ensure that
|
|
* the notifications will ever be delivered.
|
|
*/
|
|
extern int dev_notify_clients(struct dev_object *hdev_obj, u32 ret);
|
|
|
|
/*
|
|
* ======== dev_remove_device ========
|
|
* Purpose:
|
|
* Destroys the Device Object created by dev_start_device.
|
|
* Parameters:
|
|
* dev_node_obj: Device node as it is know to OS.
|
|
* Returns:
|
|
* 0: If success;
|
|
* <error code> Otherwise.
|
|
* Requires:
|
|
* Ensures:
|
|
*/
|
|
extern int dev_remove_device(struct cfg_devnode *dev_node_obj);
|
|
|
|
/*
|
|
* ======== dev_set_chnl_mgr ========
|
|
* Purpose:
|
|
* Set the channel manager for this device.
|
|
* Parameters:
|
|
* hdev_obj: Handle to device object created with
|
|
* dev_create_device().
|
|
* hmgr: Handle to a channel manager, or NULL.
|
|
* Returns:
|
|
* 0: Success.
|
|
* -EFAULT: Invalid hdev_obj.
|
|
* Requires:
|
|
* DEV Initialized.
|
|
* Ensures:
|
|
*/
|
|
extern int dev_set_chnl_mgr(struct dev_object *hdev_obj,
|
|
struct chnl_mgr *hmgr);
|
|
|
|
/*
|
|
* ======== dev_set_msg_mgr ========
|
|
* Purpose:
|
|
* Set the Message manager for this device.
|
|
* Parameters:
|
|
* hdev_obj: Handle to device object created with dev_create_device().
|
|
* hmgr: Handle to a message manager, or NULL.
|
|
* Returns:
|
|
* Requires:
|
|
* DEV Initialized.
|
|
* Ensures:
|
|
*/
|
|
extern void dev_set_msg_mgr(struct dev_object *hdev_obj, struct msg_mgr *hmgr);
|
|
|
|
/*
|
|
* ======== dev_start_device ========
|
|
* Purpose:
|
|
* Initializes the new device with bridge environment. This involves
|
|
* querying CM for allocated resources, querying the registry for
|
|
* necessary dsp resources (requested in the INF file), and using this
|
|
* information to create a bridge device object.
|
|
* Parameters:
|
|
* dev_node_obj: Device node as it is know to OS.
|
|
* Returns:
|
|
* 0: If success;
|
|
* <error code> Otherwise.
|
|
* Requires:
|
|
* DEV initialized.
|
|
* Ensures:
|
|
*/
|
|
extern int dev_start_device(struct cfg_devnode *dev_node_obj);
|
|
|
|
#endif /* DEV_ */
|