* [PATCH v1 0/4] power: reset: gpio-poweroff: use sys-off handler API
@ 2023-09-28 12:32 Francesco Dolcini
2023-09-28 12:37 ` [PATCH v1 1/4] power: reset: gpio-poweroff: use a struct to store the module variables Francesco Dolcini
0 siblings, 1 reply; 6+ messages in thread
From: Francesco Dolcini @ 2023-09-28 12:32 UTC (permalink / raw)
To: Sebastian Reichel, Rob Herring, Krzysztof Kozlowski, Conor Dooley
Cc: Francesco Dolcini, linux-pm, devicetree, linux-kernel
From: Francesco Dolcini <francesco.dolcini@toradex.com>
Use the new sys-off handler API for gpio-poweroff. This allows us to have more
than one power-off handler and to have a priority for the handler. Also, add a
priority property so we can use gpio-poweroff even when registering another
poweroff handler or using the legacy pm_power_off method.
Stefan Eichenberger (4):
power: reset: gpio-poweroff: use a struct to store the module
variables
power: reset: gpio-poweroff: use sys-off handler API
dt-bindings: power: reset: gpio-poweroff: Add priority property
power: reset: gpio-poweroff: make sys handler priority configurable
.../bindings/power/reset/gpio-poweroff.yaml | 4 +
drivers/power/reset/gpio-poweroff.c | 82 ++++++++++---------
2 files changed, 48 insertions(+), 38 deletions(-)
--
2.25.1
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v1 1/4] power: reset: gpio-poweroff: use a struct to store the module variables
2023-09-28 12:32 [PATCH v1 0/4] power: reset: gpio-poweroff: use sys-off handler API Francesco Dolcini
@ 2023-09-28 12:37 ` Francesco Dolcini
2023-09-28 12:37 ` [PATCH v1 2/4] power: reset: gpio-poweroff: use sys-off handler API Francesco Dolcini
` (2 more replies)
0 siblings, 3 replies; 6+ messages in thread
From: Francesco Dolcini @ 2023-09-28 12:37 UTC (permalink / raw)
To: Sebastian Reichel
Cc: Stefan Eichenberger, linux-pm, linux-kernel, Francesco Dolcini
From: Stefan Eichenberger <stefan.eichenberger@toradex.com>
Use a struct to store the module variables. This is required to later
move to notifier_blocks where we can have several instances.
Signed-off-by: Stefan Eichenberger <stefan.eichenberger@toradex.com>
Signed-off-by: Francesco Dolcini <francesco.dolcini@toradex.com>
---
drivers/power/reset/gpio-poweroff.c | 48 +++++++++++++++++++----------
1 file changed, 31 insertions(+), 17 deletions(-)
diff --git a/drivers/power/reset/gpio-poweroff.c b/drivers/power/reset/gpio-poweroff.c
index b28f24da1b3c..dea550e422f3 100644
--- a/drivers/power/reset/gpio-poweroff.c
+++ b/drivers/power/reset/gpio-poweroff.c
@@ -17,32 +17,37 @@
#include <linux/module.h>
#define DEFAULT_TIMEOUT_MS 3000
+
+struct gpio_poweroff {
+ struct gpio_desc *reset_gpio;
+ u32 timeout_ms;
+ u32 active_delay_ms;
+ u32 inactive_delay_ms;
+};
+
/*
* Hold configuration here, cannot be more than one instance of the driver
* since pm_power_off itself is global.
*/
-static struct gpio_desc *reset_gpio;
-static u32 timeout = DEFAULT_TIMEOUT_MS;
-static u32 active_delay = 100;
-static u32 inactive_delay = 100;
+static struct gpio_poweroff *gpio_poweroff;
static void gpio_poweroff_do_poweroff(void)
{
- BUG_ON(!reset_gpio);
+ BUG_ON(!gpio_poweroff);
/* drive it active, also inactive->active edge */
- gpiod_direction_output(reset_gpio, 1);
- mdelay(active_delay);
+ gpiod_direction_output(gpio_poweroff->reset_gpio, 1);
+ mdelay(gpio_poweroff->active_delay_ms);
/* drive inactive, also active->inactive edge */
- gpiod_set_value_cansleep(reset_gpio, 0);
- mdelay(inactive_delay);
+ gpiod_set_value_cansleep(gpio_poweroff->reset_gpio, 0);
+ mdelay(gpio_poweroff->inactive_delay_ms);
/* drive it active, also inactive->active edge */
- gpiod_set_value_cansleep(reset_gpio, 1);
+ gpiod_set_value_cansleep(gpio_poweroff->reset_gpio, 1);
/* give it some time */
- mdelay(timeout);
+ mdelay(gpio_poweroff->timeout_ms);
WARN_ON(1);
}
@@ -60,20 +65,29 @@ static int gpio_poweroff_probe(struct platform_device *pdev)
return -EBUSY;
}
+ gpio_poweroff = devm_kzalloc(&pdev->dev, sizeof(*gpio_poweroff), GFP_KERNEL);
+ if (!gpio_poweroff)
+ return -ENOMEM;
+
input = device_property_read_bool(&pdev->dev, "input");
if (input)
flags = GPIOD_IN;
else
flags = GPIOD_OUT_LOW;
- device_property_read_u32(&pdev->dev, "active-delay-ms", &active_delay);
+
+ gpio_poweroff->active_delay_ms = 100;
+ gpio_poweroff->inactive_delay_ms = 100;
+ gpio_poweroff->timeout_ms = DEFAULT_TIMEOUT_MS;
+
+ device_property_read_u32(&pdev->dev, "active-delay-ms", &gpio_poweroff->active_delay_ms);
device_property_read_u32(&pdev->dev, "inactive-delay-ms",
- &inactive_delay);
- device_property_read_u32(&pdev->dev, "timeout-ms", &timeout);
+ &gpio_poweroff->inactive_delay_ms);
+ device_property_read_u32(&pdev->dev, "timeout-ms", &gpio_poweroff->timeout_ms);
- reset_gpio = devm_gpiod_get(&pdev->dev, NULL, flags);
- if (IS_ERR(reset_gpio))
- return PTR_ERR(reset_gpio);
+ gpio_poweroff->reset_gpio = devm_gpiod_get(&pdev->dev, NULL, flags);
+ if (IS_ERR(gpio_poweroff->reset_gpio))
+ return PTR_ERR(gpio_poweroff->reset_gpio);
pm_power_off = &gpio_poweroff_do_poweroff;
return 0;
--
2.25.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH v1 2/4] power: reset: gpio-poweroff: use sys-off handler API
2023-09-28 12:37 ` [PATCH v1 1/4] power: reset: gpio-poweroff: use a struct to store the module variables Francesco Dolcini
@ 2023-09-28 12:37 ` Francesco Dolcini
2023-09-28 12:37 ` [PATCH v1 3/4] dt-bindings: power: reset: gpio-poweroff: Add priority property Francesco Dolcini
2023-09-28 12:37 ` [PATCH v1 4/4] power: reset: gpio-poweroff: make sys handler priority configurable Francesco Dolcini
2 siblings, 0 replies; 6+ messages in thread
From: Francesco Dolcini @ 2023-09-28 12:37 UTC (permalink / raw)
To: Sebastian Reichel
Cc: Stefan Eichenberger, linux-pm, linux-kernel, Francesco Dolcini
From: Stefan Eichenberger <stefan.eichenberger@toradex.com>
Use the new sys-off handler API for gpio-poweroff. This allows us to
have more than one poweroff handler and prioritise them.
Signed-off-by: Stefan Eichenberger <stefan.eichenberger@toradex.com>
Signed-off-by: Francesco Dolcini <francesco.dolcini@toradex.com>
---
drivers/power/reset/gpio-poweroff.c | 37 ++++++++++-------------------
1 file changed, 12 insertions(+), 25 deletions(-)
diff --git a/drivers/power/reset/gpio-poweroff.c b/drivers/power/reset/gpio-poweroff.c
index dea550e422f3..0deb293eb2d6 100644
--- a/drivers/power/reset/gpio-poweroff.c
+++ b/drivers/power/reset/gpio-poweroff.c
@@ -15,6 +15,7 @@
#include <linux/gpio/consumer.h>
#include <linux/mod_devicetable.h>
#include <linux/module.h>
+#include <linux/reboot.h>
#define DEFAULT_TIMEOUT_MS 3000
@@ -25,15 +26,9 @@ struct gpio_poweroff {
u32 inactive_delay_ms;
};
-/*
- * Hold configuration here, cannot be more than one instance of the driver
- * since pm_power_off itself is global.
- */
-static struct gpio_poweroff *gpio_poweroff;
-
-static void gpio_poweroff_do_poweroff(void)
+static int gpio_poweroff_do_poweroff(struct sys_off_data *data)
{
- BUG_ON(!gpio_poweroff);
+ struct gpio_poweroff *gpio_poweroff = data->cb_data;
/* drive it active, also inactive->active edge */
gpiod_direction_output(gpio_poweroff->reset_gpio, 1);
@@ -50,20 +45,16 @@ static void gpio_poweroff_do_poweroff(void)
mdelay(gpio_poweroff->timeout_ms);
WARN_ON(1);
+
+ return NOTIFY_DONE;
}
static int gpio_poweroff_probe(struct platform_device *pdev)
{
+ struct gpio_poweroff *gpio_poweroff;
bool input = false;
enum gpiod_flags flags;
-
- /* If a pm_power_off function has already been added, leave it alone */
- if (pm_power_off != NULL) {
- dev_err(&pdev->dev,
- "%s: pm_power_off function already registered\n",
- __func__);
- return -EBUSY;
- }
+ int ret;
gpio_poweroff = devm_kzalloc(&pdev->dev, sizeof(*gpio_poweroff), GFP_KERNEL);
if (!gpio_poweroff)
@@ -89,14 +80,11 @@ static int gpio_poweroff_probe(struct platform_device *pdev)
if (IS_ERR(gpio_poweroff->reset_gpio))
return PTR_ERR(gpio_poweroff->reset_gpio);
- pm_power_off = &gpio_poweroff_do_poweroff;
- return 0;
-}
-
-static int gpio_poweroff_remove(struct platform_device *pdev)
-{
- if (pm_power_off == &gpio_poweroff_do_poweroff)
- pm_power_off = NULL;
+ ret = devm_register_sys_off_handler(&pdev->dev, SYS_OFF_MODE_POWER_OFF,
+ SYS_OFF_PRIO_DEFAULT, gpio_poweroff_do_poweroff,
+ gpio_poweroff);
+ if (ret)
+ return dev_err_probe(&pdev->dev, ret, "Cannot register poweroff handler\n");
return 0;
}
@@ -109,7 +97,6 @@ MODULE_DEVICE_TABLE(of, of_gpio_poweroff_match);
static struct platform_driver gpio_poweroff_driver = {
.probe = gpio_poweroff_probe,
- .remove = gpio_poweroff_remove,
.driver = {
.name = "poweroff-gpio",
.of_match_table = of_gpio_poweroff_match,
--
2.25.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH v1 3/4] dt-bindings: power: reset: gpio-poweroff: Add priority property
2023-09-28 12:37 ` [PATCH v1 1/4] power: reset: gpio-poweroff: use a struct to store the module variables Francesco Dolcini
2023-09-28 12:37 ` [PATCH v1 2/4] power: reset: gpio-poweroff: use sys-off handler API Francesco Dolcini
@ 2023-09-28 12:37 ` Francesco Dolcini
2023-10-02 16:39 ` Rob Herring
2023-09-28 12:37 ` [PATCH v1 4/4] power: reset: gpio-poweroff: make sys handler priority configurable Francesco Dolcini
2 siblings, 1 reply; 6+ messages in thread
From: Francesco Dolcini @ 2023-09-28 12:37 UTC (permalink / raw)
To: Sebastian Reichel, Rob Herring, Krzysztof Kozlowski, Conor Dooley
Cc: Stefan Eichenberger, linux-pm, devicetree, linux-kernel,
Francesco Dolcini
From: Stefan Eichenberger <stefan.eichenberger@toradex.com>
Add the priority property to the gpio-poweroff bindings description.
Signed-off-by: Stefan Eichenberger <stefan.eichenberger@toradex.com>
Signed-off-by: Francesco Dolcini <francesco.dolcini@toradex.com>
---
.../devicetree/bindings/power/reset/gpio-poweroff.yaml | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/Documentation/devicetree/bindings/power/reset/gpio-poweroff.yaml b/Documentation/devicetree/bindings/power/reset/gpio-poweroff.yaml
index b54ec003a1e0..c6404841bcd7 100644
--- a/Documentation/devicetree/bindings/power/reset/gpio-poweroff.yaml
+++ b/Documentation/devicetree/bindings/power/reset/gpio-poweroff.yaml
@@ -40,6 +40,10 @@ properties:
default: 100
description: Delay to wait after driving gpio inactive
+ priority:
+ default: 0
+ description: Priority of the power off handler
+
timeout-ms:
default: 3000
description: Time to wait before assuming the power off sequence failed.
--
2.25.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH v1 4/4] power: reset: gpio-poweroff: make sys handler priority configurable
2023-09-28 12:37 ` [PATCH v1 1/4] power: reset: gpio-poweroff: use a struct to store the module variables Francesco Dolcini
2023-09-28 12:37 ` [PATCH v1 2/4] power: reset: gpio-poweroff: use sys-off handler API Francesco Dolcini
2023-09-28 12:37 ` [PATCH v1 3/4] dt-bindings: power: reset: gpio-poweroff: Add priority property Francesco Dolcini
@ 2023-09-28 12:37 ` Francesco Dolcini
2 siblings, 0 replies; 6+ messages in thread
From: Francesco Dolcini @ 2023-09-28 12:37 UTC (permalink / raw)
To: Sebastian Reichel
Cc: Stefan Eichenberger, linux-pm, linux-kernel, Francesco Dolcini
From: Stefan Eichenberger <stefan.eichenberger@toradex.com>
Add a priority property equal to gpio-restart to allow increasing the
priority of the gpio-poweroff handler.
Signed-off-by: Stefan Eichenberger <stefan.eichenberger@toradex.com>
Signed-off-by: Francesco Dolcini <francesco.dolcini@toradex.com>
---
drivers/power/reset/gpio-poweroff.c | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/drivers/power/reset/gpio-poweroff.c b/drivers/power/reset/gpio-poweroff.c
index 0deb293eb2d6..52cfeee2cb28 100644
--- a/drivers/power/reset/gpio-poweroff.c
+++ b/drivers/power/reset/gpio-poweroff.c
@@ -54,6 +54,7 @@ static int gpio_poweroff_probe(struct platform_device *pdev)
struct gpio_poweroff *gpio_poweroff;
bool input = false;
enum gpiod_flags flags;
+ int priority = SYS_OFF_PRIO_DEFAULT;
int ret;
gpio_poweroff = devm_kzalloc(&pdev->dev, sizeof(*gpio_poweroff), GFP_KERNEL);
@@ -75,14 +76,18 @@ static int gpio_poweroff_probe(struct platform_device *pdev)
device_property_read_u32(&pdev->dev, "inactive-delay-ms",
&gpio_poweroff->inactive_delay_ms);
device_property_read_u32(&pdev->dev, "timeout-ms", &gpio_poweroff->timeout_ms);
+ device_property_read_u32(&pdev->dev, "priority", &priority);
+ if (priority > 255) {
+ dev_err(&pdev->dev, "Invalid priority property: %u\n", priority);
+ return -EINVAL;
+ }
gpio_poweroff->reset_gpio = devm_gpiod_get(&pdev->dev, NULL, flags);
if (IS_ERR(gpio_poweroff->reset_gpio))
return PTR_ERR(gpio_poweroff->reset_gpio);
ret = devm_register_sys_off_handler(&pdev->dev, SYS_OFF_MODE_POWER_OFF,
- SYS_OFF_PRIO_DEFAULT, gpio_poweroff_do_poweroff,
- gpio_poweroff);
+ priority, gpio_poweroff_do_poweroff, gpio_poweroff);
if (ret)
return dev_err_probe(&pdev->dev, ret, "Cannot register poweroff handler\n");
--
2.25.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH v1 3/4] dt-bindings: power: reset: gpio-poweroff: Add priority property
2023-09-28 12:37 ` [PATCH v1 3/4] dt-bindings: power: reset: gpio-poweroff: Add priority property Francesco Dolcini
@ 2023-10-02 16:39 ` Rob Herring
0 siblings, 0 replies; 6+ messages in thread
From: Rob Herring @ 2023-10-02 16:39 UTC (permalink / raw)
To: Francesco Dolcini
Cc: Sebastian Reichel, Krzysztof Kozlowski, Conor Dooley,
Stefan Eichenberger, linux-pm, devicetree, linux-kernel,
Francesco Dolcini
On Thu, Sep 28, 2023 at 02:37:27PM +0200, Francesco Dolcini wrote:
> From: Stefan Eichenberger <stefan.eichenberger@toradex.com>
>
> Add the priority property to the gpio-poweroff bindings description.
>
> Signed-off-by: Stefan Eichenberger <stefan.eichenberger@toradex.com>
> Signed-off-by: Francesco Dolcini <francesco.dolcini@toradex.com>
> ---
> .../devicetree/bindings/power/reset/gpio-poweroff.yaml | 4 ++++
> 1 file changed, 4 insertions(+)
>
> diff --git a/Documentation/devicetree/bindings/power/reset/gpio-poweroff.yaml b/Documentation/devicetree/bindings/power/reset/gpio-poweroff.yaml
> index b54ec003a1e0..c6404841bcd7 100644
> --- a/Documentation/devicetree/bindings/power/reset/gpio-poweroff.yaml
> +++ b/Documentation/devicetree/bindings/power/reset/gpio-poweroff.yaml
> @@ -40,6 +40,10 @@ properties:
> default: 100
> description: Delay to wait after driving gpio inactive
>
> + priority:
> + default: 0
> + description: Priority of the power off handler
> +
You also need a $ref to restart-handler.yaml (at the top level).
> timeout-ms:
> default: 3000
> description: Time to wait before assuming the power off sequence failed.
> --
> 2.25.1
>
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2023-10-02 16:39 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-09-28 12:32 [PATCH v1 0/4] power: reset: gpio-poweroff: use sys-off handler API Francesco Dolcini
2023-09-28 12:37 ` [PATCH v1 1/4] power: reset: gpio-poweroff: use a struct to store the module variables Francesco Dolcini
2023-09-28 12:37 ` [PATCH v1 2/4] power: reset: gpio-poweroff: use sys-off handler API Francesco Dolcini
2023-09-28 12:37 ` [PATCH v1 3/4] dt-bindings: power: reset: gpio-poweroff: Add priority property Francesco Dolcini
2023-10-02 16:39 ` Rob Herring
2023-09-28 12:37 ` [PATCH v1 4/4] power: reset: gpio-poweroff: make sys handler priority configurable Francesco Dolcini
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.