Linux RTC
 help / color / mirror / Atom feed
* [PATCH 0/4] rtc: pcf2127: add support for battery low voltage detection
@ 2026-03-11 20:02 Hugo Villeneuve
  2026-03-11 20:02 ` [PATCH 1/4] rtc: pcf2127: remove redundant break statement in switch-case Hugo Villeneuve
                   ` (5 more replies)
  0 siblings, 6 replies; 11+ messages in thread
From: Hugo Villeneuve @ 2026-03-11 20:02 UTC (permalink / raw)
  To: alexandre.belloni
  Cc: linux-rtc, linux-kernel, hugo, bruno.thomsen, giampiero,
	p.rosenberger, antonio, Hugo Villeneuve

From: Hugo Villeneuve <hvilleneuve@dimonoff.com>

Hello,
this patch series adds support for battery low voltage detection configuration
for RTC devicesm, with specifc changes targeted at the pcf2127/2131 devices.

The origin of this patch goes back to the initial commit to add support for the
PCF2131 device. On the PCF2131, the battery low voltage detection is disabled by
default at the hardware level, contrary to the PCF2127 where it is enabled by
default. Because of that, a lot of people are stuck with a PCF2131 RTC device
using a battery backup, but unable to use it!

A lot of people are writing to me in private emails to report this as a bug
in the PCF2131 driver. Others (and me) have proposed to implement device tree
properties to enable these functions, but this was rejected [1][2][3].

It is important to note that some projects do not have the luxury to modify
the bootloder to enable that function at boot, and for these having a DT
property that could be put in a DT overlay would simplify a lot their life.
Also having to rely on a userspace application to configure the RTC is also
not ideal, as some projects use stock Debian distros (for example), and
adding a new application to their repository is not trivial or easy.

So as the next best thing, this patch aims to add what is missing in the driver,
the ability to enable/disable the battery low voltage detection with ioctls,
similarly to what is done with the BSM.

This patch has been tested on a custom board with a PCF2131 and using my
userspace application:

    git clone -b batlow_param git@git.hugovil.com:repos/hvrtc.git

Thank you.

Link: https://lore.kernel.org/linux-rtc/20190910143945.9364-1-bruno.thomsen@gmail.com/ [1]
Link: https://lore.kernel.org/linux-rtc/20191211163354.GC1463890@piout.net/ [2]
Link: https://lore.kernel.org/linux-rtc/20230123170731.6064430c50f5fb7b484d8734@hugovil.com/ [3]

Hugo Villeneuve (4):
  rtc: pcf2127: remove redundant break statement in switch-case
  rtc: pcf2127: add pcf2127_pwrmng_get/set
  rtc: add battery low voltage detection feature
  rtc: pcf2127: support battery low voltage detection function

 drivers/rtc/rtc-pcf2127.c | 94 ++++++++++++++++++++++++++++++---------
 include/uapi/linux/rtc.h  |  7 ++-
 2 files changed, 80 insertions(+), 21 deletions(-)


base-commit: 6de23f81a5e08be8fbf5e8d7e9febc72a5b5f27f
-- 
2.47.3


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [PATCH 1/4] rtc: pcf2127: remove redundant break statement in switch-case
  2026-03-11 20:02 [PATCH 0/4] rtc: pcf2127: add support for battery low voltage detection Hugo Villeneuve
@ 2026-03-11 20:02 ` Hugo Villeneuve
  2026-03-11 20:02 ` [PATCH 2/4] rtc: pcf2127: add pcf2127_pwrmng_get/set Hugo Villeneuve
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 11+ messages in thread
From: Hugo Villeneuve @ 2026-03-11 20:02 UTC (permalink / raw)
  To: alexandre.belloni
  Cc: linux-rtc, linux-kernel, hugo, bruno.thomsen, giampiero,
	p.rosenberger, antonio, Hugo Villeneuve

From: Hugo Villeneuve <hvilleneuve@dimonoff.com>

Remove unreachable break statement after return.

Signed-off-by: Hugo Villeneuve <hvilleneuve@dimonoff.com>
---
 drivers/rtc/rtc-pcf2127.c | 2 --
 1 file changed, 2 deletions(-)

diff --git a/drivers/rtc/rtc-pcf2127.c b/drivers/rtc/rtc-pcf2127.c
index bb4fe81d3d62c..e2e9746027348 100644
--- a/drivers/rtc/rtc-pcf2127.c
+++ b/drivers/rtc/rtc-pcf2127.c
@@ -404,8 +404,6 @@ static int pcf2127_param_set(struct device *dev, struct rtc_param *param)
 					  PCF2127_CTRL3_PM,
 					  FIELD_PREP(PCF2127_CTRL3_PM, mode + value));
 
-		break;
-
 	default:
 		return -EINVAL;
 	}
-- 
2.47.3


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 2/4] rtc: pcf2127: add pcf2127_pwrmng_get/set
  2026-03-11 20:02 [PATCH 0/4] rtc: pcf2127: add support for battery low voltage detection Hugo Villeneuve
  2026-03-11 20:02 ` [PATCH 1/4] rtc: pcf2127: remove redundant break statement in switch-case Hugo Villeneuve
@ 2026-03-11 20:02 ` Hugo Villeneuve
  2026-08-06 12:53   ` Stefan Kerkmann
  2026-03-11 20:02 ` [PATCH 3/4] rtc: add battery low voltage detection feature Hugo Villeneuve
                   ` (3 subsequent siblings)
  5 siblings, 1 reply; 11+ messages in thread
From: Hugo Villeneuve @ 2026-03-11 20:02 UTC (permalink / raw)
  To: alexandre.belloni
  Cc: linux-rtc, linux-kernel, hugo, bruno.thomsen, giampiero,
	p.rosenberger, antonio, Hugo Villeneuve

From: Hugo Villeneuve <hvilleneuve@dimonoff.com>

Add common functions to get/set the pwrmng field in the CTRL3 register,
used by pcf2127_param_get() and pcf2127_param_set().

Signed-off-by: Hugo Villeneuve <hvilleneuve@dimonoff.com>
---
These functions will also be used in the following patch
to add battery low detection.
---
 drivers/rtc/rtc-pcf2127.c | 42 +++++++++++++++++++++++++++------------
 1 file changed, 29 insertions(+), 13 deletions(-)

diff --git a/drivers/rtc/rtc-pcf2127.c b/drivers/rtc/rtc-pcf2127.c
index e2e9746027348..0605295026564 100644
--- a/drivers/rtc/rtc-pcf2127.c
+++ b/drivers/rtc/rtc-pcf2127.c
@@ -213,6 +213,30 @@ struct pcf2127 {
 	bool ts_valid[PCF2127_MAX_TS_SUPPORTED];  /* Timestamp valid indication. */
 };
 
+static int pcf2127_pwrmng_get(struct device *dev, u8 *pwrmng)
+{
+	struct pcf2127 *pcf2127 = dev_get_drvdata(dev);
+	u32 value;
+	int ret;
+
+	ret = regmap_read(pcf2127->regmap, PCF2127_REG_CTRL3, &value);
+	if (ret < 0)
+		return ret;
+
+	*pwrmng = FIELD_GET(PCF2127_CTRL3_PM, value);
+
+	return 0;
+}
+
+static int pcf2127_pwrmng_set(struct device *dev, u8 pwrmng)
+{
+	struct pcf2127 *pcf2127 = dev_get_drvdata(dev);
+
+	return regmap_update_bits(pcf2127->regmap, PCF2127_REG_CTRL3,
+				  PCF2127_CTRL3_PM,
+				  FIELD_PREP(PCF2127_CTRL3_PM, pwrmng));
+}
+
 /*
  * In the routines that deal directly with the pcf2127 hardware, we use
  * rtc_time -- month 0-11, hour 0-23, yr = calendar year-epoch.
@@ -337,18 +361,15 @@ static int pcf2127_rtc_set_time(struct device *dev, struct rtc_time *tm)
 
 static int pcf2127_param_get(struct device *dev, struct rtc_param *param)
 {
-	struct pcf2127 *pcf2127 = dev_get_drvdata(dev);
-	u32 value;
+	u8 value;
 	int ret;
 
 	switch (param->param) {
 	case RTC_PARAM_BACKUP_SWITCH_MODE:
-		ret = regmap_read(pcf2127->regmap, PCF2127_REG_CTRL3, &value);
+		ret = pcf2127_pwrmng_get(dev, &value);
 		if (ret < 0)
 			return ret;
 
-		value = FIELD_GET(PCF2127_CTRL3_PM, value);
-
 		if (value < 0x3)
 			param->uvalue = RTC_BSM_LEVEL;
 		else if (value < 0x6)
@@ -367,19 +388,16 @@ static int pcf2127_param_get(struct device *dev, struct rtc_param *param)
 
 static int pcf2127_param_set(struct device *dev, struct rtc_param *param)
 {
-	struct pcf2127 *pcf2127 = dev_get_drvdata(dev);
 	u8 mode = 0;
-	u32 value;
+	u8 value;
 	int ret;
 
 	switch (param->param) {
 	case RTC_PARAM_BACKUP_SWITCH_MODE:
-		ret = regmap_read(pcf2127->regmap, PCF2127_REG_CTRL3, &value);
+		ret = pcf2127_pwrmng_get(dev, &value);
 		if (ret < 0)
 			return ret;
 
-		value = FIELD_GET(PCF2127_CTRL3_PM, value);
-
 		if (value > 5)
 			value -= 5;
 		else if (value > 2)
@@ -400,9 +418,7 @@ static int pcf2127_param_set(struct device *dev, struct rtc_param *param)
 			return -EINVAL;
 		}
 
-		return regmap_update_bits(pcf2127->regmap, PCF2127_REG_CTRL3,
-					  PCF2127_CTRL3_PM,
-					  FIELD_PREP(PCF2127_CTRL3_PM, mode + value));
+		return pcf2127_pwrmng_set(dev, mode + value);
 
 	default:
 		return -EINVAL;
-- 
2.47.3


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 3/4] rtc: add battery low voltage detection feature
  2026-03-11 20:02 [PATCH 0/4] rtc: pcf2127: add support for battery low voltage detection Hugo Villeneuve
  2026-03-11 20:02 ` [PATCH 1/4] rtc: pcf2127: remove redundant break statement in switch-case Hugo Villeneuve
  2026-03-11 20:02 ` [PATCH 2/4] rtc: pcf2127: add pcf2127_pwrmng_get/set Hugo Villeneuve
@ 2026-03-11 20:02 ` Hugo Villeneuve
  2026-08-06 12:55   ` Stefan Kerkmann
  2026-03-11 20:02 ` [PATCH 4/4] rtc: pcf2127: support battery low voltage detection function Hugo Villeneuve
                   ` (2 subsequent siblings)
  5 siblings, 1 reply; 11+ messages in thread
From: Hugo Villeneuve @ 2026-03-11 20:02 UTC (permalink / raw)
  To: alexandre.belloni
  Cc: linux-rtc, linux-kernel, hugo, bruno.thomsen, giampiero,
	p.rosenberger, antonio, Hugo Villeneuve

From: Hugo Villeneuve <hvilleneuve@dimonoff.com>

Some RTCs have a battery low voltage detection function. Add new feature
so that it can be enabled, disabled or queried at runtime.

Signed-off-by: Hugo Villeneuve <hvilleneuve@dimonoff.com>
---
 include/uapi/linux/rtc.h | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/include/uapi/linux/rtc.h b/include/uapi/linux/rtc.h
index 97aca4503a6a3..596eec119bb3a 100644
--- a/include/uapi/linux/rtc.h
+++ b/include/uapi/linux/rtc.h
@@ -134,18 +134,23 @@ struct rtc_param {
 #define RTC_FEATURE_CORRECTION		5
 #define RTC_FEATURE_BACKUP_SWITCH_MODE	6
 #define RTC_FEATURE_ALARM_WAKEUP_ONLY	7
-#define RTC_FEATURE_CNT			8
+#define RTC_FEATURE_BATTERY_LOW_DETECT	8
+#define RTC_FEATURE_CNT			9
 
 /* parameter list */
 #define RTC_PARAM_FEATURES		0
 #define RTC_PARAM_CORRECTION		1
 #define RTC_PARAM_BACKUP_SWITCH_MODE	2
+#define RTC_PARAM_BATTERY_LOW_DETECT	3
 
 #define RTC_BSM_DISABLED	0
 #define RTC_BSM_DIRECT		1
 #define RTC_BSM_LEVEL		2
 #define RTC_BSM_STANDBY		3
 
+#define RTC_BATTERY_LOW_DETECT_DISABLED	0
+#define RTC_BATTERY_LOW_DETECT_ENABLED	1
+
 #define RTC_MAX_FREQ	8192
 
 
-- 
2.47.3


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 4/4] rtc: pcf2127: support battery low voltage detection function
  2026-03-11 20:02 [PATCH 0/4] rtc: pcf2127: add support for battery low voltage detection Hugo Villeneuve
                   ` (2 preceding siblings ...)
  2026-03-11 20:02 ` [PATCH 3/4] rtc: add battery low voltage detection feature Hugo Villeneuve
@ 2026-03-11 20:02 ` Hugo Villeneuve
  2026-08-06 12:55   ` Stefan Kerkmann
  2026-07-29 15:18 ` [PATCH 0/4] rtc: pcf2127: add support for battery low voltage detection Stefan Kerkmann
  2026-08-25  7:31 ` Marc Kleine-Budde
  5 siblings, 1 reply; 11+ messages in thread
From: Hugo Villeneuve @ 2026-03-11 20:02 UTC (permalink / raw)
  To: alexandre.belloni
  Cc: linux-rtc, linux-kernel, hugo, bruno.thomsen, giampiero,
	p.rosenberger, antonio, Hugo Villeneuve

From: Hugo Villeneuve <hvilleneuve@dimonoff.com>

Add support for parameter RTC_PARAM_BATTERY_LOW_DETECT in RTC_PARAM_SET
ioctl to enable/disable/query battery low voltage detection. This is
especially relevant on the pcf2131 where this function is disabled by
default, contrary to the pcf2127.

Signed-off-by: Hugo Villeneuve <hvilleneuve@dimonoff.com>
---
 drivers/rtc/rtc-pcf2127.c | 60 ++++++++++++++++++++++++++++++++-------
 1 file changed, 50 insertions(+), 10 deletions(-)

diff --git a/drivers/rtc/rtc-pcf2127.c b/drivers/rtc/rtc-pcf2127.c
index 0605295026564..05b08867ffcb3 100644
--- a/drivers/rtc/rtc-pcf2127.c
+++ b/drivers/rtc/rtc-pcf2127.c
@@ -364,12 +364,12 @@ static int pcf2127_param_get(struct device *dev, struct rtc_param *param)
 	u8 value;
 	int ret;
 
+	ret = pcf2127_pwrmng_get(dev, &value);
+	if (ret < 0)
+		return ret;
+
 	switch (param->param) {
 	case RTC_PARAM_BACKUP_SWITCH_MODE:
-		ret = pcf2127_pwrmng_get(dev, &value);
-		if (ret < 0)
-			return ret;
-
 		if (value < 0x3)
 			param->uvalue = RTC_BSM_LEVEL;
 		else if (value < 0x6)
@@ -379,6 +379,14 @@ static int pcf2127_param_get(struct device *dev, struct rtc_param *param)
 
 		break;
 
+	case RTC_PARAM_BATTERY_LOW_DETECT:
+		if (value == 0x0 || value == 0x3)
+			param->uvalue = RTC_BATTERY_LOW_DETECT_ENABLED;
+		else
+			param->uvalue = RTC_BATTERY_LOW_DETECT_DISABLED;
+
+		break;
+
 	default:
 		return -EINVAL;
 	}
@@ -392,12 +400,12 @@ static int pcf2127_param_set(struct device *dev, struct rtc_param *param)
 	u8 value;
 	int ret;
 
+	ret = pcf2127_pwrmng_get(dev, &value);
+	if (ret < 0)
+		return ret;
+
 	switch (param->param) {
 	case RTC_PARAM_BACKUP_SWITCH_MODE:
-		ret = pcf2127_pwrmng_get(dev, &value);
-		if (ret < 0)
-			return ret;
-
 		if (value > 5)
 			value -= 5;
 		else if (value > 2)
@@ -418,13 +426,45 @@ static int pcf2127_param_set(struct device *dev, struct rtc_param *param)
 			return -EINVAL;
 		}
 
-		return pcf2127_pwrmng_set(dev, mode + value);
+		break;
+
+	case RTC_PARAM_BATTERY_LOW_DETECT:
+		if (value > 5) {
+			value -= 5;
+			mode = 5;
+		} else if (value > 2) {
+			value -= 3;
+			mode = 3;
+		}
+
+		switch (param->uvalue) {
+		case RTC_BATTERY_LOW_DETECT_DISABLED:
+			if (mode != 5)
+				if (value == 0)
+					value = 1;
+
+			break;
+		case RTC_BATTERY_LOW_DETECT_ENABLED:
+			if (mode != 5)
+				value = 0; /* Enable battery low detection. */
+			else
+				return -EINVAL; /*
+						 * battery low detection can't be enabled if
+						 * battery switch over is disabled.
+						 */
+			break;
+
+		default:
+			return -EINVAL;
+		}
+
+		break;
 
 	default:
 		return -EINVAL;
 	}
 
-	return 0;
+	return pcf2127_pwrmng_set(dev, mode + value);
 }
 
 static int pcf2127_rtc_ioctl(struct device *dev,
-- 
2.47.3


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [PATCH 0/4] rtc: pcf2127: add support for battery low voltage detection
  2026-03-11 20:02 [PATCH 0/4] rtc: pcf2127: add support for battery low voltage detection Hugo Villeneuve
                   ` (3 preceding siblings ...)
  2026-03-11 20:02 ` [PATCH 4/4] rtc: pcf2127: support battery low voltage detection function Hugo Villeneuve
@ 2026-07-29 15:18 ` Stefan Kerkmann
  2026-08-25 12:59   ` Hugo Villeneuve
  2026-08-25  7:31 ` Marc Kleine-Budde
  5 siblings, 1 reply; 11+ messages in thread
From: Stefan Kerkmann @ 2026-07-29 15:18 UTC (permalink / raw)
  To: Hugo Villeneuve, alexandre.belloni
  Cc: linux-rtc, linux-kernel, bruno.thomsen, giampiero, p.rosenberger,
	antonio, Hugo Villeneuve

Hello Hugo,

On 3/11/26 21:02, Hugo Villeneuve wrote:
> From: Hugo Villeneuve <hvilleneuve@dimonoff.com>
> 
> Hello,
> this patch series adds support for battery low voltage detection configuration
> for RTC devicesm, with specifc changes targeted at the pcf2127/2131 devices.
> 
> The origin of this patch goes back to the initial commit to add support for the
> PCF2131 device. On the PCF2131, the battery low voltage detection is disabled by
> default at the hardware level, contrary to the PCF2127 where it is enabled by
> default. Because of that, a lot of people are stuck with a PCF2131 RTC device
> using a battery backup, but unable to use it!
> 
> A lot of people are writing to me in private emails to report this as a bug
> in the PCF2131 driver. Others (and me) have proposed to implement device tree
> properties to enable these functions, but this was rejected [1][2][3].
> 
> It is important to note that some projects do not have the luxury to modify
> the bootloder to enable that function at boot, and for these having a DT
> property that could be put in a DT overlay would simplify a lot their life.
> Also having to rely on a userspace application to configure the RTC is also
> not ideal, as some projects use stock Debian distros (for example), and
> adding a new application to their repository is not trivial or easy.
> 
> So as the next best thing, this patch aims to add what is missing in the driver,
> the ability to enable/disable the battery low voltage detection with ioctls,
> similarly to what is done with the BSM.
> 

Thank you for the series. We have customer that has this exact use case:

Enabling the backup battery switch-over and low battery detection on a pcf2131 
rtc. With util-linux's hwclock the former can already be enabled e.g. hwclock 
--param-set bsm <xyz> and for the later this patch series would enable it as well.

> This patch has been tested on a custom board with a PCF2131 and using my
> userspace application:
> 
>      git clone -b batlow_param git@git.hugovil.com:repos/hvrtc.git
> 

If this series gets merged I can sent a PR to util-linux to enable the low 
battery detection via hwclock as well.

> Thank you.
> 
> Link: https://lore.kernel.org/linux-rtc/20190910143945.9364-1-bruno.thomsen@gmail.com/ [1]
> Link: https://lore.kernel.org/linux-rtc/20191211163354.GC1463890@piout.net/ [2]
> Link: https://lore.kernel.org/linux-rtc/20230123170731.6064430c50f5fb7b484d8734@hugovil.com/ [3]
> 
> Hugo Villeneuve (4):
>    rtc: pcf2127: remove redundant break statement in switch-case
>    rtc: pcf2127: add pcf2127_pwrmng_get/set
>    rtc: add battery low voltage detection feature
>    rtc: pcf2127: support battery low voltage detection function
> 
>   drivers/rtc/rtc-pcf2127.c | 94 ++++++++++++++++++++++++++++++---------
>   include/uapi/linux/rtc.h  |  7 ++-
>   2 files changed, 80 insertions(+), 21 deletions(-)
> 
> 
> base-commit: 6de23f81a5e08be8fbf5e8d7e9febc72a5b5f27f

Best regards,
Stefan

-- 
Pengutronix e.K.                       | Stefan Kerkmann             |
Steuerwalder Str. 21                   | https://www.pengutronix.de/ |
31137 Hildesheim, Germany              | Phone: +49-5121-206917-128  |
Amtsgericht Hildesheim, HRA 2686       | Fax:   +49-5121-206917-9    |


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 2/4] rtc: pcf2127: add pcf2127_pwrmng_get/set
  2026-03-11 20:02 ` [PATCH 2/4] rtc: pcf2127: add pcf2127_pwrmng_get/set Hugo Villeneuve
@ 2026-08-06 12:53   ` Stefan Kerkmann
  0 siblings, 0 replies; 11+ messages in thread
From: Stefan Kerkmann @ 2026-08-06 12:53 UTC (permalink / raw)
  To: Hugo Villeneuve, alexandre.belloni
  Cc: linux-rtc, linux-kernel, bruno.thomsen, giampiero, p.rosenberger,
	antonio, Hugo Villeneuve



On 3/11/26 21:02, Hugo Villeneuve wrote:
> From: Hugo Villeneuve <hvilleneuve@dimonoff.com>
> 
> Add common functions to get/set the pwrmng field in the CTRL3 register,
> used by pcf2127_param_get() and pcf2127_param_set().
> 
> Signed-off-by: Hugo Villeneuve <hvilleneuve@dimonoff.com>
> ---
> These functions will also be used in the following patch
> to add battery low detection.
> ---
>   drivers/rtc/rtc-pcf2127.c | 42 +++++++++++++++++++++++++++------------
>   1 file changed, 29 insertions(+), 13 deletions(-)
> 
> diff --git a/drivers/rtc/rtc-pcf2127.c b/drivers/rtc/rtc-pcf2127.c
> index e2e9746027348..0605295026564 100644
> --- a/drivers/rtc/rtc-pcf2127.c
> +++ b/drivers/rtc/rtc-pcf2127.c
> @@ -213,6 +213,30 @@ struct pcf2127 {
>   	bool ts_valid[PCF2127_MAX_TS_SUPPORTED];  /* Timestamp valid indication. */
>   };
>   
> +static int pcf2127_pwrmng_get(struct device *dev, u8 *pwrmng)
> +{
> +	struct pcf2127 *pcf2127 = dev_get_drvdata(dev);
> +	u32 value;
> +	int ret;
> +
> +	ret = regmap_read(pcf2127->regmap, PCF2127_REG_CTRL3, &value);
> +	if (ret < 0)
> +		return ret;
> +
> +	*pwrmng = FIELD_GET(PCF2127_CTRL3_PM, value);
> +
> +	return 0;
> +}
> +
> +static int pcf2127_pwrmng_set(struct device *dev, u8 pwrmng)
> +{
> +	struct pcf2127 *pcf2127 = dev_get_drvdata(dev);
> +
> +	return regmap_update_bits(pcf2127->regmap, PCF2127_REG_CTRL3,
> +				  PCF2127_CTRL3_PM,
> +				  FIELD_PREP(PCF2127_CTRL3_PM, pwrmng));
> +}
> +
>   /*
>    * In the routines that deal directly with the pcf2127 hardware, we use
>    * rtc_time -- month 0-11, hour 0-23, yr = calendar year-epoch.
> @@ -337,18 +361,15 @@ static int pcf2127_rtc_set_time(struct device *dev, struct rtc_time *tm)
>   
>   static int pcf2127_param_get(struct device *dev, struct rtc_param *param)
>   {
> -	struct pcf2127 *pcf2127 = dev_get_drvdata(dev);
> -	u32 value;
> +	u8 value;
>   	int ret;
>   
>   	switch (param->param) {
>   	case RTC_PARAM_BACKUP_SWITCH_MODE:
> -		ret = regmap_read(pcf2127->regmap, PCF2127_REG_CTRL3, &value);
> +		ret = pcf2127_pwrmng_get(dev, &value);
>   		if (ret < 0)
>   			return ret;
>   
> -		value = FIELD_GET(PCF2127_CTRL3_PM, value);
> -
>   		if (value < 0x3)
>   			param->uvalue = RTC_BSM_LEVEL;
>   		else if (value < 0x6)
> @@ -367,19 +388,16 @@ static int pcf2127_param_get(struct device *dev, struct rtc_param *param)
>   
>   static int pcf2127_param_set(struct device *dev, struct rtc_param *param)
>   {
> -	struct pcf2127 *pcf2127 = dev_get_drvdata(dev);
>   	u8 mode = 0;
> -	u32 value;
> +	u8 value;
>   	int ret;
>   
>   	switch (param->param) {
>   	case RTC_PARAM_BACKUP_SWITCH_MODE:
> -		ret = regmap_read(pcf2127->regmap, PCF2127_REG_CTRL3, &value);
> +		ret = pcf2127_pwrmng_get(dev, &value);
>   		if (ret < 0)
>   			return ret;
>   
> -		value = FIELD_GET(PCF2127_CTRL3_PM, value);
> -
>   		if (value > 5)
>   			value -= 5;
>   		else if (value > 2)
> @@ -400,9 +418,7 @@ static int pcf2127_param_set(struct device *dev, struct rtc_param *param)
>   			return -EINVAL;
>   		}
>   
> -		return regmap_update_bits(pcf2127->regmap, PCF2127_REG_CTRL3,
> -					  PCF2127_CTRL3_PM,
> -					  FIELD_PREP(PCF2127_CTRL3_PM, mode + value));
> +		return pcf2127_pwrmng_set(dev, mode + value);
>   
>   	default:
>   		return -EINVAL;

Reviewed-by: Stefan Kerkmann <s.kerkmann@pengutronix.de>

-- 
Pengutronix e.K.                       | Stefan Kerkmann             |
Steuerwalder Str. 21                   | https://www.pengutronix.de/ |
31137 Hildesheim, Germany              | Phone: +49-5121-206917-128  |
Amtsgericht Hildesheim, HRA 2686       | Fax:   +49-5121-206917-9    |


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 3/4] rtc: add battery low voltage detection feature
  2026-03-11 20:02 ` [PATCH 3/4] rtc: add battery low voltage detection feature Hugo Villeneuve
@ 2026-08-06 12:55   ` Stefan Kerkmann
  0 siblings, 0 replies; 11+ messages in thread
From: Stefan Kerkmann @ 2026-08-06 12:55 UTC (permalink / raw)
  To: Hugo Villeneuve, alexandre.belloni
  Cc: linux-rtc, linux-kernel, bruno.thomsen, giampiero, p.rosenberger,
	antonio, Hugo Villeneuve



On 3/11/26 21:02, Hugo Villeneuve wrote:
> From: Hugo Villeneuve <hvilleneuve@dimonoff.com>
> 
> Some RTCs have a battery low voltage detection function. Add new feature
> so that it can be enabled, disabled or queried at runtime.
> 
> Signed-off-by: Hugo Villeneuve <hvilleneuve@dimonoff.com>
> ---
>   include/uapi/linux/rtc.h | 7 ++++++-
>   1 file changed, 6 insertions(+), 1 deletion(-)
> 
> diff --git a/include/uapi/linux/rtc.h b/include/uapi/linux/rtc.h
> index 97aca4503a6a3..596eec119bb3a 100644
> --- a/include/uapi/linux/rtc.h
> +++ b/include/uapi/linux/rtc.h
> @@ -134,18 +134,23 @@ struct rtc_param {
>   #define RTC_FEATURE_CORRECTION		5
>   #define RTC_FEATURE_BACKUP_SWITCH_MODE	6
>   #define RTC_FEATURE_ALARM_WAKEUP_ONLY	7
> -#define RTC_FEATURE_CNT			8
> +#define RTC_FEATURE_BATTERY_LOW_DETECT	8
> +#define RTC_FEATURE_CNT			9
>   
>   /* parameter list */
>   #define RTC_PARAM_FEATURES		0
>   #define RTC_PARAM_CORRECTION		1
>   #define RTC_PARAM_BACKUP_SWITCH_MODE	2
> +#define RTC_PARAM_BATTERY_LOW_DETECT	3
>   
>   #define RTC_BSM_DISABLED	0
>   #define RTC_BSM_DIRECT		1
>   #define RTC_BSM_LEVEL		2
>   #define RTC_BSM_STANDBY		3
>   
> +#define RTC_BATTERY_LOW_DETECT_DISABLED	0
> +#define RTC_BATTERY_LOW_DETECT_ENABLED	1
> +
>   #define RTC_MAX_FREQ	8192
>   
>   

I have opened a PR against util-linux to add support and tested the patchset 
with the extended hwclock binary.

See: https://github.com/util-linux/util-linux/pull/4513

Reviewed-by: Stefan Kerkmann <s.kerkmann@pengutronix.de>
Tested-by: Stefan Kerkmann <s.kerkmann@pengutronix.de>

-- 
Pengutronix e.K.                       | Stefan Kerkmann             |
Steuerwalder Str. 21                   | https://www.pengutronix.de/ |
31137 Hildesheim, Germany              | Phone: +49-5121-206917-128  |
Amtsgericht Hildesheim, HRA 2686       | Fax:   +49-5121-206917-9    |


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 4/4] rtc: pcf2127: support battery low voltage detection function
  2026-03-11 20:02 ` [PATCH 4/4] rtc: pcf2127: support battery low voltage detection function Hugo Villeneuve
@ 2026-08-06 12:55   ` Stefan Kerkmann
  0 siblings, 0 replies; 11+ messages in thread
From: Stefan Kerkmann @ 2026-08-06 12:55 UTC (permalink / raw)
  To: Hugo Villeneuve, alexandre.belloni
  Cc: linux-rtc, linux-kernel, bruno.thomsen, giampiero, p.rosenberger,
	antonio, Hugo Villeneuve



On 3/11/26 21:02, Hugo Villeneuve wrote:
> From: Hugo Villeneuve <hvilleneuve@dimonoff.com>
> 
> Add support for parameter RTC_PARAM_BATTERY_LOW_DETECT in RTC_PARAM_SET
> ioctl to enable/disable/query battery low voltage detection. This is
> especially relevant on the pcf2131 where this function is disabled by
> default, contrary to the pcf2127.
> 
> Signed-off-by: Hugo Villeneuve <hvilleneuve@dimonoff.com>
> ---
>   drivers/rtc/rtc-pcf2127.c | 60 ++++++++++++++++++++++++++++++++-------
>   1 file changed, 50 insertions(+), 10 deletions(-)
> 
> diff --git a/drivers/rtc/rtc-pcf2127.c b/drivers/rtc/rtc-pcf2127.c
> index 0605295026564..05b08867ffcb3 100644
> --- a/drivers/rtc/rtc-pcf2127.c
> +++ b/drivers/rtc/rtc-pcf2127.c
> @@ -364,12 +364,12 @@ static int pcf2127_param_get(struct device *dev, struct rtc_param *param)
>   	u8 value;
>   	int ret;
>   
> +	ret = pcf2127_pwrmng_get(dev, &value);
> +	if (ret < 0)
> +		return ret;
> +
>   	switch (param->param) {
>   	case RTC_PARAM_BACKUP_SWITCH_MODE:
> -		ret = pcf2127_pwrmng_get(dev, &value);
> -		if (ret < 0)
> -			return ret;
> -
>   		if (value < 0x3)
>   			param->uvalue = RTC_BSM_LEVEL;
>   		else if (value < 0x6)
> @@ -379,6 +379,14 @@ static int pcf2127_param_get(struct device *dev, struct rtc_param *param)
>   
>   		break;
>   
> +	case RTC_PARAM_BATTERY_LOW_DETECT:
> +		if (value == 0x0 || value == 0x3)
> +			param->uvalue = RTC_BATTERY_LOW_DETECT_ENABLED;
> +		else
> +			param->uvalue = RTC_BATTERY_LOW_DETECT_DISABLED;
> +
> +		break;
> +
>   	default:
>   		return -EINVAL;
>   	}
> @@ -392,12 +400,12 @@ static int pcf2127_param_set(struct device *dev, struct rtc_param *param)
>   	u8 value;
>   	int ret;
>   
> +	ret = pcf2127_pwrmng_get(dev, &value);
> +	if (ret < 0)
> +		return ret;
> +
>   	switch (param->param) {
>   	case RTC_PARAM_BACKUP_SWITCH_MODE:
> -		ret = pcf2127_pwrmng_get(dev, &value);
> -		if (ret < 0)
> -			return ret;
> -
>   		if (value > 5)
>   			value -= 5;
>   		else if (value > 2)
> @@ -418,13 +426,45 @@ static int pcf2127_param_set(struct device *dev, struct rtc_param *param)
>   			return -EINVAL;
>   		}
>   
> -		return pcf2127_pwrmng_set(dev, mode + value);
> +		break;
> +
> +	case RTC_PARAM_BATTERY_LOW_DETECT:
> +		if (value > 5) {
> +			value -= 5;
> +			mode = 5;
> +		} else if (value > 2) {
> +			value -= 3;
> +			mode = 3;
> +		}
> +
> +		switch (param->uvalue) {
> +		case RTC_BATTERY_LOW_DETECT_DISABLED:
> +			if (mode != 5)
> +				if (value == 0)
> +					value = 1;
> +
> +			break;
> +		case RTC_BATTERY_LOW_DETECT_ENABLED:
> +			if (mode != 5)
> +				value = 0; /* Enable battery low detection. */
> +			else
> +				return -EINVAL; /*
> +						 * battery low detection can't be enabled if
> +						 * battery switch over is disabled.
> +						 */
> +			break;
> +
> +		default:
> +			return -EINVAL;
> +		}
> +
> +		break;
>   
>   	default:
>   		return -EINVAL;
>   	}
>   
> -	return 0;
> +	return pcf2127_pwrmng_set(dev, mode + value);
>   }
>   
>   static int pcf2127_rtc_ioctl(struct device *dev,

Works as expected, thank you!

Reviewed-by: Stefan Kerkmann <s.kerkmann@pengutronix.de>
Tested-by: Stefan Kerkmann <s.kerkmann@pengutronix.de>

-- 
Pengutronix e.K.                       | Stefan Kerkmann             |
Steuerwalder Str. 21                   | https://www.pengutronix.de/ |
31137 Hildesheim, Germany              | Phone: +49-5121-206917-128  |
Amtsgericht Hildesheim, HRA 2686       | Fax:   +49-5121-206917-9    |


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 0/4] rtc: pcf2127: add support for battery low voltage detection
  2026-03-11 20:02 [PATCH 0/4] rtc: pcf2127: add support for battery low voltage detection Hugo Villeneuve
                   ` (4 preceding siblings ...)
  2026-07-29 15:18 ` [PATCH 0/4] rtc: pcf2127: add support for battery low voltage detection Stefan Kerkmann
@ 2026-08-25  7:31 ` Marc Kleine-Budde
  5 siblings, 0 replies; 11+ messages in thread
From: Marc Kleine-Budde @ 2026-08-25  7:31 UTC (permalink / raw)
  To: Hugo Villeneuve
  Cc: alexandre.belloni, linux-rtc, linux-kernel, bruno.thomsen,
	giampiero, p.rosenberger, antonio, Hugo Villeneuve

[-- Attachment #1: Type: text/plain, Size: 2966 bytes --]

Hello Alexandre,

can you pick up this patch? It has been tested by Stefan Kerkmann and
it's working for our use case.

regards,
Marc

On 11.03.2026 16:02:26, Hugo Villeneuve wrote:
> From: Hugo Villeneuve <hvilleneuve@dimonoff.com>
>
> Hello,
> this patch series adds support for battery low voltage detection configuration
> for RTC devicesm, with specifc changes targeted at the pcf2127/2131 devices.
>
> The origin of this patch goes back to the initial commit to add support for the
> PCF2131 device. On the PCF2131, the battery low voltage detection is disabled by
> default at the hardware level, contrary to the PCF2127 where it is enabled by
> default. Because of that, a lot of people are stuck with a PCF2131 RTC device
> using a battery backup, but unable to use it!
>
> A lot of people are writing to me in private emails to report this as a bug
> in the PCF2131 driver. Others (and me) have proposed to implement device tree
> properties to enable these functions, but this was rejected [1][2][3].
>
> It is important to note that some projects do not have the luxury to modify
> the bootloder to enable that function at boot, and for these having a DT
> property that could be put in a DT overlay would simplify a lot their life.
> Also having to rely on a userspace application to configure the RTC is also
> not ideal, as some projects use stock Debian distros (for example), and
> adding a new application to their repository is not trivial or easy.
>
> So as the next best thing, this patch aims to add what is missing in the driver,
> the ability to enable/disable the battery low voltage detection with ioctls,
> similarly to what is done with the BSM.
>
> This patch has been tested on a custom board with a PCF2131 and using my
> userspace application:
>
>     git clone -b batlow_param git@git.hugovil.com:repos/hvrtc.git
>
> Thank you.
>
> Link: https://lore.kernel.org/linux-rtc/20190910143945.9364-1-bruno.thomsen@gmail.com/ [1]
> Link: https://lore.kernel.org/linux-rtc/20191211163354.GC1463890@piout.net/ [2]
> Link: https://lore.kernel.org/linux-rtc/20230123170731.6064430c50f5fb7b484d8734@hugovil.com/ [3]
>
> Hugo Villeneuve (4):
>   rtc: pcf2127: remove redundant break statement in switch-case
>   rtc: pcf2127: add pcf2127_pwrmng_get/set
>   rtc: add battery low voltage detection feature
>   rtc: pcf2127: support battery low voltage detection function
>
>  drivers/rtc/rtc-pcf2127.c | 94 ++++++++++++++++++++++++++++++---------
>  include/uapi/linux/rtc.h  |  7 ++-
>  2 files changed, 80 insertions(+), 21 deletions(-)
>
>
> base-commit: 6de23f81a5e08be8fbf5e8d7e9febc72a5b5f27f
> --
> 2.47.3
>
>

-- 
Pengutronix e.K.                 | Marc Kleine-Budde          |
Embedded Linux                   | https://www.pengutronix.de |
Vertretung Nürnberg              | Phone: +49-5121-206917-129 |
Amtsgericht Hildesheim, HRA 2686 | Fax:   +49-5121-206917-9   |

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 0/4] rtc: pcf2127: add support for battery low voltage detection
  2026-07-29 15:18 ` [PATCH 0/4] rtc: pcf2127: add support for battery low voltage detection Stefan Kerkmann
@ 2026-08-25 12:59   ` Hugo Villeneuve
  0 siblings, 0 replies; 11+ messages in thread
From: Hugo Villeneuve @ 2026-08-25 12:59 UTC (permalink / raw)
  To: Stefan Kerkmann
  Cc: alexandre.belloni, linux-rtc, linux-kernel, bruno.thomsen,
	giampiero, p.rosenberger, antonio, Hugo Villeneuve

Hi Stefan,

On Wed, 29 Jul 2026 17:18:59 +0200
Stefan Kerkmann <s.kerkmann@pengutronix.de> wrote:

> Hello Hugo,
> 
> On 3/11/26 21:02, Hugo Villeneuve wrote:
> > From: Hugo Villeneuve <hvilleneuve@dimonoff.com>
> > 
> > Hello,
> > this patch series adds support for battery low voltage detection configuration
> > for RTC devicesm, with specifc changes targeted at the pcf2127/2131 devices.
> > 
> > The origin of this patch goes back to the initial commit to add support for the
> > PCF2131 device. On the PCF2131, the battery low voltage detection is disabled by
> > default at the hardware level, contrary to the PCF2127 where it is enabled by
> > default. Because of that, a lot of people are stuck with a PCF2131 RTC device
> > using a battery backup, but unable to use it!
> > 
> > A lot of people are writing to me in private emails to report this as a bug
> > in the PCF2131 driver. Others (and me) have proposed to implement device tree
> > properties to enable these functions, but this was rejected [1][2][3].
> > 
> > It is important to note that some projects do not have the luxury to modify
> > the bootloder to enable that function at boot, and for these having a DT
> > property that could be put in a DT overlay would simplify a lot their life.
> > Also having to rely on a userspace application to configure the RTC is also
> > not ideal, as some projects use stock Debian distros (for example), and
> > adding a new application to their repository is not trivial or easy.
> > 
> > So as the next best thing, this patch aims to add what is missing in the driver,
> > the ability to enable/disable the battery low voltage detection with ioctls,
> > similarly to what is done with the BSM.
> > 
> 
> Thank you for the series. We have customer that has this exact use case:

Ok, a lot of people affected by this...

> 
> Enabling the backup battery switch-over and low battery detection on a pcf2131 
> rtc. With util-linux's hwclock the former can already be enabled e.g. hwclock 
> --param-set bsm <xyz> and for the later this patch series would enable it as well.
> 
> > This patch has been tested on a custom board with a PCF2131 and using my
> > userspace application:
> > 
> >      git clone -b batlow_param git@git.hugovil.com:repos/hvrtc.git
> > 
> 
> If this series gets merged I can sent a PR to util-linux to enable the low 
> battery detection via hwclock as well.

Good.

Unfortunately, I haven't received any feedback from the RTC
maintainer(s) about this series, nor have I received any answers
to my previous inquiries about this problem.

I send patches to other kernel subsystem, and eventually I always
receive feedback, but RTC seems to be in a
different category. I sometimes wonder if there is still an
active RTC maintainer...

Hugo.


> > Thank you.
> > 
> > Link: https://lore.kernel.org/linux-rtc/20190910143945.9364-1-bruno.thomsen@gmail.com/ [1]
> > Link: https://lore.kernel.org/linux-rtc/20191211163354.GC1463890@piout.net/ [2]
> > Link: https://lore.kernel.org/linux-rtc/20230123170731.6064430c50f5fb7b484d8734@hugovil.com/ [3]
> > 
> > Hugo Villeneuve (4):
> >    rtc: pcf2127: remove redundant break statement in switch-case
> >    rtc: pcf2127: add pcf2127_pwrmng_get/set
> >    rtc: add battery low voltage detection feature
> >    rtc: pcf2127: support battery low voltage detection function
> > 
> >   drivers/rtc/rtc-pcf2127.c | 94 ++++++++++++++++++++++++++++++---------
> >   include/uapi/linux/rtc.h  |  7 ++-
> >   2 files changed, 80 insertions(+), 21 deletions(-)
> > 
> > 
> > base-commit: 6de23f81a5e08be8fbf5e8d7e9febc72a5b5f27f
> 
> Best regards,
> Stefan
> 
> -- 
> Pengutronix e.K.                       | Stefan Kerkmann             |
> Steuerwalder Str. 21                   | https://www.pengutronix.de/ |
> 31137 Hildesheim, Germany              | Phone: +49-5121-206917-128  |
> Amtsgericht Hildesheim, HRA 2686       | Fax:   +49-5121-206917-9    |

-- 
Hugo Villeneuve

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2026-08-25 13:28 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-03-11 20:02 [PATCH 0/4] rtc: pcf2127: add support for battery low voltage detection Hugo Villeneuve
2026-03-11 20:02 ` [PATCH 1/4] rtc: pcf2127: remove redundant break statement in switch-case Hugo Villeneuve
2026-03-11 20:02 ` [PATCH 2/4] rtc: pcf2127: add pcf2127_pwrmng_get/set Hugo Villeneuve
2026-08-06 12:53   ` Stefan Kerkmann
2026-03-11 20:02 ` [PATCH 3/4] rtc: add battery low voltage detection feature Hugo Villeneuve
2026-08-06 12:55   ` Stefan Kerkmann
2026-03-11 20:02 ` [PATCH 4/4] rtc: pcf2127: support battery low voltage detection function Hugo Villeneuve
2026-08-06 12:55   ` Stefan Kerkmann
2026-07-29 15:18 ` [PATCH 0/4] rtc: pcf2127: add support for battery low voltage detection Stefan Kerkmann
2026-08-25 12:59   ` Hugo Villeneuve
2026-08-25  7:31 ` Marc Kleine-Budde

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox