@@ -14,18 +14,16 @@
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/delay.h>
+#include <linux/pm.h>
#include <linux/platform_device.h>
#include <linux/gpio/consumer.h>
#include <linux/of_platform.h>
#include <linux/module.h>
-/*
- * 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 void gpio_poweroff_do_poweroff(void)
+static void gpio_poweroff_do_poweroff(struct power_off_handler_block *this)
+
{
BUG_ON(!reset_gpio);
@@ -45,17 +43,15 @@ static void gpio_poweroff_do_poweroff(void)
WARN_ON(1);
}
+static struct power_off_handler_block gpio_power_off_hb = {
+ .handler = gpio_poweroff_do_poweroff,
+ .priority = POWER_OFF_PRIORITY_LOW,
+};
+
static int gpio_poweroff_probe(struct platform_device *pdev)
{
bool input = false;
-
- /* 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",
- __func__);
- return -EBUSY;
- }
+ int err;
reset_gpio = devm_gpiod_get(&pdev->dev, NULL);
if (IS_ERR(reset_gpio))
@@ -77,16 +73,11 @@ static int gpio_poweroff_probe(struct platform_device *pdev)
}
}
- 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;
+ err = devm_register_power_off_handler(&pdev->dev, &gpio_power_off_hb);
+ if (err)
+ dev_err(&pdev->dev, "Failed to register power-off handler\n");
- return 0;
+ return err;
}
static const struct of_device_id of_gpio_poweroff_match[] = {
@@ -96,7 +87,6 @@ static const struct of_device_id of_gpio_poweroff_match[] = {
static struct platform_driver gpio_poweroff_driver = {
.probe = gpio_poweroff_probe,
- .remove = gpio_poweroff_remove,
.driver = {
.name = "poweroff-gpio",
.owner = THIS_MODULE,