From nobody Fri Jul 24 05:21:28 2026 Received: from mail-pl1-f176.google.com (mail-pl1-f176.google.com [209.85.214.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 95EEB3A4F51 for ; Thu, 23 Jul 2026 06:08:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.176 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784786906; cv=none; b=RmkUy5hOc0HUW50DHoSMjqCMJiaFp/QhLI9ULv9bzrHv9T0s5dTsnbLoV1/3KofTDxwQpTWdXwwX9xIzxL0djMpOsRYSddDmqtwTOm3Kog+fKlXGqJCZKEdJwOTQOGnGd2IaiIHMT/WyQ6hPVYt4HXkKQvSsmDIF5P2swQcG9A0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784786906; c=relaxed/simple; bh=/xlEVw/KiT9/XEqDjIphDYd3uSSaRu/4jZjjAdQtqd8=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=n7nrxNyfIKPTeGNqkZz1DwZ3qscPMcpqxAM1jjdumfjb5s+dej5nQUEu7c2FbwXwgFm1EjserxrdUB4IcghMgU7mx+GpJaDlekgK1vNABwOg98RT05uxowE2v5znMpBWWO0Z7/koC6TEvxwGCpuSv1DQY+HCXPbF45PGEkVqHcY= 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=FUSgaNRN; arc=none smtp.client-ip=209.85.214.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="FUSgaNRN" Received: by mail-pl1-f176.google.com with SMTP id d9443c01a7336-2caed617615so3101825ad.3 for ; Wed, 22 Jul 2026 23:08:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1784786905; x=1785391705; 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=FUSgaNRNYirkB6AxdKLfbyyo9ngZpalOrWH4VoLMWWOc27twogM5Ph9H4sn8gKq9dF By9OXunWqTetxjMMHHnKXmTxrlqCmdRhsXir03HwJUHyO6LfDB4H29M3zEbtmke8TypV U777+BnVhEo8MxxplOhs+hbTQIB0kTUJ54a1Xd0yR7znrS9hFnOB3CyxtaB170C8QfB/ 2Hk1VQ935c3qISGo8DnNynK/xoqHoujdLKk5JiKuFgGNgFiss3WsppzgUo6AlMTCAFg5 SZSteA+hFSaOeUeJP3hQLM5J0vjMxFIuR6JdRWOCZhh9m+IRuoYzsj95YFc+Ne/kKPoY XN0w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784786905; x=1785391705; 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=fKp4tMYfZYy8kVNtxyPhlIp6TWihlU4W7C1ezNO91HIKJH9R1pp4+Oh/7q1D4JCujQ FK6M5CRKBypNtrOmYOvGhhchCAlbqiSengf4nd7bYVDghvVU8lDA23DEImHiWY99V1K5 Pueo8mN6EfYVTgvbbev3hEmxUXzBCq/9ZMaZunLPonJW3hd8ouszODr3E9c+pipZvW2I 0IwwdCLbXpDPguiLYkrlir31wkJXNhs6rNU7hJ5P6b7aLSkxGhsXRlHDI2GnTJ92k/aS /UXlvz1+7FRQ6lTotcYvcwQEXu3q5lClTB0vkv92W6x0e4cjKDs1iG4KjIq1E3GG1OFc m7ug== X-Forwarded-Encrypted: i=1; AHgh+RqfAu6AjephcBuS5A9xpARoC+wtPGBiOJQV6P8HF1oVdI0mF/Ic9l21naA8Rz1t/e2OGXR+X5uC9/tgW9Y=@vger.kernel.org X-Gm-Message-State: AOJu0YyOOWJT4IH4JFYuBR3V6CL32ttomnMOat6aZg6AHtTR1AjYY8QR 9uixGHI21hxfBy9WORiFOkl21mBRinJAYZTK+BMpGs84L17t+m83qTGc X-Gm-Gg: AR+sD12i/eY3zRPeRgCSMQUTm8e5Q+uqrGEouUMpIWlZvSuL3Gigavdk/8d3+4pq42H WNZ4auLz+1J1NEEL6bxzTZ/SZ5euhtgPJDYPoUvSrh78+dcI6rZo2eHz7WZJQ1SbJZ4iDcRFmzS uOncADojf5S3EZHEjOrlpp8w9e/6G/BIVMKSoMFZP5k7op0YUYaP/ptGEMJSmW4iyOtge8zFjj1 qjFUdje+C3pGnPGca5ujthSm8NNKC6tO0QYbl2ByPnX7pqPopLSAYtq62leJgUo5RAGt+LO7KF2 oB4NeKJhr2WcnUNtxc/JuAbx5aeBbai2zi7WSZn3oKY72mTxODsemAl/xnf2uzDzOof7glmmO4E 2x8O750KE/ctDAwqkVjt2rUhtiCmTn7Pkttuw5zHeT+9eYa4PGp8LZSPel0J1BsneDIQcyEqyOS g6VwFy/RNdsRqrkmsMRKrtmGh2+MHD8f/uKNRsza+2P4HTOMqfnL7PtTUw+fmJ X-Received: by 2002:a17:902:f68b:b0:2cf:32bc:971e with SMTP id d9443c01a7336-2cfa6c66618mr20561685ad.29.1784786904767; Wed, 22 Jul 2026 23:08:24 -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 d9443c01a7336-2cf8f390dd2sm26071285ad.79.2026.07.22.23.08.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 22 Jul 2026 23:08:24 -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 1/3] dt-bindings: watchdog: Add MA35D1 Watchdog binding Date: Thu, 23 Jul 2026 14:07:52 +0800 Message-Id: <20260723060755.1596858-2-zychennvt@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260723060755.1596858-1-zychennvt@gmail.com> References: <20260723060755.1596858-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 05:21:28 2026 Received: from mail-pl1-f180.google.com (mail-pl1-f180.google.com [209.85.214.180]) (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 BF4A8372673 for ; Thu, 23 Jul 2026 06:08:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.180 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784786909; cv=none; b=jwfEkw+VBT0mzTys8QXyultK61TfzACROzVG6V0TI81rC3+8lJQmqLOpvAB/xBUVEG90dgA7XdbXeV/39bcR8vU4DRZ6GDJaQFx0AdCJCSG87JQsRSvclJ/EoYZcyunI0vj6PFokm27yAluiqo8syaP/vldJLJZif2gLDrjTalE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784786909; c=relaxed/simple; bh=glkag6YepVngxtTaCB6w2w4JLFECULv8W7+KhdLjYhg=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=fM/Hxh0tebPIU5mLR0e4qEya9J0k/NQdjjqWgrnLdR2u1An5+/D8sO0BuA/mDQ3/IKexGDhKjNp5sDZHDBTzKiMFkrDGbH8fUdDtTHnY1S3JQYV5bJQe1CC2P2m9prbEBvaK8AsnF8f61inAHstVWWcXXem3Ax+M9Diqog0BFYA= 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=PLg66mYk; arc=none smtp.client-ip=209.85.214.180 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="PLg66mYk" Received: by mail-pl1-f180.google.com with SMTP id d9443c01a7336-2cce6a0c9c3so2986805ad.1 for ; Wed, 22 Jul 2026 23:08:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1784786907; x=1785391707; 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=6x2aOBje5frBTxDxT/OoHyn8yJc/gXKzhFg2I8WT5vE=; b=PLg66mYkQluFYf9nuK/6fU/vMfv7He+U3+Xo1A+2hfXha8sOfkbHEKpXk6z0v8afgL AdLgw18Uq/zIMi+7aG6wmsPGk0uQVnTgravN6nywa64UPxbwhk2G8eATAr5+hGWu/ojj h56ZllFvjfzxj+xvrDZqZnBrqyy3MN7SVBdRR4S5t2UoanuEccjDGvRLiGouSCVYk5g3 i3mJEDP/PBzk8+k3iMWFQw7+FNFuyuQA3WRmiqE1bojEfCqVC5t61kx1Ta4u5+JZ1mgB a3UBYFNR2U+8vGD3AfBtoPepIR4BJuD7rwgkhbgsBT887gA2mTa6/IpNoqfYJ72lGVDR cDOg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784786907; x=1785391707; 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=6x2aOBje5frBTxDxT/OoHyn8yJc/gXKzhFg2I8WT5vE=; b=hY7NZ3RU1nNTTQs2V8DR4ffUxalt0L+HZLq8UXw981osTZWNCtGfX1RWDO5eOW57Yi 88fsx4yxoJTXuarfyMHdkqaErRXWa+Xb/J3CD4/1yiS/I9FRNncsVoqtPWVz11Y5UroV E/9c0gC7icVnVgR/sq9ktAYapOkqYg5iwgddDES5U8EsFW1KIRE3gIgCL9Q5jdLCJUYl o3hXtGHz15Uw5omUJiKP/sN7uAP7zAQSiv2KykeNjNmVMOXdOqrPHPm7iTIlQnFrjga0 d+DUwTkWAIvg3cvGn0OtkwPNTM9unnmymMPmZ+KjKPWargVIjadWb/3lNFrt7SQRToiT Oilw== X-Forwarded-Encrypted: i=1; AHgh+Rolgh8hrgkfhAvQli3OYEQpL1EcYc9pjzKW7JfhZO+4Sdc70fslLGLeKdu7fCYkCtqLU7ZmDo8to6+8ITc=@vger.kernel.org X-Gm-Message-State: AOJu0YwHqvPrHaFgh0nXqMSlwQ7eFLRlVQz1wtlJXNfmW78z2qmEcDkz dEJUh08EPPmv4DTpZ7SKIC+nj1yNZ48cV2r8EJdvT2KcCdPKyXtbslOj X-Gm-Gg: AR+sD1058xPpy1wfuF9aM35hc+kcpBDxWO6qFOf/q9TPJ7eUb43XcANNhN6ps+TtVFl KrMbA1VAA/i9JkQRQZfDXoSv4Eus6kEWCGWbAWsiLuIneKbMyE5n5PfjUGuPjADWqMnT7SLhUzR 5t42cdtewybtyPaX9ww0FGgJZ2C0Wdp55kZUO29v+z7QxbxpdIhSA5UWVD9NvGMSvGwtoD+6y2N ZW3+agavs+LoCOobXTA+q03KTl4U+/EGkpob3ycGgtbDDuKzEm+MxBQ6x5RczBT1u4Gfta15igG aFMqDRiWbPpX+QvP5Wko0RPpuDIU0X6iqkM8z7tmhHCX3NrL3/syZ3ff5LVmtqTlqaMWHVwGA4H yxXgztV7ulOoLDuqrCAyLnN0DLEf1Aw/p7caOPbU/FwqNPKet1H36tK3ZppahzYziiAc68gMFvT c8EIMp0DQ8P6EgWXuGfr77qSndwurN8LD/4HBCY4JGl1dtiOy57FykkUpnLJa1 X-Received: by 2002:a17:902:cf42:b0:2c9:d298:6c06 with SMTP id d9443c01a7336-2cfa7091618mr23349475ad.25.1784786907130; Wed, 22 Jul 2026 23:08:27 -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 d9443c01a7336-2cf8f390dd2sm26071285ad.79.2026.07.22.23.08.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 22 Jul 2026 23:08:26 -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 2/3] watchdog: Add Nuvoton MA35D1 watchdog driver support Date: Thu, 23 Jul 2026 14:07:53 +0800 Message-Id: <20260723060755.1596858-3-zychennvt@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260723060755.1596858-1-zychennvt@gmail.com> References: <20260723060755.1596858-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 | 11 ++ drivers/watchdog/Makefile | 1 + drivers/watchdog/ma35d1_wdt.c | 357 ++++++++++++++++++++++++++++++++++ 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..28d8d3d12c27 100644 --- a/drivers/watchdog/Kconfig +++ b/drivers/watchdog/Kconfig @@ -720,6 +720,17 @@ 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 + select MFD_SYSCON + 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..bd52847bb09b --- /dev/null +++ b/drivers/watchdog/ma35d1_wdt.c @@ -0,0 +1,357 @@ +// 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; + struct device *dev; + spinlock_t lock; + void __iomem *wdt_base; + struct clk *clk; + unsigned long clk_rate; + u32 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(ma35d1_wdt->dev, "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 }; + + 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; + } + + if (i =3D=3D ARRAY_SIZE(toutsel_shifts)) + i =3D ARRAY_SIZE(toutsel_shifts) - 1; + + scoped_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); + } + + /* 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; + + dev_dbg(ma35d1_wdt->dev, "wdt_dev->timeout =3D %d\n", wdt_dev->timeout); + + return 0; +} + +static int ma35d1_wdt_start(struct watchdog_device *wdt_dev) +{ + unsigned int val; + + struct ma35d1_wdt_dev *ma35d1_wdt =3D watchdog_get_drvdata(wdt_dev); + void __iomem *wdt_base =3D ma35d1_wdt->wdt_base; + 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); + 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); + } + + 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 dev_pm_set_wake_irq(dev, ma35d1_wdt->irq); + if (ret) + return ret; + } + + 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(ma35d1_wdt->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(ma35d1_wdt->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 05:21:28 2026 Received: from mail-pl1-f178.google.com (mail-pl1-f178.google.com [209.85.214.178]) (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 1DA1F3A4F51 for ; Thu, 23 Jul 2026 06:08:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.178 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784786912; cv=none; b=VIrqmue/9F98ptsaiicAatb9GmKLk3P/UaWndfOFaT2kOTllYBMdTqZxXDYTejpuUHgkEPTqOcdr7iEtt3tA/u9E1Xd9pcJN8lkdiHNlimLPFavnM9ArYTt6cGz7If6IPqdlu7lwfxPQ8/U3Nlx/LIUIkq5XcjVzfZEtN5TR7wc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784786912; c=relaxed/simple; bh=yKkOBIWDLVzZbrFG3yiQLyXNfyi/iupP2ISmcl3yvxs=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=gbvOmT2gKzo0kS5DZdg3aMLDuAlkVuiUb0C++KBVaXW6YN3j0bSBmh0fOasySDYUILKL3GoFVvISTOTbQ4W5y5JJQHxBmJoSORyZc+2Hn8teYeFXFABgAe1YEOjXfTVaKEhlIfIz31AKjvT9HM8gxX548HayxG2ps5JAsT9Pmz4= 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=jIAeSBEy; arc=none smtp.client-ip=209.85.214.178 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="jIAeSBEy" Received: by mail-pl1-f178.google.com with SMTP id d9443c01a7336-2cf27856f9cso2917165ad.2 for ; Wed, 22 Jul 2026 23:08:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1784786909; x=1785391709; 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=jIAeSBEyIv6zcH+gH+U6/tv0Dc1Hy4ZmiER8FjFdQR0OxPwF2HpGxiBKG1JYKS6o29 J+EYFg+o24vlZdt40WFCfGrW2bc8btnREe1B66GqlH0dz/iGdwS73CUTbQvMib2C9Vo3 uo3um9rfvtjh7pBZhu4HoAvLW7KBB2+JOrM23n98BPudzbNsOCxVdUnvSjGetbZI1kBi bPWtMu5KNCU6gILo4brGqfIxqkUkOLTcXyv9pQrVt6BEH7gqz0NSgqxQ6xTTiYkr4Bgn LMy2p/XIryx2Cs7aWmmvGxZUoK13vzScNtxqF2AX4GWDfYUTVEWnQZZ0WavOQsGFll/n i5kw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784786909; x=1785391709; 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=LeSegR/0BD9jBMeXo8CWgYar/L7/kMOGrEFzXgCM8aR8uUo3332zFzba+V/MzqbewR 3hzlYyfaimNeBdhSNe1gUm9WbcHtqql/TWHTyQ/1vmWSOxUk5V4QUS6eh7I3kS4yFnOz ytvAwWNG9M9mjZqWx7oLA3RbOQidGSXYI1ofRcHzJZr0AKHRk80DoUwv7qb8inodI9bX zkm45b92a2aQpdpf2PcN6sdccSsvht8bKDQMGQE0rvilYKVB3rqAhOLHsTbOSOJ8j+bD gtAo2FEmkucBfeWd5OKabADCIIs0NAyVYEwbi3/Vmk6ap0O95LAZg0le4yqC/VQxp1II kKVg== X-Forwarded-Encrypted: i=1; AHgh+Rr++zMT5bJpsmCXZCAhIREa6QYpHo9Kw2wQmeOli+ifVe/uLyDIA2+R3JqO0h7R+BfD0sJ+aJX/VChAWeg=@vger.kernel.org X-Gm-Message-State: AOJu0YzRTxhT8FeojhETVCBWQPal4Z+cX499yyIoufbzE/JHyx8Qeq6p wIqmc1rSOfGrmzRgCKHPcOwSSC/PPTqCwHbAbWX8ErE/Z6oCX0EZy11W X-Gm-Gg: AR+sD13lodnIk2BolS+wmeXIBHIBaA7WYzn3hPmJIF9t5PQ9zCkXx2lLSEGX4Q2ZyjH QuJsyEhm+cu7Ihx/KCrHv4LzFUn1KiggVkIqieo5lnk78HMyABWCom9vLd4AQXpC9TMqCea/sl0 RkQWeo85bXBQq1gFtEYpktD+YKQNGo5ih9vDhqUuZtlVtPmRwA9dydpgBgFANkt7JB+zF7YkWV3 GpOaLO5FtXMQOb36fPnFbXnGFO3qu44xsLkv7O4Jb0Y/WVCGWfLHRf4EplrZtPTFOeYjDoEJNKs ICuxm/0ETAeJVdHBoVA8uYD1ts2Ipm/UhE7pOVMZYpLuVxz1v+Y3Cb2pv6LR3/M4qvgcdGpMekO 9bPwtXNn26MbJzGtNke8kMSKDU87cIgXbAcFUMW36cn7UvGC25sARg30tc+324h7iFop7Ws6zlB R3h2D3ZjO8gsx5NWx0QbiipjHQyGX7cErBDbKtWbB/Sdt5dJXHIZLgJPUsI4Ku X-Received: by 2002:a17:903:2444:b0:2ca:1eef:5096 with SMTP id d9443c01a7336-2cfa6c7206emr21250435ad.36.1784786909424; Wed, 22 Jul 2026 23:08:29 -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 d9443c01a7336-2cf8f390dd2sm26071285ad.79.2026.07.22.23.08.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 22 Jul 2026 23:08:29 -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 3/3] arm64: dts: nuvoton: Add WDT node for MA35D1 SoC Date: Thu, 23 Jul 2026 14:07:54 +0800 Message-Id: <20260723060755.1596858-4-zychennvt@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260723060755.1596858-1-zychennvt@gmail.com> References: <20260723060755.1596858-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