/*==================================================================================================
*   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           : 1.0.0
*   Build Version        : S32K1_RTD_1_0_0_HF01_D2109_ASR_REL_4_4_REV_0000_20210907
*
*   (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.h
*   @version    1.0.0
*
*   @brief   CLOCK IP driver header file.
*   @details CLOCK IP driver header file.
*
*   @addtogroup CLOCK_DRIVER Clock Ip Driver
*   @{
*/


#ifndef CLOCK_IP_H
#define CLOCK_IP_H


#include "Clock_Ip_Types.h"
#include "Clock_Ip_Cfg.h"


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

/*==================================================================================================
                               SOURCE FILE VERSION INFORMATION
==================================================================================================*/
#define CLOCK_IP_VENDOR_ID                       43
#define CLOCK_IP_AR_RELEASE_MAJOR_VERSION        4
#define CLOCK_IP_AR_RELEASE_MINOR_VERSION        4
#define CLOCK_IP_AR_RELEASE_REVISION_VERSION     0
#define CLOCK_IP_SW_MAJOR_VERSION                1
#define CLOCK_IP_SW_MINOR_VERSION                0
#define CLOCK_IP_SW_PATCH_VERSION                0

/*==================================================================================================
                                      FILE VERSION CHECKS
==================================================================================================*/
/* Check if Clock_Ip.h file and Clock_Ip_Types.h file have same versions */
#if (CLOCK_IP_VENDOR_ID  != CLOCK_IP_TYPES_VENDOR_ID)
    #error "Clock_Ip.h and Clock_Ip_Types.h have different vendor IDs"
#endif

/* Check if Clock_Ip.h file and Clock_Ip_Types.h file are of the same Autosar version */
#if ((CLOCK_IP_AR_RELEASE_MAJOR_VERSION    != CLOCK_IP_TYPES_AR_RELEASE_MAJOR_VERSION) || \
     (CLOCK_IP_AR_RELEASE_MINOR_VERSION    != CLOCK_IP_TYPES_AR_RELEASE_MINOR_VERSION) || \
     (CLOCK_IP_AR_RELEASE_REVISION_VERSION != CLOCK_IP_TYPES_AR_RELEASE_REVISION_VERSION))
    #error "AutoSar Version Numbers of Clock_Ip.h and Clock_Ip_Types.h are different"
#endif

/* Check if Clock_Ip.h file and Clock_Ip_Types.h file are of the same Software version */
#if ((CLOCK_IP_SW_MAJOR_VERSION != CLOCK_IP_TYPES_SW_MAJOR_VERSION) || \
     (CLOCK_IP_SW_MINOR_VERSION != CLOCK_IP_TYPES_SW_MINOR_VERSION) || \
     (CLOCK_IP_SW_PATCH_VERSION != CLOCK_IP_TYPES_SW_PATCH_VERSION))
    #error "Software Version Numbers of Clock_Ip.h and Clock_Ip_Types.h are different"
#endif

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

/* Check if Clock_Ip.h file and Clock_Ip_Cfg.h file are of the same Autosar version */
#if ((CLOCK_IP_AR_RELEASE_MAJOR_VERSION    != CLOCK_IP_CFG_AR_RELEASE_MAJOR_VERSION) || \
     (CLOCK_IP_AR_RELEASE_MINOR_VERSION    != CLOCK_IP_CFG_AR_RELEASE_MINOR_VERSION) || \
     (CLOCK_IP_AR_RELEASE_REVISION_VERSION != CLOCK_IP_CFG_AR_RELEASE_REVISION_VERSION))
    #error "AutoSar Version Numbers of Clock_Ip.h and Clock_Ip_Cfg.h are different"
#endif

/* Check if Clock_Ip.h file and Clock_Ip_Cfg.h file are of the same Software version */
#if ((CLOCK_IP_SW_MAJOR_VERSION != CLOCK_IP_CFG_SW_MAJOR_VERSION) || \
     (CLOCK_IP_SW_MINOR_VERSION != CLOCK_IP_CFG_SW_MINOR_VERSION) || \
     (CLOCK_IP_SW_PATCH_VERSION != CLOCK_IP_CFG_SW_PATCH_VERSION))
    #error "Software Version Numbers of Clock_Ip.h and Clock_Ip_Cfg.h are different"
#endif

/*******************************************************************************
 *                    GLOBAL FUNCTION PROTOTYPES
 ******************************************************************************/

/*******************************************************************************
 * API
 ******************************************************************************/
/* Clock start section code */
#define MCU_START_SEC_CODE

#include "Mcu_MemMap.h"

#if (defined(CLOCK_IP_GET_FREQUENCY_API) && (CLOCK_IP_GET_FREQUENCY_API == STD_ON))
 /*!
 * @brief Gets the clock frequency for a specific clock name.
 *
 * This function checks the current clock configurations and then calculates
 * the clock frequency for a specific clock name defined in Clock_Ip_NameType.
 * Clock modules must be properly configured before using this function.
 * See features.h for supported clock names for different chip families.
 * The returned value is in Hertz. If frequency is required for a peripheral and the
 * module is not clocked, then 0 Hz frequency is returned.
 *
 * @param[in] clockName Clock names defined in Clock_Ip_NameType
 * @return frequency    Returned clock frequency value in Hertz
 */
uint32 Clock_Ip_GetClockFrequency(Clock_Ip_NameType clockName);
#endif

/*!
 * @brief Set clock configuration according to pre-defined structure.
 *
 * This function sets system to target clock configuration; It sets the
 * clock modules registers for clock mode change.
 *
 * @param[in] config  Pointer to configuration structure.
 *
 * @return void
 *
 * @note If external clock is used in the target mode, please make sure it is
 * enabled, for example, if the external oscillator is used, please setup correctly.
 */
Clock_Ip_StatusType Clock_Ip_Init(Clock_Ip_ClockConfigType const * config);

/*!
 * @brief Set the PLL and other MCU specific clock options.
 *
 * This function initializes the PLL and other MCU specific clock options.
 * The clock configuration parameters are provided via the configuration structure.
 *
 * This function shall start the PLL lock procedure (if PLL
 * shall be initialized) and shall return without waiting until the PLL is locked.
 *
 * @param[in] config  Pointer to configuration structure.
 *
 * @return void
 */
void Clock_Ip_InitClock(Clock_Ip_ClockConfigType const * config);

/*!
 * @brief Returns the lock status of the PLL.
 *
 * This function returns status of the PLL: undefined, unlocked or locked.
 * This function returns undefined status if this function is called prior
 * to calling of the function Clock_Ip_InitClock
 *
 * @return Status.  Pll lock status
 */
Clock_Ip_PllStatusType Clock_Ip_GetPllStatus(void);

#if (STD_OFF == CLOCK_IP_NO_PLL)
/*!
 * @brief Activates the PLL in MCU clock distribution.
 *
 * This function activates the PLL clock to
 * the MCU clock distribution.
 *
 * This function removes the current clock source
 * (for example internal oscillator clock) from MCU clock distribution.
 *
 * Application layer calls this function after the status of the PLL has been detected as
 * locked by the function Clock_Ip_GetPllStatus.
 *
 * The function Clock_Ip_DistributePll shall return without affecting
 * the MCU hardware if the PLL clock has been automatically activated by the MCU
 * hardware.
 *
 * @return void
 */
void Clock_Ip_DistributePll(void);
#endif

/*!
 * @brief Sends notifications regarding power mode transition
 *
 * This function sends notifications regarding power mode transition.
 * It is called by power driver each time power mode is changed.
 *
 *
 * @param[in] powerMode  Power mode.
 * @param[in] powerMode  Power mode notification.
 *
 * @return void
 */
void Clock_Ip_PowerModeChangeNotification(power_modes_t powerMode,power_notification_t notification);

/*!
 * @brief Install a clock notifications callback
 *
 * This function installs a callback for
 * reporting notifications from clock driver
 *
 *
 * @param[in] Clock_Ip_NotificationsCallbackType  notifications callback
 *
 * @return void
 */
void Clock_Ip_InstallNotificationsCallback(Clock_Ip_NotificationsCallbackType callback);

/*!
 * @brief Clears status flags for a monitor clock.
 *
 * This function clears status flags for a monitor clock.
 *
 * @param[in] clockName  Clock Name.
 *
 * @return void
 */
void Clock_Ip_ClearClockMonitorStatus(Clock_Ip_NameType clockName);

/*!
 * @brief Returns the clock monitor status.
 *
 * This function returns status of the clock monitor: undefined, lower, higher, in range.
 * This function returns undefined status if this function is called when corresponding
 * cmu is not enabled.
 *
 * @return Status.  Cmu status
 */
Clock_Ip_CmuStatusType Clock_Ip_GetClockMonitorStatus(Clock_Ip_NameType clockName);

/*!
 * @brief Disables a clock monitor.
 *
 * This function disables a clock monitor.
 *
 * @param[in] clockName  Clock Name.
 *
 * @return void
 */
void Clock_Ip_DisableClockMonitor(Clock_Ip_NameType clockName);

/*!
 * @brief Disables clock for a peripheral.
 *
 * This function disables clock for a peripheral.
 *
 * @param[in] clockName  Clock Name.
 *
 * @return void
 */
void Clock_Ip_DisableModuleClock(Clock_Ip_NameType clockName);

/*!
 * @brief Enables clock for a peripheral.
 *
 * This function enables clock for a peripheral.
 *
 * @param[in] clockName  Clock Name.
 *
 * @return void
 */
void Clock_Ip_EnableModuleClock(Clock_Ip_NameType clockName);

#if (defined(CLOCK_IP_ENABLE_USER_MODE_SUPPORT))
  #if (STD_ON == CLOCK_IP_ENABLE_USER_MODE_SUPPORT)
    #if !(defined (CLOCK_IP_S32K1))
void Clock_Ip_SetUserAccessAllowed(void);
    #endif
  #endif
#endif

/* Clock stop section code */
#define MCU_STOP_SEC_CODE

#include "Mcu_MemMap.h"

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

/*! @}*/

#endif /* CLOCK_IP_H */
/*******************************************************************************
 * EOF
 ******************************************************************************/

