From nobody Sat Feb 7 10:14:55 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