diff options
| author | Alexander Feilke <[email protected]> | 2026-05-22 17:39:27 +0200 |
|---|---|---|
| committer | Tom Rini <[email protected]> | 2026-06-05 10:14:24 -0600 |
| commit | d8f535cd8f7cb5f9231f91a3307895db7c9f9552 (patch) | |
| tree | c54cbdec32e7d9afda15266af28c6462f96874f6 /drivers/rtc | |
| parent | 2b6de25797b49a1b3eff6d24bfa0f7808028b962 (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.c | 38 |
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; } |
