From patchwork Mon Oct 27 15:55:32 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Guenter Roeck X-Patchwork-Id: 5162831 Return-Path: X-Original-To: patchwork-linux-pm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork1.web.kernel.org (Postfix) with ESMTP id C634C9F318 for ; Mon, 27 Oct 2014 16:06:24 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id E9F192020E for ; Mon, 27 Oct 2014 16:06:23 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id AD72D2017D for ; Mon, 27 Oct 2014 16:06:22 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751628AbaJ0QGT (ORCPT ); Mon, 27 Oct 2014 12:06:19 -0400 Received: from bh-25.webhostbox.net ([208.91.199.152]:50143 "EHLO bh-25.webhostbox.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752976AbaJ0P5C (ORCPT ); Mon, 27 Oct 2014 11:57:02 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=roeck-us.net; s=default; h=References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From; bh=1nD/YKOmKbrhIaQjI8N29Az7HijFYKDoDj3XPXBtjZ8=; b=wyVFO1wcZnbcH6aRqQjpEaK4kp1U8BPTwB35DIjEdGIbBkFaDKksATmVYDwclEsAd6oZQ1kutDAM/XhsG8ZZkxrcXuxoVYcP4WfRRCzaJwiP6RXr2LQ/xOWklaLL6g26sORMTJC8MSqs7eVZcTE6q9PINOa31AcQpt7s7Cl/XRM=; Received: from mailnull by bh-25.webhostbox.net with sa-checked (Exim 4.82) (envelope-from ) id 1XimfG-000cWH-1M for linux-pm@vger.kernel.org; Mon, 27 Oct 2014 15:57:02 +0000 Received: from 108-223-40-66.lightspeed.sntcca.sbcglobal.net ([108.223.40.66]:54056 helo=localhost) by bh-25.webhostbox.net with esmtpa (Exim 4.82) (envelope-from ) id 1XimfE-000cRr-Lr; Mon, 27 Oct 2014 15:57:01 +0000 From: Guenter Roeck To: linux-kernel@vger.kernel.org Cc: linux-pm@vger.kernel.org, Guenter Roeck , Sebastian Reichel , Dmitry Eremin-Solenikov , David Woodhouse Subject: [PATCH v3 25/47] power/reset: qnap-poweroff: Register with kernel power-off handler Date: Mon, 27 Oct 2014 08:55:32 -0700 Message-Id: <1414425354-10359-26-git-send-email-linux@roeck-us.net> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1414425354-10359-1-git-send-email-linux@roeck-us.net> References: <1414425354-10359-1-git-send-email-linux@roeck-us.net> X-Authenticated_sender: guenter@roeck-us.net X-OutGoing-Spam-Status: No, score=-1.0 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Spam-Level: X-Spam-Status: No, score=-7.3 required=5.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI,RP_MATCHES_RCVD,T_DKIM_INVALID,UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-CTCH-PVer: 0000001 X-CTCH-Spam: Unknown X-CTCH-VOD: Unknown X-CTCH-Flags: 0 X-CTCH-RefID: str=0001.0A020209.544E6B4E.0035, ss=1, re=0.000, recu=0.000, reip=0.000, cl=1, cld=1, fgs=0 X-CTCH-Score: 0.000 X-CTCH-ScoreCust: 0.000 X-CTCH-Rules: C_4847, X-CTCH-SenderID: linux@roeck-us.net X-CTCH-SenderID-Flags: 0 X-CTCH-SenderID-TotalMessages: 146 X-CTCH-SenderID-TotalSpam: 0 X-CTCH-SenderID-TotalSuspected: 0 X-CTCH-SenderID-TotalConfirmed: 0 X-CTCH-SenderID-TotalBulk: 0 X-CTCH-SenderID-TotalVirus: 0 X-CTCH-SenderID-TotalRecipients: 0 X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - bh-25.webhostbox.net X-AntiAbuse: Original Domain - vger.kernel.org X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - roeck-us.net X-Get-Message-Sender-Via: bh-25.webhostbox.net: mailgid no entry from get_relayhosts_entry X-Source: X-Source-Args: X-Source-Dir: Sender: linux-pm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pm@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Register with kernel power-off handler instead of setting pm_power_off directly. Register with default priority to reflect that the original code generates an error if another power-off handler has already been registered when the driver is loaded. Drop remove function since it is no longer needed. Cc: Sebastian Reichel Cc: Dmitry Eremin-Solenikov Cc: David Woodhouse Acked-by: Andrew Lunn Acked-by: Sebastian Reichel Signed-off-by: Guenter Roeck --- v3: - Replace poweroff in all newly introduced variables and in text with power_off or power-off as appropriate - Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx v2: - Use define to specify poweroff handler priority - Use devm_register_power_off_handler - Drop remove function since it is no longer needed drivers/power/reset/qnap-poweroff.c | 32 ++++++++++++-------------------- 1 file changed, 12 insertions(+), 20 deletions(-) diff --git a/drivers/power/reset/qnap-poweroff.c b/drivers/power/reset/qnap-poweroff.c index a75db7f..b9c8158 100644 --- a/drivers/power/reset/qnap-poweroff.c +++ b/drivers/power/reset/qnap-poweroff.c @@ -16,7 +16,9 @@ #include #include +#include #include +#include #include #include #include @@ -55,7 +57,8 @@ static void __iomem *base; static unsigned long tclk; static const struct power_off_cfg *cfg; -static void qnap_power_off(void) +static int qnap_power_off(struct notifier_block *this, unsigned long unused1, + void *unused2) { const unsigned divisor = ((tclk + (8 * cfg->baud)) / (16 * cfg->baud)); @@ -72,14 +75,20 @@ static void qnap_power_off(void) /* send the power-off command to PIC */ writel(cfg->cmd, UART1_REG(TX)); + + return NOTIFY_DONE; } +static struct notifier_block qnap_power_off_nb = { + .notifier_call = qnap_power_off, + .priority = POWER_OFF_PRIORITY_DEFAULT, +}; + static int qnap_power_off_probe(struct platform_device *pdev) { struct device_node *np = pdev->dev.of_node; struct resource *res; struct clk *clk; - char symname[KSYM_NAME_LEN]; const struct of_device_id *match = of_match_node(qnap_power_off_of_match_table, np); @@ -106,28 +115,11 @@ static int qnap_power_off_probe(struct platform_device *pdev) tclk = clk_get_rate(clk); - /* Check that nothing else has already setup a handler */ - if (pm_power_off) { - lookup_symbol_name((ulong)pm_power_off, symname); - dev_err(&pdev->dev, - "pm_power_off already claimed %p %s", - pm_power_off, symname); - return -EBUSY; - } - pm_power_off = qnap_power_off; - - return 0; -} - -static int qnap_power_off_remove(struct platform_device *pdev) -{ - pm_power_off = NULL; - return 0; + return devm_register_power_off_handler(&pdev->dev, &qnap_power_off_nb); } static struct platform_driver qnap_power_off_driver = { .probe = qnap_power_off_probe, - .remove = qnap_power_off_remove, .driver = { .owner = THIS_MODULE, .name = "qnap_power_off",