Merge tag 'pmdomain-v6.18' of git://git.kernel.org/pub/scm/linux/kernel/git/ulfh/linux-pm

Pull pmdomain updates from Ulf Hansson:

 - amlogic: Add support for S6/S7/S7D power-domains controller

 - imx: Add support for i.MX91 power-domains

 - marvell: Add support for PXA1908 power-domains

 - mediatek:
    - Add support for modem power sequence
    - Add support for RTFF Hardware in MT8196/MT6991

 - qcom: Align power-domain definitions for rpmpd

 - rockchip: Default to use power-domain support

 - thead: Create auxiliary device along with a corresponding reset
   driver

 - ti: Synchronize on/off state with HW-state for ti-sci power-domains

* tag 'pmdomain-v6.18' of git://git.kernel.org/pub/scm/linux/kernel/git/ulfh/linux-pm: (25 commits)
  pmdomain: thead: Fix error pointer vs NULL bug in th1520_pd_reboot_init()
  pmdomain: thead: create auxiliary device for rebooting
  driver: reset: th1520-aon: add driver for poweroff/reboot via AON FW
  pmdomain: mediatek: airoha: convert from round_rate() to determine_rate()
  pmdomain: rockchip: enable ROCKCHIP_PM_DOMAINS with ARCH_ROCKCHIP
  pmdomain: marvell: Add PXA1908 power domains
  dt-bindings: clock: marvell,pxa1908: Add syscon compatible to apmu
  pmdomain: ti-sci: Set PD on/off state according to the HW state
  pmdomain: amlogic: Add support for S6 S7 S7D power domains controller
  dt-bindings: power: add Amlogic S6 S7 S7D power domains
  pmdomain: mediatek: Convert all SoCs to new style regmap retrieval
  pmdomain: mediatek: Add support for RTFF Hardware in MT8196/MT6991
  pmdomain: mediatek: Add support for modem power sequences
  pmdomain: mediatek: Move ctl sequences out of power_on/off functions
  pmdomain: mediatek: Handle SoCs with inverted SRAM power-down bits
  pmdomain: mediatek: Refactor bus protection regmaps retrieval
  dt-bindings: power: mediatek: Document access-controllers property
  pmdomain: remove unneeded 'fast_io' parameter in regmap_config
  pmdomain: imx93-blk-ctrl: mask DSI and PXP PD domain register on i.MX91
  pmdomain: imx93-blk-ctrl: use ARRAY_SIZE() instead of hardcode number
  ...
This commit is contained in:
Linus Torvalds
2025-10-01 11:51:53 -07:00
38 changed files with 1590 additions and 466 deletions

View File

@@ -225,6 +225,13 @@ config POWER_RESET_ST
help
Reset support for STMicroelectronics boards.
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

View File

@@ -25,6 +25,7 @@ obj-$(CONFIG_POWER_RESET_QNAP) += qnap-poweroff.o
obj-$(CONFIG_POWER_RESET_REGULATOR) += regulator-poweroff.o
obj-$(CONFIG_POWER_RESET_RESTART) += restart-poweroff.o
obj-$(CONFIG_POWER_RESET_ST) += st-poweroff.o
obj-$(CONFIG_POWER_RESET_TH1520_AON) += th1520-aon-reboot.o
obj-$(CONFIG_POWER_RESET_TORADEX_EC) += tdx-ec-poweroff.o
obj-$(CONFIG_POWER_RESET_TPS65086) += tps65086-restart.o
obj-$(CONFIG_POWER_RESET_VERSATILE) += arm-versatile-reboot.o

View File

@@ -0,0 +1,98 @@
// SPDX-License-Identifier: GPL-2.0
/*
* T-HEAD TH1520 AON Firmware Reboot Driver
*
* Copyright (c) 2025 Icenowy Zheng <uwu@icenowy.me>
*/
#include <linux/auxiliary_bus.h>
#include <linux/firmware/thead/thead,th1520-aon.h>
#include <linux/module.h>
#include <linux/notifier.h>
#include <linux/of.h>
#include <linux/reboot.h>
#include <linux/slab.h>
#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 = data->cb_data;
struct th1520_aon_msg_empty_body msg = {};
msg.hdr.svc = TH1520_AON_RPC_SVC_WDG;
msg.hdr.func = TH1520_AON_WDG_FUNC_POWER_OFF;
msg.hdr.size = 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 = data->cb_data;
struct th1520_aon_msg_empty_body msg = {};
msg.hdr.svc = TH1520_AON_RPC_SVC_WDG;
msg.hdr.func = TH1520_AON_WDG_FUNC_RESTART;
msg.hdr.size = 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 = &adev->dev;
int ret;
/* Expect struct th1520_aon_chan to be passed via platform_data */
ret = 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 = 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[] = {
{ .name = "th1520_pm_domains.reboot" },
{},
};
MODULE_DEVICE_TABLE(auxiliary, th1520_aon_reboot_id_table);
static struct auxiliary_driver th1520_aon_reboot_driver = {
.driver = {
.name = "th1520-aon-reboot",
},
.probe = th1520_aon_reboot_probe,
.id_table = th1520_aon_reboot_id_table,
};
module_auxiliary_driver(th1520_aon_reboot_driver);
MODULE_AUTHOR("Icenowy Zheng <uwu@icenowy.me>");
MODULE_DESCRIPTION("T-HEAD TH1520 AON-firmware-based reboot driver");
MODULE_LICENSE("GPL");