driver: wdt: npcx: add WDT_OPT_PAUSE_HALTED_BY_DBG support.

This CL adds WDT_OPT_PAUSE_HALTED_BY_DBG support by enabling freeze mode.

Signed-off-by: Mulin Chao <mlchao@nuvoton.com>
This commit is contained in:
Mulin Chao 2023-06-30 00:49:40 -07:00 committed by Carles Cufí
commit 2cf3caa11c
5 changed files with 90 additions and 4 deletions

View file

@ -39,6 +39,7 @@
#include <zephyr/logging/log.h>
#include <soc.h>
#include "soc_dbg.h"
LOG_MODULE_REGISTER(wdt_npcx, CONFIG_WDT_LOG_LEVEL);
/* Watchdog operating frequency is fixed to LFCLK (32.768) kHz */
@ -227,9 +228,11 @@ static int wdt_npcx_setup(const struct device *dev, uint8_t options)
return -ENOTSUP;
}
/* Stall the WDT counter when halted by debugger */
if ((options & WDT_OPT_PAUSE_HALTED_BY_DBG) != 0) {
LOG_ERR("WDT_OPT_PAUSE_HALTED_BY_DBG is not supported");
return -ENOTSUP;
npcx_dbg_freeze_enable(true);
} else {
npcx_dbg_freeze_enable(false);
}
/*

View file

@ -83,10 +83,12 @@
scfg: scfg@400c3000 {
compatible = "nuvoton,npcx-scfg";
/* First reg region is System Configuration Device */
/* Second reg region is System Glue Device */
/* Second reg region is Debugger Interface Device */
/* Third reg region is System Glue Device */
reg = <0x400c3000 0x70
0x400c3070 0x30
0x400a5000 0x2000>;
reg-names = "scfg", "glue";
reg-names = "scfg", "dbg", "glue";
#alt-cells = <3>;
#lvol-cells = <2>;
};

View file

@ -158,6 +158,48 @@ static inline uint32_t npcx_pwdwn_ctl_offset(uint32_t ctl_no)
#define NPCX_ENIDL_CTL_PECI_ENI 2
#define NPCX_ENIDL_CTL_ADC_ACC_DIS 1
/* Macro functions for Development and Debugger Interface (DDI) registers */
#define NPCX_DBGCTRL(base) (*(volatile uint8_t *)(base + 0x004))
#define NPCX_DBGFRZEN1(base) (*(volatile uint8_t *)(base + 0x006))
#define NPCX_DBGFRZEN2(base) (*(volatile uint8_t *)(base + 0x007))
#define NPCX_DBGFRZEN3(base) (*(volatile uint8_t *)(base + 0x008))
#define NPCX_DBGFRZEN4(base) (*(volatile uint8_t *)(base + 0x009))
/* DDI register fields */
#define NPCX_DBGCTRL_CCDEV_SEL FIELD(6, 2)
#define NPCX_DBGCTRL_CCDEV_DIR 5
#define NPCX_DBGCTRL_SEQ_WK_EN 4
#define NPCX_DBGCTRL_FRCLK_SEL_DIS 3
#define NPCX_DBGFRZEN1_SPIFEN 7
#define NPCX_DBGFRZEN1_HIFEN 6
#define NPCX_DBGFRZEN1_ESPISEN 5
#define NPCX_DBGFRZEN1_UART1FEN 4
#define NPCX_DBGFRZEN1_SMB3FEN 3
#define NPCX_DBGFRZEN1_SMB2FEN 2
#define NPCX_DBGFRZEN1_MFT2FEN 1
#define NPCX_DBGFRZEN1_MFT1FEN 0
#define NPCX_DBGFRZEN2_ITIM6FEN 7
#define NPCX_DBGFRZEN2_ITIM5FEN 6
#define NPCX_DBGFRZEN2_ITIM4FEN 5
#define NPCX_DBGFRZEN2_ITIM64FEN 3
#define NPCX_DBGFRZEN2_SMB1FEN 2
#define NPCX_DBGFRZEN2_SMB0FEN 1
#define NPCX_DBGFRZEN2_MFT3FEN 0
#define NPCX_DBGFRZEN3_GLBL_FRZ_DIS 7
#define NPCX_DBGFRZEN3_ITIM3FEN 6
#define NPCX_DBGFRZEN3_ITIM2FEN 5
#define NPCX_DBGFRZEN3_ITIM1FEN 4
#define NPCX_DBGFRZEN3_I3CFEN 2
#define NPCX_DBGFRZEN3_SMB4FEN 1
#define NPCX_DBGFRZEN3_SHMFEN 0
#define NPCX_DBGFRZEN4_UART2FEN 6
#define NPCX_DBGFRZEN4_UART3FEN 5
#define NPCX_DBGFRZEN4_UART4FEN 4
#define NPCX_DBGFRZEN4_LCTFEN 3
#define NPCX_DBGFRZEN4_SMB7FEN 2
#define NPCX_DBGFRZEN4_SMB6FEN 1
#define NPCX_DBGFRZEN4_SMB5FEN 0
/*
* System Configuration (SCFG) device registers
*/

View file

@ -19,6 +19,7 @@ LOG_MODULE_REGISTER(pimux_npcx, LOG_LEVEL_ERR);
struct npcx_scfg_config {
/* scfg device base address */
uintptr_t base_scfg;
uintptr_t base_dbg;
uintptr_t base_glue;
};
@ -45,6 +46,7 @@ static const struct npcx_alt def_alts[] = {
static const struct npcx_scfg_config npcx_scfg_cfg = {
.base_scfg = DT_REG_ADDR_BY_NAME(DT_NODELABEL(scfg), scfg),
.base_dbg = DT_REG_ADDR_BY_NAME(DT_NODELABEL(scfg), dbg),
.base_glue = DT_REG_ADDR_BY_NAME(DT_NODELABEL(scfg), glue),
};
@ -129,6 +131,17 @@ void npcx_host_interface_sel(enum npcx_hif_type hif_type)
SET_FIELD(inst_scfg->DEVCNT, NPCX_DEVCNT_HIF_TYP_SEL_FIELD, hif_type);
}
void npcx_dbg_freeze_enable(bool enable)
{
const uintptr_t dbg_base = npcx_scfg_cfg.base_dbg;
if (enable) {
NPCX_DBGFRZEN3(dbg_base) &= ~BIT(NPCX_DBGFRZEN3_GLBL_FRZ_DIS);
} else {
NPCX_DBGFRZEN3(dbg_base) |= BIT(NPCX_DBGFRZEN3_GLBL_FRZ_DIS);
}
}
/* Pin-control driver registration */
static int npcx_scfg_init(void)
{

View file

@ -0,0 +1,26 @@
/*
* Copyright (c) 2023 Nuvoton Technology Corporation.
*
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef _NUVOTON_NPCX_SOC_DBG_H_
#define _NUVOTON_NPCX_SOC_DBG_H_
#ifdef __cplusplus
extern "C" {
#endif
/**
* @brief Configure the Automatic Freeze mode. If this mode is enabled, whenever
* the Core is halted, various modules clocks, counters are stopped and
* destructive reads are disabled, pending the respective module enable bit for
* debugging.
*/
void npcx_dbg_freeze_enable(bool enable);
#ifdef __cplusplus
}
#endif
#endif /* _NUVOTON_NPCX_SOC_DBG_H_ */