[PATCH v2 5/8] rtc: pcf85063: keep the divider chain in reset during set_time
Sverdlin, Alexander
alexander.sverdlin at siemens.com
Tue May 12 11:04:10 CEST 2026
On Mon, 2026-05-11 at 14:09 +0200, Alexander Feilke wrote:
> From: Alexander Feilke <alexander.feilke at ew.tq-group.com>
>
> Sync from upstream linux v6.19.
>
> Signed-off-by: Alexander Feilke <alexander.feilke at ew.tq-group.com>
Reviewed-by: Alexander Sverdlin <alexander.sverdlin at siemens.com>
> ---
> drivers/rtc/pcf85063.c | 25 ++++++++++++++++++++++++-
> 1 file changed, 24 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/rtc/pcf85063.c b/drivers/rtc/pcf85063.c
> index 06c85d939e0..0b336b8c5ee 100644
> --- a/drivers/rtc/pcf85063.c
> +++ b/drivers/rtc/pcf85063.c
> @@ -68,12 +68,25 @@ static int pcf85063_get_time(struct udevice *dev, struct rtc_time *tm)
> static int pcf85063_set_time(struct udevice *dev, const struct rtc_time *tm)
> {
> u8 regs[7];
> + int rc;
>
> if (tm->tm_year < 2000 || tm->tm_year > 2099) {
> dev_err(dev, "Year must be between 2000 and 2099.\n");
> return -EINVAL;
> }
>
> + /*
> + * to accurately set the time, reset the divider chain and keep it in
> + * reset state until all time/date registers are written
> + */
> + rc = dm_i2c_reg_clrset(dev, PCF85063_REG_CTRL1,
> + PCF85063_REG_CTRL1_EXT_TEST |
> + PCF85063_REG_CTRL1_STOP,
> + PCF85063_REG_CTRL1_STOP);
> +
> + if (rc)
> + return rc;
> +
> /* hours, minutes and seconds */
> regs[0] = bin2bcd(tm->tm_sec) & (~PCF85063_REG_SC_OS);
>
> @@ -91,7 +104,17 @@ static int pcf85063_set_time(struct udevice *dev, const struct rtc_time *tm)
> /* adjust register to match rtc_time spec */
> regs[6] = bin2bcd(tm->tm_year % 100);
>
> - return dm_i2c_write(dev, PCF85063_REG_SC, regs, sizeof(regs));
> + rc = dm_i2c_write(dev, PCF85063_REG_SC, regs, sizeof(regs));
> + if (rc)
> + return rc;
> +
> + /*
> + * Write the control register as a separate action since the size of
> + * the register space is different between the PCF85063TP and
> + * PCF85063A devices. The rollover point can not be used.
> + */
> + return dm_i2c_reg_clrset(dev, PCF85063_REG_CTRL1,
> + PCF85063_REG_CTRL1_STOP, 0);
> }
>
> static int pcf85063_reset(struct udevice *dev)
--
Alexander Sverdlin
Siemens AG
www.siemens.com
More information about the U-Boot
mailing list