From patchwork Thu May 28 22:54:36 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tim Harvey X-Patchwork-Id: 6502881 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 34D5EC0020 for ; Thu, 28 May 2015 22:58:06 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 3A01A20569 for ; Thu, 28 May 2015 22:58:05 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 125322052C for ; Thu, 28 May 2015 22:58:04 +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 1Yy6i2-0007sk-VP; Thu, 28 May 2015 22:55:30 +0000 Received: from mail-pa0-f54.google.com ([209.85.220.54]) by bombadil.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1Yy6hh-0006e1-5o for linux-arm-kernel@lists.infradead.org; Thu, 28 May 2015 22:55:11 +0000 Received: by pabru16 with SMTP id ru16so33841184pab.1 for ; Thu, 28 May 2015 15:54:46 -0700 (PDT) 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=9pGDZ1i8WmQiEzHLOu2Hvm6qgmroCxttoudatFrejHY=; b=EITUQKrNdDwQU9aUk7rZeg7JbSQ0qEudv68DBiyK1S0teqcM/4+8nSL4yvxnNPOhHA wWP4wWhd3RYI+0x9rh7kENCv4BncQ5dpHjHflI2QDl8s91tJ284g427kCrFE1bw7eONG XGaoqNgvaB554lZySB1AHxG4z6XeqZs/Auf8fFWQMDaGP+OqlIjzb7HFe2IdHIPZKRcu hgTu1mt/uOLUyGt+I4VL8wRUXyo8Z37wSk/DyORbBKo24cNMhN9aJWDwpctHlO+w2M4G g3GT4AnPAtTDr5vybiOWmCoPyEKGqIDdfYCMiwszIUiyK4IRP3hcR/ZNKH7HQUkzH7By eN6Q== X-Gm-Message-State: ALoCoQlnszeGp3PNCVpTfGV+cFKBfm3jwbk3EToCDBDrd4CTpFgkLLl5B0yN4fqMJq98ghd8S7VH X-Received: by 10.66.62.228 with SMTP id b4mr9487883pas.91.1432853686438; Thu, 28 May 2015 15:54:46 -0700 (PDT) Received: from tharvey.gw (68-189-91-139.static.snlo.ca.charter.com. [68.189.91.139]) by mx.google.com with ESMTPSA id mp3sm3455412pbc.8.2015.05.28.15.54.45 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 28 May 2015 15:54:45 -0700 (PDT) From: Tim Harvey To: Shawn Guo Subject: [PATCH 1/2] watchdog: imx2_wdt: add external reset support via 'ext-reset' dt property Date: Thu, 28 May 2015 15:54:36 -0700 Message-Id: <1432853677-5150-2-git-send-email-tharvey@gateworks.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1432853677-5150-1-git-send-email-tharvey@gateworks.com> References: <1432853677-5150-1-git-send-email-tharvey@gateworks.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20150528_155509_290390_BDE58ECE X-CRM114-Status: GOOD ( 16.52 ) X-Spam-Score: -0.7 (/) Cc: linux-arm-kernel@lists.infradead.org X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.18-1 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , 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=-4.2 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_MED, T_RP_MATCHES_RCVD, 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 voltate for the CPU when comming out of reset at 800Mhz. This uses a new device-tree property 'ext-reset' 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 Signed-off-by: Tim Harvey --- .../devicetree/bindings/watchdog/fsl-imx-wdt.txt | 2 ++ drivers/watchdog/imx2_wdt.c | 18 ++++++++++++++++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/Documentation/devicetree/bindings/watchdog/fsl-imx-wdt.txt b/Documentation/devicetree/bindings/watchdog/fsl-imx-wdt.txt index 8dab6fd..14e04ac 100644 --- a/Documentation/devicetree/bindings/watchdog/fsl-imx-wdt.txt +++ b/Documentation/devicetree/bindings/watchdog/fsl-imx-wdt.txt @@ -9,6 +9,8 @@ Optional property: - 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. +- ext-reset: 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 5e6d808..9ffd516 100644 --- a/drivers/watchdog/imx2_wdt.c +++ b/drivers/watchdog/imx2_wdt.c @@ -41,6 +41,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 Assert */ +#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 */ @@ -65,6 +67,7 @@ struct imx2_wdt_device { struct timer_list timer; /* Pings the watchdog when closed */ struct watchdog_device wdog; struct notifier_block restart_handler; + bool ext_reset; }; static bool nowayout = WATCHDOG_NOWAYOUT; @@ -86,10 +89,17 @@ static const struct watchdog_info imx2_wdt_info = { static int imx2_restart_handler(struct notifier_block *this, unsigned long mode, void *cmd) { - unsigned int wcr_enable = IMX2_WDT_WCR_WDE; + unsigned int wcr_enable; struct imx2_wdt_device *wdev = container_of(this, struct imx2_wdt_device, restart_handler); + + if (!wdev->ext_reset) + wcr_enable = IMX2_WDT_WCR_WDE; + /* Use external reset */ + else + wcr_enable = IMX2_WDT_WCR_WDE | IMX2_WDT_WCR_SRS; + /* Assert SRS signal */ regmap_write(wdev->regmap, 0, wcr_enable); /* @@ -120,7 +130,10 @@ static inline void imx2_wdt_setup(struct watchdog_device *wdog) /* Strip the old watchdog Time-Out value */ val &= ~IMX2_WDT_WCR_WT; /* Generate reset if WDOG times out */ - val &= ~IMX2_WDT_WCR_WRE; + if (!wdev->ext_reset) + val &= ~IMX2_WDT_WCR_WRE; + else + val |= IMX2_WDT_WCR_WRE; /* assert WDOG_B on time-out */ /* Keep Watchdog Disabled */ val &= ~IMX2_WDT_WCR_WDE; /* Set the watchdog's Time-Out value */ @@ -262,6 +275,7 @@ 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, "ext-reset"); 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",