summaryrefslogtreecommitdiff
path: root/drivers/rtc
diff options
context:
space:
mode:
authorAlexander Feilke <[email protected]>2026-05-22 17:39:27 +0200
committerTom Rini <[email protected]>2026-06-05 10:14:24 -0600
commitd8f535cd8f7cb5f9231f91a3307895db7c9f9552 (patch)
treec54cbdec32e7d9afda15266af28c6462f96874f6 /drivers/rtc
parent2b6de25797b49a1b3eff6d24bfa0f7808028b962 (diff)
rtc: pcf85063: support loading quartz-load capacitance from device tree
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 <[email protected]> Signed-off-by: Alexander Feilke <[email protected]>
Diffstat (limited to 'drivers/rtc')
-rw-r--r--drivers/rtc/pcf85063.c38
1 files changed, 38 insertions, 0 deletions
diff --git a/drivers/rtc/pcf85063.c b/drivers/rtc/pcf85063.c
index 0b336b8c5ee..107e8b4d4c8 100644
--- a/drivers/rtc/pcf85063.c
+++ b/drivers/rtc/pcf85063.c
@@ -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;
}