From: Johan Hovold <johan+linaro@kernel.org>
To: Alexandre Belloni <alexandre.belloni@bootlin.com>,
Bjorn Andersson <andersson@kernel.org>
Cc: Andy Gross <agross@kernel.org>,
Konrad Dybcio <konrad.dybcio@linaro.org>,
Alessandro Zummo <a.zummo@towertech.it>,
Rob Herring <robh+dt@kernel.org>,
Krzysztof Kozlowski <krzysztof.kozlowski+dt@linaro.org>,
Maximilian Luz <luzmaximilian@gmail.com>,
linux-arm-msm@vger.kernel.org, linux-rtc@vger.kernel.org,
devicetree@vger.kernel.org, linux-kernel@vger.kernel.org,
Johan Hovold <johan+linaro@kernel.org>
Subject: [PATCH 00/24] rtc: pm8xxx: add support for setting time using nvmem
Date: Thu, 26 Jan 2023 15:20:33 +0100 [thread overview]
Message-ID: <20230126142057.25715-1-johan+linaro@kernel.org> (raw)
This series adds support for setting the RTC time on Qualcomm platforms
where the PMIC RTC time registers are read-only by instead storing an
offset in some other non-volatile memory. This is used to enable the RTC
in the SC8280XP Compute Reference Design (CRD) and Lenovo Thinkpad X13s
laptop.
The RTCs in many Qualcomm devices are effectively broken due to the time
registers being read-only. Instead some other non-volatile memory can be
used to store and offset which a driver can take into account. On
machines like the X13s, the UEFI firmware (and Windows) use a UEFI
variable for storing such an offset, but not all Qualcomm systems use
UEFI.
The Qualcomm firmware also does not support any UEFI runtime services,
but Maximilian Luz recently posted a driver for talking to the secure
world directly through the SCM interface and this can be used to access
the UEFI variables:
https://lore.kernel.org/all/20220723224949.1089973-1-luzmaximilian@gmail.com/
I was initially told that the PMICs in the X13s did not have any spare
battery-backed registers which could have been used to store an RTC
offset so there seemed to be no alternative to try using the UEFI
offset. In the processes however, I learnt that there are in fact some
registers in PMIC that could be used, at least on the SC8280XP CRD and
the X13s.
This was especially fortunate as it turned out that the firmware on the
CRD does not allow updating the UEFI RTC offset even if this works on
the X13s.
As the benefit of sharing the RTC offset with the UEFI firmware (and
Windows) is rather small (e.g. to make sure they never get out sync), I
instead opted for using the PMIC registers on both machines. This also
avoids relying on a fairly complex reverse-engineered firmware driver,
as well as potential issues like flash wear due to RTC drift. Let's keep
it simple.
But as there could be older Qualcomm UEFI machines out there where we
don't have any other non-volatile storage I included the UEFI patches
here as an RFC for reference. In case it turns out there are systems out
there were this could be used, those two patches could be merged as
well. An alternative could be to see if Maximilian's work could be
extended to access the time services directly.
This series first fixes a few issues with the current Qualcomm PMIC RTC
driver before cleaning it up a bit so that support for setting the time
using an offset stored in an nvmem cell can be added.
The two RFC patches on top, add support for the Qualcomm UEFI RTC offset
and are not intended to be merged just yet. Note that these two also
depend on an efi core patch that has been merged for 6.3:
https://lore.kernel.org/all/20230119164255.28091-1-johan+linaro@kernel.org/
The final patches enables the RTC on the SC8280XP CRD and X13s and can
be merged by Bjorn once the (non-UEFI) RTC patches are in.
Note that for the SDAM nvmem driver to be autoloaded when built as a
module, you also need this fix:
https://lore.kernel.org/lkml/20230126133034.27491-1-johan+linaro@kernel.org/
Johan
Johan Hovold (24):
rtc: pm8xxx: fix set-alarm race
rtc: pm8xxx: drop spmi error messages
rtc: pm8xxx: use regmap_update_bits()
rtc: pm8xxx: drop bogus locking
rtc: pm8xxx: return IRQ_NONE on errors
rtc: pm8xxx: drop unused register defines
rtc: pm8xxx: use unaligned le32 helpers
rtc: pm8xxx: clean up time and alarm debugging
rtc: pm8xxx: rename struct device pointer
rtc: pm8xxx: rename alarm irq variable
rtc: pm8xxx: clean up comments
rtc: pm8xxx: use u32 for timestamps
rtc: pm8xxx: refactor read_time()
rtc: pm8xxx: clean up local declarations
dt-bindings: rtc: qcom-pm8xxx: add nvmem-cell offset
rtc: pm8xxx: add support for nvmem offset
rtc: pm8xxx: add copyright notice
dt-bindings: rtc: qcom-pm8xxx: add uefi-variable offset
rtc: pm8xxx: add support for uefi offset
arm64: defconfig: enable Qualcomm SDAM nvmem driver
arm64: dts: qcom: sc8280xp-pmics: add pmk8280 rtc
arm64: dts: qcom: sc8280xp-pmics: add pmk8280 sdam nvram
arm64: dts: qcom: sc8280xp-crd: enable rtc
arm64: dts: qcom: sc8280xp-x13s: enable rtc
.../bindings/rtc/qcom-pm8xxx-rtc.yaml | 18 +
arch/arm64/boot/dts/qcom/sc8280xp-crd.dts | 15 +
.../qcom/sc8280xp-lenovo-thinkpad-x13s.dts | 15 +
arch/arm64/boot/dts/qcom/sc8280xp-pmics.dtsi | 18 +
arch/arm64/configs/defconfig | 1 +
drivers/rtc/rtc-pm8xxx.c | 639 ++++++++++--------
include/linux/rtc.h | 1 +
7 files changed, 443 insertions(+), 264 deletions(-)
--
2.39.1
next reply other threads:[~2023-01-26 14:23 UTC|newest]
Thread overview: 44+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-01-26 14:20 Johan Hovold [this message]
2023-01-26 14:20 ` [PATCH 01/24] rtc: pm8xxx: fix set-alarm race Johan Hovold
2023-01-26 14:20 ` [PATCH 02/24] rtc: pm8xxx: drop spmi error messages Johan Hovold
2023-01-26 14:20 ` [PATCH 03/24] rtc: pm8xxx: use regmap_update_bits() Johan Hovold
2023-01-26 14:20 ` [PATCH 04/24] rtc: pm8xxx: drop bogus locking Johan Hovold
2023-01-26 14:20 ` [PATCH 05/24] rtc: pm8xxx: return IRQ_NONE on errors Johan Hovold
2023-01-26 14:20 ` [PATCH 06/24] rtc: pm8xxx: drop unused register defines Johan Hovold
2023-01-26 14:20 ` [PATCH 07/24] rtc: pm8xxx: use unaligned le32 helpers Johan Hovold
2023-01-26 14:20 ` [PATCH 08/24] rtc: pm8xxx: clean up time and alarm debugging Johan Hovold
2023-01-26 14:20 ` [PATCH 09/24] rtc: pm8xxx: rename struct device pointer Johan Hovold
2023-01-26 14:20 ` [PATCH 10/24] rtc: pm8xxx: rename alarm irq variable Johan Hovold
2023-01-26 14:20 ` [PATCH 11/24] rtc: pm8xxx: clean up comments Johan Hovold
2023-01-26 14:20 ` [PATCH 12/24] rtc: pm8xxx: use u32 for timestamps Johan Hovold
2023-01-26 14:20 ` [PATCH 13/24] rtc: pm8xxx: refactor read_time() Johan Hovold
2023-01-26 14:20 ` [PATCH 14/24] rtc: pm8xxx: clean up local declarations Johan Hovold
2023-01-26 14:20 ` [PATCH 15/24] dt-bindings: rtc: qcom-pm8xxx: add nvmem-cell offset Johan Hovold
2023-01-26 15:56 ` Krzysztof Kozlowski
2023-01-26 14:20 ` [PATCH 16/24] rtc: pm8xxx: add support for nvmem offset Johan Hovold
2023-01-27 14:13 ` Srinivas Kandagatla
2023-01-27 15:32 ` Johan Hovold
2023-01-27 15:09 ` Alexandre Belloni
2023-01-27 15:51 ` Johan Hovold
2023-01-27 16:05 ` Alexandre Belloni
2023-02-02 15:12 ` Johan Hovold
2023-02-02 15:21 ` Alexandre Belloni
2023-01-26 14:20 ` [PATCH 17/24] rtc: pm8xxx: add copyright notice Johan Hovold
2023-01-26 16:06 ` Alexandre Belloni
2023-01-27 13:04 ` Johan Hovold
2023-01-27 14:14 ` Krzysztof Kozlowski
2023-02-02 10:22 ` Johan Hovold
2023-01-26 14:20 ` [RFC 18/24] dt-bindings: rtc: qcom-pm8xxx: add uefi-variable offset Johan Hovold
2023-01-30 18:49 ` Rob Herring
2023-02-01 16:09 ` Johan Hovold
2023-02-09 16:59 ` Ard Biesheuvel
2023-01-26 14:20 ` [PATCH 19/24] rtc: pm8xxx: add support for uefi offset Johan Hovold
2023-01-26 14:27 ` Johan Hovold
2023-01-27 15:19 ` Alexandre Belloni
2023-01-27 15:26 ` Johan Hovold
2023-01-27 15:59 ` Alexandre Belloni
2023-01-26 14:20 ` [PATCH 20/24] arm64: defconfig: enable Qualcomm SDAM nvmem driver Johan Hovold
2023-01-26 14:20 ` [PATCH 21/24] arm64: dts: qcom: sc8280xp-pmics: add pmk8280 rtc Johan Hovold
2023-01-26 14:20 ` [PATCH 22/24] arm64: dts: qcom: sc8280xp-pmics: add pmk8280 sdam nvram Johan Hovold
2023-01-26 14:20 ` [PATCH 23/24] arm64: dts: qcom: sc8280xp-crd: enable rtc Johan Hovold
2023-01-26 14:20 ` [PATCH 24/24] arm64: dts: qcom: sc8280xp-x13s: " Johan Hovold
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230126142057.25715-1-johan+linaro@kernel.org \
--to=johan+linaro@kernel.org \
--cc=a.zummo@towertech.it \
--cc=agross@kernel.org \
--cc=alexandre.belloni@bootlin.com \
--cc=andersson@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=konrad.dybcio@linaro.org \
--cc=krzysztof.kozlowski+dt@linaro.org \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-rtc@vger.kernel.org \
--cc=luzmaximilian@gmail.com \
--cc=robh+dt@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).