Received: by 2002:a05:6a10:5bc5:0:0:0:0 with SMTP id os5csp986017pxb; Thu, 21 Oct 2021 13:25:38 -0700 (PDT) X-Google-Smtp-Source: ABdhPJz6/KK+ud8ddP1csh208Jd041Z+iR1AIW3xPwbSMsD7W4cpoMIlGRmROkw40zNvncx2PrZf X-Received: by 2002:a05:6402:34d2:: with SMTP id w18mr10656539edc.172.1634847938392; Thu, 21 Oct 2021 13:25:38 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1634847938; cv=none; d=google.com; s=arc-20160816; b=gOZ2e3dUuWxSFQNrXAgNMBOI6jdlKgn/2UHJ8q3NGmTxT9fNQ9QduvR6sGKA452CpI RKjnWCpyZXu+cWcRmc3Rg95JyzhsrNpA25jQC9WE1qLGu9j/0+XLopPI/KajVd1e5AWz g2DGyZnsZW5KK6I+YgDMC3+ieY+FM79O1w3otqosQ6eNklVd5X5OYy9GJ4tu/36W0ljC 7pQ+VIBRhCKg4CpULsCK2c3sNnd2DcTSEgSheedMvPP4z9wbal7XhHoC7Xq4VeZZrA4j NIcJafziyvHevu8RTQp7xe6KKjbqgASKTjmLFQHiQ/vcCFfOOymp0zmuO6fnHKeUzdPj gdgg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=glchSb7LkrwxGNQCjKRWEsS5PvFIuTxlbK6/zONAkIk=; b=DNjLjOvWo0ddPoz/OwZ7eEiWJCCdVA5hbxpY+o0O7TpnebsMkGBuGBGtzhPpJ7x4BB LRjkjmo4AaUTmTnuJROuqxcgvBJRL1VsOIMkdHv7cskoAi4+uLAkhPNip+twWfJC2Bpe YR/hpYFmtOlddoChCIOiT9/6LqVz4cdUITq8J3gC48EpJwJGi01YEwuqA+oFbckPu72q 6VEHV9jZJB+Y0N4m0Kgjay54pCgAAPYZMzYhPsmj6uF4erevASu1PkQoTqdkC2PS53qj PDz3YRQmawqeJ779GOY+ufu5aK5GAVsN+eHQXFWzik3qowj3PUktbflSXpkm/VkLCuKX 93Bg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=KpEL68zc; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id m1si8190623ejl.787.2021.10.21.13.25.14; Thu, 21 Oct 2021 13:25:38 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=KpEL68zc; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232070AbhJUUZW (ORCPT + 99 others); Thu, 21 Oct 2021 16:25:22 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37054 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232057AbhJUUZS (ORCPT ); Thu, 21 Oct 2021 16:25:18 -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 104FFC061348 for ; Thu, 21 Oct 2021 13:23:02 -0700 (PDT) Received: by mail-ed1-x529.google.com with SMTP id g8so5501376edb.12 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=c0IwhLk3QxP5YtAuNKUpi3zO+cL5545MLC2a/seyrvY6vFCd2YhV+HW76/ijR/myNJ wr5UA5lfsP2SmA8lijgXF676Hd/vY+OUmcw2MGNc1K7l3+S6nyk5Ph59eowfqG+3Zn0Y bP+MXvy+h2GZzMpjW88VqbCGG2xz77TB8yIPkb6hrsztvLcCkBCj7Rg3lJPrd31DDEfJ N2wgYk9xTyTUJCCFQTQDbzH+UontaIIbfJ9vWyk+cmjSu6kbOSIkGwvyuC02R7Kpq8Ex ooB9xlB0d9tLvEf9HXc/gS9pH+9sQt01TASDbU0ocLBrGZXz3ci2gM9h/rzq2itHnGi7 fgww== X-Gm-Message-State: AOAM530EcxdXBOdRVV3SIprBmPO6T2qKD4YOacp7jR5g/g4BITMELNF3 yQVeNFfqbiPz/EZo3G7QO9AUTg== 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 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@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); -- 2.30.2