f07e572f64
bcm2708: boot tested on RPi B+ v1.2 bcm2709: boot tested on RPi 3B v1.2 and RPi 4B v1.1 4G bcm2710: boot tested on RPi 3B v1.2 bcm2711: boot tested on RPi 4B v1.1 4G Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
93 lines
2.3 KiB
Diff
93 lines
2.3 KiB
Diff
From 010b506d6b215673f188ed5cdc4e35419e3ea715 Mon Sep 17 00:00:00 2001
|
|
From: Einar Vading <einar.vading@rhimagnesita.com>
|
|
Date: Fri, 14 Aug 2020 22:14:41 +0200
|
|
Subject: [PATCH] rtc: rv3028: Refresh RAM on EEPROM write
|
|
|
|
The active RV3028 settings are in RAM so after modifying the settings in
|
|
EEPROM the RAM should be refreshed so that they take effect.
|
|
|
|
Signed-off-by: Einar Vading <einar.vading@rhimagnesita.com>
|
|
---
|
|
drivers/rtc/rtc-rv3028.c | 56 ++++++++++++++++++++++++++++++++++++++++
|
|
1 file changed, 56 insertions(+)
|
|
|
|
--- a/drivers/rtc/rtc-rv3028.c
|
|
+++ b/drivers/rtc/rtc-rv3028.c
|
|
@@ -66,6 +66,7 @@
|
|
|
|
#define RV3028_EVT_CTRL_TSR BIT(2)
|
|
|
|
+#define RV3028_EEPROM_CMD_REFRESH 0x12
|
|
#define RV3028_EEPROM_CMD_WRITE 0x21
|
|
#define RV3028_EEPROM_CMD_READ 0x22
|
|
|
|
@@ -583,6 +584,58 @@ restore_eerd:
|
|
return ret;
|
|
}
|
|
|
|
+static int rv3028_ram_refresh(void *priv)
|
|
+{
|
|
+ u32 status, ctrl1;
|
|
+ int ret, err;
|
|
+
|
|
+ ret = regmap_read(priv, RV3028_CTRL1, &ctrl1);
|
|
+ if (ret)
|
|
+ return ret;
|
|
+
|
|
+ if (!(ctrl1 & RV3028_CTRL1_EERD)) {
|
|
+ ret = regmap_update_bits(priv, RV3028_CTRL1,
|
|
+ RV3028_CTRL1_EERD, RV3028_CTRL1_EERD);
|
|
+ if (ret)
|
|
+ return ret;
|
|
+
|
|
+ ret = regmap_read_poll_timeout(priv, RV3028_STATUS, status,
|
|
+ !(status & RV3028_STATUS_EEBUSY),
|
|
+ RV3028_EEBUSY_POLL,
|
|
+ RV3028_EEBUSY_TIMEOUT);
|
|
+ if (ret)
|
|
+ goto restore_eerd;
|
|
+ }
|
|
+
|
|
+ ret = regmap_write(priv, RV3028_EEPROM_CMD, 0x0);
|
|
+ if (ret)
|
|
+ goto restore_eerd;
|
|
+
|
|
+ ret = regmap_write(priv, RV3028_EEPROM_CMD,
|
|
+ RV3028_EEPROM_CMD_REFRESH);
|
|
+ if (ret)
|
|
+ goto restore_eerd;
|
|
+
|
|
+ usleep_range(RV3028_EEBUSY_POLL, RV3028_EEBUSY_TIMEOUT);
|
|
+
|
|
+ ret = regmap_read_poll_timeout(priv, RV3028_STATUS, status,
|
|
+ !(status & RV3028_STATUS_EEBUSY),
|
|
+ RV3028_EEBUSY_POLL,
|
|
+ RV3028_EEBUSY_TIMEOUT);
|
|
+ if (ret)
|
|
+ goto restore_eerd;
|
|
+
|
|
+restore_eerd:
|
|
+ if (!(ctrl1 & RV3028_CTRL1_EERD)) {
|
|
+ err = regmap_update_bits(priv, RV3028_CTRL1, RV3028_CTRL1_EERD,
|
|
+ 0);
|
|
+ if (err && !ret)
|
|
+ ret = err;
|
|
+ }
|
|
+
|
|
+ return ret;
|
|
+}
|
|
+
|
|
static struct rtc_class_ops rv3028_rtc_ops = {
|
|
.read_time = rv3028_get_time,
|
|
.set_time = rv3028_set_time,
|
|
@@ -723,6 +776,9 @@ static int rv3028_probe(struct i2c_clien
|
|
ret = rv3028_eeprom_write(
|
|
(void *)(rv3028->regmap),
|
|
RV3028_BACKUP, (void *)&backup, 1);
|
|
+
|
|
+ if (!ret)
|
|
+ ret = rv3028_ram_refresh((void *)(rv3028->regmap));
|
|
}
|
|
}
|
|
|