From nobody Sat Feb 7 10:14:49 2026 Received: from smtpout-02.galae.net (smtpout-02.galae.net [185.246.84.56]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9FFF53803DF; Fri, 23 Jan 2026 09:54:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.246.84.56 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769162100; cv=none; b=e5no1TNr4p1SH5Q8Ca2gRH4lIsGUd9cA4UuSpMSBVJtbTL3LqxJsLLtS3QZzqyNrq72qsAoun/LD1W9KXiBJYa8lHNNcrvF36pXsSFkJpyN64W50jsDmRxEKZaEFTqMA3+HBp9KNzHRVkLaIAX3Q9iVEVa42YqLZg8ROyNUzTVs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769162100; c=relaxed/simple; bh=csO7fJLjqTP5V/c20DV8fnDFkCku7x86gfcOjMPl5Yw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=n7H6R5Sx5Zt/m2bWmszcjwFWYLl6uzqNLlzQ5u+qZYXMSD3/l9Yfyo5dFDrKbR6gYlbDwyNC9DSb3e5i7LQeZU/dU+QnBBare7uF0QZheGHHZWk2JM+B4B3qU/3fjd0vwK4Ghpxr+aMxtHr/9G49Dn+ijpoa/EwscTIIgjtGmwY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=rdMgpe8D; arc=none smtp.client-ip=185.246.84.56 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="rdMgpe8D" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id BEED01A2B16; Fri, 23 Jan 2026 09:54:51 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 94B816070A; Fri, 23 Jan 2026 09:54:51 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 540DA119A87A3; Fri, 23 Jan 2026 10:54:48 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1769162090; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=EyC/GAu9DTSmLmeOK++rR8PfBg5itQ+kpE8oyjTPF8I=; b=rdMgpe8DHm7olxNrC6vmAgBTwuliGEyrizi7QRt/FZ1SAuOsm0isnkAsP7UQhI6LULu7Un U7dDZt0Td4nKM6ZKLLvkO/F7AvtXwNcOqLLamYMFpYvT54gT5z4I3+DD/AFCIYyQ3g1Lmk jKDP03mUqomKe2eysLra4rr3Jepcp9RdZ4JUXWLpNn7ZyLPuqM1kV7sve8hBGN0aESJi7g hJJPOW9j7IMOu8FYg09/FwJXnOAolWjMLXdh09q4v0uZWXyNkEdqPk8kqjYupi+rCli6ZM YpMdc8O4XwGg0JSg9bC+yJ13jHegdPrG/PL/70fDSJGiy44K90zOKBfSkrqHyA== From: "Thomas Perrot (Schneider Electric)" Date: Fri, 23 Jan 2026 10:54:30 +0100 Subject: [PATCH v2 1/5] dt-bindings: vendor-prefixes: Add AAEON vendor prefix Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260123-dev-b4-aaeon-mcu-driver-v2-1-9f4c00bfb5cb@bootlin.com> References: <20260123-dev-b4-aaeon-mcu-driver-v2-0-9f4c00bfb5cb@bootlin.com> In-Reply-To: <20260123-dev-b4-aaeon-mcu-driver-v2-0-9f4c00bfb5cb@bootlin.com> To: Rob Herring , Krzysztof Kozlowski , Conor Dooley , Linus Walleij , Bartosz Golaszewski , Shawn Guo , Sascha Hauer , Pengutronix Kernel Team , Fabio Estevam , =?utf-8?q?J=C3=A9r=C3=A9mie_Dautheribes?= , Wim Van Sebroeck , Guenter Roeck , Lee Jones Cc: devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-gpio@vger.kernel.org, imx@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-watchdog@vger.kernel.org, Thomas Petazzoni , "Thomas Perrot (Schneider Electric)" , Krzysztof Kozlowski X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=973; i=thomas.perrot@bootlin.com; h=from:subject:message-id; bh=csO7fJLjqTP5V/c20DV8fnDFkCku7x86gfcOjMPl5Yw=; b=owEB7QES/pANAwAKAZ/ACwVx/grtAcsmYgBpc0VjQ4rcAr8t5AlHqZfWDczWyk7dJWQSMM+h1 mQKN84z2leJAbMEAAEKAB0WIQSHQHfGpqMKIwOoEiGfwAsFcf4K7QUCaXNFYwAKCRCfwAsFcf4K 7fYTC/9OF4L7uuwIvqZr8yw9EfckD2MgCHRhIDg+26Fe5w9DgIfLD+sk7tVXPEMeCrWYY0daq8l 3+8+ujdjsCghOkVPGJlqjUFcGtZQSC1kEka8k6B9ehu4uixBrzW2uYUxO+oXVXynEguq06U/90p iQkWCZ7Ilv0Xzt7/BDteL1MM5zSB17HvSNka4CJ8irMQUylGBnrJdervlxdw1KM8UWyuGxhHYa6 2FLtJl5wpoRd8kjGwb/2rMz0jt1+vJdhASygtXhGzbYBPTx9bveeB4xPUG5Qp/XKCAPYObvhcYp Ifj9nlxL5p065MxpxY+2ru6TFZFornWLEmhHVM876BzBC/OgHdZKqD+Xarqs2YQYQoZqyTeTibO Jgf10ZdCk7BFKpdfsYdpuRHxJ/JAAqf6xbCoHm8WDt9dUxXRhK3/hRtihw9adG0mATyQ9f6Fnm8 yUwdYMbTpVaopSV4nxNh/TTsZVprsdeg1p3aIhMqz1wkdo4LfpO4bGZfbyjbpl8hRwF2E= X-Developer-Key: i=thomas.perrot@bootlin.com; a=openpgp; fpr=874077C6A6A30A2303A812219FC00B0571FE0AED X-Last-TLS-Session-Version: TLSv1.3 Add the AAEON vendor prefix to support the AAEON SRG-IMX8PL MCU driver devicetree bindings. Acked-by: Krzysztof Kozlowski Signed-off-by: Thomas Perrot (Schneider Electric) --- Documentation/devicetree/bindings/vendor-prefixes.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Documentation/devicetree/bindings/vendor-prefixes.yaml b/Docum= entation/devicetree/bindings/vendor-prefixes.yaml index c7591b2aec2a74560a4f687fe7a2070ca21b0752..0f84ee93b3a8473719ee92f8c04= 6e350c4a20825 100644 --- a/Documentation/devicetree/bindings/vendor-prefixes.yaml +++ b/Documentation/devicetree/bindings/vendor-prefixes.yaml @@ -32,6 +32,8 @@ patternProperties: description: 8devices, UAB "^9tripod,.*": description: Shenzhen 9Tripod Innovation and Development CO., LTD. + "^aaeon,.*": + description: AAEON "^abb,.*": description: ABB "^abilis,.*": --=20 2.52.0 From nobody Sat Feb 7 10:14:49 2026 Received: from smtpout-02.galae.net (smtpout-02.galae.net [185.246.84.56]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9B0C237AA9C; Fri, 23 Jan 2026 09:54:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.246.84.56 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769162112; cv=none; b=px3JNAApSptUq6AUxFmanna++u5rWnyM1qFu9XZIiDNn2XzeYan7PgRw31NjTKMebrO8B3LHuaFVodSwq8JNaZtDA8Us6Ao4k7972PGNVAe9Sc67fvlgRJnQJb+CBnG04S/rIYZR6TQRIiVDGpXl4i4lkNC9/YhNcCyH6VGbLJ4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769162112; c=relaxed/simple; bh=bu/rGz3MhaajWznLgOEciCHSKUCgeTXMKmrL1OPdgkM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=EWV72zETN5AGNcqzdNfCI7dqWLeW2q6RXFVfNg0QVVkFxEEPsSDkXmlpe4mv/FF7CNkmo1vJOk2Jou0jNppgniOh0p5Hupbl9CV337fn3S/iSTO5bnz2Id6AoMGuWhGkR1Fpmg4kFoZCLmEzvu9lhyrl3nQwDHgjfmlMGRA6aXs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=yEuuZRr3; arc=none smtp.client-ip=185.246.84.56 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="yEuuZRr3" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id 333261A2B17; Fri, 23 Jan 2026 09:54:54 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 083466070A; Fri, 23 Jan 2026 09:54:54 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id C4BFE119A87A4; Fri, 23 Jan 2026 10:54:50 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1769162092; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=iQsPBKPunW2HAhagUIukzpmsZpN0tQ18iuvsF7KTtx8=; b=yEuuZRr39/8EWTov4sVs8lOn0NUO/Reqlv/1PGRpEc47bOWY4VYLEEh8i1yvuuQBIa2HFV tVLZp++x/PJMXgnfw7zLq7qch3Z5dQUL56S4tzCFNUJQRXrU3gn/mTSZjFk0zRSjjxCpTF UKdjvNm/AfSCu0HxPR2qXJjLEW0o8Og21gowc1H6DVy1zFWMl6tUM+DREW7k6EsML7hhRd 7rgjnfoPW5c2qHWRNq9B1SfymAA08l6I1MWQDtWyfCQjArcIIWhvaFrzqqtDbElAtv5MSQ qWgvATi01qFI+vrRrRybPmxp405YxLgy7zxpUKg8Y0Qn+rbZi/mjJgNWDhJtZw== From: "Thomas Perrot (Schneider Electric)" Date: Fri, 23 Jan 2026 10:54:31 +0100 Subject: [PATCH v2 2/5] dt-bindings: mfd: Add AAEON embedded controller Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260123-dev-b4-aaeon-mcu-driver-v2-2-9f4c00bfb5cb@bootlin.com> References: <20260123-dev-b4-aaeon-mcu-driver-v2-0-9f4c00bfb5cb@bootlin.com> In-Reply-To: <20260123-dev-b4-aaeon-mcu-driver-v2-0-9f4c00bfb5cb@bootlin.com> To: Rob Herring , Krzysztof Kozlowski , Conor Dooley , Linus Walleij , Bartosz Golaszewski , Shawn Guo , Sascha Hauer , Pengutronix Kernel Team , Fabio Estevam , =?utf-8?q?J=C3=A9r=C3=A9mie_Dautheribes?= , Wim Van Sebroeck , Guenter Roeck , Lee Jones Cc: devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-gpio@vger.kernel.org, imx@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-watchdog@vger.kernel.org, Thomas Petazzoni , "Thomas Perrot (Schneider Electric)" X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=3095; i=thomas.perrot@bootlin.com; h=from:subject:message-id; bh=bu/rGz3MhaajWznLgOEciCHSKUCgeTXMKmrL1OPdgkM=; b=owEB7QES/pANAwAKAZ/ACwVx/grtAcsmYgBpc0Vjlnpb1Zj8yHgaB44y8Q4HE8ao3GhllBMVd 88O+M5Lbl+JAbMEAAEKAB0WIQSHQHfGpqMKIwOoEiGfwAsFcf4K7QUCaXNFYwAKCRCfwAsFcf4K 7azDC/9O03mPqnCCNglsW3Cm342CIzwwud7A2DLA2beGLvhCH4Mr4oT70Lb5OxRHBEHtoV8o5oU ToHutcb5gkXjcX4eRHnhcVaO5+CmqGfr1ZR6k4ZgYDANmOwzde4pA0PgeJBNoncZaz1O/pG6n+J 0FLmbfF6u0TAxE5CUgs6F0ugYRS6Cc1g/VIKcdszyKx9KQgYp0jc3UpgllLjfODxq/C1vCUq3UO 63I7wXO9L3scytojLvx+H6kNsiJjM3qMnWDNZ8YxRcgEYpbyIORAgCPkAEliwvSFcQzqt514g+h ypSxh3FCZ2T0EyOfIer0zFzsVQNq9YJYHBSUW4zTxObwzOLPuueKNZ5TQ9zSMsPfyPEBaD5QGUt D6mD7JMmbZ1PfZAjCZLaC5pnQc3kCz8UEgBjEloi1VqZkJwMhb8wTGCcX6vgnReGLLaa6cs1vJc U/14k//mM/pJAaxxh9nCyX++YUKHlinQmx8SZEE3okssc31UoqWIAd40DaoGyaLMqLGUc= X-Developer-Key: i=thomas.perrot@bootlin.com; a=openpgp; fpr=874077C6A6A30A2303A812219FC00B0571FE0AED X-Last-TLS-Session-Version: TLSv1.3 Add device tree binding documentation for the AAEON embedded controller (MCU). This microcontroller is found on AAEON embedded boards, it is connected via I2C and and provides a GPIO control and watchdog timer. Signed-off-by: Thomas Perrot (Schneider Electric) --- .../bindings/mfd/aaeon,srg-imx8pl-mcu.yaml | 56 ++++++++++++++++++= ++++ MAINTAINERS | 6 +++ 2 files changed, 62 insertions(+) diff --git a/Documentation/devicetree/bindings/mfd/aaeon,srg-imx8pl-mcu.yam= l b/Documentation/devicetree/bindings/mfd/aaeon,srg-imx8pl-mcu.yaml new file mode 100644 index 0000000000000000000000000000000000000000..b8eb5bf88853b6eb3d31841e1f6= d6acd4b776bd4 --- /dev/null +++ b/Documentation/devicetree/bindings/mfd/aaeon,srg-imx8pl-mcu.yaml @@ -0,0 +1,56 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/mfd/aaeon,srg-imx8pl-mcu.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: AAEON Embedded Controller + +maintainers: + - J=C3=A9r=C3=A9mie Dautheribes + - Thomas Perrot + +description: + AAEON embeds a microcontroller on Standard RISC Gateway with ARM i.MX8M = Plus + Quad-Core boards providing GPIO control and watchdog timer. + + This MCU is connected via I2C bus. + + Its GPIO controller provides 7 GPOs and 12 GPIOs. + + Its watchdog has a fixed maximum hardware heartbeat of 25 seconds and su= pports + a timeout of 240 seconds through automatic pinging. + The timeout is not programmable and cannot be changed via device tree pr= operties. + +properties: + compatible: + const: aaeon,srg-imx8pl-mcu + + reg: + maxItems: 1 + +required: + - compatible + - reg + +additionalProperties: false + +examples: + - | + i2c { + #address-cells =3D <1>; + #size-cells =3D <0>; + + aaeon_mcu: embedded-controller@62 { + compatible =3D "aaeon,srg-imx8pl-mcu"; + reg =3D <0x62>; + + gpio-controller; + #gpio-cells =3D <2>; + gpio-line-names =3D "gpo-1", "gpo-2", "gpo-3", "gpo-4", + "gpo-5", "gpo-6", "gpo-7", + "gpio-1", "gpio-2", "gpio-3", "gpio-4", + "gpio-5", "gpio-6", "gpio-7", "gpio-8", + "gpio-9", "gpio-10", "gpio-11", "gpio-12"; + }; + }; diff --git a/MAINTAINERS b/MAINTAINERS index c9e416ba74c64e90629c0b7d7941f879c9ac589e..10f7d5b183795376b3fcdedc9c3= 835eecb9d0a3b 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -186,6 +186,12 @@ W: http://www.adaptec.com/ F: Documentation/scsi/aacraid.rst F: drivers/scsi/aacraid/ =20 +AAEON SRG-IMX8PL CONTROLLER MFD DRIVER +M: Thomas Perrot +R: J=C3=A9r=C3=A9mie Dautheribes +S: Maintained +F: Documentation/devicetree/bindings/mfd/aaeon,srg-imx8pl-mcu.yaml + AAEON UPBOARD FPGA MFD DRIVER M: Thomas Richard S: Maintained --=20 2.52.0 From nobody Sat Feb 7 10:14:49 2026 Received: from smtpout-02.galae.net (smtpout-02.galae.net [185.246.84.56]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C38D337AA6A for ; Fri, 23 Jan 2026 09:54:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.246.84.56 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769162110; cv=none; b=cy4e2tu7tK5V2eH+ceQXfnDF+hxPGPKqtWwUU8U6Kc6nb/7lZi5eiFuKCWYQc3rseSrQ4UE1CkWeBn/IXQM7h9V7+C2DrfF1vei+FaNgPLpuK/xqDMb1BDL45huUFIX68+Kekkaymv4W2oSx7RsskKcLCmrpTDgmV4BXmv7OFVg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769162110; c=relaxed/simple; bh=2jQAU8PZ36wRhzQAA4HmvuTMuMEUrPlyUdqbYeQTm2w=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=cKjOJog7eFgCW51k5H0lnb7irkgtOBNuhgW2NW54A/qRz2tS3SvR//3TrGnQn47JTNlV/RbAlkXmJftLZzwCnuR4lvKKIpHAjZ81iIfz1FIyOtHW4aq+wvpHUfBH9v3t6dPA+ZZcw5SIjxucDJzriake8TSUibUahFatK2y4pxY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=ydk61KpW; arc=none smtp.client-ip=185.246.84.56 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="ydk61KpW" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id 02D281A2B18; Fri, 23 Jan 2026 09:54:56 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id CC6516070A; Fri, 23 Jan 2026 09:54:55 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 17948119A87A5; Fri, 23 Jan 2026 10:54:53 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1769162094; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=5TAztR/SKkxFL9LrFN/vZ3+wYKAD6G2KcgcKxu7a/Y4=; b=ydk61KpWorIcazjx/CCWr81dtORy2Ga12nZ1s+WeuBgU0kKYIok4hpT76N4qFCn+NXdpxh r7P58cpcMCDl1QzvOa9yP722QfNME+SEQIF07HKi5NWF5FAA8czxkedir8OwbDVsDLCRWH Zq1xVqY7auaAV5Sfd59rGVkEUVewXpNzPGmDp76MoBaih1QnUICAWGp/HnyAOtEKxHajDw KAkdpRnzQ9cgd9XezVsfHmI4vBPdL9SYjdy3sWLvCHxeoAyhLiFwPbaBIcQ/9GRIuIwKT0 g1qwFj0Xof4wHnzXkVWI2ydeiQFT//+XNYfC/26Dl3/T3gpAq+lR3IVu/zc/ig== From: "Thomas Perrot (Schneider Electric)" Date: Fri, 23 Jan 2026 10:54:32 +0100 Subject: [PATCH v2 3/5] mfd: aaeon: Add SRG-IMX8PL MCU driver Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260123-dev-b4-aaeon-mcu-driver-v2-3-9f4c00bfb5cb@bootlin.com> References: <20260123-dev-b4-aaeon-mcu-driver-v2-0-9f4c00bfb5cb@bootlin.com> In-Reply-To: <20260123-dev-b4-aaeon-mcu-driver-v2-0-9f4c00bfb5cb@bootlin.com> To: Rob Herring , Krzysztof Kozlowski , Conor Dooley , Linus Walleij , Bartosz Golaszewski , Shawn Guo , Sascha Hauer , Pengutronix Kernel Team , Fabio Estevam , =?utf-8?q?J=C3=A9r=C3=A9mie_Dautheribes?= , Wim Van Sebroeck , Guenter Roeck , Lee Jones Cc: devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-gpio@vger.kernel.org, imx@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-watchdog@vger.kernel.org, Thomas Petazzoni , "Thomas Perrot (Schneider Electric)" X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=7158; i=thomas.perrot@bootlin.com; h=from:subject:message-id; bh=2jQAU8PZ36wRhzQAA4HmvuTMuMEUrPlyUdqbYeQTm2w=; b=owEB7QES/pANAwAKAZ/ACwVx/grtAcsmYgBpc0VjlsheaQ05e/WPXMkNvPJ9swDiN6f5FMzbw teXgN8cWXCJAbMEAAEKAB0WIQSHQHfGpqMKIwOoEiGfwAsFcf4K7QUCaXNFYwAKCRCfwAsFcf4K 7Z1iC/9h5RK4Fa44MB5aIDlVR8YnH8ITIfQoigJ50M0gN+VHZV2i7a6XX0zNKCsA7POE7wOm5Md 7NT+Zlg2vxw1PUSw95ou10HMO0E45iw0mnILKbAGtIkVzupE21KrFKxf1zysIcipnbZE4Wk3usG cixlDqnjnMDynyRwGinSgocR0WD4FVSfJszdddvjmEotItvuEBEXhghAxNQexeA1TWv4seLtzNH rHgJorRnCKxalasVgwgkIRp+DUv23ECUN+2jxFwtgx1+4Ds3aVtbHUrUVmCfSmVXpXvkZ6LxGq2 j4zMOrA3ywlGKz6N4EHF64JjYe1yaOBcbMwrTyb94xHO8cSo+FC+DpsT3VBh4qz2LSMU5eDeOVY 3eu2w9eX/AwLDS/uN86P7pfH0R8L59UxfdypWKLFPpJaMXCKaIK7AnpMhGm10dzIWi0DhfvKZTX wYWKFlcVhelWCOTNdKbmBYGi957Af9FEC/kVLYuEhWGfj00+Pj/+ZzAa8pfuoGd5/o1zU= X-Developer-Key: i=thomas.perrot@bootlin.com; a=openpgp; fpr=874077C6A6A30A2303A812219FC00B0571FE0AED X-Last-TLS-Session-Version: TLSv1.3 Add Multi-Function Device (MFD) driver for the Aaeon SRG-IMX8PL embedded controller. This driver provides the core I2C communication interface and registers child devices (GPIO and watchdog controllers). The MCU firmware version is queried during probe and logged for diagnostic purposes. All I2C transactions are serialized using a mutex to ensure proper communication with the microcontroller. Co-developed-by: J=C3=A9r=C3=A9mie Dautheribes (Schneider Electric) Signed-off-by: J=C3=A9r=C3=A9mie Dautheribes (Schneider Electric) Signed-off-by: Thomas Perrot (Schneider Electric) --- MAINTAINERS | 2 + drivers/mfd/Kconfig | 9 +++ drivers/mfd/Makefile | 2 + drivers/mfd/aaeon-mcu.c | 129 ++++++++++++++++++++++++++++++++++++++= ++++ include/linux/mfd/aaeon-mcu.h | 31 ++++++++++ 5 files changed, 173 insertions(+) diff --git a/MAINTAINERS b/MAINTAINERS index 10f7d5b183795376b3fcdedc9c3835eecb9d0a3b..175c1e1b28b8151580ed340207d= 4a6fd59aa8853 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -191,6 +191,8 @@ M: Thomas Perrot R: J=C3=A9r=C3=A9mie Dautheribes S: Maintained F: Documentation/devicetree/bindings/mfd/aaeon,srg-imx8pl-mcu.yaml +F: drivers/mfd/aaeon-mcu.c +F: include/linux/mfd/aaeon-mcu.h =20 AAEON UPBOARD FPGA MFD DRIVER M: Thomas Richard diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig index aace5766b38aa5e46e32a8a7b42eea238159fbcf..befcc36c12931b273e8e45fe968= e9556514fb959 100644 --- a/drivers/mfd/Kconfig +++ b/drivers/mfd/Kconfig @@ -1574,6 +1574,15 @@ config AB8500_CORE the irq_chip parts for handling the Mixed Signal chip events. This chip embeds various other multimedia functionalities as well. =20 +config MFD_AAEON_MCU + tristate "Aaeon SRG-IMX8PL MCU Driver" + depends on I2C + help + Select this option to enable support for the Aaeon SRG-IMX8PL + onboard microcontroller (MCU). This driver provides the core + functionality to communicate with the MCU over I2C. The MCU + provides GPIO and watchdog functionality. + config MFD_DB8500_PRCMU bool "ST-Ericsson DB8500 Power Reset Control Management Unit" depends on UX500_SOC_DB8500 diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile index e75e8045c28afae975ac61d282b3b85af5440119..0bc3a10c787c55730131224fc10= 53fe35657dd71 100644 --- a/drivers/mfd/Makefile +++ b/drivers/mfd/Makefile @@ -304,3 +304,5 @@ obj-$(CONFIG_MFD_RSMU_SPI) +=3D rsmu_spi.o rsmu_core.o obj-$(CONFIG_MFD_UPBOARD_FPGA) +=3D upboard-fpga.o =20 obj-$(CONFIG_MFD_LOONGSON_SE) +=3D loongson-se.o + +obj-$(CONFIG_MFD_AAEON_MCU) +=3D aaeon-mcu.o diff --git a/drivers/mfd/aaeon-mcu.c b/drivers/mfd/aaeon-mcu.c new file mode 100644 index 0000000000000000000000000000000000000000..b496fb6618ca49296c574531b77= 8fcbb653a48f5 --- /dev/null +++ b/drivers/mfd/aaeon-mcu.c @@ -0,0 +1,129 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Aaeon MCU driver + * + * Copyright (C) 2025 Bootlin + * Author: J=C3=A9r=C3=A9mie Dautheribes + * Author: Thomas Perrot + */ + +#include +#include +#include +#include +#include + +#define AAEON_MCU_FW_VERSION 0x76 + +static struct mfd_cell aaeon_mcu_devs[] =3D { + { + .name =3D "aaeon-mcu-wdt", + }, + { + .name =3D "aaeon-mcu-gpio", + }, +}; + +static int aaeon_mcu_read_version(struct device *dev, u8 index, u8 *versio= n) +{ + u8 cmd[3] =3D { AAEON_MCU_FW_VERSION, index, 0x00 }; + + return aaeon_mcu_i2c_xfer(dev, cmd, sizeof(cmd), version, sizeof(*version= )); +} + +static int aaeon_mcu_print_fw_version(struct i2c_client *client) +{ + struct device *dev =3D &client->dev; + u8 major, minor; + int ret; + + ret =3D aaeon_mcu_read_version(dev, 0x00, &major); + if (ret) + return ret; + + ret =3D aaeon_mcu_read_version(dev, 0x01, &minor); + if (ret) + return ret; + + dev_info(dev, "firmware version: v%d.%d\n", major, minor); + + return 0; +} + +int aaeon_mcu_i2c_xfer(struct device *dev, + const u8 *cmd, int cmd_len, + u8 *rsp, int rsp_len) +{ + struct i2c_client *client =3D to_i2c_client(dev); + struct aaeon_mcu_dev *mcu =3D i2c_get_clientdata(client); + int ret; + + mutex_lock(&mcu->i2c_lock); + + ret =3D i2c_master_send(client, cmd, cmd_len); + if (ret < 0) + goto unlock; + + ret =3D i2c_master_recv(client, rsp, rsp_len); + if (ret < 0) + goto unlock; + + if (ret !=3D rsp_len) { + dev_err(dev, + "i2c recv count error (expected: %d, actual: %d)\n", + rsp_len, ret); + ret =3D -EIO; + goto unlock; + } + + ret =3D 0; + +unlock: + mutex_unlock(&mcu->i2c_lock); + return ret; +} +EXPORT_SYMBOL_GPL(aaeon_mcu_i2c_xfer); + +static int aaeon_mcu_probe(struct i2c_client *client) +{ + struct aaeon_mcu_dev *mcu; + int ret; + + mcu =3D devm_kzalloc(&client->dev, sizeof(*mcu), GFP_KERNEL); + if (!mcu) + return -ENOMEM; + + i2c_set_clientdata(client, mcu); + mcu->dev =3D &client->dev; + mutex_init(&mcu->i2c_lock); + + ret =3D aaeon_mcu_print_fw_version(client); + if (ret) { + dev_err(&client->dev, "unable to read firmware version\n"); + return ret; + } + + return devm_mfd_add_devices(mcu->dev, PLATFORM_DEVID_NONE, aaeon_mcu_devs, + ARRAY_SIZE(aaeon_mcu_devs), NULL, 0, NULL); +} + +static const struct of_device_id aaeon_mcu_of_match[] =3D { + { .compatible =3D "aaeon,srg-imx8pl-mcu" }, + {}, +}; + +MODULE_DEVICE_TABLE(of, aaeon_mcu_of_match); + +static struct i2c_driver aaeon_mcu_driver =3D { + .driver =3D { + .name =3D "aaeon_mcu", + .of_match_table =3D aaeon_mcu_of_match, + }, + .probe =3D aaeon_mcu_probe, +}; + +module_i2c_driver(aaeon_mcu_driver); + +MODULE_DESCRIPTION("Aaeon MCU Driver"); +MODULE_AUTHOR("J=C3=A9r=C3=A9mie Dautheribes "); +MODULE_LICENSE("GPL"); diff --git a/include/linux/mfd/aaeon-mcu.h b/include/linux/mfd/aaeon-mcu.h new file mode 100644 index 0000000000000000000000000000000000000000..c9dc7a9adbc86c489f03a550e77= 76d3b1da4e7b2 --- /dev/null +++ b/include/linux/mfd/aaeon-mcu.h @@ -0,0 +1,31 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Aaeon MCU driver definitions + * + * Copyright (C) 2025 Bootlin + * Author: J=C3=A9r=C3=A9mie Dautheribes + * Author: Thomas Perrot + */ + +#ifndef __LINUX_MFD_AAEON_MCU_H +#define __LINUX_MFD_AAEON_MCU_H + +#include +#include + +/** + * struct aaeon_mcu_dev - Internal representation of the Aaeon MCU + * @dev: Pointer to kernel device structure + * @i2c_lock: Mutex to serialize I2C bus access + */ + +struct aaeon_mcu_dev { + struct device *dev; + struct mutex i2c_lock; +}; + +int aaeon_mcu_i2c_xfer(struct device *dev, + const u8 *cmd, int cmd_len, + u8 *rsp, int rsp_len); + +#endif /* __LINUX_MFD_AAEON_MCU_H */ --=20 2.52.0 From nobody Sat Feb 7 10:14:49 2026 Received: from smtpout-02.galae.net (smtpout-02.galae.net [185.246.84.56]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6501137D122; Fri, 23 Jan 2026 09:55:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.246.84.56 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769162114; cv=none; b=hjXLzIIEJ63xtwxwVRb0XzgHLTlDKux2+ncjlubSTEu4DstKT6strZvUZb3wQnQq0eDGZ+xdX51did4eLdiVxlm2xzCny70Z6PPxYzj2BO4QEYGZHzUjnQkSskX77UnhoOnWNx4K5khpo9kJqhXR6BrzMjZpQjjWvQiYGZ4iQDE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769162114; c=relaxed/simple; bh=+kvLjJ8qVu0U6ba+Of8WjhJZQRzBbZ+ctK3h60Ed+rs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=QZl+CMYQhj1YjNmGfWxEM9SzIDejGIOWgw7GsS2mwJM98641UcGKTp0/qzz/K8bTTS+Tgv5bPXz9zRwYkguOH1tfwwIHvyT7NQJQOSeGxA7bZ2IW9YLV2bRHTuba/hWgwlVzmyhskPoUKOKq3po7vm/wwyCwKYzwKC9Fh9bGs6o= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=YAtPBBM+; arc=none smtp.client-ip=185.246.84.56 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="YAtPBBM+" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id 83D9F1A2B19; Fri, 23 Jan 2026 09:54:58 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 591376070A; Fri, 23 Jan 2026 09:54:58 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 221C5119A87A2; Fri, 23 Jan 2026 10:54:55 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1769162097; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=nxNNVm34hEmHicTsZJOHH60jjV020nAjZPyfjiXnMYc=; b=YAtPBBM+QE3wlhWH8hCNUJCO4FexmAUfBd4nnstDgSHCtEzIIG2A1r3MTaIl92PNK2fPBW lYqLcw/i+B8sbLrZllZfmXCeWv4CVZUHZZmZX/U5OfLjYlqOmgj06+HQmedbSatRvjQwdQ oG6ezCyYT/YBQZFbCQU25o4XXZwppsJDJkkcYvNE5GwZfvTUbyFH4f4Z6WtbG5ix1hGOvQ oSu5n1RKPfIJXo/YbeV2Mp3Pk0HQNCvUXQG5i98AtlTNvnb0aX51phv/ZdHpTOuqZJteeb FMt7cb0PBCphvZn16v5dN8hS/V0aMbRcb5cnC6+kVo7oMLVX5kB6gN6NHJb9wA== From: "Thomas Perrot (Schneider Electric)" Date: Fri, 23 Jan 2026 10:54:33 +0100 Subject: [PATCH v2 4/5] gpio: aaeon: Add GPIO driver for SRG-IMX8PL MCU Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260123-dev-b4-aaeon-mcu-driver-v2-4-9f4c00bfb5cb@bootlin.com> References: <20260123-dev-b4-aaeon-mcu-driver-v2-0-9f4c00bfb5cb@bootlin.com> In-Reply-To: <20260123-dev-b4-aaeon-mcu-driver-v2-0-9f4c00bfb5cb@bootlin.com> To: Rob Herring , Krzysztof Kozlowski , Conor Dooley , Linus Walleij , Bartosz Golaszewski , Shawn Guo , Sascha Hauer , Pengutronix Kernel Team , Fabio Estevam , =?utf-8?q?J=C3=A9r=C3=A9mie_Dautheribes?= , Wim Van Sebroeck , Guenter Roeck , Lee Jones Cc: devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-gpio@vger.kernel.org, imx@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-watchdog@vger.kernel.org, Thomas Petazzoni , "Thomas Perrot (Schneider Electric)" X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=9430; i=thomas.perrot@bootlin.com; h=from:subject:message-id; bh=+kvLjJ8qVu0U6ba+Of8WjhJZQRzBbZ+ctK3h60Ed+rs=; b=owEB7QES/pANAwAKAZ/ACwVx/grtAcsmYgBpc0Vjysw2z0spepJtXCYKgcn9o3qhoufNHSrCn R9IxigqupmJAbMEAAEKAB0WIQSHQHfGpqMKIwOoEiGfwAsFcf4K7QUCaXNFYwAKCRCfwAsFcf4K 7SG8C/9+BwcSA8w08bEDzihO5ah4C4mEa2O+BHA3nCBRKb0G3+Chb42CKHaWeALSjsCTAMahuqf WjKZKG1oRUx0QKKpi3pya02qjdQAE/s9Rv1xMJWs2tbjZsrLXCmL67mdj4R67LK0sCaQHwxf6cb D+Pei3VXALhjj+nSZtwjENStzG7WXthTwbEZ+XJUoFPfAd9gXNz2+IsLi1v+q+NfXh6aekp2VrL 2ARPh7TNjt/dtq9Ip2ppsbWvlt3ANsVwNoreANuvvTZHCY+73MiK90MP3YT19pzhlVn6yZVrAaM 3b8YEg9F7s+w42umkOSQR2f7UMiF7DgxNKxpiyIchK5TBVUAptpmLhJij5KkqPDvFxLYsg0yZax wACsYCydfStU14Q44AxEFhcmCXDqr8mmi3G/xsLm9jo94VJta4Chh/i1nwDDb/mZPoIsTT3cgex VDzj5dmDJzJ8HsjHAmIsXAunsw8g5qWLBIm3YkOQVaUp+HHFXbyO8/acaVXxPsjXHvT9Q= X-Developer-Key: i=thomas.perrot@bootlin.com; a=openpgp; fpr=874077C6A6A30A2303A812219FC00B0571FE0AED X-Last-TLS-Session-Version: TLSv1.3 Add GPIO driver for the Aaeon SRG-IMX8PL embedded controller. This driver supports 7 GPO (General Purpose Output) pins and 12 GPIO pins that can be configured as inputs or outputs. The driver implements proper state management for GPO pins (which are output-only) and full direction control for GPIO pins. During probe, all pins are reset to a known state (GPOs low, GPIOs as inputs) to prevent undefined behavior across system reboots, as the MCU does not reset GPIO states on soft reboot. Co-developed-by: J=C3=A9r=C3=A9mie Dautheribes (Schneider Electric) Signed-off-by: J=C3=A9r=C3=A9mie Dautheribes (Schneider Electric) Signed-off-by: Thomas Perrot (Schneider Electric) Reviewed-by: Linus Walleij --- MAINTAINERS | 1 + drivers/gpio/Kconfig | 10 ++ drivers/gpio/Makefile | 1 + drivers/gpio/gpio-aaeon-mcu.c | 238 ++++++++++++++++++++++++++++++++++++++= ++++ 4 files changed, 250 insertions(+) diff --git a/MAINTAINERS b/MAINTAINERS index 175c1e1b28b8151580ed340207d4a6fd59aa8853..28dd964cdf69bdcaec3eb82d6df= 851a2bad47415 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -191,6 +191,7 @@ M: Thomas Perrot R: J=C3=A9r=C3=A9mie Dautheribes S: Maintained F: Documentation/devicetree/bindings/mfd/aaeon,srg-imx8pl-mcu.yaml +F: drivers/gpio/gpio-aaeon-mcu.c F: drivers/mfd/aaeon-mcu.c F: include/linux/mfd/aaeon-mcu.h =20 diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig index c74da29253e810b51540684b1186e8f274066b69..6142d50b92b3d8c1fac8b0d8139= 7dc22428fbb51 100644 --- a/drivers/gpio/Kconfig +++ b/drivers/gpio/Kconfig @@ -157,6 +157,16 @@ config GPIO_74XX_MMIO 8 bits: 74244 (Input), 74273 (Output) 16 bits: 741624 (Input), 7416374 (Output) =20 +config GPIO_AAEON_MCU + tristate "Aaeon MCU GPIO support" + depends on MFD_AAEON_MCU + select GPIO_GENERIC + help + Select this option to enable GPIO support for the Aaeon SRG-IMX8PL + onboard MCU. This driver provides access to GPIO pins and GPO + (General Purpose Output) pins controlled by the microcontroller. + The driver handles both input and output configuration. + config GPIO_ALTERA tristate "Altera GPIO" select GPIOLIB_IRQCHIP diff --git a/drivers/gpio/Makefile b/drivers/gpio/Makefile index 2421a8fd3733e0b06c2581262aaa9cd629f66c7d..1ba6318bc558743fbe5910966c2= c8fc3f792efe9 100644 --- a/drivers/gpio/Makefile +++ b/drivers/gpio/Makefile @@ -29,6 +29,7 @@ obj-$(CONFIG_GPIO_104_IDI_48) +=3D gpio-104-idi-48.o obj-$(CONFIG_GPIO_104_IDIO_16) +=3D gpio-104-idio-16.o obj-$(CONFIG_GPIO_74X164) +=3D gpio-74x164.o obj-$(CONFIG_GPIO_74XX_MMIO) +=3D gpio-74xx-mmio.o +obj-$(CONFIG_GPIO_AAEON_MCU) +=3D gpio-aaeon-mcu.o obj-$(CONFIG_GPIO_ADNP) +=3D gpio-adnp.o obj-$(CONFIG_GPIO_ADP5520) +=3D gpio-adp5520.o obj-$(CONFIG_GPIO_ADP5585) +=3D gpio-adp5585.o diff --git a/drivers/gpio/gpio-aaeon-mcu.c b/drivers/gpio/gpio-aaeon-mcu.c new file mode 100644 index 0000000000000000000000000000000000000000..533eaf3e7f82f3b9e3f50a1a631= c8e853adc1226 --- /dev/null +++ b/drivers/gpio/gpio-aaeon-mcu.c @@ -0,0 +1,238 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Aaeon MCU GPIO driver + * + * Copyright (C) 2025 Bootlin + * Author: J=C3=A9r=C3=A9mie Dautheribes + * Author: Thomas Perrot + */ + +#include +#include +#include +#include +#include +#include +#include + +#define AAEON_MCU_CONFIG_GPIO_INPUT 0x69 +#define AAEON_MCU_CONFIG_GPIO_OUTPUT 0x6F +#define AAEON_MCU_READ_GPIO 0x72 +#define AAEON_MCU_WRITE_GPIO 0x77 + +#define AAEON_MCU_CONTROL_GPO 0x6C + +#define MAX_GPIOS 12 +#define MAX_GPOS 7 + +struct aaeon_mcu_gpio { + struct gpio_chip gc; + struct device *dev; + DECLARE_BITMAP(dir_in, MAX_GPOS + MAX_GPIOS); + DECLARE_BITMAP(gpo_state, MAX_GPOS); +}; + +static int aaeon_mcu_gpio_config_input_cmd(struct aaeon_mcu_gpio *data, + unsigned int offset) +{ + u8 cmd[3], rsp; + + cmd[0] =3D AAEON_MCU_CONFIG_GPIO_INPUT; + cmd[1] =3D offset - 7; + cmd[2] =3D 0x00; + + return aaeon_mcu_i2c_xfer(data->dev, cmd, 3, &rsp, 1); +} + +static int aaeon_mcu_gpio_direction_input(struct gpio_chip *gc, unsigned i= nt offset) +{ + struct aaeon_mcu_gpio *data =3D gpiochip_get_data(gc); + int ret; + + if (offset < MAX_GPOS) { + dev_err(gc->parent, "GPIO offset (%d) must be an output GPO\n", offset); + return -EOPNOTSUPP; + } + + ret =3D aaeon_mcu_gpio_config_input_cmd(data, offset); + if (ret < 0) + return ret; + + __set_bit(offset, data->dir_in); + + return 0; +} + +static int aaeon_mcu_gpio_config_output_cmd(struct aaeon_mcu_gpio *data, + unsigned int offset, + int value) +{ + u8 cmd[3], rsp; + int ret; + + cmd[0] =3D AAEON_MCU_CONFIG_GPIO_OUTPUT; + cmd[1] =3D offset - 7; + cmd[2] =3D 0x00; + + ret =3D aaeon_mcu_i2c_xfer(data->dev, cmd, 3, &rsp, 1); + if (ret < 0) + return ret; + + cmd[0] =3D AAEON_MCU_WRITE_GPIO; + /* cmd[1] =3D offset - 7; */ + cmd[2] =3D !!value; + + return aaeon_mcu_i2c_xfer(data->dev, cmd, 3, &rsp, 1); +} + +static int aaeon_mcu_gpio_direction_output(struct gpio_chip *gc, unsigned = int offset, int value) +{ + struct aaeon_mcu_gpio *data =3D gpiochip_get_data(gc); + int ret; + + if (offset < MAX_GPOS) + return 0; + + ret =3D aaeon_mcu_gpio_config_output_cmd(data, offset, value); + if (ret < 0) + return ret; + + __clear_bit(offset, data->dir_in); + + return 0; +} + +static int aaeon_mcu_gpio_get_direction(struct gpio_chip *gc, unsigned int= offset) +{ + struct aaeon_mcu_gpio *data =3D gpiochip_get_data(gc); + + return test_bit(offset, data->dir_in) ? + GPIO_LINE_DIRECTION_IN : GPIO_LINE_DIRECTION_OUT; +} + +static int aaeon_mcu_gpio_get(struct gpio_chip *gc, unsigned int offset) +{ + struct aaeon_mcu_gpio *data =3D gpiochip_get_data(gc); + u8 cmd[3], rsp; + int ret; + + if (offset < MAX_GPOS) + return test_bit(offset, data->gpo_state); + + cmd[0] =3D AAEON_MCU_READ_GPIO; + cmd[1] =3D offset - 7; + cmd[2] =3D 0x00; + + ret =3D aaeon_mcu_i2c_xfer(data->dev, cmd, 3, &rsp, 1); + if (ret < 0) + return ret; + + return rsp; +} + +static int aaeon_mcu_gpo_set_cmd(struct aaeon_mcu_gpio *data, unsigned int= offset, int value) +{ + u8 cmd[3], rsp; + + cmd[0] =3D AAEON_MCU_CONTROL_GPO; + cmd[1] =3D offset + 1; + cmd[2] =3D !!value; + + return aaeon_mcu_i2c_xfer(data->dev, cmd, 3, &rsp, 1); +} + +static int aaeon_mcu_gpio_set_cmd(struct aaeon_mcu_gpio *data, unsigned in= t offset, int value) +{ + u8 cmd[3], rsp; + + cmd[0] =3D AAEON_MCU_WRITE_GPIO; + cmd[1] =3D offset - 7; + cmd[2] =3D !!value; + + return aaeon_mcu_i2c_xfer(data->dev, cmd, 3, &rsp, 1); +} + +static int aaeon_mcu_gpio_set(struct gpio_chip *gc, unsigned int offset, + int value) +{ + struct aaeon_mcu_gpio *data =3D gpiochip_get_data(gc); + + if (offset >=3D MAX_GPOS) + return aaeon_mcu_gpio_set_cmd(data, offset, value); + + if (aaeon_mcu_gpo_set_cmd(data, offset, value) =3D=3D 0) + __assign_bit(offset, data->gpo_state, value); + + return 0; +} + +static const struct gpio_chip aaeon_mcu_chip =3D { + .label =3D "gpio-aaeon-mcu", + .owner =3D THIS_MODULE, + .get_direction =3D aaeon_mcu_gpio_get_direction, + .direction_input =3D aaeon_mcu_gpio_direction_input, + .direction_output =3D aaeon_mcu_gpio_direction_output, + .get =3D aaeon_mcu_gpio_get, + .set =3D aaeon_mcu_gpio_set, + .base =3D -1, + .ngpio =3D MAX_GPOS + MAX_GPIOS, + .can_sleep =3D true, +}; + +static void aaeon_mcu_gpio_reset(struct aaeon_mcu_gpio *data, struct devic= e *dev) +{ + unsigned int i; + int ret; + + /* Reset all GPOs */ + for (i =3D 0; i < MAX_GPOS; i++) { + ret =3D aaeon_mcu_gpo_set_cmd(data, i, 0); + if (ret < 0) + dev_warn(dev, "Failed to reset GPO %u state: %d\n", i, ret); + __clear_bit(i, data->dir_in); + } + + /* Reset all GPIOs */ + for (i =3D MAX_GPOS; i < MAX_GPOS + MAX_GPIOS; i++) { + ret =3D aaeon_mcu_gpio_config_input_cmd(data, i); + if (ret < 0) + dev_warn(dev, "Failed to reset GPIO %u state: %d\n", i, ret); + __set_bit(i, data->dir_in); + } +} + +static int aaeon_mcu_gpio_probe(struct platform_device *pdev) +{ + struct aaeon_mcu_gpio *data; + + data =3D devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL); + if (!data) + return -ENOMEM; + + data->dev =3D pdev->dev.parent; + data->gc =3D aaeon_mcu_chip; + data->gc.parent =3D data->dev; + + /* + * Reset all GPIO states to a known configuration. The MCU does not + * reset GPIO state on soft reboot, only on power cycle (hard reboot). + * Without this reset, GPIOs would retain their previous state across + * reboots, which could lead to unexpected behavior. + */ + aaeon_mcu_gpio_reset(data, &pdev->dev); + + return devm_gpiochip_add_data(&pdev->dev, &data->gc, data); +} + +static struct platform_driver aaeon_mcu_gpio_driver =3D { + .driver =3D { + .name =3D "aaeon-mcu-gpio", + }, + .probe =3D aaeon_mcu_gpio_probe, +}; + +module_platform_driver(aaeon_mcu_gpio_driver); + +MODULE_DESCRIPTION("GPIO interface for Aaeon MCU"); +MODULE_AUTHOR("J=C3=A9r=C3=A9mie Dautheribes "); +MODULE_LICENSE("GPL"); --=20 2.52.0 From nobody Sat Feb 7 10:14:49 2026 Received: from smtpout-02.galae.net (smtpout-02.galae.net [185.246.84.56]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 86D6737AA79; Fri, 23 Jan 2026 09:55:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.246.84.56 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769162119; cv=none; b=A3WsyKRQU+Ak85VG58eP8JAGtTelgGjUdOsw7l6t+xpFZZ85eBVrnIhhj7xUHe/9qzpPcbwoyw4/M/WfrAUpbJ1P050+77D9gH1nTF8za+NYf/NHY0Dmiu7cJGap9f/+yGCFMhv7UCy9dcfv9zBiPcn4a46qYvfgtXUgOEr8j68= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769162119; c=relaxed/simple; bh=9gen2o3Mf1ofcL8PeP3W13nzaTJLPOD8lNgOmfF5pKk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=FVduVVYMwiNd3REiqPGykmmMk9s/KVgq12EKdL9UibmeVqv6SPGfuzJdr1tVhWnJNaz4ra+A5ZBowIZuLYWgHv+2/tFU4Nwu3+nkDc49E+BarGrUNy5IzAoar4gKGnRnrOLdTQbXBwgXCkt4bm2C6ENFHmpuqCacvE1FRE+9Csc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=WkdePuTQ; arc=none smtp.client-ip=185.246.84.56 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="WkdePuTQ" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id A0D251A2B1B; Fri, 23 Jan 2026 09:55:00 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 776C66070A; Fri, 23 Jan 2026 09:55:00 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id A7F2D119A87AA; Fri, 23 Jan 2026 10:54:57 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1769162099; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=3P9Z/MlQ9eHNxkkoBbhw62O7wkyC3TSbpmPEbIT1/6Y=; b=WkdePuTQaMXgGA6w4/o9P+lzXyYD7Ooxu5csXmMm0RrS/JU8qsA/lW0VDNgAZEfECljXpC 0wDHKlkkyXsYsXOlT7wpMDncHFUuSvB1Dbm8JmBeK+MzueNG9p41fv61p1oX/CTJ2aGOA5 xkclIxeI4vz7sH9lsQBWHAJm1cpAED1HLw4qjBY+We84u5G0U+dpBVSdx4m6CXBDWjYrMy MFmpwKBfCHT2OSp++2TfnGxvW29tT8zH7riK3e/zrgCGh+G162RhuEtEzUXgfF9tSSsFvs bMXY4vTuUnG01/ihlFKxfCLM55wdZw9OKw9vEQqQvF2q9Enp2lTN5oXlv26VKQ== From: "Thomas Perrot (Schneider Electric)" Date: Fri, 23 Jan 2026 10:54:34 +0100 Subject: [PATCH v2 5/5] watchdog: aaeon: Add watchdog driver for SRG-IMX8PL MCU Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260123-dev-b4-aaeon-mcu-driver-v2-5-9f4c00bfb5cb@bootlin.com> References: <20260123-dev-b4-aaeon-mcu-driver-v2-0-9f4c00bfb5cb@bootlin.com> In-Reply-To: <20260123-dev-b4-aaeon-mcu-driver-v2-0-9f4c00bfb5cb@bootlin.com> To: Rob Herring , Krzysztof Kozlowski , Conor Dooley , Linus Walleij , Bartosz Golaszewski , Shawn Guo , Sascha Hauer , Pengutronix Kernel Team , Fabio Estevam , =?utf-8?q?J=C3=A9r=C3=A9mie_Dautheribes?= , Wim Van Sebroeck , Guenter Roeck , Lee Jones Cc: devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-gpio@vger.kernel.org, imx@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-watchdog@vger.kernel.org, Thomas Petazzoni , "Thomas Perrot (Schneider Electric)" X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=6057; i=thomas.perrot@bootlin.com; h=from:subject:message-id; bh=9gen2o3Mf1ofcL8PeP3W13nzaTJLPOD8lNgOmfF5pKk=; b=owEB7QES/pANAwAKAZ/ACwVx/grtAcsmYgBpc0VjCnolrcgZBx+MyoNbC5ykndiwIhREZSrhv O34cW1DXOKJAbMEAAEKAB0WIQSHQHfGpqMKIwOoEiGfwAsFcf4K7QUCaXNFYwAKCRCfwAsFcf4K 7Xt/DACpvfqouTjGTqE2wtWT8OcMjIwNq+L4tI9BGl05Bx4O3zZwTlIpq3J8clXpN3OKeTwz5E+ H8hPEj1kAun1kZj5iwzZeRM8kRgvPCVNolTzlTsQ543ywyiWorxRyZ1LFXrb8fZrU6pQUqbNDJ/ +vKjgyYVVDiEGnrYJ6bkCvYPBAjkHnMSHZy91e9qe19IUJTGORBHxjpMleUL3JNnIqWNK+5Sx0/ s9RyVLoFO0XDjqy6CZCWz1bOaC7kLtMhKuXEUGdDybemDSREYgD63WNLQ8iBk/6MOuSKWF2eDCV TiTzxOHhQHpfX0Pyh1+QThdV0IK9RqhAmxbYeKlmiBmK0WH5DKBRG9HQMWl3AQNOPPR/GlQ/DuM 5pSSBuRbt5sEBu2yNADw1MvF2G29dVUZiIJuW8tK1jaUdf8noxX70i9tXFY5RF/gY3m30Qt9ecb ltqBmVhb4FZAse8NKrZ8TfTIPjTek9qbBd/CEm/jBc5tOg1RrSqiTGES+Q/N6ObuizbZ4= X-Developer-Key: i=thomas.perrot@bootlin.com; a=openpgp; fpr=874077C6A6A30A2303A812219FC00B0571FE0AED X-Last-TLS-Session-Version: TLSv1.3 Add watchdog driver for the Aaeon SRG-IMX8PL embedded controller. This driver provides system monitoring and recovery capabilities through the MCU's watchdog timer. The watchdog supports start, stop, and ping operations with a maximum hardware heartbeat of 25 seconds and a default timeout of 240 seconds. The driver assumes the watchdog is already running at probe time, as the MCU typically enables it by default. Co-developed-by: J=C3=A9r=C3=A9mie Dautheribes (Schneider Electric) Signed-off-by: J=C3=A9r=C3=A9mie Dautheribes (Schneider Electric) Signed-off-by: Thomas Perrot (Schneider Electric) --- MAINTAINERS | 1 + drivers/watchdog/Kconfig | 10 ++++ drivers/watchdog/Makefile | 1 + drivers/watchdog/aaeon_mcu_wdt.c | 110 +++++++++++++++++++++++++++++++++++= ++++ 4 files changed, 122 insertions(+) diff --git a/MAINTAINERS b/MAINTAINERS index 28dd964cdf69bdcaec3eb82d6df851a2bad47415..66cc4a5dcbe0977e6baee6d3b5e= 6023dcc06847b 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -193,6 +193,7 @@ S: Maintained F: Documentation/devicetree/bindings/mfd/aaeon,srg-imx8pl-mcu.yaml F: drivers/gpio/gpio-aaeon-mcu.c F: drivers/mfd/aaeon-mcu.c +F: drivers/watchdog/aaeon_mcu_wdt.c F: include/linux/mfd/aaeon-mcu.h =20 AAEON UPBOARD FPGA MFD DRIVER diff --git a/drivers/watchdog/Kconfig b/drivers/watchdog/Kconfig index d3b9df7d466b0b7215ee87b3040811d44ee53d2a..1bd4a7bee303e5e2508f540dc2c= 16e9e19ed18b0 100644 --- a/drivers/watchdog/Kconfig +++ b/drivers/watchdog/Kconfig @@ -168,6 +168,16 @@ config SOFT_WATCHDOG_PRETIMEOUT watchdog. Be aware that governors might affect the watchdog because it is purely software, e.g. the panic governor will stall it! =20 +config AAEON_MCU_WATCHDOG + tristate "Aaeon MCU Watchdog" + depends on MFD_AAEON_MCU + select WATCHDOG_CORE + help + Select this option to enable watchdog timer support for the Aaeon + SRG-IMX8PL onboard microcontroller (MCU). This driver provides + watchdog functionality through the MCU, allowing system monitoring + and automatic recovery from system hangs. + config BD957XMUF_WATCHDOG tristate "ROHM BD9576MUF and BD9573MUF PMIC Watchdog" depends on MFD_ROHM_BD957XMUF diff --git a/drivers/watchdog/Makefile b/drivers/watchdog/Makefile index ba52099b125398a32f80dad23317e223cc4af028..2deec425d3eafb6b208e061fda9= f216f4baa8ecc 100644 --- a/drivers/watchdog/Makefile +++ b/drivers/watchdog/Makefile @@ -37,6 +37,7 @@ obj-$(CONFIG_USBPCWATCHDOG) +=3D pcwd_usb.o # ALPHA Architecture =20 # ARM Architecture +obj-$(CONFIG_AAEON_MCU_WATCHDOG) +=3D aaeon_mcu_wdt.o obj-$(CONFIG_ARM_SP805_WATCHDOG) +=3D sp805_wdt.o obj-$(CONFIG_ARM_SBSA_WATCHDOG) +=3D sbsa_gwdt.o obj-$(CONFIG_ARMADA_37XX_WATCHDOG) +=3D armada_37xx_wdt.o diff --git a/drivers/watchdog/aaeon_mcu_wdt.c b/drivers/watchdog/aaeon_mcu_= wdt.c new file mode 100644 index 0000000000000000000000000000000000000000..99be3ce327f44063fce6ba77a7d= 4efcba34361df --- /dev/null +++ b/drivers/watchdog/aaeon_mcu_wdt.c @@ -0,0 +1,110 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Aaeon MCU Watchdog driver + * + * Copyright (C) 2025 Bootlin + * Author: J=C3=A9r=C3=A9mie Dautheribes + * Author: Thomas Perrot + */ + +#include +#include +#include +#include + +#define AAEON_MCU_CONTROL_WDT 0x63 +#define AAEON_MCU_PING_WDT 0x73 + +#define AAEON_MCU_WDT_TIMEOUT 240 +#define AAEON_MCU_WDT_HEARTBEAT_MS 25000 + +struct aaeon_mcu_wdt { + struct watchdog_device wdt; + struct device *dev; +}; + +static int aaeon_mcu_wdt_cmd(struct device *dev, u8 opcode, u8 arg) +{ + u8 cmd[3] =3D { opcode, arg, 0x00 }; + u8 rsp; + + return aaeon_mcu_i2c_xfer(dev, cmd, sizeof(cmd), &rsp, sizeof(rsp)); +} + +static int aaeon_mcu_wdt_start(struct watchdog_device *wdt) +{ + struct aaeon_mcu_wdt *data =3D watchdog_get_drvdata(wdt); + + return aaeon_mcu_wdt_cmd(data->dev, AAEON_MCU_CONTROL_WDT, 0x01); +} + +static int aaeon_mcu_wdt_stop(struct watchdog_device *wdt) +{ + struct aaeon_mcu_wdt *data =3D watchdog_get_drvdata(wdt); + + return aaeon_mcu_wdt_cmd(data->dev, AAEON_MCU_CONTROL_WDT, 0x00); +} + +static int aaeon_mcu_wdt_ping(struct watchdog_device *wdt) +{ + struct aaeon_mcu_wdt *data =3D watchdog_get_drvdata(wdt); + + return aaeon_mcu_wdt_cmd(data->dev, AAEON_MCU_PING_WDT, 0x00); +} + +static const struct watchdog_info aaeon_mcu_wdt_info =3D { + .identity =3D "Aaeon MCU Watchdog", + .options =3D WDIOF_KEEPALIVEPING +}; + +static const struct watchdog_ops aaeon_mcu_wdt_ops =3D { + .owner =3D THIS_MODULE, + .start =3D aaeon_mcu_wdt_start, + .stop =3D aaeon_mcu_wdt_stop, + .ping =3D aaeon_mcu_wdt_ping, +}; + +static int aaeon_mcu_wdt_probe(struct platform_device *pdev) +{ + struct device *dev =3D &pdev->dev; + struct watchdog_device *wdt; + struct aaeon_mcu_wdt *data; + int ret; + + data =3D devm_kzalloc(dev, sizeof(*data), GFP_KERNEL); + if (!data) + return -ENOMEM; + + data->dev =3D dev->parent; + + wdt =3D &data->wdt; + wdt->parent =3D dev; + wdt->info =3D &aaeon_mcu_wdt_info; + wdt->ops =3D &aaeon_mcu_wdt_ops; + wdt->timeout =3D AAEON_MCU_WDT_TIMEOUT; + wdt->max_hw_heartbeat_ms =3D AAEON_MCU_WDT_HEARTBEAT_MS; + + watchdog_set_drvdata(wdt, data); + platform_set_drvdata(pdev, data); + + ret =3D aaeon_mcu_wdt_start(wdt); + if (ret) + return ret; + + set_bit(WDOG_HW_RUNNING, &wdt->status); + + return devm_watchdog_register_device(dev, wdt); +} + +static struct platform_driver aaeon_mcu_wdt_driver =3D { + .driver =3D { + .name =3D "aaeon-mcu-wdt", + }, + .probe =3D aaeon_mcu_wdt_probe, +}; + +module_platform_driver(aaeon_mcu_wdt_driver); + +MODULE_DESCRIPTION("Aaeon MCU Watchdog Driver"); +MODULE_AUTHOR("J=C3=A9r=C3=A9mie Dautheribes "); +MODULE_LICENSE("GPL"); --=20 2.52.0