* [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