blob: a7af74f482dd8df0257d88e8eaf9299288b79896 [file] [log] [blame]
/*
* cfg.c
*
* DSP-BIOS Bridge driver support functions for TI OMAP processors.
*
* Implementation of platform specific config services.
*
* 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.
*/
#include <linux/types.h>
/* ----------------------------------- DSP/BIOS Bridge */
#include <dspbridge/dbdefs.h>
/* ----------------------------------- Trace & Debug */
#include <dspbridge/dbc.h>
/* ----------------------------------- OS Adaptation Layer */
/* ----------------------------------- This */
#include <dspbridge/cfg.h>
#include <dspbridge/drv.h>
struct drv_ext {
struct list_head link;
char sz_string[MAXREGPATHLENGTH];
};
/*
* ======== cfg_exit ========
* Purpose:
* Discontinue usage of the CFG module.
*/
void cfg_exit(void)
{
/* Do nothing */
}
/*
* ======== cfg_get_auto_start ========
* Purpose:
* Retreive the autostart mask, if any, for this board.
*/
int cfg_get_auto_start(struct cfg_devnode *dev_node_obj,
u32 *auto_start)
{
int status = 0;
u32 dw_buf_size;
struct drv_data *drv_datap = dev_get_drvdata(bridge);
dw_buf_size = sizeof(*auto_start);
if (!dev_node_obj)
status = -EFAULT;
if (!auto_start || !drv_datap)
status = -EFAULT;
if (!status)
*auto_start = (drv_datap->base_img) ? 1 : 0;
DBC_ENSURE((status == 0 &&
(*auto_start == 0 || *auto_start == 1))
|| status != 0);
return status;
}
/*
* ======== cfg_get_dev_object ========
* Purpose:
* Retrieve the Device Object handle for a given devnode.
*/
int cfg_get_dev_object(struct cfg_devnode *dev_node_obj,
u32 *value)
{
int status = 0;
u32 dw_buf_size;
struct drv_data *drv_datap = dev_get_drvdata(bridge);
if (!drv_datap)
status = -EPERM;
if (!dev_node_obj)
status = -EFAULT;
if (!value)
status = -EFAULT;
dw_buf_size = sizeof(value);
if (!status) {
/* check the device string and then store dev object */
if (!
(strcmp
((char *)((struct drv_ext *)dev_node_obj)->sz_string,
"TIOMAP1510")))
*value = (u32)drv_datap->dev_object;
}
if (status)
pr_err("%s: Failed, status 0x%x\n", __func__, status);
return status;
}
/*
* ======== cfg_get_exec_file ========
* Purpose:
* Retreive the default executable, if any, for this board.
*/
int cfg_get_exec_file(struct cfg_devnode *dev_node_obj, u32 buf_size,
char *str_exec_file)
{
int status = 0;
struct drv_data *drv_datap = dev_get_drvdata(bridge);
if (!dev_node_obj)
status = -EFAULT;
else if (!str_exec_file || !drv_datap)
status = -EFAULT;
if (strlen(drv_datap->base_img) > buf_size)
status = -EINVAL;
if (!status && drv_datap->base_img)
strcpy(str_exec_file, drv_datap->base_img);
if (status)
pr_err("%s: Failed, status 0x%x\n", __func__, status);
DBC_ENSURE(((status == 0) &&
(strlen(str_exec_file) <= buf_size))
|| (status != 0));
return status;
}
/*
* ======== cfg_get_object ========
* Purpose:
* Retrieve the Object handle from the Registry
*/
int cfg_get_object(u32 *value, u8 dw_type)
{
int status = -EINVAL;
struct drv_data *drv_datap = dev_get_drvdata(bridge);
DBC_REQUIRE(value != NULL);
if (!drv_datap)
return -EPERM;
switch (dw_type) {
case (REG_DRV_OBJECT):
if (drv_datap->drv_object) {
*value = (u32)drv_datap->drv_object;
status = 0;
} else {
status = -ENODATA;
}
break;
case (REG_MGR_OBJECT):
if (drv_datap->mgr_object) {
*value = (u32)drv_datap->mgr_object;
status = 0;
} else {
status = -ENODATA;
}
break;
default:
break;
}
if (status) {
*value = 0;
pr_err("%s: Failed, status 0x%x\n", __func__, status);
}
DBC_ENSURE((!status && *value != 0) || (status && *value == 0));
return status;
}
/*
* ======== cfg_init ========
* Purpose:
* Initialize the CFG module's private state.
*/
bool cfg_init(void)
{
return true;
}
/*
* ======== cfg_set_dev_object ========
* Purpose:
* Store the Device Object handle and dev_node pointer for a given devnode.
*/
int cfg_set_dev_object(struct cfg_devnode *dev_node_obj, u32 value)
{
int status = 0;
struct drv_data *drv_datap = dev_get_drvdata(bridge);
if (!drv_datap) {
pr_err("%s: Failed, status 0x%x\n", __func__, status);
return -EPERM;
}
if (!dev_node_obj)
status = -EFAULT;
if (!status) {
/* Store the Bridge device object in the Registry */
if (!(strcmp((char *)dev_node_obj, "TIOMAP1510")))
drv_datap->dev_object = (void *) value;
}
if (status)
pr_err("%s: Failed, status 0x%x\n", __func__, status);
return status;
}
/*
* ======== cfg_set_object ========
* Purpose:
* Store the Driver Object handle
*/
int cfg_set_object(u32 value, u8 dw_type)
{
int status = -EINVAL;
struct drv_data *drv_datap = dev_get_drvdata(bridge);
if (!drv_datap)
return -EPERM;
switch (dw_type) {
case (REG_DRV_OBJECT):
drv_datap->drv_object = (void *)value;
status = 0;
break;
case (REG_MGR_OBJECT):
drv_datap->mgr_object = (void *)value;
status = 0;
break;
default:
break;
}
if (status)
pr_err("%s: Failed, status 0x%x\n", __func__, status);
return status;
}