{
        int rc, i;
        u8 value[NUM_8_BIT_RTC_REGS];
-       unsigned int ctrl_reg;
        unsigned long secs, irq_flags;
        struct pm8xxx_rtc *rtc_dd = dev_get_drvdata(dev);
        const struct pm8xxx_rtc_regs *regs = rtc_dd->regs;
                secs >>= 8;
        }
 
+       rc = regmap_update_bits(rtc_dd->regmap, regs->alarm_ctrl,
+                               regs->alarm_en, 0);
+       if (rc)
+               return rc;
+
        spin_lock_irqsave(&rtc_dd->ctrl_reg_lock, irq_flags);
 
        rc = regmap_bulk_write(rtc_dd->regmap, regs->alarm_rw, value,
                goto rtc_rw_fail;
        }
 
-       rc = regmap_read(rtc_dd->regmap, regs->alarm_ctrl, &ctrl_reg);
-       if (rc)
-               goto rtc_rw_fail;
-
-       if (alarm->enabled)
-               ctrl_reg |= regs->alarm_en;
-       else
-               ctrl_reg &= ~regs->alarm_en;
-
-       rc = regmap_write(rtc_dd->regmap, regs->alarm_ctrl, ctrl_reg);
-       if (rc) {
-               dev_err(dev, "Write to RTC alarm control register failed\n");
-               goto rtc_rw_fail;
+       if (alarm->enabled) {
+               rc = regmap_update_bits(rtc_dd->regmap, regs->alarm_ctrl,
+                                       regs->alarm_en, regs->alarm_en);
+               if (rc)
+                       goto rtc_rw_fail;
        }
 
        dev_dbg(dev, "Alarm Set for h:m:s=%ptRt, y-m-d=%ptRdr\n",