blob: 427b8fb91c8fb276d380da35e9fc89e7639e0135 [file] [log] [blame]
/*******************************************************************************
Copyright (C) Marvell International Ltd. and its affiliates
This software file (the "File") is owned and distributed by Marvell
International Ltd. and/or its affiliates ("Marvell") under the following
alternative licensing terms. Once you have made an election to distribute the
File under one of the following license alternatives, please (i) delete this
introductory statement regarding license alternatives, (ii) delete the two
license alternatives that you have not elected to use and (iii) preserve the
Marvell copyright notice above.
********************************************************************************
Marvell Commercial License Option
If you received this File from Marvell and you have entered into a commercial
license agreement (a "Commercial License") with Marvell, the File is licensed
to you under the terms of the applicable Commercial License.
********************************************************************************/
/* Marvell Telephony Adaptation Layer */
#include "tal.h"
#include "tdm_if.h"
/* GLobals */
static tdm_if_register_ops_t tal_tdm_if_register_ops;
static tal_mmp_ops_t* tal_mmp_ops;
static tdm_if_params_t tal_tdm_if_params;
/* Static APIs */
static void tal_pcm_tx_callback(uint8_t* tx_buff, int size);
static void tal_pcm_rx_callback(uint8_t* rx_buff, int size);
/*---------------------------------------------------------------------------*
* tal_init
* Issue telephony subsytem initialization and callbacks registration
*---------------------------------------------------------------------------*/
tal_stat_t tal_init(tal_params_t* tal_params, tal_mmp_ops_t* mmp_ops)
{
if((tal_params == NULL) || (mmp_ops == NULL))
{
mvOsPrintf("%s: Error, bad parameters\n",__FUNCTION__);
return TAL_STAT_BAD_PARAM;
}
if(mmp_ops->tal_mmp_rx_callback == NULL ||
mmp_ops->tal_mmp_tx_callback == NULL)
{
mvOsPrintf("%s:Error, missing callbacks(MMP)\n",__FUNCTION__);
return TAL_STAT_BAD_PARAM;
}
/* Convert tal_params to tdm_if_params */
memcpy(&tal_tdm_if_params, tal_params, sizeof(tal_params_t));
/* Assign MMP operations */
tal_mmp_ops = mmp_ops;
/* Clear tdm_if operations structure */
memset(&tal_tdm_if_register_ops, 0, sizeof(tdm_if_register_ops_t));
/* Assign tdm_if operations */
tal_tdm_if_register_ops.tdm_if_pcm_ops.pcm_tx_callback = tal_pcm_tx_callback;
tal_tdm_if_register_ops.tdm_if_pcm_ops.pcm_rx_callback = tal_pcm_rx_callback;
/* Dispatch tdm_if driver */
if(tdm_if_init(&tal_tdm_if_register_ops, &tal_tdm_if_params) != MV_OK)
{
mvOsPrintf("%s: Error, could not initialize tdm_if driver !!!\n",__FUNCTION__);
return TAL_STAT_INIT_ERROR;
}
/* Verify control callbacks were assigned properly */
if(tal_tdm_if_register_ops.tdm_if_ctl_ops.ctl_pcm_start == NULL ||
tal_tdm_if_register_ops.tdm_if_ctl_ops.ctl_pcm_stop == NULL)
{
mvOsPrintf("%s:Error, missing callbacks(tdm_if)\n",__FUNCTION__);
return TAL_STAT_BAD_PARAM;
}
return TAL_STAT_OK;
}
/*---------------------------------------------------------------------------*
* tal_pcm_tx_completion
* Tx callback
*---------------------------------------------------------------------------*/
static void tal_pcm_tx_callback(uint8_t* tx_buff, int size)
{
tal_mmp_ops->tal_mmp_tx_callback(tx_buff, size);
}
/*---------------------------------------------------------------------------*
* tal_pcm_rx_completion
* Rx callback
*---------------------------------------------------------------------------*/
static void tal_pcm_rx_callback(uint8_t* rx_buff, int size)
{
tal_mmp_ops->tal_mmp_rx_callback(rx_buff, size);
}
/*---------------------------------------------------------------------------*
* tal_pcm_start
* Start PCM bus
*---------------------------------------------------------------------------*/
tal_stat_t tal_pcm_start(void)
{
tal_tdm_if_register_ops.tdm_if_ctl_ops.ctl_pcm_start();
return TAL_STAT_OK;
}
/*---------------------------------------------------------------------------*
* tal_pcm_stop
* Stop PCM bus
*---------------------------------------------------------------------------*/
tal_stat_t tal_pcm_stop(void)
{
tal_tdm_if_register_ops.tdm_if_ctl_ops.ctl_pcm_stop();
return TAL_STAT_OK;
}
/*---------------------------------------------------------------------------*
* tal_exit
* Stop TDM channels and release all resources
*---------------------------------------------------------------------------*/
tal_stat_t tal_exit(void)
{
tdm_if_exit();
return TAL_STAT_OK;
}
/*---------------------------------------------------------------------------*
* tal_stats_get
* Get TDM statistics
*---------------------------------------------------------------------------*/
tal_stat_t tal_stats_get(tal_stats_t* tal_stats)
{
tdm_if_stats_t stats;
tdm_if_stats_get(&stats);
memcpy(tal_stats, &stats, sizeof(tal_stats_t));
return TAL_STAT_OK;
}
/*---------------------------------------------------------------------------*
* tal_tdm_clk_config
* Config TDM clock
*---------------------------------------------------------------------------*/
void tal_tdm_clk_config(void)
{
mvCtrlTdmClkCtrlConfig();
}
#if defined(MV_TDM_USE_DCO)
/*---------------------------------------------------------------------------*
* tal_tdm_clk_get
* Get current TDM clock correction
*---------------------------------------------------------------------------*/
int tal_tdm_clk_get(void)
{
return mvCtrlTdmClkCtrlGet();
}
/*---------------------------------------------------------------------------*
* tal_tdm_clk_set
* Set TDM clock correction
*---------------------------------------------------------------------------*/
void tal_tdm_clk_set(int correction)
{
return mvCtrlTdmClkCtrlSet(correction);
}
#endif
/* EXPORTS */
EXPORT_SYMBOL(tal_init);
EXPORT_SYMBOL(tal_pcm_start);
EXPORT_SYMBOL(tal_pcm_stop);
EXPORT_SYMBOL(tal_exit);
EXPORT_SYMBOL(tal_stats_get);
EXPORT_SYMBOL(tal_tdm_clk_config);
#if defined(MV_TDM_USE_DCO)
EXPORT_SYMBOL(tal_tdm_clk_get);
EXPORT_SYMBOL(tal_tdm_clk_set);
#endif