From patchwork Tue Jun 6 09:11:33 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Keiji Hayashibara X-Patchwork-Id: 103141 Delivered-To: patch@linaro.org Received: by 10.182.29.35 with SMTP id g3csp1169597obh; Tue, 6 Jun 2017 02:12:25 -0700 (PDT) X-Received: by 10.84.174.67 with SMTP id q61mr19979974plb.97.1496740345531; Tue, 06 Jun 2017 02:12:25 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1496740345; cv=none; d=google.com; s=arc-20160816; b=lp3U3LWaI0+KC4TkNtn8s4ldMV03lMH0PKYBR9jMkz2p+IgN5ZDsDppVFuGEpbSwh8 4jcU6FePPD9jjhhvyRFnKnU5UYkSzC9xYqmOzUbd9JugNOy/p8yYn0RvyRNP+TYf4Sdh xaAZ0ekxw0IMUfIXgoMIXNA11klAS5k7e12lWsuC3n3kKy0WuZEBFdjU68xfqu1fNvwF gVY1hJn1csFulQO8VEjNXL3m79u9Cf0qhlmibOu1nYLM/3qjR6VvaKqEq1xIPs1dgqra l93ovsF34rl7BeRFwcjN8BQTKYfmnjtZ4RAAMp5ni6B4RHfbsZejGxO8+x7sdCmSE2Fd lOkw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:arc-authentication-results; bh=JeZUWfBIUOnmvMuGGujfO8eFbN66O6OR8l2RN+VEGvw=; b=fK2WUSc+Y5MNCk338cb7lf/E38o0uX6G0slsz0VMPZhCZFlae4G8oOWMoqeFQRiEkt T6i9bbT0qkLdJeYVaqoegLb5lf5Z5k5dRls+Ns8Mkfc9UyNQL7LOCLzoZkmAYtx1vsli VF2h4BoN186pQtvzF8bmICzgOfpsP3rowsh3y5HGXZISnqu/iXEw4ReMsxIzECVYU2wf dORupKsvyopPIr39kzyIofS3YAjdpBTpQmDr5omn1XNXS3Ro+7Xf/HjKvaN4nM9vutoU Je8wGxD82PzL6teHv3qMb+5aF1jTIriTwPJ2HvMe0b8H+3LKdTE6nYHIu2HHk3KhtDmB 4POg== 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 a6si10126034pll.355.2017.06.06.02.12.25; Tue, 06 Jun 2017 02:12:25 -0700 (PDT) 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 S1751501AbdFFJMN (ORCPT + 25 others); Tue, 6 Jun 2017 05:12:13 -0400 Received: from mx.socionext.com ([202.248.49.38]:20155 "EHLO mx.socionext.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751436AbdFFJLq (ORCPT ); Tue, 6 Jun 2017 05:11:46 -0400 Received: from unknown (HELO iyokan-ex.css.socionext.com) ([172.31.9.54]) by mx.socionext.com with ESMTP; 06 Jun 2017 18:11:44 +0900 Received: from mail.mfilter.local (unknown [10.213.24.61]) by iyokan-ex.css.socionext.com (Postfix) with ESMTP id 847D7600E5; Tue, 6 Jun 2017 18:11:44 +0900 (JST) Received: from 172.31.9.51 (172.31.9.51) by m-FILTER with ESMTP; Tue, 6 Jun 2017 18:11:44 +0900 Received: from plum.e01.socionext.com (unknown [10.213.132.32]) by kinkan.css.socionext.com (Postfix) with ESMTP id EA9F01A1208; Tue, 6 Jun 2017 18:11:43 +0900 (JST) From: Keiji Hayashibara To: wim@iguana.be, linux@roeck-us.net Cc: linux-watchdog@vger.kernel.org, linux-kernel@vger.kernel.org, robh+dt@kernel.org, devicetree@vger.kernel.org, masami.hiramatsu@linaro.org, jaswinder.singh@linaro.org, yamada.masahiro@socionext.com, hayashi.kunihiko@socionext.com, owada.kiyoshi@socionext.com, Keiji Hayashibara Subject: [PATCH V2 2/3] watchdog: uniphier: add UniPhier watchdog driver Date: Tue, 6 Jun 2017 18:11:33 +0900 Message-Id: <1496740294-12653-3-git-send-email-hayashibara.keiji@socionext.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1496740294-12653-1-git-send-email-hayashibara.keiji@socionext.com> References: <1496740294-12653-1-git-send-email-hayashibara.keiji@socionext.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Add a watchdog driver for Socionext UniPhier series SoC. Note that the timeout value for this device must be a power of 2 because of the specification. Signed-off-by: Keiji Hayashibara --- Documentation/watchdog/watchdog-parameters.txt | 6 + drivers/watchdog/Kconfig | 11 + drivers/watchdog/Makefile | 1 + drivers/watchdog/uniphier_wdt.c | 275 +++++++++++++++++++++++++ 4 files changed, 293 insertions(+) create mode 100644 drivers/watchdog/uniphier_wdt.c -- 2.7.4 diff --git a/Documentation/watchdog/watchdog-parameters.txt b/Documentation/watchdog/watchdog-parameters.txt index 4f7d86d..6f9d7b4 100644 --- a/Documentation/watchdog/watchdog-parameters.txt +++ b/Documentation/watchdog/watchdog-parameters.txt @@ -369,6 +369,12 @@ timeout: Watchdog timeout in seconds. (0 +#include +#include +#include +#include +#include +#include + +/* WDT timer setting register */ +#define WDTTIMSET 0x3004 +#define WDTTIMSET_PERIOD_MASK (0xf << 0) +#define WDTTIMSET_PERIOD_1_SEC (0x3 << 0) +#define WDTTIMSET_PERIOD_2_SEC (0x4 << 0) +#define WDTTIMSET_PERIOD_4_SEC (0x5 << 0) +#define WDTTIMSET_PERIOD_8_SEC (0x6 << 0) +#define WDTTIMSET_PERIOD_16_SEC (0x7 << 0) +#define WDTTIMSET_PERIOD_32_SEC (0x8 << 0) +#define WDTTIMSET_PERIOD_64_SEC (0x9 << 0) +#define WDTTIMSET_PERIOD_128_SEC (0xa << 0) + +/* WDT reset selection register */ +#define WDTRSTSEL 0x3008 +#define WDTRSTSEL_RSTSEL_MASK (0x3 << 0) +#define WDTRSTSEL_RSTSEL_BOTH (0x0 << 0) +#define WDTRSTSEL_RSTSEL_IRQ_ONLY (0x2 << 0) + +/* WDT control register */ +#define WDTCTRL 0x300c +#define WDTCTRL_STATUS BIT(8) +#define WDTCTRL_CLEAR BIT(1) +#define WDTCTRL_ENABLE BIT(0) + +#define SEC_TO_WDTTIMSET_PRD(sec) \ + (ilog2(sec) + WDTTIMSET_PERIOD_1_SEC) + +#define WDTST_TIMEOUT 1000 /* usec */ + +#define WDT_DEFAULT_TIMEOUT 64 /* Default is 64 seconds */ +#define WDT_PERIOD_MIN 1 +#define WDT_PERIOD_MAX 128 + +static unsigned int timeout = WDT_DEFAULT_TIMEOUT; +static bool nowayout = WATCHDOG_NOWAYOUT; + +struct uniphier_wdt_dev { + struct watchdog_device wdt_dev; + struct regmap *regmap; +}; + +/* + * UniPhier Watchdog operations + */ +static int uniphier_watchdog_ping(struct watchdog_device *w) +{ + struct uniphier_wdt_dev *wdev = watchdog_get_drvdata(w); + unsigned int val; + int ret; + + /* Clear counter */ + ret = regmap_write_bits(wdev->regmap, WDTCTRL, + WDTCTRL_CLEAR, WDTCTRL_CLEAR); + if (!ret) + /* + * As SoC specification, after clear counter, + * it needs to wait until counter status is 1. + */ + ret = regmap_read_poll_timeout(wdev->regmap, WDTCTRL, val, + (val & WDTCTRL_STATUS), + 0, WDTST_TIMEOUT); + + return ret; +} + +static int __uniphier_watchdog_start(struct regmap *regmap, unsigned int sec) +{ + unsigned int val; + int ret; + + ret = regmap_read_poll_timeout(regmap, WDTCTRL, val, + !(val & WDTCTRL_STATUS), + 0, WDTST_TIMEOUT); + if (ret) + return ret; + + /* Setup period */ + ret = regmap_write(regmap, WDTTIMSET, + SEC_TO_WDTTIMSET_PRD(sec)); + if (ret) + return ret; + + /* Enable and clear watchdog */ + ret = regmap_write(regmap, WDTCTRL, WDTCTRL_ENABLE | WDTCTRL_CLEAR); + if (!ret) + /* + * As SoC specification, after clear counter, + * it needs to wait until counter status is 1. + */ + ret = regmap_read_poll_timeout(regmap, WDTCTRL, val, + (val & WDTCTRL_STATUS), + 0, WDTST_TIMEOUT); + + return ret; +} + +static int __uniphier_watchdog_stop(struct regmap *regmap) +{ + /* Disable and stop watchdog */ + return regmap_write_bits(regmap, WDTCTRL, WDTCTRL_ENABLE, 0); +} + +static int __uniphier_watchdog_restart(struct regmap *regmap, unsigned int sec) +{ + int ret; + + ret = __uniphier_watchdog_stop(regmap); + if (ret) + return ret; + + return __uniphier_watchdog_start(regmap, sec); +} + +static int uniphier_watchdog_start(struct watchdog_device *w) +{ + struct uniphier_wdt_dev *wdev = watchdog_get_drvdata(w); + unsigned int tmp_timeout; + + tmp_timeout = roundup_pow_of_two(w->timeout); + + return __uniphier_watchdog_start(wdev->regmap, tmp_timeout); +} + +static int uniphier_watchdog_stop(struct watchdog_device *w) +{ + struct uniphier_wdt_dev *wdev = watchdog_get_drvdata(w); + + return __uniphier_watchdog_stop(wdev->regmap); +} + +static int uniphier_watchdog_set_timeout(struct watchdog_device *w, + unsigned int t) +{ + struct uniphier_wdt_dev *wdev = watchdog_get_drvdata(w); + unsigned int tmp_timeout; + int ret; + + tmp_timeout = roundup_pow_of_two(t); + if (tmp_timeout == w->timeout) + return 0; + + if (watchdog_active(w)) { + ret = __uniphier_watchdog_restart(wdev->regmap, tmp_timeout); + if (ret) + return ret; + } + + w->timeout = tmp_timeout; + + return 0; +} + +/* + * Kernel Interfaces + */ +static const struct watchdog_info uniphier_wdt_info = { + .identity = "uniphier-wdt", + .options = WDIOF_SETTIMEOUT | + WDIOF_KEEPALIVEPING | + WDIOF_MAGICCLOSE | + WDIOF_OVERHEAT, +}; + +static const struct watchdog_ops uniphier_wdt_ops = { + .owner = THIS_MODULE, + .start = uniphier_watchdog_start, + .stop = uniphier_watchdog_stop, + .ping = uniphier_watchdog_ping, + .set_timeout = uniphier_watchdog_set_timeout, +}; + +static int uniphier_wdt_probe(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + struct uniphier_wdt_dev *wdev; + struct regmap *regmap; + struct device_node *parent; + int ret; + + wdev = devm_kzalloc(dev, sizeof(*wdev), GFP_KERNEL); + if (!wdev) + return -ENOMEM; + + platform_set_drvdata(pdev, wdev); + + parent = of_get_parent(dev->of_node); /* parent should be syscon node */ + regmap = syscon_node_to_regmap(parent); + of_node_put(parent); + if (IS_ERR(regmap)) + return PTR_ERR(regmap); + + wdev->regmap = regmap; + wdev->wdt_dev.info = &uniphier_wdt_info; + wdev->wdt_dev.ops = &uniphier_wdt_ops; + wdev->wdt_dev.timeout = WDT_DEFAULT_TIMEOUT; + wdev->wdt_dev.max_timeout = WDT_PERIOD_MAX; + wdev->wdt_dev.min_timeout = WDT_PERIOD_MIN; + wdev->wdt_dev.parent = dev; + + watchdog_init_timeout(&wdev->wdt_dev, timeout, dev); + watchdog_set_nowayout(&wdev->wdt_dev, nowayout); + watchdog_stop_on_reboot(&wdev->wdt_dev); + + watchdog_set_drvdata(&wdev->wdt_dev, wdev); + + uniphier_watchdog_stop(&wdev->wdt_dev); + ret = regmap_write(wdev->regmap, WDTRSTSEL, WDTRSTSEL_RSTSEL_BOTH); + if (ret) + return ret; + + ret = devm_watchdog_register_device(dev, &wdev->wdt_dev); + if (ret) + return ret; + + dev_info(dev, "watchdog driver (timeout=%d sec, nowayout=%d)\n", + wdev->wdt_dev.timeout, nowayout); + + return 0; +} + +static const struct of_device_id uniphier_wdt_dt_ids[] = { + { .compatible = "socionext,uniphier-wdt" }, + { /* sentinel */ } +}; +MODULE_DEVICE_TABLE(of, uniphier_wdt_dt_ids); + +static struct platform_driver uniphier_wdt_driver = { + .probe = uniphier_wdt_probe, + .driver = { + .name = "uniphier-wdt", + .of_match_table = uniphier_wdt_dt_ids, + }, +}; + +module_platform_driver(uniphier_wdt_driver); + +module_param(timeout, uint, 0000); +MODULE_PARM_DESC(timeout, + "Watchdog timeout seconds in power of 2. (0 < timeout < 128, default=" + __MODULE_STRING(WDT_DEFAULT_TIMEOUT) ")"); + +module_param(nowayout, bool, 0000); +MODULE_PARM_DESC(nowayout, + "Watchdog cannot be stopped once started (default=" + __MODULE_STRING(WATCHDOG_NOWAYOUT) ")"); + +MODULE_AUTHOR("Socionext Inc."); +MODULE_DESCRIPTION("UniPhier Watchdog Device Driver"); +MODULE_LICENSE("GPL v2"); From patchwork Tue Jun 6 09:11:34 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Keiji Hayashibara X-Patchwork-Id: 103140 Delivered-To: patch@linaro.org Received: by 10.182.29.35 with SMTP id g3csp1169441obh; Tue, 6 Jun 2017 02:11:55 -0700 (PDT) X-Received: by 10.84.217.206 with SMTP id d14mr19851055plj.59.1496740315608; Tue, 06 Jun 2017 02:11:55 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1496740315; cv=none; d=google.com; s=arc-20160816; b=J5PygHmtLMVXleV1pi/iOR7QtOUGfMJFddGqPXQ1xFJ+WrRJXCpXJ5YLDSlWTMXweW sB6pDslrOl9/ubzbA0b9TcH97la1wS7wn1LvaM+Lnz04iDomPiZ0HlZ4Fy6SJx8cFnGB 4HySZpMWbumQU0d5EICbYyBET9Tbqr+EQMZmoN+SK2oN/6acPDVpqHYYo1oaMPFG5oLX jTUYND/uOaFUHOzbi1toHKaBVvCLegDWGiJ5azx9teeufq7dfa0dNGAlypNCHlXCkyxi Q7MJjSotRJY+ANP7QTNg7QUYcl91MbTVTP/jItaom95VEFKa1WaCjsPBvTcEJVoSWmzW Dd1Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:arc-authentication-results; bh=GmNAD7rJYOH6ioUmEu2lMuFBhaxfAG0MIjSK7pZvWxY=; b=zYXcFxnZWGEujCo7w+3Ocn94BjXkkoWWmfC5GL1DaBhAJiBZJwtjsaATxFCo4o98aK 3kOtbWVIj/B70wJkw/xXgiyEPKlaPAWsZ7j4bWRG7biDhnBIxD43HsYxIrNAI3C32cVp EQGDMQUc0JzSB/bRuLJvJHfvi0TcnjZdXlDhLLj3y9Pnmq796yaRN0SO9FcgrB5Vzr8I 0haUYsc39lEI3L5Os7brbPTJ7zyxXOO/IDQqEXUuMks2MEcgDQD8hj+tKBwgEcsSFWza Nm8NPdUKaI7teOjx2tZQOmo7A6E+DThJSYvxxdDcKM1PPpyDWywYkKLCkke72a/WGhq3 XJug== 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 s64si32244317pgb.336.2017.06.06.02.11.54; Tue, 06 Jun 2017 02:11:55 -0700 (PDT) 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 S1751481AbdFFJLv (ORCPT + 25 others); Tue, 6 Jun 2017 05:11:51 -0400 Received: from mx.socionext.com ([202.248.49.38]:20163 "EHLO mx.socionext.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751243AbdFFJLq (ORCPT ); Tue, 6 Jun 2017 05:11:46 -0400 Received: from unknown (HELO kinkan-ex.css.socionext.com) ([172.31.9.52]) by mx.socionext.com with ESMTP; 06 Jun 2017 18:11:46 +0900 Received: from mail.mfilter.local (unknown [10.213.24.62]) by kinkan-ex.css.socionext.com (Postfix) with ESMTP id 78E75180B9F; Tue, 6 Jun 2017 18:11:45 +0900 (JST) Received: from 172.31.9.51 (172.31.9.51) by m-FILTER with ESMTP; Tue, 6 Jun 2017 18:11:45 +0900 Received: from plum.e01.socionext.com (unknown [10.213.132.32]) by kinkan.css.socionext.com (Postfix) with ESMTP id 0DF151A1208; Tue, 6 Jun 2017 18:11:45 +0900 (JST) From: Keiji Hayashibara To: wim@iguana.be, linux@roeck-us.net Cc: linux-watchdog@vger.kernel.org, linux-kernel@vger.kernel.org, robh+dt@kernel.org, devicetree@vger.kernel.org, masami.hiramatsu@linaro.org, jaswinder.singh@linaro.org, yamada.masahiro@socionext.com, hayashi.kunihiko@socionext.com, owada.kiyoshi@socionext.com, Keiji Hayashibara Subject: [PATCH V2 3/3] arm64: dts: uniphier: add watchdog node for LD11 and LD20 Date: Tue, 6 Jun 2017 18:11:34 +0900 Message-Id: <1496740294-12653-4-git-send-email-hayashibara.keiji@socionext.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1496740294-12653-1-git-send-email-hayashibara.keiji@socionext.com> References: <1496740294-12653-1-git-send-email-hayashibara.keiji@socionext.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Add nodes of watchdog timer for UniPhier LD11 and LD20 SoC. The watchdog timer is included in sysctrl. Signed-off-by: Keiji Hayashibara --- arch/arm64/boot/dts/socionext/uniphier-ld11.dtsi | 4 ++++ arch/arm64/boot/dts/socionext/uniphier-ld20.dtsi | 4 ++++ 2 files changed, 8 insertions(+) -- 2.7.4 diff --git a/arch/arm64/boot/dts/socionext/uniphier-ld11.dtsi b/arch/arm64/boot/dts/socionext/uniphier-ld11.dtsi index da881f5..5fee3e3 100644 --- a/arch/arm64/boot/dts/socionext/uniphier-ld11.dtsi +++ b/arch/arm64/boot/dts/socionext/uniphier-ld11.dtsi @@ -393,6 +393,10 @@ compatible = "socionext,uniphier-ld11-reset"; #reset-cells = <1>; }; + + watchdog { + compatible = "socionext,uniphier-wdt"; + }; }; }; }; diff --git a/arch/arm64/boot/dts/socionext/uniphier-ld20.dtsi b/arch/arm64/boot/dts/socionext/uniphier-ld20.dtsi index a6b3a70..d4d82c8 100644 --- a/arch/arm64/boot/dts/socionext/uniphier-ld20.dtsi +++ b/arch/arm64/boot/dts/socionext/uniphier-ld20.dtsi @@ -417,6 +417,10 @@ compatible = "socionext,uniphier-ld20-reset"; #reset-cells = <1>; }; + + watchdog { + compatible = "socionext,uniphier-wdt"; + }; }; }; };