/drivers/staging/tidspbridge/rmgr/dspdrv.c
https://bitbucket.org/cyanogenmod/android_kernel_asus_tf300t · C · 144 lines · 79 code · 18 blank · 47 comment · 19 complexity · f209326b142ceb1e85d454a3810fa06b MD5 · raw file
- /*
- * dspdrv.c
- *
- * DSP-BIOS Bridge driver support functions for TI OMAP processors.
- *
- * Interface to allocate and free bridge resources.
- *
- * 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.
- */
- /* ----------------------------------- Host OS */
- #include <linux/types.h>
- #include <dspbridge/host_os.h>
- /* ----------------------------------- DSP/BIOS Bridge */
- #include <dspbridge/dbdefs.h>
- /* ----------------------------------- Trace & Debug */
- #include <dspbridge/dbc.h>
- /* ----------------------------------- Platform Manager */
- #include <dspbridge/drv.h>
- #include <dspbridge/dev.h>
- #include <dspbridge/dspapi.h>
- /* ----------------------------------- Resource Manager */
- #include <dspbridge/mgr.h>
- /* ----------------------------------- This */
- #include <dspbridge/dspdrv.h>
- /*
- * ======== dsp_init ========
- * Allocates bridge resources. Loads a base image onto DSP, if specified.
- */
- u32 dsp_init(u32 *init_status)
- {
- char dev_node[MAXREGPATHLENGTH] = "TIOMAP1510";
- int status = -EPERM;
- struct drv_object *drv_obj = NULL;
- u32 device_node;
- u32 device_node_string;
- if (!api_init())
- goto func_cont;
- status = drv_create(&drv_obj);
- if (status) {
- api_exit();
- goto func_cont;
- }
- /* End drv_create */
- /* Request Resources */
- status = drv_request_resources((u32) &dev_node, &device_node_string);
- if (!status) {
- /* Attempt to Start the Device */
- status = dev_start_device((struct cfg_devnode *)
- device_node_string);
- if (status)
- (void)drv_release_resources
- ((u32) device_node_string, drv_obj);
- } else {
- dev_dbg(bridge, "%s: drv_request_resources Failed\n", __func__);
- status = -EPERM;
- }
- /* Unwind whatever was loaded */
- if (status) {
- /* irrespective of the status of dev_remove_device we conitinue
- * unloading. Get the Driver Object iterate through and remove.
- * Reset the status to E_FAIL to avoid going through
- * api_init_complete2. */
- for (device_node = drv_get_first_dev_extension();
- device_node != 0;
- device_node = drv_get_next_dev_extension(device_node)) {
- (void)dev_remove_device((struct cfg_devnode *)
- device_node);
- (void)drv_release_resources((u32) device_node, drv_obj);
- }
- /* Remove the Driver Object */
- (void)drv_destroy(drv_obj);
- drv_obj = NULL;
- api_exit();
- dev_dbg(bridge, "%s: Logical device failed init\n", __func__);
- } /* Unwinding the loaded drivers */
- func_cont:
- /* Attempt to Start the Board */
- if (!status) {
- /* BRD_AutoStart could fail if the dsp execuetable is not the
- * correct one. We should not propagate that error
- * into the device loader. */
- (void)api_init_complete2();
- } else {
- dev_dbg(bridge, "%s: Failed\n", __func__);
- } /* End api_init_complete2 */
- DBC_ENSURE((!status && drv_obj != NULL) ||
- (status && drv_obj == NULL));
- *init_status = status;
- /* Return the Driver Object */
- return (u32) drv_obj;
- }
- /*
- * ======== dsp_deinit ========
- * Frees the resources allocated for bridge.
- */
- bool dsp_deinit(u32 device_context)
- {
- bool ret = true;
- u32 device_node;
- struct mgr_object *mgr_obj = NULL;
- struct drv_data *drv_datap = dev_get_drvdata(bridge);
- while ((device_node = drv_get_first_dev_extension()) != 0) {
- (void)dev_remove_device((struct cfg_devnode *)device_node);
- (void)drv_release_resources((u32) device_node,
- (struct drv_object *)device_context);
- }
- (void)drv_destroy((struct drv_object *)device_context);
- /* Get the Manager Object from driver data
- * MGR Destroy will unload the DCD dll */
- if (drv_datap && drv_datap->mgr_object) {
- mgr_obj = drv_datap->mgr_object;
- (void)mgr_destroy(mgr_obj);
- } else {
- pr_err("%s: Failed to retrieve the object handle\n", __func__);
- }
- api_exit();
- return ret;
- }