]> git.ipfire.org Git - thirdparty/u-boot.git/commitdiff
rtc: pcf85063: support loading quartz-load capacitance from device tree
authorAlexander Feilke <alexander.feilke@ew.tq-group.com>
Fri, 22 May 2026 15:39:27 +0000 (17:39 +0200)
committerTom Rini <trini@konsulko.com>
Fri, 5 Jun 2026 16:14:24 +0000 (10:14 -0600)
Use previously ignored quartz-load-femtofarads property from device tree
to set load capacitance. If missing, leave the device unconfigured
as a default might have been set. force_cap is left out for now but
can be retrofitted in the future as there may be different hardware
without the 12.500pF flag.

Reviewed-by: Alexander Sverdlin <alexander.sverdlin@siemens.com>
Signed-off-by: Alexander Feilke <alexander.feilke@ew.tq-group.com>
drivers/rtc/pcf85063.c

index 0b336b8c5ee2f2fdb4fa63baf049af7a00dc8153..107e8b4d4c8db5ae84ece1323aa9950be5b719d9 100644 (file)
@@ -140,6 +140,30 @@ static int pcf85063_write(struct udevice *dev, unsigned int offset,
        return dm_i2c_write(dev, offset, buf, len);
 }
 
+static int pcf85063_load_capacitance(struct udevice *dev)
+{
+       u32 load = 7000;
+       u8 reg = 0;
+
+       if (ofnode_read_u32(dev_ofnode(dev), "quartz-load-femtofarads", &load))
+               return 0;
+
+       switch (load) {
+       default:
+               dev_warn(dev, "Unknown quartz-load-femtofarads value: %d. Assuming 7000",
+                        load);
+               fallthrough;
+       case 7000:
+               break;
+       case 12500:
+               reg = PCF85063_REG_CTRL1_CAP_SEL;
+               break;
+       }
+
+       return dm_i2c_reg_clrset(dev, PCF85063_REG_CTRL1,
+                                PCF85063_REG_CTRL1_CAP_SEL, reg);
+}
+
 static const struct rtc_ops pcf85063_rtc_ops = {
        .get = pcf85063_get_time,
        .set = pcf85063_set_time,
@@ -150,8 +174,22 @@ static const struct rtc_ops pcf85063_rtc_ops = {
 
 static int pcf85063_probe(struct udevice *dev)
 {
+       u8 tmp;
+       int err;
+
        i2c_set_chip_flags(dev, DM_I2C_CHIP_RD_ADDRESS | DM_I2C_CHIP_WR_ADDRESS);
 
+       err = dm_i2c_read(dev, PCF85063_REG_SC, &tmp, sizeof(tmp));
+       if (err) {
+               dev_err(dev, "RTC chip is not present\n");
+               return err;
+       }
+
+       err = pcf85063_load_capacitance(dev);
+       if (err < 0)
+               dev_warn(dev, "failed to set xtal load capacitance: %d",
+                        err);
+
        return 0;
 }