From: Ahmad Fatoum <a.fatoum@pengutronix.de>
To: Sascha Hauer <s.hauer@pengutronix.de>
Cc: barebox@lists.infradead.org
Subject: Re: [PATCH 3/4] poweroff: give all poweroff_handler::poweroff callbacks a flags parameter
Date: Tue, 22 Apr 2025 12:42:29 +0200 [thread overview]
Message-ID: <91d7bac6-cf4b-4d2d-b419-c0a109def590@pengutronix.de> (raw)
In-Reply-To: <aAdwJKnnUD5n_y-8@pengutronix.de>
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 |
next prev parent reply other threads:[~2025-04-22 11:19 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
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 [this message]
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
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=91d7bac6-cf4b-4d2d-b419-c0a109def590@pengutronix.de \
--to=a.fatoum@pengutronix.de \
--cc=barebox@lists.infradead.org \
--cc=s.hauer@pengutronix.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox