The current code sets RV3028_STATUS_PORF instead of clearing it, so the flag remains asserted. Use dm_i2c_reg_clrset() to clear the bit.
Signed-off-by: Javier Viguera <[email protected]> --- drivers/rtc/rv3028.c | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) Based on Linux driver: https://elixir.bootlin.com/linux/v6.19.6/source/drivers/rtc/rtc-rv3028.c#L338 diff --git a/drivers/rtc/rv3028.c b/drivers/rtc/rv3028.c index b14d2a246ffc..4e05ef8de2a2 100644 --- a/drivers/rtc/rv3028.c +++ b/drivers/rtc/rv3028.c @@ -130,7 +130,6 @@ static int rv3028_rtc_get(struct udevice *dev, struct rtc_time *tm) static int rv3028_rtc_set(struct udevice *dev, const struct rtc_time *tm) { u8 regs[RTC_RV3028_LEN]; - u8 status; int ret; debug("%s: %4d-%02d-%02d (wday=%d( %2d:%02d:%02d\n", @@ -157,13 +156,7 @@ static int rv3028_rtc_set(struct udevice *dev, const struct rtc_time *tm) return ret; } - ret = dm_i2c_read(dev, RV3028_STATUS, &status, 1); - if (ret < 0) { - printf("%s: error reading RTC status: %x\n", __func__, ret); - return -EIO; - } - status |= RV3028_STATUS_PORF; - return dm_i2c_write(dev, RV3028_STATUS, &status, 1); + return dm_i2c_reg_clrset(dev, RV3028_STATUS, RV3028_STATUS_PORF, 0); } static int rv3028_rtc_reset(struct udevice *dev)

