/**************************************************************************** * * 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_obtain_given_channel * * Description: assign a given CAPH switch channel * ****************************************************************************/ CSL_CAPH_SWITCH_CHNL_e csl_caph_switch_obtain_given_channel( CSL_CAPH_SWITCH_CHNL_e chnl) { CSL_CAPH_SWITCH_CHNL_e chnl2; CAPH_SWITCH_CHNL_e chal_chnl; chal_chnl = csl_caph_switch_get_chalchnl(chnl); chal_chnl = chal_caph_switch_alloc_given_channel(handle, chal_chnl); chnl2 = csl_caph_switch_get_cslchnl(chal_chnl); aTrace(LOG_AUDIO_CSL, "%s ask %d get %d\n", __func__, chnl, chnl2); return chnl2; }
/**************************************************************************** * * Function Name: void csl_caph_switch_stop_transfer(CSL_CAPH_SWITCH_CHNL_e * chnl) * * Description: stop the channel * ****************************************************************************/ void csl_caph_switch_stop_transfer(CSL_CAPH_SWITCH_CHNL_e chnl) { CAPH_SWITCH_CHNL_e chal_chnl = CAPH_SWITCH_CH_VOID; aTrace (LOG_AUDIO_CSL, "csl_caph_switch_stop_transfer:: "); aTrace (LOG_AUDIO_CSL, "csl_caph_switch_stop_transfer:: chnl = 0x%x", chnl); /* Get cHAL Channel */ chal_chnl = csl_caph_switch_get_chalchnl(chnl); /* Stop this channel */ chal_caph_switch_disable(handle, chal_chnl); return; }
/**************************************************************************** * * Function Name: void csl_caph_switch_remove_dst(CSL_CAPH_SWITCH_CHNL_e chnl, * UInt32 FIFO_dstAddr) * * Description: Remove one destination from a CAPH switch channel * ****************************************************************************/ void csl_caph_switch_remove_dst(CSL_CAPH_SWITCH_CHNL_e chnl, UInt32 FIFO_dstAddr) { CAPH_SWITCH_CHNL_e chal_chnl = CAPH_SWITCH_CH_VOID; if (FIFO_dstAddr == 0) return; aTrace(LOG_AUDIO_CNTLR, "csl_caph_switch_remove_dst:: chnl = 0x%x, dstcAddr = 0x%lx\n", chnl, FIFO_dstAddr); /* Get cHAL Channel */ chal_chnl = csl_caph_switch_get_chalchnl(chnl); /* Remove one destination for this channel */ chal_caph_switch_remove_dst(handle, chal_chnl, (UInt16) FIFO_dstAddr); return; }
/**************************************************************************** * * Function Name: void csl_caph_switch_add_dst(CSL_CAPH_SWITCH_CHNL_e chnl, * UInt32 FIFO_dstAddr) * * Description: Add one destination to a CAPH switch channel * ****************************************************************************/ void csl_caph_switch_add_dst(CSL_CAPH_SWITCH_CHNL_e chnl, UInt32 FIFO_dstAddr) { CAPH_SWITCH_CHNL_e chal_chnl = CAPH_SWITCH_CH_VOID; aTrace(LOG_AUDIO_CSL, "csl_caph_switch_add_dst:: "); aTrace(LOG_AUDIO_CSL, "csl_caph_switch_add_dst:: chnl = 0x%x, dstcAddr = 0x%lx\n", chnl, FIFO_dstAddr); /* Get cHAL Channel */ chal_chnl = csl_caph_switch_get_chalchnl(chnl); /* Add one more destination for this channel */ if (CAPH_DST_OK != chal_caph_switch_add_dst(handle, chal_chnl, (UInt16) FIFO_dstAddr)) aError("csl_caph_switch_add_dst:: FAIL\n"); }
/**************************************************************************** * * Function Name: void csl_caph_switch_start_transfer(CSL_CAPH_SWITCH_CHNL_e * chnl) * * Description: start the channel * ****************************************************************************/ void csl_caph_switch_start_transfer(CSL_CAPH_SWITCH_CHNL_e chnl) { CAPH_SWITCH_CHNL_e chal_chnl = CAPH_SWITCH_CH_VOID; aTrace(LOG_AUDIO_CSL, "csl_caph_switch_start_transfer:: chnl = 0x%x\n", chnl); /* Get cHAL Channel */ chal_chnl = csl_caph_switch_get_chalchnl(chnl); /* Check whether DST of the switch channel is defined properly */ if (csl_caph_switch_getDSTStatus(chal_chnl) != CAPH_DST_OK) { /* Clear the status table and return without enabling */ csl_caph_switch_setDSTStatus(chal_chnl, CAPH_DST_OK); return; } /* Start this channel */ chal_caph_switch_enable(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; }