rtc: pm8xxx: refactor read_time()
authorJohan Hovold <johan+linaro@kernel.org>
Thu, 2 Feb 2023 15:54:39 +0000 (16:54 +0100)
committerAlexandre Belloni <alexandre.belloni@bootlin.com>
Thu, 9 Feb 2023 22:23:44 +0000 (23:23 +0100)
In preparation for adding support for setting the time by means of an
externally stored offset, refactor read_time() by adding a new helper
that can be used to retrieve the raw time as stored in the RTC.

Signed-off-by: Johan Hovold <johan+linaro@kernel.org>
Link: https://lore.kernel.org/r/20230202155448.6715-14-johan+linaro@kernel.org
Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
drivers/rtc/rtc-pm8xxx.c

index b1ce246..2f96a17 100644 (file)
@@ -59,6 +59,37 @@ struct pm8xxx_rtc {
        struct device *dev;
 };
 
+static int pm8xxx_rtc_read_raw(struct pm8xxx_rtc *rtc_dd, u32 *secs)
+{
+       const struct pm8xxx_rtc_regs *regs = rtc_dd->regs;
+       u8 value[NUM_8_BIT_RTC_REGS];
+       unsigned int reg;
+       int rc;
+
+       rc = regmap_bulk_read(rtc_dd->regmap, regs->read, value, sizeof(value));
+       if (rc)
+               return rc;
+
+       /*
+        * Read the LSB again and check if there has been a carry over.
+        * If there has, redo the read operation.
+        */
+       rc = regmap_read(rtc_dd->regmap, regs->read, &reg);
+       if (rc < 0)
+               return rc;
+
+       if (reg < value[0]) {
+               rc = regmap_bulk_read(rtc_dd->regmap, regs->read, value,
+                                     sizeof(value));
+               if (rc)
+                       return rc;
+       }
+
+       *secs = get_unaligned_le32(value);
+
+       return 0;
+}
+
 /*
  * Steps to write the RTC registers.
  * 1. Disable alarm if enabled.
@@ -129,33 +160,14 @@ static int pm8xxx_rtc_set_time(struct device *dev, struct rtc_time *tm)
 
 static int pm8xxx_rtc_read_time(struct device *dev, struct rtc_time *tm)
 {
-       int rc;
-       u8 value[NUM_8_BIT_RTC_REGS];
-       unsigned int reg;
        struct pm8xxx_rtc *rtc_dd = dev_get_drvdata(dev);
-       const struct pm8xxx_rtc_regs *regs = rtc_dd->regs;
        u32 secs;
+       int rc;
 
-       rc = regmap_bulk_read(rtc_dd->regmap, regs->read, value, sizeof(value));
+       rc = pm8xxx_rtc_read_raw(rtc_dd, &secs);
        if (rc)
                return rc;
 
-       /*
-        * Read the LSB again and check if there has been a carry over.
-        * If there is, redo the read operation.
-        */
-       rc = regmap_read(rtc_dd->regmap, regs->read, &reg);
-       if (rc < 0)
-               return rc;
-
-       if (unlikely(reg < value[0])) {
-               rc = regmap_bulk_read(rtc_dd->regmap, regs->read,
-                                     value, sizeof(value));
-               if (rc)
-                       return rc;
-       }
-
-       secs = get_unaligned_le32(value);
        rtc_time64_to_tm(secs, tm);
 
        dev_dbg(dev, "read time: %ptRd %ptRt (%u)\n", tm, tm, secs);