blob: bed85dbc91ddae08bf3c24cd50442fde7cc6a108 [file] [log] [blame]
/*
* Copyright 2023 NXP
*
* Based on zephyr/soc/arm/nxp_kinetis/ke1xf/soc.c, which is:
* Copyright (c) 2019-2021 Vestas Wind Systems A/S
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr/kernel.h>
#include <zephyr/device.h>
#include <zephyr/init.h>
#include <zephyr/sys/barrier.h>
#include <cmsis_core.h>
#include <OsIf.h>
#if defined(CONFIG_HAS_MCUX_CACHE)
#include <fsl_cache.h>
#endif
#if defined(CONFIG_WDOG_INIT)
void z_arm_watchdog_init(void)
{
/*
* NOTE: DO NOT SINGLE STEP THROUGH THIS SECTION!!! Watchdog
* reconfiguration must take place within 128 bus clocks from
* unlocking. Single stepping through the code will cause the
* watchdog to close the unlock window again.
*/
if ((IP_WDOG->CS & WDOG_CS_CMD32EN_MASK) != 0U) {
IP_WDOG->CNT = WDOG_UPDATE_KEY;
} else {
IP_WDOG->CNT = WDOG_UPDATE_KEY & 0xFFFFU;
IP_WDOG->CNT = (WDOG_UPDATE_KEY >> 16U) & 0xFFFFU;
}
while (!(IP_WDOG->CS & WDOG_CS_ULK_MASK)) {
;
}
IP_WDOG->TOVAL = 0xFFFFU;
IP_WDOG->CS = (uint32_t) ((IP_WDOG->CS) & ~WDOG_CS_EN_MASK) | WDOG_CS_UPDATE_MASK;
/* Wait for new configuration to take effect */
while (!(IP_WDOG->CS & WDOG_CS_RCS_MASK)) {
;
}
}
#endif /* CONFIG_WDOG_INIT */
static int soc_init(void)
{
#if !defined(CONFIG_ARM_MPU)
uint32_t tmp;
/*
* Disable memory protection and clear slave port errors.
* Note that the S32K1xx does not implement the optional Arm MPU but
* instead the Soc includes its own NXP MPU module.
*/
tmp = IP_MPU->CESR;
tmp &= ~MPU_CESR_VLD_MASK;
tmp |= MPU_CESR_SPERR0_MASK | MPU_CESR_SPERR1_MASK
| MPU_CESR_SPERR2_MASK | MPU_CESR_SPERR3_MASK;
IP_MPU->CESR = tmp;
#endif /* !CONFIG_ARM_MPU */
#if defined(CONFIG_HAS_MCUX_CACHE) && defined(CONFIG_NXP_S32_ENABLE_CODE_CACHE)
L1CACHE_EnableCodeCache();
barrier_isync_fence_full();
#endif
OsIf_Init(NULL);
return 0;
}
SYS_INIT(soc_init, PRE_KERNEL_1, 0);