1 /* 2 * Copyright (c) 2016, Freescale Semiconductor, Inc. 3 * Copyright 2016, NXP 4 * All rights reserved. 5 * 6 * 7 * SPDX-License-Identifier: BSD-3-Clause 8 */ 9 10 #include "fsl_common.h" 11 #include "fsl_reset.h" 12 13 /******************************************************************************* 14 * Definitions 15 ******************************************************************************/ 16 /* Component ID definition, used by tools. */ 17 #ifndef FSL_COMPONENT_ID 18 #define FSL_COMPONENT_ID "platform.drivers.reset" 19 #endif 20 21 /******************************************************************************* 22 * Variables 23 ******************************************************************************/ 24 25 /******************************************************************************* 26 * Prototypes 27 ******************************************************************************/ 28 29 /******************************************************************************* 30 * Code 31 ******************************************************************************/ 32 33 #if ((defined(FSL_FEATURE_SOC_SYSCON_COUNT) && (FSL_FEATURE_SOC_SYSCON_COUNT > 0)) || \ 34 (defined(FSL_FEATURE_SOC_ASYNC_SYSCON_COUNT) && (FSL_FEATURE_SOC_ASYNC_SYSCON_COUNT > 0))) 35 36 /*! 37 * brief Assert reset to peripheral. 38 * 39 * Asserts reset signal to specified peripheral module. 40 * 41 * param peripheral Assert reset to this peripheral. The enum argument contains encoding of reset register 42 * and reset bit position in the reset register. 43 */ RESET_SetPeripheralReset(reset_ip_name_t peripheral)44void RESET_SetPeripheralReset(reset_ip_name_t peripheral) 45 { 46 const uint32_t regIndex = ((uint32_t)peripheral & 0xFFFF0000u) >> 16; 47 const uint32_t bitPos = ((uint32_t)peripheral & 0x0000FFFFu); 48 const uint32_t bitMask = 1UL << bitPos; 49 50 assert(bitPos < 32UL); 51 52 /* ASYNC_SYSCON registers have offset 1024 */ 53 if (regIndex >= SYSCON_PRESETCTRL_COUNT) 54 { 55 /* reset register is in ASYNC_SYSCON */ 56 57 /* set bit */ 58 ASYNC_SYSCON->ASYNCPRESETCTRLSET = bitMask; 59 /* wait until it reads 0b1 */ 60 while (0u == (ASYNC_SYSCON->ASYNCPRESETCTRL & bitMask)) 61 { 62 } 63 } 64 else 65 { 66 /* reset register is in SYSCON */ 67 68 /* set bit */ 69 SYSCON->PRESETCTRLSET[regIndex] = bitMask; 70 /* wait until it reads 0b1 */ 71 while (0u == (SYSCON->PRESETCTRL[regIndex] & bitMask)) 72 { 73 } 74 } 75 } 76 77 /*! 78 * brief Clear reset to peripheral. 79 * 80 * Clears reset signal to specified peripheral module, allows it to operate. 81 * 82 * param peripheral Clear reset to this peripheral. The enum argument contains encoding of reset register 83 * and reset bit position in the reset register. 84 */ RESET_ClearPeripheralReset(reset_ip_name_t peripheral)85void RESET_ClearPeripheralReset(reset_ip_name_t peripheral) 86 { 87 const uint32_t regIndex = ((uint32_t)peripheral & 0xFFFF0000u) >> 16; 88 const uint32_t bitPos = ((uint32_t)peripheral & 0x0000FFFFu); 89 const uint32_t bitMask = 1UL << bitPos; 90 91 assert(bitPos < 32UL); 92 93 /* ASYNC_SYSCON registers have offset 1024 */ 94 if (regIndex >= SYSCON_PRESETCTRL_COUNT) 95 { 96 /* reset register is in ASYNC_SYSCON */ 97 98 /* clear bit */ 99 ASYNC_SYSCON->ASYNCPRESETCTRLCLR = bitMask; 100 /* wait until it reads 0b0 */ 101 while (bitMask == (ASYNC_SYSCON->ASYNCPRESETCTRL & bitMask)) 102 { 103 } 104 } 105 else 106 { 107 /* reset register is in SYSCON */ 108 109 /* clear bit */ 110 SYSCON->PRESETCTRLCLR[regIndex] = bitMask; 111 /* wait until it reads 0b0 */ 112 while (bitMask == (SYSCON->PRESETCTRL[regIndex] & bitMask)) 113 { 114 } 115 } 116 } 117 118 /*! 119 * brief Reset peripheral module. 120 * 121 * Reset peripheral module. 122 * 123 * param peripheral Peripheral to reset. The enum argument contains encoding of reset register 124 * and reset bit position in the reset register. 125 */ RESET_PeripheralReset(reset_ip_name_t peripheral)126void RESET_PeripheralReset(reset_ip_name_t peripheral) 127 { 128 RESET_SetPeripheralReset(peripheral); 129 RESET_ClearPeripheralReset(peripheral); 130 } 131 132 #endif /* FSL_FEATURE_SOC_SYSCON_COUNT || FSL_FEATURE_SOC_ASYNC_SYSCON_COUNT */ 133