Linux RTC
 help / color / mirror / Atom feed
* [PATCH] rtc: rv3028: configure backup switch mode from device tree
@ 2026-08-22  9:29 Dhaval Shiroya
  2026-08-22  9:39 ` sashiko-bot
                   ` (3 more replies)
  0 siblings, 4 replies; 5+ messages in thread
From: Dhaval Shiroya @ 2026-08-22  9:29 UTC (permalink / raw)
  To: alexandre.belloni; +Cc: Dhaval Shiroya, linux-rtc, linux-kernel

Enable and set the backup switch mode directly from the device tree at
probe, instead of requiring a userspace RTC_PARAM_BACKUP_SWITCH_MODE
ioctl on every unit.

Signed-off-by: Dhaval Shiroya <dhaval.shiroya@siliconsignals.io>

diff --git a/drivers/rtc/rtc-rv3028.c b/drivers/rtc/rtc-rv3028.c
index d96f6bb68850..5dde1aed76dd 100644
--- a/drivers/rtc/rtc-rv3028.c
+++ b/drivers/rtc/rtc-rv3028.c
@@ -80,6 +80,7 @@
 #define RV3028_EEBUSY_TIMEOUT		100000
 
 #define RV3028_BACKUP_TCE		BIT(5)
+#define RV3028_BACKUP_FEDE		BIT(4)
 #define RV3028_BACKUP_TCR_MASK		GENMASK(1,0)
 #define RV3028_BACKUP_BSM		GENMASK(3,2)
 
@@ -519,70 +520,6 @@ static int rv3028_set_offset(struct device *dev, long offset)
 
 }
 
-static int rv3028_param_get(struct device *dev, struct rtc_param *param)
-{
-	struct rv3028_data *rv3028 = dev_get_drvdata(dev);
-	int ret;
-	u32 value;
-
-	switch(param->param) {
-	case RTC_PARAM_BACKUP_SWITCH_MODE:
-		ret = regmap_read(rv3028->regmap, RV3028_BACKUP, &value);
-		if (ret < 0)
-			return ret;
-
-		value = FIELD_GET(RV3028_BACKUP_BSM, value);
-
-		switch(value) {
-		case RV3028_BACKUP_BSM_DSM:
-			param->uvalue = RTC_BSM_DIRECT;
-			break;
-		case RV3028_BACKUP_BSM_LSM:
-			param->uvalue = RTC_BSM_LEVEL;
-			break;
-		default:
-			param->uvalue = RTC_BSM_DISABLED;
-		}
-		break;
-
-	default:
-		return -EINVAL;
-	}
-
-	return 0;
-}
-
-static int rv3028_param_set(struct device *dev, struct rtc_param *param)
-{
-	struct rv3028_data *rv3028 = dev_get_drvdata(dev);
-	u8 mode;
-
-	switch(param->param) {
-	case RTC_PARAM_BACKUP_SWITCH_MODE:
-		switch (param->uvalue) {
-		case RTC_BSM_DISABLED:
-			mode = 0;
-			break;
-		case RTC_BSM_DIRECT:
-			mode = RV3028_BACKUP_BSM_DSM;
-			break;
-		case RTC_BSM_LEVEL:
-			mode = RV3028_BACKUP_BSM_LSM;
-			break;
-		default:
-			return -EINVAL;
-		}
-
-		return rv3028_update_cfg(rv3028, RV3028_BACKUP, RV3028_BACKUP_BSM,
-					 FIELD_PREP(RV3028_BACKUP_BSM, mode));
-
-	default:
-		return -EINVAL;
-	}
-
-	return 0;
-}
-
 static int rv3028_ioctl(struct device *dev, unsigned int cmd, unsigned long arg)
 {
 	struct rv3028_data *rv3028 = dev_get_drvdata(dev);
@@ -852,8 +789,6 @@ static const struct rtc_class_ops rv3028_rtc_ops = {
 	.read_offset = rv3028_read_offset,
 	.set_offset = rv3028_set_offset,
 	.ioctl = rv3028_ioctl,
-	.param_get = rv3028_param_get,
-	.param_set = rv3028_param_set,
 };
 
 static const struct regmap_config regmap_config = {
@@ -920,6 +855,65 @@ static u8 rv3028_set_trickle_charger(struct rv3028_data *rv3028,
 	return ret;
 }
 
+/*
+ * Configure backup switchover mode from device tree.
+ *   0 = disabled
+ *   1 = DSM (Direct Switching Mode)  - switch when VDD < VBACKUP
+ *   3 = LSM (Level Switching Mode)   - switch when VDD < 2.0V
+ */
+static int rv3028_set_bsm_from_dt(struct rv3028_data *rv3028,
+				  struct i2c_client *client)
+{
+	u32 val_old, bsm_dt, bsm_bits;
+	int ret;
+
+	if (device_property_read_u32(&client->dev, "backup-switch-mode",
+				     &bsm_dt))
+		return 0;
+
+	/* Validate and convert DT value to register bits */
+	switch (bsm_dt) {
+	case 0:
+		bsm_bits = 0;
+		break;
+	case 1:
+		bsm_bits = FIELD_PREP(RV3028_BACKUP_BSM, RV3028_BACKUP_BSM_DSM);
+		break;
+	case 3:
+		bsm_bits = FIELD_PREP(RV3028_BACKUP_BSM, RV3028_BACKUP_BSM_LSM);
+		break;
+	default:
+		dev_warn(&client->dev,
+			 "invalid backup-switch-mode %u (use 0, 1, or 3)\n",
+			 bsm_dt);
+		return 0;
+	}
+
+	/* Read current BACKUP register */
+	ret = regmap_read(rv3028->regmap, RV3028_BACKUP, &val_old);
+	if (ret < 0)
+		return ret;
+
+	/* Check if BSM and FEDE already match desired values */
+	if ((val_old & (RV3028_BACKUP_BSM | RV3028_BACKUP_FEDE)) ==
+	    (bsm_bits | RV3028_BACKUP_FEDE)) {
+		dev_dbg(&client->dev,
+			"backup switch mode already set to %u\n", bsm_dt);
+		return 0;
+	}
+
+	dev_info(&client->dev,
+		 "setting backup switch mode to %u (reg 0x37: 0x%02x -> 0x%02x)\n",
+		 bsm_dt, val_old,
+		 (val_old & ~(RV3028_BACKUP_BSM | RV3028_BACKUP_FEDE)) |
+		 bsm_bits | RV3028_BACKUP_FEDE);
+
+	/* Set BSM and always enable FEDE as recommended by datasheet */
+	return rv3028_update_cfg(rv3028, RV3028_BACKUP,
+				 RV3028_BACKUP_BSM | RV3028_BACKUP_FEDE,
+				 bsm_bits | RV3028_BACKUP_FEDE);
+}
+
 static int rv3028_probe(struct i2c_client *client)
 {
 	struct rv3028_data *rv3028;
@@ -1005,11 +999,14 @@ static int rv3028_probe(struct i2c_client *client)
 	if (ret)
 		return ret;
 
-	ret = rtc_add_group(rv3028->rtc, &rv3028_attr_group);
+	/* Configure backup switchover mode from device tree */
+	ret = rv3028_set_bsm_from_dt(rv3028, client);
 	if (ret)
 		return ret;
 
-	set_bit(RTC_FEATURE_BACKUP_SWITCH_MODE, rv3028->rtc->features);
+	ret = rtc_add_group(rv3028->rtc, &rv3028_attr_group);
+	if (ret)
+		return ret;
 
 	rv3028->rtc->range_min = RTC_TIMESTAMP_BEGIN_2000;
 	rv3028->rtc->range_max = RTC_TIMESTAMP_END_2099;
-- 
2.34.1


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

* Re: [PATCH] rtc: rv3028: configure backup switch mode from device tree
  2026-08-22  9:29 [PATCH] rtc: rv3028: configure backup switch mode from device tree Dhaval Shiroya
@ 2026-08-22  9:39 ` sashiko-bot
  2026-08-22 13:09 ` Alexandre Belloni
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 5+ messages in thread
From: sashiko-bot @ 2026-08-22  9:39 UTC (permalink / raw)
  To: Dhaval Shiroya; +Cc: linux-rtc, Alexandre Belloni

Thank you for your contribution! Sashiko AI review found 3 potential issue(s) to consider:

New issues:
- [Critical] Removal of the `RTC_PARAM_BACKUP_SWITCH_MODE` userspace parameter breaks the userspace ABI.
- [Medium] Introduction of an undocumented, un-prefixed, and hardware-specific DT property `backup-switch-mode`.

Pre-existing issues:
- [High] The clock provider registered during probe is never removed, leaving a dangling pointer in the OF clock provider list when the driver is unbound.
--

--- Patch [1]: [PATCH] rtc: rv3028: configure backup switch mode from device tree ---
commit 55d9a6511b8e26eb9e90d9e9a4a3d1d04b2c0f1b
Author: Dhaval Shiroya <dhaval.shiroya@siliconsignals.io>

rtc: rv3028: configure backup switch mode from device tree
    
Enable and set the backup switch mode directly from the device tree at
probe, instead of requiring a userspace RTC_PARAM_BACKUP_SWITCH_MODE
ioctl on every unit.

> diff --git a/drivers/rtc/rtc-rv3028.c b/drivers/rtc/rtc-rv3028.c
> index d96f6bb68850d..5dde1aed76dd7 100644
> --- a/drivers/rtc/rtc-rv3028.c
> +++ b/drivers/rtc/rtc-rv3028.c
[ ... ]
> @@ -852,8 +789,6 @@ static const struct rtc_class_ops rv3028_rtc_ops = {
>  	.read_offset = rv3028_read_offset,
>  	.set_offset = rv3028_set_offset,
>  	.ioctl = rv3028_ioctl,
> -	.param_get = rv3028_param_get,
> -	.param_set = rv3028_param_set,
>  };

[Severity: Critical]
Does removing the param_get and param_set callbacks break existing userspace
ABI?

Existing applications or scripts (like hwclock) that rely on querying or
modifying the backup switchover mode via the RTC_PARAM_GET and RTC_PARAM_SET
ioctls will encounter failures, as the API has been entirely removed from the
driver.

[ ... ]
> @@ -920,6 +855,65 @@ static u8 rv3028_set_trickle_charger(struct rv3028_data *rv3028,
[ ... ]
> +static int rv3028_set_bsm_from_dt(struct rv3028_data *rv3028,
> +				  struct i2c_client *client)
> +{
> +	u32 val_old, bsm_dt, bsm_bits;
> +	int ret;
> +
> +	if (device_property_read_u32(&client->dev, "backup-switch-mode",
> +				     &bsm_dt))
> +		return 0;

[Severity: Medium]
Is this new device tree property documented in the binding schema?

Adding an undocumented, un-prefixed property that requires raw
hardware-specific bit values (0, 1, or 3) instead of a standard
vendor-prefixed property (e.g., "microcrystal,backup-switch-mode") will
trigger warnings during dtbs_check. 

The device tree schema likely enforces unevaluatedProperties: false, which
will flag this missing schema definition as an invalid configuration.

[ ... ]
> @@ -1005,11 +999,14 @@ static int rv3028_probe(struct i2c_client *client)
[ ... ]
> -	set_bit(RTC_FEATURE_BACKUP_SWITCH_MODE, rv3028->rtc->features);

[Severity: Critical]
Does removing this capability flag cause the kernel to reject userspace
attempts to configure the parameter?

This reinforces the ABI break mentioned above, preventing any userspace
process with access to the RTC device node from interacting with the backup
switchover mode.


While reviewing this patch, I noticed a pre-existing issue in the surrounding
clock registration code:

drivers/rtc/rtc-rv3028.c:rv3028_clkout_register_clk() {
    ...
    of_clk_add_provider(node, of_clk_src_simple_get, clk);
    ...
}

[Severity: High]
This is a pre-existing issue, but does this leave a dangling pointer in the
OF clock provider list when the driver is unbound?

The clock object is allocated and registered using devm_clk_register(), meaning
devres automatically frees the clk structure when the device is unbound.
However, of_clk_add_provider() is a non-managed API that registers the clock
provider globally. 

Because this driver lacks a .remove callback to unregister the provider, a
subsequent clock lookup after unbind could attempt to use the freed structure,
leading to a use-after-free.

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260822092911.318342-1-dhaval.shiroya@siliconsignals.io?part=1

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

* Re: [PATCH] rtc: rv3028: configure backup switch mode from device tree
  2026-08-22  9:29 [PATCH] rtc: rv3028: configure backup switch mode from device tree Dhaval Shiroya
  2026-08-22  9:39 ` sashiko-bot
@ 2026-08-22 13:09 ` Alexandre Belloni
  2026-08-24 23:05 ` kernel test robot
  2026-08-25  1:34 ` kernel test robot
  3 siblings, 0 replies; 5+ messages in thread
From: Alexandre Belloni @ 2026-08-22 13:09 UTC (permalink / raw)
  To: Dhaval Shiroya; +Cc: linux-rtc, linux-kernel

On 22/08/2026 14:59:11+0530, Dhaval Shiroya wrote:
> Enable and set the backup switch mode directly from the device tree at
> probe, instead of requiring a userspace RTC_PARAM_BACKUP_SWITCH_MODE
> ioctl on every unit.
> 

No, just use the ioctl.

> Signed-off-by: Dhaval Shiroya <dhaval.shiroya@siliconsignals.io>
> 
> diff --git a/drivers/rtc/rtc-rv3028.c b/drivers/rtc/rtc-rv3028.c
> index d96f6bb68850..5dde1aed76dd 100644
> --- a/drivers/rtc/rtc-rv3028.c
> +++ b/drivers/rtc/rtc-rv3028.c
> @@ -80,6 +80,7 @@
>  #define RV3028_EEBUSY_TIMEOUT		100000
>  
>  #define RV3028_BACKUP_TCE		BIT(5)
> +#define RV3028_BACKUP_FEDE		BIT(4)
>  #define RV3028_BACKUP_TCR_MASK		GENMASK(1,0)
>  #define RV3028_BACKUP_BSM		GENMASK(3,2)
>  
> @@ -519,70 +520,6 @@ static int rv3028_set_offset(struct device *dev, long offset)
>  
>  }
>  
> -static int rv3028_param_get(struct device *dev, struct rtc_param *param)
> -{
> -	struct rv3028_data *rv3028 = dev_get_drvdata(dev);
> -	int ret;
> -	u32 value;
> -
> -	switch(param->param) {
> -	case RTC_PARAM_BACKUP_SWITCH_MODE:
> -		ret = regmap_read(rv3028->regmap, RV3028_BACKUP, &value);
> -		if (ret < 0)
> -			return ret;
> -
> -		value = FIELD_GET(RV3028_BACKUP_BSM, value);
> -
> -		switch(value) {
> -		case RV3028_BACKUP_BSM_DSM:
> -			param->uvalue = RTC_BSM_DIRECT;
> -			break;
> -		case RV3028_BACKUP_BSM_LSM:
> -			param->uvalue = RTC_BSM_LEVEL;
> -			break;
> -		default:
> -			param->uvalue = RTC_BSM_DISABLED;
> -		}
> -		break;
> -
> -	default:
> -		return -EINVAL;
> -	}
> -
> -	return 0;
> -}
> -
> -static int rv3028_param_set(struct device *dev, struct rtc_param *param)
> -{
> -	struct rv3028_data *rv3028 = dev_get_drvdata(dev);
> -	u8 mode;
> -
> -	switch(param->param) {
> -	case RTC_PARAM_BACKUP_SWITCH_MODE:
> -		switch (param->uvalue) {
> -		case RTC_BSM_DISABLED:
> -			mode = 0;
> -			break;
> -		case RTC_BSM_DIRECT:
> -			mode = RV3028_BACKUP_BSM_DSM;
> -			break;
> -		case RTC_BSM_LEVEL:
> -			mode = RV3028_BACKUP_BSM_LSM;
> -			break;
> -		default:
> -			return -EINVAL;
> -		}
> -
> -		return rv3028_update_cfg(rv3028, RV3028_BACKUP, RV3028_BACKUP_BSM,
> -					 FIELD_PREP(RV3028_BACKUP_BSM, mode));
> -
> -	default:
> -		return -EINVAL;
> -	}
> -
> -	return 0;
> -}
> -
>  static int rv3028_ioctl(struct device *dev, unsigned int cmd, unsigned long arg)
>  {
>  	struct rv3028_data *rv3028 = dev_get_drvdata(dev);
> @@ -852,8 +789,6 @@ static const struct rtc_class_ops rv3028_rtc_ops = {
>  	.read_offset = rv3028_read_offset,
>  	.set_offset = rv3028_set_offset,
>  	.ioctl = rv3028_ioctl,
> -	.param_get = rv3028_param_get,
> -	.param_set = rv3028_param_set,
>  };
>  
>  static const struct regmap_config regmap_config = {
> @@ -920,6 +855,65 @@ static u8 rv3028_set_trickle_charger(struct rv3028_data *rv3028,
>  	return ret;
>  }
>  
> +/*
> + * Configure backup switchover mode from device tree.
> + *   0 = disabled
> + *   1 = DSM (Direct Switching Mode)  - switch when VDD < VBACKUP
> + *   3 = LSM (Level Switching Mode)   - switch when VDD < 2.0V
> + */
> +static int rv3028_set_bsm_from_dt(struct rv3028_data *rv3028,
> +				  struct i2c_client *client)
> +{
> +	u32 val_old, bsm_dt, bsm_bits;
> +	int ret;
> +
> +	if (device_property_read_u32(&client->dev, "backup-switch-mode",
> +				     &bsm_dt))
> +		return 0;
> +
> +	/* Validate and convert DT value to register bits */
> +	switch (bsm_dt) {
> +	case 0:
> +		bsm_bits = 0;
> +		break;
> +	case 1:
> +		bsm_bits = FIELD_PREP(RV3028_BACKUP_BSM, RV3028_BACKUP_BSM_DSM);
> +		break;
> +	case 3:
> +		bsm_bits = FIELD_PREP(RV3028_BACKUP_BSM, RV3028_BACKUP_BSM_LSM);
> +		break;
> +	default:
> +		dev_warn(&client->dev,
> +			 "invalid backup-switch-mode %u (use 0, 1, or 3)\n",
> +			 bsm_dt);
> +		return 0;
> +	}
> +
> +	/* Read current BACKUP register */
> +	ret = regmap_read(rv3028->regmap, RV3028_BACKUP, &val_old);
> +	if (ret < 0)
> +		return ret;
> +
> +	/* Check if BSM and FEDE already match desired values */
> +	if ((val_old & (RV3028_BACKUP_BSM | RV3028_BACKUP_FEDE)) ==
> +	    (bsm_bits | RV3028_BACKUP_FEDE)) {
> +		dev_dbg(&client->dev,
> +			"backup switch mode already set to %u\n", bsm_dt);
> +		return 0;
> +	}
> +
> +	dev_info(&client->dev,
> +		 "setting backup switch mode to %u (reg 0x37: 0x%02x -> 0x%02x)\n",
> +		 bsm_dt, val_old,
> +		 (val_old & ~(RV3028_BACKUP_BSM | RV3028_BACKUP_FEDE)) |
> +		 bsm_bits | RV3028_BACKUP_FEDE);
> +
> +	/* Set BSM and always enable FEDE as recommended by datasheet */
> +	return rv3028_update_cfg(rv3028, RV3028_BACKUP,
> +				 RV3028_BACKUP_BSM | RV3028_BACKUP_FEDE,
> +				 bsm_bits | RV3028_BACKUP_FEDE);
> +}
> +
>  static int rv3028_probe(struct i2c_client *client)
>  {
>  	struct rv3028_data *rv3028;
> @@ -1005,11 +999,14 @@ static int rv3028_probe(struct i2c_client *client)
>  	if (ret)
>  		return ret;
>  
> -	ret = rtc_add_group(rv3028->rtc, &rv3028_attr_group);
> +	/* Configure backup switchover mode from device tree */
> +	ret = rv3028_set_bsm_from_dt(rv3028, client);
>  	if (ret)
>  		return ret;
>  
> -	set_bit(RTC_FEATURE_BACKUP_SWITCH_MODE, rv3028->rtc->features);
> +	ret = rtc_add_group(rv3028->rtc, &rv3028_attr_group);
> +	if (ret)
> +		return ret;
>  
>  	rv3028->rtc->range_min = RTC_TIMESTAMP_BEGIN_2000;
>  	rv3028->rtc->range_max = RTC_TIMESTAMP_END_2099;
> -- 
> 2.34.1
> 

-- 
Alexandre Belloni, co-owner and COO, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com

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

* Re: [PATCH] rtc: rv3028: configure backup switch mode from device tree
  2026-08-22  9:29 [PATCH] rtc: rv3028: configure backup switch mode from device tree Dhaval Shiroya
  2026-08-22  9:39 ` sashiko-bot
  2026-08-22 13:09 ` Alexandre Belloni
@ 2026-08-24 23:05 ` kernel test robot
  2026-08-25  1:34 ` kernel test robot
  3 siblings, 0 replies; 5+ messages in thread
From: kernel test robot @ 2026-08-24 23:05 UTC (permalink / raw)
  To: Dhaval Shiroya, alexandre.belloni
  Cc: llvm, oe-kbuild-all, Dhaval Shiroya, linux-rtc, linux-kernel

Hi Dhaval,

kernel test robot noticed the following build warnings:

[auto build test WARNING on abelloni/rtc-next]
[also build test WARNING on linus/master v7.2 next-20260821]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Dhaval-Shiroya/rtc-rv3028-configure-backup-switch-mode-from-device-tree/20260822-145911
base:   https://git.kernel.org/pub/scm/linux/kernel/git/abelloni/linux.git rtc-next
patch link:    https://lore.kernel.org/r/20260822092911.318342-1-dhaval.shiroya%40siliconsignals.io
patch subject: [PATCH] rtc: rv3028: configure backup switch mode from device tree
config: arm64-randconfig-002-20260825 (https://download.01.org/0day-ci/archive/20260825/202608250645.zcZhAAz1-lkp@intel.com/config)
compiler: clang version 24.0.0git (https://github.com/llvm/llvm-project 935bfc708590c60147a79c7df145bb6e68b1d388)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260825/202608250645.zcZhAAz1-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202608250645.zcZhAAz1-lkp@intel.com/

All warnings (new ones prefixed by >>):

>> drivers/rtc/rtc-rv3028.c:908:4: warning: format specifies type 'unsigned int' but the argument has type 'unsigned long' [-Wformat]
     906 |                  "setting backup switch mode to %u (reg 0x37: 0x%02x -> 0x%02x)\n",
         |                                                                           ~~~~
         |                                                                           %02lx
     907 |                  bsm_dt, val_old,
     908 |                  (val_old & ~(RV3028_BACKUP_BSM | RV3028_BACKUP_FEDE)) |
         |                  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     909 |                  bsm_bits | RV3028_BACKUP_FEDE);
         |                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/dev_printk.h:160:67: note: expanded from macro 'dev_info'
     160 |         dev_printk_index_wrap(_dev_info, KERN_INFO, dev, dev_fmt(fmt), ##__VA_ARGS__)
         |                                                                  ~~~     ^~~~~~~~~~~
   include/linux/dev_printk.h:110:23: note: expanded from macro 'dev_printk_index_wrap'
     110 |                 _p_func(dev, fmt, ##__VA_ARGS__);                       \
         |                              ~~~    ^~~~~~~~~~~
   1 warning generated.


vim +908 drivers/rtc/rtc-rv3028.c

   857	
   858	/*
   859	 * Configure backup switchover mode from device tree.
   860	 *   0 = disabled
   861	 *   1 = DSM (Direct Switching Mode)  - switch when VDD < VBACKUP
   862	 *   3 = LSM (Level Switching Mode)   - switch when VDD < 2.0V
   863	 */
   864	static int rv3028_set_bsm_from_dt(struct rv3028_data *rv3028,
   865					  struct i2c_client *client)
   866	{
   867		u32 val_old, bsm_dt, bsm_bits;
   868		int ret;
   869	
   870		if (device_property_read_u32(&client->dev, "backup-switch-mode",
   871					     &bsm_dt))
   872			return 0;
   873	
   874		/* Validate and convert DT value to register bits */
   875		switch (bsm_dt) {
   876		case 0:
   877			bsm_bits = 0;
   878			break;
   879		case 1:
   880			bsm_bits = FIELD_PREP(RV3028_BACKUP_BSM, RV3028_BACKUP_BSM_DSM);
   881			break;
   882		case 3:
   883			bsm_bits = FIELD_PREP(RV3028_BACKUP_BSM, RV3028_BACKUP_BSM_LSM);
   884			break;
   885		default:
   886			dev_warn(&client->dev,
   887				 "invalid backup-switch-mode %u (use 0, 1, or 3)\n",
   888				 bsm_dt);
   889			return 0;
   890		}
   891	
   892		/* Read current BACKUP register */
   893		ret = regmap_read(rv3028->regmap, RV3028_BACKUP, &val_old);
   894		if (ret < 0)
   895			return ret;
   896	
   897		/* Check if BSM and FEDE already match desired values */
   898		if ((val_old & (RV3028_BACKUP_BSM | RV3028_BACKUP_FEDE)) ==
   899		    (bsm_bits | RV3028_BACKUP_FEDE)) {
   900			dev_dbg(&client->dev,
   901				"backup switch mode already set to %u\n", bsm_dt);
   902			return 0;
   903		}
   904	
   905		dev_info(&client->dev,
   906			 "setting backup switch mode to %u (reg 0x37: 0x%02x -> 0x%02x)\n",
   907			 bsm_dt, val_old,
 > 908			 (val_old & ~(RV3028_BACKUP_BSM | RV3028_BACKUP_FEDE)) |
   909			 bsm_bits | RV3028_BACKUP_FEDE);
   910	
   911		/* Set BSM and always enable FEDE as recommended by datasheet */
   912		return rv3028_update_cfg(rv3028, RV3028_BACKUP,
   913					 RV3028_BACKUP_BSM | RV3028_BACKUP_FEDE,
   914					 bsm_bits | RV3028_BACKUP_FEDE);
   915	}
   916	

--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

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

* Re: [PATCH] rtc: rv3028: configure backup switch mode from device tree
  2026-08-22  9:29 [PATCH] rtc: rv3028: configure backup switch mode from device tree Dhaval Shiroya
                   ` (2 preceding siblings ...)
  2026-08-24 23:05 ` kernel test robot
@ 2026-08-25  1:34 ` kernel test robot
  3 siblings, 0 replies; 5+ messages in thread
From: kernel test robot @ 2026-08-25  1:34 UTC (permalink / raw)
  To: Dhaval Shiroya, alexandre.belloni
  Cc: oe-kbuild-all, Dhaval Shiroya, linux-rtc, linux-kernel

Hi Dhaval,

kernel test robot noticed the following build warnings:

[auto build test WARNING on abelloni/rtc-next]
[also build test WARNING on linus/master v7.2 next-20260821]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Dhaval-Shiroya/rtc-rv3028-configure-backup-switch-mode-from-device-tree/20260822-145911
base:   https://git.kernel.org/pub/scm/linux/kernel/git/abelloni/linux.git rtc-next
patch link:    https://lore.kernel.org/r/20260822092911.318342-1-dhaval.shiroya%40siliconsignals.io
patch subject: [PATCH] rtc: rv3028: configure backup switch mode from device tree
config: nios2-allmodconfig (https://download.01.org/0day-ci/archive/20260825/202608250920.y0Rb4vg9-lkp@intel.com/config)
compiler: nios2-linux-gcc (GCC) 11.5.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260825/202608250920.y0Rb4vg9-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202608250920.y0Rb4vg9-lkp@intel.com/

All warnings (new ones prefixed by >>):

   In file included from include/linux/device.h:15,
                    from include/linux/acpi.h:15,
                    from include/linux/i2c.h:13,
                    from drivers/rtc/rtc-rv3028.c:15:
   drivers/rtc/rtc-rv3028.c: In function 'rv3028_set_bsm_from_dt':
>> drivers/rtc/rtc-rv3028.c:906:18: warning: format '%x' expects argument of type 'unsigned int', but argument 5 has type 'long unsigned int' [-Wformat=]
     906 |                  "setting backup switch mode to %u (reg 0x37: 0x%02x -> 0x%02x)\n",
         |                  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/dev_printk.h:110:30: note: in definition of macro 'dev_printk_index_wrap'
     110 |                 _p_func(dev, fmt, ##__VA_ARGS__);                       \
         |                              ^~~
   include/linux/dev_printk.h:160:58: note: in expansion of macro 'dev_fmt'
     160 |         dev_printk_index_wrap(_dev_info, KERN_INFO, dev, dev_fmt(fmt), ##__VA_ARGS__)
         |                                                          ^~~~~~~
   drivers/rtc/rtc-rv3028.c:905:9: note: in expansion of macro 'dev_info'
     905 |         dev_info(&client->dev,
         |         ^~~~~~~~
   drivers/rtc/rtc-rv3028.c:906:78: note: format string is defined here
     906 |                  "setting backup switch mode to %u (reg 0x37: 0x%02x -> 0x%02x)\n",
         |                                                                           ~~~^
         |                                                                              |
         |                                                                              unsigned int
         |                                                                           %02lx


vim +906 drivers/rtc/rtc-rv3028.c

   857	
   858	/*
   859	 * Configure backup switchover mode from device tree.
   860	 *   0 = disabled
   861	 *   1 = DSM (Direct Switching Mode)  - switch when VDD < VBACKUP
   862	 *   3 = LSM (Level Switching Mode)   - switch when VDD < 2.0V
   863	 */
   864	static int rv3028_set_bsm_from_dt(struct rv3028_data *rv3028,
   865					  struct i2c_client *client)
   866	{
   867		u32 val_old, bsm_dt, bsm_bits;
   868		int ret;
   869	
   870		if (device_property_read_u32(&client->dev, "backup-switch-mode",
   871					     &bsm_dt))
   872			return 0;
   873	
   874		/* Validate and convert DT value to register bits */
   875		switch (bsm_dt) {
   876		case 0:
   877			bsm_bits = 0;
   878			break;
   879		case 1:
   880			bsm_bits = FIELD_PREP(RV3028_BACKUP_BSM, RV3028_BACKUP_BSM_DSM);
   881			break;
   882		case 3:
   883			bsm_bits = FIELD_PREP(RV3028_BACKUP_BSM, RV3028_BACKUP_BSM_LSM);
   884			break;
   885		default:
   886			dev_warn(&client->dev,
   887				 "invalid backup-switch-mode %u (use 0, 1, or 3)\n",
   888				 bsm_dt);
   889			return 0;
   890		}
   891	
   892		/* Read current BACKUP register */
   893		ret = regmap_read(rv3028->regmap, RV3028_BACKUP, &val_old);
   894		if (ret < 0)
   895			return ret;
   896	
   897		/* Check if BSM and FEDE already match desired values */
   898		if ((val_old & (RV3028_BACKUP_BSM | RV3028_BACKUP_FEDE)) ==
   899		    (bsm_bits | RV3028_BACKUP_FEDE)) {
   900			dev_dbg(&client->dev,
   901				"backup switch mode already set to %u\n", bsm_dt);
   902			return 0;
   903		}
   904	
   905		dev_info(&client->dev,
 > 906			 "setting backup switch mode to %u (reg 0x37: 0x%02x -> 0x%02x)\n",
   907			 bsm_dt, val_old,
   908			 (val_old & ~(RV3028_BACKUP_BSM | RV3028_BACKUP_FEDE)) |
   909			 bsm_bits | RV3028_BACKUP_FEDE);
   910	
   911		/* Set BSM and always enable FEDE as recommended by datasheet */
   912		return rv3028_update_cfg(rv3028, RV3028_BACKUP,
   913					 RV3028_BACKUP_BSM | RV3028_BACKUP_FEDE,
   914					 bsm_bits | RV3028_BACKUP_FEDE);
   915	}
   916	

--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

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

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

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-08-22  9:29 [PATCH] rtc: rv3028: configure backup switch mode from device tree Dhaval Shiroya
2026-08-22  9:39 ` sashiko-bot
2026-08-22 13:09 ` Alexandre Belloni
2026-08-24 23:05 ` kernel test robot
2026-08-25  1:34 ` kernel test robot

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