Received: by 2002:a05:6a10:a841:0:0:0:0 with SMTP id d1csp282768pxy; Wed, 21 Apr 2021 02:56:14 -0700 (PDT) X-Google-Smtp-Source: ABdhPJz7kAN6f9ZDX2Jbxq4z0NHINU/5M9RKhtnw0/dYQZLumj8x6afOq2nqGWM9qD8oLRD+AAPC X-Received: by 2002:a17:906:ca45:: with SMTP id jx5mr32331362ejb.417.1618998974040; Wed, 21 Apr 2021 02:56:14 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1618998974; cv=none; d=google.com; s=arc-20160816; b=WyxTIlZ/xr4U0atl9W9ymebHqsTKqaU2o5ho3cRGq7KWU7XaQ1dvyD2x6AB2XM9W6O IgPN40qI65A7J7an96r+LRmkD2U3h4yUFY+7tSzA15GQj+VPnWexn4NMLCvtL/nGBRYP FEx3PT0VKHGZXZ1KF3r45zHwc/zI5ChVCjlBgOipY5bgQCxbcsfKGCXl4NwyQsFEtioJ P7ZuGUkDi9T5nt/55xn4hC7flU2oW8fuA3yQQGvR0O/GF3ffbA+1JSA7jHW4ftmVe+Pr kXtdhuifFBhZrznUSzFzshMTe4UvYfzQY05fc24ua3xzBiNQxUvACdrVKM+ni51ToKbN mxFw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:message-id:date:subject:cc:to:from; bh=i1Pmk3QjT5A2d7WiKTC9GTH9MuhVEyzNXz/X3m2gX48=; b=WbjwNFUsWvHsj1fIHkCU7nRMpIqCspCJ3UA3BUsd3P3LICrDTxXbM3tA+RAxK1Bsn0 agfVaySuYQPQea+xPALEVfhMrE0j5EweJBR57JmQb+OmrAcxmTyd6cuZU/VP1H+jzVxe bvwpsHMJwLZc/Qlg+Cm7sQiwOd09Lw+5rkqhNJNN7yv56zs0kYF/+f5mfSEHYTC4ZCz2 ShKUNYcU9CH98RLzjgYiJ05Ulw/3Kqf8Ec0yd+NiNzof662BGzknPrtP3izD42ClhdXS ns9G8NF9NvgqlT8gDAzv3ig3B1FS9R7AAL5ihA1gGQSUgViI79kSwRjXwkApPGLkkk+G /0Gw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=vivo.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id gz5si1420850ejc.532.2021.04.21.02.55.50; Wed, 21 Apr 2021 02:56:14 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=vivo.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234247AbhDUIFt (ORCPT + 99 others); Wed, 21 Apr 2021 04:05:49 -0400 Received: from mail-m121145.qiye.163.com ([115.236.121.145]:24048 "EHLO mail-m121145.qiye.163.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234116AbhDUIFs (ORCPT ); Wed, 21 Apr 2021 04:05:48 -0400 Received: from vivo-HP-ProDesk-680-G4-PCI-MT.vivo.xyz (unknown [58.251.74.232]) by mail-m121145.qiye.163.com (Hmail) with ESMTPA id 90E7D8003C6; Wed, 21 Apr 2021 16:05:12 +0800 (CST) From: Wang Qing To: Wim Van Sebroeck , Guenter Roeck , Matthias Brugger , linux-watchdog@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-mediatek@lists.infradead.org, linux-kernel@vger.kernel.org Cc: Wang Qing Subject: [PATCH V5] watchdog: mtk: support dual mode when the bark irq is available Date: Wed, 21 Apr 2021 16:05:04 +0800 Message-Id: <1618992304-18903-1-git-send-email-wangqing@vivo.com> X-Mailer: git-send-email 2.7.4 X-HM-Spam-Status: e1kfGhgUHx5ZQUtXWQgYFAkeWUFZS1VLWVdZKFlBSE83V1ktWUFJV1kPCR oVCBIfWUFZQkkaS1ZMSUNKTU1DQ01LHh5VEwETFhoSFyQUDg9ZV1kWGg8SFR0UWUFZT0tIVUpKS0 hKTFVLWQY+ X-HM-Sender-Digest: e1kMHhlZQR0aFwgeV1kSHx4VD1lBWUc6NEk6MRw6TT8SMAgjPEMLTh8S MBkKFBlVSlVKTUpDQkJJSEpISENCVTMWGhIXVQwaFRwKEhUcOw0SDRRVGBQWRVlXWRILWUFZTkNV SU5KVUxPVUlISVlXWQgBWUFPQ05MNwY+ X-HM-Tid: 0a78f376321db03akuuu90e7d8003c6 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Support using irq handling wdt bark first instead of directly resetting. When the watchdog timer expires in dual mode, an interrupt will be triggered first, then the timing restarts. The reset signal will be initiated when the timer expires again. The dual mode is disabled by default. V2: - panic() by default if WATCHDOG_PRETIMEOUT_GOV is not enabled. V3: - Modify the pretimeout behavior, manually reset after the pretimeout - is processed and wait until timeout. V4: - Remove pretimeout related processing. - Add dual mode control separately. V5: - Fix some formatting and printing problems. Signed-off-by: Wang Qing --- drivers/watchdog/mtk_wdt.c | 36 ++++++++++++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/drivers/watchdog/mtk_wdt.c b/drivers/watchdog/mtk_wdt.c index 97ca993..40122f8 --- a/drivers/watchdog/mtk_wdt.c +++ b/drivers/watchdog/mtk_wdt.c @@ -25,6 +25,7 @@ #include #include #include +#include #define WDT_MAX_TIMEOUT 31 #define WDT_MIN_TIMEOUT 1 @@ -57,6 +58,7 @@ static bool nowayout = WATCHDOG_NOWAYOUT; static unsigned int timeout; +static bool dual_mode; struct mtk_wdt_dev { struct watchdog_device wdt_dev; @@ -239,13 +241,23 @@ static int mtk_wdt_start(struct watchdog_device *wdt_dev) return ret; reg = ioread32(wdt_base + WDT_MODE); - reg &= ~(WDT_MODE_IRQ_EN | WDT_MODE_DUAL_EN); + if (dual_mode) + reg |= (WDT_MODE_IRQ_EN | WDT_MODE_DUAL_EN); + else + reg &= ~(WDT_MODE_IRQ_EN | WDT_MODE_DUAL_EN); reg |= (WDT_MODE_EN | WDT_MODE_KEY); iowrite32(reg, wdt_base + WDT_MODE); return 0; } +static irqreturn_t mtk_wdt_isr(int irq, void *arg) +{ + panic("wdt bark!\n"); + + return IRQ_HANDLED; +} + static const struct watchdog_info mtk_wdt_info = { .identity = DRV_NAME, .options = WDIOF_SETTIMEOUT | @@ -267,7 +279,7 @@ static int mtk_wdt_probe(struct platform_device *pdev) struct device *dev = &pdev->dev; struct mtk_wdt_dev *mtk_wdt; const struct mtk_wdt_data *wdt_data; - int err; + int err, irq; mtk_wdt = devm_kzalloc(dev, sizeof(*mtk_wdt), GFP_KERNEL); if (!mtk_wdt) @@ -279,6 +291,19 @@ static int mtk_wdt_probe(struct platform_device *pdev) if (IS_ERR(mtk_wdt->wdt_base)) return PTR_ERR(mtk_wdt->wdt_base); + if (dual_mode) { + irq = platform_get_irq(pdev, 0); + if (irq > 0) { + err = devm_request_irq(&pdev->dev, irq, mtk_wdt_isr, 0, "wdt_bark", + &mtk_wdt->wdt_dev); + if (err) + return err; + } else { + dual_mode = 0; + dev_info(&pdev->dev, "couldn't get wdt irq, set dual_mode = 0\n"); + } + } + mtk_wdt->wdt_dev.info = &mtk_wdt_info; mtk_wdt->wdt_dev.ops = &mtk_wdt_ops; mtk_wdt->wdt_dev.timeout = WDT_MAX_TIMEOUT; @@ -299,8 +324,8 @@ static int mtk_wdt_probe(struct platform_device *pdev) if (unlikely(err)) return err; - dev_info(dev, "Watchdog enabled (timeout=%d sec, nowayout=%d)\n", - mtk_wdt->wdt_dev.timeout, nowayout); + dev_info(dev, "Watchdog enabled (timeout=%d sec, nowayout=%d, + dual_mode=%d)\n", mtk_wdt->wdt_dev.timeout, nowayout, dual_mode); wdt_data = of_device_get_match_data(dev); if (wdt_data) { @@ -368,6 +393,9 @@ module_param(nowayout, bool, 0); MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=" __MODULE_STRING(WATCHDOG_NOWAYOUT) ")"); +module_param(dual_mode, bool, 0); +MODULE_PARM_DESC(dual_mode, "Dual mode triggers irq before reset (default=0)"); + MODULE_LICENSE("GPL"); MODULE_AUTHOR("Matthias Brugger "); MODULE_DESCRIPTION("Mediatek WatchDog Timer Driver"); -- 2.7.4