From patchwork Fri Apr 1 15:16:43 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tim Harvey X-Patchwork-Id: 8725441 Return-Path: X-Original-To: patchwork-linux-arm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork2.web.kernel.org (Postfix) with ESMTP id D1691C0553 for ; Fri, 1 Apr 2016 15:16:40 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id B3FA6203C4 for ; Fri, 1 Apr 2016 15:16:39 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id A26BE203AA for ; Fri, 1 Apr 2016 15:16:38 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1am0mV-0001s9-6X; Fri, 01 Apr 2016 15:14:39 +0000 Received: from mail-pa0-x232.google.com ([2607:f8b0:400e:c03::232]) by bombadil.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1am0mJ-0001o8-Ao for linux-arm-kernel@lists.infradead.org; Fri, 01 Apr 2016 15:14:29 +0000 Received: by mail-pa0-x232.google.com with SMTP id zm5so92991542pac.0 for ; Fri, 01 Apr 2016 08:14:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gateworks-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=/sTMxpHw38OCtM8BnIr9fxSze16YZdzitWh5pvrg4A0=; b=f/bjcLllY2dd10c5cSgbExa6U2Btpk9AES5vLul3lFzm0HvvUCxYg4wpyj9hxK6SZ/ 2JABsCoiNa+FNPWcKJnIhnFHMWgVXKeotOFegdrGqHclD7t+ppdrznVkekZfOGgQ7ldZ /mD7QHeDwt89+SSzI9CwEGOYzuQ9CJv7nSXQ4pKzESBQ5kH1B3rxZcyZMQe+MqhsB2CK 5hKOObBYUxp/rFg4jIrs22E36sPTUuLtQzUFXjCZ2/kEksPJ2LISjeK4dqFuz2jGDPtw 9Q2NnFFnHYMCqHHJZ1m82obWZ8k+gp0kbMEUGx+D5IuCdRqNlzO1DwjVKWhBC4Yl2s7T A6mg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=/sTMxpHw38OCtM8BnIr9fxSze16YZdzitWh5pvrg4A0=; b=HeybkB9pAdZP14uwKJVTStfJ45pXwELiz/TySW/nQa3q35kHwoEVGgseHIDb7NNcPt yuTmisT+EejD7yMTveq738zK6pY+ppV6pIBwi31pG+cJL0nrpvmMdTY426dsm6Vlduvh EWTidiaG8/rHlewaygep2rqUl0FWTluwKjh8woU+7/TKrfMJ7LIzg4cFJEdUzNIonmGy /3cc8oC7TNutR9ojjBb2Y7pOi6rU1q0zAOk1skrA+b8HLhOjcxvlkqaVkzepSW7LUxIZ moP47LWU2TVF0epkihhxc+aUEBxeFVGNwcZGXW2oadbWfqtyjfbr0BUvCE44bVWkyedD n0Zw== X-Gm-Message-State: AD7BkJKl2eX/Dxb4AWKM1FXUmq8yJt8n06wkDuvZ+NbLMq+VmQs8VGC1zg7kR7IwPqGqzA== X-Received: by 10.66.176.193 with SMTP id ck1mr31285562pac.138.1459523646658; Fri, 01 Apr 2016 08:14:06 -0700 (PDT) Received: from tharvey.gw (68-189-91-139.static.snlo.ca.charter.com. [68.189.91.139]) by smtp.gmail.com with ESMTPSA id lq10sm22034807pab.36.2016.04.01.08.14.04 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 01 Apr 2016 08:14:05 -0700 (PDT) From: Tim Harvey To: linux-watchdog@vger.kernel.org, Shawn Guo Subject: [PATCH v5 1/2] watchdog: imx2_wdt: add external reset support via dt prop Date: Fri, 1 Apr 2016 08:16:43 -0700 Message-Id: <1459523804-11390-2-git-send-email-tharvey@gateworks.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1459523804-11390-1-git-send-email-tharvey@gateworks.com> References: <1459523804-11390-1-git-send-email-tharvey@gateworks.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20160401_081427_534164_9EFB185A X-CRM114-Status: GOOD ( 16.31 ) X-Spam-Score: -2.6 (--) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: linux-arm-kernel@lists.infradead.org, Iain Paton , Wim Van Sebroeck , Akshay Bhat , Stefan Roese , Fabio Estevam , Sascha Hauer , Guenter Roeck , Lucas Stach MIME-Version: 1.0 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Spam-Status: No, score=-5.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_MED,RP_MATCHES_RCVD,T_DKIM_INVALID,UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP The IMX6 watchdog supports assertion of a signal (WDOG_B) which can be pinmux'd to an external pin. This is typically used for boards that have PMIC's in control of the IMX6 power rails. In fact, failure to use such an external reset on boards with external PMIC's can result in various hangs due to the IMX6 not being fully reset [1] as well as the board failing to reset because its PMIC has not been reset to provide adequate voltage for the CPU when coming out of reset at 800Mhz. This uses a new device-tree property 'fsl,ext-reset-output' to indicate the board has such a reset and to cause the watchdog to be configured to assert WDOG_B instead of an internal reset both on a watchdog timeout and in system_restart. [1] http://lists.infradead.org/pipermail/linux-arm-kernel/2015-March/333689.html Cc: Fabio Estevam Cc: Lucas Stach Cc: Stefan Roese Cc: Iain Paton Cc: Sascha Hauer Cc: Akshay Bhat Cc: Guenter Roeck Signed-off-by: Tim Harvey Reviewed-by: Lucas Stach Acked-by: Shawn Guo Tested-by: Akshay Bhat Reviewed-by: Guenter Roeck --- v5: - rename property to 'fsl,ext-reset-output' v4: - change Property to Properties in documentation v3: - mandate use of 'either' internal or external reset but not both simultaneously v2: - rename property to 'ext-reset-output' based on ML feedback - simplify setting SRS bit if external-reset - update comments and commit msg Signed-off-by: Tim Harvey --- .../devicetree/bindings/watchdog/fsl-imx-wdt.txt | 4 +++- drivers/watchdog/imx2_wdt.c | 19 +++++++++++++++++-- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/Documentation/devicetree/bindings/watchdog/fsl-imx-wdt.txt b/Documentation/devicetree/bindings/watchdog/fsl-imx-wdt.txt index 8dab6fd..107280e 100644 --- a/Documentation/devicetree/bindings/watchdog/fsl-imx-wdt.txt +++ b/Documentation/devicetree/bindings/watchdog/fsl-imx-wdt.txt @@ -5,10 +5,12 @@ Required properties: - reg : Should contain WDT registers location and length - interrupts : Should contain WDT interrupt -Optional property: +Optional properties: - big-endian: If present the watchdog device's registers are implemented in big endian mode, otherwise in native mode(same with CPU), for more detail please see: Documentation/devicetree/bindings/regmap/regmap.txt. +- fsl,ext-reset-output: If present the watchdog device is configured to + assert its external reset (WDOG_B) instead of issuing a software reset. Examples: diff --git a/drivers/watchdog/imx2_wdt.c b/drivers/watchdog/imx2_wdt.c index e47966a..cb838be 100644 --- a/drivers/watchdog/imx2_wdt.c +++ b/drivers/watchdog/imx2_wdt.c @@ -39,6 +39,8 @@ #define IMX2_WDT_WCR 0x00 /* Control Register */ #define IMX2_WDT_WCR_WT (0xFF << 8) /* -> Watchdog Timeout Field */ +#define IMX2_WDT_WCR_WDA (1 << 5) /* -> External Reset WDOG_B */ +#define IMX2_WDT_WCR_SRS (1 << 4) /* -> Software Reset Signal */ #define IMX2_WDT_WCR_WRE (1 << 3) /* -> WDOG Reset Enable */ #define IMX2_WDT_WCR_WDE (1 << 2) /* -> Watchdog Enable */ #define IMX2_WDT_WCR_WDZST (1 << 0) /* -> Watchdog timer Suspend */ @@ -62,6 +64,7 @@ struct imx2_wdt_device { struct regmap *regmap; struct timer_list timer; /* Pings the watchdog when closed */ struct watchdog_device wdog; + bool ext_reset; }; static bool nowayout = WATCHDOG_NOWAYOUT; @@ -85,6 +88,12 @@ static int imx2_wdt_restart(struct watchdog_device *wdog) struct imx2_wdt_device *wdev = watchdog_get_drvdata(wdog); unsigned int wcr_enable = IMX2_WDT_WCR_WDE; + /* Use internal reset or external - not both */ + if (wdev->ext_reset) + wcr_enable |= IMX2_WDT_WCR_SRS; /* do not assert int reset */ + else + wcr_enable |= IMX2_WDT_WCR_WDA; /* do not assert ext-reset */ + /* Assert SRS signal */ regmap_write(wdev->regmap, IMX2_WDT_WCR, wcr_enable); /* @@ -114,8 +123,12 @@ static inline void imx2_wdt_setup(struct watchdog_device *wdog) val |= IMX2_WDT_WCR_WDZST; /* Strip the old watchdog Time-Out value */ val &= ~IMX2_WDT_WCR_WT; - /* Generate reset if WDOG times out */ - val &= ~IMX2_WDT_WCR_WRE; + /* Generate internal chip-level reset if WDOG times out */ + if (!wdev->ext_reset) + val &= ~IMX2_WDT_WCR_WRE; + /* Or if external-reset assert WDOG_B reset only on time-out */ + else + val |= IMX2_WDT_WCR_WRE; /* Keep Watchdog Disabled */ val &= ~IMX2_WDT_WCR_WDE; /* Set the watchdog's Time-Out value */ @@ -263,6 +276,8 @@ static int __init imx2_wdt_probe(struct platform_device *pdev) regmap_read(wdev->regmap, IMX2_WDT_WRSR, &val); wdog->bootstatus = val & IMX2_WDT_WRSR_TOUT ? WDIOF_CARDRESET : 0; + wdev->ext_reset = of_property_read_bool(pdev->dev.of_node, + "fsl,ext-reset-output"); wdog->timeout = clamp_t(unsigned, timeout, 1, IMX2_WDT_MAX_TIME); if (wdog->timeout != timeout) dev_warn(&pdev->dev, "Initial timeout out of range! Clamped from %u to %u\n",