All of lore.kernel.org
 help / color / mirror / Atom feed
From: tharvey@gateworks.com (Tim Harvey)
To: linux-arm-kernel@lists.infradead.org
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	[thread overview]
Message-ID: <1432853677-5150-2-git-send-email-tharvey@gateworks.com> (raw)
In-Reply-To: <1432853677-5150-1-git-send-email-tharvey@gateworks.com>

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 <tharvey@gateworks.com>
---
 .../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",
-- 
1.9.1

  reply	other threads:[~2015-05-28 22:54 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-05-28 22:54 [PATCH 0/2] imx6: Implement external watchdog reset Tim Harvey
2015-05-28 22:54 ` Tim Harvey [this message]
2015-05-29 16:37   ` [PATCH 1/2] watchdog: imx2_wdt: add external reset support via 'ext-reset' dt property Lucas Stach
2015-05-28 22:54 ` [PATCH 2/2] ARM: dts: ventana: Add ext-reset support Tim Harvey
2015-05-29  6:17   ` Markus Pargmann
2015-05-29 14:01     ` Tim Harvey
2015-06-04 20:15 ` [PATCH v2 0/2] imx6: Implement external watchdog reset Tim Harvey
2015-06-04 20:15   ` [PATCH v2 1/2] watchdog: imx2_wdt: add external reset support via 'ext-reset-output' dt prop Tim Harvey
2015-06-05 16:38     ` Zhi Li
2015-06-25 23:22       ` Tim Harvey
2015-06-22  9:22     ` Lucas Stach
2015-06-28 15:07     ` Shawn Guo
2015-06-29  1:17     ` Shawn Guo
2015-07-02 16:49       ` Tim Harvey
2015-07-03  1:02         ` Shawn Guo
2015-07-28 15:27     ` [PATCH v3 0/2] imx6: Implement external watchdog reset Tim Harvey
2015-07-28 15:27       ` [PATCH v3 1/2] watchdog: imx2_wdt: add external reset support via 'ext-reset-output' dt prop Tim Harvey
2015-08-05 13:01         ` Shawn Guo
2015-10-13 14:11         ` Tim Harvey
2015-10-13 14:11           ` Tim Harvey
2015-07-28 15:27       ` [PATCH v3 2/2] ARM: dts: ventana: Add ext-reset support Tim Harvey
2015-10-30 17:00       ` [PATCH v3 0/2] imx6: Implement external watchdog reset Akshay Bhat
2015-10-30 17:31         ` Tim Harvey
2015-10-30 17:31           ` Tim Harvey
2015-06-04 20:16   ` [PATCH v2 2/2] ARM: dts: ventana: Add ext-reset support Tim Harvey

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1432853677-5150-2-git-send-email-tharvey@gateworks.com \
    --to=tharvey@gateworks.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.