From nobody Sat Oct 4 11:13:56 2025 Received: from sender4-op-o15.zoho.com (sender4-op-o15.zoho.com [136.143.188.15]) (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 19768286D49; Mon, 18 Aug 2025 07:49:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=136.143.188.15 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755503388; cv=pass; b=BcHiurYUZ7tapa8G0W7ezu/HUdox2mLjkIdQzrwOoQTEkRVpEQ4d3+qcsI14xtM93ffES1WanVthzUqWGEYdYKG1Lz9L3IhQVmKRh7L6GpnNyCVM86pv4bSrCPjxCINxKhhnz/wnPgeJlmBrFhGe+GGuty+10xHFopPPD2mxChU= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755503388; c=relaxed/simple; bh=ACf4r7Qngk3dd9Er6SsBBuKCjXlRI22RwQgN2pXOl/w=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=SZLE8UVfkB6MzQKKfe7dIns0IfbRbtUm2nPxbXb/Sodwqx9t3qLb0OgKbvmPsRjRgJqpSYGQkY+RSdthiCsUxAmWqjPjOmjyGyMacanRN8KYRd7B5HbyQjh7yTDIQjsy5ugmE61jNQkqtgbgEvSIOXeYewEpcH29rvmD0J27M38= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=icenowy.me; spf=pass smtp.mailfrom=icenowy.me; dkim=pass (2048-bit key) header.d=icenowy.me header.i=uwu@icenowy.me header.b=k4Qhiueg; arc=pass smtp.client-ip=136.143.188.15 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=icenowy.me Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=icenowy.me Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=icenowy.me header.i=uwu@icenowy.me header.b="k4Qhiueg" ARC-Seal: i=1; a=rsa-sha256; t=1755503374; cv=none; d=zohomail.com; s=zohoarc; b=X032uvCgpoQTIviV7My3PYMDvdbfmyxrOehYKxeioFUO7KQ/aZ9abRKNasky+b3SBtd1JKRNa+cdcMJSp1q5qlDc5qKOHYXzR/q8rpSJp1UwvuEXhq3Jct+Lh+n7lnCJ1CdQnaLLaekOGWX0BV3ZdNCplX1W5ZS7CUonTyBSkzA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1755503374; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:MIME-Version:Message-ID:References:Subject:Subject:To:To:Message-Id:Reply-To; bh=UedmDzyvf5l65qW+hQfIQJ8Xd28PzjRNYITRMIOAHbE=; b=JUc8L0gaccDunSIVZUel4Z+xTSGE8NXgu0rzLkQ47kRSkGyjopGsGFAcD+LHE3vq9cIVm0ZNnCdlYgCda/iq68E+sYVUnsIRISFVbxT3UbSkbgXx60/Fjzup8pQQU5SxtwOwgDpRmJG9qzHdOqyQxPGmFWA2T7RT/iFL28GCOEg= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=icenowy.me; spf=pass smtp.mailfrom=uwu@icenowy.me; dmarc=pass header.from= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1755503374; s=zmail2; d=icenowy.me; i=uwu@icenowy.me; h=From:From:To:To:Cc:Cc:Subject:Subject:Date:Date:Message-ID:In-Reply-To:References:MIME-Version:Content-Transfer-Encoding:Message-Id:Reply-To; bh=UedmDzyvf5l65qW+hQfIQJ8Xd28PzjRNYITRMIOAHbE=; b=k4QhiuegKR1KjzI+AbcmK5swtDTs1eGRuKJoq3iZ5yDsNG4iKCTXgL+Z4oJGEJwb qQ3wdnShysWsdzhtBbwkMepF1oYABlAghFQuEu1Rlv74wxIy+rYxfKAN8LHvvi5fBOx F1kdoH98xdny8jzJ1AfoOEyDMFRO+Ravl5MHwRM8VTzgXmEsZvZ5b4kbiIDFzIYo/kn a3bHknIG+nZNgSoRKvTthRaAPSW6ZgfviDjESAjHiievc5yzHatbE54H9PPPD2D+JsL 7YLJh0EO+PiRbHngtbdDaHyILXJyARQKubyyrXmy2LZBVhbhQK7tblA4VBhfoV3mRzl 2ueR0TLUfQ== Received: by mx.zohomail.com with SMTPS id 1755503371096963.652409830932; Mon, 18 Aug 2025 00:49:31 -0700 (PDT) From: Icenowy Zheng To: Drew Fustini , Guo Ren , Fu Wei , Michal Wilczynski , Ulf Hansson , Sebastian Reichel Cc: Han Gao , Yao Zi , linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, linux-pm@vger.kernel.org, Icenowy Zheng Subject: [PATCH 1/2] driver: reset: th1520-aon: add driver for poweroff/reboot via AON FW Date: Mon, 18 Aug 2025 15:49:05 +0800 Message-ID: <20250818074906.2907277-2-uwu@icenowy.me> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20250818074906.2907277-1-uwu@icenowy.me> References: <20250818074906.2907277-1-uwu@icenowy.me> 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 X-ZohoMailClient: External Content-Type: text/plain; charset="utf-8" This driver implements poweroff/reboot support for T-Head TH1520 SoCs running the AON firmware by sending a message to the AON firmware's WDG part. This is a auxiliary device driver, and expects the AON channel to be passed via the platform_data of the auxiliary device. Signed-off-by: Icenowy Zheng Acked-by: Sebastian Reichel --- MAINTAINERS | 1 + drivers/power/reset/Kconfig | 7 ++ drivers/power/reset/Makefile | 1 + drivers/power/reset/th1520-aon-reboot.c | 98 +++++++++++++++++++++++++ 4 files changed, 107 insertions(+) create mode 100644 drivers/power/reset/th1520-aon-reboot.c diff --git a/MAINTAINERS b/MAINTAINERS index daf520a13bdf6..e138a1e96ceea 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -21730,6 +21730,7 @@ F: drivers/mailbox/mailbox-th1520.c F: drivers/net/ethernet/stmicro/stmmac/dwmac-thead.c F: drivers/pinctrl/pinctrl-th1520.c F: drivers/pmdomain/thead/ +F: drivers/power/reset/th1520-aon-reboot.c F: drivers/power/sequencing/pwrseq-thead-gpu.c F: drivers/reset/reset-th1520.c F: include/dt-bindings/clock/thead,th1520-clk-ap.h diff --git a/drivers/power/reset/Kconfig b/drivers/power/reset/Kconfig index 77ea3129c7080..8248895ca9038 100644 --- a/drivers/power/reset/Kconfig +++ b/drivers/power/reset/Kconfig @@ -225,6 +225,13 @@ config POWER_RESET_ST help Reset support for STMicroelectronics boards. =20 +config POWER_RESET_TH1520_AON + tristate "T-Head TH1520 AON firmware poweroff and reset driver" + depends on TH1520_PM_DOMAINS + help + This driver supports power-off and reset operations for T-Head + TH1520 SoCs running the AON firmware. + config POWER_RESET_TORADEX_EC tristate "Toradex Embedded Controller power-off and reset driver" depends on ARCH_MXC || COMPILE_TEST diff --git a/drivers/power/reset/Makefile b/drivers/power/reset/Makefile index b7c2b5940be99..51da87e05ce76 100644 --- a/drivers/power/reset/Makefile +++ b/drivers/power/reset/Makefile @@ -25,6 +25,7 @@ obj-$(CONFIG_POWER_RESET_QNAP) +=3D qnap-poweroff.o obj-$(CONFIG_POWER_RESET_REGULATOR) +=3D regulator-poweroff.o obj-$(CONFIG_POWER_RESET_RESTART) +=3D restart-poweroff.o obj-$(CONFIG_POWER_RESET_ST) +=3D st-poweroff.o +obj-$(CONFIG_POWER_RESET_TH1520_AON) +=3D th1520-aon-reboot.o obj-$(CONFIG_POWER_RESET_TORADEX_EC) +=3D tdx-ec-poweroff.o obj-$(CONFIG_POWER_RESET_TPS65086) +=3D tps65086-restart.o obj-$(CONFIG_POWER_RESET_VERSATILE) +=3D arm-versatile-reboot.o diff --git a/drivers/power/reset/th1520-aon-reboot.c b/drivers/power/reset/= th1520-aon-reboot.c new file mode 100644 index 0000000000000..8256c1703ebe8 --- /dev/null +++ b/drivers/power/reset/th1520-aon-reboot.c @@ -0,0 +1,98 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * T-HEAD TH1520 AON Firmware Reboot Driver + * + * Copyright (c) 2025 Icenowy Zheng + */ + +#include +#include +#include +#include +#include +#include +#include + +#define TH1520_AON_REBOOT_PRIORITY 200 + +struct th1520_aon_msg_empty_body { + struct th1520_aon_rpc_msg_hdr hdr; + u16 reserved[12]; +} __packed __aligned(1); + +static int th1520_aon_pwroff_handler(struct sys_off_data *data) +{ + struct th1520_aon_chan *aon_chan =3D data->cb_data; + struct th1520_aon_msg_empty_body msg =3D {}; + + msg.hdr.svc =3D TH1520_AON_RPC_SVC_WDG; + msg.hdr.func =3D TH1520_AON_WDG_FUNC_POWER_OFF; + msg.hdr.size =3D TH1520_AON_RPC_MSG_NUM; + + th1520_aon_call_rpc(aon_chan, &msg); + + return NOTIFY_DONE; +} + +static int th1520_aon_restart_handler(struct sys_off_data *data) +{ + struct th1520_aon_chan *aon_chan =3D data->cb_data; + struct th1520_aon_msg_empty_body msg =3D {}; + + msg.hdr.svc =3D TH1520_AON_RPC_SVC_WDG; + msg.hdr.func =3D TH1520_AON_WDG_FUNC_RESTART; + msg.hdr.size =3D TH1520_AON_RPC_MSG_NUM; + + th1520_aon_call_rpc(aon_chan, &msg); + + return NOTIFY_DONE; +} + +static int th1520_aon_reboot_probe(struct auxiliary_device *adev, + const struct auxiliary_device_id *id) +{ + struct device *dev =3D &adev->dev; + int ret; + + /* Expect struct th1520_aon_chan to be passed via platform_data */ + ret =3D devm_register_sys_off_handler(dev, SYS_OFF_MODE_POWER_OFF, + TH1520_AON_REBOOT_PRIORITY, + th1520_aon_pwroff_handler, + adev->dev.platform_data); + + if (ret) { + dev_err(dev, "Failed to register power off handler\n"); + return ret; + } + + ret =3D devm_register_sys_off_handler(dev, SYS_OFF_MODE_RESTART, + TH1520_AON_REBOOT_PRIORITY, + th1520_aon_restart_handler, + adev->dev.platform_data); + + if (ret) { + dev_err(dev, "Failed to register restart handler\n"); + return ret; + } + + return 0; +} + +static const struct auxiliary_device_id th1520_aon_reboot_id_table[] =3D { + { .name =3D "th1520_pm_domains.reboot" }, + {}, +}; +MODULE_DEVICE_TABLE(auxiliary, th1520_aon_reboot_id_table); + +static struct auxiliary_driver th1520_aon_reboot_driver =3D { + .driver =3D { + .name =3D "th1520-aon-reboot", + }, + .probe =3D th1520_aon_reboot_probe, + .id_table =3D th1520_aon_reboot_id_table, +}; +module_auxiliary_driver(th1520_aon_reboot_driver); + +MODULE_AUTHOR("Icenowy Zheng "); +MODULE_DESCRIPTION("T-HEAD TH1520 AON-firmware-based reboot driver"); +MODULE_LICENSE("GPL"); --=20 2.50.1 From nobody Sat Oct 4 11:13:56 2025 Received: from sender4-op-o15.zoho.com (sender4-op-o15.zoho.com [136.143.188.15]) (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 60E89287266; Mon, 18 Aug 2025 07:49:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=136.143.188.15 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755503395; cv=pass; b=eQ2D6dvZm8Fgh/vkJ79GS3UZYFQEbZPP9mVi2toNSm0rXnOUWILiWexcuyFwGm2inCvyNYgrJg6Tp6OlgxL1fMLkANz+JpnSoNvf7IBWWI+h5jPmWJAnJTIAG2/CRTfRM210oSECdS9NeMKkvODxKt2OTAo5KjwdDgNdFBvXqOw= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755503395; c=relaxed/simple; bh=STOcfr9kpIp0+CAMrZ593fZOnyRFM2UhBuPuApaF0rQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=bLra7Fto+JGZv+eLtILqjyyQUBS0L53jwWtEgDTNnGih0UhRVNhAwyJaDZB1m5FuyM1mRey8nQkTytgytB8JYUyABh+1DUOZAJbiep2QRUnp4cijusmCjJdUnDxgqsWQkJqHhgwFn+9kcX+LxhLCgNQsSAOnL3mHVMZrC5ux62s= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=icenowy.me; spf=pass smtp.mailfrom=icenowy.me; dkim=pass (2048-bit key) header.d=icenowy.me header.i=uwu@icenowy.me header.b=Ejfms6rg; arc=pass smtp.client-ip=136.143.188.15 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=icenowy.me Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=icenowy.me Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=icenowy.me header.i=uwu@icenowy.me header.b="Ejfms6rg" ARC-Seal: i=1; a=rsa-sha256; t=1755503380; cv=none; d=zohomail.com; s=zohoarc; b=YPOQyiQzZXF7BjL1Ii00u+6sVYI3xgAeVkxi37Ww+CkEHSFo4BgDodEXzfpNMTFTNrKXgHjuTZGrhDhEGQrDt92hhOZeKZ1pUNvBaANQgrsAssvGCFg5zga6Qx302Mdy0qNFbFPFfgO0HB4ZQCeDCrdM6IQW5NUCAf3cCcrPEKU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1755503380; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:MIME-Version:Message-ID:References:Subject:Subject:To:To:Message-Id:Reply-To; bh=v71hNscntsNElHfK1DeG9/bpCIY/+k/7AMAOxJUUKlE=; b=jepRpt1JfkkVP1u2BrfP/96x19UnvZNa+pBaxMOyXjWwrcmo7H5viWbt4b7yiDlKuSwQjNCHZ3aC+VLs6Zml/0xl5IbwkA5Mg7yMnPN0D9i4KPjLgJkxuQrivqwJWVUVM5eIoajmooLCar1LLYmej9lfPCcfd6UcZ04QoaVyFd4= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=icenowy.me; spf=pass smtp.mailfrom=uwu@icenowy.me; dmarc=pass header.from= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1755503380; s=zmail2; d=icenowy.me; i=uwu@icenowy.me; h=From:From:To:To:Cc:Cc:Subject:Subject:Date:Date:Message-ID:In-Reply-To:References:MIME-Version:Content-Transfer-Encoding:Message-Id:Reply-To; bh=v71hNscntsNElHfK1DeG9/bpCIY/+k/7AMAOxJUUKlE=; b=Ejfms6rgpvxnqBcugd3F9yMvH489ENsnfLn+mtnu5VvXjGT/KOM5W79SW5YrQGqa 0ydtUaz20eJMwmqjVx8Ty/83Dr91Tn3ZeVtBjgT1mSsWGaHsgbCIU8gdhsP0ZiQu6i/ ambU/3dMRRTdrtiICHU7euNscxRNmaz1XjIGq48xRlXX1fn3Binls8VADVcgkgzhIRe HMCAjVswspZVRwkhQ9s4+jVA1DsTwEtphNhew1YCa2x6F8dV1heXP9w3T7X+dI9cwmP VX+JC5H8YJDlfH2geKNcuEvEdVGVi0hWb/k5qmoR9FZGTqnCmlePtm8soWpbposg2+R 3Xm+33gFLg== Received: by mx.zohomail.com with SMTPS id 1755503377570478.03956771827745; Mon, 18 Aug 2025 00:49:37 -0700 (PDT) From: Icenowy Zheng To: Drew Fustini , Guo Ren , Fu Wei , Michal Wilczynski , Ulf Hansson , Sebastian Reichel Cc: Han Gao , Yao Zi , linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, linux-pm@vger.kernel.org, Icenowy Zheng Subject: [PATCH 2/2] pmdomain: thead: create auxiliary device for rebooting Date: Mon, 18 Aug 2025 15:49:06 +0800 Message-ID: <20250818074906.2907277-3-uwu@icenowy.me> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20250818074906.2907277-1-uwu@icenowy.me> References: <20250818074906.2907277-1-uwu@icenowy.me> 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 X-ZohoMailClient: External Content-Type: text/plain; charset="utf-8" The reboot / power off operations require communication with the AON firmware too. As the driver is already present, create an auxiliary device with name "reboot" to match that driver, and pass the AON channel by using platform_data. Signed-off-by: Icenowy Zheng Acked-by: Troy Mitchell --- drivers/pmdomain/thead/th1520-pm-domains.c | 35 ++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/drivers/pmdomain/thead/th1520-pm-domains.c b/drivers/pmdomain/= thead/th1520-pm-domains.c index 9040b698e7f7f..8285f552897b0 100644 --- a/drivers/pmdomain/thead/th1520-pm-domains.c +++ b/drivers/pmdomain/thead/th1520-pm-domains.c @@ -129,12 +129,39 @@ static void th1520_pd_init_all_off(struct generic_pm_= domain **domains, } } =20 -static void th1520_pd_pwrseq_unregister_adev(void *adev) +static void th1520_pd_unregister_adev(void *adev) { auxiliary_device_delete(adev); auxiliary_device_uninit(adev); } =20 +static int th1520_pd_reboot_init(struct device *dev, struct th1520_aon_cha= n *aon_chan) +{ + struct auxiliary_device *adev; + int ret; + + adev =3D devm_kzalloc(dev, sizeof(*adev), GFP_KERNEL); + if (!adev) + return -ENOMEM; + + adev->name =3D "reboot"; + adev->dev.parent =3D dev; + adev->dev.platform_data =3D aon_chan; + + ret =3D auxiliary_device_init(adev); + if (ret) + return ret; + + ret =3D auxiliary_device_add(adev); + if (ret) { + auxiliary_device_uninit(adev); + return ret; + } + + return devm_add_action_or_reset(dev, th1520_pd_unregister_adev, + adev); +} + static int th1520_pd_pwrseq_gpu_init(struct device *dev) { struct auxiliary_device *adev; @@ -169,7 +196,7 @@ static int th1520_pd_pwrseq_gpu_init(struct device *dev) return ret; } =20 - return devm_add_action_or_reset(dev, th1520_pd_pwrseq_unregister_adev, + return devm_add_action_or_reset(dev, th1520_pd_unregister_adev, adev); } =20 @@ -235,6 +262,10 @@ static int th1520_pd_probe(struct platform_device *pde= v) if (ret) goto err_clean_provider; =20 + ret =3D th1520_pd_reboot_init(dev, aon_chan); + if (ret) + goto err_clean_provider; + return 0; =20 err_clean_provider: --=20 2.50.1