[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