/* * Copyright (c) 2024 Nuvoton Technology Corporation. * * SPDX-License-Identifier: Apache-2.0 */ #define DT_DRV_COMPAT nuvoton_npcx_rst #include #include #if defined(CONFIG_SOC_SERIES_NPCX7) #include #elif defined(CONFIG_SOC_SERIES_NPCX9) #include #elif defined(CONFIG_SOC_SERIES_NPCX4) #include #endif #include LOG_MODULE_REGISTER(rst_npcx); #define NPCX_RESET_CTL_REG_BYTE_SIZE 4 #define NPCX_RESET_CTL_REG_OFFSET(id) ((id) >> (NPCX_RESET_CTL_REG_BYTE_SIZE + 1)) #define NPCX_RESET_CTL_REG_BIT(id) (((id) & ((1 << (NPCX_RESET_CTL_REG_BYTE_SIZE + 1)) - 1))) #define NPCX_SWRST_TRG_WORD_START 0xC183 #define NPCX_SWRST_TRG_WORD_CLEAR 0x0 #define NPCX_SWRST_TRG_WORD_DONE 0xFFFF #define NPCX_SWRST_DONE_TIMEOUT_US 100 struct reset_npcx_dev_config { struct swrst_reg *reg_base; }; static int reset_npcx_line_toggle(const struct device *dev, uint32_t id) { const struct reset_npcx_dev_config *const config = dev->config; struct swrst_reg *const reg = config->reg_base; unsigned int key; uint8_t reg_offset; uint8_t reg_bit; int ret = 0; if (!IN_RANGE(id, NPCX_RESET_ID_START, NPCX_RESET_ID_END)) { LOG_ERR("Invalid Reset ID"); return -EINVAL; } reg_offset = NPCX_RESET_CTL_REG_OFFSET(id); reg_bit = NPCX_RESET_CTL_REG_BIT(id); key = irq_lock(); reg->SWRST_CTL[reg_offset] |= BIT(reg_bit); reg->SWRST_TRG = NPCX_SWRST_TRG_WORD_CLEAR; reg->SWRST_TRG = NPCX_SWRST_TRG_WORD_START; if (!WAIT_FOR((reg->SWRST_TRG == NPCX_SWRST_TRG_WORD_DONE), NPCX_SWRST_DONE_TIMEOUT_US, NULL)) { LOG_ERR("Reset trig timeout"); ret = -EBUSY; } irq_unlock(key); return ret; } static const struct reset_driver_api reset_npcx_driver_api = { .line_toggle = reset_npcx_line_toggle, }; static const struct reset_npcx_dev_config reset_npcx_config = { .reg_base = (struct swrst_reg *)DT_INST_REG_ADDR(0), }; DEVICE_DT_INST_DEFINE(0, NULL, NULL, NULL, &reset_npcx_config, PRE_KERNEL_1, CONFIG_RESET_INIT_PRIORITY, &reset_npcx_driver_api);