| 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 |
| |