From patchwork Thu Nov 5 21:19:21 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Akshay Bhat X-Patchwork-Id: 7563851 Return-Path: X-Original-To: patchwork-linux-arm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 73A699F399 for ; Thu, 5 Nov 2015 21:23:16 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id B9C44207DF for ; Thu, 5 Nov 2015 21:23:13 +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 1A00E20812 for ; Thu, 5 Nov 2015 21:23:06 +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 1ZuRxg-0004RS-Jq; Thu, 05 Nov 2015 21:20:48 +0000 Received: from mail-qk0-x233.google.com ([2607:f8b0:400d:c09::233]) by bombadil.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1ZuRxd-0004O8-0V for linux-arm-kernel@lists.infradead.org; Thu, 05 Nov 2015 21:20:46 +0000 Received: by qkas77 with SMTP id s77so34540176qka.0 for ; Thu, 05 Nov 2015 13:20:23 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=timesys_com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=EDgCxwb+6y8l99zoHEZWQ1wIq7iBGfJY1g9qNGBuiQ8=; b=GmQP2W5Z5sFuyH4hADP0SehMAEj+qZiqalBMv83RSTKerEH8eEcfWmCJ8l4KssiL8m PEpwk+w1hUBcQ6vSSA52HggeJGdDcVTKJlv6wEQ4VDzbVTMpYLTWWBF79BHI5BxyYnPk DeXZBoiuXZl5zqc42xpUi0OPYGmjeZPqz0P7VACF9mqv6vFD4Ohl3r73z3l1c2PFwmAl XRQ98imBfstRSIwkrnyLoeuigydEnt8fOfsGICFYmMXLanQyjOBc5iAhoy2Pnu5KkM4v NHGVJCJQ1LuT9UJGUNNEgSz9ONBd6QLEQ6dwEE1ZRc/wFJ71zo/xY8I1yOt+WFoxiBnz raZw== 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=EDgCxwb+6y8l99zoHEZWQ1wIq7iBGfJY1g9qNGBuiQ8=; b=DEuzuOFlmq8YVFd8Nz7a5SqP++u3LC/WC2PwCINfJl0CrV6X4BeRjMMW+lhyQzw0Sa 03KMo9cYpy1+TOgfXjc/iTV5VpWThSnYM/uxxRyMLFV87fhZpek0vn+XKjEKP55K1sJe GK3LzifoTSNT7+/4OmVHgrK0qRUcTNV70F9m5/urfkrACZOIsgbixJlol0/IGGLZaXw9 +0UhPAbmchM18jwA9tQ3wd5MxUpY5n1NqC2vXDd6pUo0nAaaDqLp74PoNwNRx+9e4mKn K9iTGeCF0P3v0D+AmcjjQLeBwfVeEPMSj0m4XjZZQKBSTEHkhUU8Tu1+FmL5CxVUwp/d cErA== X-Gm-Message-State: ALoCoQnPIVoYNejmDwiMACdRDhbwja1PWOMaRtks8YxOYp0tcziv+bDotJRPulAj9NgoCk7aMkA/ X-Received: by 10.55.25.31 with SMTP id k31mr9811669qkh.75.1446758422786; Thu, 05 Nov 2015 13:20:22 -0800 (PST) Received: from localhost.localdomain ([96.94.100.129]) by smtp.gmail.com with ESMTPSA id r73sm2097765qha.48.2015.11.05.13.20.21 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 05 Nov 2015 13:20:22 -0800 (PST) From: Akshay Bhat To: linux-watchdog@vger.kernel.org Subject: [PATCH v4 1/2] watchdog: imx2_wdt: add external reset support via 'ext-reset-output' dt prop Date: Thu, 5 Nov 2015 16:19:21 -0500 Message-Id: <1446758362-11702-2-git-send-email-akshay.bhat@timesys.com> X-Mailer: git-send-email 2.6.2 In-Reply-To: <1446758362-11702-1-git-send-email-akshay.bhat@timesys.com> References: <1446758362-11702-1-git-send-email-akshay.bhat@timesys.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20151105_132045_225278_D7258098 X-CRM114-Status: GOOD ( 15.15 ) 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: mark.rutland@arm.com, devicetree@vger.kernel.org, linux@arm.linux.org.uk, pawel.moll@arm.com, ijc+devicetree@hellion.org.uk, festevam@gmail.com, tharvey@gateworks.com, linux-kernel@vger.kernel.org, wim@iguana.be, robh+dt@kernel.org, kernel@pengutronix.de, galak@codeaurora.org, sr@denx.de, shawnguo@kernel.org, justin.waters@timesys.com, linux-arm-kernel@lists.infradead.org, l.stach@pengutronix.de 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.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_MED, T_DKIM_INVALID, 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 From: Tim Harvey 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 '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: Lucas Stach Signed-off-by: Tim Harvey Acked-by: Shawn Guo --- .../devicetree/bindings/watchdog/fsl-imx-wdt.txt | 2 ++ drivers/watchdog/imx2_wdt.c | 20 ++++++++++++++++++-- 2 files changed, 20 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..9b89b3a 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-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 29ef719..84bfec4 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 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 */ @@ -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; @@ -90,6 +93,13 @@ static int imx2_restart_handler(struct notifier_block *this, unsigned long mode, struct imx2_wdt_device *wdev = container_of(this, struct imx2_wdt_device, restart_handler); + + /* 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); /* @@ -119,8 +129,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 */ @@ -267,6 +281,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, + "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",