From nobody Sun Feb 8 06:56:21 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id A8533C04FDF for ; Wed, 9 Aug 2023 01:15:56 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230406AbjHIBPz (ORCPT ); Tue, 8 Aug 2023 21:15:55 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33402 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230117AbjHIBPv (ORCPT ); Tue, 8 Aug 2023 21:15:51 -0400 Received: from mail-pl1-x62a.google.com (mail-pl1-x62a.google.com [IPv6:2607:f8b0:4864:20::62a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 15F6C19A8; Tue, 8 Aug 2023 18:15:51 -0700 (PDT) Received: by mail-pl1-x62a.google.com with SMTP id d9443c01a7336-1bc1c1c68e2so40486105ad.3; Tue, 08 Aug 2023 18:15:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1691543750; x=1692148550; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=fpAcRisUyrskcWS9AV1ql1Z9KFMGwKdSa1ZIJWKbDtE=; b=Y+o78R/URs32r1pS7ksTcEFv//2BRTVRggUQkZSo36ouTaXxU1SiXWbmxGNMMrlmKr 1cyLi7js8C9amqoFCUPXQUrl3ad0KLTCt2Frj/r7NbIJCVdCnLnFOM1h8Y6I17izvcp/ zn8rzBr5SWhrg5gNP6v0f1N2HvuleGjhd0/v6yVRIQFufs6eCz5Yubz2HI0lQy2NyIGU CwOkG10vWYzjW5DzCoLE+QZtJOlR6vb9qN9iJvB/8/+X41SIlj+4g0ReEkW7bg2xgogf DilCh6w2RFjgoa/mNuKcDxD4lUmHJHstpuKmIFNnX4wkq6fI4SJ2WBqi5p2bD3V3fDks x/dA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1691543750; x=1692148550; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=fpAcRisUyrskcWS9AV1ql1Z9KFMGwKdSa1ZIJWKbDtE=; b=SQEQsND3TQwvdRNyyDffdzeop7kwj514S5pp/aiRkWGHhkwzdZdBGZOoozxSEUOIbo ZcVJBpPmhOl2bjoSBYORbbB9cHGJ1toH3xuGgTt9xiTDj/jFxFVH15NffdEXYoT+m6hn ppzPJDFWq+S41OvsxuwWDbYs/iBarxrp/MEAGsR0UdDEOIjzf2/1RkYeuRKQyw8mWHJz h/Ig9n2ZmlK8y7w6N9Vc2Yozqh0Xx3WdHGved7vGWVmUD4xIyYp8Q9wO0OLXMRrVw4Qh 3MnWe3JEd5BpZtg2ERJiGtGKKzkmVHTAUnPw6+qNoF/kwcT4sROSXukjGBpe83lrl7kX fufQ== X-Gm-Message-State: AOJu0YxMiPog/Bxy/PqqYRn3wKvmF5pFHzu98cpM1g1Q1Pkhk6fFXHmO I98nCirDVYPnPSrKD1i5sPgpCFBIvns= X-Google-Smtp-Source: AGHT+IGc564GPnpp2ZAgbOs+wh+yI70UOwt148b6UgsbAT88NsGzbYAwsKXCaqj84G2bdev6Sx2+0w== X-Received: by 2002:a17:902:eccd:b0:1b8:2a4d:3eb9 with SMTP id a13-20020a170902eccd00b001b82a4d3eb9mr1151662plh.34.1691543750502; Tue, 08 Aug 2023 18:15:50 -0700 (PDT) Received: from a28aa0606c51.. (60-250-192-107.hinet-ip.hinet.net. [60.250.192.107]) by smtp.gmail.com with ESMTPSA id t22-20020a1709028c9600b001bc68602e54sm5730449plo.142.2023.08.08.18.15.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 08 Aug 2023 18:15:50 -0700 (PDT) From: Jacky Huang To: a.zummo@towertech.it, alexandre.belloni@bootlin.com, robh+dt@kernel.org, krzysztof.kozlowski+dt@linaro.org, conor+dt@kernel.org Cc: linux-rtc@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, soc@kernel.org, mjchen@nuvoton.com, schung@nuvoton.com, Jacky Huang , Krzysztof Kozlowski Subject: [RESEND PATCH v2 1/3] dt-bindings: rtc: Add Nuvoton ma35d1 rtc Date: Wed, 9 Aug 2023 01:15:40 +0000 Message-Id: <20230809011542.429945-2-ychuang570808@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20230809011542.429945-1-ychuang570808@gmail.com> References: <20230809011542.429945-1-ychuang570808@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Jacky Huang Add documentation describing the Nuvoton ma35d1 rtc controller. Signed-off-by: Jacky Huang Reviewed-by: Krzysztof Kozlowski --- .../bindings/rtc/nuvoton,ma35d1-rtc.yaml | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 Documentation/devicetree/bindings/rtc/nuvoton,ma35d1-rt= c.yaml diff --git a/Documentation/devicetree/bindings/rtc/nuvoton,ma35d1-rtc.yaml = b/Documentation/devicetree/bindings/rtc/nuvoton,ma35d1-rtc.yaml new file mode 100644 index 000000000000..5e4ade803eed --- /dev/null +++ b/Documentation/devicetree/bindings/rtc/nuvoton,ma35d1-rtc.yaml @@ -0,0 +1,48 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/rtc/nuvoton,ma35d1-rtc.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Nuvoton MA35D1 Real Time Clock + +maintainers: + - Min-Jen Chen + +allOf: + - $ref: rtc.yaml# + +properties: + compatible: + enum: + - nuvoton,ma35d1-rtc + + reg: + maxItems: 1 + + interrupts: + maxItems: 1 + + clocks: + maxItems: 1 + +required: + - compatible + - reg + - interrupts + - clocks + +unevaluatedProperties: false + +examples: + - | + #include + #include + rtc@40410000 { + compatible =3D "nuvoton,ma35d1-rtc"; + reg =3D <0x40410000 0x200>; + interrupts =3D ; + clocks =3D <&clk RTC_GATE>; + }; + +... --=20 2.34.1 From nobody Sun Feb 8 06:56:21 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8898FC04FE0 for ; Wed, 9 Aug 2023 01:15:58 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229702AbjHIBP5 (ORCPT ); Tue, 8 Aug 2023 21:15:57 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33426 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230288AbjHIBPy (ORCPT ); Tue, 8 Aug 2023 21:15:54 -0400 Received: from mail-pl1-x630.google.com (mail-pl1-x630.google.com [IPv6:2607:f8b0:4864:20::630]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D24F4E5E; Tue, 8 Aug 2023 18:15:53 -0700 (PDT) Received: by mail-pl1-x630.google.com with SMTP id d9443c01a7336-1bbd03cb7c1so41476115ad.3; Tue, 08 Aug 2023 18:15:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1691543753; x=1692148553; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=WDGT67Q+ic1nejZuLGS46+I/MVwpubEr1pR0ugjy0IU=; b=awr0YsovglR+Jd2wnMTzJ9wZrwIlhm5o09UjyNtJVH7JbzocQYlT465++coRkPHpCD ztOmH6QEptaiuxNr4nuA+ja4EWblQPW2h6oGs6fqJF66aN/SNHAOQ0pvrApD+RjHbOn/ KnhB4CfI/487eM5HM4wsD7fZWpt1EUgvl/75KaAXPtHDIpr6e8o2MANh73mQyjJXK5lA moxFLenfURIwFhPTYn7/EPk/NPjU5OrYE3qMdNZ9c4Dt6SCOfPcgQXNH4GijyCQOKJMx cpc7bji2nBlBQ8oJ6UB2jgvsCqnMYB1Gb0vBRm9wA5W86ek3H+ioCBcIqvtEsk8XmNma iT+w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1691543753; x=1692148553; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=WDGT67Q+ic1nejZuLGS46+I/MVwpubEr1pR0ugjy0IU=; b=S4ha4hVuoFsTccltO/u+QntWYkcXyRMgJKwG2N5uexAFg1MVYqqm1HIRsuSCMwX1OF BwiUmOtUVm0DsLtuSroYm6j9Z73sasCDZ5Ko4OJE0Pb1BvAH9C0DMNI3i3/xAJjRoNKe 48nbZ2uqNn4ZrR5jxrfPvdpusPJVsPr2bTCxp1lt0LH10VjU4fUGcHdwzVLgb6czQrfb eNSckqUV13ujnzLftnlYBNhy8JuNWkgHf/p+LXPul8tSgxGum/QlgXjusyAUmtlZ395I WqY3mDOA1po9JXohu6g09SDcstXvl2QqfmW3pdInFt1iQunlCUMtvC3d0HrVWwr8wQDA Ipow== X-Gm-Message-State: AOJu0YzGzy93re8ETu+7vWfEuR1aYvN09+BAy5iVbz2PkcOBMYrD0S8Q YBmR/rmsRRftGhs0bI24+pE= X-Google-Smtp-Source: AGHT+IGQH7HNY7Iq78cnQi9mP7ucP6QArzO99O5R9IRiNGKy1sSK/tfRzmIS4THliDgyzxklrRxmVg== X-Received: by 2002:a17:902:d717:b0:1bc:50f9:8f20 with SMTP id w23-20020a170902d71700b001bc50f98f20mr1221753ply.23.1691543753224; Tue, 08 Aug 2023 18:15:53 -0700 (PDT) Received: from a28aa0606c51.. (60-250-192-107.hinet-ip.hinet.net. [60.250.192.107]) by smtp.gmail.com with ESMTPSA id t22-20020a1709028c9600b001bc68602e54sm5730449plo.142.2023.08.08.18.15.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 08 Aug 2023 18:15:52 -0700 (PDT) From: Jacky Huang To: a.zummo@towertech.it, alexandre.belloni@bootlin.com, robh+dt@kernel.org, krzysztof.kozlowski+dt@linaro.org, conor+dt@kernel.org Cc: linux-rtc@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, soc@kernel.org, mjchen@nuvoton.com, schung@nuvoton.com, Jacky Huang Subject: [RESEND PATCH v2 2/3] arm64: dts: nuvoton: Add rtc for ma35d1 Date: Wed, 9 Aug 2023 01:15:41 +0000 Message-Id: <20230809011542.429945-3-ychuang570808@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20230809011542.429945-1-ychuang570808@gmail.com> References: <20230809011542.429945-1-ychuang570808@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Jacky Huang Add rtc controller support to the dtsi of ma35d1 SoC and enable rtc on SOM and IoT boards. Signed-off-by: Jacky Huang --- arch/arm64/boot/dts/nuvoton/ma35d1-iot-512m.dts | 4 ++++ arch/arm64/boot/dts/nuvoton/ma35d1-som-256m.dts | 4 ++++ arch/arm64/boot/dts/nuvoton/ma35d1.dtsi | 8 ++++++++ 3 files changed, 16 insertions(+) diff --git a/arch/arm64/boot/dts/nuvoton/ma35d1-iot-512m.dts b/arch/arm64/b= oot/dts/nuvoton/ma35d1-iot-512m.dts index b89e2be6abae..b3be4331abcf 100644 --- a/arch/arm64/boot/dts/nuvoton/ma35d1-iot-512m.dts +++ b/arch/arm64/boot/dts/nuvoton/ma35d1-iot-512m.dts @@ -54,3 +54,7 @@ &clk { "integer", "integer"; }; + +&rtc { + status =3D "okay"; +}; diff --git a/arch/arm64/boot/dts/nuvoton/ma35d1-som-256m.dts b/arch/arm64/b= oot/dts/nuvoton/ma35d1-som-256m.dts index a1ebddecb7f8..9858788a589c 100644 --- a/arch/arm64/boot/dts/nuvoton/ma35d1-som-256m.dts +++ b/arch/arm64/boot/dts/nuvoton/ma35d1-som-256m.dts @@ -54,3 +54,7 @@ &clk { "integer", "integer"; }; + +&rtc { + status =3D "okay"; +}; diff --git a/arch/arm64/boot/dts/nuvoton/ma35d1.dtsi b/arch/arm64/boot/dts/= nuvoton/ma35d1.dtsi index 781cdae566a0..394395bfd3ae 100644 --- a/arch/arm64/boot/dts/nuvoton/ma35d1.dtsi +++ b/arch/arm64/boot/dts/nuvoton/ma35d1.dtsi @@ -95,6 +95,14 @@ clk: clock-controller@40460200 { clocks =3D <&clk_hxt>; }; =20 + rtc: rtc@40410000 { + compatible =3D "nuvoton,ma35d1-rtc"; + reg =3D <0x0 0x40410000 0x0 0x200>; + interrupts =3D ; + clocks =3D <&clk RTC_GATE>; + status =3D "disabled"; + }; + uart0: serial@40700000 { compatible =3D "nuvoton,ma35d1-uart"; reg =3D <0x0 0x40700000 0x0 0x100>; --=20 2.34.1 From nobody Sun Feb 8 06:56:21 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 6C93AC04A94 for ; Wed, 9 Aug 2023 01:16:04 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229965AbjHIBQD (ORCPT ); Tue, 8 Aug 2023 21:16:03 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33486 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230463AbjHIBP6 (ORCPT ); Tue, 8 Aug 2023 21:15:58 -0400 Received: from mail-pj1-x1030.google.com (mail-pj1-x1030.google.com [IPv6:2607:f8b0:4864:20::1030]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 96964E5E; Tue, 8 Aug 2023 18:15:56 -0700 (PDT) Received: by mail-pj1-x1030.google.com with SMTP id 98e67ed59e1d1-26871992645so4172225a91.0; Tue, 08 Aug 2023 18:15:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1691543756; x=1692148556; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=nPNCweX+5ma/GkGVGkz+d+I063Vnz2ba+24+RFVQOm8=; b=YBEElAZ9XtCK4Cd2b/3zMZzs/E7/iE7wsUtNV5tm/9aTeMLQBS9jkTu4uWA24q/ZXA 62QShqlHqpH4cbYgVyeOT6Oza5YzcYRzog+SzDZtu6P/yEJYw2Z3UIeXdWlKBMZv+hf3 5R3U7jfRvEgHLk0Tg7eNt7BkApJe0tm73MPRetyJ0HuqGPNoOohF4AW7jCIJlktaEAQ6 nYetYMJ0eXXpTJg+YOku9OKf32o52X+Qc2mPIJaH3Kg9aTJRxEKJxabMWmA1M2QCaBD7 3/YxOnmW2+BJm8Bw0SDoDY3b13C6VmkuwAdgi+bGlkXWYX54F0pWTk9MFFdI5VQCTZl+ 76UQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1691543756; x=1692148556; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=nPNCweX+5ma/GkGVGkz+d+I063Vnz2ba+24+RFVQOm8=; b=UeQqyDpl6+oMmPRmQBzszvTxV+NRthbqZIvq5hrlGRccynM7MFE1mYFolNioprA2I3 9BvmiwxqO7O+cuhOdnSATl7iVKleKEACeNicAJOYiaFLqq77R+keeD14mo1OpATPMNJQ Y/fPt/tEs9Eb1Gx2Y6aCnX17wWcOuWa9xXgkGZ4Od+qEhud8a1odtoYRQ8gMLzgJjw6c O8u219mAs9+TrkybKAsY5cxlMshceq4pAFuBBEQNZjiTHzsbdByVmXHdGQuI7iJ0Insj OLo1ktapc0VxZhXIXNLiBqEjkfVnVWSrBjAVUdTjvs9vLetAQJt2kNP1It+DpWGpWXjt Gg9w== X-Gm-Message-State: AOJu0YwBeKsvtbgTDTltqTYnZ7vuwkEme0Riby6vdDqfbcsmSECT8hYs G5tL8YpgpPyEG1q8ac5icw4= X-Google-Smtp-Source: AGHT+IGoV5P8FQ/Uv/2KcsV8fH+WqZH8q+JmsnCATTjJfdRLrh7tOwl+RxZNZQyNyy8Bu2HLwOiBaQ== X-Received: by 2002:a17:90a:72cc:b0:268:1b62:2f6c with SMTP id l12-20020a17090a72cc00b002681b622f6cmr1117935pjk.2.1691543755848; Tue, 08 Aug 2023 18:15:55 -0700 (PDT) Received: from a28aa0606c51.. (60-250-192-107.hinet-ip.hinet.net. [60.250.192.107]) by smtp.gmail.com with ESMTPSA id t22-20020a1709028c9600b001bc68602e54sm5730449plo.142.2023.08.08.18.15.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 08 Aug 2023 18:15:55 -0700 (PDT) From: Jacky Huang To: a.zummo@towertech.it, alexandre.belloni@bootlin.com, robh+dt@kernel.org, krzysztof.kozlowski+dt@linaro.org, conor+dt@kernel.org Cc: linux-rtc@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, soc@kernel.org, mjchen@nuvoton.com, schung@nuvoton.com, Jacky Huang Subject: [RESEND PATCH v2 3/3] rtc: Add driver for Nuvoton ma35d1 rtc controller Date: Wed, 9 Aug 2023 01:15:42 +0000 Message-Id: <20230809011542.429945-4-ychuang570808@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20230809011542.429945-1-ychuang570808@gmail.com> References: <20230809011542.429945-1-ychuang570808@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Jacky Huang The ma35d1 rtc controller provides real-time and calendar messaging capabilities. It supports programmable time tick and alarm match interrupts. The time and calendar messages are expressed in BCD format. This driver supports the built-in rtc controller of the ma35d1. It enables setting and reading the rtc time and configuring and reading the rtc alarm. Signed-off-by: Jacky Huang --- drivers/rtc/Kconfig | 11 ++ drivers/rtc/Makefile | 1 + drivers/rtc/rtc-ma35d1.c | 355 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 367 insertions(+) create mode 100644 drivers/rtc/rtc-ma35d1.c diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig index 05f4b2d66290..95ddd8f616f4 100644 --- a/drivers/rtc/Kconfig +++ b/drivers/rtc/Kconfig @@ -1929,6 +1929,17 @@ config RTC_DRV_TI_K3 This driver can also be built as a module, if so, the module will be called "rtc-ti-k3". =20 +config RTC_DRV_MA35D1 + tristate "Nuvoton MA35D1 RTC" + depends on ARCH_MA35 || COMPILE_TEST + select REGMAP_MMIO + help + If you say yes here you get support for the Nuvoton MA35D1 + On-Chip Real Time Clock. + + This driver can also be built as a module, if so, the module + will be called "rtc-ma35d1". + comment "HID Sensor RTC drivers" =20 config RTC_DRV_HID_SENSOR_TIME diff --git a/drivers/rtc/Makefile b/drivers/rtc/Makefile index fd209883ee2e..763c9cb5dde1 100644 --- a/drivers/rtc/Makefile +++ b/drivers/rtc/Makefile @@ -88,6 +88,7 @@ obj-$(CONFIG_RTC_DRV_M41T94) +=3D rtc-m41t94.o obj-$(CONFIG_RTC_DRV_M48T35) +=3D rtc-m48t35.o obj-$(CONFIG_RTC_DRV_M48T59) +=3D rtc-m48t59.o obj-$(CONFIG_RTC_DRV_M48T86) +=3D rtc-m48t86.o +obj-$(CONFIG_RTC_DRV_MA35D1) +=3D rtc-ma35d1.o obj-$(CONFIG_RTC_DRV_MAX6900) +=3D rtc-max6900.o obj-$(CONFIG_RTC_DRV_MAX6902) +=3D rtc-max6902.o obj-$(CONFIG_RTC_DRV_MAX6916) +=3D rtc-max6916.o diff --git a/drivers/rtc/rtc-ma35d1.c b/drivers/rtc/rtc-ma35d1.c new file mode 100644 index 000000000000..f63b484ee37f --- /dev/null +++ b/drivers/rtc/rtc-ma35d1.c @@ -0,0 +1,355 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * RTC driver for Nuvoton MA35D1 + * + * Copyright (C) 2023 Nuvoton Technology Corp. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* MA35D1 RTC Control Registers */ +#define MA35_REG_RTC_INIT 0x00 +#define MA35_REG_RTC_SINFASTS 0x04 +#define MA35_REG_RTC_FREQADJ 0x08 +#define MA35_REG_RTC_TIME 0x0c +#define MA35_REG_RTC_CAL 0x10 +#define MA35_REG_RTC_CLKFMT 0x14 +#define MA35_REG_RTC_WEEKDAY 0x18 +#define MA35_REG_RTC_TALM 0x1c +#define MA35_REG_RTC_CALM 0x20 +#define MA35_REG_RTC_LEAPYEAR 0x24 +#define MA35_REG_RTC_INTEN 0x28 +#define MA35_REG_RTC_INTSTS 0x2c +#define MA35_REG_RTC_TICK 0x30 + +/* register MA35_REG_RTC_INIT */ +#define RTC_INIT_ACTIVE BIT(0) +#define RTC_INIT_MAGIC_CODE 0xa5eb1357 + +/* register MA35_REG_RTC_CLKFMT */ +#define RTC_CLKFMT_24HEN BIT(0) +#define RTC_CLKFMT_DCOMPEN BIT(16) + +/* register MA35_REG_RTC_INTEN */ +#define RTC_INTEN_ALMIEN BIT(0) +#define RTC_INTEN_TICKIEN BIT(1) +#define RTC_INTEN_CLKFIEN BIT(24) +#define RTC_INTEN_CLKSTIEN BIT(25) + +/* register MA35_REG_RTC_INTSTS */ +#define RTC_INTSTS_ALMIF BIT(0) +#define RTC_INTSTS_TICKIF BIT(1) +#define RTC_INTSTS_CLKFIF BIT(24) +#define RTC_INTSTS_CLKSTIF BIT(25) + +#define RTC_INIT_TIMEOUT 250 + +struct ma35_rtc { + int irq_num; + void __iomem *rtc_reg; + struct rtc_device *rtcdev; +}; + +struct ma35_bcd_time { + int bcd_sec; + int bcd_min; + int bcd_hour; + int bcd_mday; + int bcd_mon; + int bcd_year; +}; + +static u32 rtc_reg_read(struct ma35_rtc *p, u32 offset) +{ + return __raw_readl(p->rtc_reg + offset); +} + +static inline void rtc_reg_write(struct ma35_rtc *p, u32 offset, u32 value) +{ + __raw_writel(value, p->rtc_reg + offset); +} + +static irqreturn_t ma35d1_rtc_interrupt(int irq, void *data) +{ + struct ma35_rtc *rtc =3D (struct ma35_rtc *)data; + unsigned long events =3D 0, rtc_irq; + + rtc_irq =3D rtc_reg_read(rtc, MA35_REG_RTC_INTSTS); + + if (rtc_irq & RTC_INTSTS_ALMIF) { + rtc_reg_write(rtc, MA35_REG_RTC_INTSTS, RTC_INTSTS_ALMIF); + events |=3D RTC_AF | RTC_IRQF; + } + + if (rtc_irq & RTC_INTSTS_TICKIF) { + rtc_reg_write(rtc, MA35_REG_RTC_INTSTS, RTC_INTSTS_TICKIF); + events |=3D RTC_UF | RTC_IRQF; + } + + rtc_update_irq(rtc->rtcdev, 1, events); + + return IRQ_HANDLED; +} + +static int ma35d1_rtc_init(struct ma35_rtc *rtc, u32 ms_timeout) +{ + const unsigned long timeout =3D jiffies + msecs_to_jiffies(ms_timeout); + + do { + if (rtc_reg_read(rtc, MA35_REG_RTC_INIT) & RTC_INIT_ACTIVE) + return 0; + + rtc_reg_write(rtc, MA35_REG_RTC_INIT, RTC_INIT_MAGIC_CODE); + + mdelay(1); + + } while (time_before(jiffies, timeout)); + + return -ETIMEDOUT; +} + +static int ma35d1_rtc_bcd2bin(u32 time, u32 cal, u32 wday, struct rtc_time= *tm) +{ + tm->tm_mday =3D bcd2bin(cal >> 0); + tm->tm_mon =3D bcd2bin(cal >> 8); + tm->tm_mon =3D tm->tm_mon - 1; + tm->tm_year =3D bcd2bin(cal >> 16) + 100; + + tm->tm_sec =3D bcd2bin(time >> 0); + tm->tm_min =3D bcd2bin(time >> 8); + tm->tm_hour =3D bcd2bin(time >> 16); + + tm->tm_wday =3D wday; + + return rtc_valid_tm(tm); +} + +static int ma35d1_rtc_alarm_bcd2bin(u32 talm, u32 calm, struct rtc_time *t= m) +{ + tm->tm_mday =3D bcd2bin(calm >> 0); + tm->tm_mon =3D bcd2bin(calm >> 8); + tm->tm_mon =3D tm->tm_mon - 1; + tm->tm_year =3D bcd2bin(calm >> 16) + 100; + + tm->tm_sec =3D bcd2bin(talm >> 0); + tm->tm_min =3D bcd2bin(talm >> 8); + tm->tm_hour =3D bcd2bin(talm >> 16); + + return rtc_valid_tm(tm); +} + +static void ma35d1_rtc_bin2bcd(struct device *dev, struct rtc_time *settm, + struct ma35_bcd_time *gettm) +{ + gettm->bcd_mday =3D bin2bcd(settm->tm_mday) << 0; + gettm->bcd_mon =3D bin2bcd((settm->tm_mon + 1)) << 8; + + if (settm->tm_year < 100) { + dev_warn(dev, "The year will be between 1970-1999, right?\n"); + gettm->bcd_year =3D bin2bcd(settm->tm_year) << 16; + } else { + gettm->bcd_year =3D bin2bcd(settm->tm_year - 100) << 16; + } + + gettm->bcd_sec =3D bin2bcd(settm->tm_sec) << 0; + gettm->bcd_min =3D bin2bcd(settm->tm_min) << 8; + gettm->bcd_hour =3D bin2bcd(settm->tm_hour) << 16; +} + +static int ma35d1_alarm_irq_enable(struct device *dev, u32 enabled) +{ + struct ma35_rtc *rtc =3D dev_get_drvdata(dev); + u32 reg_ien; + + reg_ien =3D rtc_reg_read(rtc, MA35_REG_RTC_INTEN); + + if (enabled) + rtc_reg_write(rtc, MA35_REG_RTC_INTEN, reg_ien | RTC_INTEN_ALMIEN); + else + rtc_reg_write(rtc, MA35_REG_RTC_INTEN, reg_ien & ~RTC_INTEN_ALMIEN); + + return 0; +} + +static int ma35d1_rtc_read_time(struct device *dev, struct rtc_time *tm) +{ + struct ma35_rtc *rtc =3D dev_get_drvdata(dev); + u32 time, cal, wday; + + time =3D rtc_reg_read(rtc, MA35_REG_RTC_TIME); + cal =3D rtc_reg_read(rtc, MA35_REG_RTC_CAL); + wday =3D rtc_reg_read(rtc, MA35_REG_RTC_WEEKDAY); + + return ma35d1_rtc_bcd2bin(time, cal, wday, tm); +} + +static int ma35d1_rtc_set_time(struct device *dev, struct rtc_time *tm) +{ + struct ma35_rtc *rtc =3D dev_get_drvdata(dev); + struct ma35_bcd_time gettm; + u32 val; + + ma35d1_rtc_bin2bcd(dev, tm, &gettm); + + val =3D gettm.bcd_mday | gettm.bcd_mon | gettm.bcd_year; + rtc_reg_write(rtc, MA35_REG_RTC_CAL, val); + + val =3D gettm.bcd_sec | gettm.bcd_min | gettm.bcd_hour; + rtc_reg_write(rtc, MA35_REG_RTC_TIME, val); + + val =3D tm->tm_wday; + rtc_reg_write(rtc, MA35_REG_RTC_WEEKDAY, val); + + return 0; +} + +static int ma35d1_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *al= rm) +{ + struct ma35_rtc *rtc =3D dev_get_drvdata(dev); + u32 talm, calm; + + talm =3D rtc_reg_read(rtc, MA35_REG_RTC_TALM); + calm =3D rtc_reg_read(rtc, MA35_REG_RTC_CALM); + + return ma35d1_rtc_alarm_bcd2bin(talm, calm, &alrm->time); +} + +static int ma35d1_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alr= m) +{ + struct ma35_rtc *rtc =3D dev_get_drvdata(dev); + struct ma35_bcd_time tm; + unsigned long val; + + ma35d1_rtc_bin2bcd(dev, &alrm->time, &tm); + + val =3D tm.bcd_mday | tm.bcd_mon | tm.bcd_year; + rtc_reg_write(rtc, MA35_REG_RTC_CALM, val); + + val =3D tm.bcd_sec | tm.bcd_min | tm.bcd_hour; + rtc_reg_write(rtc, MA35_REG_RTC_TALM, val); + + return 0; +} + +static const struct rtc_class_ops ma35d1_rtc_ops =3D { + .read_time =3D ma35d1_rtc_read_time, + .set_time =3D ma35d1_rtc_set_time, + .read_alarm =3D ma35d1_rtc_read_alarm, + .set_alarm =3D ma35d1_rtc_set_alarm, + .alarm_irq_enable =3D ma35d1_alarm_irq_enable, +}; + +static int ma35d1_rtc_probe(struct platform_device *pdev) +{ + struct ma35_rtc *rtc; + struct clk *clk; + u32 regval; + int err; + + rtc =3D devm_kzalloc(&pdev->dev, sizeof(*rtc), GFP_KERNEL); + if (!rtc) + return -ENOMEM; + + rtc->rtc_reg =3D devm_platform_ioremap_resource(pdev, 0); + if (IS_ERR(rtc->rtc_reg)) + return PTR_ERR(rtc->rtc_reg); + + clk =3D of_clk_get(pdev->dev.of_node, 0); + if (IS_ERR(clk)) + return dev_err_probe(&pdev->dev, PTR_ERR(clk), "failed to find rtc clock= \n"); + + err =3D clk_prepare_enable(clk); + if (err) + return -ENOENT; + + platform_set_drvdata(pdev, rtc); + + rtc->rtcdev =3D devm_rtc_device_register(&pdev->dev, pdev->name, + &ma35d1_rtc_ops, THIS_MODULE); + if (IS_ERR(rtc->rtcdev)) + return dev_err_probe(&pdev->dev, PTR_ERR(rtc->rtcdev), + "failed to register rtc device\n"); + + err =3D ma35d1_rtc_init(rtc, RTC_INIT_TIMEOUT); + if (err) + return err; + + regval =3D rtc_reg_read(rtc, MA35_REG_RTC_CLKFMT); + regval |=3D RTC_CLKFMT_24HEN; + rtc_reg_write(rtc, MA35_REG_RTC_CLKFMT, regval); + + rtc->irq_num =3D platform_get_irq(pdev, 0); + + err =3D devm_request_irq(&pdev->dev, rtc->irq_num, ma35d1_rtc_interrupt, + IRQF_NO_SUSPEND, "ma35d1rtc", rtc); + if (err) + return dev_err_probe(&pdev->dev, err, "Failed to request rtc irq\n"); + + regval =3D rtc_reg_read(rtc, MA35_REG_RTC_INTEN); + regval |=3D RTC_INTEN_TICKIEN; + rtc_reg_write(rtc, MA35_REG_RTC_INTEN, regval); + + device_init_wakeup(&pdev->dev, true); + + return 0; +} + +static int ma35d1_rtc_suspend(struct platform_device *pdev, pm_message_t s= tate) +{ + struct ma35_rtc *rtc =3D platform_get_drvdata(pdev); + u32 regval; + + if (device_may_wakeup(&pdev->dev)) + enable_irq_wake(rtc->irq_num); + + regval =3D rtc_reg_read(rtc, MA35_REG_RTC_INTEN); + regval &=3D ~RTC_INTEN_TICKIEN; + rtc_reg_write(rtc, MA35_REG_RTC_INTEN, regval); + + return 0; +} + +static int ma35d1_rtc_resume(struct platform_device *pdev) +{ + struct ma35_rtc *rtc =3D platform_get_drvdata(pdev); + u32 regval; + + if (device_may_wakeup(&pdev->dev)) + disable_irq_wake(rtc->irq_num); + + regval =3D rtc_reg_read(rtc, MA35_REG_RTC_INTEN); + regval |=3D RTC_INTEN_TICKIEN; + rtc_reg_write(rtc, MA35_REG_RTC_INTEN, regval); + + return 0; +} + +static const struct of_device_id ma35d1_rtc_of_match[] =3D { + { .compatible =3D "nuvoton,ma35d1-rtc", }, + {}, +}; +MODULE_DEVICE_TABLE(of, ma35d1_rtc_of_match); + +static struct platform_driver ma35d1_rtc_driver =3D { + .suspend =3D ma35d1_rtc_suspend, + .resume =3D ma35d1_rtc_resume, + .probe =3D ma35d1_rtc_probe, + .driver =3D { + .name =3D "rtc-ma35d1", + .of_match_table =3D ma35d1_rtc_of_match, + }, +}; + +module_platform_driver(ma35d1_rtc_driver); + +MODULE_AUTHOR("Min-Jen Chen "); +MODULE_DESCRIPTION("MA35D1 RTC driver"); +MODULE_LICENSE("GPL"); --=20 2.34.1