get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/806527/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 806527,
    "url": "http://patchwork.ozlabs.org/api/patches/806527/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/rtc-linux/patch/20170828111041.17946-3-afaerber@suse.de/",
    "project": {
        "id": 9,
        "url": "http://patchwork.ozlabs.org/api/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": "<20170828111041.17946-3-afaerber@suse.de>",
    "list_archive_url": null,
    "date": "2017-08-28T11:10:40",
    "name": "[v3,2/3] rtc: Add Realtek RTD1295",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": false,
    "hash": "7f179fdb406f4d2a74d1b1bf1d1d6033b4108123",
    "submitter": {
        "id": 9542,
        "url": "http://patchwork.ozlabs.org/api/people/9542/?format=api",
        "name": "Andreas Färber",
        "email": "afaerber@suse.de"
    },
    "delegate": null,
    "mbox": "http://patchwork.ozlabs.org/project/rtc-linux/patch/20170828111041.17946-3-afaerber@suse.de/mbox/",
    "series": [
        {
            "id": 134,
            "url": "http://patchwork.ozlabs.org/api/series/134/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/rtc-linux/list/?series=134",
            "date": "2017-08-28T11:10:38",
            "name": "arm64: Realtek RTD1295 RTC",
            "version": 3,
            "mbox": "http://patchwork.ozlabs.org/series/134/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/806527/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/806527/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<linux-rtc-owner@vger.kernel.org>",
        "X-Original-To": "incoming@patchwork.ozlabs.org",
        "Delivered-To": "patchwork-incoming@bilbo.ozlabs.org",
        "Authentication-Results": "ozlabs.org;\n\tspf=none (mailfrom) smtp.mailfrom=vger.kernel.org\n\t(client-ip=209.132.180.67; helo=vger.kernel.org;\n\tenvelope-from=linux-rtc-owner@vger.kernel.org;\n\treceiver=<UNKNOWN>)",
        "Received": [
            "from vger.kernel.org (vger.kernel.org [209.132.180.67])\n\tby ozlabs.org (Postfix) with ESMTP id 3xgpxt0zySz9s8J\n\tfor <incoming@patchwork.ozlabs.org>;\n\tMon, 28 Aug 2017 21:12:02 +1000 (AEST)",
            "(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n\tid S1751572AbdH1LLr (ORCPT <rfc822;incoming@patchwork.ozlabs.org>);\n\tMon, 28 Aug 2017 07:11:47 -0400",
            "from mx2.suse.de ([195.135.220.15]:38486 \"EHLO mx1.suse.de\"\n\trhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP\n\tid S1751271AbdH1LKx (ORCPT <rfc822;linux-rtc@vger.kernel.org>);\n\tMon, 28 Aug 2017 07:10:53 -0400",
            "from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254])\n\tby mx1.suse.de (Postfix) with ESMTP id 174A6AB9D;\n\tMon, 28 Aug 2017 11:10:52 +0000 (UTC)"
        ],
        "X-Virus-Scanned": "by amavisd-new at test-mx.suse.de",
        "From": "=?utf-8?q?Andreas_F=C3=A4rber?= <afaerber@suse.de>",
        "To": "Alessandro Zummo <a.zummo@towertech.it>,\n\tAlexandre Belloni <alexandre.belloni@free-electrons.com>,\n\tlinux-rtc@vger.kernel.org, linux-arm-kernel@lists.infradead.org",
        "Cc": "linux-kernel@vger.kernel.org, Roc He <hepeng@zidoo.tv>, =?utf-8?b?6JKL?=\n\t=?utf-8?b?5Li955C0?= <jiang.liqin@geniatech.com>,\n\t=?utf-8?q?Andreas_F=C3=A4rber?= <afaerber@suse.de>",
        "Subject": "[PATCH v3 2/3] rtc: Add Realtek RTD1295",
        "Date": "Mon, 28 Aug 2017 13:10:40 +0200",
        "Message-Id": "<20170828111041.17946-3-afaerber@suse.de>",
        "X-Mailer": "git-send-email 2.12.3",
        "In-Reply-To": "<20170828111041.17946-1-afaerber@suse.de>",
        "References": "<20170828111041.17946-1-afaerber@suse.de>",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain; charset=UTF-8",
        "Content-Transfer-Encoding": "8bit",
        "Sender": "linux-rtc-owner@vger.kernel.org",
        "Precedence": "bulk",
        "List-ID": "<linux-rtc.vger.kernel.org>",
        "X-Mailing-List": "linux-rtc@vger.kernel.org"
    },
    "content": "Based on QNAP's arch/arm/mach-rtk119x/driver/rtk_rtc_drv.c code and\nmach-rtk119x/driver/dc2vo/fpga/include/mis_reg.h register definitions.\n\nThe base year 2014 was observed on all of Zidoo X9S, ProBox2 Ava and\nBeelink Lake I.\n\nSigned-off-by: Andreas Färber <afaerber@suse.de>\n---\n v2 -> v3:\n * Dropped spinlock (Andrew)\n * Refactored days-in-year helper to avoid rtc_year_days()\n \n v1 -> v2:\n * Dropped open/release in favor of probe/remove (Alexandre)\n * read_time: Reordered register accesses (Alexandre)\n * read_time/set_time: Refactored day calculations to avoid time64_t (Alexandre)\n * read_time: Retry if seconds change (Alexandre)\n * probe: Added missing RTCACR initialization code\n * set_time: Fixed year check (off by 1900)\n * set_time: Fixed new seconds (off by factor two)\n * Cleaned up debug output (Andrew)\n * Added spinlocks around register accesses\n * Added masks for register fields\n \n drivers/rtc/Kconfig       |   8 ++\n drivers/rtc/Makefile      |   1 +\n drivers/rtc/rtc-rtd119x.c | 241 ++++++++++++++++++++++++++++++++++++++++++++++\n 3 files changed, 250 insertions(+)\n create mode 100644 drivers/rtc/rtc-rtd119x.c",
    "diff": "diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig\nindex 22efa21b1d81..d5a46f311ecb 100644\n--- a/drivers/rtc/Kconfig\n+++ b/drivers/rtc/Kconfig\n@@ -1765,6 +1765,14 @@ config RTC_DRV_CPCAP\n \t   Say y here for CPCAP rtc found on some Motorola phones\n \t   and tablets such as Droid 4.\n \n+config RTC_DRV_RTD119X\n+\tbool \"Realtek RTD129x RTC\"\n+\tdepends on ARCH_REALTEK || COMPILE_TEST\n+\tdefault ARCH_REALTEK\n+\thelp\n+\t  If you say yes here, you get support for the RTD1295 SoC\n+\t  Real Time Clock.\n+\n comment \"HID Sensor RTC drivers\"\n \n config RTC_DRV_HID_SENSOR_TIME\ndiff --git a/drivers/rtc/Makefile b/drivers/rtc/Makefile\nindex acd366b41c85..55a0a5ca45b0 100644\n--- a/drivers/rtc/Makefile\n+++ b/drivers/rtc/Makefile\n@@ -131,6 +131,7 @@ obj-$(CONFIG_RTC_DRV_RP5C01)\t+= rtc-rp5c01.o\n obj-$(CONFIG_RTC_DRV_RS5C313)\t+= rtc-rs5c313.o\n obj-$(CONFIG_RTC_DRV_RS5C348)\t+= rtc-rs5c348.o\n obj-$(CONFIG_RTC_DRV_RS5C372)\t+= rtc-rs5c372.o\n+obj-$(CONFIG_RTC_DRV_RTD119X)\t+= rtc-rtd119x.o\n obj-$(CONFIG_RTC_DRV_RV3029C2)\t+= rtc-rv3029c2.o\n obj-$(CONFIG_RTC_DRV_RV8803)\t+= rtc-rv8803.o\n obj-$(CONFIG_RTC_DRV_RX4581)\t+= rtc-rx4581.o\ndiff --git a/drivers/rtc/rtc-rtd119x.c b/drivers/rtc/rtc-rtd119x.c\nnew file mode 100644\nindex 000000000000..526f586d0355\n--- /dev/null\n+++ b/drivers/rtc/rtc-rtd119x.c\n@@ -0,0 +1,241 @@\n+/*\n+ * Realtek RTD129x RTC\n+ *\n+ * Copyright (c) 2017 Andreas Färber\n+ *\n+ * SPDX-License-Identifier: GPL-2.0+\n+ */\n+\n+#include <linux/clk.h>\n+#include <linux/io.h>\n+#include <linux/module.h>\n+#include <linux/of.h>\n+#include <linux/of_address.h>\n+#include <linux/platform_device.h>\n+#include <linux/rtc.h>\n+#include <linux/spinlock.h>\n+\n+#define RTD_RTCSEC\t\t0x00\n+#define RTD_RTCMIN\t\t0x04\n+#define RTD_RTCHR\t\t0x08\n+#define RTD_RTCDATE1\t\t0x0c\n+#define RTD_RTCDATE2\t\t0x10\n+#define RTD_RTCACR\t\t0x28\n+#define RTD_RTCEN\t\t0x2c\n+#define RTD_RTCCR\t\t0x30\n+\n+#define RTD_RTCSEC_RTCSEC_MASK\t\t0x7f\n+\n+#define RTD_RTCMIN_RTCMIN_MASK\t\t0x3f\n+\n+#define RTD_RTCHR_RTCHR_MASK\t\t0x1f\n+\n+#define RTD_RTCDATE1_RTCDATE1_MASK\t0xff\n+\n+#define RTD_RTCDATE2_RTCDATE2_MASK\t0x7f\n+\n+#define RTD_RTCACR_RTCPWR\t\tBIT(7)\n+\n+#define RTD_RTCEN_RTCEN_MASK\t\t0xff\n+\n+#define RTD_RTCCR_RTCRST\t\tBIT(6)\n+\n+struct rtd119x_rtc {\n+\tvoid __iomem *base;\n+\tstruct clk *clk;\n+\tstruct rtc_device *rtcdev;\n+\tunsigned int base_year;\n+};\n+\n+static inline int rtd119x_rtc_days_in_year(int year)\n+{\n+\treturn 365 + (is_leap_year(year) ? 1 : 0);\n+}\n+\n+static void rtd119x_rtc_reset(struct device *dev)\n+{\n+\tstruct rtd119x_rtc *data = dev_get_drvdata(dev);\n+\tu32 val;\n+\n+\tval = readl_relaxed(data->base + RTD_RTCCR);\n+\tval |= RTD_RTCCR_RTCRST;\n+\twritel_relaxed(val, data->base + RTD_RTCCR);\n+\n+\tval &= ~RTD_RTCCR_RTCRST;\n+\twritel(val, data->base + RTD_RTCCR);\n+}\n+\n+static void rtd119x_rtc_set_enabled(struct device *dev, bool enable)\n+{\n+\tstruct rtd119x_rtc *data = dev_get_drvdata(dev);\n+\tu32 val;\n+\n+\tval = readl_relaxed(data->base + RTD_RTCEN);\n+\tif (enable) {\n+\t\tif ((val & RTD_RTCEN_RTCEN_MASK) == 0x5a)\n+\t\t\treturn;\n+\t\twritel_relaxed(0x5a, data->base + RTD_RTCEN);\n+\t} else {\n+\t\twritel_relaxed(0, data->base + RTD_RTCEN);\n+\t}\n+}\n+\n+static int rtd119x_rtc_read_time(struct device *dev, struct rtc_time *tm)\n+{\n+\tstruct rtd119x_rtc *data = dev_get_drvdata(dev);\n+\ts32 day;\n+\tu32 sec;\n+\tunsigned int year;\n+\tint tries = 0;\n+\n+\twhile (true) {\n+\t\ttm->tm_sec = (readl_relaxed(data->base + RTD_RTCSEC) & RTD_RTCSEC_RTCSEC_MASK) >> 1;\n+\t\ttm->tm_min  = readl_relaxed(data->base + RTD_RTCMIN) & RTD_RTCMIN_RTCMIN_MASK;\n+\t\ttm->tm_hour = readl_relaxed(data->base + RTD_RTCHR) & RTD_RTCHR_RTCHR_MASK;\n+\t\tday  =  readl_relaxed(data->base + RTD_RTCDATE1) & RTD_RTCDATE1_RTCDATE1_MASK;\n+\t\tday |= (readl_relaxed(data->base + RTD_RTCDATE2) & RTD_RTCDATE2_RTCDATE2_MASK) << 8;\n+\t\tsec  = (readl_relaxed(data->base + RTD_RTCSEC) & RTD_RTCSEC_RTCSEC_MASK) >> 1;\n+\t\ttries++;\n+\n+\t\tif (sec == tm->tm_sec)\n+\t\t\tbreak;\n+\n+\t\tif (tries >= 3)\n+\t\t\treturn -EINVAL;\n+\t}\n+\tif (tries > 1)\n+\t\tdev_dbg(dev, \"%s: needed %i tries\\n\", __func__, tries);\n+\n+\tyear = data->base_year;\n+\twhile (day >= rtd119x_rtc_days_in_year(year)) {\n+\t\tday -= rtd119x_rtc_days_in_year(year);\n+\t\tyear++;\n+\t}\n+\ttm->tm_year = year - 1900;\n+\ttm->tm_yday = day;\n+\n+\ttm->tm_mon = 0;\n+\twhile (day >= rtc_month_days(tm->tm_mon, year)) {\n+\t\tday -= rtc_month_days(tm->tm_mon, year);\n+\t\ttm->tm_mon++;\n+\t}\n+\ttm->tm_mday = day + 1;\n+\n+\treturn 0;\n+}\n+\n+static int rtd119x_rtc_set_time(struct device *dev, struct rtc_time *tm)\n+{\n+\tstruct rtd119x_rtc *data = dev_get_drvdata(dev);\n+\tunsigned int day;\n+\tint i;\n+\n+\tif (1900 + tm->tm_year < data->base_year)\n+\t\treturn -EINVAL;\n+\n+\tday = 0;\n+\tfor (i = data->base_year; i < 1900 + tm->tm_year; i++)\n+\t\tday += rtd119x_rtc_days_in_year(i);\n+\n+\tday += tm->tm_yday;\n+\tif (day > 0x7fff)\n+\t\treturn -EINVAL;\n+\n+\trtd119x_rtc_set_enabled(dev, false);\n+\n+\twritel_relaxed((tm->tm_sec << 1) & RTD_RTCSEC_RTCSEC_MASK, data->base + RTD_RTCSEC);\n+\twritel_relaxed(tm->tm_min & RTD_RTCMIN_RTCMIN_MASK, data->base + RTD_RTCMIN);\n+\twritel_relaxed(tm->tm_hour & RTD_RTCHR_RTCHR_MASK, data->base + RTD_RTCHR);\n+\twritel_relaxed(day & RTD_RTCDATE1_RTCDATE1_MASK, data->base + RTD_RTCDATE1);\n+\twritel_relaxed((day >> 8) & RTD_RTCDATE2_RTCDATE2_MASK, data->base + RTD_RTCDATE2);\n+\n+\trtd119x_rtc_set_enabled(dev, true);\n+\n+\treturn 0;\n+}\n+\n+static const struct rtc_class_ops rtd119x_rtc_ops = {\n+\t.read_time\t= rtd119x_rtc_read_time,\n+\t.set_time\t= rtd119x_rtc_set_time,\n+};\n+\n+static const struct of_device_id rtd119x_rtc_dt_ids[] = {\n+\t { .compatible = \"realtek,rtd1295-rtc\" },\n+\t { }\n+};\n+\n+static int rtd119x_rtc_probe(struct platform_device *pdev)\n+{\n+\tstruct rtd119x_rtc *data;\n+\tstruct resource *res;\n+\tu32 val;\n+\tint ret;\n+\n+\tdata = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL);\n+\tif (!data)\n+\t\treturn -ENOMEM;\n+\n+\tplatform_set_drvdata(pdev, data);\n+\tdata->base_year = 2014;\n+\n+\tres = platform_get_resource(pdev, IORESOURCE_MEM, 0);\n+\tdata->base = devm_ioremap_resource(&pdev->dev, res);\n+\tif (IS_ERR(data->base))\n+\t\treturn PTR_ERR(data->base);\n+\n+\tdata->clk = of_clk_get(pdev->dev.of_node, 0);\n+\tif (IS_ERR(data->clk))\n+\t\treturn PTR_ERR(data->clk);\n+\n+\tret = clk_prepare_enable(data->clk);\n+\tif (ret) {\n+\t\tclk_put(data->clk);\n+\t\treturn ret;\n+\t}\n+\n+\tval = readl_relaxed(data->base + RTD_RTCACR);\n+\tif (!(val & RTD_RTCACR_RTCPWR)) {\n+\t\twritel_relaxed(RTD_RTCACR_RTCPWR, data->base + RTD_RTCACR);\n+\n+\t\trtd119x_rtc_reset(&pdev->dev);\n+\n+\t\twritel_relaxed(0, data->base + RTD_RTCMIN);\n+\t\twritel_relaxed(0, data->base + RTD_RTCHR);\n+\t\twritel_relaxed(0, data->base + RTD_RTCDATE1);\n+\t\twritel_relaxed(0, data->base + RTD_RTCDATE2);\n+\t}\n+\n+\trtd119x_rtc_set_enabled(&pdev->dev, true);\n+\n+\tdata->rtcdev = devm_rtc_device_register(&pdev->dev, \"rtc\",\n+\t\t\t\t&rtd119x_rtc_ops, THIS_MODULE);\n+\tif (IS_ERR(data->rtcdev)) {\n+\t\tdev_err(&pdev->dev, \"failed to register rtc device\");\n+\t\tclk_disable_unprepare(data->clk);\n+\t\tclk_put(data->clk);\n+\t\treturn PTR_ERR(data->rtcdev);\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static int rtd119x_rtc_remove(struct platform_device *pdev)\n+{\n+\tstruct rtd119x_rtc *data = platform_get_drvdata(pdev);\n+\n+\trtd119x_rtc_set_enabled(&pdev->dev, false);\n+\n+\tclk_disable_unprepare(data->clk);\n+\n+\treturn 0;\n+}\n+\n+static struct platform_driver rtd119x_rtc_driver = {\n+\t.probe = rtd119x_rtc_probe,\n+\t.remove = rtd119x_rtc_remove,\n+\t.driver = {\n+\t\t.name = \"rtd1295-rtc\",\n+\t\t.of_match_table\t= rtd119x_rtc_dt_ids,\n+\t},\n+};\n+builtin_platform_driver(rtd119x_rtc_driver);\n",
    "prefixes": [
        "v3",
        "2/3"
    ]
}