Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/1.2/patches/717626/?format=api
{ "id": 717626, "url": "http://patchwork.ozlabs.org/api/1.2/patches/717626/?format=api", "web_url": "http://patchwork.ozlabs.org/project/rtc-linux/patch/20170120123644.118612-1-sean.nyekjaer@prevas.dk/", "project": { "id": 9, "url": "http://patchwork.ozlabs.org/api/1.2/projects/9/?format=api", "name": "Linux RTC development", "link_name": "rtc-linux", "list_id": "linux-rtc.vger.kernel.org", "list_email": "linux-rtc@vger.kernel.org", "web_url": "", "scm_url": "", "webscm_url": "", "list_archive_url": "", "list_archive_url_format": "", "commit_url_format": "" }, "msgid": "<20170120123644.118612-1-sean.nyekjaer@prevas.dk>", "list_archive_url": null, "date": "2017-01-20T12:36:43", "name": "[1/2] rtc: pcf2127: add support for pcf2127 watchdog functionality", "commit_ref": null, "pull_url": null, "state": "changes-requested", "archived": false, "hash": "4c1d96257ebd37b42ea514a4c09a607a0b7277c7", "submitter": { "id": 64902, "url": "http://patchwork.ozlabs.org/api/1.2/people/64902/?format=api", "name": "Sean Nyekjær", "email": "sean.nyekjaer@prevas.dk" }, "delegate": null, "mbox": "http://patchwork.ozlabs.org/project/rtc-linux/patch/20170120123644.118612-1-sean.nyekjaer@prevas.dk/mbox/", "series": [], "comments": "http://patchwork.ozlabs.org/api/patches/717626/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/717626/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "<rtc-linux+bncBAABBIMJRDCAKGQELIM2NCA@googlegroups.com>", "X-Original-To": "incoming@patchwork.ozlabs.org", "Delivered-To": "patchwork-incoming@bilbo.ozlabs.org", "Received": [ "from mail-wm0-x23d.google.com (mail-wm0-x23d.google.com\n\t[IPv6:2a00:1450:400c:c09::23d])\n\t(using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128\n\tbits)) (No client certificate requested)\n\tby ozlabs.org (Postfix) with ESMTPS id 3v4gGn0xk0z9snk\n\tfor <incoming@patchwork.ozlabs.org>;\n\tFri, 20 Jan 2017 23:38:08 +1100 (AEDT)", "by mail-wm0-x23d.google.com with SMTP id d140sf10429340wmd.0\n\tfor <incoming@patchwork.ozlabs.org>;\n\tFri, 20 Jan 2017 04:38:08 -0800 (PST)", "by 10.46.32.216 with SMTP id g85ls513460lji.7.gmail; Fri, 20 Jan\n\t2017 04:37:53 -0800 (PST)", "from mail02.prevas.se (mail02.prevas.se. [62.95.78.10])\n\tby gmr-mx.google.com with ESMTPS id\n\th62si105086wme.2.2017.01.20.04.37.53\n\tfor <rtc-linux@googlegroups.com>\n\t(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);\n\tFri, 20 Jan 2017 04:37:53 -0800 (PST)", "from unknown (HELO skn.kamstrup.dk) ([95.138.208.137])\n\tby mail02.prevas.se with ESMTP/TLS/AES128-SHA256;\n\t20 Jan 2017 13:37:51 +0100" ], "Authentication-Results": "ozlabs.org; dkim=pass (2048-bit key;\n\tunprotected) header.d=googlegroups.com header.i=@googlegroups.com\n\theader.b=\"Pparjoxd\"; dkim-atps=neutral", "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=googlegroups.com; s=20161025;\n\th=sender:mime-version:from:to:cc:subject:date:message-id\n\t:x-original-sender:x-original-authentication-results:reply-to\n\t:precedence:mailing-list:list-id:x-spam-checked-in-group:list-post\n\t:list-help:list-archive:list-subscribe:list-unsubscribe;\n\tbh=0pfj42WUBM98bX+ZW0xXHhTDnspFw6hg3A8tn42cVjc=;\n\tb=PparjoxdfGQdo2asEYZbWdk6y7zv/4ShIS4rcN91Z5pGha/BmNjPk7tVzr8fTyeAKK\n\t+9DkkoX9VX30/nK3L41t30fgVyNiIHiO30NPLQ8g8iXZfoDFc7oxhfkkkANwbZLBKaAk\n\tD+0jSRehOIoXHYpqaY85OY8cA7G4+gv9ImSgfavkMDb9TWgKeKlSm4iS1jJUQ0U6IMqn\n\t6mej8JIzoQFnXtr9gfPqYP7tnWrMOqKqwxdLDedaHIgn/yTJoGTEPYpatYr4XrXUgSX/\n\toW+FF/d/bY7S3AHdzke4aQD0UnMGXGJN7kQWAqmjR8AC7fMIgfoiSalh+ry8vHvM/A7o\n\twtnA==", "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=sender:x-gm-message-state:mime-version:from:to:cc:subject:date\n\t:message-id:x-original-sender:x-original-authentication-results\n\t:reply-to:precedence:mailing-list:list-id:x-spam-checked-in-group\n\t:list-post:list-help:list-archive:list-subscribe:list-unsubscribe;\n\tbh=0pfj42WUBM98bX+ZW0xXHhTDnspFw6hg3A8tn42cVjc=;\n\tb=E6b6OCqIpm4nEBuD+KJDJ8BYpvf6nWr1H6hLHJnXpIZv3tbJhVm00MF1Ed6clfCmPf\n\t+y1tDjviDZhQSCQHnx+/LJlmPhQPG0bLujtciTd6+/akHygjlbLQBtQH1X3MkPR3sS86\n\tOwpmeXvZFBBba5cEzT3EHJpvTkDWtuo2YTe5sIKi6186KESAn0xTLUiWKe5n50yZ0Zi3\n\tH5sD0SmiQV7zskmHyTaBNIzLaE/PuZyF5Xo1hj2BSvaHMUFWYJhsa823z5seFWZluiCV\n\tBBaeePk99hQ03KYyXE9teKPYsdH+D5Mv3QjRYowckUFFRg4zLO2JjpwOYAA9S2nCXLDe\n\twvgw==", "Sender": "rtc-linux@googlegroups.com", "X-Gm-Message-State": "AIkVDXLdBy/kHbV+JLOQsKnRVxnrde61Ssg2o86Oe+tW7QBacal0ZgbjqRT23V5BUMIu7A==", "X-Received": [ "by 10.25.56.1 with SMTP id f1mr151881lfa.14.1484915873895;\n\tFri, 20 Jan 2017 04:37:53 -0800 (PST)", "by 10.46.22.87 with SMTP id 23mr1395382ljw.7.1484915873420;\n\tFri, 20 Jan 2017 04:37:53 -0800 (PST)" ], "MIME-Version": "1.0", "X-BeenThere": "rtc-linux@googlegroups.com", "Received-SPF": "pass (google.com: domain of\n\tprvs=186a45687=sean.nyekjaer@prevas.dk designates 62.95.78.10\n\tas permitted sender) client-ip=62.95.78.10; ", "X-IronPort-Anti-Spam-Filtered": "true", "X-IronPort-Anti-Spam-Result": "=?us-ascii?q?A2GdEwCQA4JY/4nQil9VCR0YB4MxAQEBA?=\n\t=?us-ascii?q?QEfgRoCTYMFhVaqIoQbGoYIDoIBQhEBAgEBAQEBAQEDYAUjhRdSKCeBAokIsQ0?=\n\t=?us-ascii?q?6JgKKUIZLiQkJgnMMgwwFjyuMHYF8j14NgXeIUAyGG5J0NSOBKIRWAQEIRRyBY?=\n\t=?us-ascii?q?T01hleCPQEBAQ?=", "X-IPAS-Result": "=?us-ascii?q?A2GdEwCQA4JY/4nQil9VCR0YB4MxAQEBAQEfgRoCTYMFhVa?=\n\t=?us-ascii?q?qIoQbGoYIDoIBQhEBAgEBAQEBAQEDYAUjhRdSKCeBAokIsQ06JgKKUIZLiQkJg?=\n\t=?us-ascii?q?nMMgwwFjyuMHYF8j14NgXeIUAyGG5J0NSOBKIRWAQEIRRyBYT01hleCPQEBAQ?=", "X-IronPort-AV": "E=Sophos;i=\"5.33,258,1477954800\"; d=\"scan'208\";a=\"1666494\"", "From": "Sean Nyekjaer <sean.nyekjaer@prevas.dk>", "To": "rtc-linux@googlegroups.com", "Cc": "Sean Nyekjaer <sean.nyekjaer@prevas.dk>", "Subject": "[rtc-linux] [PATCH 1/2] rtc: pcf2127: add support for pcf2127\n\twatchdog functionality", "Date": "Fri, 20 Jan 2017 13:36:43 +0100", "Message-Id": "<20170120123644.118612-1-sean.nyekjaer@prevas.dk>", "X-Mailer": "git-send-email 2.11.0", "X-Original-Sender": "sean.nyekjaer@prevas.dk", "X-Original-Authentication-Results": "gmr-mx.google.com; dkim=pass\n\theader.i=@prevas.dk; spf=pass (google.com: domain of\n\tprvs=186a45687=sean.nyekjaer@prevas.dk designates 62.95.78.10 as\n\tpermitted\n\tsender) smtp.mailfrom=prvs=186a45687=sean.nyekjaer@prevas.dk", "Reply-To": "rtc-linux@googlegroups.com", "Content-Type": "text/plain; charset=UTF-8", "Precedence": "list", "Mailing-list": "list rtc-linux@googlegroups.com;\n\tcontact rtc-linux+owners@googlegroups.com", "List-ID": "<rtc-linux.googlegroups.com>", "X-Spam-Checked-In-Group": "rtc-linux@googlegroups.com", "X-Google-Group-Id": "712029733259", "List-Post": "<https://groups.google.com/group/rtc-linux/post>,\n\t<mailto:rtc-linux@googlegroups.com>", "List-Help": "<https://groups.google.com/support/>,\n\t<mailto:rtc-linux+help@googlegroups.com>", "List-Archive": "<https://groups.google.com/group/rtc-linux", "List-Subscribe": "<https://groups.google.com/group/rtc-linux/subscribe>,\n\t<mailto:rtc-linux+subscribe@googlegroups.com>", "List-Unsubscribe": "<mailto:googlegroups-manage+712029733259+unsubscribe@googlegroups.com>,\n\t<https://groups.google.com/group/rtc-linux/subscribe>" }, "content": "PCF2129 does not have watchdog functionality built-in so we\nare only allowing to enable watchdog for PCF2127.\n\nWatchdog functionality is done with great inspiration from\nthe rtc-ds1374 driver.\n\nSigned-off-by: Sean Nyekjaer <sean.nyekjaer@prevas.dk>\n---\n drivers/rtc/Kconfig | 7 ++\n drivers/rtc/rtc-pcf2127.c | 174 +++++++++++++++++++++++++++++++++++++++++++++-\n 2 files changed, 180 insertions(+), 1 deletion(-)", "diff": "diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig\nindex e859d148aba9..c8985be81d83 100644\n--- a/drivers/rtc/Kconfig\n+++ b/drivers/rtc/Kconfig\n@@ -799,6 +799,13 @@ config RTC_DRV_PCF2127\n \t This driver can also be built as a module. If so, the module\n \t will be called rtc-pcf2127.\n \n+config RTC_DRV_PCF2127_WDT\n+\tbool \"NXP PCF2127 watchdog timer\"\n+\tdepends on RTC_DRV_PCF2127\n+\thelp\n+\t If you say Y here you will get support for the\n+\t watchdog timer in the NXP PCF2127 chip real-time clock chips.\n+\n config RTC_DRV_RV3029C2\n \ttristate \"Micro Crystal RV3029/3049\"\n \tdepends on RTC_I2C_AND_SPI\ndiff --git a/drivers/rtc/rtc-pcf2127.c b/drivers/rtc/rtc-pcf2127.c\nindex 2bfdf638b673..31627c59c44d 100644\n--- a/drivers/rtc/rtc-pcf2127.c\n+++ b/drivers/rtc/rtc-pcf2127.c\n@@ -21,6 +21,13 @@\n #include <linux/module.h>\n #include <linux/of.h>\n #include <linux/regmap.h>\n+#ifdef CONFIG_RTC_DRV_PCF2127_WDT\n+#include <linux/fs.h>\n+#include <linux/ioctl.h>\n+#include <linux/miscdevice.h>\n+#include <linux/reboot.h>\n+#include <linux/watchdog.h>\n+#endif\n \n #define PCF2127_REG_CTRL1 (0x00) /* Control Register 1 */\n #define PCF2127_REG_CTRL2 (0x01) /* Control Register 2 */\n@@ -28,6 +35,13 @@\n #define PCF2127_REG_CTRL3 (0x02) /* Control Register 3 */\n #define PCF2127_REG_CTRL3_BLF\t\tBIT(2)\n \n+#define PCF2127_REG_WDG_TIMCTL\t\t(0x10)\n+#define PCF2127_REG_WDG_TIMCTL_CD\t(BIT(7) | BIT(6))\n+#define PCF2127_REG_WDG_T_CD_EN_RST\t(BIT(7) | BIT(6))\t/* WD en,rst assert */\n+#define PCF2127_REG_WDG_TIMCTL_TF\t(BIT(1) | BIT(0))\n+#define PCF2127_REG_WDG_T_TF_1HZ\tBIT(1)\t/* Timer clock source */\n+#define PCF2127_REG_WDG_TIMVAL\t\t(0x11)\n+\n #define PCF2127_REG_SC (0x03) /* datetime */\n #define PCF2127_REG_MN (0x04)\n #define PCF2127_REG_HR (0x05)\n@@ -43,6 +57,138 @@ struct pcf2127 {\n \tstruct regmap *regmap;\n };\n \n+#ifdef CONFIG_RTC_DRV_PCF2127_WDT\n+static struct pcf2127 *save_pcf2127;\n+\n+/* default 32 sec timeout */\n+#define WD_TIMO 32\n+\n+static int wdt_margin = WD_TIMO;\n+\n+static const struct watchdog_info pcf2127_wdt_info = {\n+\t.identity = \"PCF2127 WDT\",\n+\t.options = WDIOF_KEEPALIVEPING | WDIOF_SETTIMEOUT,\n+};\n+\n+static int pcf2127_wdt_enable(void)\n+{\n+\treturn regmap_write(save_pcf2127->regmap, PCF2127_REG_WDG_TIMCTL,\n+\t\t\t PCF2127_REG_WDG_T_CD_EN_RST |\n+\t\t\t PCF2127_REG_WDG_T_TF_1HZ);\n+}\n+\n+static int pcf2127_wdt_settimeout(unsigned int timeout)\n+{\n+\tint err;\n+\n+\terr = pcf2127_wdt_enable();\n+\tif (err)\n+\t\treturn err;\n+\n+\terr = regmap_write(save_pcf2127->regmap, PCF2127_REG_WDG_TIMVAL,\n+\t\t\t timeout);\n+\tif (err)\n+\t\treturn err;\n+\n+\treturn 0;\n+}\n+\n+static void pcf2127_wdt_ping(void)\n+{\n+\tint ret = 0;\n+\n+\tret = pcf2127_wdt_settimeout(wdt_margin);\n+\tif (ret)\n+\t\tpr_info(\"WD TICK FAIL!!!!!!!!!! %i\\n\", ret);\n+}\n+\n+static int pcf2127_wdt_disable(void)\n+{\n+\treturn regmap_write_bits(save_pcf2127->regmap, PCF2127_REG_WDG_TIMCTL,\n+\t\t\t\t PCF2127_REG_WDG_TIMCTL_CD, 0x00);\n+}\n+\n+static long pcf2127_wdt_unlocked_ioctl(struct file *file, unsigned int cmd,\n+\t\t\t\t unsigned long arg)\n+{\n+\tint new_margin, options;\n+\n+\tswitch (cmd) {\n+\tcase WDIOC_GETSUPPORT:\n+\t\treturn copy_to_user((struct watchdog_info __user *)arg,\n+\t\t\t\t &pcf2127_wdt_info,\n+\t\t\t\t sizeof(pcf2127_wdt_info)) ? -EFAULT : 0;\n+\tcase WDIOC_SETOPTIONS:\n+\t\tif (copy_from_user(&options, (int __user *)arg, sizeof(int)))\n+\t\t\treturn -EFAULT;\n+\n+\t\tif (options & WDIOS_DISABLECARD) {\n+\t\t\tpr_info(\"disable watchdog\\n\");\n+\t\t\tif (pcf2127_wdt_disable())\n+\t\t\t\treturn -EFAULT;\n+\t\t}\n+\n+\t\tif (options & WDIOS_ENABLECARD) {\n+\t\t\tpr_info(\"enable watchdog\\n\");\n+\t\t\tpcf2127_wdt_settimeout(wdt_margin);\n+\t\t\tpcf2127_wdt_ping();\n+\t\t}\n+\n+\t\treturn -EINVAL;\n+\tcase WDIOC_KEEPALIVE:\n+\t\tpcf2127_wdt_ping();\n+\t\treturn 0;\n+\tcase WDIOC_SETTIMEOUT:\n+\t\tif (get_user(new_margin, (int __user *)arg))\n+\t\t\treturn -EFAULT;\n+\n+\t\tif (new_margin < 1 || new_margin > 255)\n+\t\t\treturn -EINVAL;\n+\n+\t\twdt_margin = new_margin;\n+\t\tif (pcf2127_wdt_settimeout(new_margin))\n+\t\t\treturn -EFAULT;\n+\t\tpcf2127_wdt_ping();\n+\t\t/* fallthrough */\n+\tcase WDIOC_GETTIMEOUT:\n+\t\treturn put_user(wdt_margin, (int __user *)arg);\n+\tdefault:\n+\t\treturn -ENOTTY;\n+\t}\n+}\n+\n+static ssize_t pcf2127_wdt_write(struct file *file, const char *data,\n+\t\t\t\t size_t len, loff_t *ppos)\n+{\n+\tif (len) {\n+\t\tpcf2127_wdt_ping();\n+\t\treturn 1;\n+\t}\n+\treturn 0;\n+}\n+\n+static ssize_t pcf2127_wdt_read(struct file *file, char __user *data,\n+\t\t\t\tsize_t len, loff_t *ppos)\n+{\n+\treturn 0;\n+}\n+\n+static const struct file_operations pcf2127_wdt_fops = {\n+\t.owner = THIS_MODULE,\n+\t.read = pcf2127_wdt_read,\n+\t.unlocked_ioctl = pcf2127_wdt_unlocked_ioctl,\n+\t.write = pcf2127_wdt_write,\n+\t.llseek = no_llseek,\n+};\n+\n+static struct miscdevice pcf2127_wdt_miscdev = {\n+\t.minor = WATCHDOG_MINOR,\n+\t.name = \"watchdog\",\n+\t.fops = &pcf2127_wdt_fops,\n+};\n+\n+#endif\n+\n /*\n * In the routines that deal directly with the pcf2127 hardware, we use\n * rtc_time -- month 0-11, hour 0-23, yr = calendar year-epoch.\n@@ -175,6 +321,9 @@ static const struct rtc_class_ops pcf2127_rtc_ops = {\n static int pcf2127_probe(struct device *dev, struct regmap *regmap,\n \t\t\tconst char *name)\n {\n+#ifdef CONFIG_RTC_DRV_PCF2127_WDT\n+\tint ret;\n+#endif\n \tstruct pcf2127 *pcf2127;\n \n \tdev_dbg(dev, \"%s\\n\", __func__);\n@@ -183,6 +332,10 @@ static int pcf2127_probe(struct device *dev, struct regmap *regmap,\n \tif (!pcf2127)\n \t\treturn -ENOMEM;\n \n+#ifdef CONFIG_RTC_DRV_PCF2127_WDT\n+\tsave_pcf2127 = pcf2127;\n+#endif\n+\n \tpcf2127->regmap = regmap;\n \n \tdev_set_drvdata(dev, pcf2127);\n@@ -190,7 +343,22 @@ static int pcf2127_probe(struct device *dev, struct regmap *regmap,\n \tpcf2127->rtc = devm_rtc_device_register(dev, name, &pcf2127_rtc_ops,\n \t\t\t\t\t\tTHIS_MODULE);\n \n-\treturn PTR_ERR_OR_ZERO(pcf2127->rtc);\n+\tif (IS_ERR(pcf2127->rtc))\n+\t\treturn PTR_ERR_OR_ZERO(pcf2127->rtc);\n+\n+#ifdef CONFIG_RTC_DRV_PCF2127_WDT\n+\tif (!of_device_is_compatible(dev->of_node, \"nxp,pcf2127\"))\n+\t\treturn 0;\n+\n+\tif (of_property_read_bool(dev->of_node, \"watchdog\")) {\n+\t\tret = misc_register(&pcf2127_wdt_miscdev);\n+\t\tif (ret)\n+\t\t\treturn ret;\n+\t}\n+\tpcf2127_wdt_settimeout(32);\n+#endif\n+\n+\treturn 0;\n }\n \n #ifdef CONFIG_OF\n@@ -427,6 +595,10 @@ static void __exit pcf2127_exit(void)\n {\n \tpcf2127_spi_unregister_driver();\n \tpcf2127_i2c_unregister_driver();\n+\n+#ifdef CONFIG_RTC_DRV_PCF2127_WDT\n+\tmisc_deregister(&pcf2127_wdt_miscdev);\n+#endif\n }\n module_exit(pcf2127_exit)\n \n", "prefixes": [ "1/2" ] }