irqen = irqsta & ~RTC_IRQ_EN_AL;
                mutex_lock(&rtc->lock);
                if (regmap_write(rtc->regmap, rtc->addr_base + RTC_IRQ_EN,
-                                irqen) < 0)
+                                irqen) == 0)
                        mtk_rtc_write_trigger(rtc);
                mutex_unlock(&rtc->lock);
 
        alm->pending = !!(pdn2 & RTC_PDN2_PWRON_ALARM);
        mutex_unlock(&rtc->lock);
 
-       tm->tm_sec = data[RTC_OFFSET_SEC];
-       tm->tm_min = data[RTC_OFFSET_MIN];
-       tm->tm_hour = data[RTC_OFFSET_HOUR];
-       tm->tm_mday = data[RTC_OFFSET_DOM];
-       tm->tm_mon = data[RTC_OFFSET_MTH];
-       tm->tm_year = data[RTC_OFFSET_YEAR];
+       tm->tm_sec = data[RTC_OFFSET_SEC] & RTC_AL_SEC_MASK;
+       tm->tm_min = data[RTC_OFFSET_MIN] & RTC_AL_MIN_MASK;
+       tm->tm_hour = data[RTC_OFFSET_HOUR] & RTC_AL_HOU_MASK;
+       tm->tm_mday = data[RTC_OFFSET_DOM] & RTC_AL_DOM_MASK;
+       tm->tm_mon = data[RTC_OFFSET_MTH] & RTC_AL_MTH_MASK;
+       tm->tm_year = data[RTC_OFFSET_YEAR] & RTC_AL_YEA_MASK;
 
        tm->tm_year += RTC_MIN_YEAR_OFFSET;
        tm->tm_mon--;
        tm->tm_year -= RTC_MIN_YEAR_OFFSET;
        tm->tm_mon++;
 
-       data[RTC_OFFSET_SEC] = tm->tm_sec;
-       data[RTC_OFFSET_MIN] = tm->tm_min;
-       data[RTC_OFFSET_HOUR] = tm->tm_hour;
-       data[RTC_OFFSET_DOM] = tm->tm_mday;
-       data[RTC_OFFSET_MTH] = tm->tm_mon;
-       data[RTC_OFFSET_YEAR] = tm->tm_year;
-
        mutex_lock(&rtc->lock);
+       ret = regmap_bulk_read(rtc->regmap, rtc->addr_base + RTC_AL_SEC,
+                              data, RTC_OFFSET_COUNT);
+       if (ret < 0)
+               goto exit;
+
+       data[RTC_OFFSET_SEC] = ((data[RTC_OFFSET_SEC] & ~(RTC_AL_SEC_MASK)) |
+                               (tm->tm_sec & RTC_AL_SEC_MASK));
+       data[RTC_OFFSET_MIN] = ((data[RTC_OFFSET_MIN] & ~(RTC_AL_MIN_MASK)) |
+                               (tm->tm_min & RTC_AL_MIN_MASK));
+       data[RTC_OFFSET_HOUR] = ((data[RTC_OFFSET_HOUR] & ~(RTC_AL_HOU_MASK)) |
+                               (tm->tm_hour & RTC_AL_HOU_MASK));
+       data[RTC_OFFSET_DOM] = ((data[RTC_OFFSET_DOM] & ~(RTC_AL_DOM_MASK)) |
+                               (tm->tm_mday & RTC_AL_DOM_MASK));
+       data[RTC_OFFSET_MTH] = ((data[RTC_OFFSET_MTH] & ~(RTC_AL_MTH_MASK)) |
+                               (tm->tm_mon & RTC_AL_MTH_MASK));
+       data[RTC_OFFSET_YEAR] = ((data[RTC_OFFSET_YEAR] & ~(RTC_AL_YEA_MASK)) |
+                               (tm->tm_year & RTC_AL_YEA_MASK));
+
        if (alm->enabled) {
                ret = regmap_bulk_write(rtc->regmap,
                                        rtc->addr_base + RTC_AL_SEC,