Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754942AbeAJMN2 (ORCPT + 1 other); Wed, 10 Jan 2018 07:13:28 -0500 Received: from mail-wm0-f67.google.com ([74.125.82.67]:42379 "EHLO mail-wm0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753093AbeAJMN0 (ORCPT ); Wed, 10 Jan 2018 07:13:26 -0500 X-Google-Smtp-Source: ACJfBou0S7lBYo7Of/suRVjKui5u1OArEgpaoX9FqMTDQq+sZiXaA1m93t/gS0C+yhMo8rbeuhKWMQ== From: =?UTF-8?q?Andr=C3=A9=20Draszik?= To: linux-kernel@vger.kernel.org Cc: Wim Van Sebroeck , Guenter Roeck , linux-watchdog@vger.kernel.org, John Crispin Subject: [PATCH 1/2] watchdog: mt7621: Set WDOG_HW_RUNNING, when watchdog is already running. Date: Wed, 10 Jan 2018 12:13:22 +0000 Message-Id: <20180110121323.17657-1-git@andred.net> X-Mailer: git-send-email 2.15.1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Return-Path: This patch uses the new flag WDOG_HW_RUNNING in driver. According to the definition of this flag, it should be set if the watchdog hardware is enabled/running during boot before being opened here, e.g. due to a boot loader configuring the watchdog. Given the watchdog driver core doesn't know what timeout was originally set by whoever started the watchdog (boot loader), we make sure to update the timeout in the hardware according to what the watchdog core thinks it is. Signed-off-by: André Draszik Cc: Wim Van Sebroeck Cc: Guenter Roeck Cc: linux-watchdog@vger.kernel.org Cc: John Crispin --- drivers/watchdog/mt7621_wdt.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/drivers/watchdog/mt7621_wdt.c b/drivers/watchdog/mt7621_wdt.c index db38f8017218..0eabea2d88a2 100644 --- a/drivers/watchdog/mt7621_wdt.c +++ b/drivers/watchdog/mt7621_wdt.c @@ -105,6 +105,11 @@ static int mt7621_wdt_bootcause(void) return 0; } +static int mt7621_wdt_is_running(struct watchdog_device *w) +{ + return !!(rt_wdt_r32(TIMER_REG_TMR1CTL) & TMR1CTL_ENABLE); +} + static const struct watchdog_info mt7621_wdt_info = { .identity = "Mediatek Watchdog", .options = WDIOF_SETTIMEOUT | WDIOF_KEEPALIVEPING | WDIOF_MAGICCLOSE, @@ -144,6 +149,17 @@ static int mt7621_wdt_probe(struct platform_device *pdev) watchdog_init_timeout(&mt7621_wdt_dev, mt7621_wdt_dev.max_timeout, &pdev->dev); watchdog_set_nowayout(&mt7621_wdt_dev, nowayout); + if (mt7621_wdt_is_running(&mt7621_wdt_dev)) { + /* Make sure to apply timeout from wathdog_core, taking + the prescaler of this driver here into account (the + boot loader might be using a different prescaler). + To avoid spurious resets because of different scaling, + we first disable the watchdog, set the new prescaler + and timeout, and then re-enable the watchdog. */ + mt7621_wdt_stop(&mt7621_wdt_dev); + mt7621_wdt_start(&mt7621_wdt_dev); + set_bit(WDOG_HW_RUNNING, &mt7621_wdt_dev.status); + } ret = watchdog_register_device(&mt7621_wdt_dev); -- 2.15.1