From patchwork Tue Oct 10 13:12:52 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?b?5YiY56iz?= <18502523564@163.com> X-Patchwork-Id: 823837 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-rtc-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=163.com header.i=@163.com header.b="PkXwy28E"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3yBHyl26JLz9tYN for ; Wed, 11 Oct 2017 00:29:35 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756045AbdJJN3e (ORCPT ); Tue, 10 Oct 2017 09:29:34 -0400 Received: from m12-12.163.com ([220.181.12.12]:50121 "EHLO m12-12.163.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755919AbdJJN3d (ORCPT ); Tue, 10 Oct 2017 09:29:33 -0400 X-Greylist: delayed 930 seconds by postgrey-1.27 at vger.kernel.org; Tue, 10 Oct 2017 09:29:31 EDT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=163.com; s=s110527; h=From:Subject:Date:Message-Id; bh=qAeQLQRqTx3+OD1ibd 6gL4iB1+UeGROYLEmADcdz6xo=; b=PkXwy28E80yEFqmnF/KtD6RnCGtuYEKBWs aEbDHvkUYO44g1zdDqUWqAAx0pO46AvG8Y7Jb+zq/MEMS/lVD8lOfk05Dt36r8uP j+U2IccDhRWNwiVbrgGwiaNABPKX65eIxpYVbpFRcytua8gcmHk+ADD5bu2IYnMU 21MSSIVmw= Received: from T460p.lan (unknown [114.221.185.190]) by smtp8 (Coremail) with SMTP id DMCowAD3Y+hZx9xZP++RIg--.54485S2; Tue, 10 Oct 2017 21:12:58 +0800 (CST) From: "winton.liu" <18502523564@163.com> To: a.zummo@towertech.it, alexandre.belloni@free-electrons.com, linux@roeck-us.net Cc: linux-rtc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-watchdog@vger.kernel.org, "winton.liu" <18502523564@163.com> Subject: [PATCH] rtc: ds1374: wdt:support suspend/resume for watchdog Date: Tue, 10 Oct 2017 21:12:52 +0800 Message-Id: <1507641172-6099-1-git-send-email-18502523564@163.com> X-Mailer: git-send-email 1.9.1 X-CM-TRANSID: DMCowAD3Y+hZx9xZP++RIg--.54485S2 X-Coremail-Antispam: 1Uf129KBjvJXoW7tr4fuw4rJFWrKw1rCw4DJwb_yoW8ZFWUpF W5Cr9YkrW7KFnFganIyF98JF1rtr4vgrW7tr13G3ZxXa93trn0q3ZYyrykJa1kJr93Xr4a g3WvyayrGa4UArUanT9S1TB71UUUUUUqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDUYxBIdaVFxhVjvjDU0xZFpf9x07U9BMiUUUUU= X-Originating-IP: [114.221.185.190] X-CM-SenderInfo: jprykiysvsjkiwu6il2tof0z/1tbiTRpt9Vc6-ZpW1wAAsE Sender: linux-rtc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-rtc@vger.kernel.org When enable CONFIG_RTC_DRV_DS1374_WDT use as watchdog, in suspend mode, watchdog is still working but no daemon patting the watchdog. The system will reboot if timeout. Add support suspend/resume for watchdog. suspend: disable the watchdog resume: disable existing watchdog, reload watchdog timer, enable watchdog Signed-off-by: winton.liu <18502523564@163.com> --- drivers/rtc/rtc-ds1374.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/drivers/rtc/rtc-ds1374.c b/drivers/rtc/rtc-ds1374.c index 38a2e9e..642e31d 100644 --- a/drivers/rtc/rtc-ds1374.c +++ b/drivers/rtc/rtc-ds1374.c @@ -437,6 +437,29 @@ static void ds1374_wdt_ping(void) pr_info("WD TICK FAIL!!!!!!!!!! %i\n", ret); } +static void ds1374_wdt_resume(void) +{ + int ret = -ENOIOCTLCMD; + int cr; + + cr = i2c_smbus_read_byte_data(save_client, DS1374_REG_CR); + + /* Disable any existing watchdog/alarm before setting the new one */ + cr &= ~DS1374_REG_CR_WACE; + + i2c_smbus_write_byte_data(save_client, DS1374_REG_CR, cr); + + /* Reload watchdog timer */ + ds1374_wdt_ping(); + + /* Enable watchdog timer */ + cr |= DS1374_REG_CR_WACE | DS1374_REG_CR_WDALM; + cr &= ~DS1374_REG_CR_AIE; + + ret = i2c_smbus_write_byte_data(save_client, DS1374_REG_CR, cr); + +} + static void ds1374_wdt_disable(void) { int ret = -ENOIOCTLCMD; @@ -690,6 +713,10 @@ static int ds1374_suspend(struct device *dev) { struct i2c_client *client = to_i2c_client(dev); +#ifdef CONFIG_RTC_DRV_DS1374_WDT + ds1374_wdt_disable(); +#endif + if (client->irq > 0 && device_may_wakeup(&client->dev)) enable_irq_wake(client->irq); return 0; @@ -699,6 +726,10 @@ static int ds1374_resume(struct device *dev) { struct i2c_client *client = to_i2c_client(dev); +#ifdef CONFIG_RTC_DRV_DS1374_WDT + ds1374_wdt_resume(); +#endif + if (client->irq > 0 && device_may_wakeup(&client->dev)) disable_irq_wake(client->irq); return 0;