Skip to content

Commit

Permalink
watchdog: npcm: Enable clock if provided
Browse files Browse the repository at this point in the history
On the Nuvoton WPCM450 SoC, with its upcoming clock driver, peripheral
clocks are individually gated and ungated. Therefore, the watchdog
driver must be able to ungate the watchdog clock.

Signed-off-by: Jonathan Neuschäfer <j.neuschaefer@gmx.net>
Reviewed-by: Guenter Roeck <linux@roeck-us.net>
Link: https://lore.kernel.org/r/20220610072141.347795-3-j.neuschaefer@gmx.net
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
Signed-off-by: Wim Van Sebroeck <wim@linux-watchdog.org>
  • Loading branch information
neuschaefer authored and Wim Van Sebroeck committed Oct 2, 2022
1 parent 6adbfba commit af084fd
Showing 1 changed file with 16 additions and 0 deletions.
16 changes: 16 additions & 0 deletions drivers/watchdog/npcm_wdt.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
// Copyright (c) 2018 IBM Corp.

#include <linux/bitops.h>
#include <linux/clk.h>
#include <linux/delay.h>
#include <linux/interrupt.h>
#include <linux/kernel.h>
Expand Down Expand Up @@ -43,6 +44,7 @@
struct npcm_wdt {
struct watchdog_device wdd;
void __iomem *reg;
struct clk *clk;
};

static inline struct npcm_wdt *to_npcm_wdt(struct watchdog_device *wdd)
Expand All @@ -66,6 +68,9 @@ static int npcm_wdt_start(struct watchdog_device *wdd)
struct npcm_wdt *wdt = to_npcm_wdt(wdd);
u32 val;

if (wdt->clk)
clk_prepare_enable(wdt->clk);

if (wdd->timeout < 2)
val = 0x800;
else if (wdd->timeout < 3)
Expand Down Expand Up @@ -100,6 +105,9 @@ static int npcm_wdt_stop(struct watchdog_device *wdd)

writel(0, wdt->reg);

if (wdt->clk)
clk_disable_unprepare(wdt->clk);

return 0;
}

Expand Down Expand Up @@ -147,6 +155,10 @@ static int npcm_wdt_restart(struct watchdog_device *wdd,
{
struct npcm_wdt *wdt = to_npcm_wdt(wdd);

/* For reset, we start the WDT clock and leave it running. */
if (wdt->clk)
clk_prepare_enable(wdt->clk);

writel(NPCM_WTR | NPCM_WTRE | NPCM_WTE, wdt->reg);
udelay(1000);

Expand Down Expand Up @@ -191,6 +203,10 @@ static int npcm_wdt_probe(struct platform_device *pdev)
if (IS_ERR(wdt->reg))
return PTR_ERR(wdt->reg);

wdt->clk = devm_clk_get_optional(&pdev->dev, NULL);
if (IS_ERR(wdt->clk))
return PTR_ERR(wdt->clk);

irq = platform_get_irq(pdev, 0);
if (irq < 0)
return irq;
Expand Down

0 comments on commit af084fd

Please sign in to comment.