Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755369AbbKDH5r (ORCPT ); Wed, 4 Nov 2015 02:57:47 -0500 Received: from mail-bn1bon0136.outbound.protection.outlook.com ([157.56.111.136]:7872 "EHLO na01-bn1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1754030AbbKDH5p (ORCPT ); Wed, 4 Nov 2015 02:57:45 -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: Wed, 4 Nov 2015 15:55:43 +0800 From: Robin Gong To: Guenter Roeck CC: , , , Subject: Re: [PATCH v2 2/2] watchdog: imx2_wdt: add set_pretimeout interface Message-ID: <20151104075542.GB10809@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> <20151103080447.GB15428@shlinux2> <5638EE38.80404@roeck-us.net> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Disposition: inline In-Reply-To: <5638EE38.80404@roeck-us.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-EOPAttributedMessage: 0 X-Microsoft-Exchange-Diagnostics: 1;BY2FFO11FD045;1:xmdZC8CrnVRKgx+3nkB0oBaZ4s2HHLLCJo2Mh8BNHqIjBklymiLOJCRUvFg8JDMupd89OsdPkl77a1V3IxZu92dbluOXJPFwkgvec3m3Fpq8sOqTZBHlcz2EzvXn0u3KV6RSsJ6L/N7leMtCIM4LcG7PM56FetcWoQZebjtwIPflZ74JA+t+CFNKLhpLOIvbe80K/qvze4QdF9XSrdr1ZxX6S289mDdxsaILFzVJrqt+EblvSGw0KlAwz4YzuE3cr3JX6siHycMB9j/Q9o5pxZ3ut3QhpmPdKeW0zWCMkjZ6xaAwZdEJh0h9+k7TPliGy2oYcnSEeLRiEcTojgE5r5EwKz8VxTws2V168zdnlLjhXTzkUpvj2GdOJdx1LdQy X-Forefront-Antispam-Report: CIP:192.88.168.50;CTRY:US;IPV:NLI;EFV:NLI;SFV:NSPM;SFS:(10019020)(6009001)(2980300002)(1109001)(1110001)(339900001)(24454002)(189002)(479174004)(199003)(52314003)(377454003)(110136002)(189998001)(15975445007)(33716001)(5001960100002)(11100500001)(92566002)(77096005)(4001350100001)(2950100001)(6806005)(97736004)(81156007)(33656002)(5008740100001)(50466002)(104016004)(19580395003)(105606002)(106466001)(83506001)(85426001)(87936001)(19580405001)(97756001)(93886004)(54356999)(46406003)(50986999)(23726002)(5007970100001)(47776003)(76176999)(42262002);DIR:OUT;SFP:1102;SCL:1;SRVR:CY1PR0301MB0682;H:tx30smr01.am.freescale.net;FPR:;SPF:Fail;PTR:InfoDomainNonexistent;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: 1;CY1PR0301MB0682;2:WNL8OOLi4VXS9m0AY4nknM5QFnVZIUOeBki5n7f7843Zl2NPCn7qGUKP0DqJJMvWMn43chonHLqPZTHNvYG8DXidjLs8qhEdTMQBE8qPPVTy3bYtZoIFVpGKcR3LdTyhLzCkjb7IF/rpna6qQxk+3xz02TOXquJlM5eE3XZpHIE=;3:q2ks0maogaw4DmjBLwWUtCG7kJbpIdstMDoKeBz6oF2Tuok3ejyhBhWQ+uZ5v7W+XQE39Xhx6FXDPfwgw6I6kAOW434Dcj0PyOGOn/A1PKQoilQbabusfBHbn7wESIUAB9eU2m7JujHziidhhv33Y/uCmpNVSTyfaIg7zv+dzggHD3sHPYT/22dv6ZDiyh0cQdX5MyHC0iPkjlKnG3c3e/37eDDYw0qSFcD3fXB54AVbNehU0eu+ob4MGks+WOxmTfP8jr6Obd0PgvbqqlHSKA==;25:PUBGET2GLyE6la5XEeyn/StoCa55U0zCK2LSV0q27PJ5dUbrNQ7rJTIUP2x1J7dlKbN9Vl+4EJ5F/QbREoYw5HIH23vh7T55szE3PN4otyCH76hxZV5i5h9L4yvdLCYlEFX7zhQa5U6YNxo80NaumfKFzd2ZoB1dK9EAF0Cgtjukj6x2DSNtwL1yf+eJCilX7mfvaQMsgdgQpuKzwnGMDh1ZB+PbRQHi5ZEsxN1Vw7Fuy2wpqMCac7Mbma03uqn7MokP04msKGQlvn96xH+Rbg== X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(42134001)(42139001);SRVR:CY1PR0301MB0682; X-Microsoft-Exchange-Diagnostics: 1;CY1PR0301MB0682;20:y9DsC44K+RSgiwGCseRWZqQHLhx7EI/1JjnF1Bhi4DNc1vnTcwhHgqbVn3nhzHn5vDQaNUrZfdQyleUuBuoc0U7CAU01SQaAzo42xkSyJejHkmlBFqBzeBefwSRbf8q8yWGahABub4bEicka5I1PvfhR1r2wO/4h8d6wT+4mxHhitcdrv7Fw+1sXzsPfnYctcXpgcotvu9zs+AWlavnh1LZAPC/uunpxoJVOzdm1uLbV3Xiz6esBJK3dC/q6zWLnckln2i1lesW6E0F5z3Wz2t4GjCtMoYNu0RaNk5XD8i7K1/yUAdWmJpAEioOqCuD3oG7TvK2kemZhe37P5jBKo2hdkT7NQMXeZMMVYz3uOi4=;4:AWToSqQu8JTmnzUP3Y3jzkJ2P42EyiYURn1bIoptJzeFoSDqY9XfoATj8/oe70v/7mOlSzU/OY22pHU3//UXcDexL0Hm4dU/rUnhGiO0sEKSVJwqGDtu/vfLrMU9OTwIL+ysLUDNsqPaIOmD/zdaLbECO5vd4ZE9tMBUAU45d4HnxS1a6+GZD00h/mL/XlRR/vN6e8Eyic9fj3VfwEtaU9c9ZeNlHOE8/KQGwrVD9/azMbjLylwwujSvsk3asKJ62xIYAigBEAbAKdWu4yBnV7OWdXD0MLnhVbR5udq0CfHbJA7zDCbYR3AmLi6WfoRlOGq9xS6fhtZnCtnGdYvIe88apJGaEYwq0zQF2vd5I0pjtjn2lxBZSwDPlM30K2Pq X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(101931422205132); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(601004)(2401047)(5005006)(520078)(8121501046)(3002001)(10201501046);SRVR:CY1PR0301MB0682;BCL:0;PCL:0;RULEID:;SRVR:CY1PR0301MB0682; X-Forefront-PRVS: 0750463DC9 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;CY1PR0301MB0682;23:M2wACXl6UDkfOmtWK+hJYBy/D5ymObL+mdh2hR7?= =?us-ascii?Q?S5L3y973uUyhzhhmSFGl0w7h1IN7cHP/E/6x6af8a/4qC5KTOXkxy92FxfVP?= =?us-ascii?Q?M51P3YTzP4iKhsJZcsAGufc3L48NZIghb2LY5wwxy9u9jD1G5CnrnDSMcKMF?= =?us-ascii?Q?D46aZHgDQhUOlP3M4jimCOq+F6EjPT3SIZjRQpLp97lp3wfX45U0X4SOBvyn?= =?us-ascii?Q?qQw/6eVKxvd5eGvbEWTbewn0ikyVA2X7Kx9eS66BTTMAMMCx/yyeTdB/yC20?= =?us-ascii?Q?OK7M0B6ePZ4WkMoM8Idbv938QgAphl5ay03lX5GlVT2GpkqxAoU3FG6hQDBm?= =?us-ascii?Q?jptxMUEtW1hmSrClkLe4DatSnh4pFCvARIJsyuji0dgo31oPAcwnr2rdbPoz?= =?us-ascii?Q?AQM0Pe4vOVyDsCbCuRJYLHBlU0ivNDJaKFxewhVAU2J9rOoXSyua2JxPsv+o?= =?us-ascii?Q?jP7Vk4FQ2p8+9G3JayzKzxduO65u80dt+AqmjqRKq1dWgbzdI9VTcvqMKFmY?= =?us-ascii?Q?7wFUSMHOoZQcgGxfejxgCoBlxJN0xGD5XTL48nc1XoIDR/AO1QnULf2vzPgz?= =?us-ascii?Q?FWfEJXDa+HljjxegTGmrtFdetCIpUkxrFLw5byGPPAkzKsfDCCw+ndYOs6ZM?= =?us-ascii?Q?7gcmHz09UB408U/JYCDGiRVg1ceXO7+3VYDEXH62jPHAOtj0lalQQwPvZKcU?= =?us-ascii?Q?nH0cpbrMmnxx74VySYr9IuVzZNgrkDbb0JkhT5OugfiIuCgK5YCFeJGM98MJ?= =?us-ascii?Q?m4g+H6GNMDWkbm07vF4PjRmsk90YNE4f5kX6UZaY/Wy0/mCfXEz9yLkDED9c?= =?us-ascii?Q?PVDqrCdFexD134i/zZRod7VpIncGln6TOGP8ZXHUdXbN6Ywkt4Pt2JnMYwye?= =?us-ascii?Q?B9KZyhK6usOfxCwVB3KpeXBkRhInh6Y18IAhBq/8MircGeI+vc0hvtP+XE5y?= =?us-ascii?Q?SrgTmoZei/XTfEThX0r7MeT8hb2mhKtv9WTgxCWKYg96xwzRPZuD42Jz1OWe?= =?us-ascii?Q?API5AoqaP5Dl+8O9GPwbFTn7/pK8Q+xO6pbFGTsZ9i5Bbs19JH998CQjKI3N?= =?us-ascii?Q?3LcGJ48T2Z2eX7By35WB4y+ElWs8uwjMqyihfDdiWCRiQ0v+l/u+CuOSHGWB?= =?us-ascii?Q?YqiUqtJwzGCbNuReAPL60VoFi4MjqGK39x2H1PfyYc94x3A9H2fY3bcUvB5e?= =?us-ascii?Q?t+sE1lg01Rxhk9tM6awUNVHikIi6CDDs5kw6j?= X-Microsoft-Exchange-Diagnostics: 1;CY1PR0301MB0682;5:H1pDgBC17p2AP7myeFiK8blOO2guk4Bpu5hGFR11KfUPgp25L6TzECoVAYPX0AoJhnCb1d0EqAfvAqeKRDx20aofaOMmoo8icn6yDsvk/MuyzGhsZbwsNkKjwN+r2HkeXUllXQe/POQTizvxkpLgWw==;24:xPel7iRyzdO7TzlcHRvuO7iTWZqxMG1Y3DviS+OWi779ZJVpGoGmAz9sI8W906Zw0fmqS9XzETWZ13AGHPKfOZ8QVx0p7rkrGH2tH8EnMU4=;20:hQX/9962qDYDLq6M3o16mtf2MviLPIt2clp0wqTBg0zeVAQVYkpBqtCURuQQTkJ+OR+LGeyjzKuBGvZ8YH7NDg== SpamDiagnosticOutput: 1:23 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: freescale.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 04 Nov 2015 07:57:41.4327 (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: CY1PR0301MB0682 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 6207 Lines: 166 On Tue, Nov 03, 2015 at 09:26:16AM -0800, Guenter Roeck wrote: > On 11/03/2015 12:04 AM, Robin Gong wrote: > >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. > > We are dealing with infrastructure code here. This happens to work for your driver, > but that doesn't mean it will work for other drivers. > > Anyway, I recalled that there is another patchset pending to add pretimeout > support into the watchdog code. I'll have to dig that out and consolidate the two. > > Guenter > Got it. Thanks. > >>>+ > >>>+ 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-watchdog" in > >the body of a message to majordomo@vger.kernel.org > >More majordomo info at http://vger.kernel.org/majordomo-info.html > > > -- 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/