Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753266AbbKCIGr (ORCPT ); Tue, 3 Nov 2015 03:06:47 -0500 Received: from mail-bl2on0138.outbound.protection.outlook.com ([65.55.169.138]:6272 "EHLO na01-bl2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752306AbbKCIGo (ORCPT ); Tue, 3 Nov 2015 03:06:44 -0500 Authentication-Results: spf=fail (sender IP is 192.88.168.50) smtp.mailfrom=freescale.com; lists.infradead.org; dkim=none (message not signed) header.d=none;lists.infradead.org; dmarc=none action=none header.from=freescale.com; Date: Tue, 3 Nov 2015 16:04:48 +0800 From: Robin Gong To: Guenter Roeck CC: , , , Subject: Re: [PATCH v2 2/2] watchdog: imx2_wdt: add set_pretimeout interface Message-ID: <20151103080447.GB15428@shlinux2> References: <1446531084-15365-1-git-send-email-b38343@freescale.com> <1446531084-15365-2-git-send-email-b38343@freescale.com> <563866CD.1080306@roeck-us.net> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Disposition: inline In-Reply-To: <563866CD.1080306@roeck-us.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-EOPAttributedMessage: 0 X-Microsoft-Exchange-Diagnostics: 1;BL2FFO11FD026;1:krZu0tZWl7+h4WYwtNusOqMKLXXDCa/l7sEfydAJZXhiLy76wiqAB7LcbJs5PP9rosqbgDzq0IE4piuZ/hnORQ9zqK14lP/8gOK3k0wRuoLGvZ6XhXu/goNTS1j9biKb6z0et3bxDzAazdAKhy6TNh1PMet3CdTsJgTYygOx2BHsgx/1DPX6aTo9R4eW3bq2gDdeEOgAQZgY6QGS7/Yub57GO0+ruOt8XEl7i962dEZCUgASswpkq87uVDOoz9TeJQWiftmYL+EZrWQHgKxOcqxgBJ9DDPs9LnBG4GgOMfr3la4yoH1mKBx04cQQK4SkBGipvdbkAdZoxlaTSLRU4aYq+paY5tGgozbBUscbHoygikBKhqfFKkL//XoiSo0w X-Forefront-Antispam-Report: CIP:192.88.168.50;CTRY:US;IPV:NLI;EFV:NLI;SFV:NSPM;SFS:(10019020)(6009001)(2980300002)(1109001)(1110001)(339900001)(377454003)(189002)(24454002)(479174004)(199003)(5008740100001)(54356999)(104016004)(81156007)(4001350100001)(97736004)(5001960100002)(2950100001)(77096005)(33716001)(110136002)(85426001)(50466002)(87936001)(92566002)(47776003)(11100500001)(105606002)(189998001)(19580395003)(83506001)(23726002)(6806005)(106466001)(50986999)(76176999)(46406003)(33656002)(19580405001)(97756001)(5007970100001)(42262002);DIR:OUT;SFP:1102;SCL:1;SRVR:BLUPR03MB082;H:tx30smr01.am.freescale.net;FPR:;SPF:Fail;PTR:InfoDomainNonexistent;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: 1;BLUPR03MB082;2:osok50U+3nAukfIA1wQ0DKUXLAO3wS+NLCmOv1grhmMBN+6dnWzLTGzJZPikQsrzZNgAfxkxU2XwC6yi35Zrk3a2aPH3uULZuRS992bo7n8KWOy400W372dIwq/ktqvuo1nAPA++RBzk0yZSVpkpKsfK1aAmxiAM2inTtlH44aQ=;3:aa8T8mt4Nqaq41UGUWfZ81EtqRBZyE7I3TpT+UBY2dLCMTV3yyj/nJnEiSrfhQB61kgCpqh+b9ZefgrONzeQvuWGuJkv/jw4vdCHj6XIss6e+Mwt0JmOO5ViGPvtAkSI8LgLiGaLBAIW1mvusLjhQEZ3039heu84vz+HTRCpGngOLY0D9aeVvWKFjKbbrKuS3BNnC2WOwQcV7Mvp0QxbeL8PUVcAuvfJ+hR8NEp+8J4=;25:Jjl9mitieTc3q0s8Se+b/gzYQfVtRVTg0TwtW3lMNlj7Eg9hzVDnIhJCoWsPVaLJc+2cNwZ6iHs69QxjbDDcjSAnQer13mNcLZZG6IGLS6VfaXX2jvcSa4LkVmtfAkDfynE8NDBXJQDCx9kWlehon+xAB7U4LNZMyPlnvyy7mL+DCgPmyeqlthU48vi8c1DxzcCfB/a5IXFNpcw594pvRJMlTjpCTCD/jtxBY6QNdw1lVUFjcqLMyMYOTvhNZLlNpZaVCB/GvPGDuBLH9Nuaug== X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BLUPR03MB082; X-Microsoft-Exchange-Diagnostics: 1;BLUPR03MB082;20:bSm3EkotkXQN2CdGMRH+d17onnC6lQy7O1e/5jRVdE3URdtJ/nwv4r0IF/h0VmkRksEfa6bwtvp1yNJdicrf2rO59rk8Z+KA+YeAUX+m4GTHF3oSuAcklCMlZ2rocexrawefsJ8AEzeixgB0Pge5z48mmitLKCNzgPZqJuBI1fNZsjfgG6Ng3JfYplXLdSNyfaBynIRmmRKeu/HIncIZriO5Z89UtqScPWeBEDkkvSPLyJZv0DYkz0sNUxizGQ2DJZefScRN+ZY71Rs6/l2j8avFxRRkOS8OKaR1llj7tNKbbBsm9eQJpFWefDTF68v9WkprjXqxI8Yt1t1/GugWXMcVTKxwK+zhtYfhUlu2Ve4=;4:1mNVVwcl1sg1AXLJHeu3u/tu63nTXTil3X4gG744swwBExJ6x9W6Djmm600Jdd+sMfKWhWnJQR94HOV7UgrIRdCro/Vj3SmFwn+6w31MxfssILdga61jmvaIqms4/ZLs+wnsjjelc35WDuQ/RC/18NUzsfkgQpf8oa804i3MyNmTPJp+S3WL1k/cx8W5fc5/OsAxz2PEOpIQJejrIxNak9dKIxl233MWkHrebevDpqH/DJ4SK0w6/rC93Rk+BuapCOOTDeR1c+GN7cForVAfnZvIdXdABKYuQ5r77D/lBTAIFg+AvPuKeDodhOnY8quPABLHvkWcDgsHAz76QL6YkRFgNPGhRqv8YjMtmzDJreZzEwYhrWKlkX40unzcNcZ5 X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(101931422205132); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(601004)(2401047)(520078)(5005006)(8121501046)(3002001)(10201501046);SRVR:BLUPR03MB082;BCL:0;PCL:0;RULEID:;SRVR:BLUPR03MB082; X-Forefront-PRVS: 0749DC2CE6 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;BLUPR03MB082;23:oM0wrZhXgw7VJZzBjiE64R/o41YRghRud80nuQg0ue?= =?us-ascii?Q?DXHvoRzrdmOmC6lWvpPoPWdW8kG838dVAb360Cn2mIiPqd7eHE9eVg43e7Ce?= =?us-ascii?Q?Hayk/WWMNCOLoKRxcJduk/uy0CZwZr0i71O7yA8xymozdBc2n16f15QJj9Vx?= =?us-ascii?Q?CE6cIiWS6D+9e+DtFHRWNTmLvw3eHnD0ouh/ROP98ZFqIkYNQb1cK0Ed4DMT?= =?us-ascii?Q?234+iRvpmLOM+cGknn0bw4JWUYgtVqjr1W+RdXeBmPmVcbeqPKPQUF2XjaG1?= =?us-ascii?Q?mMcLE/STPMiYocrINCTEIBJxE3eSKvFH4jTdpPLDMeOM39DBeS2h1kjnJobl?= =?us-ascii?Q?QriIMjK3QKD2n7VG7zIoYw37mOCd+49an1HpRbXNvcQ2uN1A+9FhSRkkRMCM?= =?us-ascii?Q?hBx4aIzmSM5Qxsuxn3IUPsahaCvQ892fJaAqQ2zLBZJC0DrInr6KM95oUAND?= =?us-ascii?Q?0C4NAkWs59aStaiZJcXf1HzSuaKUSsAnB7jDXJ3LSzstHCcDj2YT9UMhFyrR?= =?us-ascii?Q?nPSNcSL+KWYkxgDH2yhMKG1aMmXGgZbz/WeWeyBWL2K0B1Qy3b4p6td17V8w?= =?us-ascii?Q?q5cN+77YTkgg1AyO0JwGMrQrTHlLmM3nFxdPVUq6KQveYNShxAYlEv5iTA4J?= =?us-ascii?Q?qcAhYN3aT1srpn3DYq6JSBxC8Jg9HAQjMwybVpZnOqsryMFIVMVgScOOH3iV?= =?us-ascii?Q?yYsqkjgHsJVsuDuXxttCEq4zMyneJe6K3BHEN+AP6z1fyI7xoSynFmVqoShi?= =?us-ascii?Q?7uoSrnjFT6RhXznPs/0ekugkWhxZNHD0ROxZDwKqq8on5xAGKFkDs0QRFsne?= =?us-ascii?Q?IDDgZuO2hzZXk3dkeMsFXEgdNaDj3mDz8+CfcLFzenVmWEbqURuvqlYhDBON?= =?us-ascii?Q?JZgOEznegN5ylKjzmQp1B5k/QeuzmWTGY+ApdRDy+AusYqUhKPCjijLeklph?= =?us-ascii?Q?0A0UsM6ZBoNj1ea9vsFjqcXmhwMllWdAYSBu6MK70WAPTjYWwZMho7kP8zbs?= =?us-ascii?Q?yPgParsGvHtdhIHbjUeViwLsx3pfbUWXUjTn/oEVS/fG53ZPqpsX5rCcEdvr?= =?us-ascii?Q?qN/r6/isF4zyC9mNZ7scVI9cRUgA6EP2q8Po9dmLLJIeOiMwpbWhPGj5P4hR?= =?us-ascii?Q?h0h/vSILv5kfi7yuNwOJRxrNnqdvPE?= X-Microsoft-Exchange-Diagnostics: 1;BLUPR03MB082;5:O0XPCzlSz3FqVQo2my5JLff30pUJSPkBwF4gV3/Y2QJ6zU/qfnjxlbeIvOdHY+G5PHyc36odl3ezzEBA7mC/SdpeQHlZlsfneyGa/9RH+fbCw54/3rB9VF1Etc5qm15cWmvSUXdL/ykU0U1TIyGvXg==;24:haL77yXfwOGuWSowdwkXElDAFlRKZr1lee4NwI1FKPoFu39vjq8UMpzG2KEL1SV5KXcigi2MkR5ZD7P2M+V5VBIT8MW4L+f+vDxoigF4DBk=;20:WXsuWR5EC5p33EQVD50zBtkU2ygzNUz3wcA3jnXpb3V0moSNy965nP154xkt29GIFLouyzoErMZLVXYCbmpRwQ== SpamDiagnosticOutput: 1:23 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: freescale.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 03 Nov 2015 08:06:42.0790 (UTC) X-MS-Exchange-CrossTenant-Id: 710a03f5-10f6-4d38-9ff4-a80b81da590d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=710a03f5-10f6-4d38-9ff4-a80b81da590d;Ip=[192.88.168.50];Helo=[tx30smr01.am.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BLUPR03MB082 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 5250 Lines: 148 On Mon, Nov 02, 2015 at 11:48:29PM -0800, Guenter Roeck wrote: > On 11/02/2015 10:11 PM, Robin Gong wrote: > >Enable set_pretimeout interface and trigger the pretimeout interrupt before > >watchdog timeout event happen. > > > >Signed-off-by: Robin Gong > >--- > > drivers/watchdog/imx2_wdt.c | 58 ++++++++++++++++++++++++++++++++++++++++++++- > > 1 file changed, 57 insertions(+), 1 deletion(-) > > > >diff --git a/drivers/watchdog/imx2_wdt.c b/drivers/watchdog/imx2_wdt.c > >index 0bb1a1d..bd42857 100644 > >--- a/drivers/watchdog/imx2_wdt.c > >+++ b/drivers/watchdog/imx2_wdt.c > >@@ -24,6 +24,7 @@ > > #include > > #include > > #include > >+#include > > #include > > #include > > #include > >@@ -52,12 +53,18 @@ > > #define IMX2_WDT_WRSR 0x04 /* Reset Status Register */ > > #define IMX2_WDT_WRSR_TOUT (1 << 1) /* -> Reset due to Timeout */ > > > >+#define IMX2_WDT_WICR 0x06 /*Interrupt Control Register*/ > >+#define IMX2_WDT_WICR_WIE (1 << 15) /* -> Interrupt Enable */ > >+#define IMX2_WDT_WICR_WTIS (1 << 14) /* -> Interrupt Status */ > >+#define IMX2_WDT_WICR_WICT (0xFF) /* Watchdog Interrupt Timeout */ > > Unnecessary ( ) > > >+ > > #define IMX2_WDT_WMCR 0x08 /* Misc Register */ > > > > #define IMX2_WDT_MAX_TIME 128 > > #define IMX2_WDT_DEFAULT_TIME 60 /* in seconds */ > > > > #define WDOG_SEC_TO_COUNT(s) ((s * 2 - 1) << 8) > >+#define WDOG_SEC_TO_PRECOUNT(s) ((s) * 2) /* set WDOG pre timeout count*/ > > > > struct imx2_wdt_device { > > struct clk *clk; > >@@ -80,7 +87,8 @@ MODULE_PARM_DESC(timeout, "Watchdog timeout in seconds (default=" > > > > static const struct watchdog_info imx2_wdt_info = { > > .identity = "imx2+ watchdog", > >- .options = WDIOF_KEEPALIVEPING | WDIOF_SETTIMEOUT | WDIOF_MAGICCLOSE, > >+ .options = WDIOF_KEEPALIVEPING | WDIOF_SETTIMEOUT | WDIOF_MAGICCLOSE > >+ | WDIOF_PRETIMEOUT, > > }; > > > > static int imx2_restart_handler(struct notifier_block *this, unsigned long mode, > >@@ -207,12 +215,49 @@ static inline void imx2_wdt_ping_if_active(struct watchdog_device *wdog) > > } > > } > > > >+static int imx2_wdt_set_pretimeout(struct watchdog_device *wdog, > >+ unsigned int new_timeout) > >+{ > >+ struct imx2_wdt_device *wdev = watchdog_get_drvdata(wdog); > >+ u32 val; > >+ > >+ regmap_read(wdev->regmap, IMX2_WDT_WICR, &val); > >+ /* set the new pre-timeout value in the WSR */ > >+ val &= ~IMX2_WDT_WICR_WICT; > >+ val |= WDOG_SEC_TO_PRECOUNT(new_timeout); > > Looking into this, I think we need more information in the first patch. > Specifically, we need a value for max_pretimeout and validate it > (new_timeout must be smaller than 128 to avoid overflows, independent > of the maximum timeout). > I think it's enough, since there is "t >= wdd->timeout" in watchdog_pretimeout_invalid() of the first patch and wdd->timeout is never bigger than wdd->max_timeout which setting in imx2_wdt.c as 128. > >+ > >+ regmap_write(wdev->regmap, IMX2_WDT_WICR, val | IMX2_WDT_WICR_WIE); > >+ > >+ wdog->pretimeout = new_timeout; > >+ > >+ return 0; > >+} > >+ > >+static irqreturn_t imx2_wdt_isr(int irq, void *dev_id) > >+{ > >+ struct platform_device *pdev = dev_id; > >+ struct watchdog_device *wdog = platform_get_drvdata(pdev); > >+ struct imx2_wdt_device *wdev = watchdog_get_drvdata(wdog); > >+ u32 val; > >+ > >+ regmap_read(wdev->regmap, IMX2_WDT_WICR, &val); > >+ if (val & IMX2_WDT_WICR_WTIS) { > >+ /*clear interrupt status bit*/ > >+ regmap_write(wdev->regmap, IMX2_WDT_WICR, val); > >+ panic("pre-timeout:%d, %d Seconds remained\n", wdog->pretimeout, > > "seconds" - no capital 'S'. > > >+ wdog->timeout - wdog->pretimeout); > >+ } > >+ > >+ return IRQ_HANDLED; > >+} > >+ > > static const struct watchdog_ops imx2_wdt_ops = { > > .owner = THIS_MODULE, > > .start = imx2_wdt_start, > > .stop = imx2_wdt_stop, > > .ping = imx2_wdt_ping, > > .set_timeout = imx2_wdt_set_timeout, > >+ .set_pretimeout = imx2_wdt_set_pretimeout, > > }; > > > > static const struct regmap_config imx2_wdt_regmap_config = { > >@@ -229,6 +274,7 @@ static int __init imx2_wdt_probe(struct platform_device *pdev) > > struct resource *res; > > void __iomem *base; > > int ret; > >+ int irq; > > u32 val; > > > > wdev = devm_kzalloc(&pdev->dev, sizeof(*wdev), GFP_KERNEL); > >@@ -294,6 +340,16 @@ static int __init imx2_wdt_probe(struct platform_device *pdev) > > goto disable_clk; > > } > > > >+ irq = platform_get_irq(pdev, 0); > >+ if (irq > 0) { > >+ ret = devm_request_irq(&pdev->dev, irq, imx2_wdt_isr, 0, > >+ dev_name(&pdev->dev), pdev); > >+ if (ret) { > >+ dev_err(&pdev->dev, "can't get irq %d\n", irq); > >+ goto disable_clk; > >+ } > >+ } > >+ > > wdev->restart_handler.notifier_call = imx2_restart_handler; > > wdev->restart_handler.priority = 128; > > ret = register_restart_handler(&wdev->restart_handler); > > > -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/