/*FUNCTION**********************************************************************
*
* Function Name : CLOCK_SYS_GetLpuartFreq
* Description	 : Gets the clock frequency for LPUART module.
* This function gets the clock frequency for LPUART moudle.
*
*END**************************************************************************/
uint32_t CLOCK_SYS_GetLpuartFreq(uint32_t instance)
{
    clock_lpuart_src_t src;
    uint32_t freq;

    src = CLOCK_HAL_GetLpuartSrc(SIM, instance);

    switch (src)
    {
        case kClockLpuartSrcIrc48M:	  /* IRC48M */
            freq = kMcgliteConst48M;
            break;
        case kClockLpuartSrcOsc0erClk:		/* OSCER clock */
            freq = CLOCK_SYS_GetOsc0ExternalRefClockFreq();
            break;
        case kClockLpuartSrcMcgIrClk:		/* MCGIR clock */
            freq = CLOCK_HAL_GetInternalRefClk(MCG);
            break;
        default:
            freq = 0U;
            break;
    }

    return freq;
}
/*FUNCTION**********************************************************************
 *
 * Function Name : CLOCK_SYS_GetLptmrFreq
 * Description   : Gets LPTMRx pre-scaler/glitch filter clock frequency.
 * This function gets the LPTMRx pre-scaler/glitch filter clock frequency.
 *
 *END**************************************************************************/
uint32_t CLOCK_SYS_GetLptmrFreq(uint32_t instance, clock_lptmr_src_t lptmrSrc)
{
    uint32_t freq;

    switch (lptmrSrc)
    {
        case kClockLptmrSrcMcgIrClk:        /* MCG IRC clock  */
            freq = CLOCK_HAL_GetInternalRefClk(MCG);
            break;
        case kClockLptmrSrcLpoClk:             /* LPO clock     */
            freq = CLOCK_SYS_GetLpoClockFreq();
            break;
        case kClockLptmrSrcEr32kClk:        /* ERCLK32K clock */
            freq = CLOCK_SYS_GetExternalRefClock32kFreq();
            break;
        case kClockLptmrSrcOsc0erClk:        /* OSCERCLK clock */
            freq = CLOCK_SYS_GetOsc0ExternalRefClockFreq();
            break;
        default:
            freq = 0U;
            break;
    }

    return freq;
}
/*FUNCTION**********************************************************************
*
* Function Name : CLOCK_SYS_GetCopFreq
* Description   : Gets the clock frequency for COP module.
* This function gets the clock frequency for COP moudle.
*
*END**************************************************************************/
uint32_t CLOCK_SYS_GetCopFreq(void)
{
    clock_cop_src_t src;
    uint32_t freq;

    src = CLOCK_HAL_GetCopSrc(SIM);

    switch (src)
    {
        case kClockCopSrcLpoClk:
            freq = CLOCK_SYS_GetLpoClockFreq();
            break;
        case kClockCopSrcMcgIrClk:
            freq = CLOCK_HAL_GetInternalRefClk(MCG);
            break;
        case kClockCopSrcOsc0erClk:
            freq = CLOCK_SYS_GetOsc0ExternalRefClockFreq();
            break;
        case kClockCopSrcBusClk:
            freq = CLOCK_SYS_GetBusClockFreq();
            break;
        default:
            freq = 0U;
            break;
    }

    return freq;
}
clock_manager_error_code_t CLOCK_SYS_GetFreq(clock_names_t clockName,
                                                 uint32_t *frequency)
{
    clock_manager_error_code_t returnCode = kClockManagerSuccess;

    switch (clockName)
    {
        case kCoreClock:
        case kSystemClock:
            *frequency = CLOCK_SYS_GetCoreClockFreq();
            break;
        case kPlatformClock:
            *frequency = CLOCK_SYS_GetSystemClockFreq();
            break;
        case kBusClock:
            *frequency = CLOCK_SYS_GetBusClockFreq();
            break;
        case kFlexBusClock:
            *frequency = CLOCK_SYS_GetFlexbusFreq();
            break;
        case kFlashClock:
            *frequency = CLOCK_SYS_GetFlashClockFreq();
            break;
        case kOsc32kClock:
            *frequency = CLOCK_SYS_GetExternalRefClock32kFreq();
            break;
        case kOsc0ErClock:
            *frequency = CLOCK_SYS_GetOsc0ExternalRefClockFreq();
            break;
        case kRtcoutClock:
            *frequency = CLOCK_SYS_GetRtcOutFreq();
            break;
        case kMcgFfClock:
            *frequency = CLOCK_SYS_GetFixedFreqClockFreq();
            break;
        case kMcgFllClock:
            *frequency = CLOCK_HAL_GetFllClk(MCG_BASE);
            break;
        case kMcgPll0Clock:
            *frequency = CLOCK_HAL_GetPll0Clk(MCG_BASE);
            break;
        case kMcgOutClock:
            *frequency = CLOCK_HAL_GetOutClk(MCG_BASE);
            break;
        case kMcgIrClock:
            *frequency = CLOCK_HAL_GetInternalRefClk(MCG_BASE);
            break;
        case kLpoClock:
            *frequency = CLOCK_SYS_GetLpoClockFreq();
            break;
        default:
            *frequency = 0U;
            returnCode = kClockManagerNoSuchClockName;
            break;
    }

    return returnCode;
}
/*FUNCTION**********************************************************************
 *
 * Function Name : CLOCK_SYS_GetFlexcanFreq
 * Description   : Gets FLEXCAN clock frequency.
 * This function gets the FLEXCAN clock frequency.
 *
 *END**************************************************************************/
uint32_t CLOCK_SYS_GetFlexcanFreq(uint32_t instance, clock_flexcan_src_t flexcanSrc)
{
    if (kClockFlexcanSrcOsc0erClk == flexcanSrc)
    {
        return CLOCK_SYS_GetOsc0ExternalRefClockFreq();
    }
    else
    { 
        return CLOCK_SYS_GetSystemClockFreq();
    }
}
/*FUNCTION**********************************************************************
*
* Function Name : CLOCK_SYS_GetRtcOutFreq
* Description   : Gets the RTC_CLKOUT frequency.
* This function gets RTC_CLKOUT  clock frequency.
*
*END**************************************************************************/
uint32_t CLOCK_SYS_GetRtcOutFreq(void)
{
    if (kClockRtcoutSrc1Hz == CLOCK_SYS_GetRtcOutSrc())
    {
        return 1U;
    }
    else
    {
        return CLOCK_SYS_GetOsc0ExternalRefClockFreq();
    }
}
/*FUNCTION**********************************************************************
 *
 * Function Name : CLOCK_SYS_GetFtmFixedFreq
 * Description   : Gets FTM fixed frequency clock frequency.
 * 
 * This function gets the FTM fixed frequency clock frequency.
 *END**************************************************************************/
uint32_t CLOCK_SYS_GetFtmFixedFreq(uint32_t instance)
{
    uint32_t ftmFixedFreq;
    clock_ftm_fixedfreq_src_t ftmFixedFreqSel;
    ftmFixedFreqSel = (clock_ftm_fixedfreq_src_t)CLOCK_HAL_GetFtmFixFreqClkSrc(SIM);
    switch(ftmFixedFreqSel)
    {
      case kClockFtmClkMcgFfClk:
          ftmFixedFreq = CLOCK_HAL_GetFixedFreqClk(MCG);
          break;
      case kClockFtmClkMcgIrClk:
          ftmFixedFreq = CLOCK_HAL_GetInternalRefClk(MCG);
          break;
      case kClockFtmClkOsc0erClk:
          ftmFixedFreq = CLOCK_SYS_GetOsc0ExternalRefClockFreq();
          break;
      default:
          ftmFixedFreq = 0;
          break;
    }
    return ftmFixedFreq;
}
/*FUNCTION**********************************************************************
 *
 * Function Name : CLOCK_SYS_GetAdcAltFreq
 * Description   : Gets the ADC alternate clock frequency.
 * This function gets the ADC alternate clock frequency.
 *
 *END**************************************************************************/
uint32_t CLOCK_SYS_GetAdcAltFreq(uint32_t instance)
{
    clock_adc_alt_src_t adcAltClkSel;
    uint32_t adcAltClkValue = 0;
    
    adcAltClkSel = CLOCK_HAL_GetAdcAltClkSrc(SIM, instance);
    switch(adcAltClkSel)
    {
       case 0:
          adcAltClkValue =  CLOCK_SYS_GetOutdiv5ClockFreq();    /* OUTDIV5 output */
          break;
       case 1:
          adcAltClkValue =  CLOCK_SYS_GetInternalRefClockFreq(); /* MCGIRC output */
          break;
       case 2:
          adcAltClkValue =  CLOCK_SYS_GetOsc0ExternalRefClockFreq();  /* OSCERCLK output */  
          break;
       default:
          adcAltClkValue = 0;
          break;
     }   
    return adcAltClkValue;
}
/*FUNCTION**********************************************************************
 *
 * Function Name : CLOCK_SYS_GetLpuartFreq
 * Description   : Gets the clock frequency for LPUART module.
 * This function gets the clock frequency for LPUART moudle.
 *
 *END**************************************************************************/
uint32_t CLOCK_SYS_GetLpuartFreq(uint32_t instance)
{
    clock_lpuart_src_t src;
    uint32_t freq;

    src = CLOCK_HAL_GetLpuartSrc(SIM, instance);
    switch (src)
    {
        case kClockLpuartSrcPllFllSel:
            freq = CLOCK_SYS_GetPllFllClockFreq();
            break;
        case kClockLpuartSrcOsc0erClk:
            freq = CLOCK_SYS_GetOsc0ExternalRefClockFreq();
            break;
        case kClockLpuartSrcMcgIrClk:
            freq = CLOCK_HAL_GetInternalRefClk(MCG);
            break;
        default:
            freq = 0U;
            break;
    }
    return freq;
}
/*FUNCTION**********************************************************************
 *
 * Function Name : CLOCK_SYS_GetFlexioFreq
 * Description   : Gets the clock frequency for FLEXIO.
 * This function gets the clock frequency for FLEXIO.
 *
 *END**************************************************************************/
uint32_t CLOCK_SYS_GetFlexioFreq(uint32_t instance)
{
    uint32_t freq;
    clock_flexio_src_t src = CLOCK_HAL_GetFlexioSrc(SIM, instance);

    switch (src)
    {
        case kClockFlexioSrcIrc48M:
            freq = kMcgliteConst48M;
            break;
        case kClockFlexioSrcOsc0erClk:
            freq = CLOCK_SYS_GetOsc0ExternalRefClockFreq();
            break;
        case kClockFlexioSrcMcgIrClk:
            freq = CLOCK_HAL_GetInternalRefClk(MCG);
            break;
        default:
            freq = 0U;
            break;
    }

    return freq;
}