blob: 9ae3800ef36ce488c39b676f3b792092c6265fe4 [file] [log] [blame]
/*
* Copyright (c) 2015, Freescale Semiconductor, Inc.
* Copyright 2016-2017 NXP
* All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#ifndef _FSL_SEMA42_H_
#define _FSL_SEMA42_H_
#include "fsl_common.h"
/*!
* @addtogroup sema42
* @{
*/
/******************************************************************************
* Definitions
*****************************************************************************/
/*! @name Driver version */
/*@{*/
/*! @brief SEMA42 driver version */
#define FSL_SEMA42_DRIVER_VERSION (MAKE_VERSION(2, 0, 0))
/*@}*/
/*!
* @brief SEMA42 status return codes.
*/
enum _sema42_status
{
kStatus_SEMA42_Busy = MAKE_STATUS(kStatusGroup_SEMA42, 0), /*!< SEMA42 gate has been locked by other processor. */
kStatus_SEMA42_Reseting = MAKE_STATUS(kStatusGroup_SEMA42, 1) /*!< SEMA42 gate reseting is ongoing. */
};
/*!
* @brief SEMA42 gate lock status.
*/
typedef enum _sema42_gate_status
{
kSEMA42_Unlocked = 0U, /*!< The gate is unlocked. */
kSEMA42_LockedByProc0 = 1U, /*!< The gate is locked by processor 0. */
kSEMA42_LockedByProc1 = 2U, /*!< The gate is locked by processor 1. */
kSEMA42_LockedByProc2 = 3U, /*!< The gate is locked by processor 2. */
kSEMA42_LockedByProc3 = 4U, /*!< The gate is locked by processor 3. */
kSEMA42_LockedByProc4 = 5U, /*!< The gate is locked by processor 4. */
kSEMA42_LockedByProc5 = 6U, /*!< The gate is locked by processor 5. */
kSEMA42_LockedByProc6 = 7U, /*!< The gate is locked by processor 6. */
kSEMA42_LockedByProc7 = 8U, /*!< The gate is locked by processor 7. */
kSEMA42_LockedByProc8 = 9U, /*!< The gate is locked by processor 8. */
kSEMA42_LockedByProc9 = 10U, /*!< The gate is locked by processor 9. */
kSEMA42_LockedByProc10 = 11U, /*!< The gate is locked by processor 10. */
kSEMA42_LockedByProc11 = 12U, /*!< The gate is locked by processor 11. */
kSEMA42_LockedByProc12 = 13U, /*!< The gate is locked by processor 12. */
kSEMA42_LockedByProc13 = 14U, /*!< The gate is locked by processor 13. */
kSEMA42_LockedByProc14 = 15U /*!< The gate is locked by processor 14. */
} sema42_gate_status_t;
/*! @brief The number to reset all SEMA42 gates. */
#define SEMA42_GATE_NUM_RESET_ALL (64U)
/*! @brief SEMA42 gate n register address.
*
* The SEMA42 gates are sorted in the order 3, 2, 1, 0, 7, 6, 5, 4, ... not in the order
* 0, 1, 2, 3, 4, 5, 6, 7, ... The macro SEMA42_GATEn gets the SEMA42 gate based on the gate
* index.
*
* The input gate index is XOR'ed with 3U:
* 0 ^ 3 = 3
* 1 ^ 3 = 2
* 2 ^ 3 = 1
* 3 ^ 3 = 0
* 4 ^ 3 = 7
* 5 ^ 3 = 6
* 6 ^ 3 = 5
* 7 ^ 3 = 4
* ...
*/
#define SEMA42_GATEn(base, n) (*(&((base)->GATE3) + ((n) ^ 3U)))
/*******************************************************************************
* API
******************************************************************************/
#if defined(__cplusplus)
extern "C" {
#endif
/*!
* @brief Initializes the SEMA42 module.
*
* This function initializes the SEMA42 module. It only enables the clock but does
* not reset the gates because the module might be used by other processors
* at the same time. To reset the gates, call either SEMA42_ResetGate or
* SEMA42_ResetAllGates function.
*
* @param base SEMA42 peripheral base address.
*/
void SEMA42_Init(SEMA42_Type *base);
/*!
* @brief De-initializes the SEMA42 module.
*
* This function de-initializes the SEMA42 module. It only disables the clock.
*
* @param base SEMA42 peripheral base address.
*/
void SEMA42_Deinit(SEMA42_Type *base);
/*!
* @brief Tries to lock the SEMA42 gate.
*
* This function tries to lock the specific SEMA42 gate. If the gate has been
* locked by another processor, this function returns an error code.
*
* @param base SEMA42 peripheral base address.
* @param gateNum Gate number to lock.
* @param procNum Current processor number.
*
* @retval kStatus_Success Lock the sema42 gate successfully.
* @retval kStatus_SEMA42_Busy Sema42 gate has been locked by another processor.
*/
status_t SEMA42_TryLock(SEMA42_Type *base, uint8_t gateNum, uint8_t procNum);
/*!
* @brief Locks the SEMA42 gate.
*
* This function locks the specific SEMA42 gate. If the gate has been
* locked by other processors, this function waits until it is unlocked and then
* lock it.
*
* @param base SEMA42 peripheral base address.
* @param gateNum Gate number to lock.
* @param procNum Current processor number.
*/
void SEMA42_Lock(SEMA42_Type *base, uint8_t gateNum, uint8_t procNum);
/*!
* @brief Unlocks the SEMA42 gate.
*
* This function unlocks the specific SEMA42 gate. It only writes unlock value
* to the SEMA42 gate register. However, it does not check whether the SEMA42 gate is locked
* by the current processor or not. As a result, if the SEMA42 gate is not locked by the current
* processor, this function has no effect.
*
* @param base SEMA42 peripheral base address.
* @param gateNum Gate number to unlock.
*/
static inline void SEMA42_Unlock(SEMA42_Type *base, uint8_t gateNum)
{
assert(gateNum < FSL_FEATURE_SEMA42_GATE_COUNT);
/* ^= 0x03U because SEMA42 gates are in the order 3, 2, 1, 0, 7, 6, 5, 4, 11, 10, 9, 8, 7, ...*/
SEMA42_GATEn(base, gateNum) = kSEMA42_Unlocked;
}
/*!
* @brief Gets the status of the SEMA42 gate.
*
* This function checks the lock status of a specific SEMA42 gate.
*
* @param base SEMA42 peripheral base address.
* @param gateNum Gate number.
*
* @return status Current status.
*/
static inline sema42_gate_status_t SEMA42_GetGateStatus(SEMA42_Type *base, uint8_t gateNum)
{
assert(gateNum < FSL_FEATURE_SEMA42_GATE_COUNT);
return (sema42_gate_status_t)(SEMA42_GATEn(base, gateNum));
}
/*!
* @brief Resets the SEMA42 gate to an unlocked status.
*
* This function resets a SEMA42 gate to an unlocked status.
*
* @param base SEMA42 peripheral base address.
* @param gateNum Gate number.
*
* @retval kStatus_Success SEMA42 gate is reset successfully.
* @retval kStatus_SEMA42_Reseting Some other reset process is ongoing.
*/
status_t SEMA42_ResetGate(SEMA42_Type *base, uint8_t gateNum);
/*!
* @brief Resets all SEMA42 gates to an unlocked status.
*
* This function resets all SEMA42 gate to an unlocked status.
*
* @param base SEMA42 peripheral base address.
*
* @retval kStatus_Success SEMA42 is reset successfully.
* @retval kStatus_SEMA42_Reseting Some other reset process is ongoing.
*/
static inline status_t SEMA42_ResetAllGates(SEMA42_Type *base)
{
return SEMA42_ResetGate(base, SEMA42_GATE_NUM_RESET_ALL);
}
#if defined(__cplusplus)
}
#endif
/*!
* @}
*/
#endif /* _FSL_SEMA42_H_ */