1 From 010b506d6b215673f188ed5cdc4e35419e3ea715 Mon Sep 17 00:00:00 2001
2 From: Einar Vading <einar.vading@rhimagnesita.com>
3 Date: Fri, 14 Aug 2020 22:14:41 +0200
4 Subject: [PATCH] rtc: rv3028: Refresh RAM on EEPROM write
6 The active RV3028 settings are in RAM so after modifying the settings in
7 EEPROM the RAM should be refreshed so that they take effect.
9 Signed-off-by: Einar Vading <einar.vading@rhimagnesita.com>
11 drivers/rtc/rtc-rv3028.c | 56 ++++++++++++++++++++++++++++++++++++++++
12 1 file changed, 56 insertions(+)
14 --- a/drivers/rtc/rtc-rv3028.c
15 +++ b/drivers/rtc/rtc-rv3028.c
18 #define RV3028_EVT_CTRL_TSR BIT(2)
20 +#define RV3028_EEPROM_CMD_REFRESH 0x12
21 #define RV3028_EEPROM_CMD_WRITE 0x21
22 #define RV3028_EEPROM_CMD_READ 0x22
24 @@ -583,6 +584,58 @@ restore_eerd:
28 +static int rv3028_ram_refresh(void *priv)
33 + ret = regmap_read(priv, RV3028_CTRL1, &ctrl1);
37 + if (!(ctrl1 & RV3028_CTRL1_EERD)) {
38 + ret = regmap_update_bits(priv, RV3028_CTRL1,
39 + RV3028_CTRL1_EERD, RV3028_CTRL1_EERD);
43 + ret = regmap_read_poll_timeout(priv, RV3028_STATUS, status,
44 + !(status & RV3028_STATUS_EEBUSY),
46 + RV3028_EEBUSY_TIMEOUT);
51 + ret = regmap_write(priv, RV3028_EEPROM_CMD, 0x0);
55 + ret = regmap_write(priv, RV3028_EEPROM_CMD,
56 + RV3028_EEPROM_CMD_REFRESH);
60 + usleep_range(RV3028_EEBUSY_POLL, RV3028_EEBUSY_TIMEOUT);
62 + ret = regmap_read_poll_timeout(priv, RV3028_STATUS, status,
63 + !(status & RV3028_STATUS_EEBUSY),
65 + RV3028_EEBUSY_TIMEOUT);
70 + if (!(ctrl1 & RV3028_CTRL1_EERD)) {
71 + err = regmap_update_bits(priv, RV3028_CTRL1, RV3028_CTRL1_EERD,
80 static struct rtc_class_ops rv3028_rtc_ops = {
81 .read_time = rv3028_get_time,
82 .set_time = rv3028_set_time,
83 @@ -723,6 +776,9 @@ static int rv3028_probe(struct i2c_clien
84 ret = rv3028_eeprom_write(
85 (void *)(rv3028->regmap),
86 RV3028_BACKUP, (void *)&backup, 1);
89 + ret = rv3028_ram_refresh((void *)(rv3028->regmap));