/* * Copyright (c) 2023 Antmicro * * SPDX-License-Identifier: Apache-2.0 */ #include #include #include #include "soc.h" #include static const struct device *const prcrn_dev = DEVICE_DT_GET(DT_NODELABEL(prcrn)); static const struct device *const prcrs_dev = DEVICE_DT_GET(DT_NODELABEL(prcrs)); static const struct device *const sckcr_dev = DEVICE_DT_GET(DT_NODELABEL(sckcr)); static const struct device *const sckcr2_dev = DEVICE_DT_GET(DT_NODELABEL(sckcr2)); void rzt2m_unlock_prcrn(uint32_t mask) { uint32_t prcrn; syscon_read_reg(prcrn_dev, 0, &prcrn); prcrn |= PRC_KEY_CODE | mask; syscon_write_reg(prcrn_dev, 0, prcrn); } void rzt2m_lock_prcrn(uint32_t mask) { uint32_t prcrn; syscon_read_reg(prcrn_dev, 0, &prcrn); prcrn &= ~mask; prcrn |= PRC_KEY_CODE; syscon_write_reg(prcrn_dev, 0, prcrn); } void rzt2m_unlock_prcrs(uint32_t mask) { uint32_t prcrs; syscon_read_reg(prcrs_dev, 0, &prcrs); prcrs |= PRC_KEY_CODE | mask; syscon_write_reg(prcrs_dev, 0, prcrs); } void rzt2m_lock_prcrs(uint32_t mask) { uint32_t prcrs; syscon_read_reg(prcrs_dev, 0, &prcrs); prcrs &= ~mask; prcrs |= PRC_KEY_CODE; syscon_write_reg(prcrs_dev, 0, prcrs); } void rzt2m_set_sckcr2(uint32_t mask) { syscon_write_reg(sckcr2_dev, 0, mask); } uint32_t rzt2m_get_sckcr2(void) { uint32_t reg; syscon_read_reg(sckcr2_dev, 0, ®); return reg; } void rzt2m_set_sckcr(uint32_t mask) { syscon_write_reg(sckcr_dev, 0, mask); } uint32_t rzt2m_get_sckcr(void) { uint32_t reg; syscon_read_reg(sckcr_dev, 0, ®); return reg; } void rzt2m_enable_counters(void) { const struct device *const dev = DEVICE_DT_GET(DT_NODELABEL(gsc)); syscon_write_reg(dev, 0, CNTCR_EN); } void soc_early_init_hook(void) { /* Unlock the Protect Registers * so that device drivers can access configuration registers of peripherals. */ /* After the device drivers are done, lock the Protect Registers. */ rzt2m_unlock_prcrs(PRCRS_GPIO | PRCRS_CLK); rzt2m_unlock_prcrn(PRCRN_PRC1 | PRCRN_PRC2 | PRCRN_PRC0); /* Reset the System Clock Control Registers to default values */ rzt2m_set_sckcr( CLMASEL | PHYSEL | FSELCANFD | FSELXSPI0_DEFAULT | FSELXSPI1_DEFAULT | CKIO_DEFAULT ); rzt2m_set_sckcr2(FSELCPU0_DEFAULT | FSELCPU1_DEFAULT); rzt2m_lock_prcrs(PRCRS_GPIO | PRCRS_CLK); rzt2m_lock_prcrn(PRCRN_PRC1 | PRCRN_PRC2 | PRCRN_PRC0); rzt2m_enable_counters(); }