lkml.org 
[lkml]   [2023]   [Jan]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    From
    Subject[PATCH 00/24] rtc: pm8xxx: add support for setting time using nvmem
    Date
    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

    \
     
     \ /
      Last update: 2023-03-26 23:56    [W:4.401 / U:0.040 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site