blob: addffd8c1af1eacf2be57477bb1837f7e3166f9d [file]
From 61c358180f3d5124a1a18c46a703f04bad638e07 Mon Sep 17 00:00:00 2001
From: David Wang <davidwang@quantatw.com>
Date: Mon, 6 Nov 2023 14:34:00 +0800
Subject: [PATCH 13/16] drivers: watchdog: sync npcm wdt
---
drivers/watchdog/npcm_wdt.c | 29 +++++++++++++++++++++++------
1 file changed, 23 insertions(+), 6 deletions(-)
diff --git a/drivers/watchdog/npcm_wdt.c b/drivers/watchdog/npcm_wdt.c
index 622b30566a5b..4e7aef561523 100644
--- a/drivers/watchdog/npcm_wdt.c
+++ b/drivers/watchdog/npcm_wdt.c
@@ -27,6 +27,7 @@
#define NPCM7XX_SWR2RST BIT(27)
#define NPCM7XX_SWR3RST BIT(26)
#define NPCM7XX_SWR4RST BIT(25)
+#define NPCM8XX_RST (GENMASK(31, 23) | GENMASK(15, 12))
/* WD register */
#define NPCM_WTCR 0x1C
@@ -199,7 +200,7 @@ static const struct watchdog_ops npcm_wdt_ops = {
static void npcm_get_reset_status(struct npcm_wdt *wdt, struct device *dev)
{
struct regmap *gcr_regmap;
- u32 rstval;
+ u32 rstval, ressrval;
gcr_regmap = syscon_regmap_lookup_by_phandle(dev->of_node, "syscon");
if (IS_ERR(gcr_regmap)) {
@@ -207,12 +208,28 @@ static void npcm_get_reset_status(struct npcm_wdt *wdt, struct device *dev)
return;
}
- regmap_read(gcr_regmap, NPCM7XX_RESSR_OFFSET, &rstval);
- if (!rstval) {
- regmap_read(gcr_regmap, NPCM7XX_INTCR2_OFFSET, &rstval);
- rstval = ~rstval;
+ /* In Poleg, the INTCR2 indicate only power reset */
+ regmap_read(gcr_regmap, NPCM7XX_INTCR2_OFFSET, &rstval);
+ if (of_device_is_compatible(dev->of_node, "nuvoton,npcm750-wdt")) {
+ if ((rstval & NPCM7XX_PORST) == 0) {
+ rstval = NPCM7XX_PORST;
+ /* Clear power reset indication */
+ regmap_write(gcr_regmap, NPCM7XX_INTCR2_OFFSET,
+ rstval | NPCM7XX_PORST);
+ } else {
+ rstval = 0;
+ }
+ regmap_read(gcr_regmap, NPCM7XX_RESSR_OFFSET, &ressrval);
+ rstval |= ressrval;
+ /* After reading the RESSR Clear reset status */
+ regmap_write(gcr_regmap, NPCM7XX_RESSR_OFFSET, ressrval);
}
+ /* In Arbel, after reading the INTCR2 Clear reset status */
+ if (of_device_is_compatible(dev->of_node, "nuvoton,npcm845-wdt"))
+ regmap_write(gcr_regmap, NPCM7XX_INTCR2_OFFSET,
+ rstval & ~NPCM8XX_RST);
+
if (rstval & wdt->card_reset)
wdt->wdd.bootstatus |= WDIOF_CARDRESET;
if (rstval & wdt->ext1_reset)
@@ -342,8 +359,8 @@ static int npcm_wdt_probe(struct platform_device *pdev)
#ifdef CONFIG_OF
static const struct of_device_id npcm_wdt_match[] = {
- {.compatible = "nuvoton,wpcm450-wdt"},
{.compatible = "nuvoton,npcm750-wdt"},
+ {.compatible = "nuvoton,npcm845-wdt"},
{},
};
MODULE_DEVICE_TABLE(of, npcm_wdt_match);
--
2.25.1