/*==================================================================================================
*   Project              : RTD AUTOSAR 4.4
*   Platform             : CORTEXM
*   Peripheral           : 
*   Dependencies         : none
*
*   Autosar Version      : 4.4.0
*   Autosar Revision     : ASR_REL_4_4_REV_0000
*   Autosar Conf.Variant :
*   SW Version           : 0.9.0
*   Build Version        : S32K3_RTD_0_9_0__ASR_REL_4_4_REV_0000_20210326
*
*   (c) Copyright 2020 - 2021 NXP Semiconductors
*   All Rights Reserved.
*
*   NXP Confidential. This software is owned or controlled by NXP and may only be
*   used strictly in accordance with the applicable license terms. By expressly
*   accepting such terms or by downloading, installing, activating and/or otherwise
*   using the software, you are agreeing that you have read, and that you agree to
*   comply with and are bound by, such license terms. If you do not agree to be
*   bound by the applicable license terms, then you may not retain, install,
*   activate or otherwise use the software.
==================================================================================================*/

/**
*   @file    Clock_Ip_Private.h
*   @version    0.9.0
*
*   @brief   CLOCK IP driver private header file.
*   @details CLOCK IP driver private header file.

*   @addtogroup CLOCK_DRIVER Clock Ip Driver
*   @{
*/

#if !defined(CLOCK_IP_PRIVATE_H)
#define CLOCK_IP_PRIVATE_H

#include "Clock_Ip.h"
#include <stdbool.h>
#include <stddef.h>

#if defined(S32G2XX)
    #include "Clock_Ip_Specific.h"
#elif defined(S32R45)
    #include "Clock_Ip_Specific1.h"
#elif defined(S32K3XX)
    #include "Clock_Ip_Specific.h"
#elif defined(S32K1XX)
    #include "Clock_Ip_Specific.h"
#else
    #error "Unknown platform!"
#endif

#ifdef CLOCK_IP_DEV_ERROR_DETECT
#if (STD_ON == CLOCK_IP_DEV_ERROR_DETECT)
    #include "Devassert.h"
#endif /* (STD_ON == CLOCK_IP_DEV_ERROR_DETECT) */
#endif /* #ifdef CLOCK_IP_DEV_ERROR_DETECT */

/*==================================================================================================
                               SOURCE FILE VERSION INFORMATION
==================================================================================================*/

#define CLOCK_IP_PRIVATE_VENDOR_ID                    43
#define CLOCK_IP_PRIVATE_AR_RELEASE_MAJOR_VERSION     4
#define CLOCK_IP_PRIVATE_AR_RELEASE_MINOR_VERSION     4
#define CLOCK_IP_PRIVATE_AR_RELEASE_REVISION_VERSION  0
#define CLOCK_IP_PRIVATE_SW_MAJOR_VERSION             0
#define CLOCK_IP_PRIVATE_SW_MINOR_VERSION             9
#define CLOCK_IP_PRIVATE_SW_PATCH_VERSION             0


/*==================================================================================================
                                      FILE VERSION CHECKS
==================================================================================================*/
/* Check if Clock_Ip_Private.h file and Clock_Ip.h file are of the same Autosar version */
#if ((CLOCK_IP_PRIVATE_AR_RELEASE_MAJOR_VERSION    != CLOCK_IP_AR_RELEASE_MAJOR_VERSION) || \
     (CLOCK_IP_PRIVATE_AR_RELEASE_MINOR_VERSION    != CLOCK_IP_AR_RELEASE_MINOR_VERSION) || \
     (CLOCK_IP_PRIVATE_AR_RELEASE_REVISION_VERSION != CLOCK_IP_AR_RELEASE_REVISION_VERSION))
    #error "AutoSar Version Numbers of Clock_Ip_Private.h and Clock_Ip.h are different"
#endif

/* Check if Clock_Ip_Private.h file and Clock_Ip.h file have same versions */
#if (CLOCK_IP_PRIVATE_VENDOR_ID  != CLOCK_IP_VENDOR_ID)
    #error "Clock_Ip_Private.h and Clock_Ip.h have different vendor IDs"
#endif

/* Check if Clock_Ip_Private.h file and Clock_Ip.h file are of the same Software version */
#if ((CLOCK_IP_PRIVATE_SW_MAJOR_VERSION != CLOCK_IP_SW_MAJOR_VERSION) || \
     (CLOCK_IP_PRIVATE_SW_MINOR_VERSION != CLOCK_IP_SW_MINOR_VERSION) || \
     (CLOCK_IP_PRIVATE_SW_PATCH_VERSION != CLOCK_IP_SW_PATCH_VERSION))
    #error "Software Version Numbers of Clock_Ip_Private.h and Clock_Ip.h are different"
#endif

#if defined(S32G2XX)
/* Check if Clock_Ip_Private.h file and Clock_Ip_Specific.h file are of the same Autosar version */
#if ((CLOCK_IP_PRIVATE_AR_RELEASE_MAJOR_VERSION    != CLOCK_IP_SPECIFIC_AR_RELEASE_MAJOR_VERSION) || \
     (CLOCK_IP_PRIVATE_AR_RELEASE_MINOR_VERSION    != CLOCK_IP_SPECIFIC_AR_RELEASE_MINOR_VERSION) || \
     (CLOCK_IP_PRIVATE_AR_RELEASE_REVISION_VERSION != CLOCK_IP_SPECIFIC_AR_RELEASE_REVISION_VERSION))
    #error "AutoSar Version Numbers of Clock_Ip_Private.h and Clock_Ip_Specific.h are different"
#endif

/* Check if Clock_Ip_Private.h file and Clock_Ip_Specific.h file have same versions */
#if (CLOCK_IP_PRIVATE_VENDOR_ID  != CLOCK_IP_SPECIFIC_VENDOR_ID)
    #error "Clock_Ip_Private.h and Clock_Ip_Specific.h have different vendor IDs"
#endif

/* Check if Clock_Ip_Private.h file and Clock_Ip_Specific.h file are of the same Software version */
#if ((CLOCK_IP_PRIVATE_SW_MAJOR_VERSION != CLOCK_IP_SPECIFIC_SW_MAJOR_VERSION) || \
     (CLOCK_IP_PRIVATE_SW_MINOR_VERSION != CLOCK_IP_SPECIFIC_SW_MINOR_VERSION) || \
     (CLOCK_IP_PRIVATE_SW_PATCH_VERSION != CLOCK_IP_SPECIFIC_SW_PATCH_VERSION))
    #error "Software Version Numbers of Clock_Ip_Private.h and Clock_Ip_Specific.h are different"
#endif
#elif defined(S32R45)
/* Check if Clock_Ip_Private.h file and Clock_Ip_Specific1.h file are of the same Autosar version */
#if ((CLOCK_IP_PRIVATE_AR_RELEASE_MAJOR_VERSION    != CLOCK_IP_SPECIFIC1_AR_RELEASE_MAJOR_VERSION) || \
     (CLOCK_IP_PRIVATE_AR_RELEASE_MINOR_VERSION    != CLOCK_IP_SPECIFIC1_AR_RELEASE_MINOR_VERSION) || \
     (CLOCK_IP_PRIVATE_AR_RELEASE_REVISION_VERSION != CLOCK_IP_SPECIFIC1_AR_RELEASE_REVISION_VERSION))
    #error "AutoSar Version Numbers of Clock_Ip_Private.h and Clock_Ip_Specific1.h are different"
#endif

/* Check if Clock_Ip_Private.h file and Clock_Ip_Specific1.h file have same versions */
#if (CLOCK_IP_PRIVATE_VENDOR_ID  != CLOCK_IP_SPECIFIC1_VENDOR_ID)
    #error "Clock_Ip_Private.h and Clock_Ip_Specific1.h have different vendor IDs"
#endif

/* Check if Clock_Ip_Private.h file and Clock_Ip_Specific1.h file are of the same Software version */
#if ((CLOCK_IP_PRIVATE_SW_MAJOR_VERSION != CLOCK_IP_SPECIFIC1_SW_MAJOR_VERSION) || \
     (CLOCK_IP_PRIVATE_SW_MINOR_VERSION != CLOCK_IP_SPECIFIC1_SW_MINOR_VERSION) || \
     (CLOCK_IP_PRIVATE_SW_PATCH_VERSION != CLOCK_IP_SPECIFIC1_SW_PATCH_VERSION))
    #error "Software Version Numbers of Clock_Ip_Private.h and Clock_Ip_Specific1.h are different"
#endif
#elif defined(S32K3XX)
/* Check if Clock_Ip_Private.h file and Clock_Ip_Specific.h file are of the same Autosar version */
#if ((CLOCK_IP_PRIVATE_AR_RELEASE_MAJOR_VERSION    != CLOCK_IP_SPECIFIC_AR_RELEASE_MAJOR_VERSION) || \
     (CLOCK_IP_PRIVATE_AR_RELEASE_MINOR_VERSION    != CLOCK_IP_SPECIFIC_AR_RELEASE_MINOR_VERSION) || \
     (CLOCK_IP_PRIVATE_AR_RELEASE_REVISION_VERSION != CLOCK_IP_SPECIFIC_AR_RELEASE_REVISION_VERSION))
    #error "AutoSar Version Numbers of Clock_Ip_Private.h and Clock_Ip_Specific.h are different"
#endif

/* Check if Clock_Ip_Private.h file and Clock_Ip_Specific.h file have same versions */
#if (CLOCK_IP_PRIVATE_VENDOR_ID  != CLOCK_IP_SPECIFIC_VENDOR_ID)
    #error "Clock_Ip_Private.h and Clock_Ip_Specific.h have different vendor IDs"
#endif

/* Check if Clock_Ip_Private.h file and Clock_Ip_Specific.h file are of the same Software version */
#if ((CLOCK_IP_PRIVATE_SW_MAJOR_VERSION != CLOCK_IP_SPECIFIC_SW_MAJOR_VERSION) || \
     (CLOCK_IP_PRIVATE_SW_MINOR_VERSION != CLOCK_IP_SPECIFIC_SW_MINOR_VERSION) || \
     (CLOCK_IP_PRIVATE_SW_PATCH_VERSION != CLOCK_IP_SPECIFIC_SW_PATCH_VERSION))
    #error "Software Version Numbers of Clock_Ip_Private.h and Clock_Ip_Specific.h are different"
#endif
#else
    #error "Unknown platform!"
#endif

#ifndef DISABLE_MCAL_INTERMODULE_ASR_CHECK
#ifdef CLOCK_IP_DEV_ERROR_DETECT
#if (STD_ON == CLOCK_IP_DEV_ERROR_DETECT)
/* Check if Clock_Ip_Private.h file and Devassert.h file are of the same Autosar version */
#if ((CLOCK_IP_PRIVATE_AR_RELEASE_MAJOR_VERSION    != DEVASSERT_AR_RELEASE_MAJOR_VERSION) || \
     (CLOCK_IP_PRIVATE_AR_RELEASE_MINOR_VERSION    != DEVASSERT_AR_RELEASE_MINOR_VERSION))
    #error "AutoSar Version Numbers of Clock_Ip_Private.h and Devassert.h are different"
#endif
#endif /* (STD_ON == CLOCK_IP_DEV_ERROR_DETECT) */
#endif /* #ifdef CLOCK_IP_DEV_ERROR_DETECT */
#endif


#if defined(__cplusplus)
extern "C" {
#endif /* __cplusplus*/



/* Total number of clocks */
#define CLOCK_NAMES_NO                    FEATURE_CLOCKS_NO
/* Total number of producer clocks */
#define CLOCK_PRODUCERS_NO                FEATURE_CLOCK_PRODUCERS_NO

/* Define clock features */
#define CLOCK_MODULE_INSTANCE       0U              /* Instance of the module where clock element is implemented. */
#define CLOCK_CALLBACK              1U              /* Actions to be done for different implementations of a clock element. */
#define INTERFACE_CLOCK             2U              /* Name of the interface clock. Without interface clock, peripheral instance is not working. */
#define SELECTOR_INDEX              2U              /* Selector index. */
#define PCFS_INSTANCE               2U              /* Index of device where pcfs is implemented */
#define DIVIDER_INDEX               3U              /* Divider index. */
#define PCTL_INDEX                  3U              /* Index in peripheral configurations. Implemented on some platforms. */
#define PCC_INDEX                   3U              /* Index in peripheral clock control array. Implemented on some platforms. */
#define PARTITION_INDEX             3U              /* Index of partition where clock enable request is implemented. Implemented on some platforms. */
#define COLLECTION_INDEX            4U              /* Index of collection where clock enable request is implemented. Implemented on some platforms. */
#define PCFS_HW_INDEX               4U              /* Hardware index for progressive clock switching (register index) */
#define ENABLE_REQUEST              5U              /* Index of clock enable request. Implemented on some platforms. */
#define PCFS_SW_INDEX               5U              /* Software index for progressive clock switching (driver's cache index) */
#define TRIGGER_FEATURE             5U              /* Divider trigger feature is supported by feature or not */
#define CMU_INSTANCE                6U              /* Cmu instance */
#define CMU_SW_INDEX                7U              /* Cmu software index */


/* Maximum number of clock features for each clock name */
#define CLOCK_FEATURES_NO           8U

#define INV_VAL                     255U            /* Invalid value */
#define NO_TRIGGER                  0U              /* No trigger is supported by divider. */
#define TRIGGER                     1U              /* Trigger is supported by divider. */
#define TRIGGER_VALUE               0xFFFFFFFFU     /* Trigger value. */

#if (defined(CLOCK_IP_DEV_ERROR_DETECT))
  #if (CLOCK_IP_DEV_ERROR_DETECT == STD_ON)
    #define CLOCK_DEV_ASSERT(x)      DevAssert(x)
  #else
    #define CLOCK_DEV_ASSERT(x)
  #endif
#else
    #define CLOCK_DEV_ASSERT(x)
#endif

/*! @brief Clock ip source type.
 */
typedef enum
{
    /* Generic error codes */
    UKNOWN_TYPE                                    = 0x00U,    /*!< Clock path from source to this clock name has at least one selector. */
    IRCOSC_TYPE                                    = 0x01U,    /*!< Source is an internal oscillator. */
    XOSC_TYPE                                      = 0x02U,    /*!< Source is an external oscillator. */
    PLL_TYPE                                       = 0x03U,    /*!< Source is a pll. */
    EXT_CLK_TYPE                                   = 0x04U,    /*!< Source is an external clock. */
    SERDES_TYPE                                    = 0x04U,    /*!< Source is a SERDES. */

} clock_name_source_type_t;

/*! @brief Clock pll status return codes.
 */
typedef enum
{
    STATUS_PLL_NOT_ENABLED                         = 0x00U,    /*!< Not enabled */
    STATUS_PLL_UNLOCKED                            = 0x01U,    /*!< Unlocked */
    STATUS_PLL_LOCKED                              = 0x02U,    /*!< Locked */

} clock_pll_status_t;

/*! @brief Clock dfs status return codes.
 */
typedef enum
{
    STATUS_DFS_NOT_ENABLED                         = 0x00U,    /*!< Not enabled */
    STATUS_DFS_UNLOCKED                            = 0x01U,    /*!< Unlocked */
    STATUS_DFS_LOCKED                              = 0x02U,    /*!< Locked */

} clock_dfs_status_t;


/*! @brief Clock state - selector entry index for selector elements, on/off state for the other clock elements
 */
typedef enum
{
    DISABLED_CLOCK                                 = 0x00U,     /*!< Clock is disabled. */
    SELECTOR_ENTRY_1                               = 0x01U,    /*!< 1st selector entry. */
    SELECTOR_ENTRY_2                               = 0x02U,    /*!< 2nd selector entry. */
    SELECTOR_ENTRY_3                               = 0x03U,    /*!< 3rd selector entry. */
    SELECTOR_ENTRY_4                               = 0x04U,    /*!< 4th selector entry. */
    SELECTOR_ENTRY_5                               = 0x05U,    /*!< 5th selector entry. */
    SELECTOR_ENTRY_6                               = 0x06U,    /*!< 6th selector entry. */
    SELECTOR_ENTRY_7                               = 0x07U,    /*!< 7th selector entry. */
    SELECTOR_ENTRY_8                               = 0x08U,    /*!< 8th selector entry. */
    SELECTOR_ENTRY_9                               = 0x09U,    /*!< 9th selector entry. */
    SELECTOR_ENTRY_10                              = 0xAU,     /*!< 10th selector entry. */
    SELECTOR_ENTRY_11                              = 0xBU,     /*!< 11th selector entry. */
    SELECTOR_ENTRY_12                              = 0xCU,     /*!< 12th selector entry. */
    SELECTOR_ENTRY_13                              = 0xDU,     /*!< 13th selector entry. */
    SELECTOR_ENTRY_14                              = 0xEU,     /*!< 14th selector entry. */
    SELECTOR_ENTRY_15                              = 0xFU,     /*!< 15th selector entry. */
    SELECTOR_ENTRY_16                              = 0x10U,    /*!< 16th selector entry. */
    SELECTOR_ENTRY_17                              = 0x11U,    /*!< 17th selector entry. */
    SELECTOR_ENTRY_18                              = 0x12U,    /*!< 18th selector entry. */
    SELECTOR_ENTRY_19                              = 0x13U,    /*!< 19th selector entry. */
    ENABLED_CLOCK                                  = 0xFFU,     /*!< Clock is disabled. */

} clock_element_state_t;



typedef void (*intOscSetCallback)(Clock_Ip_IrcoscConfigType const * config);
typedef struct
{
    intOscSetCallback Set;

}intOscCallback;

typedef void (*extOscSetCallback)(Clock_Ip_XoscConfigType const * config);
typedef void (*extOscResetCallback)(Clock_Ip_XoscConfigType const * config);
typedef struct
{
    extOscResetCallback Reset;
    extOscSetCallback Set;

}extOscCallback;


typedef void (*dividerSetCallback)(Clock_Ip_DividerConfigType const * config);
typedef struct
{
    dividerSetCallback Set;

}dividerCallback;

typedef void (*dividerConfigureCallback)(Clock_Ip_DividerTriggerConfigType const * config);
typedef void (*dividerTriggerUpdateCallback)(Clock_Ip_DividerTriggerConfigType const * config);
typedef struct
{
    dividerConfigureCallback Configure;
    dividerTriggerUpdateCallback TriggerUpdate;

}dividerTriggerCallback;


typedef void (*fracDivSetCallback)(Clock_Ip_FracDivConfigType const * config);
typedef void (*fracDivResetCallback)(Clock_Ip_FracDivConfigType const * config);
typedef clock_dfs_status_t (*fracDivCompleteCallback)(Clock_Ip_NameType DfsName);
typedef struct
{
    fracDivResetCallback Reset;
    fracDivSetCallback Set;
    fracDivCompleteCallback Complete;

}fracDivCallback;

typedef void (*pllSetCallback)(Clock_Ip_PllConfigType const * config);
typedef void (*pllResetCallback)(Clock_Ip_PllConfigType const * config);
typedef clock_pll_status_t (*pllCompleteCallback)(Clock_Ip_NameType PllName);
typedef struct
{
    pllResetCallback Reset;
    pllSetCallback Set;
    pllCompleteCallback Complete;

}pllCallback;

typedef void (*selectorSetCallback)(Clock_Ip_SelectorConfigType const * config);
typedef void (*selectorResetCallback)(Clock_Ip_SelectorConfigType const * config);
typedef struct
{
    selectorResetCallback Reset;
    selectorSetCallback Set;

}selectorCallback;

typedef void (*gateSetCallback)(Clock_Ip_GateConfigType const * config);
typedef void (*gateUpdateCallback)(Clock_Ip_NameType clockName, boolean gate);
typedef struct
{
    gateSetCallback Set;
    gateUpdateCallback Update;

}gateCallback;

typedef void (*clockMonitorSetCallback)(Clock_Ip_CmuConfigType const * config);
typedef void (*clockMonitorResetCallback)(Clock_Ip_CmuConfigType const * config);
typedef void (*clockMonitorClearStatusCallback)(Clock_Ip_NameType name);
typedef void (*clockMonitorDisableCallback)(Clock_Ip_NameType name);
typedef Clock_Ip_CmuStatusType (*clockMonitorGetMonitorStatusCallback)(Clock_Ip_NameType name);
typedef struct
{
    clockMonitorResetCallback Reset;
    clockMonitorSetCallback Set;
    clockMonitorDisableCallback Disable;
    clockMonitorClearStatusCallback Clear;
    clockMonitorGetMonitorStatusCallback GetStatus;

}clockMonitorCallback;


typedef void (*pcfsSetCallback)(Clock_Ip_PcfsConfigType const * config);
typedef struct
{
    pcfsSetCallback Set;

}pcfsCallback;

typedef uint32 (*consumerClockCallback)(void);
typedef void (*CalcFreqCallback)(void);


/* Clock start constant section data */
#define MCU_START_SEC_CONST_8

#include "Mcu_MemMap.h"

extern const uint8 xoscCallbackIndex[ALL_CALLBACKS_COUNT];
extern const uint8 dividerCallbackIndex[ALL_CALLBACKS_COUNT];
extern const uint8 dividertriggerCallbackIndex[ALL_CALLBACKS_COUNT];
extern const uint8 fractional_dividerCallbackIndex[ALL_CALLBACKS_COUNT];
extern const uint8 pllCallbackIndex[ALL_CALLBACKS_COUNT];
extern const uint8 selectorCallbackIndex[ALL_CALLBACKS_COUNT];
extern const uint8 ircoscCallbackIndex[ALL_CALLBACKS_COUNT];
extern const uint8 cmuCallbackIndex[ALL_CALLBACKS_COUNT];
extern const uint8 gateCallbackIndex[ALL_CALLBACKS_COUNT];
extern const uint8 pcfsCallbackIndex[ALL_CALLBACKS_COUNT];
extern const uint8 clockFeatures[CLOCK_NAMES_NO][CLOCK_FEATURES_NO];

/* Clock stop constant section data */
#define MCU_STOP_SEC_CONST_8

#include "Mcu_MemMap.h"

/* Clock start constant section data */
#define MCU_START_SEC_CONST_16

#include "Mcu_MemMap.h"

extern const uint16 selectorEntry_hardwareValue[CLOCK_PRODUCERS_NO];

/* Clock stop constant section data */
#define MCU_STOP_SEC_CONST_16

#include "Mcu_MemMap.h"

/* Clock start constant section data */
#define MCU_START_SEC_CONST_UNSPECIFIED

#include "Mcu_MemMap.h"

extern const extOscCallback extOscCallbacks[XOSC_CALLBACKS_COUNT];

extern const dividerCallback dividerCallbacks[DIVIDER_CALLBACKS_COUNT];

extern const dividerTriggerCallback dividerTriggerCallbacks[DIVIDERTRIGGER_CALLBACKS_COUNT];

extern const fracDivCallback fracDivCallbacks[FRACTIONAL_DIVIDER_CALLBACKS_COUNT];

extern const pllCallback pllCallbacks[PLL_CALLBACKS_COUNT];
extern const Clock_Ip_NameType HwPllName[NUMBER_OF_HARDWARE_PLL];

extern const selectorCallback selectorCallbacks[SELECTOR_CALLBACKS_COUNT];

extern const intOscCallback intOscCallbacks[IRCOSC_CALLBACKS_COUNT];

extern const clockMonitorCallback cmuCallbacks[CMU_CALLBACKS_COUNT];

extern const gateCallback gateCallbacks[GATE_CALLBACKS_COUNT];

extern const pcfsCallback pcfsCallbacks[PCFS_CALLBACKS_COUNT];

extern const consumerClockCallback consumerClockCallbacks[CONSUMER_CALLBACKS_COUNT];

extern const clock_name_source_type_t clockName_sourceType[CLOCK_PRODUCERS_NO];

extern const CalcFreqCallback calcFreqCallbacks[CALC_FREQ_CALLBACKS_NO];

extern const clock_element_state_t selectorEntryIndex[SELECTOR_HARDWARE_VALUES_NO];

/* Clock stop constant section data */
#define MCU_STOP_SEC_CONST_UNSPECIFIED

#include "Mcu_MemMap.h"

#define MCU_START_SEC_VAR_INIT_UNSPECIFIED

#include "Mcu_MemMap.h"

extern const Clock_Ip_ClockConfigType *clockConfig;

#define MCU_STOP_SEC_VAR_INIT_UNSPECIFIED

#include "Mcu_MemMap.h"

/* Clock start section code */
#define MCU_START_SEC_CODE

#include "Mcu_MemMap.h"

void ReportClockErrors(Clock_Ip_ClockNotificationType error, Clock_Ip_NameType clockName);
void UpdateClockState(Clock_Ip_NameType name, clock_element_state_t state);
clock_element_state_t GetClockState(Clock_Ip_NameType name);

void SpecificPeripheralClockInitialization(Clock_IP_SpecificPeriphConfigType const * config);
void SpecificPlatformInitClock(Clock_Ip_ClockConfigType const * config);
uint32 GetProducerClockFreq(Clock_Ip_NameType clockName);
void Clock_Ip_TimeDelay(void);
void UpdateFrequencies(power_modes_t powerMode);
void Mcu_CMU_ClockFailInt(void);
#ifdef FEATURE_CLOCK_IP_HAS_RAM_WAIT_STATES
    void SetRamWaitStates(void);
#endif
#ifdef FEATURE_CLOCK_IP_HAS_FLASH_WAIT_STATES
    void SetFlashWaitStates(void);
#endif
/*!
 * @brief Initializes a starting reference point for timeout
 *
 * @param[out] startTimeOut    The starting time from which elapsed time is measured
 * @param[out] elapsedTimeOut  The elapsed time to be passed to ClockTimeoutExpired
 * @param[out] timeoutTicksOut The timeout value (in ticks) to be passed to ClockTimeoutExpired
 * @param[in]  timeoutUs       The timeout value (in microseconds)
 */
void ClockStartTimeout(uint32 *startTimeOut,
                       uint32 *elapsedTimeOut,
                       uint32 *timeoutTicksOut,
                       uint32 timeoutUs);
/*!
 * @brief Checks for timeout condition.
 *
 * @param[in,out] startTimeInOut    The starting time from which elapsed time is measured
 * @param[in,out] elapsedTimeInOut  The accumulated elapsed time from the starting time reference
 * @param[in]     TimeoutTicks      The timeout limit (in ticks)
 */
boolean ClockTimeoutExpired(uint32 *startTimeInOut,
                            uint32 *elapsedTimeInOut,
                            uint32 TimeoutTicks);

/* Clock stop section code */
#define MCU_STOP_SEC_CODE

#include "Mcu_MemMap.h"

#if defined(__cplusplus)
}
#endif /* __cplusplus*/

/*! @}*/

#endif /* CLOCK_IP_PRIVATE_H */
/*******************************************************************************
 * EOF
 ******************************************************************************/
