BSP_VOID DRV_SOCP_ENABLE_LTE_BBP_DSP(BSP_U32 ulChanId)
{
	if(0==(SOCP_REG_GETBITS(SOCP_REG_ENCSRC_BUFCFG1(ulChanId), 0, 1)))
	{
		SOCP_REG_SETBITS(SOCP_REG_ENCSRC_BUFCFG1(ulChanId), 0, 1, 1);
	}
}
/*****************************************************************************
* 函 数 名  : DRV_SOCP_DSPCHN_STOP
* 功能描述  : disable DSP channel
* 输入参数  :
* 输出参数  : 无
* 返 回 值  :
*****************************************************************************/
BSP_VOID  DRV_SOCP_DSPCHN_STOP(BSP_VOID)
{
	VOS_UINT32 IdleFlag;
       VOS_UINT32 j;

	if(SOCP_REG_GETBITS(SOCP_REG_ENCSRC_BUFCFG1(SOCP_DSPLOG_CHN), 0, 1))
	{
		SOCP_REG_SETBITS(SOCP_REG_ENCSRC_BUFCFG1(SOCP_DSPLOG_CHN), 0, 1, 0);
	}
/*lint -e525 -e746*/
	for (j = 0; j < (SOCP_RESET_TIME*2); j++)
    {
        IdleFlag = SOCP_REG_GETBITS(SOCP_REG_ENCSTAT, SOCP_DSPLOG_CHN, 1);
        if (0 == IdleFlag)
        {
            break;
        }

        if ((SOCP_RESET_TIME - 1) == j)
        {
            vos_printf("bsp_socp_stop_dsp failed!\n");

			return ;
        }
    }
/*lint +e525 +e746*/
}
/*****************************************************************************
* 函 数 名  : bsp_socp_backup_end
*
* 功能描述  : RSRACC 方式备份寄存器后的检查工作
*
* 返 回 值  : 0    成功
*             -1   失败
*****************************************************************************/
void bsp_socp_backup_end(rsr_acc_description *bd_descri)
{
	u32 i = 0;

    for(i=0;i<SOCP_MAX_ENCSRC_CHN;i++)
    {
        SOCP_REG_SETBITS (SOCP_REG_ENCSRC_BUFCFG1(i), 0, 1, 0);
    }

    for(i=0;i<(SOCP_MAX_DECSRC_CHN);i++)
    {
        SOCP_REG_SETBITS (SOCP_REG_DECSRC_BUFCFG0(i), 30, 1,0);
    }

	return  ;
}
/*****************************************************************************
* 函 数 名  : DRV_SOCP_DSPCHN_START
* 功能描述  : enable DSP channel
* 输入参数  :
* 输出参数  : 无
* 返 回 值  :
*****************************************************************************/
BSP_VOID  DRV_SOCP_DSPCHN_START(BSP_VOID)
{
	if(0==(SOCP_REG_GETBITS(SOCP_REG_ENCSRC_BUFCFG1(SOCP_DSPLOG_CHN), 0, 1)))
	{
		SOCP_REG_SETBITS(SOCP_REG_ENCSRC_BUFCFG1(SOCP_DSPLOG_CHN), 0, 1, 1);
	}

}
/*****************************************************************************
* 函 数 名  : bsp_socp_enable
*
* 功能描述  : 使能socp 通道,仅针对M3 上的两个通道
*
* 输入参数  :
*
* 输出参数  :
*
* 返 回 值  : 操作完成与否的标识码
*****************************************************************************/
void bsp_socp_enable(u32 u32SrcChanId)
{
	/**/
	if((u32SrcChanId != SOCP_ENCSRC_LPM3_BASE) && (u32SrcChanId != SOCP_ENCSRC_IOM3_BASE))
	{
		printk("socp_enable:wrong chan id %d\n",u32SrcChanId);

		return ;
	}

	if(!SOCP_REG_GETBITS(SOCP_REG_ENCSRC_BUFCFG1(u32SrcChanId), 0, 1))
	{
		SOCP_REG_SETBITS(SOCP_REG_ENCSRC_BUFCFG1(u32SrcChanId), 0, 1, 1);
	}

}
/*****************************************************************************
* 函 数 名  :  DRV_SOCP_INIT_LTE_BBP_LOG
*
* 功能描述  : LTE BBP通道初始化函数
*
* 输入参数  : 无
*
* 输出参数  : 无
*
* 返 回 值  : 释放成功与否的标识码
*****************************************************************************/
BSP_U32  DRV_SOCP_INIT_LTE_BBP_LOG(BSP_U32 ulChanId,BSP_U32 ulPhyAddr,BSP_U32 ulSize)
{
    SOCP_ENCSRC_FIXCHAN_S * pChan;
    SOCP_REG_WRITE(SOCP_REG_ENCSRC_BUFADDR(ulChanId), ulPhyAddr);
    SOCP_REG_WRITE(SOCP_REG_ENCSRC_BUFWPTR(ulChanId), ulPhyAddr);
    SOCP_REG_WRITE(SOCP_REG_ENCSRC_BUFRPTR(ulChanId), ulPhyAddr);
    SOCP_REG_SETBITS(SOCP_REG_ENCSRC_BUFCFG0(ulChanId), 0, 27, ulSize);
    SOCP_REG_SETBITS(SOCP_REG_ENCSRC_BUFCFG0(ulChanId), 27, 5, 0);

    /*配置SOCP 参数*/
    //SOCP_REG_SETBITS(SOCP_REG_ENCSRC_BUFCFG1(ulChanId), 0, 1, 1);
    SOCP_REG_SETBITS(SOCP_REG_ENCSRC_BUFCFG1(ulChanId), 1, 2, SOCP_ENCSRC_CHNMODE_CTSPACKET);
    SOCP_REG_SETBITS(SOCP_REG_ENCSRC_BUFCFG1(ulChanId), 4, 4, SOCP_BBPLOG_DST_BUFID);
    SOCP_REG_SETBITS(SOCP_REG_ENCSRC_BUFCFG1(ulChanId), 8, 2, SOCP_CHAN_PRIORITY_0);
    SOCP_REG_SETBITS(SOCP_REG_ENCSRC_BUFCFG1(ulChanId), 10, 1, SOCP_ENCSRC_BYPASS_DISABLE);
    SOCP_REG_SETBITS(SOCP_REG_ENCSRC_BUFCFG1(ulChanId), 16, 8, SOCP_DATA_TYPE_0);
    SOCP_REG_SETBITS(SOCP_REG_ENCSRC_BUFCFG1(ulChanId), 11, 1, SOCP_DATA_TYPE_EN);
    SOCP_REG_SETBITS(SOCP_REG_ENCSRC_BUFCFG1(ulChanId), 31, 1, SOCP_ENC_DEBUG_DIS);

    /* 使能中断*/
    SOCP_REG_SETBITS(SOCP_REG_ENC_RAWINT1, ulChanId, 1, 1);
    SOCP_REG_SETBITS(SOCP_REG_APP_MASK1, ulChanId, 1, 0);

    pChan = &g_stEncSrcFixChan[ulChanId];

    pChan->u32ChanID               = ulChanId;
    pChan->u32DestChanID           = SOCP_BBPLOG_DST_BUFID;
    pChan->eChnMode                = SOCP_ENCSRC_CHNMODE_CTSPACKET;
    pChan->eDataType               = SOCP_DATA_TYPE_0;
    pChan->ePriority               = SOCP_CHAN_PRIORITY_0;
    pChan->sEncSrcBuf.u32Start     = ulPhyAddr;
    pChan->sEncSrcBuf.u32Write     = ulPhyAddr;
    pChan->sEncSrcBuf.u32Read      = ulPhyAddr;
    pChan->sEncSrcBuf.u32End       = ulPhyAddr + ulSize;
    pChan->sEncSrcBuf.u32Length    = (BSP_U32)ulSize;
    pChan->u32ChanEn               = SOCP_CHN_ENABLE;

    return BSP_OK;
}
/*****************************************************************************
* 函 数 名  : bsp_socp_drx_backup_reg
*
* 功能描述  :
*
* 返 回 值  :
*****************************************************************************/
s32 bsp_socp_drx_backup_reg(void)
{
	u32 i = 0;
	u32 *g_pu32SocpDrxGlobal = (u32 *)(SOCP_DRX_BACKUP_DDR_ADDR);

	/* judge state */
	if(BSP_OK!=bsp_socp_get_drx_state())
	{
       /* printk("bsp_socp_drx_backup_reg:socp state is not OK!\n"); */
		return BSP_ERROR;
	}

#ifdef CONFIG_DEFLATE
    if(DEFLATE_OK!=deflate_get_drx_state())
	{
        return DEFLATE_ERROR;
	}

    (void)bsp_deflate_drx_backup_reg();
#endif

	/* backup regs: global and int  */
    socp_memcpy(g_pu32SocpDrxGlobal, (u32 *)SOCP_REG_ADDR_DRX(SOCP_REG_GBLRST), SOCP_DRX_REG_GBLRST_NUM);
	g_pu32SocpDrxGlobal += SOCP_DRX_REG_GBLRST_NUM;

    socp_memcpy(g_pu32SocpDrxGlobal, (u32 *)SOCP_REG_ADDR_DRX(SOCP_REG_GBL_INTSTAT), SOCP_DRX_REG_ENCINT_NUM);
	g_pu32SocpDrxGlobal +=SOCP_DRX_REG_ENCINT_NUM;

    socp_memcpy(g_pu32SocpDrxGlobal, (u32 *)SOCP_REG_ADDR_DRX(SOCP_REG_DEC_CORE0MASK0), SOCP_DRX_REG_DECINT_NUM);
	g_pu32SocpDrxGlobal +=SOCP_DRX_REG_DECINT_NUM;

	/* backup regs: channel type */
	for(i=0;i<SOCP_MAX_ENCDST_CHN;i++)
	{
		socp_memcpy(g_pu32SocpDrxGlobal, (u32 *)SOCP_REG_ADDR_DRX(SOCP_REG_ENCDEST_BUFWPTR(i)), (sizeof(SOCP_DRX_ENCDST_S)/sizeof(u32)));
		g_pu32SocpDrxGlobal += (sizeof(SOCP_DRX_ENCDST_S)/sizeof(u32));
	}

	for(i=0;i<SOCP_MAX_DECDST_CHN;i++)
	{
		socp_memcpy(g_pu32SocpDrxGlobal, (u32 *)SOCP_REG_ADDR_DRX(SOCP_REG_DECDEST_BUFWPTR(i)), (sizeof(SOCP_DRX_DECDST_S)/sizeof(u32)));
		g_pu32SocpDrxGlobal += (sizeof(SOCP_DRX_DECDST_S)/sizeof(u32));
	}

	for(i=0;i<SOCP_MAX_ENCSRC_CHN;i++)
	{
		socp_memcpy(g_pu32SocpDrxGlobal, (u32 *)SOCP_REG_ADDR_DRX(SOCP_REG_ENCSRC_BUFWPTR(i)), (sizeof(SOCP_DRX_ENCSRC_S)/sizeof(u32)));
		g_pu32SocpDrxGlobal += (sizeof(SOCP_DRX_ENCSRC_S)/sizeof(u32));
	}

	for(i=0;i<SOCP_MAX_DECSRC_CHN;i++)
	{
		socp_memcpy(g_pu32SocpDrxGlobal, (u32 *)SOCP_REG_ADDR_DRX(SOCP_REG_DECSRC_BUFWPTR(i)), (sizeof(SOCP_DRX_DECSRC_S)/sizeof(u32)));
		g_pu32SocpDrxGlobal += (sizeof(SOCP_DRX_DECSRC_S)/sizeof(u32));
	}

    for(i=0;i<SOCP_MAX_ENCSRC_CHN;i++)
    {
        SOCP_REG_SETBITS (SOCP_REG_ENCSRC_BUFCFG1(i), 0, 1, 0);
    }
    for(i=0;i<(SOCP_MAX_DECSRC_CHN);i++)
    {
        SOCP_REG_SETBITS (SOCP_REG_DECSRC_BUFCFG0(i), 30, 1,0);
    }

	return BSP_OK ;
}
/*****************************************************************************
* 函 数 名  : socpInit
*
* 功能描述  : 模块初始化函数
*
* 输入参数  : 无
*
* 输出参数  : 无
*
* 返 回 值  : 初始化成功的标识码
*****************************************************************************/
void socp_m3_init(void)
{
    u32 i;
    u32 u32ResetValue = 0;
	u32 u32BufAddr = 0;
    struct device_node* dev = NULL;

#ifdef CONFIG_DEFLATE    
    struct device_node* dev1 = NULL;
#endif
    u32 version;
#if 1
    s32 ret;
#endif
#if(FEATURE_SOCP_ON_DEMAND == FEATURE_ON)
    if(BSP_OK != socp_icc_chan_init())
    {
        return;
    }
#endif

    if (BSP_TRUE == g_strSocpStat.bInitFlag)
    {
        return ;
    }
    memset(&g_strSocpStat, 0, sizeof(SOCP_GBL_STATE));

    dev = of_find_compatible_node(NULL,NULL,"hisilicon,socp_balong_lpm3");
    if(NULL == dev)
    {
        return ;
    }
    
    g_strSocpStat.baseAddr = (u32)of_iomap(dev,0);
    printk("socp base addr :0x%x\n",g_strSocpStat.baseAddr);
    if(0 == g_strSocpStat.baseAddr)
    {
        return ;
    }

#ifdef CONFIG_DEFLATE
    dev1 = of_find_compatible_node(NULL,NULL,"hisilicon,deflate_balong_lpm3");
    if(NULL == dev1)
    {
     printk("Socpdeflate dev find failed!\n");
        return ;
    }
    g_strDeflateStat.baseAddr = (u32)of_iomap(dev1,0);
    //printk("socp base addr :0x%x\n",g_strDeflateStat.baseAddr);
    if(0 == g_strDeflateStat.baseAddr)
    {
        printk("base addr is error!\n");
        return ; 
    }      
#endif

	/* 对全局寄存器进行复位 */
    SOCP_REG_WRITE(SOCP_REG_GBLRST, 1);
    /* 等待通道复位状态自清 */
    for(i=0; i<SOCP_RESET_TIME; i++)
    {
        SOCP_REG_READ(SOCP_REG_GBLRST, u32ResetValue);
        if(0 == u32ResetValue)
        {
            break;
        }
        if((SOCP_RESET_TIME -1) == i)
        {
			return ;
        }
    }

    /* 增加ram中寄存器的复位操作*/
    for(i=0; i<SOCP_MAX_ENCSRC_CHN; i++)
    {
        SOCP_REG_WRITE(SOCP_REG_ENCSRC_BUFADDR(i),0);
        SOCP_REG_WRITE(SOCP_REG_ENCSRC_BUFCFG0(i),0);
        SOCP_REG_WRITE(SOCP_REG_ENCSRC_RDQWPTR(i),0);
        SOCP_REG_WRITE(SOCP_REG_ENCSRC_RDQRPTR(i),0);
        SOCP_REG_WRITE(SOCP_REG_ENCSRC_RDQADDR(i),0);
        SOCP_REG_WRITE(SOCP_REG_ENCSRC_RDQCFG(i),0);
    }
    for(i=0; i<SOCP_MAX_ENCDST_CHN; i++)
    {
        SOCP_REG_WRITE(SOCP_REG_ENCDEST_BUFADDR(i),0);
    }

    /* 配置传输中断超时时间和buffer溢出超时时间 */
    SOCP_REG_WRITE(SOCP_REG_INTTIMEOUT, SOCP_TRANS_TIMEOUT_DEFAULT);
    SOCP_REG_SETBITS(SOCP_REG_BUFTIMEOUT, 31, 1, 0);
    SOCP_REG_SETBITS(SOCP_REG_BUFTIMEOUT, 0, 16, SOCP_OVERFLOW_TIMEOUT_DEFAULT);
    /* 配置解码通路包长度配置寄存器*/
    SOCP_REG_SETBITS(SOCP_REG_DEC_PKTLEN, 0, 12,  SOCP_DEC_PKTLGTH_MAX);
    SOCP_REG_SETBITS(SOCP_REG_DEC_PKTLEN, 12, 5,  SOCP_DEC_PKTLGTH_MIN);
    /* 时钟门控,空闲时时钟自动关闭 */
    writel(0xffffffff, SOCP_REG_BASEADDR + 0x14);

    /* 屏蔽中断 */
    SOCP_REG_SETBITS(SOCP_REG_ENC_MASK0, 0, 7, 0x7f);
    SOCP_REG_WRITE(SOCP_REG_APP_MASK1, 0xffffffff);
    SOCP_REG_SETBITS(SOCP_REG_ENC_MASK2, 0, 7, 0x7f);
    SOCP_REG_SETBITS(SOCP_REG_ENC_MASK2, 16, 7, 0x7f);
    SOCP_REG_WRITE(SOCP_REG_APP_MASK3, 0xffffffff);
    SOCP_REG_SETBITS(SOCP_REG_DEC_CORE0MASK0, 0, 16, 0xffff);
    SOCP_REG_SETBITS(SOCP_REG_DEC_MASK1, 0, 24, 0xffffff);
    SOCP_REG_SETBITS(SOCP_REG_DEC_CORE0MASK2, 0, 16, 0xffff);

    for (i = 0; i < SOCP_ENCSRC_M3_NUM; i++)
    {
        u32BufAddr = SOCP_M3_LPM3_ENCSRC_ADDR + i*SOCP_M3_CHN_SIZE;

		SOCP_REG_WRITE(SOCP_REG_ENCSRC_BUFADDR((i + SOCP_ENCSRC_LPM3_BASE)), u32BufAddr);
		SOCP_REG_WRITE(SOCP_REG_ENCSRC_BUFWPTR((i + SOCP_ENCSRC_LPM3_BASE)), u32BufAddr);
		SOCP_REG_WRITE(SOCP_REG_ENCSRC_BUFRPTR((i + SOCP_ENCSRC_LPM3_BASE)), u32BufAddr);

		/*config0 */
		SOCP_REG_SETBITS(SOCP_REG_ENCSRC_BUFCFG0((i + SOCP_ENCSRC_LPM3_BASE)), 0, 27, SOCP_M3_CHN_SIZE);
		SOCP_REG_SETBITS(SOCP_REG_ENCSRC_BUFCFG0((i + SOCP_ENCSRC_LPM3_BASE)), 27, 5, 0);

        /*配置SOCP 参数*/
        SOCP_REG_SETBITS(SOCP_REG_ENCSRC_BUFCFG1((i + SOCP_ENCSRC_LPM3_BASE)), 0, 1, 0);
        SOCP_REG_SETBITS(SOCP_REG_ENCSRC_BUFCFG1((i + SOCP_ENCSRC_LPM3_BASE)), 1, 2, 1);
        SOCP_REG_SETBITS(SOCP_REG_ENCSRC_BUFCFG1((i + SOCP_ENCSRC_LPM3_BASE)), 4, 4, SOCP_CODER_DST_OM_IND);
        if(0==i)
		{
			SOCP_REG_SETBITS(SOCP_REG_ENCSRC_BUFCFG1((i + SOCP_ENCSRC_LPM3_BASE)), 8, 2, 1);
		}
		else
		{
			SOCP_REG_SETBITS(SOCP_REG_ENCSRC_BUFCFG1((i + SOCP_ENCSRC_LPM3_BASE)), 8, 2, 0);
		}
        SOCP_REG_SETBITS(SOCP_REG_ENCSRC_BUFCFG1((i + SOCP_ENCSRC_LPM3_BASE)), 10, 1, 0);

        SOCP_REG_SETBITS(SOCP_REG_ENCSRC_BUFCFG1((i + SOCP_ENCSRC_LPM3_BASE)), 11, 1, 0);

        SOCP_REG_SETBITS(SOCP_REG_ENCSRC_BUFCFG1((i + SOCP_ENCSRC_LPM3_BASE)), 16, 8, 0);

        SOCP_REG_SETBITS(SOCP_REG_ENCSRC_BUFCFG1((i + SOCP_ENCSRC_LPM3_BASE)), 31, 1, 0);

        /* 使能中断*/
        SOCP_REG_SETBITS(SOCP_REG_ENC_RAWINT1, (SOCP_ENCSRC_LPM3_BASE + i), 1, 1);
        SOCP_REG_SETBITS(SOCP_REG_APP_MASK1, (SOCP_ENCSRC_LPM3_BASE + i), 1, 0);

		g_strSocpStat.u32IntEncDstTfr = 0;
    }

    SOCP_REG_READ(SOCP_REG_SOCP_VERSION, version);
    if(version >= SOCP_NEW_VERSION)
    {
        /*新逻辑统一配置编码源安全使能*/
        /*0~3、10号通道为非安全通道,其它均为安全通道*/
        SOCP_REG_WRITE(SOCP_REG_ENCDEST_SEC_CTRL, 0xffff7bf0);
    }

    g_socp_rsracc_device.reg_addr = (u32*)(g_strSocpStat.baseAddr);

    if (bsp_rsracc_support()) 
    {
            printk("bsp_rsracc_register socp 0x%x.\n", (u32)g_socp_rsracc_device.reg_addr);
            
        ret = bsp_rsracc_register(&g_socp_rsracc_device, 1);
        if(ret)
        {
            printk("bsp_rsracc_register socp failed.\n");
        }
    }

    /* 设置初始化状态 */
    g_strSocpStat.bInitFlag = BSP_TRUE;

    return ;
}