From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-10.7 required=3.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED,DKIM_SIGNED,DKIM_VALID,FREEMAIL_FORGED_FROMDOMAIN, FREEMAIL_FROM,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 59F66C4338F for ; Sun, 25 Jul 2021 06:13:26 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 1E50760525 for ; Sun, 25 Jul 2021 06:13:26 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org 1E50760525 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-ID:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=CDEUXye3RgCuY0I8i3INzXcYq+Y+VQRXm/aD6d3Mzik=; b=2s1gHZA0nbTJZU OtNDu2kPlcPPM6rr39CafUZRtUa96RSJlLWWicIme1Xeqmd50wdYzY59TaoYSHbv+WWL3ZEbuM4oF AB1xgs0fMYg1zzeprJg6BnPYKpBHS3Wht9IJZAtrEAPiz1w+fhuBWyHZdj/HIzvBxRqFYeHhW1bDy 7VgNke5OhHs5+ZOdk7/TOLYbYPK5SzfiAPojjapklW5VXL4jQTEbd0kXl4A/N4KPmoHCzBRfPRbdH cGQL28YncPoYD+UdVH5xOKCKZ1WAJCrpJUDL+MotHG6O+B2WBj7yHwayaz27/Df8clzuxhhR+b0Zy PpN/jCNVsyNlmx0Hbgdg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1m7XMi-008HZ9-V0; Sun, 25 Jul 2021 06:11:57 +0000 Received: from mail-ed1-x52d.google.com ([2a00:1450:4864:20::52d]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1m7XMe-008HYQ-HG for linux-arm-kernel@lists.infradead.org; Sun, 25 Jul 2021 06:11:54 +0000 Received: by mail-ed1-x52d.google.com with SMTP id df26so7076372edb.9 for ; Sat, 24 Jul 2021 23:11:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=wFR6sS7MgnkuF9s/sreoF/A+KiH0ZJ0/kWVc4AXtEIk=; b=JVF/N/v0eQKfqf/R0Wir1IEiswcyIagZZIMY3jRcj87FUiCzC//p24eCtHKmd304ts Z8hfJGFszktgj12+QZNFqVIXPCFXBG28PLGbk+KPZG7GSE5A+HfcR4VgroZGz0RFSfFW mi/qzHsgC8VZeCDdWzOLcNRN6+znSWAHTte5xG9kEmlqHE0Dc6AxVIYkCgu9AWdkjED5 jvd/+Cvd6sOFu8Ll+GzYDLMyoH4ukODpH53C52khDaswM/ALsPdCB8BqNuGrOXqut/OV Q0yTOeoEJnM3ZbbbtJ30GViEIBzPZz/ann8KqdtrP69p1idtVXhrBpY03fIX/dGGc/Sg eP+Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=wFR6sS7MgnkuF9s/sreoF/A+KiH0ZJ0/kWVc4AXtEIk=; b=IkXQNiY6KpElMXgroaHiSF7mbz2tDmJMJ/1NptACZnp6el9jo/GYwLN/MXY0dpHT7K Kj98sMGy3akf0Xa2aQ40UJ5QwcAgELwAe22k6Vz9bbKhAlm/IRE7YR9ni77jyDNUqFXi TBmErop7dYoRWov56785NKj6IFpde9eIE+6oNjaRn0JSBuXDXzE0X7KxhEkmGm8FWNPU FdMRaIdmjXHZ7Tq2YGW296NalW5HqlerXuELqj/hFbUTi92N2h0h4HZH6X+dBx8Q53fi Im/qr7dRGTjjahvN2QUzALW+ZWs87fvXV1dyUlEFB8jsaG0K0LG8xTqB0yUqn5WWMw2d SqEQ== X-Gm-Message-State: AOAM530HiJbUhEdB8SPQLM3Ii2nB33nnYsAVFP/utvexHgaySf6dN5ks C7UTmwj9mUMqpHID6CKpyTU= X-Google-Smtp-Source: ABdhPJyxLW1kOVhsK013i3EQP2TuckxkXFUw6h6RbOexb0c2IPPlpp1JLqgoNoxEgF+kJpXVWiotEw== X-Received: by 2002:a05:6402:b8f:: with SMTP id cf15mr14380260edb.286.1627193511198; Sat, 24 Jul 2021 23:11:51 -0700 (PDT) Received: from kista.localnet (cpe-86-58-46-198.static.triera.net. [86.58.46.198]) by smtp.gmail.com with ESMTPSA id ce21sm13208393ejc.25.2021.07.24.23.11.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 24 Jul 2021 23:11:50 -0700 (PDT) From: Jernej =?utf-8?B?xaBrcmFiZWM=?= To: Maxime Ripard , Chen-Yu Tsai , Andre Przywara Cc: Rob Herring , Icenowy Zheng , Samuel Holland , linux-arm-kernel@lists.infradead.org, linux-sunxi@googlegroups.com, linux-sunxi@lists.linux.dev, linux-kernel@vger.kernel.org, Ondrej Jirman , Alessandro Zummo , Alexandre Belloni , linux-rtc@vger.kernel.org Subject: Re: [PATCH v8 05/11] rtc: sun6i: Add support for broken-down alarm registers Date: Sun, 25 Jul 2021 08:11:49 +0200 Message-ID: <35374855.gLGPhMbAMS@kista> In-Reply-To: <20210723153838.6785-6-andre.przywara@arm.com> References: <20210723153838.6785-1-andre.przywara@arm.com> <20210723153838.6785-6-andre.przywara@arm.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210724_231152_636893_2CA98A85 X-CRM114-Status: GOOD ( 27.98 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Hi Andre! Dne petek, 23. julij 2021 ob 17:38:32 CEST je Andre Przywara napisal(a): > Newer versions of the Allwinner RTC, for instance as found in the H616 > SoC, not only store the current day as a linear number, but also change > the way the alarm is handled: There are now two registers, that > explicitly store the wakeup time, in the same format as the current > time. > > Add support for that variant by writing the requested wakeup time > directly into the registers, instead of programming the seconds left, as > the old SoCs required. > > Signed-off-by: Andre Przywara > --- > drivers/rtc/rtc-sun6i.c | 60 +++++++++++++++++++++++++++++------------ > 1 file changed, 43 insertions(+), 17 deletions(-) > > diff --git a/drivers/rtc/rtc-sun6i.c b/drivers/rtc/rtc-sun6i.c > index a02be8bca6f3..f0ee20bfdccb 100644 > --- a/drivers/rtc/rtc-sun6i.c > +++ b/drivers/rtc/rtc-sun6i.c > @@ -48,7 +48,8 @@ > > /* Alarm 0 (counter) */ > #define SUN6I_ALRM_COUNTER 0x0020 > -#define SUN6I_ALRM_CUR_VAL 0x0024 > +/* This holds the remaining alarm seconds on older SoCs (current value) */ > +#define SUN6I_ALRM_COUNTER_HMS 0x0024 > #define SUN6I_ALRM_EN 0x0028 > #define SUN6I_ALRM_EN_CNT_EN BIT(0) > #define SUN6I_ALRM_IRQ_EN 0x002c > @@ -523,32 +524,57 @@ static int sun6i_rtc_setalarm(struct device *dev, struct rtc_wkalrm *wkalrm) > struct sun6i_rtc_dev *chip = dev_get_drvdata(dev); > struct rtc_time *alrm_tm = &wkalrm->time; > struct rtc_time tm_now; > - time64_t time_now, time_set; > + time64_t time_set; > + u32 counter_val, counter_val_hms; > int ret; > > - ret = sun6i_rtc_gettime(dev, &tm_now); > - if (ret < 0) { > - dev_err(dev, "Error in getting time\n"); > - return -EINVAL; > - } > - > time_set = rtc_tm_to_time64(alrm_tm); > - time_now = rtc_tm_to_time64(&tm_now); > - if (time_set <= time_now) { > - dev_err(dev, "Date to set in the past\n"); > - return -EINVAL; > - } > > - if ((time_set - time_now) > U32_MAX) { > - dev_err(dev, "Date too far in the future\n"); > - return -EINVAL; > + if (chip->flags & RTC_LINEAR_DAY) { > + time64_t seconds; > + > + /* > + * The alarm registers hold the actual alarm time, encoded > + * in the same way (linear day + HMS) as the current time. > + */ > + counter_val_hms = SUN6I_TIME_SET_SEC_VALUE(alrm_tm- >tm_sec) | > + SUN6I_TIME_SET_MIN_VALUE(alrm_tm->tm_min) | > + SUN6I_TIME_SET_HOUR_VALUE(alrm_tm->tm_hour); > + seconds = mktime64(alrm_tm->tm_year + 1900, alrm_tm- >tm_mon, > + alrm_tm->tm_mday, 0, 0, 0); While above line should work, it's confusing why you're adding 1900 to years. In my opinion it would be better to use same trick you used in patch 4 - rtc_tm_to_time64() with hours, minutes and seconds set to 0. Or maybe you don't even need to do that, since division by SECS_PER_DAY will round down anyway. In such way you hide RTC internal representation detail which doesn't need to be exposed here. Once fixed: Reviewed by: Jernej Skrabec Best regards, Jernej > + counter_val = div_u64(seconds, SECS_PER_DAY); > + } else { > + /* The alarm register holds the number of seconds left. */ > + time64_t time_now; > + > + ret = sun6i_rtc_gettime(dev, &tm_now); > + if (ret < 0) { > + dev_err(dev, "Error in getting time\n"); > + return -EINVAL; > + } > + > + time_now = rtc_tm_to_time64(&tm_now); > + if (time_set <= time_now) { > + dev_err(dev, "Date to set in the past\n"); > + return -EINVAL; > + } > + if ((time_set - time_now) > U32_MAX) { > + dev_err(dev, "Date too far in the future\n"); > + return -EINVAL; > + } > + > + counter_val = time_set - time_now; > } > > sun6i_rtc_setaie(0, chip); > writel(0, chip->base + SUN6I_ALRM_COUNTER); > + if (chip->flags & RTC_LINEAR_DAY) > + writel(0, chip->base + SUN6I_ALRM_COUNTER_HMS); > usleep_range(100, 300); > > - writel(time_set - time_now, chip->base + SUN6I_ALRM_COUNTER); > + writel(counter_val, chip->base + SUN6I_ALRM_COUNTER); > + if (chip->flags & RTC_LINEAR_DAY) > + writel(counter_val_hms, chip->base + SUN6I_ALRM_COUNTER_HMS); > chip->alarm = time_set; > > sun6i_rtc_setaie(wkalrm->enabled, chip); > -- > 2.17.6 > > _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel