From nobody Fri Jul 24 21:52:34 2026 Received: from mail-pf1-f170.google.com (mail-pf1-f170.google.com [209.85.210.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9C4673FB7D5 for ; Fri, 24 Jul 2026 09:15:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784884509; cv=none; b=asNu8mPMKVGghsiWEzgXObdtHAmOTCndR04O19dTSH/DcR66PpxgR6akb4p5LIh2AlNssQM7hhWiNupqToghYpACB0zs0qWLulrLl3+8xxlVkhFjSfkuFBkvvdKr3G0CdfYgNWZRV61WDiBrmwtfs3mfuCLTmT8j/ZNqNPl6goI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784884509; c=relaxed/simple; bh=/xlEVw/KiT9/XEqDjIphDYd3uSSaRu/4jZjjAdQtqd8=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=ZyDMv6mEDcUQnS5idOUyNmw853O68jfphN8i6k3lC8Vrh3vthi19sW04Rp+sbhZn8HV+P+LnIW7jY18jP1TdEpfkzLA+2qi3FjsQ0rMgdNr1kAJHx3fOEqaoYscOlJUOxvuihhlLL+GFFWRRUr3uH7xbFlbH8vdRve6Vp4KW3Yw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=BupgRjk5; arc=none smtp.client-ip=209.85.210.170 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="BupgRjk5" Received: by mail-pf1-f170.google.com with SMTP id d2e1a72fcca58-848d21bbaffso208120b3a.0 for ; Fri, 24 Jul 2026 02:15:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1784884508; x=1785489308; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=yzDl4rio1x0zKV1oZWrhXk8ePWLshifrG/jhvgwjQz8=; b=BupgRjk5l+MuL8KBKi23Gt3MpvYB0x7coU0qrABpDmXZ1XssBcDK8qciftVlY//eim IpEGTEVA654bpx75ClSPUcjHMbHsCtKMEigbaUnUtAO/gRCYqPVNMENZrw07Vk2jVnOx TfFcnSsqqmM0gWPjB4gUtpP3LqLWuX6T0XPRaebrM0ZWvdo25sFVUEhBJ0VLeFUD6er8 eMunqFN4mDOEtQUhRdohFbz96Errb2bJg5w/Tnyf/epZthN9+hTFH1/3qNp0YYdKQq/s yh+O1HHeGlsJoxx726LWGSq6N0d/hmgU6FmNNQIpqQInRk5UqwlKpqes0ru05ZO2W4HS L73w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784884508; x=1785489308; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=yzDl4rio1x0zKV1oZWrhXk8ePWLshifrG/jhvgwjQz8=; b=RrXcY4P0JqdcGQo/FpGBDNcXZdQAUgeUCRfS86E+R+/0BKysqNAxH72pflA7pG0Rhb rP4Hc9A70J3ko1ODh30P0Tfh3/sZVi5XBhwxc2tpX68gAXM+1i+nYAGzMGuUWiu88+kd FHpeGDnVgLf14P1Ie2VS0Ok+wCmLbaZzkL+7mOuDtgzR78YBY69Amq4uUz8qm9u7G/VY 77xQUca1G7lPkAjoOoicysIRfFDximRhdFOLIOi131lAIyFuJXQXZRweQJ4pS8exRZPM FLwQ5q8EgR8aw/QrVwgCgs2NFMNKLO7EXZ09WlciHWxRWX6gblLg/LPbcQw/6rqKxcUd 2dKw== X-Forwarded-Encrypted: i=1; AHgh+RrfO8ibUuE/AvGYBk3XlixLkA3xSnrrZ1dbGJXA8DzhQYO/8hoivZpF/In6fPlGODSx43FROXrmgsH0UtY=@vger.kernel.org X-Gm-Message-State: AOJu0YyEob2H3dtMAO0daWstnLdcRD0+Lj+ClfbGQnq6CbAff2q6x/85 WvXZ/wLwWRC4pHNi4p7XIubYcz+Qo8Gzlb8JWNbDuzC+H9A8MYVKpEtg X-Gm-Gg: AR+sD13dsyG4EEBk7/Ie8RuTVIvGWe02zQRHHHhMdiJSWQvKAymXEUSP32RgaSUEGfL r3xIwEXItIEyTP5SzxD1I9Ui+/t165fSuT6GPyGxwOEoqeVmMW918rkK6w9hwcPe4PKgt8vGLws tcUj0vnUthJxkXi7Mil9pe2La/1MZ4eo9mthhZvBORLiF9iJALCzSOZ8F/S5RHvpZIR+MFDoO7L qP7ELsmqF6hySGtid/iyg4uq9vagEcqHMVuGDUHN8nGCfzCn4gzdxW0cm1EfGBishJrltxDGGfZ FhRoeTY2E5E9TFZslHhNIesb4ipWp0Vu/0u6ArW/rpP6xCacnbnApdVFwrzB8qWY4gtUFspKsL6 dfUl5011qCv0+Aq25zdVselPyUH1rQyLMDPPFi4j30Zf9GP6AePLjyt+3MiRtWu4nBXuJXZSK7U 4UPL6cQ6vfigocrjHSWl9lo+AIiolZwvgLR0dJMzSv0ZEHf1qk/p4fwDwI7NHu X-Received: by 2002:a05:6a00:1797:b0:847:968c:a0f1 with SMTP id d2e1a72fcca58-84e2c1aa5dfmr7625153b3a.43.1784884507987; Fri, 24 Jul 2026 02:15:07 -0700 (PDT) Received: from localhost.localdomain (60-250-196-139.hinet-ip.hinet.net. [60.250.196.139]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-84e17237c3fsm4410519b3a.9.2026.07.24.02.15.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 24 Jul 2026 02:15:07 -0700 (PDT) From: Zi-Yu Chen To: Wim Van Sebroeck , Guenter Roeck , Rob Herring , Krzysztof Kozlowski , Conor Dooley Cc: Jacky Huang , Shan-Chun Hung , linux-watchdog@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Zi-Yu Chen Subject: [PATCH v2 1/3] dt-bindings: watchdog: Add MA35D1 Watchdog binding Date: Fri, 24 Jul 2026 17:14:25 +0800 Message-Id: <20260724091427.1689980-2-zychennvt@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260724091427.1689980-1-zychennvt@gmail.com> References: <20260724091427.1689980-1-zychennvt@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add device tree binding documentation for the watchdog timer (WDT) controller found on Nuvoton MA35D1 SoC. Signed-off-by: Zi-Yu Chen --- .../bindings/watchdog/nuvoton,ma35d1-wdt.yaml | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 Documentation/devicetree/bindings/watchdog/nuvoton,ma35= d1-wdt.yaml diff --git a/Documentation/devicetree/bindings/watchdog/nuvoton,ma35d1-wdt.= yaml b/Documentation/devicetree/bindings/watchdog/nuvoton,ma35d1-wdt.yaml new file mode 100644 index 000000000000..aced7d77a7d3 --- /dev/null +++ b/Documentation/devicetree/bindings/watchdog/nuvoton,ma35d1-wdt.yaml @@ -0,0 +1,55 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/watchdog/nuvoton,ma35d1-wdt.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Nuvoton MA35D1 Watchdog Timer + +maintainers: + - Zi-Yu Chen + +allOf: + - $ref: watchdog.yaml# + +properties: + compatible: + enum: + - nuvoton,ma35d1-wdt + + reg: + maxItems: 1 + + interrupts: + maxItems: 1 + + clocks: + maxItems: 1 + + wakeup-source: true + +required: + - compatible + - reg + - interrupts + - clocks + +unevaluatedProperties: false + +examples: + - | + #include + #include + #include + + soc { + #address-cells =3D <2>; + #size-cells =3D <2>; + wdt1: watchdog@40440000 { + compatible =3D "nuvoton,ma35d1-wdt"; + reg =3D <0x0 0x40440000 0x0 0x100>; + interrupts =3D ; + clocks =3D <&clk WDT1_GATE>; + }; + }; +... --=20 2.34.1 From nobody Fri Jul 24 21:52:34 2026 Received: from mail-pf1-f170.google.com (mail-pf1-f170.google.com [209.85.210.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 855AB403142 for ; Fri, 24 Jul 2026 09:15:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784884513; cv=none; b=RIYEhyT2vBkYR29uxwTyKUcZqMXOk7LA6EnR9FY71/lcfwz/gCTb+ZOmTelUC+4LeeKwH0hKJpFvNdUTDlTqSZ44AnPzelLdOdPVfxFl/kfxai4vcyQz9gLVULLAjA1ZBqHQqOO4okDfJIIgNpqfBG8Mo9f1x0aA1pZoFqaydys= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784884513; c=relaxed/simple; bh=2GQ7wQJozeJwMXM+EbLiEJiwOF2MZZaMJ1kc+ev6F68=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=DoSicBgVG7MWxTnjiZWHQOpVCbdxStd4zWJ/mABkW4RVUwWPKL/AhcIYxj0YVyilY38iw77apo/GfBdG5ZV9jcSSd5VlJAEH3T6eegNMOyyq8rqHNOqDhhjtn0vYUuao+NjMvpQMA9wU/UyAtItU2iuk4hCDApTtu1mIlHbFZus= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=Z3km5iYu; arc=none smtp.client-ip=209.85.210.170 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Z3km5iYu" Received: by mail-pf1-f170.google.com with SMTP id d2e1a72fcca58-848595b338cso235427b3a.0 for ; Fri, 24 Jul 2026 02:15:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1784884511; x=1785489311; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=c21Lk08D0zYvSjfQjjn7bb1q3ErrrWyvS9nTmoxTl2A=; b=Z3km5iYu+16zpK5hNN/xu4VDcGoGPTjzPsjnjC/LCvERzV3Ns+RTdYSccuM2x2g9NW G+bfV7euWPkfBspNzuG6jhw9q43hce1/89wEWMfB5NDxlzn08cnddrwHR51CYOI3Z79n SWWprdAc6QE3BKHyA2ayKKN3ZkzrrMwxlHwWYpXVvaZvdVbW9aR4bN6q3HLdDMR4zxtQ II4xahhgXnaLN59RPqgR4rq6YIGxVhI0atLjp5sjdP4IPL/u4IOWbCESDQQXCICJyB9v v0WYE8fM8G7HoOpsJ+ZyjS3bCN8DchWTrNY2BeTW49v4pdYFgMdVhrYEA9EhJyTmbxWg spDQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784884511; x=1785489311; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=c21Lk08D0zYvSjfQjjn7bb1q3ErrrWyvS9nTmoxTl2A=; b=XL7QAWh7WvTgBqPtL3d1A9gSm7qH7PFrm6wmotOzT+VJsEUTpg+dVemmYvFYBKrGAa 564OH7B1G41bzsr5nN+Y6RzZlETOv4tIzl9hgfwRTCdFNbxMpzv9XYCxJn/zXqCcmS1H ogBfi+wiJsr8m0lwjSQgy3jP53kW5X5CdCw7pl7aGDsJiZ7ZFv4JcIi7K8cBzCRMFoe6 2dc79okP86vlUoOM7zry5EAOjtSngZb84kSNHx0BYFDp8wNVyHSNQV6q/Pn2tCp3WJ+G XzPrChXm76poLDQUwZklZCqX578vwzKemv0y5HChd8/XKW8v24bejY7NPqb7ibzSbA40 +D1w== X-Forwarded-Encrypted: i=1; AHgh+Rpef/lIvkAfOWFUhWIYPYYNqrnKCbV1IO2lJyh8OsJp0+3hmnOB1pgqwPEUfeuxyw7P/tRyrg/1Rs5dGRs=@vger.kernel.org X-Gm-Message-State: AOJu0YwOGokX7JYeh9luyaa+ezB0knZX+kT6DRRGt+B7/FpLtOzITAlC 5QhT0tbr2dAuaMaorHH2yPSEqKK9UkMSLtVVrVigNMO5+dVz1ipUpz6S X-Gm-Gg: AR+sD12eZdI+wcYdOGDbr5GmJvZQ5hsDl8esb9x6faZispvWOt4zkFmgq3etFU8JMAc Tz5z+NyvJNqo4a1zYhlmjRStzqVI6LX9Y7wyNDJfT1BYxVITsCNameKvUhpfbwhq6RYdNXJ75ap lR6BbL510e0A4WV9f94E9FUShwKQYD72iLIBfYDIwxwjZi4cQEef5kv/2LrRAJx8RxuRpRAH9mz TD4UpRgaAxpaNvPGvmEfq203oxoAcLqzW5xYrPSDTQodHHgTHV8wlNQzxrKjAt0mgMF6UjOjPmV v0wwIAQr/CSqzEsY6q89gIG/9gOcY+cgjRCl3BuPxC3XuMwXrgPt5ucS2ce1LlHsScPZaUc6kb2 EnFX+/sh8hu42hniz4YEyk4ZMljhnIBGeV4h6dR4yoSCk/eZIWxQ4gYD1LhCFbZE0phZkIhY6Ky pBlQptmXKsGbRho/5WgHYdrpQ1tKZzjC/1kaTi7SPLVhRhB6I2RdzLAUASYppd X-Received: by 2002:a05:6a00:9514:b0:84e:685:cbe1 with SMTP id d2e1a72fcca58-84e2bbfc634mr7500141b3a.69.1784884510746; Fri, 24 Jul 2026 02:15:10 -0700 (PDT) Received: from localhost.localdomain (60-250-196-139.hinet-ip.hinet.net. [60.250.196.139]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-84e17237c3fsm4410519b3a.9.2026.07.24.02.15.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 24 Jul 2026 02:15:10 -0700 (PDT) From: Zi-Yu Chen To: Wim Van Sebroeck , Guenter Roeck , Rob Herring , Krzysztof Kozlowski , Conor Dooley Cc: Jacky Huang , Shan-Chun Hung , linux-watchdog@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Zi-Yu Chen Subject: [PATCH v2 2/3] watchdog: Add Nuvoton MA35D1 watchdog driver support Date: Fri, 24 Jul 2026 17:14:26 +0800 Message-Id: <20260724091427.1689980-3-zychennvt@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260724091427.1689980-1-zychennvt@gmail.com> References: <20260724091427.1689980-1-zychennvt@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add driver support for the Watchdog Timer (WDT) integrated in Nuvoton MA35D1 SoC. This driver provides standard watchdog functionality, including timeout configuration, ping, and system reset support via the watchdog framework. Signed-off-by: Zi-Yu Chen --- drivers/watchdog/Kconfig | 10 + drivers/watchdog/Makefile | 1 + drivers/watchdog/ma35d1_wdt.c | 358 ++++++++++++++++++++++++++++++++++ 3 files changed, 369 insertions(+) create mode 100644 drivers/watchdog/ma35d1_wdt.c diff --git a/drivers/watchdog/Kconfig b/drivers/watchdog/Kconfig index 08cb8612d41f..972740fd36a6 100644 --- a/drivers/watchdog/Kconfig +++ b/drivers/watchdog/Kconfig @@ -720,6 +720,16 @@ config STMP3XXX_RTC_WATCHDOG To compile this driver as a module, choose M here: the module will be called stmp3xxx_rtc_wdt. =20 +config MA35D1_WDT + tristate "Nuvoton MA35D1 Watchdog Timer" + depends on ARCH_MA35 || COMPILE_TEST + select WATCHDOG_CORE + help + Say Y here to include support for the watchdog timer + for the Nuvoton MA35D1 series microprosser. + To compile this driver as a module, choose M here: the + module will be called ma35d1_wdt. + config TS4800_WATCHDOG tristate "TS-4800 Watchdog" depends on HAS_IOMEM && OF diff --git a/drivers/watchdog/Makefile b/drivers/watchdog/Makefile index bc1d52220f22..a7889eb48c7f 100644 --- a/drivers/watchdog/Makefile +++ b/drivers/watchdog/Makefile @@ -104,6 +104,7 @@ obj-$(CONFIG_APPLE_WATCHDOG) +=3D apple_wdt.o obj-$(CONFIG_SUNPLUS_WATCHDOG) +=3D sunplus_wdt.o obj-$(CONFIG_MARVELL_GTI_WDT) +=3D marvell_gti_wdt.o obj-$(CONFIG_GUNYAH_WATCHDOG) +=3D gunyah_wdt.o +obj-$(CONFIG_MA35D1_WDT) +=3D ma35d1_wdt.o =20 # X86 (i386 + ia64 + x86_64) Architecture obj-$(CONFIG_ACQUIRE_WDT) +=3D acquirewdt.o diff --git a/drivers/watchdog/ma35d1_wdt.c b/drivers/watchdog/ma35d1_wdt.c new file mode 100644 index 000000000000..e5247e55dfee --- /dev/null +++ b/drivers/watchdog/ma35d1_wdt.c @@ -0,0 +1,358 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Copyright (c) 2026 Nuvoton technology corporation. + * + * Author: Zi-Yu Chen + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define DRV_NAME "ma35d1-wdt" + +#define REG_WDT_CTL 0x00 +#define REG_WDT_RSTCNT 0x08 + +#define TOUTSEL GENMASK(11, 8) +#define WDTEN BIT(7) +#define INTEN BIT(6) +#define WKF BIT(5) +#define WKEN BIT(4) +#define IF BIT(3) +#define RSTF BIT(2) +#define RSTEN BIT(1) +#define SYNC BIT(30) + +#define WDT_DEFAULT_TIMEOUT 32 +#define RESET_COUNTER 0x00005AA5 + +static bool nowayout =3D WATCHDOG_NOWAYOUT; +static unsigned int timeout; + +struct ma35d1_wdt_dev { + struct watchdog_device wdt_dev; + spinlock_t lock; + void __iomem *wdt_base; + struct clk *clk; + unsigned long clk_rate; + int irq; +}; + +static int ma35d1_wdt_wait_sync(struct ma35d1_wdt_dev *ma35d1_wdt) +{ + unsigned int val; + + return readl_relaxed_poll_timeout_atomic(ma35d1_wdt->wdt_base + + REG_WDT_CTL, val, !(val & SYNC), 10, 125); +} + +/** + * ma35d1_wdt_stop - Stop the watchdog. + * + * @wdt_dev: watchdog device + * + * Read the contents of the CTL register, clear the WDTEN bit + * in the register and set the access key for successful write. + * + * Return: 0 on success, negative error otherwise. + */ +static int ma35d1_wdt_stop(struct watchdog_device *wdt_dev) +{ + struct ma35d1_wdt_dev *ma35d1_wdt =3D watchdog_get_drvdata(wdt_dev); + unsigned int val; + int ret; + + guard(spinlock_irqsave)(&ma35d1_wdt->lock); + val =3D readl_relaxed(ma35d1_wdt->wdt_base + REG_WDT_CTL); + val &=3D ~WDTEN; + writel_relaxed(val, ma35d1_wdt->wdt_base + REG_WDT_CTL); + ret =3D ma35d1_wdt_wait_sync(ma35d1_wdt); + if (ret) { + dev_err(wdt_dev->parent, "Wait for WDTEN SYNC timeout!\n"); + return ret; + } + return 0; +} + +static int ma35d1_wdt_ping(struct watchdog_device *wdt_dev) +{ + struct ma35d1_wdt_dev *ma35d1_wdt =3D watchdog_get_drvdata(wdt_dev); + + writel_relaxed(RESET_COUNTER, ma35d1_wdt->wdt_base + REG_WDT_RSTCNT); + + return 0; +} + +static int ma35d1_wdt_set_timeout(struct watchdog_device *wdt_dev, + unsigned int timeout) +{ + struct ma35d1_wdt_dev *ma35d1_wdt =3D watchdog_get_drvdata(wdt_dev); + unsigned long target_ticks; + unsigned int val, i; + static const uint8_t toutsel_shifts[] =3D { 4, 6, 8, 10, 12, + 14, 16, 18, 20 }; + + if (timeout < (ma35d1_wdt->wdt_dev.max_hw_heartbeat_ms / 1000)) { + target_ticks =3D (unsigned long)timeout * ma35d1_wdt->clk_rate; + + for (i =3D 0; i < ARRAY_SIZE(toutsel_shifts); i++) { + if ((1UL << toutsel_shifts[i]) >=3D target_ticks) + break; + } + /* To avoid truncation errors (0 seconds) during division. */ + wdt_dev->timeout =3D + (1UL << toutsel_shifts[i]) / ma35d1_wdt->clk_rate; + if (wdt_dev->timeout =3D=3D 0) + wdt_dev->timeout =3D 1; + + } else { + i =3D ARRAY_SIZE(toutsel_shifts) - 1; + wdt_dev->timeout =3D timeout; + } + + guard(spinlock_irqsave)(&ma35d1_wdt->lock); + val =3D readl_relaxed(ma35d1_wdt->wdt_base + REG_WDT_CTL); + val &=3D ~TOUTSEL; + val |=3D FIELD_PREP(TOUTSEL, i); + writel_relaxed(val, ma35d1_wdt->wdt_base + REG_WDT_CTL); + + ma35d1_wdt_ping(wdt_dev); + return 0; +} + +static int ma35d1_wdt_start(struct watchdog_device *wdt_dev) +{ + struct ma35d1_wdt_dev *ma35d1_wdt =3D watchdog_get_drvdata(wdt_dev); + void __iomem *wdt_base =3D ma35d1_wdt->wdt_base; + unsigned int val; + int ret; + + ret =3D ma35d1_wdt_set_timeout(wdt_dev, wdt_dev->timeout); + if (ret < 0) + return ret; + + guard(spinlock_irqsave)(&ma35d1_wdt->lock); + val =3D readl_relaxed(wdt_base + REG_WDT_CTL); + val |=3D (WDTEN | RSTEN); + + writel_relaxed(val, wdt_base + REG_WDT_CTL); + ret =3D ma35d1_wdt_wait_sync(ma35d1_wdt); + if (ret) { + dev_err(wdt_dev->parent, "Wait for WDTEN SYNC timeout!\n"); + return ret; + } + + writel_relaxed(RESET_COUNTER, wdt_base + REG_WDT_RSTCNT); + + return 0; +} + +static const struct watchdog_info ma35d1_wdt_info =3D { + .identity =3D DRV_NAME, + .options =3D WDIOF_SETTIMEOUT | WDIOF_KEEPALIVEPING | WDIOF_MAGICCLOSE | + WDIOF_CARDRESET, +}; + +static const struct watchdog_ops ma35d1_wdt_ops =3D { + .owner =3D THIS_MODULE, + .start =3D ma35d1_wdt_start, + .stop =3D ma35d1_wdt_stop, + .ping =3D ma35d1_wdt_ping, + .set_timeout =3D ma35d1_wdt_set_timeout, +}; + +static irqreturn_t ma35d1_wdt_isr(int irq, void *dev_id) +{ + struct ma35d1_wdt_dev *ma35d1_wdt =3D dev_id; + unsigned int val; + + /* Clear the flag if set */ + guard(spinlock)(&ma35d1_wdt->lock); + val =3D readl_relaxed(ma35d1_wdt->wdt_base + REG_WDT_CTL); + writel_relaxed(val, ma35d1_wdt->wdt_base + REG_WDT_CTL); + + return IRQ_HANDLED; +} + +static int ma35d1_wdt_probe(struct platform_device *pdev) +{ + struct device *dev =3D &pdev->dev; + struct ma35d1_wdt_dev *ma35d1_wdt; + unsigned long clk_rate, val; + int ret; + + ma35d1_wdt =3D devm_kzalloc(dev, sizeof(*ma35d1_wdt), GFP_KERNEL); + if (!ma35d1_wdt) + return -ENOMEM; + + spin_lock_init(&ma35d1_wdt->lock); + platform_set_drvdata(pdev, ma35d1_wdt); + + ma35d1_wdt->wdt_base =3D devm_platform_ioremap_resource(pdev, 0); + if (IS_ERR(ma35d1_wdt->wdt_base)) + return PTR_ERR(ma35d1_wdt->wdt_base); + + ma35d1_wdt->clk =3D devm_clk_get_enabled(dev, NULL); + if (IS_ERR(ma35d1_wdt->clk)) + return dev_err_probe(dev, PTR_ERR(ma35d1_wdt->clk), + "Can't get Watchdog clock\n"); + + clk_rate =3D clk_get_rate(ma35d1_wdt->clk); + if (!clk_rate) + return -EINVAL; + ma35d1_wdt->clk_rate =3D clk_rate; + + ma35d1_wdt->irq =3D platform_get_irq(pdev, 0); + if (ma35d1_wdt->irq < 0) + return dev_err_probe(dev, ma35d1_wdt->irq, + "failed to get irq\n"); + + ma35d1_wdt->wdt_dev.info =3D &ma35d1_wdt_info; + ma35d1_wdt->wdt_dev.ops =3D &ma35d1_wdt_ops; + ma35d1_wdt->wdt_dev.timeout =3D WDT_DEFAULT_TIMEOUT; + ma35d1_wdt->wdt_dev.min_timeout =3D 1; + ma35d1_wdt->wdt_dev.max_hw_heartbeat_ms =3D (1U << 20) * 1000 / clk_rate; + ma35d1_wdt->wdt_dev.parent =3D dev; + + val =3D readl_relaxed(ma35d1_wdt->wdt_base + REG_WDT_CTL); + if (val & RSTF) { + ma35d1_wdt->wdt_dev.bootstatus =3D WDIOF_CARDRESET; + writel_relaxed(val, ma35d1_wdt->wdt_base + REG_WDT_CTL); + } + + if (val & WDTEN) + set_bit(WDOG_HW_RUNNING, &ma35d1_wdt->wdt_dev.status); + + watchdog_set_drvdata(&ma35d1_wdt->wdt_dev, ma35d1_wdt); + watchdog_set_nowayout(&ma35d1_wdt->wdt_dev, nowayout); + watchdog_init_timeout(&ma35d1_wdt->wdt_dev, timeout, &pdev->dev); + + ret =3D devm_request_irq(dev, ma35d1_wdt->irq, ma35d1_wdt_isr, 0, + dev_name(dev), ma35d1_wdt); + if (ret) + return dev_err_probe(dev, ret, "cannot claim IRQ %d\n", + ma35d1_wdt->irq); + + if (device_property_read_bool(dev, "wakeup-source")) { + ret =3D devm_device_init_wakeup(dev); + if (ret) + return ret; + + ret =3D devm_pm_set_wake_irq(dev, ma35d1_wdt->irq); + if (ret) + return ret; + } + + watchdog_stop_on_reboot(&ma35d1_wdt->wdt_dev); + watchdog_stop_on_unregister(&ma35d1_wdt->wdt_dev); + ret =3D devm_watchdog_register_device(dev, &ma35d1_wdt->wdt_dev); + if (ret) + return ret; + + return 0; +} + +static int ma35d1_wdt_suspend(struct device *dev) +{ + struct ma35d1_wdt_dev *ma35d1_wdt =3D dev_get_drvdata(dev); + + if (watchdog_active(&ma35d1_wdt->wdt_dev)) { + u32 val; + int ret; + + guard(spinlock_irqsave)(&ma35d1_wdt->lock); + val =3D readl_relaxed(ma35d1_wdt->wdt_base + REG_WDT_CTL); + + if (device_may_wakeup(dev)) { + val &=3D ~RSTEN; + val |=3D (INTEN | WKEN); + } else { + val &=3D ~(WDTEN | RSTEN); + } + writel_relaxed(val, ma35d1_wdt->wdt_base + REG_WDT_CTL); + ret =3D ma35d1_wdt_wait_sync(ma35d1_wdt); + if (ret) { + dev_err(dev, "Wait for WDTEN SYNC timeout!\n"); + return ret; + } + } + + return 0; +} + +static int ma35d1_wdt_resume(struct device *dev) +{ + struct ma35d1_wdt_dev *ma35d1_wdt =3D dev_get_drvdata(dev); + + if (watchdog_active(&ma35d1_wdt->wdt_dev)) { + u32 val; + int ret; + + guard(spinlock_irqsave)(&ma35d1_wdt->lock); + val =3D readl_relaxed(ma35d1_wdt->wdt_base + REG_WDT_CTL); + + if (device_may_wakeup(dev)) { + val |=3D RSTEN; + val &=3D ~(INTEN | WKEN); + } else { + val |=3D (WDTEN | RSTEN); + } + writel_relaxed(val, ma35d1_wdt->wdt_base + REG_WDT_CTL); + writel_relaxed(RESET_COUNTER, + ma35d1_wdt->wdt_base + REG_WDT_RSTCNT); + ret =3D ma35d1_wdt_wait_sync(ma35d1_wdt); + if (ret) { + dev_err(dev, "Wait for WDTEN SYNC timeout!\n"); + return ret; + } + } + return 0; +} + +static DEFINE_SIMPLE_DEV_PM_OPS(ma35d1_wdt_pm_ops, ma35d1_wdt_suspend, + ma35d1_wdt_resume); + +static const struct of_device_id ma35d1_wdt_dt_ids[] =3D { + { .compatible =3D "nuvoton,ma35d1-wdt" }, + { /* sentinel */ }, +}; +MODULE_DEVICE_TABLE(of, ma35d1_wdt_dt_ids); + +static struct platform_driver ma35d1_wdt_driver =3D { + .probe =3D ma35d1_wdt_probe, + .driver =3D { + .name =3D DRV_NAME, + .pm =3D pm_ptr(&ma35d1_wdt_pm_ops), + .of_match_table =3D ma35d1_wdt_dt_ids, + }, +}; + +module_platform_driver(ma35d1_wdt_driver); + +module_param(timeout, uint, 0); +MODULE_PARM_DESC(timeout, "Watchdog heartbeat in seconds"); + +module_param(nowayout, bool, 0); +MODULE_PARM_DESC( + nowayout, + "Watchdog cannot be stopped once started (default=3D" __MODULE_STRING( + WATCHDOG_NOWAYOUT) ")"); + +MODULE_AUTHOR("Zi-Yu Chen "); +MODULE_DESCRIPTION("Nuvoton MA35D1 Watchdog Timer Driver"); +MODULE_LICENSE("GPL"); --=20 2.34.1 From nobody Fri Jul 24 21:52:34 2026 Received: from mail-pf1-f176.google.com (mail-pf1-f176.google.com [209.85.210.176]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 016913E2ADF for ; Fri, 24 Jul 2026 09:15:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.176 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784884515; cv=none; b=HYdZk/EOCDFrmIwn/D1JOiyx6togmdf+eNP62iARh8eGUsRu6YNk4IUH+PLbz9RqfTje9m8Tst2RanazWjfyA5kcQoyu88ox2Sbxt2Rha0UFs68MbG/uNz+e4KZr1G2raB38889hu9CfeIXPFXhH7QquMePYrQa6XCyRJLOZCog= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784884515; c=relaxed/simple; bh=yKkOBIWDLVzZbrFG3yiQLyXNfyi/iupP2ISmcl3yvxs=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=UIdNWWb3QgRJNuUfNiz3CEqUnLw6XtW7V8dW0B5GLqRcKyP4GEPLaBVCZkCqLpFdcoSZ+Qo86lptrday36N+tBLFIqJtskDA0rA6/oYmi7tIQ7O5ftxOvjZVqJZ5hGC3FKeqhH7wOnySE7sOXFFbjnvGlHhmtVuZDkislOXLO2U= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=jAv6dcXe; arc=none smtp.client-ip=209.85.210.176 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="jAv6dcXe" Received: by mail-pf1-f176.google.com with SMTP id d2e1a72fcca58-84a652535dcso84184b3a.3 for ; Fri, 24 Jul 2026 02:15:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1784884513; x=1785489313; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=aUz1mWBpB/XSD0ZgFsInGJUX8h9hfweN14oEZfYpX44=; b=jAv6dcXePrxt8FCLYrkVcjLb/PgvrIFQInCmW6JXs2MylATchqRHhOoIhkkHl4Aqwt 9n/8MxA7sMX5fA4H9CXTWz2ehszK4rcuqM7r4tXyKn18ajibHKMVPdtd3ykzGX+yB3MK P0yPNp0HfL7tEpWFbNPOvgpYwRtyfduPdjJrAHjXmWwDw5p8bRg912pTZVfAjOUf4eUJ Q5fxUdhSwGuiwDep28rrhiHNBItk6y3w0bAOMYvrPnSLXcI9PCevKEdQO2nBCR4KHPkC UP3haOwM+O4iemClMxyMzWY81uAJR1vWJ3cDExBIXkC+Gz2uoSXWzwsrJ4+T8xPgsNgX nvgw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784884513; x=1785489313; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=aUz1mWBpB/XSD0ZgFsInGJUX8h9hfweN14oEZfYpX44=; b=mQ7iH9vaIcPw+uo14Yd8V599sE49lrAthuujA3iMEkTeDOTULXUuPQzdQc/Bs139H1 YK0ryHlG876/T5euk8f6g7lOMBqIQTGRv5QAlzgjJn4MJYlvuzvVRLBECTjUWBtqYPL+ 9yvqmk8mSwJSsS5Gyu9sXDBqvGpgOULn/Z2EhEFbaJ50p6s65jFu2KJ4s4QYXPebUxp6 zhp2zir7ctZ1H97FXusYO/tHEu3+WsodaZw8MQtS8a5ycXobAnA1pFsHXdeiG+3q/Baj 1JpfwexjYkC3kgNkzjV2aelGrGaDA/dxNZ5dwi9PGKyb3qqrwkI4IJG5HH/Tl95msPBS uBcg== X-Forwarded-Encrypted: i=1; AHgh+Rq8eB/vh+H7/YZvdcuYRRn2oUSRxnl3thrkIt8jHv9iob8ERo48PQFc6rsgtii08HZzcU6Tt8p9cZmfmcs=@vger.kernel.org X-Gm-Message-State: AOJu0YyIikeW7XnksdeCuQWH7YQcdO/pksYjcedIO/Mitj9083EnufAv SlNuCtSC4LJSJ7phY5qbajrqbqftWFqHTfQHySWofbPywZcvI0vyiYSY X-Gm-Gg: AR+sD12mIqx1phEItPi65Ov9RbbYd70Gl2Q/5Di28CtawaSm9n1JCAHTpSPZdDq9MrA tO1Cx/n9+rStJ6LDQohbdG4SAc5A1Fgv409knHjWX04sQcqtnq8fIVsbM/EYXAzOaQRMz1dbxP6 XKvclkWFQUpR9PDBkt7Wl8Y56RIimxyZ5I0lreTjZYVIqILLEQzZjoMmhI73vE27KCsVcIpQkOE 5VyF2frX18J4MUcHbxZDd+H7uA6ZOuriI7BPr8V3Da100Up3ZHCM/1pEgnpQgsahUeU620NkScA M0GlkCzRomvpXtxY5sMW2TPsUcSzbgMQmmAUjovJ9lIQBto8J7nLW77bKwgY5BYbloXasIe3aKU qSWy1JflucUBXVG67v874XNpyYl15MlnGNvpQmDz3wNqzzGDg7JGyvvXTfxpJ/jYNZ57oyiXaqC /vw/TseyQzzzAmNKv82cHTxLB5cMzBfy1EXgBU7ygEI6lINrssSGwvVL7WCLxM X-Received: by 2002:a05:6a00:180b:b0:847:973b:3d04 with SMTP id d2e1a72fcca58-84e2b7e7296mr7121012b3a.10.1784884513359; Fri, 24 Jul 2026 02:15:13 -0700 (PDT) Received: from localhost.localdomain (60-250-196-139.hinet-ip.hinet.net. [60.250.196.139]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-84e17237c3fsm4410519b3a.9.2026.07.24.02.15.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 24 Jul 2026 02:15:13 -0700 (PDT) From: Zi-Yu Chen To: Wim Van Sebroeck , Guenter Roeck , Rob Herring , Krzysztof Kozlowski , Conor Dooley Cc: Jacky Huang , Shan-Chun Hung , linux-watchdog@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Zi-Yu Chen Subject: [PATCH v2 3/3] arm64: dts: nuvoton: Add WDT node for MA35D1 SoC Date: Fri, 24 Jul 2026 17:14:27 +0800 Message-Id: <20260724091427.1689980-4-zychennvt@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260724091427.1689980-1-zychennvt@gmail.com> References: <20260724091427.1689980-1-zychennvt@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add Watchdog Timer (WDT) device node to ma35d1.dtsi. Signed-off-by: Zi-Yu Chen --- arch/arm64/boot/dts/nuvoton/ma35d1.dtsi | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/arch/arm64/boot/dts/nuvoton/ma35d1.dtsi b/arch/arm64/boot/dts/= nuvoton/ma35d1.dtsi index 7228ad4735b5..14fd17cfdc5a 100644 --- a/arch/arm64/boot/dts/nuvoton/ma35d1.dtsi +++ b/arch/arm64/boot/dts/nuvoton/ma35d1.dtsi @@ -82,6 +82,13 @@ soc { #size-cells =3D <2>; ranges; =20 + wdt1: watchdog@40440000 { + compatible =3D "nuvoton,ma35d1-wdt"; + reg =3D <0x0 0x40440000 0x0 0x100>; + interrupts =3D ; + clocks =3D <&clk WDT1_GATE>; + }; + sys: system-management@40460000 { compatible =3D "nuvoton,ma35d1-reset", "syscon"; reg =3D <0x0 0x40460000 0x0 0x200>; --=20 2.34.1