Received: by 10.223.185.116 with SMTP id b49csp2217249wrg; Thu, 15 Feb 2018 08:15:18 -0800 (PST) X-Google-Smtp-Source: AH8x224GfpxKNOZjK4x1/ClL6EsPE6gqmfR9iW437EHWlCOPw0O4Eln0+J5B6pPCjkzwNLVoH8/m X-Received: by 10.98.86.131 with SMTP id h3mr3123288pfj.208.1518711318528; Thu, 15 Feb 2018 08:15:18 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1518711318; cv=none; d=google.com; s=arc-20160816; b=LkkWBX67nZkzuAo0IFrgftPsxYOqIAc2NGkSmgux+D2yGHPIXqKPTCn80aBH4plXFS 8T7YDztSt6FO6gQju3hoToUiVvkvfGaoENKUOkSTfzTG2tZOuBFJsu1MVempY1wCalsx 19sobe+PGt9WDwdy3zyXh8UlIe2WGMijfzAm9FLMfCjEil+p9z7XASEbjLy+gd+K4dP7 9KBMGOpm+gtfPcH0rIlqap3fgOghYaQrbIeQMLbS2P25Q7H/J4/CMeLgrX4BfaX+BGgS qJwg61B2L9yiqL5WqXa9BSuDxHdOVPxYy0777SiK9UIKl3tveTq8ci8gPM7sXa2V+5lH G4ug== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:user-agent:references :in-reply-to:message-id:date:subject:cc:to:from :arc-authentication-results; bh=/rbA6UqYK5VFLAHauV+ImutjQVroXz5q1WIOurcYhOU=; b=cojPL+Qzu5uP+5hsTsJq1ppDgu6JlKtibLYkr6SGO4xQpGwss0DYOU4BdbDSzQJnCV P7ip7LyJyeFU008a87nB8IXDjA+4SviT0sERdfG/HOb8Rik+XVzdZrGprNZsVOPnmBAh jwZh6jxYu2HvUV9QbSAR7bVLe7FLPsefMuSUFjVFwvsITDBSrjplm2AJLUbO+oXWlDB6 aysJi2H/B8BjU4aH5eIFSufsMZSgu5k5bWJ+GkpTO9HCiuek3JgfgQI9mbGaRiB170Aa LfqAkUm9P8fURAq3tzyHzn0S7vkPdAKcB/7nAwyxyVUTueaSFIdie21v9xHosLISxlXm xNhg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id q127si2440813pgq.309.2018.02.15.08.15.03; Thu, 15 Feb 2018 08:15:18 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1425642AbeBOQNX (ORCPT + 99 others); Thu, 15 Feb 2018 11:13:23 -0500 Received: from mail.linuxfoundation.org ([140.211.169.12]:34788 "EHLO mail.linuxfoundation.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1424375AbeBOPpC (ORCPT ); Thu, 15 Feb 2018 10:45:02 -0500 Received: from localhost (LFbn-1-12258-90.w90-92.abo.wanadoo.fr [90.92.71.90]) by mail.linuxfoundation.org (Postfix) with ESMTPSA id 71A5911B5; Thu, 15 Feb 2018 15:45:01 +0000 (UTC) From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Martin Kaiser , Guenter Roeck , Wim Van Sebroeck Subject: [PATCH 4.15 141/202] watchdog: imx2_wdt: restore previous timeout after suspend+resume Date: Thu, 15 Feb 2018 16:17:21 +0100 Message-Id: <20180215151720.454617405@linuxfoundation.org> X-Mailer: git-send-email 2.16.1 In-Reply-To: <20180215151712.768794354@linuxfoundation.org> References: <20180215151712.768794354@linuxfoundation.org> User-Agent: quilt/0.65 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 4.15-stable review patch. If anyone has any objections, please let me know. ------------------ From: Martin Kaiser commit 0be267255cef64e1c58475baa7b25568355a3816 upstream. When the watchdog device is suspended, its timeout is set to the maximum value. During resume, the previously set timeout should be restored. This does not work at the moment. The suspend function calls imx2_wdt_set_timeout(wdog, IMX2_WDT_MAX_TIME); and resume reverts this by calling imx2_wdt_set_timeout(wdog, wdog->timeout); However, imx2_wdt_set_timeout() updates wdog->timeout. Therefore, wdog->timeout is set to IMX2_WDT_MAX_TIME when we enter the resume function. Fix this by adding a new function __imx2_wdt_set_timeout() which only updates the hardware settings. imx2_wdt_set_timeout() now calls __imx2_wdt_set_timeout() and then saves the new timeout to wdog->timeout. During suspend, we call __imx2_wdt_set_timeout() directly so that wdog->timeout won't be updated and we can restore the previous value during resume. This approach makes wdog->timeout different from the actual setting in the hardware which is usually not a good thing. However, the two differ only while we're suspended and no kernel code is running, so it should be ok in this case. Signed-off-by: Martin Kaiser Reviewed-by: Guenter Roeck Signed-off-by: Guenter Roeck Signed-off-by: Wim Van Sebroeck Signed-off-by: Greg Kroah-Hartman --- drivers/watchdog/imx2_wdt.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) --- a/drivers/watchdog/imx2_wdt.c +++ b/drivers/watchdog/imx2_wdt.c @@ -169,15 +169,21 @@ static int imx2_wdt_ping(struct watchdog return 0; } -static int imx2_wdt_set_timeout(struct watchdog_device *wdog, - unsigned int new_timeout) +static void __imx2_wdt_set_timeout(struct watchdog_device *wdog, + unsigned int new_timeout) { struct imx2_wdt_device *wdev = watchdog_get_drvdata(wdog); - wdog->timeout = new_timeout; - regmap_update_bits(wdev->regmap, IMX2_WDT_WCR, IMX2_WDT_WCR_WT, WDOG_SEC_TO_COUNT(new_timeout)); +} + +static int imx2_wdt_set_timeout(struct watchdog_device *wdog, + unsigned int new_timeout) +{ + __imx2_wdt_set_timeout(wdog, new_timeout); + + wdog->timeout = new_timeout; return 0; } @@ -371,7 +377,11 @@ static int imx2_wdt_suspend(struct devic /* The watchdog IP block is running */ if (imx2_wdt_is_running(wdev)) { - imx2_wdt_set_timeout(wdog, IMX2_WDT_MAX_TIME); + /* + * Don't update wdog->timeout, we'll restore the current value + * during resume. + */ + __imx2_wdt_set_timeout(wdog, IMX2_WDT_MAX_TIME); imx2_wdt_ping(wdog); }