From nobody Thu Oct 2 09:21:03 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 EB8F2319601; Thu, 18 Sep 2025 17:34:03 +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=1758216846; cv=pass; b=FZ2e+SazMOTMynwrGtpXv9s1UnXil9VxRmSjdVy138G4b+OuZI37vFQIYUHVHeblnZbzfMZXVCSmdjmIRiO+5HwXcTUpvsSA7OsjDBf27wJpsSqUb16CoN4QWfNvKWqAFYvzJjg87IX5yv1I27rRrUMiA6Lz9y0+HatthgpSQrk= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758216846; c=relaxed/simple; bh=/+8jkfQ4KBN4fxaL3atGnZP9oPlYA5j5pCPdhpXPMPs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=W8I8xs7bKxESwzUBOz3YJ4wU5/bNxCTlZLiYFXlVj8QGjGXHXZsmaACV8x+A41bIwUQlQK++H3NWLHb9V1wZsaVZbmzv4Ze+Kh6p7ly31Odt10RMWqKGnsG8fZfrlAXiaWvzI4oFOLXHRc1ROywl9A6Ypi6WiV/llVI5GRkTwJk= 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=U5I9zyl6; 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="U5I9zyl6" ARC-Seal: i=1; a=rsa-sha256; t=1758216828; cv=none; d=zohomail.com; s=zohoarc; b=kSods2vewC8Mcjemi3n5aZxmiFB3zLrOtC1xmFmctnyt/E/hnhxK3lVy/7PQDJkTF975w24i3HKeqJC9lTk9owxYH7InIpEfiWZfNNs+XWU4e5D6EU68UNzO0aZMgiaVLGkWLtFvf+752hi15eEs35x82UqYycXedyrq9miimro= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1758216828; 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=dIOj/wQCu+bG4GzEt4OQqSjsMqHBTnI0OcYbetMjGYU=; b=Fg1l/VL/A5u+l1H/Ol3XZ2fD2/DvDOeolS+qiNZhBQ/CeGD5jsdpptSgdvikTe9CVga8MgVUwXS2OP1/ogzN9HVv4hQiMlkOj9/rrkTUi4u4sgQI/FUAG4F6p7Vd0LTLxjxAHuCrI15GeXHzNEOxon0kTA3cCxsC/woIir9yGM8= 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=1758216828; 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=dIOj/wQCu+bG4GzEt4OQqSjsMqHBTnI0OcYbetMjGYU=; b=U5I9zyl6pdPTi62QEhUL06zgXywEdwfgOeuJFRnUVDfXcQ6gcM2CWhziSmXwrz5L E/FTWsky22uP+QXnslO1voodsv+X3H7FSGyfKcIuHANUw7T5cROGy28+OvqeHWGX1q+ t9Ewnxjn8fFhtPmcBkQvB7r88ngo43ROwW+qOWRr82u4SGCOxUU7fBmnBd0M8aWcSep MjG09WcSK45qYlNxE/l51MTvC7tD7G97tGhK6Olm/hYT5fv6ZDqgDB66BRFSQ/x1COb LAdRTaO5GNXFo2eBl9cDEoLOXgMwMCUxMhpEtjtAKo9UKBxpHNctn5F9J6amduKcia5 D1dNd89Jyw== Received: by mx.zohomail.com with SMTPS id 175821682656261.42412979027654; Thu, 18 Sep 2025 10:33:46 -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 , Sebastian Reichel Subject: [PATCH v2 1/2] driver: reset: th1520-aon: add driver for poweroff/reboot via AON FW Date: Fri, 19 Sep 2025 01:33:22 +0800 Message-ID: <20250918173323.340738-2-uwu@icenowy.me> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20250918173323.340738-1-uwu@icenowy.me> References: <20250918173323.340738-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 --- Changes in v2: - Added Sebastian's ACK. 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 f6206963efbf0..5cb0fa3792d14 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -21763,6 +21763,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..ec249667a0ffd --- /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.51.0 From nobody Thu Oct 2 09:21:03 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 393A731A54D; Thu, 18 Sep 2025 17:34:07 +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=1758216849; cv=pass; b=NZpfh4+mh3pgq4G/BdNsoMbgUvALHpCaCAYBCjxmK6AMtFGDjp0zWbJ6tMiFuzLkigQIuP/RyyxSTa6r8B+KV+iUj2Noejprjfcb6NDcmq9qvcwuj+79GJeqtpKR3FNk4vVpOzDS9o8Sd31e5jIC0jWi1sX7wwLqCf9KMjKPJxo= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758216849; c=relaxed/simple; bh=+nfB0fQiINFxD7VnPVNGxeX2KZATIEwRDmxJnHC1ZQ4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Vry6KglCXa8M0rQ9jXAiKOW3Rr5qoZvSgycY/pmH+mo07lVtLKeihDZdG3aSCwf5jSk+R50HkXiBTgOwnt41XmQU5onKt1ayzkxCe0kh3DCXubf/LveihcXDZPnIfGqjcxJRHl+8sI/o3cTAB+Hngg/v0MQUESRyR6ynUNRfUcs= 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=UUX3oyxl; 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="UUX3oyxl" ARC-Seal: i=1; a=rsa-sha256; t=1758216834; cv=none; d=zohomail.com; s=zohoarc; b=jQ4Z/FhppDPJRcR308Tfk3OtC4kU9/BoPy/iN5RHx2Z9lVLsihsl6Ypd5PhDxferk6ZfWWtZBCwcDMdbvWdB571xMEJBBDRQMQXt++Dpjz7umlpKfSCU6nhBkwBejK3dv691rjNwUdCvegS+8X7A/R1iCd87gyWH6+fp7pjvhC8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1758216834; 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=lEFxTFHiyI2q/oDLkp6vLKAusartnU5WLpPBBCAmUB4=; b=XL0LoWTCect3d6Ld7kol6d0cVSQxdghvMQ68o3EpiECEDamc+4hemSM+XT8WEhas7Kgz1q+gaNlwvd7jHF13xqYw9ccp7N0m+LtemC8KGEyVNs4D63d4KG9vaLL4zRoLBbiPwYvC68dEAz0A8gl06RqifFcdXV4adfqtX8LNPEI= 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=1758216834; 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=lEFxTFHiyI2q/oDLkp6vLKAusartnU5WLpPBBCAmUB4=; b=UUX3oyxl32yNEYujg2yPxxXKznw0246z9eigktItrIPWUPNddSJa6IySPM0PWpng Lks207vEty3vTFFkW7ryb72EyJgKyifzvr+LcwIzy+iQiXOHGBoLtPV4ME+Pf/HSyqH dB2WvL8EUY7DD4XxU7OJSHGBLPuvCv7svs8dj7WH6cusy6PsB/qvGycacDMJ1a7lS9r 7gN7YhoTN0VHY+WV4lZCsNGzWmFnp6jSg1hvojsS8Sw1VGP91IZrwIQ1j08XrxTzGxf AACyr2yBjtbNirZlegdshDwW3g77maPfpkSxG0zlreiKZX99eugecBzK53L9DfrHH45 u7+u+k0xcg== Received: by mx.zohomail.com with SMTPS id 175821683282116.852562929362648; Thu, 18 Sep 2025 10:33:52 -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 v2 2/2] pmdomain: thead: create auxiliary device for rebooting Date: Fri, 19 Sep 2025 01:33:23 +0800 Message-ID: <20250918173323.340738-3-uwu@icenowy.me> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20250918173323.340738-1-uwu@icenowy.me> References: <20250918173323.340738-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 --- Changes in v2: - Rewritten to use devm_auxiliary_device_create. drivers/pmdomain/thead/th1520-pm-domains.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/drivers/pmdomain/thead/th1520-pm-domains.c b/drivers/pmdomain/= thead/th1520-pm-domains.c index 9040b698e7f7f..5213994101a59 100644 --- a/drivers/pmdomain/thead/th1520-pm-domains.c +++ b/drivers/pmdomain/thead/th1520-pm-domains.c @@ -173,6 +173,16 @@ static int th1520_pd_pwrseq_gpu_init(struct device *de= v) adev); } =20 +static int th1520_pd_reboot_init(struct device *dev, + struct th1520_aon_chan *aon_chan) +{ + struct auxiliary_device *adev; + + adev =3D devm_auxiliary_device_create(dev, "reboot", aon_chan); + + return PTR_ERR_OR_ZERO(adev); +} + static int th1520_pd_probe(struct platform_device *pdev) { struct generic_pm_domain **domains; @@ -235,6 +245,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.51.0