From patchwork Fri Oct 6 13:04:26 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Francesco Dolcini X-Patchwork-Id: 730193 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id EDECCE81DF5 for ; Fri, 6 Oct 2023 13:04:52 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232091AbjJFNEv (ORCPT ); Fri, 6 Oct 2023 09:04:51 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:40188 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231879AbjJFNEt (ORCPT ); Fri, 6 Oct 2023 09:04:49 -0400 Received: from mail11.truemail.it (mail11.truemail.it [217.194.8.81]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A652BE4; Fri, 6 Oct 2023 06:04:47 -0700 (PDT) Received: from francesco-nb.corp.toradex.com (unknown [201.82.41.210]) by mail11.truemail.it (Postfix) with ESMTPA id 3043920F56; Fri, 6 Oct 2023 15:04:43 +0200 (CEST) From: Francesco Dolcini To: Sebastian Reichel Cc: Stefan Eichenberger , linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org, Francesco Dolcini Subject: [PATCH v2 2/4] power: reset: gpio-poweroff: use sys-off handler API Date: Fri, 6 Oct 2023 10:04:26 -0300 Message-Id: <20231006130428.11259-3-francesco@dolcini.it> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20231006130428.11259-1-francesco@dolcini.it> References: <20231006130428.11259-1-francesco@dolcini.it> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-pm@vger.kernel.org From: Stefan Eichenberger 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 Signed-off-by: Francesco Dolcini --- 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 #include #include +#include #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,