rtc: rv3028: Add backup switchover mode support
authorPhil Howard <phil@gadgetoid.com>
Fri, 29 Mar 2019 10:53:14 +0000 (10:53 +0000)
committerDom Cobley <popcornmix@gmail.com>
Mon, 19 Feb 2024 11:33:39 +0000 (11:33 +0000)
Signed-off-by: Phil Howard <phil@pimoroni.com>
drivers/rtc/rtc-rv3028.c

index 2f001c5..51f542d 100644 (file)
@@ -858,16 +858,17 @@ static const struct regmap_config regmap_config = {
 static u8 rv3028_set_trickle_charger(struct rv3028_data *rv3028,
                                     struct i2c_client *client)
 {
-       int ret, val_old, val;
+       int ret, val_old, val, val_mask;
        u32 ohms, chargeable;
+       u32 bsm;
 
        ret = regmap_read(rv3028->regmap, RV3028_BACKUP, &val_old);
        if (ret < 0)
                return ret;
 
        /* mask out only trickle charger bits */
-       val_old = val_old & (RV3028_BACKUP_TCE | RV3028_BACKUP_TCR_MASK);
-       val = val_old;
+       val_mask = RV3028_BACKUP_TCE | RV3028_BACKUP_TCR_MASK;
+       val = val_old & val_mask;
 
        /* setup trickle charger */
        if (!device_property_read_u32(&client->dev, "trickle-resistor-ohms",
@@ -902,10 +903,21 @@ static u8 rv3028_set_trickle_charger(struct rv3028_data *rv3028,
                }
        }
 
+       /* setup backup switchover mode */
+       if (!device_property_read_u32(&client->dev,
+                                     "backup-switchover-mode",
+                                     &bsm)) {
+               if (bsm <= 3) {
+                       val_mask |= RV3028_BACKUP_BSM;
+                       val |= (u8)(bsm << 2);
+               } else {
+                       dev_warn(&client->dev, "invalid backup switchover mode value\n");
+               }
+       }
+
        /* only update EEPROM if changes are necessary */
-       if (val_old != val) {
-               ret = rv3028_update_cfg(rv3028, RV3028_BACKUP, RV3028_BACKUP_TCE |
-                                               RV3028_BACKUP_TCR_MASK, val);
+       if ((val_old & val_mask) != val) {
+               ret = rv3028_update_cfg(rv3028, RV3028_BACKUP, val_mask, val);
                if (ret)
                        return ret;
        }