/****************************************************************************
*
*  Function Name: void csl_caph_switch_release_channel(CSL_CAPH_SWITCH_CHNL_e
*                                                                chnl)
*
*  Description: release CAPH switch channel
*
****************************************************************************/
void csl_caph_switch_release_channel(CSL_CAPH_SWITCH_CHNL_e chnl)
{
	CAPH_SWITCH_CHNL_e chal_chnl = CAPH_SWITCH_CH_VOID;
	aTrace(LOG_AUDIO_CSL,
		"csl_caph_switch_release_channel:: chnl = 0x%x\n",
		chnl);
	chal_chnl = csl_caph_switch_get_chalchnl(chnl);
	chal_caph_switch_free_channel(handle, chal_chnl);
	return;
}
/****************************************************************************
*
*  Function Name:CSL_CAPH_SWITCH_STATUS_e csl_caph_switch_config_channel(
*                         CSL_CAPH_SWITCH_CONFIG_t chnl_config)
*
*  Description: configure CAPH switch channel
*
****************************************************************************/
CSL_CAPH_SWITCH_STATUS_e csl_caph_switch_config_channel(CSL_CAPH_SWITCH_CONFIG_t
							chnl_config)
{
	CAPH_SWITCH_CHNL_e chal_chnl = CAPH_SWITCH_CH_VOID;
	CAPH_DATA_FORMAT_e chal_dataFormat = CAPH_MONO_16BIT;
	CAPH_SWITCH_TRIGGER_e chal_trig = CAPH_VOID;
	CAPH_DST_STATUS_e dstStatus = CAPH_DST_OK;
	CSL_CAPH_SWITCH_STATUS_e status = CSL_CAPH_SWITCH_OWNER;

	aTrace(LOG_AUDIO_CNTLR,
		"csl_caph_switch_config_channel:: chnl = 0x%x, srcAddr = "
		"0x%lx, dstcAddr = 0x%lx, dataFmt = 0x%x, trigger = 0x%x\n",
			      chnl_config.chnl,
			      chnl_config.FIFO_srcAddr,
			      chnl_config.FIFO_dstAddr,
			      chnl_config.dataFmt, chnl_config.trigger);

	/* Get cHAL Channel */
	chal_chnl = csl_caph_switch_get_chalchnl(chnl_config.chnl);
	/* Select Source for this channel */
	chal_caph_switch_select_src(handle, chal_chnl,
				    (UInt16) (chnl_config.FIFO_srcAddr));
	/* Add Dst for this channel */
	dstStatus =
	    chal_caph_switch_add_dst(handle, chal_chnl,
				     (UInt16) (chnl_config.FIFO_dstAddr));
	csl_caph_switch_setDSTStatus(chal_chnl, dstStatus);

	/* If the DST is already being used by other channels
	 * Do not set the switch channel anymore.
	 */
	if (dstStatus != CAPH_DST_OK) {
		audio_xassert(0, dstStatus);
		aError("%s::sw %d chal_chnl %d dst 0x%lx used by other sw, dstStatus=%d\n",
			__func__, chnl_config.chnl, chal_chnl, chnl_config.FIFO_dstAddr, dstStatus);
		csl_caph_hwctrldump();
		chal_caph_switch_free_channel(handle, chal_chnl);
		status = CSL_CAPH_SWITCH_BORROWER;
		return status;
	}
	/* Set data format */
	switch (chnl_config.dataFmt) {
	case CSL_CAPH_16BIT_MONO:
		chal_dataFormat = CAPH_MONO_16BIT;
		break;
	case CSL_CAPH_16BIT_STEREO:
		chal_dataFormat = CAPH_STEREO_16BIT;
		break;
	case CSL_CAPH_24BIT_MONO:
		chal_dataFormat = CAPH_MONO_24BIT;
		break;
	case CSL_CAPH_24BIT_STEREO:
		chal_dataFormat = CAPH_STEREO_24BIT;
		break;
	default:
		audio_xassert(0, chnl_config.dataFmt);
	}
	chal_caph_switch_set_datafmt(handle, chal_chnl, chal_dataFormat);
	/* Select the trigger */
	chal_trig = chnl_config.trigger;
	chal_caph_switch_select_trigger(handle, chal_chnl, chal_trig);

	return status;
}