From patchwork Tue Jan 8 10:04:10 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fabio Porcedda X-Patchwork-Id: 1944941 Return-Path: X-Original-To: patchwork-linux-arm@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork2.kernel.org Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) by patchwork2.kernel.org (Postfix) with ESMTP id A22ACDF23A for ; Tue, 8 Jan 2013 10:08:21 +0000 (UTC) Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.76 #1 (Red Hat Linux)) id 1TsW2z-000093-Gv; Tue, 08 Jan 2013 10:04:41 +0000 Received: from mail-ea0-f169.google.com ([209.85.215.169]) by merlin.infradead.org with esmtps (Exim 4.76 #1 (Red Hat Linux)) id 1TsW2k-00005e-KJ for linux-arm-kernel@lists.infradead.org; Tue, 08 Jan 2013 10:04:27 +0000 Received: by mail-ea0-f169.google.com with SMTP id a12so97562eaa.28 for ; Tue, 08 Jan 2013 02:04:22 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:from:to:cc:subject:date:message-id:x-mailer:in-reply-to :references; bh=WjXMC90iLg60c+6LrbYz2YDqUpyUN8MmurD162hsdis=; b=PZqkTpeKjkqM/ZHFE2vMMcKVT3fh5xcCgsdGJVaKOnmll1ajNIxhxUbe14o3ZIXqqp 9WtSF+ekkTaxT4npuFMYZMbEFLBHsuv6VvV0J+fhqzZTYERVhxQXlJ6ff57qVmmxndA8 jlCiLkFIyP27ChgSMWWq82uV6ZqdoT3KYZ7IMVs1lAqRtZZSLkPDRjpRECN2qyfI95Oy w5oz5tYGtR7/5OHCaCqHU4Lxq941uA6aKpbzZuMECdZ1mN/+gGdTueLFXwobV/mVsXCC QtQKBPFerFhT1e7CbAGu0ejK8n9PnE6+tGQCwf2TlSXn81fQavbHFTyDUQ78jYXtR2HN 5w6A== X-Received: by 10.14.194.195 with SMTP id m43mr173767288een.44.1357639462291; Tue, 08 Jan 2013 02:04:22 -0800 (PST) Received: from ld2036.tmt.telital.com ([213.205.6.118]) by mx.google.com with ESMTPS id f49sm134746460eep.12.2013.01.08.02.04.19 (version=SSLv3 cipher=OTHER); Tue, 08 Jan 2013 02:04:21 -0800 (PST) From: Fabio Porcedda To: Wim Van Sebroeck , linux-watchdog@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Nicolas Ferre , Jean-Christophe PLAGNIOL-VILLARD , Andrew Victor , Jason Cooper , Andrew Lunn , Ben Dooks , Kukjin Kim Subject: [PATCH v7 1/6] watchdog: core: dt: add support for the timeout-sec dt property Date: Tue, 8 Jan 2013 11:04:10 +0100 Message-Id: <1357639455-21935-2-git-send-email-fabio.porcedda@gmail.com> X-Mailer: git-send-email 1.8.0.3 In-Reply-To: <1357639455-21935-1-git-send-email-fabio.porcedda@gmail.com> References: <1357639455-21935-1-git-send-email-fabio.porcedda@gmail.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20130108_050426_836168_AAE75748 X-CRM114-Status: GOOD ( 17.94 ) X-Spam-Score: 0.3 (/) X-Spam-Report: SpamAssassin version 3.3.2 on merlin.infradead.org summary: Content analysis details: (0.3 points) pts rule name description ---- ---------------------- -------------------------------------------------- 3.0 KHOP_BIG_TO_CC Sent to 10+ recipients instaed of Bcc or a list 0.0 FREEMAIL_FROM Sender email is commonly abused enduser mail provider (fabio.porcedda[at]gmail.com) -0.7 RCVD_IN_DNSWL_LOW RBL: Sender listed at http://www.dnswl.org/, low trust [209.85.215.169 listed in list.dnswl.org] -0.0 SPF_PASS SPF: sender matches SPF record -1.9 BAYES_00 BODY: Bayes spam probability is 0 to 1% [score: 0.0000] -0.1 DKIM_VALID_AU Message has a valid DKIM or DK signature from author's domain 0.1 DKIM_SIGNED Message has a DKIM or DK signature, not necessarily valid -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature Cc: devicetree-discuss@lists.ozlabs.org X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: linux-arm-kernel-bounces@lists.infradead.org Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org Signed-off-by: Fabio Porcedda --- Documentation/watchdog/watchdog-kernel-api.txt | 10 +++++++ drivers/watchdog/watchdog_core.c | 37 ++++++++++++++++++++++++++ include/linux/watchdog.h | 3 +++ 3 files changed, 50 insertions(+) diff --git a/Documentation/watchdog/watchdog-kernel-api.txt b/Documentation/watchdog/watchdog-kernel-api.txt index 086638f..44098c2 100644 --- a/Documentation/watchdog/watchdog-kernel-api.txt +++ b/Documentation/watchdog/watchdog-kernel-api.txt @@ -212,3 +212,13 @@ driver specific data to and a pointer to the data itself. The watchdog_get_drvdata function allows you to retrieve driver specific data. The argument of this function is the watchdog device where you want to retrieve data from. The function returns the pointer to the driver specific data. + +To initialize the timeout field use the following function: + +extern void watchdog_init_timeout(struct watchdog_device *wdd, + unsigned int parm_timeout, + struct device_node *node); + +The watchdog_init_timeout function allows you to initialize the timeout field +using the module timeout parameter or retrieving the timeout-sec property from +the device tree. diff --git a/drivers/watchdog/watchdog_core.c b/drivers/watchdog/watchdog_core.c index 3796434..758a285 100644 --- a/drivers/watchdog/watchdog_core.c +++ b/drivers/watchdog/watchdog_core.c @@ -36,12 +36,49 @@ #include /* For __init/__exit/... */ #include /* For ida_* macros */ #include /* For IS_ERR macros */ +#include /* For of_get_timeout_sec */ #include "watchdog_core.h" /* For watchdog_dev_register/... */ static DEFINE_IDA(watchdog_ida); static struct class *watchdog_class; +static bool watchdog_is_valid_timeout(struct watchdog_device *wdd, + unsigned int t) + +{ + if (wdd->min_timeout < wdd->max_timeout) + return (wdd->min_timeout <= t) && (t <= wdd->max_timeout); + else + return (t > 0); +} + +/** + * watchdog_init_timeout() - initialize the timeout field + * @parm: timeout module parameter, it takes precedence over the + * timeout-sec property. + * @node: Retrieve the timeout-sec property only if the parm_timeout + * is out of bounds. + */ +void watchdog_init_timeout(struct watchdog_device *wdd, unsigned int parm, + struct device_node *node) +{ + unsigned int t = 0; + + if (watchdog_is_valid_timeout(wdd, parm)) { + wdd->timeout = parm; + return; + } + + /* try to get the timeout_sec property */ + if (!node) + return; + of_property_read_u32(node, "timeout-sec", &t); + if (watchdog_is_valid_timeout(wdd, t)) + wdd->timeout = t; +} +EXPORT_SYMBOL_GPL(watchdog_init_timeout); + /** * watchdog_register_device() - register a watchdog device * @wdd: watchdog device diff --git a/include/linux/watchdog.h b/include/linux/watchdog.h index 3a9df2f..e40cc2b 100644 --- a/include/linux/watchdog.h +++ b/include/linux/watchdog.h @@ -130,6 +130,9 @@ static inline void *watchdog_get_drvdata(struct watchdog_device *wdd) } /* drivers/watchdog/watchdog_core.c */ +extern void watchdog_init_timeout(struct watchdog_device *wdd, + unsigned int parm_timeout, + struct device_node *node); extern int watchdog_register_device(struct watchdog_device *); extern void watchdog_unregister_device(struct watchdog_device *);