{"id":2221034,"url":"http://patchwork.ozlabs.org/api/1.1/patches/2221034/?format=json","web_url":"http://patchwork.ozlabs.org/project/linux-gpio/patch/20260408-dev-b4-aaeon-mcu-driver-v5-5-ad98bd481668@bootlin.com/","project":{"id":42,"url":"http://patchwork.ozlabs.org/api/1.1/projects/42/?format=json","name":"Linux GPIO development","link_name":"linux-gpio","list_id":"linux-gpio.vger.kernel.org","list_email":"linux-gpio@vger.kernel.org","web_url":"","scm_url":"","webscm_url":""},"msgid":"<20260408-dev-b4-aaeon-mcu-driver-v5-5-ad98bd481668@bootlin.com>","date":"2026-04-08T17:21:58","name":"[v5,5/5] watchdog: aaeon: Add watchdog driver for SRG-IMX8P MCU","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"7f74f5582d647eb55436bbab3c89890d939914a3","submitter":{"id":82054,"url":"http://patchwork.ozlabs.org/api/1.1/people/82054/?format=json","name":"Thomas Perrot (Schneider Electric)","email":"thomas.perrot@bootlin.com"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/linux-gpio/patch/20260408-dev-b4-aaeon-mcu-driver-v5-5-ad98bd481668@bootlin.com/mbox/","series":[{"id":499169,"url":"http://patchwork.ozlabs.org/api/1.1/series/499169/?format=json","web_url":"http://patchwork.ozlabs.org/project/linux-gpio/list/?series=499169","date":"2026-04-08T17:21:53","name":"Add support for AAEON SRG-IMX8P MCU","version":5,"mbox":"http://patchwork.ozlabs.org/series/499169/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/2221034/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2221034/checks/","tags":{},"headers":{"Return-Path":"\n <linux-gpio+bounces-34899-incoming=patchwork.ozlabs.org@vger.kernel.org>","X-Original-To":["incoming@patchwork.ozlabs.org","linux-gpio@vger.kernel.org"],"Delivered-To":"patchwork-incoming@legolas.ozlabs.org","Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=bootlin.com header.i=@bootlin.com header.a=rsa-sha256\n header.s=dkim header.b=z8unAsqB;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org\n (client-ip=2600:3c04:e001:36c::12fc:5321; helo=tor.lore.kernel.org;\n envelope-from=linux-gpio+bounces-34899-incoming=patchwork.ozlabs.org@vger.kernel.org;\n receiver=patchwork.ozlabs.org)","smtp.subspace.kernel.org;\n\tdkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com\n header.b=\"z8unAsqB\"","smtp.subspace.kernel.org;\n arc=none smtp.client-ip=185.171.202.116","smtp.subspace.kernel.org;\n dmarc=pass (p=reject dis=none) header.from=bootlin.com","smtp.subspace.kernel.org;\n spf=pass smtp.mailfrom=bootlin.com"],"Received":["from tor.lore.kernel.org (tor.lore.kernel.org\n [IPv6:2600:3c04:e001:36c::12fc:5321])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4frVKq1Bd8z1xv0\n\tfor <incoming@patchwork.ozlabs.org>; Thu, 09 Apr 2026 03:24:15 +1000 (AEST)","from smtp.subspace.kernel.org (conduit.subspace.kernel.org\n [100.90.174.1])\n\tby tor.lore.kernel.org (Postfix) with ESMTP id BF9F1307171D\n\tfor <incoming@patchwork.ozlabs.org>; Wed,  8 Apr 2026 17:22:52 +0000 (UTC)","from localhost.localdomain (localhost.localdomain [127.0.0.1])\n\tby smtp.subspace.kernel.org (Postfix) with ESMTP id B2E913D8905;\n\tWed,  8 Apr 2026 17:22:35 +0000 (UTC)","from smtpout-04.galae.net (smtpout-04.galae.net [185.171.202.116])\n\t(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby smtp.subspace.kernel.org (Postfix) with ESMTPS id EC5763D75D5;\n\tWed,  8 Apr 2026 17:22:33 +0000 (UTC)","from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233])\n\tby smtpout-04.galae.net (Postfix) with ESMTPS id 05BB4C5AAA8;\n\tWed,  8 Apr 2026 17:23:07 +0000 (UTC)","from mail.galae.net (mail.galae.net [212.83.136.155])\n\tby smtpout-01.galae.net (Postfix) with ESMTPS id AE170603CE;\n\tWed,  8 Apr 2026 17:22:32 +0000 (UTC)","from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon)\n with ESMTPSA id 195F51045019E;\n\tWed,  8 Apr 2026 19:22:29 +0200 (CEST)"],"ARC-Seal":"i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;\n\tt=1775668955; cv=none;\n b=pYfeoyRfHubMtXqAsc5/y3C1sw5YwUHsphtU2VIua8PuAJcJad3EJO8qGTOapVCmCf/aUNYdhrqWgBd+C8mxrAPrpeZjnSJRCexJrLr4XsUMrXhgxHe7NbTzXpajB/SiypKtW7aA2Q3YK7SKE8lrAoUvoR1+fzXC7UasANta8ZI=","ARC-Message-Signature":"i=1; a=rsa-sha256; d=subspace.kernel.org;\n\ts=arc-20240116; t=1775668955; c=relaxed/simple;\n\tbh=65QwNvr+I5OOmsYxfpRudawMxhKeDbuvLhOvIVdlggg=;\n\th=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References:\n\t In-Reply-To:To:Cc;\n b=H9EaQgrPf2t0pb4yaF/3hjpHppZtYCDTX8uw6G552v+jNnm2G7p9lIfM+FQrWTrX/3YTMrTzu9sId9yGHdxIwJ2sg13cDZqgu13c5KgdKy2nz2UrMyo3mDv47AEcR1sMnFDyv3riSa+lDo5SdoVgz8dV3OvaGbM7BOFnkF6Qukk=","ARC-Authentication-Results":"i=1; smtp.subspace.kernel.org;\n dmarc=pass (p=reject dis=none) header.from=bootlin.com;\n spf=pass smtp.mailfrom=bootlin.com;\n dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com\n header.b=z8unAsqB; arc=none smtp.client-ip=185.171.202.116","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim;\n\tt=1775668951; h=from:subject:date:message-id:to:cc:mime-version:content-type:\n\t content-transfer-encoding:in-reply-to:references;\n\tbh=qZhH8c6x0PEbv9p0RAqu0ezmUYM5PZZV4d1Q1ar4FwE=;\n\tb=z8unAsqBhcFq5Vp4lQHlWVnZSxrWvHScIDOYqqp+A+dS3QgjjtDHAxKDjuEx0sxx6Ntw8m\n\t/9p7zjSpikeOg/vfYZYTPmaqnAxKLigX/Sqh4Cy+ieb4WQ7IJlDRyLsFZM0CjTR8cipVBd\n\tisItGziOohCzTwkhA8OjWcXijOoRqFa02KLen0vqjAdvH7maZMF66u4S0a4lFFsVfzOBB8\n\tdGgEGIuM6i2daXd89VBetMT61jlXZbVRuJ2zPu+P4oL/+wjZn3oeZ0pflLVK85kJDBrbrV\n\t+Dn/hhvE5dZl4tMmiG7Kv4LHFaOrEoW8aepF3HLtlgyhJThYLzrtH4vLKklGqg==","From":"\"Thomas Perrot (Schneider Electric)\" <thomas.perrot@bootlin.com>","Date":"Wed, 08 Apr 2026 19:21:58 +0200","Subject":"[PATCH v5 5/5] watchdog: aaeon: Add watchdog driver for SRG-IMX8P\n MCU","Precedence":"bulk","X-Mailing-List":"linux-gpio@vger.kernel.org","List-Id":"<linux-gpio.vger.kernel.org>","List-Subscribe":"<mailto:linux-gpio+subscribe@vger.kernel.org>","List-Unsubscribe":"<mailto:linux-gpio+unsubscribe@vger.kernel.org>","MIME-Version":"1.0","Content-Type":"text/plain; charset=\"utf-8\"","Content-Transfer-Encoding":"8bit","Message-Id":"<20260408-dev-b4-aaeon-mcu-driver-v5-5-ad98bd481668@bootlin.com>","References":"<20260408-dev-b4-aaeon-mcu-driver-v5-0-ad98bd481668@bootlin.com>","In-Reply-To":"<20260408-dev-b4-aaeon-mcu-driver-v5-0-ad98bd481668@bootlin.com>","To":"Rob Herring <robh@kernel.org>, Krzysztof Kozlowski <krzk+dt@kernel.org>,\n  Conor Dooley <conor+dt@kernel.org>, Linus Walleij <linusw@kernel.org>,\n  Bartosz Golaszewski <brgl@kernel.org>, Shawn Guo <shawnguo@kernel.org>,\n  Sascha Hauer <s.hauer@pengutronix.de>,\n  Pengutronix Kernel Team <kernel@pengutronix.de>,\n  Fabio Estevam <festevam@gmail.com>,\n =?utf-8?b?SsOpcsOpbWllIERhdXRoZXJpYmVz?= <jeremie.dautheribes@bootlin.com>,\n  Wim Van Sebroeck <wim@linux-watchdog.org>,\n  Guenter Roeck <linux@roeck-us.net>, Lee Jones <lee@kernel.org>","Cc":"devicetree@vger.kernel.org, linux-kernel@vger.kernel.org,\n linux-gpio@vger.kernel.org, imx@lists.linux.dev,\n linux-arm-kernel@lists.infradead.org, linux-watchdog@vger.kernel.org,\n Thomas Petazzoni <thomas.petazzoni@bootlin.com>,\n Miquel Raynal <miquel.raynal@bootlin.com>,\n \"Thomas Perrot (Schneider Electric)\" <thomas.perrot@bootlin.com>","X-Mailer":"b4 0.14.3","X-Developer-Signature":"v=1; a=openpgp-sha256; l=6289;\n i=thomas.perrot@bootlin.com; h=from:subject:message-id;\n bh=65QwNvr+I5OOmsYxfpRudawMxhKeDbuvLhOvIVdlggg=;\n b=owEB7QES/pANAwAKAZ/ACwVx/grtAcsmYgBp1o7D023/jd70SBytcOY53H44Gff8aGs8jSBbo\n +a/5Eg1d1aJAbMEAAEKAB0WIQSHQHfGpqMKIwOoEiGfwAsFcf4K7QUCadaOwwAKCRCfwAsFcf4K\n 7Rx/C/9qKnMPOpRaDoSlA09ZRN0giYZatPJUexrNcHxuK8cjBp7y11zuq3C4s6O8QrilmBKw/Aw\n 9CYaXtm39Vdy2OWOKWAZA6TG3cA3/eiqsIdUo+OI93hbIW3LMyRMh9zlXKRoNkwfQFds4OAZe1C\n AU3TL8eKuUPdYFoJVd7lldprM14b2snHsFh6zZBpbj+49hwOViirfLN2Se57m/bDVdti3uZiRRh\n jb2wRfdz7ZxJlwCSIwSmsWN26FuFad417V+SI1+AbGTFd1oLdFiBruJg2qR4yh5sMsL3Kt7vbyq\n GdQeZEwjTVZOvWIQy7NmhtIejB5qDPLB4I8EwN39VU0Xe9bx3hzFMo5RVh3s5mX4yrKw5G6zKX4\n Y5Lg1DX7sFU8jKy+m+fPTNDAEzNJE9/ocw8rL1vSsokOiUFaHAPxnxuWdlwDEuIXFfywTMG9kGZ\n Q0fsKoWJlpZrlUt0qXONDKXTylsIx88zGYCLZQUGJ1KqNzkknFiG5qVJR0CT1Uh56i3Ds=","X-Developer-Key":"i=thomas.perrot@bootlin.com; a=openpgp;\n fpr=874077C6A6A30A2303A812219FC00B0571FE0AED","X-Last-TLS-Session-Version":"TLSv1.3"},"content":"Add watchdog driver for the Aaeon SRG-IMX8P embedded controller.\nThis driver provides system monitoring and recovery capabilities\nthrough the MCU's watchdog timer.\n\nThe watchdog supports start, stop, and ping operations with a maximum\nhardware heartbeat of 25 seconds and a default timeout of 240 seconds.\n\nCo-developed-by: Jérémie Dautheribes (Schneider Electric) <jeremie.dautheribes@bootlin.com>\nSigned-off-by: Jérémie Dautheribes (Schneider Electric) <jeremie.dautheribes@bootlin.com>\nSigned-off-by: Thomas Perrot (Schneider Electric) <thomas.perrot@bootlin.com>\n---\n MAINTAINERS                      |   1 +\n drivers/watchdog/Kconfig         |  10 +++\n drivers/watchdog/Makefile        |   1 +\n drivers/watchdog/aaeon_mcu_wdt.c | 132 +++++++++++++++++++++++++++++++++++++++\n 4 files changed, 144 insertions(+)","diff":"diff --git a/MAINTAINERS b/MAINTAINERS\nindex 2538f8c4bc14..7b92af42c9fd 100644\n--- a/MAINTAINERS\n+++ b/MAINTAINERS\n@@ -193,6 +193,7 @@ S:\tMaintained\n F:\tDocumentation/devicetree/bindings/mfd/aaeon,srg-imx8p-mcu.yaml\n F:\tdrivers/gpio/gpio-aaeon-mcu.c\n F:\tdrivers/mfd/aaeon-mcu.c\n+F:\tdrivers/watchdog/aaeon_mcu_wdt.c\n F:\tinclude/linux/mfd/aaeon-mcu.h\n \n AAEON UPBOARD FPGA MFD DRIVER\ndiff --git a/drivers/watchdog/Kconfig b/drivers/watchdog/Kconfig\nindex d3b9df7d466b..f67a0b453316 100644\n--- a/drivers/watchdog/Kconfig\n+++ b/drivers/watchdog/Kconfig\n@@ -420,6 +420,16 @@ config SL28CPLD_WATCHDOG\n \n # ARM Architecture\n \n+config AAEON_MCU_WATCHDOG\n+\ttristate \"Aaeon MCU Watchdog\"\n+\tdepends on MFD_AAEON_MCU\n+\tselect WATCHDOG_CORE\n+\thelp\n+\t  Select this option to enable watchdog timer support for the Aaeon\n+\t  SRG-IMX8P onboard microcontroller (MCU). This driver provides\n+\t  watchdog functionality through the MCU, allowing system monitoring\n+\t  and automatic recovery from system hangs.\n+\n config AIROHA_WATCHDOG\n \ttristate \"Airoha EN7581 Watchdog\"\n \tdepends on ARCH_AIROHA || COMPILE_TEST\ndiff --git a/drivers/watchdog/Makefile b/drivers/watchdog/Makefile\nindex ba52099b1253..2deec425d3ea 100644\n--- a/drivers/watchdog/Makefile\n+++ b/drivers/watchdog/Makefile\n@@ -37,6 +37,7 @@ obj-$(CONFIG_USBPCWATCHDOG) += pcwd_usb.o\n # ALPHA Architecture\n \n # ARM Architecture\n+obj-$(CONFIG_AAEON_MCU_WATCHDOG) += aaeon_mcu_wdt.o\n obj-$(CONFIG_ARM_SP805_WATCHDOG) += sp805_wdt.o\n obj-$(CONFIG_ARM_SBSA_WATCHDOG) += sbsa_gwdt.o\n obj-$(CONFIG_ARMADA_37XX_WATCHDOG) += armada_37xx_wdt.o\ndiff --git a/drivers/watchdog/aaeon_mcu_wdt.c b/drivers/watchdog/aaeon_mcu_wdt.c\nnew file mode 100644\nindex 000000000000..949b506d8194\n--- /dev/null\n+++ b/drivers/watchdog/aaeon_mcu_wdt.c\n@@ -0,0 +1,132 @@\n+// SPDX-License-Identifier: GPL-2.0-or-later\n+/*\n+ * Aaeon MCU Watchdog driver\n+ *\n+ * Copyright (C) 2026 Bootlin\n+ * Author: Jérémie Dautheribes <jeremie.dautheribes@bootlin.com>\n+ * Author: Thomas Perrot <thomas.perrot@bootlin.com>\n+ */\n+\n+#include <linux/mfd/aaeon-mcu.h>\n+#include <linux/module.h>\n+#include <linux/platform_device.h>\n+#include <linux/regmap.h>\n+#include <linux/watchdog.h>\n+\n+#define AAEON_MCU_PING_WDT\t0x73\n+\n+#define AAEON_MCU_WDT_TIMEOUT         240\n+#define AAEON_MCU_WDT_HEARTBEAT_MS    25000\n+\n+struct aaeon_mcu_wdt {\n+\tstruct watchdog_device wdt;\n+\tstruct regmap *regmap;\n+};\n+\n+static int aaeon_mcu_wdt_cmd(struct aaeon_mcu_wdt *data, u8 opcode, u8 arg)\n+{\n+\treturn regmap_write(data->regmap, AAEON_MCU_REG(opcode, arg), 0);\n+}\n+\n+static int aaeon_mcu_wdt_start(struct watchdog_device *wdt)\n+{\n+\tstruct aaeon_mcu_wdt *data = watchdog_get_drvdata(wdt);\n+\n+\treturn aaeon_mcu_wdt_cmd(data, AAEON_MCU_CONTROL_WDT_OPCODE, 0x01);\n+}\n+\n+static int aaeon_mcu_wdt_status(struct watchdog_device *wdt, bool *enabled)\n+{\n+\tstruct aaeon_mcu_wdt *data = watchdog_get_drvdata(wdt);\n+\tunsigned int rsp;\n+\tint ret;\n+\n+\tret = regmap_read(data->regmap,\n+\t\t\t  AAEON_MCU_REG(AAEON_MCU_CONTROL_WDT_OPCODE, 0x02),\n+\t\t\t  &rsp);\n+\tif (ret)\n+\t\treturn ret;\n+\n+\t*enabled = rsp == 0x01;\n+\treturn 0;\n+}\n+\n+static int aaeon_mcu_wdt_stop(struct watchdog_device *wdt)\n+{\n+\tstruct aaeon_mcu_wdt *data = watchdog_get_drvdata(wdt);\n+\n+\treturn aaeon_mcu_wdt_cmd(data, AAEON_MCU_CONTROL_WDT_OPCODE, 0x00);\n+}\n+\n+static int aaeon_mcu_wdt_ping(struct watchdog_device *wdt)\n+{\n+\tstruct aaeon_mcu_wdt *data = watchdog_get_drvdata(wdt);\n+\n+\treturn aaeon_mcu_wdt_cmd(data, AAEON_MCU_PING_WDT, 0x00);\n+}\n+\n+static const struct watchdog_info aaeon_mcu_wdt_info = {\n+\t.identity\t= \"Aaeon MCU Watchdog\",\n+\t.options\t= WDIOF_KEEPALIVEPING | WDIOF_MAGICCLOSE\n+};\n+\n+static const struct watchdog_ops aaeon_mcu_wdt_ops = {\n+\t.owner\t\t= THIS_MODULE,\n+\t.start\t\t= aaeon_mcu_wdt_start,\n+\t.stop\t\t= aaeon_mcu_wdt_stop,\n+\t.ping\t\t= aaeon_mcu_wdt_ping,\n+};\n+\n+static int aaeon_mcu_wdt_probe(struct platform_device *pdev)\n+{\n+\tstruct device *dev = &pdev->dev;\n+\tstruct watchdog_device *wdt;\n+\tstruct aaeon_mcu_wdt *data;\n+\tbool enabled;\n+\tint ret;\n+\n+\tdata = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);\n+\tif (!data)\n+\t\treturn -ENOMEM;\n+\n+\tdata->regmap = dev_get_regmap(dev->parent, NULL);\n+\tif (!data->regmap)\n+\t\treturn -ENODEV;\n+\n+\twdt = &data->wdt;\n+\twdt->parent = dev;\n+\twdt->info = &aaeon_mcu_wdt_info;\n+\twdt->ops = &aaeon_mcu_wdt_ops;\n+\t/*\n+\t * The MCU firmware has a fixed hardware timeout of 25 seconds that\n+\t * cannot be changed. The watchdog core will handle automatic pinging\n+\t * to support longer timeouts. The software timeout of 240 seconds is\n+\t * chosen arbitrarily as a reasonable value and is not user-configurable.\n+\t */\n+\twdt->timeout = AAEON_MCU_WDT_TIMEOUT;\n+\twdt->max_hw_heartbeat_ms = AAEON_MCU_WDT_HEARTBEAT_MS;\n+\n+\twatchdog_set_drvdata(wdt, data);\n+\n+\tret = aaeon_mcu_wdt_status(wdt, &enabled);\n+\tif (ret)\n+\t\treturn ret;\n+\n+\tif (enabled)\n+\t\tset_bit(WDOG_HW_RUNNING, &wdt->status);\n+\n+\treturn devm_watchdog_register_device(dev, wdt);\n+}\n+\n+static struct platform_driver aaeon_mcu_wdt_driver = {\n+\t.driver\t\t= {\n+\t\t.name\t= \"aaeon-mcu-wdt\",\n+\t},\n+\t.probe\t\t= aaeon_mcu_wdt_probe,\n+};\n+\n+module_platform_driver(aaeon_mcu_wdt_driver);\n+\n+MODULE_DESCRIPTION(\"Aaeon MCU Watchdog Driver\");\n+MODULE_AUTHOR(\"Jérémie Dautheribes <jeremie.dautheribes@bootlin.com>\");\n+MODULE_LICENSE(\"GPL\");\n","prefixes":["v5","5/5"]}