From patchwork Thu Oct 21 20:22:54 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sam Protsenko X-Patchwork-Id: 1544606 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: bilbo.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.a=rsa-sha256 header.s=google header.b=bNrSEqcc; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org (client-ip=23.128.96.18; helo=vger.kernel.org; envelope-from=linux-rtc-owner@vger.kernel.org; receiver=) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by bilbo.ozlabs.org (Postfix) with ESMTP id 4HZzSR5Kf1z9sNH for ; Fri, 22 Oct 2021 07:23:03 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232002AbhJUUZS (ORCPT ); Thu, 21 Oct 2021 16:25:18 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37036 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231948AbhJUUZQ (ORCPT ); Thu, 21 Oct 2021 16:25:16 -0400 Received: from mail-ed1-x52e.google.com (mail-ed1-x52e.google.com [IPv6:2a00:1450:4864:20::52e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5CD2BC061764 for ; Thu, 21 Oct 2021 13:23:00 -0700 (PDT) Received: by mail-ed1-x52e.google.com with SMTP id u13so1148779edy.10 for ; Thu, 21 Oct 2021 13:23:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=jFmmxNUoXzyItR02/hWt9c3XRKJ19vzPlXV6udSTpt4=; b=bNrSEqccrWyxW5O/fFfOXrDgyI4vpRGtmC0FKdThUYwjxm3Z4fod8ssiNXKfTYyPPL Y/NqQGGas1xaGfw9teN0q8sWzGoJC3DOVoVMXHb1ECrSL4siHnDYtni9/QVlAB4L9U7s L2QhdBzmQXyR4pruNmy4D1iDGNmbVyuKWwqaQoXUjOXpkvqP/Wa2NNghau+hXUye2wcG fjU5Hv25eSscdTOr7SGpfHIj7oNgsnn2+309mXKJVjqf8ATXq+iDNC3U/fW2e80rsnvb ap4O84kPXluo9m91fSJt25qk0BxOzjz3hYa40ERrGDXRUTT7zw7Af6OVGPIrlP1IO2sP I20A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=jFmmxNUoXzyItR02/hWt9c3XRKJ19vzPlXV6udSTpt4=; b=t7PZWxjsTv2ggRHmOUgHWf7iONW+HWlprmIpWzfZk+ifOjhOZryBJCfMWn3UtZherp nGb5VT4xzsOzBtDyeyvenJfvgi0eOgdnH91cP42gnQ/hFug6lq/FqaqWogy71Xc+8wpf UZq8kcUgmbw7cL91fKF1hA8aRkVLECXPkOLDhfbguG0SVgW5ASeYPB9sKQfe758eYSJR ESlwfyAAuOLDEx2pvCzF8+JZCwdLSWO4UJ8b0iCQQegqpXTpY0LmvhZoBjXzuf2JnsFi 8MOLvu6lBc+sQGbO7FmSdquK3UB40glBIEn0cOmeipzv3tWfFSFQ7sn84eHNWAJYyt1U f3SA== X-Gm-Message-State: AOAM5315kJCSrbttq3DJQGrsKBib/iQ/ZxmL8AvPu4/22apDn3FBakfz 9Ymmr5C1BY3I5HR022VIeofrLsaBn8nam4Nw X-Google-Smtp-Source: ABdhPJze9WNulDK5lWspCtacI+kKYFt3IVm56pbEalSY+y9H8jClVr56yt2N2xjKVv5/7S5H53VNaA== X-Received: by 2002:a17:906:3913:: with SMTP id f19mr9457463eje.357.1634847778971; Thu, 21 Oct 2021 13:22:58 -0700 (PDT) Received: from localhost ([31.134.121.151]) by smtp.gmail.com with ESMTPSA id d4sm3384750edk.78.2021.10.21.13.22.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 21 Oct 2021 13:22:58 -0700 (PDT) From: Sam Protsenko To: Alessandro Zummo , Alexandre Belloni , Krzysztof Kozlowski Cc: linux-rtc@vger.kernel.org, linux-samsung-soc@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v2 1/3] rtc: s3c: Remove usage of devm_rtc_device_register() Date: Thu, 21 Oct 2021 23:22:54 +0300 Message-Id: <20211021202256.28517-2-semen.protsenko@linaro.org> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20211021202256.28517-1-semen.protsenko@linaro.org> References: <20211021202256.28517-1-semen.protsenko@linaro.org> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-rtc@vger.kernel.org devm_rtc_device_register() is deprecated. Use devm_rtc_allocate_device() and devm_rtc_register_device() API instead. This change doesn't change the behavior, but allows for further improvements. Signed-off-by: Sam Protsenko Reviewed-by: Krzysztof Kozlowski --- Changes in v2: - Added R-b tag by Krzysztof Kozlowski drivers/rtc/rtc-s3c.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/drivers/rtc/rtc-s3c.c b/drivers/rtc/rtc-s3c.c index e57d3ca70a78..10e591794276 100644 --- a/drivers/rtc/rtc-s3c.c +++ b/drivers/rtc/rtc-s3c.c @@ -447,15 +447,18 @@ static int s3c_rtc_probe(struct platform_device *pdev) device_init_wakeup(&pdev->dev, 1); - /* register RTC and exit */ - info->rtc = devm_rtc_device_register(&pdev->dev, "s3c", &s3c_rtcops, - THIS_MODULE); + info->rtc = devm_rtc_allocate_device(&pdev->dev); if (IS_ERR(info->rtc)) { - dev_err(&pdev->dev, "cannot attach rtc\n"); ret = PTR_ERR(info->rtc); goto err_nortc; } + info->rtc->ops = &s3c_rtcops; + + ret = devm_rtc_register_device(info->rtc); + if (ret) + goto err_nortc; + ret = devm_request_irq(&pdev->dev, info->irq_alarm, s3c_rtc_alarmirq, 0, "s3c2410-rtc alarm", info); if (ret) { From patchwork Thu Oct 21 20:22:55 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sam Protsenko X-Patchwork-Id: 1544608 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: bilbo.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.a=rsa-sha256 header.s=google header.b=KpEL68zc; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org (client-ip=23.128.96.18; helo=vger.kernel.org; envelope-from=linux-rtc-owner@vger.kernel.org; receiver=) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by bilbo.ozlabs.org (Postfix) with ESMTP id 4HZzSW0wpgz9sNH for ; Fri, 22 Oct 2021 07:23:07 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232122AbhJUUZV (ORCPT ); Thu, 21 Oct 2021 16:25:21 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37046 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232046AbhJUUZS (ORCPT ); Thu, 21 Oct 2021 16:25:18 -0400 Received: from mail-ed1-x534.google.com (mail-ed1-x534.google.com [IPv6:2a00:1450:4864:20::534]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D39E2C061764 for ; Thu, 21 Oct 2021 13:23:01 -0700 (PDT) Received: by mail-ed1-x534.google.com with SMTP id r4so1227885edi.5 for ; Thu, 21 Oct 2021 13:23:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=glchSb7LkrwxGNQCjKRWEsS5PvFIuTxlbK6/zONAkIk=; b=KpEL68zcVP+M4NooHb3dkc1TgMATaHrfumvlw3R/L77MotAqaKIp4mmYWMdH901vbE 1hBm4LFT8xQgTRLxPGcg54Zi0pWpPWZH8+wn9ZmT8/69CfCR4wlFEkTboUKq6nxZiyNX LFAcSxSg3JQyOnTXUJ3rX5BNUY0VVVGaPxEyxMfMpMLz5jS3LZhVWibB+BI4QhvZLePe 363NnHGU/sgIYaWud3EHbgeoH12U5+hQEjkiMeKGxtFe+c5T417zZe1215Aevzp0J+dn jKBRv/TSRHs4dOLXbuyTqZmZlmhTkuKdzABx/kGun0HpjGa0NgA2o57SSskrz6+8ivLV Tevg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=glchSb7LkrwxGNQCjKRWEsS5PvFIuTxlbK6/zONAkIk=; b=VnEdwgJyCZrkgVPjah8TzR1VUE1s1JMiPT3th9JwvBJ7V942aB9qtJcYWhjH7t0E7B bSJA1J78/Z5UNrLLESb1uwhI38dI6ijSwsp1zJ9zs21oRWGX30l4GWkRzCbyL+w6qqCv XuHn7U/kYjTdYSbSue9oK/0EJfpPdIWQQaYcbJeRWKj7HOSE1KB2YF4/3D8e//+2KToL yc2iY5SR/5c82CvCU6s5tO8W1Z79c+CoVXJSd/xzqJtZMb8W2gRlNhGtPDv4NN2rHqXL w1X1JaiIrJve7/GdvG6zvyFiu4tLx6suHU+Pnsp9gs4fUyRBaMQRc9CDf7Oc9NQ3QeZZ /kgw== X-Gm-Message-State: AOAM53323RbKIxEfJ/swumm6z85Y4VMe9nbb+3wvbyniRR546oVLShJR m/9KCCoZJoFJ1ykJJeDg5HRyNw== X-Google-Smtp-Source: ABdhPJwGeJvBtPf3xpLbNfsPi1DeSjqR5ZXTBomes2A/ND+cndS3US8/3BpLTUmiyjcHNr4JBnv3Jw== X-Received: by 2002:a17:906:6ad0:: with SMTP id q16mr1793021ejs.552.1634847780482; Thu, 21 Oct 2021 13:23:00 -0700 (PDT) Received: from localhost ([31.134.121.151]) by smtp.gmail.com with ESMTPSA id p10sm3369779edj.91.2021.10.21.13.22.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 21 Oct 2021 13:23:00 -0700 (PDT) From: Sam Protsenko To: Alessandro Zummo , Alexandre Belloni , Krzysztof Kozlowski Cc: linux-rtc@vger.kernel.org, linux-samsung-soc@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v2 2/3] rtc: s3c: Extract read/write IO into separate functions Date: Thu, 21 Oct 2021 23:22:55 +0300 Message-Id: <20211021202256.28517-3-semen.protsenko@linaro.org> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20211021202256.28517-1-semen.protsenko@linaro.org> References: <20211021202256.28517-1-semen.protsenko@linaro.org> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-rtc@vger.kernel.org Create dedicated functions for I/O operations and BCD conversion. It can be useful to separate those from representation conversion and other stuff found in RTC callbacks. This patch does not introduce any functional changes, it's merely refactoring change. Signed-off-by: Sam Protsenko Reviewed-by: Krzysztof Kozlowski --- Changes in v2: - Added R-b tag by Krzysztof Kozlowski - Changed the commit message wording a bit drivers/rtc/rtc-s3c.c | 98 +++++++++++++++++++++++++++---------------- 1 file changed, 61 insertions(+), 37 deletions(-) diff --git a/drivers/rtc/rtc-s3c.c b/drivers/rtc/rtc-s3c.c index 10e591794276..d1baf655c008 100644 --- a/drivers/rtc/rtc-s3c.c +++ b/drivers/rtc/rtc-s3c.c @@ -127,10 +127,9 @@ static int s3c_rtc_setaie(struct device *dev, unsigned int enabled) return ret; } -/* Time read/write */ -static int s3c_rtc_gettime(struct device *dev, struct rtc_time *rtc_tm) +/* Read time from RTC and convert it from BCD */ +static int s3c_rtc_read_time(struct s3c_rtc *info, struct rtc_time *tm) { - struct s3c_rtc *info = dev_get_drvdata(dev); unsigned int have_retried = 0; int ret; @@ -139,54 +138,40 @@ static int s3c_rtc_gettime(struct device *dev, struct rtc_time *rtc_tm) return ret; retry_get_time: - rtc_tm->tm_min = readb(info->base + S3C2410_RTCMIN); - rtc_tm->tm_hour = readb(info->base + S3C2410_RTCHOUR); - rtc_tm->tm_mday = readb(info->base + S3C2410_RTCDATE); - rtc_tm->tm_mon = readb(info->base + S3C2410_RTCMON); - rtc_tm->tm_year = readb(info->base + S3C2410_RTCYEAR); - rtc_tm->tm_sec = readb(info->base + S3C2410_RTCSEC); - - /* the only way to work out whether the system was mid-update + tm->tm_min = readb(info->base + S3C2410_RTCMIN); + tm->tm_hour = readb(info->base + S3C2410_RTCHOUR); + tm->tm_mday = readb(info->base + S3C2410_RTCDATE); + tm->tm_mon = readb(info->base + S3C2410_RTCMON); + tm->tm_year = readb(info->base + S3C2410_RTCYEAR); + tm->tm_sec = readb(info->base + S3C2410_RTCSEC); + + /* + * The only way to work out whether the system was mid-update * when we read it is to check the second counter, and if it * is zero, then we re-try the entire read */ - - if (rtc_tm->tm_sec == 0 && !have_retried) { + if (tm->tm_sec == 0 && !have_retried) { have_retried = 1; goto retry_get_time; } - rtc_tm->tm_sec = bcd2bin(rtc_tm->tm_sec); - rtc_tm->tm_min = bcd2bin(rtc_tm->tm_min); - rtc_tm->tm_hour = bcd2bin(rtc_tm->tm_hour); - rtc_tm->tm_mday = bcd2bin(rtc_tm->tm_mday); - rtc_tm->tm_mon = bcd2bin(rtc_tm->tm_mon); - rtc_tm->tm_year = bcd2bin(rtc_tm->tm_year); - s3c_rtc_disable_clk(info); - rtc_tm->tm_year += 100; - rtc_tm->tm_mon -= 1; + tm->tm_sec = bcd2bin(tm->tm_sec); + tm->tm_min = bcd2bin(tm->tm_min); + tm->tm_hour = bcd2bin(tm->tm_hour); + tm->tm_mday = bcd2bin(tm->tm_mday); + tm->tm_mon = bcd2bin(tm->tm_mon); + tm->tm_year = bcd2bin(tm->tm_year); - dev_dbg(dev, "read time %ptR\n", rtc_tm); return 0; } -static int s3c_rtc_settime(struct device *dev, struct rtc_time *tm) +/* Convert time to BCD and write it to RTC */ +static int s3c_rtc_write_time(struct s3c_rtc *info, const struct rtc_time *tm) { - struct s3c_rtc *info = dev_get_drvdata(dev); - int year = tm->tm_year - 100; int ret; - dev_dbg(dev, "set time %ptR\n", tm); - - /* we get around y2k by simply not supporting it */ - - if (year < 0 || year >= 100) { - dev_err(dev, "rtc only supports 100 years\n"); - return -EINVAL; - } - ret = s3c_rtc_enable_clk(info); if (ret) return ret; @@ -195,14 +180,53 @@ static int s3c_rtc_settime(struct device *dev, struct rtc_time *tm) writeb(bin2bcd(tm->tm_min), info->base + S3C2410_RTCMIN); writeb(bin2bcd(tm->tm_hour), info->base + S3C2410_RTCHOUR); writeb(bin2bcd(tm->tm_mday), info->base + S3C2410_RTCDATE); - writeb(bin2bcd(tm->tm_mon + 1), info->base + S3C2410_RTCMON); - writeb(bin2bcd(year), info->base + S3C2410_RTCYEAR); + writeb(bin2bcd(tm->tm_mon), info->base + S3C2410_RTCMON); + writeb(bin2bcd(tm->tm_year), info->base + S3C2410_RTCYEAR); s3c_rtc_disable_clk(info); return 0; } +static int s3c_rtc_gettime(struct device *dev, struct rtc_time *tm) +{ + struct s3c_rtc *info = dev_get_drvdata(dev); + int ret; + + ret = s3c_rtc_read_time(info, tm); + if (ret) + return ret; + + /* Convert internal representation to actual date/time */ + tm->tm_year += 100; + tm->tm_mon -= 1; + + dev_dbg(dev, "read time %ptR\n", tm); + return 0; +} + +static int s3c_rtc_settime(struct device *dev, struct rtc_time *tm) +{ + struct s3c_rtc *info = dev_get_drvdata(dev); + struct rtc_time rtc_tm = *tm; + + dev_dbg(dev, "set time %ptR\n", tm); + + /* + * Convert actual date/time to internal representation. + * We get around Y2K by simply not supporting it. + */ + rtc_tm.tm_year -= 100; + rtc_tm.tm_mon += 1; + + if (rtc_tm.tm_year < 0 || rtc_tm.tm_year >= 100) { + dev_err(dev, "rtc only supports 100 years\n"); + return -EINVAL; + } + + return s3c_rtc_write_time(info, &rtc_tm); +} + static int s3c_rtc_getalarm(struct device *dev, struct rtc_wkalrm *alrm) { struct s3c_rtc *info = dev_get_drvdata(dev); From patchwork Thu Oct 21 20:22:56 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sam Protsenko X-Patchwork-Id: 1544609 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: bilbo.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.a=rsa-sha256 header.s=google header.b=xZaim99s; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org (client-ip=23.128.96.18; helo=vger.kernel.org; envelope-from=linux-rtc-owner@vger.kernel.org; receiver=) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by bilbo.ozlabs.org (Postfix) with ESMTP id 4HZzSb1klcz9sNH for ; Fri, 22 Oct 2021 07:23:11 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232139AbhJUUZX (ORCPT ); Thu, 21 Oct 2021 16:25:23 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37068 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232108AbhJUUZV (ORCPT ); Thu, 21 Oct 2021 16:25:21 -0400 Received: from mail-ed1-x529.google.com (mail-ed1-x529.google.com [IPv6:2a00:1450:4864:20::529]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 4F8B2C061225 for ; Thu, 21 Oct 2021 13:23:03 -0700 (PDT) Received: by mail-ed1-x529.google.com with SMTP id g10so5446824edj.1 for ; Thu, 21 Oct 2021 13:23:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=FoCS2Of8JxmjrHA0ciYvVff3O/0PQ9jcwIzAZgxkZS4=; b=xZaim99sf1bhVyq0cz+y+AGLha2Rs85XXTMdgylFks8k1SKW0pM6Tf4ovbIHHTJm7a f5k7Kc/crnsPDQWV92l8nrxWK26UPS0UA+rBvHaM2ffryWvXOWI8H+Vc12Tq2LKjphVs wzjP56H05iTP5rL9g/zdrJ2L6raRN3zejvpMVVn9veKSfip5gnXk19/TJYGMM3Cs6Xro NiV7ep6Y1Es7b4YDM39aRn7Qzq1XDw0L/B1nl0TMSmfxpJ8SPH0oTL+60Uvt5Zohr7Vz 5qn3lg2t4TNzdHxT2nEQBsMV5NBCg2afSX3CPIj72gsISFp6/SGISgJ86s1J9/wes7lJ ge4g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=FoCS2Of8JxmjrHA0ciYvVff3O/0PQ9jcwIzAZgxkZS4=; b=WYxCDTGVMRU07S8/MRgONZpJFT/VRUG/TrhdLMroKEtDg6ZjxFOCna+02mg6vuYfpy nnJ59nWOr4uuzOLaX/eZi+VNDXsLI/FzhrjBv4Lqgakz0L1Mk+b04HgTUXYW3UsEUiAQ RpLRlB0qV2yw0geiWfzFl+dzS6dtSZBfH6XgK5cJwbkq1ESHbjw9TdSvidoB5WD5vj/R juUPO5W9mqzKUSQHYnabKdjijPkLxgcozmr3b1xInM9wClJrLzNqU7gB3uHX4y9fHiu5 XlF9wGEHzHbpqqSo5VWpJwA6wL1eE+Nel+d4c1BF3mNQUIk5Hc1XI1I5H17OKTF2BFT3 eW5w== X-Gm-Message-State: AOAM533f6tHX+YZTRSXx77+vhduG/JfPmKKlpir0+mi5MWICrgKrbTjQ QAq2LqWqVlkCpyx4Btlh8kl+xg== X-Google-Smtp-Source: ABdhPJzNwPC1x2uv2WuF6tsvx9+hXHVKaMH2Rdw3WklOnENLjkro6EEJq++2tcWXb/uSqXPiBfPnBg== X-Received: by 2002:a17:906:181a:: with SMTP id v26mr2131988eje.478.1634847781841; Thu, 21 Oct 2021 13:23:01 -0700 (PDT) Received: from localhost ([31.134.121.151]) by smtp.gmail.com with ESMTPSA id u18sm3293456eds.86.2021.10.21.13.23.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 21 Oct 2021 13:23:01 -0700 (PDT) From: Sam Protsenko To: Alessandro Zummo , Alexandre Belloni , Krzysztof Kozlowski Cc: linux-rtc@vger.kernel.org, linux-samsung-soc@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v2 3/3] rtc: s3c: Add time range Date: Thu, 21 Oct 2021 23:22:56 +0300 Message-Id: <20211021202256.28517-4-semen.protsenko@linaro.org> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20211021202256.28517-1-semen.protsenko@linaro.org> References: <20211021202256.28517-1-semen.protsenko@linaro.org> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-rtc@vger.kernel.org This RTC driver starts counting from 2000 to avoid Y2K problem. Also it only supports 100 years range for all RTCs. Provide that info to RTC framework. Also remove check for 100 years range in s3c_rtc_settime(), as RTC core won't pass any invalid values to the driver, now that correct range is set. Here is the rationale on 100 years range limitation. Info on different Samsung RTCs (credit goes to Krzysztof Kozlowski): - All S3C chips have only 8-bit wide year register (can store 100 years range in BCD format) - S5Pv210 and Exynos chips have 12-bit year register (can store 1000 years range in BCD format) But in reality we usually can't make use of those 12 bits either: - RTCs might think that both 2000 and 2100 years are leap years. So when the YEAR register is 0, RTC goes from 28 Feb to 29 Feb, and when the YEAR register is 100, RTC also goes from 28 Feb to 29 Feb. This is of course incorrect: RTC breaks leap year criteria, which breaks the time contiguity, which leads to inability to use the RTC after year of 2099. It was found for example on Exynos850 SoC. - Despite having 12 bits for holding the year value, RTC might overflow the year value internally much earlier. For example, on Exynos850 the RTC overflows when YEAR=159, making the next YEAR=0. This way RTC actually has range of 160 years, not 1000 as one may think. All that said, there is no sense in trying to increase the time range for more than 100 years on RTCs that seem capable of that. It also doesn't have too much practical value -- current hardware will be probably obsolete by 2100. Tested manually on Exynos850 RTC: $ date -s "1999-12-31 23:59:50" $ hwclock -w -f /dev/rtc0 $ date -s "2100-01-01 00:00:00" $ hwclock -w -f /dev/rtc0 $ date -s "2000-01-01 00:00:00" $ hwclock -w -f /dev/rtc0 $ hwclock -r -f /dev/rtc0 $ date -s "2099-12-31 23:59:50" $ hwclock -w -f /dev/rtc0 $ hwclock -r -f /dev/rtc0 Signed-off-by: Sam Protsenko Reviewed-by: Krzysztof Kozlowski --- Changes in v2: - Removed check for 100 years range in s3c_rtc_settime() - Improved the commit message drivers/rtc/rtc-s3c.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/drivers/rtc/rtc-s3c.c b/drivers/rtc/rtc-s3c.c index d1baf655c008..db529733c9c4 100644 --- a/drivers/rtc/rtc-s3c.c +++ b/drivers/rtc/rtc-s3c.c @@ -219,11 +219,6 @@ static int s3c_rtc_settime(struct device *dev, struct rtc_time *tm) rtc_tm.tm_year -= 100; rtc_tm.tm_mon += 1; - if (rtc_tm.tm_year < 0 || rtc_tm.tm_year >= 100) { - dev_err(dev, "rtc only supports 100 years\n"); - return -EINVAL; - } - return s3c_rtc_write_time(info, &rtc_tm); } @@ -478,6 +473,8 @@ static int s3c_rtc_probe(struct platform_device *pdev) } info->rtc->ops = &s3c_rtcops; + info->rtc->range_min = RTC_TIMESTAMP_BEGIN_2000; + info->rtc->range_max = RTC_TIMESTAMP_END_2099; ret = devm_rtc_register_device(info->rtc); if (ret)