#include <linux/slab.h>
 #include <linux/spinlock.h>
 
+#include <asm/unaligned.h>
+
 /* RTC_CTRL register bit fields */
 #define PM8xxx_RTC_ENABLE              BIT(7)
 #define PM8xxx_RTC_ALARM_CLEAR         BIT(0)
  */
 static int pm8xxx_rtc_set_time(struct device *dev, struct rtc_time *tm)
 {
-       int rc, i;
        struct pm8xxx_rtc *rtc_dd = dev_get_drvdata(dev);
        const struct pm8xxx_rtc_regs *regs = rtc_dd->regs;
        u8 value[NUM_8_BIT_RTC_REGS];
        bool alarm_enabled;
        unsigned long secs;
+       int rc;
 
        if (!rtc_dd->allow_set_time)
                return -ENODEV;
 
        secs = rtc_tm_to_time64(tm);
+       put_unaligned_le32(secs, value);
 
        dev_dbg(dev, "Seconds value to be written to RTC = %lu\n", secs);
 
-       for (i = 0; i < NUM_8_BIT_RTC_REGS; i++) {
-               value[i] = secs & 0xFF;
-               secs >>= 8;
-       }
-
        rc = regmap_update_bits_check(rtc_dd->regmap, regs->alarm_ctrl,
                                      regs->alarm_en, 0, &alarm_enabled);
        if (rc)
                        return rc;
        }
 
-       secs = value[0] | (value[1] << 8) | (value[2] << 16) |
-              ((unsigned long)value[3] << 24);
-
+       secs = get_unaligned_le32(value);
        rtc_time64_to_tm(secs, tm);
 
        dev_dbg(dev, "secs = %lu, h:m:s == %ptRt, y-m-d = %ptRdr\n", secs, tm, tm);
 
 static int pm8xxx_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alarm)
 {
-       int rc, i;
        u8 value[NUM_8_BIT_RTC_REGS];
        struct pm8xxx_rtc *rtc_dd = dev_get_drvdata(dev);
        const struct pm8xxx_rtc_regs *regs = rtc_dd->regs;
        unsigned long secs;
+       int rc;
 
        secs = rtc_tm_to_time64(&alarm->time);
-
-       for (i = 0; i < NUM_8_BIT_RTC_REGS; i++) {
-               value[i] = secs & 0xFF;
-               secs >>= 8;
-       }
+       put_unaligned_le32(secs, value);
 
        rc = regmap_update_bits(rtc_dd->regmap, regs->alarm_ctrl,
                                regs->alarm_en, 0);
        if (rc)
                return rc;
 
-       secs = value[0] | (value[1] << 8) | (value[2] << 16) |
-              ((unsigned long)value[3] << 24);
-
+       secs = get_unaligned_le32(value);
        rtc_time64_to_tm(secs, &alarm->time);
 
        rc = regmap_read(rtc_dd->regmap, regs->alarm_ctrl, &ctrl_reg);