mail archive of the barebox mailing list
 help / color / mirror / Atom feed
* [PATCH 1/4] restart: give poweroff_machine and restart_machine a flag parameter
@ 2025-04-22  7:56 Ahmad Fatoum
  2025-04-22  7:56 ` [PATCH 2/4] restart: give all restart_handler::restart callbacks a flags parameter Ahmad Fatoum
                   ` (3 more replies)
  0 siblings, 4 replies; 7+ messages in thread
From: Ahmad Fatoum @ 2025-04-22  7:56 UTC (permalink / raw)
  To: barebox

From: Ahmad Fatoum <a.fatoum@barebox.org>

We currently do differentiate between warm and cold reset, but
restart_machine has no flag to choose between them and instead users
need to iterate over all registered handlers and choose a suitable one
and then call hat handler's action.

In preparation for making warm/cold reset and any other flags we may
require a feature an argument to the driver action, change all
poweroff_machine and restart_machine calls to take a flags parameter.

Signed-off-by: Ahmad Fatoum <a.fatoum@barebox.org>
---
 arch/arm/boards/zii-common/board.c | 2 +-
 arch/arm/cpu/psci.c                | 2 +-
 arch/arm/lib32/bootm.c             | 4 ++--
 arch/arm/mach-at91/bootstrap.c     | 2 +-
 arch/arm/mach-mvebu/kwbootimage.c  | 2 +-
 arch/arm/mach-tegra/tegra20-pmc.c  | 2 +-
 arch/mips/lib/bootm.c              | 2 +-
 arch/powerpc/lib/ppclinux.c        | 2 +-
 commands/poweroff.c                | 2 +-
 common/fastboot.c                  | 2 +-
 common/misc.c                      | 4 ++--
 common/poweroff.c                  | 2 +-
 common/ratp/reset.c                | 2 +-
 common/restart.c                   | 2 +-
 drivers/input/specialkeys.c        | 4 ++--
 include/poweroff.h                 | 2 +-
 include/restart.h                  | 2 +-
 17 files changed, 20 insertions(+), 20 deletions(-)

diff --git a/arch/arm/boards/zii-common/board.c b/arch/arm/boards/zii-common/board.c
index 96f9243591f2..29d9acb5ab07 100644
--- a/arch/arm/boards/zii-common/board.c
+++ b/arch/arm/boards/zii-common/board.c
@@ -122,7 +122,7 @@ static int rdu_i210_invm(void)
 	pwrite(fd, &val, sizeof(val), 0);
 
 	shutdown_barebox();
-	restart_machine();
+	restart_machine(0);
 
 	return 0;
 }
diff --git a/arch/arm/cpu/psci.c b/arch/arm/cpu/psci.c
index 70c97e03a5ff..ed26a3138dfe 100644
--- a/arch/arm/cpu/psci.c
+++ b/arch/arm/cpu/psci.c
@@ -144,7 +144,7 @@ static unsigned long psci_system_reset(void)
 	if (psci_ops->system_reset)
 		psci_ops->system_reset();
 
-	restart_machine();
+	restart_machine(0);
 }
 
 /* Avoid missing prototype warning, called from assembly */
diff --git a/arch/arm/lib32/bootm.c b/arch/arm/lib32/bootm.c
index 625091ece1e9..017e9b0edc4b 100644
--- a/arch/arm/lib32/bootm.c
+++ b/arch/arm/lib32/bootm.c
@@ -337,7 +337,7 @@ static int __do_bootm_linux(struct image_data *data, unsigned long free_mem,
 	start_linux((void *)kernel, swap, initrd_start, initrd_size,
 		    fdt_load_address, state, tee);
 
-	restart_machine();
+	restart_machine(0);
 
 	return -ERESTARTSYS;
 }
@@ -695,7 +695,7 @@ static int do_bootm_aimage(struct image_data *data)
 
 		second();
 
-		restart_machine();
+		restart_machine(0);
 	}
 
 	close(fd);
diff --git a/arch/arm/mach-at91/bootstrap.c b/arch/arm/mach-at91/bootstrap.c
index fbf5fa78a157..0ccdef93477d 100644
--- a/arch/arm/mach-at91/bootstrap.c
+++ b/arch/arm/mach-at91/bootstrap.c
@@ -146,7 +146,7 @@ static void boot_mmc_disk_action(struct menu *m, struct menu_entry *me)
 
 static void boot_reset_action(struct menu *m, struct menu_entry *me)
 {
-	restart_machine();
+	restart_machine(0);
 }
 
 static void at91_bootstrap_menu(void)
diff --git a/arch/arm/mach-mvebu/kwbootimage.c b/arch/arm/mach-mvebu/kwbootimage.c
index 2bcc42fe5749..e016941075e2 100644
--- a/arch/arm/mach-mvebu/kwbootimage.c
+++ b/arch/arm/mach-mvebu/kwbootimage.c
@@ -64,7 +64,7 @@ static int do_bootm_kwbimage_v0_v1(struct image_data *data)
 
 	barebox();
 
-	restart_machine();
+	restart_machine(0);
 
 out_free:
 	free(barebox);
diff --git a/arch/arm/mach-tegra/tegra20-pmc.c b/arch/arm/mach-tegra/tegra20-pmc.c
index 11fd8c28be59..d4c28ac54142 100644
--- a/arch/arm/mach-tegra/tegra20-pmc.c
+++ b/arch/arm/mach-tegra/tegra20-pmc.c
@@ -221,7 +221,7 @@ static int tegra20_pmc_probe(struct device *dev)
 static int do_tegrarcm(int argc, char *argv[])
 {
 	writel(2, pmc_base + PMC_SCRATCH(0));
-	restart_machine();
+	restart_machine(0);
 
 	return 0;
 }
diff --git a/arch/mips/lib/bootm.c b/arch/mips/lib/bootm.c
index a623b1c83b35..2bc8283f7d7b 100644
--- a/arch/mips/lib/bootm.c
+++ b/arch/mips/lib/bootm.c
@@ -40,7 +40,7 @@ static int do_bootm_barebox(struct image_data *data)
 
 	barebox(-2, fdt);
 
-	restart_machine();
+	restart_machine(0);
 }
 
 static struct image_handler barebox_handler = {
diff --git a/arch/powerpc/lib/ppclinux.c b/arch/powerpc/lib/ppclinux.c
index 9b8404962cea..6b00c2ee5756 100644
--- a/arch/powerpc/lib/ppclinux.c
+++ b/arch/powerpc/lib/ppclinux.c
@@ -98,7 +98,7 @@ static int do_bootm_linux(struct image_data *data)
 	 */
 	kernel(fdt, kernel, 0, 0, 0);
 
-	restart_machine();
+	restart_machine(0);
 
 error:
 	return -1;
diff --git a/commands/poweroff.c b/commands/poweroff.c
index 9320c07a6c5f..5c793fc4e3ae 100644
--- a/commands/poweroff.c
+++ b/commands/poweroff.c
@@ -9,7 +9,7 @@
 
 static int cmd_poweroff(int argc, char *argv[])
 {
-	poweroff_machine();
+	poweroff_machine(0);
 
 	/* Not reached */
 	return 1;
diff --git a/common/fastboot.c b/common/fastboot.c
index 60bef0ec776b..a444b81a7bec 100644
--- a/common/fastboot.c
+++ b/common/fastboot.c
@@ -284,7 +284,7 @@ int fastboot_tx_print(struct fastboot *fb, enum fastboot_msg_type type,
 static void cb_reboot(struct fastboot *fb, const char *cmd)
 {
 	fastboot_tx_print(fb, FASTBOOT_MSG_OKAY, "");
-	restart_machine();
+	restart_machine(0);
 }
 
 static void cb_getvar(struct fastboot *fb, const char *cmd)
diff --git a/common/misc.c b/common/misc.c
index 375fbbb199c7..ce1fbc284f48 100644
--- a/common/misc.c
+++ b/common/misc.c
@@ -303,9 +303,9 @@ static void __noreturn do_panic(bool stacktrace, const char *fmt, va_list ap)
 	mdelay_non_interruptible(100);	/* allow messages to go out */
 
 	if (IS_ENABLED(CONFIG_PANIC_POWEROFF))
-		poweroff_machine();
+		poweroff_machine(0);
 	else
-		restart_machine();
+		restart_machine(0);
 }
 
 void __noreturn panic(const char *fmt, ...)
diff --git a/common/poweroff.c b/common/poweroff.c
index 65909c614145..d453a9a98025 100644
--- a/common/poweroff.c
+++ b/common/poweroff.c
@@ -63,7 +63,7 @@ int poweroff_handler_register_fn(void (*poweroff_fn)(struct poweroff_handler *))
 /**
  * poweroff_machine() - power off the machine
  */
-void __noreturn poweroff_machine(void)
+void __noreturn poweroff_machine(unsigned long flags)
 {
 	struct poweroff_handler *handler = NULL, *tmp;
 	unsigned int priority = 0;
diff --git a/common/ratp/reset.c b/common/ratp/reset.c
index 060475169ba3..c6453b094722 100644
--- a/common/ratp/reset.c
+++ b/common/ratp/reset.c
@@ -43,7 +43,7 @@ static int ratp_cmd_reset(const struct ratp_bb *req, int req_len,
 	if (!reset_req->force)
 		shutdown_barebox();
 
-	restart_machine();
+	restart_machine(0);
 	/* Not reached */
 	return 1;
 }
diff --git a/common/restart.c b/common/restart.c
index e54b4d7c5b82..2ab0196542d8 100644
--- a/common/restart.c
+++ b/common/restart.c
@@ -102,7 +102,7 @@ struct restart_handler *restart_handler_get_by_name(const char *name, int flags)
 /**
  * restart_machine() - reset the whole system
  */
-void __noreturn restart_machine(void)
+void __noreturn restart_machine(unsigned long flags)
 {
 	struct restart_handler *rst;
 
diff --git a/drivers/input/specialkeys.c b/drivers/input/specialkeys.c
index f9693dc383c4..9db93804f82e 100644
--- a/drivers/input/specialkeys.c
+++ b/drivers/input/specialkeys.c
@@ -14,12 +14,12 @@ static void input_specialkeys_notify(struct input_notifier *in,
 	switch (ev->code) {
 	case KEY_RESTART:
 		pr_info("Triggering reset due to special key.\n");
-		restart_machine();
+		restart_machine(0);
 		break;
 
 	case KEY_POWER:
 		pr_info("Triggering poweroff due to special key.\n");
-		poweroff_machine();
+		poweroff_machine(0);
 		break;
 	}
 
diff --git a/include/poweroff.h b/include/poweroff.h
index 217b68cdf966..307097c01541 100644
--- a/include/poweroff.h
+++ b/include/poweroff.h
@@ -2,7 +2,7 @@
 #ifndef __INCLUDE_POWEROFF_H
 #define __INCLUDE_POWEROFF_H
 
-void __noreturn poweroff_machine(void);
+void __noreturn poweroff_machine(unsigned long poweroff_flags);
 
 struct poweroff_handler {
 	void (*poweroff)(struct poweroff_handler *);
diff --git a/include/restart.h b/include/restart.h
index 02db7915075e..75d96111ea1b 100644
--- a/include/restart.h
+++ b/include/restart.h
@@ -9,7 +9,7 @@
 struct device_node;
 
 void restart_handlers_print(void);
-void __noreturn restart_machine(void);
+void __noreturn restart_machine(unsigned long restart_flags);
 struct restart_handler *restart_handler_get_by_name(const char *name, int flags);
 
 struct device_node;
-- 
2.39.5




^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH 2/4] restart: give all restart_handler::restart callbacks a flags parameter
  2025-04-22  7:56 [PATCH 1/4] restart: give poweroff_machine and restart_machine a flag parameter Ahmad Fatoum
@ 2025-04-22  7:56 ` Ahmad Fatoum
  2025-04-22  7:56 ` [PATCH 3/4] poweroff: give all poweroff_handler::poweroff " Ahmad Fatoum
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 7+ messages in thread
From: Ahmad Fatoum @ 2025-04-22  7:56 UTC (permalink / raw)
  To: barebox

From: Ahmad Fatoum <a.fatoum@barebox.org>

Warm reset will become an argument to the reset function that drivers
can check and act accordingly. This will also make synchronization with
Linux drivers easier.

Prepare for that by adapting the callback of all our restart drivers.

Signed-off-by: Ahmad Fatoum <a.fatoum@barebox.org>
---
 arch/arm/cpu/psci-client.c                     | 3 ++-
 arch/arm/mach-at91/at91rm9200_time.c           | 3 ++-
 arch/arm/mach-at91/at91sam9260.c               | 3 ++-
 arch/arm/mach-at91/at91sam9261.c               | 3 ++-
 arch/arm/mach-at91/at91sam9263.c               | 3 ++-
 arch/arm/mach-at91/at91sam9_rst.c              | 6 ++++--
 arch/arm/mach-at91/at91sam9g45.c               | 3 ++-
 arch/arm/mach-at91/at91sam9n12.c               | 3 ++-
 arch/arm/mach-at91/at91sam9x5.c                | 3 ++-
 arch/arm/mach-at91/sama5d4.c                   | 3 ++-
 arch/arm/mach-clps711x/common.c                | 3 ++-
 arch/arm/mach-layerscape/restart.c             | 3 ++-
 arch/arm/mach-mvebu/armada-370-xp.c            | 3 ++-
 arch/arm/mach-mvebu/dove.c                     | 3 ++-
 arch/arm/mach-mvebu/kirkwood.c                 | 3 ++-
 arch/arm/mach-mxs/soc-imx23.c                  | 3 ++-
 arch/arm/mach-mxs/soc-imx28.c                  | 3 ++-
 arch/arm/mach-omap/am33xx_generic.c            | 3 ++-
 arch/arm/mach-omap/omap3_generic.c             | 3 ++-
 arch/arm/mach-omap/omap4_generic.c             | 3 ++-
 arch/arm/mach-pxa/common.c                     | 3 ++-
 arch/arm/mach-rockchip/rk3188.c                | 3 ++-
 arch/arm/mach-rockchip/rk3288.c                | 3 ++-
 arch/arm/mach-socfpga/arria10-generic.c        | 3 ++-
 arch/arm/mach-socfpga/cyclone5-reset-manager.c | 3 ++-
 arch/arm/mach-tegra/tegra20-pmc.c              | 3 ++-
 arch/arm/mach-versatile/core.c                 | 3 ++-
 arch/arm/mach-vexpress/reset.c                 | 3 ++-
 arch/arm/mach-zynq/zynq.c                      | 3 ++-
 arch/kvx/cpu/reset.c                           | 3 ++-
 arch/mips/mach-ar231x/ar231x_reset.c           | 3 ++-
 arch/mips/mach-ath79/reset.c                   | 3 ++-
 arch/mips/mach-bcm47xx/reset.c                 | 3 ++-
 arch/mips/mach-loongson/loongson1_reset.c      | 3 ++-
 arch/openrisc/cpu/cpu.c                        | 3 ++-
 arch/powerpc/mach-mpc5xxx/cpu.c                | 3 ++-
 arch/powerpc/mach-mpc85xx/cpu.c                | 3 ++-
 arch/riscv/boards/riscvemu/board.c             | 3 ++-
 arch/sandbox/board/power.c                     | 6 ++++--
 commands/reset.c                               | 2 +-
 common/restart.c                               | 5 +++--
 drivers/clk/rockchip/clk.c                     | 3 ++-
 drivers/mfd/da9053.c                           | 3 ++-
 drivers/mfd/da9063.c                           | 3 ++-
 drivers/mfd/rn5t568.c                          | 3 ++-
 drivers/power/reset/gpio-restart.c             | 3 ++-
 drivers/power/reset/stm32-reboot.c             | 3 ++-
 drivers/power/reset/syscon-reboot.c            | 3 ++-
 drivers/watchdog/bcm2835_wdt.c                 | 3 ++-
 drivers/watchdog/imxwd.c                       | 8 +++++---
 drivers/watchdog/jz4740.c                      | 3 ++-
 drivers/watchdog/rave-sp-wdt.c                 | 3 ++-
 drivers/watchdog/stpmic1_wdt.c                 | 3 ++-
 drivers/watchdog/wd_core.c                     | 3 ++-
 efi/payload/init.c                             | 3 ++-
 include/restart.h                              | 5 +++--
 56 files changed, 120 insertions(+), 62 deletions(-)

diff --git a/arch/arm/cpu/psci-client.c b/arch/arm/cpu/psci-client.c
index c865e754fd27..70436bde0a3a 100644
--- a/arch/arm/cpu/psci-client.c
+++ b/arch/arm/cpu/psci-client.c
@@ -30,7 +30,8 @@ static void __noreturn psci_poweroff(struct poweroff_handler *handler)
 	psci_invoke_noreturn(ARM_PSCI_0_2_FN_SYSTEM_OFF);
 }
 
-static void __noreturn psci_restart(struct restart_handler *rst)
+static void __noreturn psci_restart(struct restart_handler *rst,
+				    unsigned long flags)
 {
 	psci_invoke_noreturn(ARM_PSCI_0_2_FN_SYSTEM_RESET);
 }
diff --git a/arch/arm/mach-at91/at91rm9200_time.c b/arch/arm/mach-at91/at91rm9200_time.c
index c8394d3d74b2..61d78ba24b32 100644
--- a/arch/arm/mach-at91/at91rm9200_time.c
+++ b/arch/arm/mach-at91/at91rm9200_time.c
@@ -55,7 +55,8 @@ core_initcall(clocksource_init);
 /*
  * Reset the cpu through the reset controller
  */
-static void __noreturn at91rm9200_restart_soc(struct restart_handler *rst)
+static void __noreturn at91rm9200_restart_soc(struct restart_handler *rst,
+					      unsigned long flags)
 {
 	/*
 	 * Perform a hardware reset with the use of the Watchdog timer.
diff --git a/arch/arm/mach-at91/at91sam9260.c b/arch/arm/mach-at91/at91sam9260.c
index 623c01605f3d..411516c3c657 100644
--- a/arch/arm/mach-at91/at91sam9260.c
+++ b/arch/arm/mach-at91/at91sam9260.c
@@ -226,7 +226,8 @@ static void __init at91sam9260_register_clocks(void)
 	clk_register(&pck1);
 }
 
-static void at91sam9260_restart(struct restart_handler *rst)
+static void at91sam9260_restart(struct restart_handler *rst,
+				unsigned long flags)
 {
 	at91sam9_reset(IOMEM(AT91SAM9260_BASE_SDRAMC),
 		       IOMEM(AT91SAM9260_BASE_RSTC + AT91_RSTC_CR));
diff --git a/arch/arm/mach-at91/at91sam9261.c b/arch/arm/mach-at91/at91sam9261.c
index df35b7239c16..188efc3f56f0 100644
--- a/arch/arm/mach-at91/at91sam9261.c
+++ b/arch/arm/mach-at91/at91sam9261.c
@@ -218,7 +218,8 @@ static void at91sam9261_register_clocks(void)
 	clk_register(&hck1);
 }
 
-static void at91sam9261_restart(struct restart_handler *rst)
+static void at91sam9261_restart(struct restart_handler *rst,
+				unsigned long flags)
 {
 	at91sam9_reset(IOMEM(AT91SAM9261_BASE_SDRAMC),
 		       IOMEM(AT91SAM9261_BASE_RSTC + AT91_RSTC_CR));
diff --git a/arch/arm/mach-at91/at91sam9263.c b/arch/arm/mach-at91/at91sam9263.c
index 2241e568d4f6..f1cf16bbc1a9 100644
--- a/arch/arm/mach-at91/at91sam9263.c
+++ b/arch/arm/mach-at91/at91sam9263.c
@@ -236,7 +236,8 @@ static void __init at91sam9263_register_clocks(void)
 	clk_register(&pck3);
 }
 
-static void at91sam9263_restart(struct restart_handler *rst)
+static void at91sam9263_restart(struct restart_handler *rst,
+				unsigned long flags)
 {
 	at91sam9_reset(IOMEM(AT91SAM9263_BASE_SDRAMC0),
 		       IOMEM(AT91SAM9263_BASE_RSTC + AT91_RSTC_CR));
diff --git a/arch/arm/mach-at91/at91sam9_rst.c b/arch/arm/mach-at91/at91sam9_rst.c
index d2c008e3439a..7bbe3f9fa952 100644
--- a/arch/arm/mach-at91/at91sam9_rst.c
+++ b/arch/arm/mach-at91/at91sam9_rst.c
@@ -44,7 +44,8 @@ static void at91sam9x_set_reset_reason(struct device *dev,
 	reset_source_set(type);
 }
 
-static void __noreturn at91sam9x_restart_soc(struct restart_handler *rst)
+static void __noreturn at91sam9x_restart_soc(struct restart_handler *rst,
+					     unsigned long flags)
 {
 	struct at91sam9x_rst *priv = container_of(rst, struct at91sam9x_rst, restart);
 
@@ -59,7 +60,8 @@ static void __noreturn at91sam9x_restart_soc(struct restart_handler *rst)
 
 void __noreturn at91sam9_reset(void __iomem *sdram, void __iomem *rstc_cr);
 
-static void __noreturn at91sam9260_restart_soc(struct restart_handler *rst)
+static void __noreturn at91sam9260_restart_soc(struct restart_handler *rst,
+					       unsigned long flags)
 {
 	struct at91sam9x_rst *priv = container_of(rst, struct at91sam9x_rst, restart);
 
diff --git a/arch/arm/mach-at91/at91sam9g45.c b/arch/arm/mach-at91/at91sam9g45.c
index 0d8d399fc590..12d3d0521e19 100644
--- a/arch/arm/mach-at91/at91sam9g45.c
+++ b/arch/arm/mach-at91/at91sam9g45.c
@@ -251,7 +251,8 @@ static void __init at91sam9g45_register_clocks(void)
 	clk_register(&pck1);
 }
 
-static void at91sam9g45_restart(struct restart_handler *rst)
+static void at91sam9g45_restart(struct restart_handler *rst,
+				unsigned long flags)
 {
 	at91sam9g45_reset(IOMEM(AT91SAM9G45_BASE_DDRSDRC0),
 			  IOMEM(AT91SAM9G45_BASE_RSTC + AT91_RSTC_CR));
diff --git a/arch/arm/mach-at91/at91sam9n12.c b/arch/arm/mach-at91/at91sam9n12.c
index e6f4495fc12d..af3a05142c79 100644
--- a/arch/arm/mach-at91/at91sam9n12.c
+++ b/arch/arm/mach-at91/at91sam9n12.c
@@ -204,7 +204,8 @@ static void __init at91sam9n12_register_clocks(void)
 
 }
 
-static void at91sam9n12_restart(struct restart_handler *rst)
+static void at91sam9n12_restart(struct restart_handler *rst,
+				unsigned long flags)
 {
 	at91sam9g45_reset(IOMEM(AT91SAM9N12_BASE_DDRSDRC0),
 			  IOMEM(AT91SAM9N12_BASE_RSTC + AT91_RSTC_CR));
diff --git a/arch/arm/mach-at91/at91sam9x5.c b/arch/arm/mach-at91/at91sam9x5.c
index 0b0fbc6ff369..a11631169123 100644
--- a/arch/arm/mach-at91/at91sam9x5.c
+++ b/arch/arm/mach-at91/at91sam9x5.c
@@ -7,7 +7,8 @@
 #include <mach/at91/board.h>
 #include <mach/at91/at91_rstc.h>
 
-static void at91sam9x5_restart(struct restart_handler *rst)
+static void at91sam9x5_restart(struct restart_handler *rst,
+			       unsigned long flags)
 {
 	at91sam9g45_reset(IOMEM(AT91SAM9X5_BASE_DDRSDRC0),
 			  IOMEM(AT91SAM9X5_BASE_RSTC + AT91_RSTC_CR));
diff --git a/arch/arm/mach-at91/sama5d4.c b/arch/arm/mach-at91/sama5d4.c
index 8417dedbd1cf..c9b0605070c5 100644
--- a/arch/arm/mach-at91/sama5d4.c
+++ b/arch/arm/mach-at91/sama5d4.c
@@ -281,7 +281,8 @@ static void __init sama5d4_register_clocks(void)
 	clk_register(&pck2);
 }
 
-static void sama5d4_restart(struct restart_handler *rst)
+static void sama5d4_restart(struct restart_handler *rst,
+			    unsigned long flags)
 {
 	at91sam9g45_reset(IOMEM(SAMA5D4_BASE_MPDDRC),
 			  IOMEM(SAMA5D4_BASE_RSTC + AT91_RSTC_CR));
diff --git a/arch/arm/mach-clps711x/common.c b/arch/arm/mach-clps711x/common.c
index 60db39ad1153..06912b26196c 100644
--- a/arch/arm/mach-clps711x/common.c
+++ b/arch/arm/mach-clps711x/common.c
@@ -12,7 +12,8 @@
 
 static u32 remap_size = 0;
 
-static void __noreturn clps711x_restart(struct restart_handler *rst)
+static void __noreturn clps711x_restart(struct restart_handler *rst,
+					unsigned long flags)
 {
 	shutdown_barebox();
 
diff --git a/arch/arm/mach-layerscape/restart.c b/arch/arm/mach-layerscape/restart.c
index 138a82bdb530..30def98685ed 100644
--- a/arch/arm/mach-layerscape/restart.c
+++ b/arch/arm/mach-layerscape/restart.c
@@ -7,7 +7,8 @@
 #include <soc/fsl/fsl_immap.h>
 #include <mach/layerscape/layerscape.h>
 
-static void ls102xa_restart(struct restart_handler *rst)
+static void ls102xa_restart(struct restart_handler *rst,
+			    unsigned long flags)
 {
 	void __iomem *rcr = IOMEM(LSCH2_RST_ADDR);
 
diff --git a/arch/arm/mach-mvebu/armada-370-xp.c b/arch/arm/mach-mvebu/armada-370-xp.c
index 1bbc6bd22645..481e956352fa 100644
--- a/arch/arm/mach-mvebu/armada-370-xp.c
+++ b/arch/arm/mach-mvebu/armada-370-xp.c
@@ -63,7 +63,8 @@ static int armada_xp_soc_id_fixup(void)
 	return 0;
 }
 
-static void __noreturn armada_370_xp_restart_soc(struct restart_handler *rst)
+static void __noreturn armada_370_xp_restart_soc(struct restart_handler *rst,
+						 unsigned long flags)
 {
 	writel(0x1, ARMADA_370_XP_SYSCTL_BASE + 0x60);
 	writel(0x1, ARMADA_370_XP_SYSCTL_BASE + 0x64);
diff --git a/arch/arm/mach-mvebu/dove.c b/arch/arm/mach-mvebu/dove.c
index 2dd461c5c344..ab0dee405f63 100644
--- a/arch/arm/mach-mvebu/dove.c
+++ b/arch/arm/mach-mvebu/dove.c
@@ -9,7 +9,8 @@
 #include <linux/mbus.h>
 #include <mach/mvebu/dove-regs.h>
 
-static void __noreturn dove_restart_soc(struct restart_handler *rst)
+static void __noreturn dove_restart_soc(struct restart_handler *rst,
+					unsigned long flags)
 {
 	/* enable and assert RSTOUTn */
 	writel(SOFT_RESET_OUT_EN, DOVE_BRIDGE_BASE + BRIDGE_RSTOUT_MASK);
diff --git a/arch/arm/mach-mvebu/kirkwood.c b/arch/arm/mach-mvebu/kirkwood.c
index 4b5d1b716b72..19b05caa7391 100644
--- a/arch/arm/mach-mvebu/kirkwood.c
+++ b/arch/arm/mach-mvebu/kirkwood.c
@@ -9,7 +9,8 @@
 #include <linux/mbus.h>
 #include <mach/mvebu/kirkwood-regs.h>
 
-static void __noreturn kirkwood_restart_soc(struct restart_handler *rst)
+static void __noreturn kirkwood_restart_soc(struct restart_handler *rst,
+					    unsigned long flags)
 {
 	writel(SOFT_RESET_OUT_EN, KIRKWOOD_BRIDGE_BASE + BRIDGE_RSTOUT_MASK);
 	writel(SOFT_RESET_EN, KIRKWOOD_BRIDGE_BASE + BRIDGE_SYS_SOFT_RESET);
diff --git a/arch/arm/mach-mxs/soc-imx23.c b/arch/arm/mach-mxs/soc-imx23.c
index b799812c5296..c2d40fe7e469 100644
--- a/arch/arm/mach-mxs/soc-imx23.c
+++ b/arch/arm/mach-mxs/soc-imx23.c
@@ -15,7 +15,8 @@
 # define HW_CLKCTRL_RESET_CHIP (1 << 1)
 
 /* Reset the full i.MX23 SoC via a chipset feature */
-static void __noreturn imx23_restart_soc(struct restart_handler *rst)
+static void __noreturn imx23_restart_soc(struct restart_handler *rst,
+					 unsigned long flags)
 {
 	u32 reg;
 
diff --git a/arch/arm/mach-mxs/soc-imx28.c b/arch/arm/mach-mxs/soc-imx28.c
index 4a9697b8e40b..54fe1eea1839 100644
--- a/arch/arm/mach-mxs/soc-imx28.c
+++ b/arch/arm/mach-mxs/soc-imx28.c
@@ -16,7 +16,8 @@
 #define HW_CLKCTRL_WDOG_POR_DISABLE (1 << 5)
 
 /* Reset the full i.MX28 SoC via a chipset feature */
-static void __noreturn imx28_restart_soc(struct restart_handler *rst)
+static void __noreturn imx28_restart_soc(struct restart_handler *rst,
+					 unsigned long flags)
 {
 	u32 reg;
 
diff --git a/arch/arm/mach-omap/am33xx_generic.c b/arch/arm/mach-omap/am33xx_generic.c
index bcafc0677e38..4ab79aad50e4 100644
--- a/arch/arm/mach-omap/am33xx_generic.c
+++ b/arch/arm/mach-omap/am33xx_generic.c
@@ -30,7 +30,8 @@
 #include <mach/omap/gpmc.h>
 #include <reset_source.h>
 
-static void __noreturn am33xx_restart_soc(struct restart_handler *rst)
+static void __noreturn am33xx_restart_soc(struct restart_handler *rst,
+					  unsigned long flags)
 {
 	writel(AM33XX_PRM_RSTCTRL_RESET, AM33XX_PRM_RSTCTRL);
 
diff --git a/arch/arm/mach-omap/omap3_generic.c b/arch/arm/mach-omap/omap3_generic.c
index 33f78dd2d569..25bf1d611f23 100644
--- a/arch/arm/mach-omap/omap3_generic.c
+++ b/arch/arm/mach-omap/omap3_generic.c
@@ -54,7 +54,8 @@
  *
  * @return void
  */
-static void __noreturn omap3_restart_soc(struct restart_handler *rst)
+static void __noreturn omap3_restart_soc(struct restart_handler *rst,
+					 unsigned long flags)
 {
 	writel(OMAP3_PRM_RSTCTRL_RESET, OMAP3_PRM_REG(RSTCTRL));
 
diff --git a/arch/arm/mach-omap/omap4_generic.c b/arch/arm/mach-omap/omap4_generic.c
index bf77014b40a8..acc8473e4401 100644
--- a/arch/arm/mach-omap/omap4_generic.c
+++ b/arch/arm/mach-omap/omap4_generic.c
@@ -38,7 +38,8 @@
 #define EMIF_L3_CONFIG_VAL_SYS_10_LL_0		0x0A0000FF
 #define EMIF_L3_CONFIG_VAL_SYS_10_MPU_3_LL_0	0x0A300000
 
-static void __noreturn omap4_restart_soc(struct restart_handler *rst)
+static void __noreturn omap4_restart_soc(struct restart_handler *rst,
+					 unsigned long flags)
 {
 	writel(OMAP44XX_PRM_RSTCTRL_RESET, OMAP44XX_PRM_RSTCTRL);
 
diff --git a/arch/arm/mach-pxa/common.c b/arch/arm/mach-pxa/common.c
index e0bf1de4611c..1da1b580549a 100644
--- a/arch/arm/mach-pxa/common.c
+++ b/arch/arm/mach-pxa/common.c
@@ -26,7 +26,8 @@
 #define OWER_WME	(1 << 0)	/* Watch-dog Match Enable */
 #define OSSR_M3		(1 << 3)	/* Match status channel 3 */
 
-static void __noreturn pxa_restart_soc(struct restart_handler *rst)
+static void __noreturn pxa_restart_soc(struct restart_handler *rst,
+				       unsigned long flags)
 {
 	/* Clear last reset source */
 	pxa_clear_reset_source();
diff --git a/arch/arm/mach-rockchip/rk3188.c b/arch/arm/mach-rockchip/rk3188.c
index f1c20f6e528a..cfa364f9707d 100644
--- a/arch/arm/mach-rockchip/rk3188.c
+++ b/arch/arm/mach-rockchip/rk3188.c
@@ -18,7 +18,8 @@
 #include <mach/rockchip/rk3188-regs.h>
 #include <mach/rockchip/rockchip.h>
 
-static void __noreturn rockchip_restart_soc(struct restart_handler *rst)
+static void __noreturn rockchip_restart_soc(struct restart_handler *rst,
+					    unsigned long flags)
 {
 	/* Map bootrom from address 0 */
 	writel(RK_SOC_CON0_REMAP << 16, RK_GRF_BASE + RK_GRF_SOC_CON0);
diff --git a/arch/arm/mach-rockchip/rk3288.c b/arch/arm/mach-rockchip/rk3288.c
index 3a43e911db99..c3cf55ddb7bf 100644
--- a/arch/arm/mach-rockchip/rk3288.c
+++ b/arch/arm/mach-rockchip/rk3288.c
@@ -23,7 +23,8 @@
 #include <mach/rockchip/hardware.h>
 #include <mach/rockchip/rockchip.h>
 
-static void __noreturn rockchip_restart_soc(struct restart_handler *rst)
+static void __noreturn rockchip_restart_soc(struct restart_handler *rst,
+					    unsigned long flags)
 {
 	struct rk3288_cru *cru = (struct rk3288_cru *)RK3288_CRU_BASE;
 
diff --git a/arch/arm/mach-socfpga/arria10-generic.c b/arch/arm/mach-socfpga/arria10-generic.c
index d7ce6d84ab74..f74f069b4e4b 100644
--- a/arch/arm/mach-socfpga/arria10-generic.c
+++ b/arch/arm/mach-socfpga/arria10-generic.c
@@ -47,7 +47,8 @@ static void arria10_init_emac(void)
 }
 
 /* Write the reset manager register to cause reset */
-static void __noreturn arria10_restart_soc(struct restart_handler *rst)
+static void __noreturn arria10_restart_soc(struct restart_handler *rst,
+					   unsigned long flags)
 {
 	/* request a warm reset */
 	writel(ARRIA10_RSTMGR_CTL_SWWARMRSTREQ,
diff --git a/arch/arm/mach-socfpga/cyclone5-reset-manager.c b/arch/arm/mach-socfpga/cyclone5-reset-manager.c
index 5ddf379e3d42..aadb43d02ef2 100644
--- a/arch/arm/mach-socfpga/cyclone5-reset-manager.c
+++ b/arch/arm/mach-socfpga/cyclone5-reset-manager.c
@@ -23,7 +23,8 @@
 #include <mach/socfpga/cyclone5-reset-manager.h>
 
 /* Write the reset manager register to cause reset */
-static void __noreturn socfpga_restart_soc(struct restart_handler *rst)
+static void __noreturn socfpga_restart_soc(struct restart_handler *rst,
+					   unsigned long flags)
 {
 	/* request a warm reset */
 	writel((1 << RSTMGR_CTRL_SWWARMRSTREQ_LSB),
diff --git a/arch/arm/mach-tegra/tegra20-pmc.c b/arch/arm/mach-tegra/tegra20-pmc.c
index d4c28ac54142..796083126513 100644
--- a/arch/arm/mach-tegra/tegra20-pmc.c
+++ b/arch/arm/mach-tegra/tegra20-pmc.c
@@ -37,7 +37,8 @@ static void __iomem *pmc_base;
 static int tegra_num_powerdomains;
 
 /* main SoC reset trigger */
-static void __noreturn tegra20_restart_soc(struct restart_handler *rst)
+static void __noreturn tegra20_restart_soc(struct restart_handler *rst,
+					   unsigned long flags)
 {
 	writel(PMC_CNTRL_MAIN_RST, pmc_base + PMC_CNTRL);
 
diff --git a/arch/arm/mach-versatile/core.c b/arch/arm/mach-versatile/core.c
index b0124b700cb3..805ea0a024b5 100644
--- a/arch/arm/mach-versatile/core.c
+++ b/arch/arm/mach-versatile/core.c
@@ -39,7 +39,8 @@
 
 #include <mach/versatile/platform.h>
 
-static void __noreturn versatile_reset_soc(struct restart_handler *rst)
+static void __noreturn versatile_reset_soc(struct restart_handler *rst,
+					   unsigned long flags)
 {
 	u32 val;
 
diff --git a/arch/arm/mach-vexpress/reset.c b/arch/arm/mach-vexpress/reset.c
index 0d626db7d7f9..93355c69f091 100644
--- a/arch/arm/mach-vexpress/reset.c
+++ b/arch/arm/mach-vexpress/reset.c
@@ -14,7 +14,8 @@
 
 void __iomem *v2m_wdt_base;
 
-static void __noreturn vexpress_reset_soc(struct restart_handler *rst)
+static void __noreturn vexpress_reset_soc(struct restart_handler *rst,
+					  unsigned long flags)
 {
 	writel(LOAD_MIN, v2m_wdt_base + WDTLOAD);
 	writeb(RESET_ENABLE, v2m_wdt_base + WDTCONTROL);
diff --git a/arch/arm/mach-zynq/zynq.c b/arch/arm/mach-zynq/zynq.c
index 2d76a68a5eb9..87de0e5c87ed 100644
--- a/arch/arm/mach-zynq/zynq.c
+++ b/arch/arm/mach-zynq/zynq.c
@@ -21,7 +21,8 @@
 #include <mach/zynq/zynq7000-regs.h>
 #include <restart.h>
 
-static void __noreturn zynq_restart_soc(struct restart_handler *rst)
+static void __noreturn zynq_restart_soc(struct restart_handler *rst,
+					unsigned long flags)
 {
 	/* write unlock key to slcr */
 	writel(0xDF0D, ZYNQ_SLCR_UNLOCK);
diff --git a/arch/kvx/cpu/reset.c b/arch/kvx/cpu/reset.c
index a19399220ac1..9cff1c084597 100644
--- a/arch/kvx/cpu/reset.c
+++ b/arch/kvx/cpu/reset.c
@@ -14,7 +14,8 @@
 
 static struct regmap *ftu_regmap;
 
-static void __noreturn kvx_restart_soc(struct restart_handler *rst)
+static void __noreturn kvx_restart_soc(struct restart_handler *rst,
+				       unsigned long flags)
 {
 	regmap_write(ftu_regmap, KVX_FTU_SW_RESET_OFFSET, 0x1);
 
diff --git a/arch/mips/mach-ar231x/ar231x_reset.c b/arch/mips/mach-ar231x/ar231x_reset.c
index 7479f3ce4ac2..adda3ca4a3fd 100644
--- a/arch/mips/mach-ar231x/ar231x_reset.c
+++ b/arch/mips/mach-ar231x/ar231x_reset.c
@@ -14,7 +14,8 @@
 
 static void __iomem *reset_base;
 
-static void __noreturn ar2312x_restart_soc(struct restart_handler *rst)
+static void __noreturn ar2312x_restart_soc(struct restart_handler *rst,
+					   unsigned long flags)
 {
 	printf("reseting cpu\n");
 	__raw_writel(0x10000,
diff --git a/arch/mips/mach-ath79/reset.c b/arch/mips/mach-ath79/reset.c
index 393ca00b0829..20c5d80676a8 100644
--- a/arch/mips/mach-ath79/reset.c
+++ b/arch/mips/mach-ath79/reset.c
@@ -8,7 +8,8 @@
 #include <restart.h>
 #include <mach/ath79.h>
 
-static void __noreturn ath79_restart_soc(struct restart_handler *rst)
+static void __noreturn ath79_restart_soc(struct restart_handler *rst,
+					 unsigned long flags)
 {
 	ath79_reset_wr(AR933X_RESET_REG_RESET_MODULE, AR71XX_RESET_FULL_CHIP);
 	/*
diff --git a/arch/mips/mach-bcm47xx/reset.c b/arch/mips/mach-bcm47xx/reset.c
index 3ab9b0ce4b53..1000aed475b3 100644
--- a/arch/mips/mach-bcm47xx/reset.c
+++ b/arch/mips/mach-bcm47xx/reset.c
@@ -9,7 +9,8 @@
 #include <restart.h>
 #include <mach/hardware.h>
 
-static void __noreturn bcm47xx_restart_soc(struct restart_handler *rst)
+static void __noreturn bcm47xx_restart_soc(struct restart_handler *rst,
+					   unsigned long flags)
 {
 	__raw_writel(GORESET, (char *)SOFTRES_REG);
 
diff --git a/arch/mips/mach-loongson/loongson1_reset.c b/arch/mips/mach-loongson/loongson1_reset.c
index 9b4da217f80d..5168f0209255 100644
--- a/arch/mips/mach-loongson/loongson1_reset.c
+++ b/arch/mips/mach-loongson/loongson1_reset.c
@@ -9,7 +9,8 @@
 #include <restart.h>
 #include <mach/loongson1.h>
 
-static void __noreturn longhorn_restart_soc(struct restart_handler *rst)
+static void __noreturn longhorn_restart_soc(struct restart_handler *rst,
+					    unsigned long flags)
 {
 	void __iomem *wdt = IOMEM(0);
 
diff --git a/arch/openrisc/cpu/cpu.c b/arch/openrisc/cpu/cpu.c
index 47d8ab428845..06975dceea67 100644
--- a/arch/openrisc/cpu/cpu.c
+++ b/arch/openrisc/cpu/cpu.c
@@ -22,7 +22,8 @@
 
 extern void __reset(void);
 
-static void __noreturn openrisc_restart_cpu(struct restart_handler *rst)
+static void __noreturn openrisc_restart_cpu(struct restart_handler *rst,
+					    unsigned long flags)
 {
 	__reset();
 	/* not reached, __reset does not return */
diff --git a/arch/powerpc/mach-mpc5xxx/cpu.c b/arch/powerpc/mach-mpc5xxx/cpu.c
index 647109b7fb63..80bf3ccacd03 100644
--- a/arch/powerpc/mach-mpc5xxx/cpu.c
+++ b/arch/powerpc/mach-mpc5xxx/cpu.c
@@ -51,7 +51,8 @@ static int mpc5xxx_reserve_region(void)
 }
 coredevice_initcall(mpc5xxx_reserve_region);
 
-static void __noreturn mpc5xxx_restart_soc(struct restart_handler *rst)
+static void __noreturn mpc5xxx_restart_soc(struct restart_handler *rst,
+					   unsigned long flags)
 {
 	ulong msr;
 	/* Interrupts and MMU off */
diff --git a/arch/powerpc/mach-mpc85xx/cpu.c b/arch/powerpc/mach-mpc85xx/cpu.c
index acfd4699a2ff..b0580f774be4 100644
--- a/arch/powerpc/mach-mpc85xx/cpu.c
+++ b/arch/powerpc/mach-mpc85xx/cpu.c
@@ -30,7 +30,8 @@
 #include <mach/immap_85xx.h>
 #include <mach/mpc85xx.h>
 
-static void __noreturn mpc85xx_restart_soc(struct restart_handler *rst)
+static void __noreturn mpc85xx_restart_soc(struct restart_handler *rst,
+					   unsigned long flags)
 {
 	void __iomem *regs = (void __iomem *)MPC85xx_GUTS_ADDR;
 
diff --git a/arch/riscv/boards/riscvemu/board.c b/arch/riscv/boards/riscvemu/board.c
index a81e0baaaf0a..bf5a05dd6a4d 100644
--- a/arch/riscv/boards/riscvemu/board.c
+++ b/arch/riscv/boards/riscvemu/board.c
@@ -18,7 +18,8 @@ struct riscvemu_priv {
 
 };
 
-static void __noreturn riscvemu_restart(struct restart_handler *rst)
+static void __noreturn riscvemu_restart(struct restart_handler *rst,
+					unsigned long flags)
 {
 	struct riscvemu_priv *priv = container_of(rst, struct riscvemu_priv, rst);
 
diff --git a/arch/sandbox/board/power.c b/arch/sandbox/board/power.c
index 8300c589c730..546e1a518fd3 100644
--- a/arch/sandbox/board/power.c
+++ b/arch/sandbox/board/power.c
@@ -23,12 +23,14 @@ static void sandbox_poweroff(struct poweroff_handler *poweroff)
 	linux_exit();
 }
 
-static void sandbox_rst_hang(struct restart_handler *rst)
+static void sandbox_rst_hang(struct restart_handler *rst,
+			     unsigned long flags)
 {
 	linux_hang();
 }
 
-static void sandbox_rst_reexec(struct restart_handler *rst)
+static void sandbox_rst_reexec(struct restart_handler *rst,
+			       unsigned long flags)
 {
 	struct sandbox_power *power = container_of(rst, struct sandbox_power, rst_reexec);
 
diff --git a/commands/reset.c b/commands/reset.c
index 88e677afab34..e97b5668bacb 100644
--- a/commands/reset.c
+++ b/commands/reset.c
@@ -47,7 +47,7 @@ static int cmd_reset(int argc, char *argv[])
 
 	if (rst) {
 		console_flush();
-		rst->restart(rst);
+		rst->restart(rst, 0);
 	}
 
 	hang();
diff --git a/common/restart.c b/common/restart.c
index 2ab0196542d8..dce7e974f64a 100644
--- a/common/restart.c
+++ b/common/restart.c
@@ -55,7 +55,8 @@ int restart_handler_register(struct restart_handler *rst)
  * return: 0 for success or negative error code
  */
 int restart_handler_register_fn(const char *name,
-				void (*restart_fn)(struct restart_handler *))
+				void (*restart_fn)(struct restart_handler *,
+						   unsigned long flags))
 {
 	struct restart_handler *rst;
 	int ret;
@@ -110,7 +111,7 @@ void __noreturn restart_machine(unsigned long flags)
 	if (rst) {
 		pr_debug("%s: using restart handler %s\n", __func__, rst->name);
 		console_flush();
-		rst->restart(rst);
+		rst->restart(rst, flags);
 	}
 
 	hang();
diff --git a/drivers/clk/rockchip/clk.c b/drivers/clk/rockchip/clk.c
index 235d2ce0ade0..180f38e532ba 100644
--- a/drivers/clk/rockchip/clk.c
+++ b/drivers/clk/rockchip/clk.c
@@ -598,7 +598,8 @@ void rockchip_clk_protect_critical(const char *const clocks[],
 }
 EXPORT_SYMBOL_GPL(rockchip_clk_protect_critical);
 
-static void rockchip_restart(struct restart_handler *this)
+static void rockchip_restart(struct restart_handler *this,
+			     unsigned long flags)
 {
 	struct rockchip_clk_provider *ctx =
 		container_of(this, struct rockchip_clk_provider, restart_handler);
diff --git a/drivers/mfd/da9053.c b/drivers/mfd/da9053.c
index c8ad8aa0eeed..0bbfe3218b70 100644
--- a/drivers/mfd/da9053.c
+++ b/drivers/mfd/da9053.c
@@ -231,7 +231,8 @@ static void da9053_detect_reset_source(struct da9053_priv *da9053)
 		return;
 }
 
-static void __noreturn da9053_force_system_reset(struct restart_handler *rst)
+static void __noreturn da9053_force_system_reset(struct restart_handler *rst,
+						 unsigned long flags)
 {
 	struct da9053_priv *da9053 = container_of(rst, struct da9053_priv, restart);
 	u8 val;
diff --git a/drivers/mfd/da9063.c b/drivers/mfd/da9063.c
index 4842ead6f8b9..169ddc2b18bf 100644
--- a/drivers/mfd/da9063.c
+++ b/drivers/mfd/da9063.c
@@ -312,7 +312,8 @@ static void da9063_detect_reset_source(struct da9063 *priv)
 	reset_source_set_device(priv->dev, type, 200);
 }
 
-static void da9063_restart(struct restart_handler *rst)
+static void da9063_restart(struct restart_handler *rst,
+			   unsigned long flags)
 {
 	struct da9063 *priv = container_of(rst, struct da9063, restart);
 
diff --git a/drivers/mfd/rn5t568.c b/drivers/mfd/rn5t568.c
index e140cea03b0b..5a0cec464a07 100644
--- a/drivers/mfd/rn5t568.c
+++ b/drivers/mfd/rn5t568.c
@@ -23,7 +23,8 @@ struct rn5t568 {
 	struct regmap *regmap;
 };
 
-static void rn5t568_restart(struct restart_handler *rst)
+static void rn5t568_restart(struct restart_handler *rst,
+			    unsigned long flags)
 {
 	struct rn5t568 *rn5t568 = container_of(rst, struct rn5t568, restart);
 
diff --git a/drivers/power/reset/gpio-restart.c b/drivers/power/reset/gpio-restart.c
index ed2748f91092..8cc50194d240 100644
--- a/drivers/power/reset/gpio-restart.c
+++ b/drivers/power/reset/gpio-restart.c
@@ -19,7 +19,8 @@ struct gpio_restart {
 	u32 wait_delay_ms;
 };
 
-static void __noreturn gpio_restart_handle(struct restart_handler *this)
+static void __noreturn gpio_restart_handle(struct restart_handler *this,
+					   unsigned long flags)
 {
 	struct gpio_restart *gpio_restart =
 		container_of(this, struct gpio_restart, restart_handler);
diff --git a/drivers/power/reset/stm32-reboot.c b/drivers/power/reset/stm32-reboot.c
index ffe8dd96ac33..07a957ebff09 100644
--- a/drivers/power/reset/stm32-reboot.c
+++ b/drivers/power/reset/stm32-reboot.c
@@ -62,7 +62,8 @@ static void stm32_reset(struct stm32_reset *priv, unsigned long id, bool assert)
 	writel(BIT(offset), reg);
 }
 
-static void __noreturn stm32mp_rcc_restart_handler(struct restart_handler *rst)
+static void __noreturn stm32mp_rcc_restart_handler(struct restart_handler *rst,
+						   unsigned long flags)
 {
 	struct stm32_reset *priv = container_of(rst, struct stm32_reset, restart);
 
diff --git a/drivers/power/reset/syscon-reboot.c b/drivers/power/reset/syscon-reboot.c
index 61bea6169cb6..1c14220311b8 100644
--- a/drivers/power/reset/syscon-reboot.c
+++ b/drivers/power/reset/syscon-reboot.c
@@ -19,7 +19,8 @@ struct syscon_reboot_context {
 	struct restart_handler restart_handler;
 };
 
-static void __noreturn syscon_restart_handle(struct restart_handler *this)
+static void __noreturn syscon_restart_handle(struct restart_handler *this,
+					     unsigned long flags)
 {
 	struct syscon_reboot_context *ctx =
 			container_of(this, struct syscon_reboot_context,
diff --git a/drivers/watchdog/bcm2835_wdt.c b/drivers/watchdog/bcm2835_wdt.c
index 5b854c49b311..48654780b121 100644
--- a/drivers/watchdog/bcm2835_wdt.c
+++ b/drivers/watchdog/bcm2835_wdt.c
@@ -29,7 +29,8 @@ struct bcm2835_wd {
 
 #define RESET_TIMEOUT 10
 
-static void __noreturn bcm2835_restart_soc(struct restart_handler *rst)
+static void __noreturn bcm2835_restart_soc(struct restart_handler *rst,
+					   unsigned long flags)
 {
 	struct bcm2835_wd *priv = container_of(rst, struct bcm2835_wd, restart);
 	uint32_t rstc;
diff --git a/drivers/watchdog/imxwd.c b/drivers/watchdog/imxwd.c
index bfc47bb8dd75..10d94645fae6 100644
--- a/drivers/watchdog/imxwd.c
+++ b/drivers/watchdog/imxwd.c
@@ -171,7 +171,8 @@ static int imx_watchdog_set_timeout(struct watchdog *wd, unsigned timeout)
 	return priv->ops->set_timeout(priv, timeout);
 }
 
-static void __noreturn imxwd_force_soc_reset(struct restart_handler *rst)
+static void __noreturn imxwd_force_soc_reset(struct restart_handler *rst,
+					     unsigned long flags)
 {
 	struct imx_wd *priv = container_of(rst, struct imx_wd, restart);
 
@@ -182,12 +183,13 @@ static void __noreturn imxwd_force_soc_reset(struct restart_handler *rst)
 	hang();
 }
 
-static void __noreturn imxwd_force_soc_reset_internal(struct restart_handler *rst)
+static void __noreturn imxwd_force_soc_reset_internal(struct restart_handler *rst,
+						      unsigned long flags)
 {
 	struct imx_wd *priv = container_of(rst, struct imx_wd, restart_warm);
 
 	priv->ext_reset = false;
-	imxwd_force_soc_reset(&priv->restart);
+	imxwd_force_soc_reset(&priv->restart, flags);
 }
 
 static void imx_watchdog_detect_reset_source(struct imx_wd *priv)
diff --git a/drivers/watchdog/jz4740.c b/drivers/watchdog/jz4740.c
index 8b4b985cd409..8197477a1f99 100644
--- a/drivers/watchdog/jz4740.c
+++ b/drivers/watchdog/jz4740.c
@@ -39,7 +39,8 @@ struct jz4740_wdt_drvdata {
 	void __iomem *base;
 };
 
-static void __noreturn jz4740_reset_soc(struct restart_handler *rst)
+static void __noreturn jz4740_reset_soc(struct restart_handler *rst,
+					unsigned long flags)
 {
 	struct jz4740_wdt_drvdata *priv =
 		container_of(rst, struct jz4740_wdt_drvdata, restart);
diff --git a/drivers/watchdog/rave-sp-wdt.c b/drivers/watchdog/rave-sp-wdt.c
index b4fc18cb8b99..5a694ac82f60 100644
--- a/drivers/watchdog/rave-sp-wdt.c
+++ b/drivers/watchdog/rave-sp-wdt.c
@@ -179,7 +179,8 @@ static int rave_sp_wdt_rdu_restart(struct watchdog *wdd)
 	return rave_sp_wdt_exec(wdd, cmd, sizeof(cmd));
 }
 
-static void __noreturn rave_sp_wdt_restart_handler(struct restart_handler *rst)
+static void __noreturn rave_sp_wdt_restart_handler(struct restart_handler *rst,
+						   unsigned long flags)
 {
 	struct rave_sp_wdt *sp_wd =
 			container_of(rst, struct rave_sp_wdt, restart);
diff --git a/drivers/watchdog/stpmic1_wdt.c b/drivers/watchdog/stpmic1_wdt.c
index 4a0519690aed..ba58474799fa 100644
--- a/drivers/watchdog/stpmic1_wdt.c
+++ b/drivers/watchdog/stpmic1_wdt.c
@@ -96,7 +96,8 @@ static int stpmic1_wdt_set_timeout(struct watchdog *wdd, unsigned int timeout)
 	return 0;
 }
 
-static void __noreturn stpmic1_restart_handler(struct restart_handler *rst)
+static void __noreturn stpmic1_restart_handler(struct restart_handler *rst,
+					       unsigned long flags)
 {
 	struct stpmic1_wdt *wdt = container_of(rst, struct stpmic1_wdt, restart);
 
diff --git a/drivers/watchdog/wd_core.c b/drivers/watchdog/wd_core.c
index ee0e4ccb109b..d8aafb68c0e6 100644
--- a/drivers/watchdog/wd_core.c
+++ b/drivers/watchdog/wd_core.c
@@ -177,7 +177,8 @@ static int seconds_to_expire_get(struct param_d *p, void *priv)
 	return 0;
 }
 
-static void __noreturn watchdog_restart_handle(struct restart_handler *this)
+static void __noreturn watchdog_restart_handle(struct restart_handler *this,
+					       unsigned long flags)
 {
 	struct watchdog *wd = watchdog_get_default();
 	int ret = -ENODEV;
diff --git a/efi/payload/init.c b/efi/payload/init.c
index 3d9717b82540..12896c065115 100644
--- a/efi/payload/init.c
+++ b/efi/payload/init.c
@@ -225,7 +225,8 @@ static int efi_console_init(void)
 }
 console_efi_initcall(efi_console_init);
 
-static void __noreturn efi_restart_system(struct restart_handler *rst)
+static void __noreturn efi_restart_system(struct restart_handler *rst,
+					  unsigned long flags)
 {
 	RT->reset_system(EFI_RESET_WARM, EFI_SUCCESS, 0, NULL);
 
diff --git a/include/restart.h b/include/restart.h
index 75d96111ea1b..9707a2f40f14 100644
--- a/include/restart.h
+++ b/include/restart.h
@@ -15,7 +15,7 @@ struct restart_handler *restart_handler_get_by_name(const char *name, int flags)
 struct device_node;
 
 struct restart_handler {
-	void (*restart)(struct restart_handler *);
+	void (*restart)(struct restart_handler *, unsigned long);
 	int priority;
 #define RESTART_FLAG_WARM_BOOTROM	BIT(0)
 	int flags;
@@ -27,7 +27,8 @@ struct restart_handler {
 
 int restart_handler_register(struct restart_handler *);
 int restart_handler_register_fn(const char *name,
-				void (*restart_fn)(struct restart_handler *));
+				void (*restart_fn)(struct restart_handler *,
+						   unsigned long));
 
 #define RESTART_DEFAULT_PRIORITY 100
 
-- 
2.39.5




^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH 3/4] poweroff: give all poweroff_handler::poweroff callbacks a flags parameter
  2025-04-22  7:56 [PATCH 1/4] restart: give poweroff_machine and restart_machine a flag parameter Ahmad Fatoum
  2025-04-22  7:56 ` [PATCH 2/4] restart: give all restart_handler::restart callbacks a flags parameter Ahmad Fatoum
@ 2025-04-22  7:56 ` Ahmad Fatoum
  2025-04-22 10:32   ` Sascha Hauer
  2025-04-22  7:56 ` [PATCH 4/4] restart: make warm reboot a callback argument Ahmad Fatoum
  2025-04-22 11:36 ` [PATCH 1/4] restart: give poweroff_machine and restart_machine a flag parameter Sascha Hauer
  3 siblings, 1 reply; 7+ messages in thread
From: Ahmad Fatoum @ 2025-04-22  7:56 UTC (permalink / raw)
  To: barebox

From: Ahmad Fatoum <a.fatoum@barebox.org>

Like done for restart handlers and the poweroff_machine function, give
the callbacks a parameter as well and pass the flags along.

Signed-off-by: Ahmad Fatoum <a.fatoum@barebox.org>
---
 arch/arm/cpu/psci-client.c            | 3 ++-
 arch/arm/mach-imx/imx6.c              | 3 ++-
 arch/arm/mach-pxa/pxa2xx.c            | 3 ++-
 arch/arm/mach-pxa/pxa3xx.c            | 3 ++-
 arch/kvx/lib/poweroff.c               | 3 ++-
 arch/mips/mach-xburst/reset-jz4750.c  | 3 ++-
 arch/sandbox/board/power.c            | 3 ++-
 common/poweroff.c                     | 5 +++--
 drivers/mfd/axp20x.c                  | 3 ++-
 drivers/mfd/rk808.c                   | 3 ++-
 drivers/power/reset/gpio-poweroff.c   | 3 ++-
 drivers/power/reset/htif-poweroff.c   | 3 ++-
 drivers/power/reset/syscon-poweroff.c | 3 ++-
 drivers/regulator/pfuze.c             | 3 ++-
 drivers/watchdog/bcm2835_wdt.c        | 5 +++--
 drivers/watchdog/stpmic1_wdt.c        | 3 ++-
 efi/payload/init.c                    | 3 ++-
 include/mach/imx/imx6.h               | 3 ++-
 include/poweroff.h                    | 6 ++++--
 19 files changed, 42 insertions(+), 22 deletions(-)

diff --git a/arch/arm/cpu/psci-client.c b/arch/arm/cpu/psci-client.c
index 70436bde0a3a..43293fe034e6 100644
--- a/arch/arm/cpu/psci-client.c
+++ b/arch/arm/cpu/psci-client.c
@@ -25,7 +25,8 @@ static void __noreturn psci_invoke_noreturn(ulong function)
 	hang();
 }
 
-static void __noreturn psci_poweroff(struct poweroff_handler *handler)
+static void __noreturn psci_poweroff(struct poweroff_handler *handler,
+				     unsigned long flags)
 {
 	psci_invoke_noreturn(ARM_PSCI_0_2_FN_SYSTEM_OFF);
 }
diff --git a/arch/arm/mach-imx/imx6.c b/arch/arm/mach-imx/imx6.c
index b0d3d8ef2fb0..ed6cde801ec7 100644
--- a/arch/arm/mach-imx/imx6.c
+++ b/arch/arm/mach-imx/imx6.c
@@ -358,7 +358,8 @@ static int imx6_fixup_cpus_register(void)
 }
 device_initcall(imx6_fixup_cpus_register);
 
-void __noreturn imx6_pm_stby_poweroff(struct poweroff_handler *handler)
+void __noreturn imx6_pm_stby_poweroff(struct poweroff_handler *handler,
+				      unsigned long flags)
 {
 	void *ccm_base = IOMEM(MX6_CCM_BASE_ADDR);
 	void *gpc_base = IOMEM(MX6_GPC_BASE_ADDR);
diff --git a/arch/arm/mach-pxa/pxa2xx.c b/arch/arm/mach-pxa/pxa2xx.c
index 496ceb39d513..ee50dca7a9aa 100644
--- a/arch/arm/mach-pxa/pxa2xx.c
+++ b/arch/arm/mach-pxa/pxa2xx.c
@@ -47,7 +47,8 @@ void pxa_clear_reset_source(void)
 	RCSR = RCSR_GPR | RCSR_SMR | RCSR_WDR | RCSR_HWR;
 }
 
-static void __noreturn pxa2xx_poweroff(struct poweroff_handler *handler)
+static void __noreturn pxa2xx_poweroff(struct poweroff_handler *handler,
+				       unsigned long flags)
 {
 	shutdown_barebox();
 
diff --git a/arch/arm/mach-pxa/pxa3xx.c b/arch/arm/mach-pxa/pxa3xx.c
index ec4998396253..ea84efc8b046 100644
--- a/arch/arm/mach-pxa/pxa3xx.c
+++ b/arch/arm/mach-pxa/pxa3xx.c
@@ -49,7 +49,8 @@ void pxa_clear_reset_source(void)
 
 device_initcall(pxa_detect_reset_source);
 
-static void __noreturn pxa3xx_poweroff(struct poweroff_handler *handler)
+static void __noreturn pxa3xx_poweroff(struct poweroff_handler *handler,
+				       unsigned long flags)
 {
 	shutdown_barebox();
 
diff --git a/arch/kvx/lib/poweroff.c b/arch/kvx/lib/poweroff.c
index d776cb087777..324144837a18 100644
--- a/arch/kvx/lib/poweroff.c
+++ b/arch/kvx/lib/poweroff.c
@@ -9,7 +9,8 @@
 
 #include <asm/sfr.h>
 
-static void __noreturn kvx_poweroff(struct poweroff_handler *handler)
+static void __noreturn kvx_poweroff(struct poweroff_handler *handler,
+				    unsigned long flags)
 {
 	register int status asm("r0") = 0;
 
diff --git a/arch/mips/mach-xburst/reset-jz4750.c b/arch/mips/mach-xburst/reset-jz4750.c
index a1d5976fb2c2..561654f80e90 100644
--- a/arch/mips/mach-xburst/reset-jz4750.c
+++ b/arch/mips/mach-xburst/reset-jz4750.c
@@ -27,7 +27,8 @@ static void __noreturn jz4750d_halt(void)
 	unreachable();
 }
 
-static void __noreturn jz4750_poweroff(struct poweroff_handler *handler)
+static void __noreturn jz4750_poweroff(struct poweroff_handler *handler,
+				       unsigned long flags)
 {
 	u32 ctrl;
 
diff --git a/arch/sandbox/board/power.c b/arch/sandbox/board/power.c
index 546e1a518fd3..9caaea5be2f0 100644
--- a/arch/sandbox/board/power.c
+++ b/arch/sandbox/board/power.c
@@ -14,7 +14,8 @@ struct sandbox_power {
 	struct nvmem_cell *reset_source_cell;
 };
 
-static void sandbox_poweroff(struct poweroff_handler *poweroff)
+static void sandbox_poweroff(struct poweroff_handler *poweroff,
+			     unsigned long flags)
 {
 	struct sandbox_power *power = container_of(poweroff, struct sandbox_power, poweroff);
 
diff --git a/common/poweroff.c b/common/poweroff.c
index d453a9a98025..896716bb258c 100644
--- a/common/poweroff.c
+++ b/common/poweroff.c
@@ -43,7 +43,8 @@ int poweroff_handler_register(struct poweroff_handler *handler)
  *
  * return: 0 for success or negative error code
  */
-int poweroff_handler_register_fn(void (*poweroff_fn)(struct poweroff_handler *))
+int poweroff_handler_register_fn(void (*poweroff_fn)(struct poweroff_handler *,
+						     unsigned long flags))
 {
 	struct poweroff_handler *handler;
 	int ret;
@@ -78,7 +79,7 @@ void __noreturn poweroff_machine(unsigned long flags)
 	if (handler) {
 		pr_debug("using poweroff handler %s\n", handler->name);
 		console_flush();
-		handler->poweroff(handler);
+		handler->poweroff(handler, flags);
 	} else {
 		pr_err("No poweroff handler found!\n");
 	}
diff --git a/drivers/mfd/axp20x.c b/drivers/mfd/axp20x.c
index 666b9ea98cae..0f71131c9a2d 100644
--- a/drivers/mfd/axp20x.c
+++ b/drivers/mfd/axp20x.c
@@ -233,7 +233,8 @@ static const struct mfd_cell axp813_cells[] = {
 	},
 };
 
-static void axp20x_power_off(struct poweroff_handler *handler)
+static void axp20x_power_off(struct poweroff_handler *handler,
+			     unsigned long flags)
 {
 	struct axp20x_dev *axp20x = container_of(handler, struct axp20x_dev, poweroff);
 
diff --git a/drivers/mfd/rk808.c b/drivers/mfd/rk808.c
index 5b010e09ef33..1c5c705fa4fc 100644
--- a/drivers/mfd/rk808.c
+++ b/drivers/mfd/rk808.c
@@ -222,7 +222,8 @@ static const struct rk808_reg_data rk818_pre_init_reg[] = {
 						    VB_LO_SEL_3500MV },
 };
 
-static void rk808_poweroff(struct poweroff_handler *handler)
+static void rk808_poweroff(struct poweroff_handler *handler,
+			   unsigned long flags)
 {
 	struct rk808 *rk808 = container_of(handler, struct rk808, poweroff);
 	int ret;
diff --git a/drivers/power/reset/gpio-poweroff.c b/drivers/power/reset/gpio-poweroff.c
index cafa1387ce0b..1085c68b506f 100644
--- a/drivers/power/reset/gpio-poweroff.c
+++ b/drivers/power/reset/gpio-poweroff.c
@@ -22,7 +22,8 @@ static u32 timeout = DEFAULT_TIMEOUT_MS;
 static u32 active_delay = 100;
 static u32 inactive_delay = 100;
 
-static void gpio_poweroff_do_poweroff(struct poweroff_handler *handler)
+static void gpio_poweroff_do_poweroff(struct poweroff_handler *handler,
+				      unsigned long flags)
 {
 	/* drive it active, also inactive->active edge */
 	gpiod_direction_output(reset_gpio, true);
diff --git a/drivers/power/reset/htif-poweroff.c b/drivers/power/reset/htif-poweroff.c
index e24397f934dc..e193d96d9335 100644
--- a/drivers/power/reset/htif-poweroff.c
+++ b/drivers/power/reset/htif-poweroff.c
@@ -10,7 +10,8 @@
 
 static void __iomem *htif = IOMEM(HTIF_DEFAULT_BASE_ADDR);
 
-static void __noreturn riscvemu_poweroff(struct poweroff_handler *pwr)
+static void __noreturn riscvemu_poweroff(struct poweroff_handler *pwr,
+					 unsigned long flags)
 {
 	shutdown_barebox();
 
diff --git a/drivers/power/reset/syscon-poweroff.c b/drivers/power/reset/syscon-poweroff.c
index 321bd1fc7be0..0510b352d2c7 100644
--- a/drivers/power/reset/syscon-poweroff.c
+++ b/drivers/power/reset/syscon-poweroff.c
@@ -17,7 +17,8 @@ static u32 offset;
 static u32 value;
 static u32 mask;
 
-static void syscon_poweroff(struct poweroff_handler *handler)
+static void syscon_poweroff(struct poweroff_handler *handler,
+			    unsigned long flags)
 {
 	/* Issue the poweroff */
 	regmap_update_bits(map, offset, mask, value);
diff --git a/drivers/regulator/pfuze.c b/drivers/regulator/pfuze.c
index 3e8890b10cec..c9d89001f3a9 100644
--- a/drivers/regulator/pfuze.c
+++ b/drivers/regulator/pfuze.c
@@ -94,7 +94,8 @@ static int pfuze_i2c_reg_write(void *ctx, unsigned int reg, unsigned int val)
 	return ret == 1 ? 0 : ret;
 }
 
-static void pfuze_power_off_prepare(struct poweroff_handler *handler)
+static void pfuze_power_off_prepare(struct poweroff_handler *handler,
+				    unsigned long flags)
 {
 	dev_info(pfuze_dev->dev, "Configure standy mode for power off");
 
diff --git a/drivers/watchdog/bcm2835_wdt.c b/drivers/watchdog/bcm2835_wdt.c
index 48654780b121..233b82bbe280 100644
--- a/drivers/watchdog/bcm2835_wdt.c
+++ b/drivers/watchdog/bcm2835_wdt.c
@@ -44,7 +44,8 @@ static void __noreturn bcm2835_restart_soc(struct restart_handler *rst,
 	hang();
 }
 
-static void __noreturn bcm2835_poweroff_soc(struct poweroff_handler *poweroff)
+static void __noreturn bcm2835_poweroff_soc(struct poweroff_handler *poweroff,
+					    unsigned long flags)
 {
 	struct bcm2835_wd *priv = container_of(poweroff, struct bcm2835_wd, poweroff);
 	uint32_t val;
@@ -55,7 +56,7 @@ static void __noreturn bcm2835_poweroff_soc(struct poweroff_handler *poweroff)
 	val |= PM_PASSWORD | PM_RSTS_RASPBERRYPI_HALT;
 	writel_relaxed(val, priv->base + PM_RSTS);
 
-	bcm2835_restart_soc(&priv->restart);
+	bcm2835_restart_soc(&priv->restart, flags);
 }
 
 static int bcm2835_wd_set_timeout(struct watchdog *wd, unsigned timeout)
diff --git a/drivers/watchdog/stpmic1_wdt.c b/drivers/watchdog/stpmic1_wdt.c
index ba58474799fa..f25656e75c12 100644
--- a/drivers/watchdog/stpmic1_wdt.c
+++ b/drivers/watchdog/stpmic1_wdt.c
@@ -109,7 +109,8 @@ static void __noreturn stpmic1_restart_handler(struct restart_handler *rst,
 	hang();
 }
 
-static void __noreturn stpmic1_poweroff(struct poweroff_handler *handler)
+static void __noreturn stpmic1_poweroff(struct poweroff_handler *handler,
+					unsigned long flags)
 {
 	struct stpmic1_wdt *wdt = container_of(handler, struct stpmic1_wdt, poweroff);
 
diff --git a/efi/payload/init.c b/efi/payload/init.c
index 12896c065115..ae8b9203737b 100644
--- a/efi/payload/init.c
+++ b/efi/payload/init.c
@@ -233,7 +233,8 @@ static void __noreturn efi_restart_system(struct restart_handler *rst,
 	hang();
 }
 
-static void __noreturn efi_poweroff_system(struct poweroff_handler *handler)
+static void __noreturn efi_poweroff_system(struct poweroff_handler *handler,
+					   unsigned long flags)
 {
 	shutdown_barebox();
 	RT->reset_system(EFI_RESET_SHUTDOWN, EFI_SUCCESS, 0, NULL);
diff --git a/include/mach/imx/imx6.h b/include/mach/imx/imx6.h
index a67cc9df9642..f36ac6ce408c 100644
--- a/include/mach/imx/imx6.h
+++ b/include/mach/imx/imx6.h
@@ -10,7 +10,8 @@
 
 #include <poweroff.h>
 
-void __noreturn imx6_pm_stby_poweroff(struct poweroff_handler *handler);
+void __noreturn imx6_pm_stby_poweroff(struct poweroff_handler *handler,
+				      unsigned long flags);
 
 #define IMX6_ANATOP_SI_REV 0x260
 #define IMX6SL_ANATOP_SI_REV 0x280
diff --git a/include/poweroff.h b/include/poweroff.h
index 307097c01541..df2d3125a98d 100644
--- a/include/poweroff.h
+++ b/include/poweroff.h
@@ -5,14 +5,16 @@
 void __noreturn poweroff_machine(unsigned long poweroff_flags);
 
 struct poweroff_handler {
-	void (*poweroff)(struct poweroff_handler *);
+	void (*poweroff)(struct poweroff_handler *,
+			 unsigned long flags);
 	int priority;
 	const char *name;
 	struct list_head list;
 };
 
 int poweroff_handler_register(struct poweroff_handler *);
-int poweroff_handler_register_fn(void (*poweroff_fn)(struct poweroff_handler *));
+int poweroff_handler_register_fn(void (*poweroff_fn)(struct poweroff_handler *,
+						     unsigned long flags));
 
 #define POWEROFF_DEFAULT_PRIORITY 100
 #define POWEROFF_DEFAULT_NAME "default"
-- 
2.39.5




^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH 4/4] restart: make warm reboot a callback argument
  2025-04-22  7:56 [PATCH 1/4] restart: give poweroff_machine and restart_machine a flag parameter Ahmad Fatoum
  2025-04-22  7:56 ` [PATCH 2/4] restart: give all restart_handler::restart callbacks a flags parameter Ahmad Fatoum
  2025-04-22  7:56 ` [PATCH 3/4] poweroff: give all poweroff_handler::poweroff " Ahmad Fatoum
@ 2025-04-22  7:56 ` Ahmad Fatoum
  2025-04-22 11:36 ` [PATCH 1/4] restart: give poweroff_machine and restart_machine a flag parameter Sascha Hauer
  3 siblings, 0 replies; 7+ messages in thread
From: Ahmad Fatoum @ 2025-04-22  7:56 UTC (permalink / raw)
  To: barebox

From: Ahmad Fatoum <a.fatoum@barebox.org>

This simplifies handling of the existing warm reboot support and allow
for simple addition of more flags in future.

Signed-off-by: Ahmad Fatoum <a.fatoum@barebox.org>
---
 arch/arm/dts/imx7.dtsi   |  2 +-
 commands/reset.c         |  4 ++--
 common/restart.c         |  6 ++++--
 drivers/watchdog/imxwd.c | 35 +++++++++++------------------------
 include/restart.h        |  2 +-
 5 files changed, 19 insertions(+), 30 deletions(-)

diff --git a/arch/arm/dts/imx7.dtsi b/arch/arm/dts/imx7.dtsi
index 1c67bdc54620..d0f6b253ed86 100644
--- a/arch/arm/dts/imx7.dtsi
+++ b/arch/arm/dts/imx7.dtsi
@@ -28,7 +28,7 @@ ca7_reset: cortex-a7-reboot {
 		/* This is not fit for use as general purpose reset */
 		restart-priority = <5>;
 		/*
-		 * Can't use imxwd-warm due to errata e10574:
+		 * Can't use imxwd without fsl,ext-reset-output due to errata e10574:
 		 * Watchdog: A watchdog timeout or software trigger will
 		 * not reset the SOC
 		 */
diff --git a/commands/reset.c b/commands/reset.c
index e97b5668bacb..ccd8291f5353 100644
--- a/commands/reset.c
+++ b/commands/reset.c
@@ -26,7 +26,7 @@ static int cmd_reset(int argc, char *argv[])
 			restart_handlers_print();
 			return 0;
 		case 'w':
-			flags |= RESTART_FLAG_WARM_BOOTROM;
+			flags |= RESTART_WARM;
 			break;
 		case 'r':
 			name = optarg;
@@ -47,7 +47,7 @@ static int cmd_reset(int argc, char *argv[])
 
 	if (rst) {
 		console_flush();
-		rst->restart(rst, 0);
+		rst->restart(rst, flags);
 	}
 
 	hang();
diff --git a/common/restart.c b/common/restart.c
index dce7e974f64a..d0ceeab7acd0 100644
--- a/common/restart.c
+++ b/common/restart.c
@@ -32,7 +32,7 @@ int restart_handler_register(struct restart_handler *rst)
 				     &rst->priority);
 		if (of_property_read_bool(rst->of_node,
 					  "barebox,restart-warm-bootrom"))
-			rst->flags |= RESTART_FLAG_WARM_BOOTROM;
+			rst->flags |= RESTART_WARM;
 	}
 
 	list_add_tail(&rst->list, &restart_handler_list);
@@ -127,8 +127,10 @@ void restart_handlers_print(void)
 	list_for_each_entry(tmp, &restart_handler_list, list) {
 		printf("%-20s %-20s %6d ",
 		       tmp->name, tmp->dev ? dev_name(tmp->dev) : "", tmp->priority);
-		if (tmp->flags & RESTART_FLAG_WARM_BOOTROM)
+		if (tmp->flags & RESTART_WARM)
 			putchar('W');
 		putchar('\n');
 	}
+
+	printf("\nW: Warm restart capable\n");
 }
diff --git a/drivers/watchdog/imxwd.c b/drivers/watchdog/imxwd.c
index 10d94645fae6..35c688fc2701 100644
--- a/drivers/watchdog/imxwd.c
+++ b/drivers/watchdog/imxwd.c
@@ -30,7 +30,6 @@ struct imx_wd {
 	struct device *dev;
 	const struct imx_wd_ops *ops;
 	struct restart_handler restart;
-	struct restart_handler restart_warm;
 	bool ext_reset;
 	bool bigendian;
 	bool suspend_in_lpm;
@@ -176,6 +175,9 @@ static void __noreturn imxwd_force_soc_reset(struct restart_handler *rst,
 {
 	struct imx_wd *priv = container_of(rst, struct imx_wd, restart);
 
+	if (flags & RESTART_WARM)
+		priv->ext_reset = false;
+
 	priv->ops->soc_reset(priv);
 
 	mdelay(1000);
@@ -183,15 +185,6 @@ static void __noreturn imxwd_force_soc_reset(struct restart_handler *rst,
 	hang();
 }
 
-static void __noreturn imxwd_force_soc_reset_internal(struct restart_handler *rst,
-						      unsigned long flags)
-{
-	struct imx_wd *priv = container_of(rst, struct imx_wd, restart_warm);
-
-	priv->ext_reset = false;
-	imxwd_force_soc_reset(&priv->restart, flags);
-}
-
 static void imx_watchdog_detect_reset_source(struct imx_wd *priv)
 {
 	u16 val = imxwd_read(priv, IMX21_WDOG_WSTR);
@@ -232,13 +225,7 @@ static int imx21_wd_init_no_warm_reset(struct imx_wd *priv)
 
 static int imx21_wd_init(struct imx_wd *priv)
 {
-	priv->restart_warm.name = "imxwd-warm";
-	priv->restart_warm.restart = imxwd_force_soc_reset_internal;
-	priv->restart_warm.priority = RESTART_DEFAULT_PRIORITY - 10;
-	priv->restart_warm.flags = RESTART_FLAG_WARM_BOOTROM;
-
-	restart_handler_register(&priv->restart_warm);
-
+	priv->restart.flags = RESTART_WARM;
 	return imx21_wd_init_no_warm_reset(priv);
 }
 
@@ -295,6 +282,13 @@ static int imx_wd_probe(struct device *dev)
 		}
 	}
 
+	dev->priv = priv;
+
+	priv->restart.name = "imxwd";
+	priv->restart.restart = imxwd_force_soc_reset;
+	priv->restart.priority = RESTART_DEFAULT_PRIORITY;
+	priv->restart.dev = &priv->wd.dev;
+
 	if (priv->ops->init) {
 		ret = priv->ops->init(priv);
 		if (ret) {
@@ -304,13 +298,6 @@ static int imx_wd_probe(struct device *dev)
 		}
 	}
 
-	dev->priv = priv;
-
-	priv->restart.name = "imxwd";
-	priv->restart.restart = imxwd_force_soc_reset;
-	priv->restart.priority = RESTART_DEFAULT_PRIORITY;
-	priv->restart.dev = &priv->wd.dev;
-
 	restart_handler_register(&priv->restart);
 
 	return 0;
diff --git a/include/restart.h b/include/restart.h
index 9707a2f40f14..5414fc1fcb69 100644
--- a/include/restart.h
+++ b/include/restart.h
@@ -9,6 +9,7 @@
 struct device_node;
 
 void restart_handlers_print(void);
+#define RESTART_WARM			BIT(0)
 void __noreturn restart_machine(unsigned long restart_flags);
 struct restart_handler *restart_handler_get_by_name(const char *name, int flags);
 
@@ -17,7 +18,6 @@ struct device_node;
 struct restart_handler {
 	void (*restart)(struct restart_handler *, unsigned long);
 	int priority;
-#define RESTART_FLAG_WARM_BOOTROM	BIT(0)
 	int flags;
 	struct device_node *of_node;
 	const char *name;
-- 
2.39.5




^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH 3/4] poweroff: give all poweroff_handler::poweroff callbacks a flags parameter
  2025-04-22  7:56 ` [PATCH 3/4] poweroff: give all poweroff_handler::poweroff " Ahmad Fatoum
@ 2025-04-22 10:32   ` Sascha Hauer
  2025-04-22 10:42     ` Ahmad Fatoum
  0 siblings, 1 reply; 7+ messages in thread
From: Sascha Hauer @ 2025-04-22 10:32 UTC (permalink / raw)
  To: Ahmad Fatoum; +Cc: barebox

On Tue, Apr 22, 2025 at 09:56:14AM +0200, Ahmad Fatoum wrote:
> From: Ahmad Fatoum <a.fatoum@barebox.org>
> 
> Like done for restart handlers and the poweroff_machine function, give
> the callbacks a parameter as well and pass the flags along.

What kind of flags are you anticipating for poweroff?

Sascha

> 
> Signed-off-by: Ahmad Fatoum <a.fatoum@barebox.org>
> ---
>  arch/arm/cpu/psci-client.c            | 3 ++-
>  arch/arm/mach-imx/imx6.c              | 3 ++-
>  arch/arm/mach-pxa/pxa2xx.c            | 3 ++-
>  arch/arm/mach-pxa/pxa3xx.c            | 3 ++-
>  arch/kvx/lib/poweroff.c               | 3 ++-
>  arch/mips/mach-xburst/reset-jz4750.c  | 3 ++-
>  arch/sandbox/board/power.c            | 3 ++-
>  common/poweroff.c                     | 5 +++--
>  drivers/mfd/axp20x.c                  | 3 ++-
>  drivers/mfd/rk808.c                   | 3 ++-
>  drivers/power/reset/gpio-poweroff.c   | 3 ++-
>  drivers/power/reset/htif-poweroff.c   | 3 ++-
>  drivers/power/reset/syscon-poweroff.c | 3 ++-
>  drivers/regulator/pfuze.c             | 3 ++-
>  drivers/watchdog/bcm2835_wdt.c        | 5 +++--
>  drivers/watchdog/stpmic1_wdt.c        | 3 ++-
>  efi/payload/init.c                    | 3 ++-
>  include/mach/imx/imx6.h               | 3 ++-
>  include/poweroff.h                    | 6 ++++--
>  19 files changed, 42 insertions(+), 22 deletions(-)
> 
> diff --git a/arch/arm/cpu/psci-client.c b/arch/arm/cpu/psci-client.c
> index 70436bde0a3a..43293fe034e6 100644
> --- a/arch/arm/cpu/psci-client.c
> +++ b/arch/arm/cpu/psci-client.c
> @@ -25,7 +25,8 @@ static void __noreturn psci_invoke_noreturn(ulong function)
>  	hang();
>  }
>  
> -static void __noreturn psci_poweroff(struct poweroff_handler *handler)
> +static void __noreturn psci_poweroff(struct poweroff_handler *handler,
> +				     unsigned long flags)
>  {
>  	psci_invoke_noreturn(ARM_PSCI_0_2_FN_SYSTEM_OFF);
>  }
> diff --git a/arch/arm/mach-imx/imx6.c b/arch/arm/mach-imx/imx6.c
> index b0d3d8ef2fb0..ed6cde801ec7 100644
> --- a/arch/arm/mach-imx/imx6.c
> +++ b/arch/arm/mach-imx/imx6.c
> @@ -358,7 +358,8 @@ static int imx6_fixup_cpus_register(void)
>  }
>  device_initcall(imx6_fixup_cpus_register);
>  
> -void __noreturn imx6_pm_stby_poweroff(struct poweroff_handler *handler)
> +void __noreturn imx6_pm_stby_poweroff(struct poweroff_handler *handler,
> +				      unsigned long flags)
>  {
>  	void *ccm_base = IOMEM(MX6_CCM_BASE_ADDR);
>  	void *gpc_base = IOMEM(MX6_GPC_BASE_ADDR);
> diff --git a/arch/arm/mach-pxa/pxa2xx.c b/arch/arm/mach-pxa/pxa2xx.c
> index 496ceb39d513..ee50dca7a9aa 100644
> --- a/arch/arm/mach-pxa/pxa2xx.c
> +++ b/arch/arm/mach-pxa/pxa2xx.c
> @@ -47,7 +47,8 @@ void pxa_clear_reset_source(void)
>  	RCSR = RCSR_GPR | RCSR_SMR | RCSR_WDR | RCSR_HWR;
>  }
>  
> -static void __noreturn pxa2xx_poweroff(struct poweroff_handler *handler)
> +static void __noreturn pxa2xx_poweroff(struct poweroff_handler *handler,
> +				       unsigned long flags)
>  {
>  	shutdown_barebox();
>  
> diff --git a/arch/arm/mach-pxa/pxa3xx.c b/arch/arm/mach-pxa/pxa3xx.c
> index ec4998396253..ea84efc8b046 100644
> --- a/arch/arm/mach-pxa/pxa3xx.c
> +++ b/arch/arm/mach-pxa/pxa3xx.c
> @@ -49,7 +49,8 @@ void pxa_clear_reset_source(void)
>  
>  device_initcall(pxa_detect_reset_source);
>  
> -static void __noreturn pxa3xx_poweroff(struct poweroff_handler *handler)
> +static void __noreturn pxa3xx_poweroff(struct poweroff_handler *handler,
> +				       unsigned long flags)
>  {
>  	shutdown_barebox();
>  
> diff --git a/arch/kvx/lib/poweroff.c b/arch/kvx/lib/poweroff.c
> index d776cb087777..324144837a18 100644
> --- a/arch/kvx/lib/poweroff.c
> +++ b/arch/kvx/lib/poweroff.c
> @@ -9,7 +9,8 @@
>  
>  #include <asm/sfr.h>
>  
> -static void __noreturn kvx_poweroff(struct poweroff_handler *handler)
> +static void __noreturn kvx_poweroff(struct poweroff_handler *handler,
> +				    unsigned long flags)
>  {
>  	register int status asm("r0") = 0;
>  
> diff --git a/arch/mips/mach-xburst/reset-jz4750.c b/arch/mips/mach-xburst/reset-jz4750.c
> index a1d5976fb2c2..561654f80e90 100644
> --- a/arch/mips/mach-xburst/reset-jz4750.c
> +++ b/arch/mips/mach-xburst/reset-jz4750.c
> @@ -27,7 +27,8 @@ static void __noreturn jz4750d_halt(void)
>  	unreachable();
>  }
>  
> -static void __noreturn jz4750_poweroff(struct poweroff_handler *handler)
> +static void __noreturn jz4750_poweroff(struct poweroff_handler *handler,
> +				       unsigned long flags)
>  {
>  	u32 ctrl;
>  
> diff --git a/arch/sandbox/board/power.c b/arch/sandbox/board/power.c
> index 546e1a518fd3..9caaea5be2f0 100644
> --- a/arch/sandbox/board/power.c
> +++ b/arch/sandbox/board/power.c
> @@ -14,7 +14,8 @@ struct sandbox_power {
>  	struct nvmem_cell *reset_source_cell;
>  };
>  
> -static void sandbox_poweroff(struct poweroff_handler *poweroff)
> +static void sandbox_poweroff(struct poweroff_handler *poweroff,
> +			     unsigned long flags)
>  {
>  	struct sandbox_power *power = container_of(poweroff, struct sandbox_power, poweroff);
>  
> diff --git a/common/poweroff.c b/common/poweroff.c
> index d453a9a98025..896716bb258c 100644
> --- a/common/poweroff.c
> +++ b/common/poweroff.c
> @@ -43,7 +43,8 @@ int poweroff_handler_register(struct poweroff_handler *handler)
>   *
>   * return: 0 for success or negative error code
>   */
> -int poweroff_handler_register_fn(void (*poweroff_fn)(struct poweroff_handler *))
> +int poweroff_handler_register_fn(void (*poweroff_fn)(struct poweroff_handler *,
> +						     unsigned long flags))
>  {
>  	struct poweroff_handler *handler;
>  	int ret;
> @@ -78,7 +79,7 @@ void __noreturn poweroff_machine(unsigned long flags)
>  	if (handler) {
>  		pr_debug("using poweroff handler %s\n", handler->name);
>  		console_flush();
> -		handler->poweroff(handler);
> +		handler->poweroff(handler, flags);
>  	} else {
>  		pr_err("No poweroff handler found!\n");
>  	}
> diff --git a/drivers/mfd/axp20x.c b/drivers/mfd/axp20x.c
> index 666b9ea98cae..0f71131c9a2d 100644
> --- a/drivers/mfd/axp20x.c
> +++ b/drivers/mfd/axp20x.c
> @@ -233,7 +233,8 @@ static const struct mfd_cell axp813_cells[] = {
>  	},
>  };
>  
> -static void axp20x_power_off(struct poweroff_handler *handler)
> +static void axp20x_power_off(struct poweroff_handler *handler,
> +			     unsigned long flags)
>  {
>  	struct axp20x_dev *axp20x = container_of(handler, struct axp20x_dev, poweroff);
>  
> diff --git a/drivers/mfd/rk808.c b/drivers/mfd/rk808.c
> index 5b010e09ef33..1c5c705fa4fc 100644
> --- a/drivers/mfd/rk808.c
> +++ b/drivers/mfd/rk808.c
> @@ -222,7 +222,8 @@ static const struct rk808_reg_data rk818_pre_init_reg[] = {
>  						    VB_LO_SEL_3500MV },
>  };
>  
> -static void rk808_poweroff(struct poweroff_handler *handler)
> +static void rk808_poweroff(struct poweroff_handler *handler,
> +			   unsigned long flags)
>  {
>  	struct rk808 *rk808 = container_of(handler, struct rk808, poweroff);
>  	int ret;
> diff --git a/drivers/power/reset/gpio-poweroff.c b/drivers/power/reset/gpio-poweroff.c
> index cafa1387ce0b..1085c68b506f 100644
> --- a/drivers/power/reset/gpio-poweroff.c
> +++ b/drivers/power/reset/gpio-poweroff.c
> @@ -22,7 +22,8 @@ static u32 timeout = DEFAULT_TIMEOUT_MS;
>  static u32 active_delay = 100;
>  static u32 inactive_delay = 100;
>  
> -static void gpio_poweroff_do_poweroff(struct poweroff_handler *handler)
> +static void gpio_poweroff_do_poweroff(struct poweroff_handler *handler,
> +				      unsigned long flags)
>  {
>  	/* drive it active, also inactive->active edge */
>  	gpiod_direction_output(reset_gpio, true);
> diff --git a/drivers/power/reset/htif-poweroff.c b/drivers/power/reset/htif-poweroff.c
> index e24397f934dc..e193d96d9335 100644
> --- a/drivers/power/reset/htif-poweroff.c
> +++ b/drivers/power/reset/htif-poweroff.c
> @@ -10,7 +10,8 @@
>  
>  static void __iomem *htif = IOMEM(HTIF_DEFAULT_BASE_ADDR);
>  
> -static void __noreturn riscvemu_poweroff(struct poweroff_handler *pwr)
> +static void __noreturn riscvemu_poweroff(struct poweroff_handler *pwr,
> +					 unsigned long flags)
>  {
>  	shutdown_barebox();
>  
> diff --git a/drivers/power/reset/syscon-poweroff.c b/drivers/power/reset/syscon-poweroff.c
> index 321bd1fc7be0..0510b352d2c7 100644
> --- a/drivers/power/reset/syscon-poweroff.c
> +++ b/drivers/power/reset/syscon-poweroff.c
> @@ -17,7 +17,8 @@ static u32 offset;
>  static u32 value;
>  static u32 mask;
>  
> -static void syscon_poweroff(struct poweroff_handler *handler)
> +static void syscon_poweroff(struct poweroff_handler *handler,
> +			    unsigned long flags)
>  {
>  	/* Issue the poweroff */
>  	regmap_update_bits(map, offset, mask, value);
> diff --git a/drivers/regulator/pfuze.c b/drivers/regulator/pfuze.c
> index 3e8890b10cec..c9d89001f3a9 100644
> --- a/drivers/regulator/pfuze.c
> +++ b/drivers/regulator/pfuze.c
> @@ -94,7 +94,8 @@ static int pfuze_i2c_reg_write(void *ctx, unsigned int reg, unsigned int val)
>  	return ret == 1 ? 0 : ret;
>  }
>  
> -static void pfuze_power_off_prepare(struct poweroff_handler *handler)
> +static void pfuze_power_off_prepare(struct poweroff_handler *handler,
> +				    unsigned long flags)
>  {
>  	dev_info(pfuze_dev->dev, "Configure standy mode for power off");
>  
> diff --git a/drivers/watchdog/bcm2835_wdt.c b/drivers/watchdog/bcm2835_wdt.c
> index 48654780b121..233b82bbe280 100644
> --- a/drivers/watchdog/bcm2835_wdt.c
> +++ b/drivers/watchdog/bcm2835_wdt.c
> @@ -44,7 +44,8 @@ static void __noreturn bcm2835_restart_soc(struct restart_handler *rst,
>  	hang();
>  }
>  
> -static void __noreturn bcm2835_poweroff_soc(struct poweroff_handler *poweroff)
> +static void __noreturn bcm2835_poweroff_soc(struct poweroff_handler *poweroff,
> +					    unsigned long flags)
>  {
>  	struct bcm2835_wd *priv = container_of(poweroff, struct bcm2835_wd, poweroff);
>  	uint32_t val;
> @@ -55,7 +56,7 @@ static void __noreturn bcm2835_poweroff_soc(struct poweroff_handler *poweroff)
>  	val |= PM_PASSWORD | PM_RSTS_RASPBERRYPI_HALT;
>  	writel_relaxed(val, priv->base + PM_RSTS);
>  
> -	bcm2835_restart_soc(&priv->restart);
> +	bcm2835_restart_soc(&priv->restart, flags);
>  }
>  
>  static int bcm2835_wd_set_timeout(struct watchdog *wd, unsigned timeout)
> diff --git a/drivers/watchdog/stpmic1_wdt.c b/drivers/watchdog/stpmic1_wdt.c
> index ba58474799fa..f25656e75c12 100644
> --- a/drivers/watchdog/stpmic1_wdt.c
> +++ b/drivers/watchdog/stpmic1_wdt.c
> @@ -109,7 +109,8 @@ static void __noreturn stpmic1_restart_handler(struct restart_handler *rst,
>  	hang();
>  }
>  
> -static void __noreturn stpmic1_poweroff(struct poweroff_handler *handler)
> +static void __noreturn stpmic1_poweroff(struct poweroff_handler *handler,
> +					unsigned long flags)
>  {
>  	struct stpmic1_wdt *wdt = container_of(handler, struct stpmic1_wdt, poweroff);
>  
> diff --git a/efi/payload/init.c b/efi/payload/init.c
> index 12896c065115..ae8b9203737b 100644
> --- a/efi/payload/init.c
> +++ b/efi/payload/init.c
> @@ -233,7 +233,8 @@ static void __noreturn efi_restart_system(struct restart_handler *rst,
>  	hang();
>  }
>  
> -static void __noreturn efi_poweroff_system(struct poweroff_handler *handler)
> +static void __noreturn efi_poweroff_system(struct poweroff_handler *handler,
> +					   unsigned long flags)
>  {
>  	shutdown_barebox();
>  	RT->reset_system(EFI_RESET_SHUTDOWN, EFI_SUCCESS, 0, NULL);
> diff --git a/include/mach/imx/imx6.h b/include/mach/imx/imx6.h
> index a67cc9df9642..f36ac6ce408c 100644
> --- a/include/mach/imx/imx6.h
> +++ b/include/mach/imx/imx6.h
> @@ -10,7 +10,8 @@
>  
>  #include <poweroff.h>
>  
> -void __noreturn imx6_pm_stby_poweroff(struct poweroff_handler *handler);
> +void __noreturn imx6_pm_stby_poweroff(struct poweroff_handler *handler,
> +				      unsigned long flags);
>  
>  #define IMX6_ANATOP_SI_REV 0x260
>  #define IMX6SL_ANATOP_SI_REV 0x280
> diff --git a/include/poweroff.h b/include/poweroff.h
> index 307097c01541..df2d3125a98d 100644
> --- a/include/poweroff.h
> +++ b/include/poweroff.h
> @@ -5,14 +5,16 @@
>  void __noreturn poweroff_machine(unsigned long poweroff_flags);
>  
>  struct poweroff_handler {
> -	void (*poweroff)(struct poweroff_handler *);
> +	void (*poweroff)(struct poweroff_handler *,
> +			 unsigned long flags);
>  	int priority;
>  	const char *name;
>  	struct list_head list;
>  };
>  
>  int poweroff_handler_register(struct poweroff_handler *);
> -int poweroff_handler_register_fn(void (*poweroff_fn)(struct poweroff_handler *));
> +int poweroff_handler_register_fn(void (*poweroff_fn)(struct poweroff_handler *,
> +						     unsigned long flags));
>  
>  #define POWEROFF_DEFAULT_PRIORITY 100
>  #define POWEROFF_DEFAULT_NAME "default"
> -- 
> 2.39.5
> 
> 
> 

-- 
Pengutronix e.K.                           |                             |
Steuerwalder Str. 21                       | http://www.pengutronix.de/  |
31137 Hildesheim, Germany                  | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |



^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH 3/4] poweroff: give all poweroff_handler::poweroff callbacks a flags parameter
  2025-04-22 10:32   ` Sascha Hauer
@ 2025-04-22 10:42     ` Ahmad Fatoum
  0 siblings, 0 replies; 7+ messages in thread
From: Ahmad Fatoum @ 2025-04-22 10:42 UTC (permalink / raw)
  To: Sascha Hauer; +Cc: barebox

Hello Sascha,

On 4/22/25 12:32, Sascha Hauer wrote:
> On Tue, Apr 22, 2025 at 09:56:14AM +0200, Ahmad Fatoum wrote:
>> From: Ahmad Fatoum <a.fatoum@barebox.org>
>>
>> Like done for restart handlers and the poweroff_machine function, give
>> the callbacks a parameter as well and pass the flags along.
> 
> What kind of flags are you anticipating for poweroff?

PSCI describes both POWER_OFF and POWER_OFF2 operations for normal
shutdown and hibernation respectively. EFI defines a platform-specific
reset, which allows EFI firmware to define their own.

I do not see myself implementing either of these any time soon,
but if I am going to touch the APIs tree-wide anyway, I figured,
I should do the same for poweroff as well.

Note that with barebox as EFI loader, shutdown implementations in
barebox are getting more relevant as some of them will be exposed
to the kernel (Only PSCI for now).

Cheers,
Ahmad

> 
> Sascha
> 
>>
>> Signed-off-by: Ahmad Fatoum <a.fatoum@barebox.org>
>> ---
>>  arch/arm/cpu/psci-client.c            | 3 ++-
>>  arch/arm/mach-imx/imx6.c              | 3 ++-
>>  arch/arm/mach-pxa/pxa2xx.c            | 3 ++-
>>  arch/arm/mach-pxa/pxa3xx.c            | 3 ++-
>>  arch/kvx/lib/poweroff.c               | 3 ++-
>>  arch/mips/mach-xburst/reset-jz4750.c  | 3 ++-
>>  arch/sandbox/board/power.c            | 3 ++-
>>  common/poweroff.c                     | 5 +++--
>>  drivers/mfd/axp20x.c                  | 3 ++-
>>  drivers/mfd/rk808.c                   | 3 ++-
>>  drivers/power/reset/gpio-poweroff.c   | 3 ++-
>>  drivers/power/reset/htif-poweroff.c   | 3 ++-
>>  drivers/power/reset/syscon-poweroff.c | 3 ++-
>>  drivers/regulator/pfuze.c             | 3 ++-
>>  drivers/watchdog/bcm2835_wdt.c        | 5 +++--
>>  drivers/watchdog/stpmic1_wdt.c        | 3 ++-
>>  efi/payload/init.c                    | 3 ++-
>>  include/mach/imx/imx6.h               | 3 ++-
>>  include/poweroff.h                    | 6 ++++--
>>  19 files changed, 42 insertions(+), 22 deletions(-)
>>
>> diff --git a/arch/arm/cpu/psci-client.c b/arch/arm/cpu/psci-client.c
>> index 70436bde0a3a..43293fe034e6 100644
>> --- a/arch/arm/cpu/psci-client.c
>> +++ b/arch/arm/cpu/psci-client.c
>> @@ -25,7 +25,8 @@ static void __noreturn psci_invoke_noreturn(ulong function)
>>  	hang();
>>  }
>>  
>> -static void __noreturn psci_poweroff(struct poweroff_handler *handler)
>> +static void __noreturn psci_poweroff(struct poweroff_handler *handler,
>> +				     unsigned long flags)
>>  {
>>  	psci_invoke_noreturn(ARM_PSCI_0_2_FN_SYSTEM_OFF);
>>  }
>> diff --git a/arch/arm/mach-imx/imx6.c b/arch/arm/mach-imx/imx6.c
>> index b0d3d8ef2fb0..ed6cde801ec7 100644
>> --- a/arch/arm/mach-imx/imx6.c
>> +++ b/arch/arm/mach-imx/imx6.c
>> @@ -358,7 +358,8 @@ static int imx6_fixup_cpus_register(void)
>>  }
>>  device_initcall(imx6_fixup_cpus_register);
>>  
>> -void __noreturn imx6_pm_stby_poweroff(struct poweroff_handler *handler)
>> +void __noreturn imx6_pm_stby_poweroff(struct poweroff_handler *handler,
>> +				      unsigned long flags)
>>  {
>>  	void *ccm_base = IOMEM(MX6_CCM_BASE_ADDR);
>>  	void *gpc_base = IOMEM(MX6_GPC_BASE_ADDR);
>> diff --git a/arch/arm/mach-pxa/pxa2xx.c b/arch/arm/mach-pxa/pxa2xx.c
>> index 496ceb39d513..ee50dca7a9aa 100644
>> --- a/arch/arm/mach-pxa/pxa2xx.c
>> +++ b/arch/arm/mach-pxa/pxa2xx.c
>> @@ -47,7 +47,8 @@ void pxa_clear_reset_source(void)
>>  	RCSR = RCSR_GPR | RCSR_SMR | RCSR_WDR | RCSR_HWR;
>>  }
>>  
>> -static void __noreturn pxa2xx_poweroff(struct poweroff_handler *handler)
>> +static void __noreturn pxa2xx_poweroff(struct poweroff_handler *handler,
>> +				       unsigned long flags)
>>  {
>>  	shutdown_barebox();
>>  
>> diff --git a/arch/arm/mach-pxa/pxa3xx.c b/arch/arm/mach-pxa/pxa3xx.c
>> index ec4998396253..ea84efc8b046 100644
>> --- a/arch/arm/mach-pxa/pxa3xx.c
>> +++ b/arch/arm/mach-pxa/pxa3xx.c
>> @@ -49,7 +49,8 @@ void pxa_clear_reset_source(void)
>>  
>>  device_initcall(pxa_detect_reset_source);
>>  
>> -static void __noreturn pxa3xx_poweroff(struct poweroff_handler *handler)
>> +static void __noreturn pxa3xx_poweroff(struct poweroff_handler *handler,
>> +				       unsigned long flags)
>>  {
>>  	shutdown_barebox();
>>  
>> diff --git a/arch/kvx/lib/poweroff.c b/arch/kvx/lib/poweroff.c
>> index d776cb087777..324144837a18 100644
>> --- a/arch/kvx/lib/poweroff.c
>> +++ b/arch/kvx/lib/poweroff.c
>> @@ -9,7 +9,8 @@
>>  
>>  #include <asm/sfr.h>
>>  
>> -static void __noreturn kvx_poweroff(struct poweroff_handler *handler)
>> +static void __noreturn kvx_poweroff(struct poweroff_handler *handler,
>> +				    unsigned long flags)
>>  {
>>  	register int status asm("r0") = 0;
>>  
>> diff --git a/arch/mips/mach-xburst/reset-jz4750.c b/arch/mips/mach-xburst/reset-jz4750.c
>> index a1d5976fb2c2..561654f80e90 100644
>> --- a/arch/mips/mach-xburst/reset-jz4750.c
>> +++ b/arch/mips/mach-xburst/reset-jz4750.c
>> @@ -27,7 +27,8 @@ static void __noreturn jz4750d_halt(void)
>>  	unreachable();
>>  }
>>  
>> -static void __noreturn jz4750_poweroff(struct poweroff_handler *handler)
>> +static void __noreturn jz4750_poweroff(struct poweroff_handler *handler,
>> +				       unsigned long flags)
>>  {
>>  	u32 ctrl;
>>  
>> diff --git a/arch/sandbox/board/power.c b/arch/sandbox/board/power.c
>> index 546e1a518fd3..9caaea5be2f0 100644
>> --- a/arch/sandbox/board/power.c
>> +++ b/arch/sandbox/board/power.c
>> @@ -14,7 +14,8 @@ struct sandbox_power {
>>  	struct nvmem_cell *reset_source_cell;
>>  };
>>  
>> -static void sandbox_poweroff(struct poweroff_handler *poweroff)
>> +static void sandbox_poweroff(struct poweroff_handler *poweroff,
>> +			     unsigned long flags)
>>  {
>>  	struct sandbox_power *power = container_of(poweroff, struct sandbox_power, poweroff);
>>  
>> diff --git a/common/poweroff.c b/common/poweroff.c
>> index d453a9a98025..896716bb258c 100644
>> --- a/common/poweroff.c
>> +++ b/common/poweroff.c
>> @@ -43,7 +43,8 @@ int poweroff_handler_register(struct poweroff_handler *handler)
>>   *
>>   * return: 0 for success or negative error code
>>   */
>> -int poweroff_handler_register_fn(void (*poweroff_fn)(struct poweroff_handler *))
>> +int poweroff_handler_register_fn(void (*poweroff_fn)(struct poweroff_handler *,
>> +						     unsigned long flags))
>>  {
>>  	struct poweroff_handler *handler;
>>  	int ret;
>> @@ -78,7 +79,7 @@ void __noreturn poweroff_machine(unsigned long flags)
>>  	if (handler) {
>>  		pr_debug("using poweroff handler %s\n", handler->name);
>>  		console_flush();
>> -		handler->poweroff(handler);
>> +		handler->poweroff(handler, flags);
>>  	} else {
>>  		pr_err("No poweroff handler found!\n");
>>  	}
>> diff --git a/drivers/mfd/axp20x.c b/drivers/mfd/axp20x.c
>> index 666b9ea98cae..0f71131c9a2d 100644
>> --- a/drivers/mfd/axp20x.c
>> +++ b/drivers/mfd/axp20x.c
>> @@ -233,7 +233,8 @@ static const struct mfd_cell axp813_cells[] = {
>>  	},
>>  };
>>  
>> -static void axp20x_power_off(struct poweroff_handler *handler)
>> +static void axp20x_power_off(struct poweroff_handler *handler,
>> +			     unsigned long flags)
>>  {
>>  	struct axp20x_dev *axp20x = container_of(handler, struct axp20x_dev, poweroff);
>>  
>> diff --git a/drivers/mfd/rk808.c b/drivers/mfd/rk808.c
>> index 5b010e09ef33..1c5c705fa4fc 100644
>> --- a/drivers/mfd/rk808.c
>> +++ b/drivers/mfd/rk808.c
>> @@ -222,7 +222,8 @@ static const struct rk808_reg_data rk818_pre_init_reg[] = {
>>  						    VB_LO_SEL_3500MV },
>>  };
>>  
>> -static void rk808_poweroff(struct poweroff_handler *handler)
>> +static void rk808_poweroff(struct poweroff_handler *handler,
>> +			   unsigned long flags)
>>  {
>>  	struct rk808 *rk808 = container_of(handler, struct rk808, poweroff);
>>  	int ret;
>> diff --git a/drivers/power/reset/gpio-poweroff.c b/drivers/power/reset/gpio-poweroff.c
>> index cafa1387ce0b..1085c68b506f 100644
>> --- a/drivers/power/reset/gpio-poweroff.c
>> +++ b/drivers/power/reset/gpio-poweroff.c
>> @@ -22,7 +22,8 @@ static u32 timeout = DEFAULT_TIMEOUT_MS;
>>  static u32 active_delay = 100;
>>  static u32 inactive_delay = 100;
>>  
>> -static void gpio_poweroff_do_poweroff(struct poweroff_handler *handler)
>> +static void gpio_poweroff_do_poweroff(struct poweroff_handler *handler,
>> +				      unsigned long flags)
>>  {
>>  	/* drive it active, also inactive->active edge */
>>  	gpiod_direction_output(reset_gpio, true);
>> diff --git a/drivers/power/reset/htif-poweroff.c b/drivers/power/reset/htif-poweroff.c
>> index e24397f934dc..e193d96d9335 100644
>> --- a/drivers/power/reset/htif-poweroff.c
>> +++ b/drivers/power/reset/htif-poweroff.c
>> @@ -10,7 +10,8 @@
>>  
>>  static void __iomem *htif = IOMEM(HTIF_DEFAULT_BASE_ADDR);
>>  
>> -static void __noreturn riscvemu_poweroff(struct poweroff_handler *pwr)
>> +static void __noreturn riscvemu_poweroff(struct poweroff_handler *pwr,
>> +					 unsigned long flags)
>>  {
>>  	shutdown_barebox();
>>  
>> diff --git a/drivers/power/reset/syscon-poweroff.c b/drivers/power/reset/syscon-poweroff.c
>> index 321bd1fc7be0..0510b352d2c7 100644
>> --- a/drivers/power/reset/syscon-poweroff.c
>> +++ b/drivers/power/reset/syscon-poweroff.c
>> @@ -17,7 +17,8 @@ static u32 offset;
>>  static u32 value;
>>  static u32 mask;
>>  
>> -static void syscon_poweroff(struct poweroff_handler *handler)
>> +static void syscon_poweroff(struct poweroff_handler *handler,
>> +			    unsigned long flags)
>>  {
>>  	/* Issue the poweroff */
>>  	regmap_update_bits(map, offset, mask, value);
>> diff --git a/drivers/regulator/pfuze.c b/drivers/regulator/pfuze.c
>> index 3e8890b10cec..c9d89001f3a9 100644
>> --- a/drivers/regulator/pfuze.c
>> +++ b/drivers/regulator/pfuze.c
>> @@ -94,7 +94,8 @@ static int pfuze_i2c_reg_write(void *ctx, unsigned int reg, unsigned int val)
>>  	return ret == 1 ? 0 : ret;
>>  }
>>  
>> -static void pfuze_power_off_prepare(struct poweroff_handler *handler)
>> +static void pfuze_power_off_prepare(struct poweroff_handler *handler,
>> +				    unsigned long flags)
>>  {
>>  	dev_info(pfuze_dev->dev, "Configure standy mode for power off");
>>  
>> diff --git a/drivers/watchdog/bcm2835_wdt.c b/drivers/watchdog/bcm2835_wdt.c
>> index 48654780b121..233b82bbe280 100644
>> --- a/drivers/watchdog/bcm2835_wdt.c
>> +++ b/drivers/watchdog/bcm2835_wdt.c
>> @@ -44,7 +44,8 @@ static void __noreturn bcm2835_restart_soc(struct restart_handler *rst,
>>  	hang();
>>  }
>>  
>> -static void __noreturn bcm2835_poweroff_soc(struct poweroff_handler *poweroff)
>> +static void __noreturn bcm2835_poweroff_soc(struct poweroff_handler *poweroff,
>> +					    unsigned long flags)
>>  {
>>  	struct bcm2835_wd *priv = container_of(poweroff, struct bcm2835_wd, poweroff);
>>  	uint32_t val;
>> @@ -55,7 +56,7 @@ static void __noreturn bcm2835_poweroff_soc(struct poweroff_handler *poweroff)
>>  	val |= PM_PASSWORD | PM_RSTS_RASPBERRYPI_HALT;
>>  	writel_relaxed(val, priv->base + PM_RSTS);
>>  
>> -	bcm2835_restart_soc(&priv->restart);
>> +	bcm2835_restart_soc(&priv->restart, flags);
>>  }
>>  
>>  static int bcm2835_wd_set_timeout(struct watchdog *wd, unsigned timeout)
>> diff --git a/drivers/watchdog/stpmic1_wdt.c b/drivers/watchdog/stpmic1_wdt.c
>> index ba58474799fa..f25656e75c12 100644
>> --- a/drivers/watchdog/stpmic1_wdt.c
>> +++ b/drivers/watchdog/stpmic1_wdt.c
>> @@ -109,7 +109,8 @@ static void __noreturn stpmic1_restart_handler(struct restart_handler *rst,
>>  	hang();
>>  }
>>  
>> -static void __noreturn stpmic1_poweroff(struct poweroff_handler *handler)
>> +static void __noreturn stpmic1_poweroff(struct poweroff_handler *handler,
>> +					unsigned long flags)
>>  {
>>  	struct stpmic1_wdt *wdt = container_of(handler, struct stpmic1_wdt, poweroff);
>>  
>> diff --git a/efi/payload/init.c b/efi/payload/init.c
>> index 12896c065115..ae8b9203737b 100644
>> --- a/efi/payload/init.c
>> +++ b/efi/payload/init.c
>> @@ -233,7 +233,8 @@ static void __noreturn efi_restart_system(struct restart_handler *rst,
>>  	hang();
>>  }
>>  
>> -static void __noreturn efi_poweroff_system(struct poweroff_handler *handler)
>> +static void __noreturn efi_poweroff_system(struct poweroff_handler *handler,
>> +					   unsigned long flags)
>>  {
>>  	shutdown_barebox();
>>  	RT->reset_system(EFI_RESET_SHUTDOWN, EFI_SUCCESS, 0, NULL);
>> diff --git a/include/mach/imx/imx6.h b/include/mach/imx/imx6.h
>> index a67cc9df9642..f36ac6ce408c 100644
>> --- a/include/mach/imx/imx6.h
>> +++ b/include/mach/imx/imx6.h
>> @@ -10,7 +10,8 @@
>>  
>>  #include <poweroff.h>
>>  
>> -void __noreturn imx6_pm_stby_poweroff(struct poweroff_handler *handler);
>> +void __noreturn imx6_pm_stby_poweroff(struct poweroff_handler *handler,
>> +				      unsigned long flags);
>>  
>>  #define IMX6_ANATOP_SI_REV 0x260
>>  #define IMX6SL_ANATOP_SI_REV 0x280
>> diff --git a/include/poweroff.h b/include/poweroff.h
>> index 307097c01541..df2d3125a98d 100644
>> --- a/include/poweroff.h
>> +++ b/include/poweroff.h
>> @@ -5,14 +5,16 @@
>>  void __noreturn poweroff_machine(unsigned long poweroff_flags);
>>  
>>  struct poweroff_handler {
>> -	void (*poweroff)(struct poweroff_handler *);
>> +	void (*poweroff)(struct poweroff_handler *,
>> +			 unsigned long flags);
>>  	int priority;
>>  	const char *name;
>>  	struct list_head list;
>>  };
>>  
>>  int poweroff_handler_register(struct poweroff_handler *);
>> -int poweroff_handler_register_fn(void (*poweroff_fn)(struct poweroff_handler *));
>> +int poweroff_handler_register_fn(void (*poweroff_fn)(struct poweroff_handler *,
>> +						     unsigned long flags));
>>  
>>  #define POWEROFF_DEFAULT_PRIORITY 100
>>  #define POWEROFF_DEFAULT_NAME "default"
>> -- 
>> 2.39.5
>>
>>
>>
> 

-- 
Pengutronix e.K.                  |                             |
Steuerwalder Str. 21              | http://www.pengutronix.de/  |
31137 Hildesheim, Germany         | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686  | Fax:   +49-5121-206917-5555 |




^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH 1/4] restart: give poweroff_machine and restart_machine a flag parameter
  2025-04-22  7:56 [PATCH 1/4] restart: give poweroff_machine and restart_machine a flag parameter Ahmad Fatoum
                   ` (2 preceding siblings ...)
  2025-04-22  7:56 ` [PATCH 4/4] restart: make warm reboot a callback argument Ahmad Fatoum
@ 2025-04-22 11:36 ` Sascha Hauer
  3 siblings, 0 replies; 7+ messages in thread
From: Sascha Hauer @ 2025-04-22 11:36 UTC (permalink / raw)
  To: barebox, Ahmad Fatoum


On Tue, 22 Apr 2025 09:56:12 +0200, Ahmad Fatoum wrote:
> We currently do differentiate between warm and cold reset, but
> restart_machine has no flag to choose between them and instead users
> need to iterate over all registered handlers and choose a suitable one
> and then call hat handler's action.
> 
> In preparation for making warm/cold reset and any other flags we may
> require a feature an argument to the driver action, change all
> poweroff_machine and restart_machine calls to take a flags parameter.
> 
> [...]

Applied, thanks!

[1/4] restart: give poweroff_machine and restart_machine a flag parameter
      https://git.pengutronix.de/cgit/barebox/commit/?id=14e928800a18 (link may not be stable)
[2/4] restart: give all restart_handler::restart callbacks a flags parameter
      https://git.pengutronix.de/cgit/barebox/commit/?id=a375e0c5e4e7 (link may not be stable)
[3/4] poweroff: give all poweroff_handler::poweroff callbacks a flags parameter
      https://git.pengutronix.de/cgit/barebox/commit/?id=3fd1ec8bbefd (link may not be stable)
[4/4] restart: make warm reboot a callback argument
      https://git.pengutronix.de/cgit/barebox/commit/?id=fa8e10d7617b (link may not be stable)

Best regards,
-- 
Sascha Hauer <s.hauer@pengutronix.de>




^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2025-04-22 12:43 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-04-22  7:56 [PATCH 1/4] restart: give poweroff_machine and restart_machine a flag parameter Ahmad Fatoum
2025-04-22  7:56 ` [PATCH 2/4] restart: give all restart_handler::restart callbacks a flags parameter Ahmad Fatoum
2025-04-22  7:56 ` [PATCH 3/4] poweroff: give all poweroff_handler::poweroff " Ahmad Fatoum
2025-04-22 10:32   ` Sascha Hauer
2025-04-22 10:42     ` Ahmad Fatoum
2025-04-22  7:56 ` [PATCH 4/4] restart: make warm reboot a callback argument Ahmad Fatoum
2025-04-22 11:36 ` [PATCH 1/4] restart: give poweroff_machine and restart_machine a flag parameter Sascha Hauer

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox